COOP_LEVELS = { "bk_coop_simulation_00", "coop_bb_deathstar_escape", "coop_meows_lockdown_v_2", "coop_mission_rehan_v3", "coop_ventilation", "js_coop_lj10_v2", "js_coop_module700_ttc_b3", "js_coop_p2_waterworks_ob", "level09_choose_your_destiny_a1", "lw_lambdaware_b4", "syn_deadsimple", "Poison_Coop_RE1_Beta1", "oc_systems2B-2", "oc_systems2B-1", "mph_twilight1_bb_fix", "level03_underground_1f5", "js_coop_sewers_vv5", "js_coop_minimall_p7", "js_coop_coast_x1", "coop_z_harrier2", "coop_d3_c17_10a_10b_jedi2e", "coop_bb_tombs_v1", "js_coop_tbr_[a1]_ttc_v6b", "js_coop_tbr_[a1]_ttc_v7a", "x_coop_kanny_lockdown_reloaded", "x_coop_minimall_reloaded_v5", "tbr_coop_skyscrapers_v4", "x_coop_space", "x_coop_helicave", "x_coop_citadel", "x_coop_minimall", "tbr_coop_thousand_antlions_v3b", "tbr_coop_red_keops_v4", "tbr_coop_red_keops_v2", "ta_coop_the_pitts_v2a", "ta_coop_the_edge_v4", "ta_coop_the_edge_v2", "ta_coop_run_for_your_life_v1", "ta_coop_run_for_your_life_0", "ta_coop_phrenetic_escape_v3", "ta_coop_phrenetic_escape_0", "ta_coop_last_man_standing_v5", "ta_coop_last_man_standing_v2", "ta_coop_last_man_standing_0", "syn_lvcoop_part2", "syn_lvcoop_part1", "sg_coop_steamlab_b5", "sg_coop_steamlab_b4", "sg_coop_steamlab_b1", "sg_coop_runoff_zb", "sg_coop_runoff_zb2", "sg_coop_resistance_b2", "sg_coop_resistance_b1", "sg_coop_overwatch_b4", "sg_coop_overwatch_b3", "sg_coop_overwatch_b1", "sg_coop_lockdown_b3", "scary_united_coop", "scary_gmod_coop_x", "poison_coop_re1_beta1", "oblivion_coop_v1", "mp_coop_fan_p2port", "mp_coop_fan_p2port_fawosfix", "mm_coop_underpass_v2", "js_x_coop_stargate", "js_lm_coop_underground_v4b", "js_coop_zero_g_oc4", "js_coop_waterworks_ttc_v4", "js_coop_waterworks_ttc_v3", "js_coop_vtol_x_v5", "js_coop_underground_x_v3", "js_coop_ultraviolet_v6b", "js_coop_ttc_tbr_p1", "js_coop_train_station_v1", "js_coop_train_reloaded", "js_coop_train_reloaded_2a", "js_coop_train_reloada", "js_coop_thunder", "js_coop_thunder_b4", "js_coop_thunder_b3a", "js_coop_thunder_b2", "js_coop_teleport_v9fix", "js_coop_teleport_sg_zb", "js_coop_teleport_sg_zb3", "js_coop_team_v3", "js_coop_team_ttc_b1", "js_coop_tbr_cave_v7a", "js_coop_tbr_cave_v5_!", "js_coop_subway_x_v6", "js_coop_subway_fixed", "js_coop_space_x_v2", "js_coop_space_station_v2a", "js_coop_space_fixed", "js_coop_sky_chase_tbr_v3", "js_coop_siege_v4", "js_coop_shore", "js_coop_sewers_v5", "js_coop_sewers_v3", "js_coop_savescientist_v5a", "js_coop_save_scientist_v4", "js_coop_save_scientist_v3b", "js_coop_savescientist_ob1", "js_coop_save_dog_v4b", "js_coop_save_dog_tbr_v5", "js_coop_save_dog_tbr_v3", "js_coop_rocks_v8", "js_coop_rm_powerworks_2020_v2", "js_coop_ravenholm_x_bb", "js_coop_ravenholm_x2", "js_coop_quest_vv9", "js_coop_quest_v9", "js_coop_quest", "js_coop_powerworks_v2", "js_coop_powercrysis_v3_b", "js_coop_part3_waterworks_v2", "js_coop_part2_waterworks_v3", "js_coop_part2_powerworks_v1a", "js_coop_nation_v1", "js_coop_monsterkill_v2b", "js_coop_monsterkill_reload_b", "js_coop_missiontwo_v1f", "js_coop_minimall_fixed", "js_coop_mesa_v3", "js_coop_lvls_tbr_combine_v1", "js_coop_lockdown_x_v7", "js_coop_lockdown_tbr_v3", "js_coop_lk8", "js_coop_lj9", "js_coop_lh5_windows", "js_coop_lh5", "js_coop_levels_tbr_rock_v27", "js_coop_levelcube_ttc_a", "js_coop_level8_x_v1", "js_coop_level5_x_v1", "js_coop_lc3_nuke_m", "js_coop_lc3", "js_coop_la4", "js_coop_killer_lost_v16", "js_coop_killer_lost_final_d1", "js_coop_horror_v13", "js_coop_horror_v12", "js_coop_helicave_x_v2", "js_coop_hanhack_vv6", "js_coop_hacktown_v3", "js_coop_hacktown_v1", "js_coop_gnarkill_puzzlev3", "js_coop_gethev_v1a", "js_coop_docks_x_v4", "js_coop_docks2_vv3", "js_coop_deep_v12", "js_coop_deep6_x_v4", "js_coop_dasole_x_v2", "js_coop_dasole_ttc_b1", "js_coop_dasole2_v7", "js_coop_dasole2_ttc_b1", "js_coop_cubix_v1", "js_coop_cranecase_x_v4", "js_coop_cranecase_p1", "js_coop_combine_reload_b", "js_coop_combine2_ttc_p5", "js_coop_combine2_sg_b4", "js_coop_combine2_sg_b3", "js_coop_coast_x_v5", "js_coop_citadel_v14fixx", "js_coop_citadel_blast_v5", "js_coop_church_ttc_ob", "js_coop_cavettc_ob", "js_coop_bugbait_v3", "js_coop_bridgewar_v6", "js_coop_blueberry_ob_p7", "js_coop_basemission_beta", "js_coop_antlionrun_v4", "js_coop_airboats_v5", "js_coop_acc_v6", "js_coop_2fort_teleport_p1", "js_coop_2fort_b11_teleport_x3", "js_coop_2011_savedog_v2", "jr_coop_undergroundescape_v1", "gm_escape_coop_part_01", "eye_coop8", "dm_rebledefence_coop", "dm_coop_perverslabyrinthe", "dm_chickencoop_v2", "csv_coop_evac_5_credits", "csv_coop_darkbonus", "coop_zombiescity", "coop_zombie_map", "coop_zombie_invasion_10_r1", "coop_zelda01_b", "coop_warpath_v1", "coop_war_of_the_worlds_1ve", "coop_wardogs_v5", "coop_wardogs_v4", "coop_venture_v1c", "coop_venture_rc4", "coop_uprising_c", "coop_unnormal", "coop_unnamed_1", "coop_underground_win", "coop_traps_v1c", "coop_trainstation_02_1cube", "coop_train_escape_z1", "coop_train_02_1cube", "coop_town_level4d", "coop_town_level3a", "coop_town_level2a", "coop_town_level1", "coop_tim-3", "coop_thunder", "coop_the_pitts_pr2", "coop_the_pitts_fix", "coop_the_escape_part4_beta4", "coop_the_escape_part3_beta5", "coop_the_escape_part2_beta6", "coop_the_escape_part1_beta19", "coop_the_edge_r1", "coop_swampthing_v6", "coop_striders_revenge_2b", "coop_stargate", "coop_sd_zombie-city_b1", "coop_run_for_your_life", "coop_run_for_your_life_0", "coop_rocks_v11", "coop_resistance_part1_v1c", "coop_resident_evil_sg_zb4", "coop_redqueen_zba_z3", "coop_rebel_incursion5", "coop_rebel_escape_r1", "coop_ravenholm_2a_cube", "coopqwest_one_jr", "coop_port_sg_zb", "coop_planet_ant", "coop_other_in_blackmesa_hl2", "coop_other_city17_outland_ep2", "coop_other_city17", "coop_other_city17_ep1", "coop_other_city17_antarctic_ep3", "coop_nvc_citadel_escape", "coop_npcwar_v6", "coop_npcwar_v6_aldo", "coop_npcwar_final", "coop_npcwar3_v6", "coop_npcwar3_final", "coop_npcwar3_aldo", "coop_npcwar2_final", "coop_npcwar2_aldo", "coop_mw_revenge_ttc_v1", "coop_monster", "coop_missile_silo_bb3", "coop_missile_silo206", "coop_miniflatgrass", "coop_militia_sg_zb", "coop_metamorphics_egypt_level1", "coop_meows_winter_wonderland", "coop_meows_tower_of_babel_v_4", "coop_meows_tower_of_babel_v_3", "coop_meows_symphony_eight_v_4", "coop_meows_stairway_hell_v_2", "coop_meows_stairway_hell_v_1", "coop_meows_sewer_mania_v_5", "coop_meows_sewer_mania_v4", "coop_meows_runoff_winter_v7", "coop_meows_runoff_winter_v5", "coop_meows_runoff_ver_1", "coop_meows_runoff_v_4", "coop_meows_runoff_v_3", "coop_meows_runoff_v_2", "coop_meows_round_robin_v9", "coop_meows_round_robin_fixed", "coop_meows_revenge_v_3", "coop_meows_pyramid_v1", "coop_meows_pyramid_pr1", "coop_meows_pitifull", "coop_meows_new_tricks_v_7a", "coop_meows_new_tricks_v_6", "coop_meows_lockdown_v_3", "coop_meows_lockdown_v1d", "coop_meows_kill_em_all_ver2", "coop_meows_kill_em_all_v_4", "coop_meows_island_defence_v_1", "coop_meows_island_defence", "coop_meows_icey_topsy_turvey", "coop_meows_house_to_house_z1", "coop_meows_house_to_house", "coop_meows_house_to_house1", "coop_meows_fun_day_out_z1", "coop_meows_corridoors_v_6", "coop_meows_corridoors_v_5", "coop_meows_corridoors_r1", "coop_manticore", "coop_manticore_bb", "coop_lockdown_b2", "coop_linux_zombie_2b", "coop_linux_ravenholm_1g", "coop_level_9a", "coop_level_7b", "coop_level_6d", "coop_level_5b", "coop_level_4a", "coop_level_1", "coop_level_1b_cube", "coop_level07_scary_house_v4", "coop_level07_scary_house_fix2", "coop_level06_base", "coop_level02_traps_v1c", "coop_level01_dooms_entry_v1b", "coop_last_man_standing_v2", "coop_ktz-treehouse", "coop_ktz-hell", "coop_kinyoenta_vz_g", "coop_killbox_1", "coop_great_evil", "coop_fog_lab", "coop_fog_city", "coop_fleeravenholm_part1", "coop_fleeravenholm", "coop_fire_pit_finalv2", "coop_ffgs_powerhouse", "coop_evacuationbm", "coop_evac_5_credits", "coop_evac_4", "coop_evac_3", "coop_evac_2", "coop_evac_1", "coop_epicycle_v4", "coop_ep1_level4_remote_2b", "coop_ep1_level3_remote_2a", "coop_ep1_level3_remote_1e", "coop_ep1_level2_remote_1c", "coop_ep1_level2_jedi_1l", "coop_ep1_level1_remote_2a", "coop_dtm_c2e1_v1b209", "coop_dooms_entry_v1b", "coop_dogs_revenge_1b", "coop_dogs_rampage_2b", "coop_dog_1d_cube", "coop_defensegarage_v2", "coop_darkmesa", "coop_darkbonus", "coop_dark17", "coop_danmaku_i", "coop_d3_c17_15_d_2y", "coop_coopbox_v2", "coop_combat17", "coop_coast_01_1k_cube", "coop_city_c17_level3_jedi_1b", "coop_city_c17_level3_jedi_1a", "coop_city_17_level5_jedi_1b", "coop_city_17_level5_jedi_1a", "coop_city_17_level4_jedi_1h", "coop_city_17_level1_jedi_1a", "coop_city_17_jedi_2f", "coop_citadel_level1_2i", "coop_citadel_escape_v7", "coop_citadel_escape_v5", "coop_citadel_escape_v2fix", "coop_citadel_escape_p6", "coop_citadel_chapter12_1f", "coop_citadel_2_1a_cube", "coop_cc_nochance_v1b60", "coop_canalsv4", "coop_canalsv10", "coop_canals_f4", "coop_canals_f3", "coop_burlybrawl_bb", "coop_bunker_buddies", "coop_breen_1d_cube", "coop_breen_01_jedi_5e", "coop_blueberry_oblivion_x1", "coop_blueberry", "coop_blame!_log2_v2", "coop_blame!_log2_v1", "coop_blame!_log1_v2", "coop_blame_log1_v1", "coop_blame!_log1_v1", "coop_blame!_log1_v1a", "coop_blackmesa_combat", "coop_bb_xtotalcontrol", "coop_bb_xtotalcontrol_d", "coop_bb_level_2_b6", "coop_bb_level_1", "coop_atlantis_beta04", "coop_a_place_to_die_jbrfix_final_v1", "coop_a_place_to_die_jbrfixed2i", "coop_ant_tower_b1_3", "coop_across_the_darkness3a", "coop_abducted_4", "coop_abducted_3", "coop_abducted_2", "coop_abducted_1", "coop9_oblivion_blueberry_x3", "coop6_180_blueberry", "coop4_ob_gunzfly_p5", "coop4_ob_gunzfly_p4", "coop3_oblivion_lockdown_x1", "coop_123module_v2", "coop_123module_bb2", "cl_coop_venture_up", "cl_coop_quest_v5", "cl_coop_level3_topside_b2", "cl_coop_level2_survive_r1", "cl_coop_level2_survive", "cl_coop_level1_escape_r1", "cl_coop_level1_escape", "cl_coop_laserquest_b2", "cl_coop_doors_v4", "cl_coop_doors", "cl_coop_corridor_b3", "cl_coop_cages", "cl_coop_breakable", "cl_coop_breakable_b2", "ad_coop_mara_final" } function GetInstalledCoopLevels() local installedMaps = {} local availableLevels = {} for _, fileName in ipairs(file.Find("maps/*.bsp", "GAME")) do installedMaps[string.lower(string.StripExtension(fileName))] = true end for _, levelName in ipairs(COOP_LEVELS) do local normalizedName = string.lower(levelName) if installedMaps[normalizedName] and not table.HasValue(availableLevels, normalizedName) then table.insert(availableLevels, normalizedName) end end return availableLevels end function GetRandomLevel(excludeLevel) local candidates = {} local excluded = string.lower(excludeLevel or game.GetMap() or "") for _, levelName in ipairs(GetInstalledCoopLevels()) do if levelName ~= excluded then table.insert(candidates, levelName) end end if #candidates == 0 then return nil end return candidates[math.random(#candidates)] end