//checked includes changed to match cerberus output
#include maps/mp/zombies/_zm_tombstone;
#include maps/mp/zombies/_zm_sidequests;
#include maps/mp/zombies/_zm_stats;
#include maps/mp/zombies/_zm_audio_announcer;
#include maps/mp/zm_transit_distance_tracking;
#include maps/mp/zm_transit_sq;
#include maps/mp/zombies/_zm_buildables;
#include maps/mp/zm_transit_cling;
#include maps/mp/zombies/_zm_devgui;
#include maps/mp/zombies/_zm_power;
#include maps/mp/zombies/_zm_blockers;
#include maps/mp/zombies/_zm_equipment;
#include maps/mp/zombies/_zm_powerups;
#include maps/mp/zombies/_zm_audio;
#include character/c_transit_player_reporter;
#include character/c_transit_player_engineer;
#include character/c_transit_player_oldman;
#include character/c_transit_player_farmgirl;
#include maps/mp/zm_transit_openings;
#include maps/mp/animscripts/zm_utility;
#include maps/mp/zombies/_zm_spawner;
#include maps/mp/zombies/_zm_laststand;
#include maps/mp/zombies/_zm_zonemgr;
#include maps/mp/zm_transit_achievement;
#include maps/mp/_visionset_mgr;
#include maps/mp/zombies/_zm_weap_ballistic_knife;
#include maps/mp/zombies/_zm_weap_claymore;
#include maps/mp/zombies/_zm_weap_bowie;
#include maps/mp/zombies/_zm_weap_tazer_knuckles;
#include maps/mp/zombies/_zm_weap_cymbal_monkey;
#include maps/mp/zombies/_zm_weap_emp_bomb;
#include maps/mp/zombies/_zm_weap_jetgun;
#include maps/mp/zombies/_zm_weap_riotshield;
#include maps/mp/zombies/_zm_ai_basic;
#include maps/mp/zm_transit_power;
#include maps/mp/zm_transit_lava;
#include maps/mp/gametypes_zm/_spawning;
#include maps/mp/zm_transit_ai_screecher;
#include maps/mp/zombies/_load;
#include maps/mp/_sticky_grenade;
#include maps/mp/teams/_teamset_cdc;
#include maps/mp/animscripts/zm_death;
#include maps/mp/zombies/_zm;
#include maps/mp/zm_transit_fx;
#include maps/mp/zombies/_zm_equip_turbine;
#include maps/mp/zm_transit_automaton;
#include maps/mp/zm_transit_bus;
#include maps/mp/zm_transit_ffotd;
#include maps/mp/zombies/_zm_banking;
#include maps/mp/zm_transit_gamemodes;
#include maps/mp/zombies/_zm_weapon_locker;
#include maps/mp/zm_transit_utility;
#include maps/mp/zombies/_zm_game_module;
#include maps/mp/zombies/_zm_weapons;
#include maps/mp/zombies/_zm_utility;
#include maps/mp/zombies/_zm_unitrigger;
#include maps/mp/gametypes_zm/_zm_gametype;
#include maps/mp/_utility;
#include common_scripts/utility;

gamemode_callback_setup() //checked matches cerberus output
{
	maps/mp/zm_transit_gamemodes::init();
}

encounter_init() //checked matches cerberus output
{
	precacheshader( "sun_moon_zombie" );
	level.precachecustomcharacters = ::precache_team_characters;
	level.givecustomcharacters = ::give_team_characters;
}

zgrief_init() //checked matches cerberus output
{
	encounter_init();
	level thread maps/mp/zombies/_zm_banking::delete_bank_teller();
	flag_wait( "start_zombie_round_logic" );
	level.custom_intermission = ::transit_standard_intermission;
	if ( isDefined( level.scr_zm_map_start_location ) && level.scr_zm_map_start_location == "transit" )
	{
		level thread lava_damage_depot();
	}
}

survival_init() //checked matches cerberus output
{
	level.force_team_characters = 1;
	level.should_use_cia = 0;
	if ( randomint( 100 ) > 50 )
	{
		level.should_use_cia = 1;
	}
	level.precachecustomcharacters = ::precache_team_characters;
	level.givecustomcharacters = ::give_team_characters;
	level.dog_spawn_func = ::dog_spawn_transit_logic;
	level thread maps/mp/zombies/_zm_banking::delete_bank_teller();
	flag_wait( "start_zombie_round_logic" );
	level.custom_intermission = ::transit_standard_intermission;
	if ( isDefined( level.scr_zm_map_start_location ) && level.scr_zm_map_start_location == "transit" )
	{
		level thread lava_damage_depot();
	}
}

zclassic_init() //checked matches cerberus output
{
	level.precachecustomcharacters = ::precache_personality_characters;
	level.givecustomcharacters = ::give_personality_characters;
	level.setupcustomcharacterexerts = ::setup_personality_character_exerts;
	level.level_specific_init_powerups = ::add_transit_powerups;
	level.powerup_intro_vox = ::powerup_intro_vox;
	level.powerup_vo_available = ::powerup_vo_available;
	level.buildable_build_custom_func = ::buildable_build_custom_func;
	level.custom_update_retrieve_trigger = ::transit_bus_update_retrieve_trigger;
	level.buildable_pickup_vo_override = ::transit_buildable_vo_override;
	precachemodel( "p6_zm_window_dest_glass_small_broken" );
	precachemodel( "p6_zm_window_dest_glass_big_broken" );
	precachemodel( "p6_zm_keycard" );
	flag_wait( "start_zombie_round_logic" );
	level.custom_intermission = ::transit_intermission;
	level.custom_trapped_zombies = ::kill_zombies_depot;
	level thread lava_damage_depot();
	level thread bank_teller_init();
	level thread transit_breakable_glass_init();
	level thread sndsetupmusiceasteregg();
	level thread bank_pap_hint();
	level thread power_pap_hint();
	level thread sndtoiletflush();
}

zclassic_preinit() //checked matches cerberus output
{
	zclassic_init();
}

zcleansed_preinit() //checked matches cerberus output
{
	level._zcleansed_weapon_progression = array( "rpd_zm", "srm1216_zm", "judge_zm", "qcw05_zm", "kard_zm" );
	survival_init();
}

zcontainment_preinit() //checked matches cerberus output
{
	survival_init();
}

zdeadpool_preinit() //checked matches cerberus output
{
	encounter_init();
}

zgrief_preinit() //checked matches cerberus output
{
	registerclientfield( "toplayer", "meat_stink", 1, 1, "int" );
	zgrief_init();
	level thread delete_bus_pieces();
}

zmeat_preinit() //checked matches cerberus output
{
	encounter_init();
}

znml_preinit() //checked matches cerberus output
{
	survival_init();
}

zpitted_preinit() //checked matches cerberus output
{
	encounter_init();
}

zrace_preinit() //checked matches cerberus output
{
	encounter_init();
}

zstandard_preinit() //checked matches cerberus output
{
	survival_init();
	level thread delete_bus_pieces();
}

zturned_preinit() //checked matches cerberus output
{
	encounter_init();
}

createfx_callback() //checked changed to match cerberus output
{
	ents = getentarray();
	for ( i = 0; i < ents.size; i++ )
	{
		if ( ents[ i ].classname != "info_player_start" )
		{
			ents[ i ] delete();
		}
	}
}

main() //checked changed to match cerberus output
{
	level thread maps/mp/zm_transit_ffotd::main_start();
	level.hotjoin_player_setup = ::hotjoin_setup_player;
	level.level_createfx_callback_thread = ::createfx_callback;
	level.ignore_spawner_func = ::transit_ignore_spawner;
	level.default_game_mode = "zclassic";
	level.default_start_location = "transit";
	level._get_random_encounter_func = maps/mp/zm_transit_utility::get_random_encounter_match;
	setup_rex_starts();
	maps/mp/zm_transit_bus::init_animtree();
	maps/mp/zm_transit_bus::init_props_animtree();
	maps/mp/zm_transit_automaton::init_animtree();
	maps/mp/zombies/_zm_equip_turbine::init_animtree();
	maps/mp/zm_transit_fx::main();
	maps/mp/zombies/_zm::init_fx();
	maps/mp/animscripts/zm_death::precache_gib_fx();
	level.zombiemode = 1;
	level._no_water_risers = 1;
	level.riser_fx_on_client = 1;
	if ( !isDefined( level.zombie_surfing_kills ) )
	{
		level.zombie_surfing_kills = 1;
		level.zombie_surfing_kill_count = 6;
	}
	maps/mp/teams/_teamset_cdc::register();
	maps/mp/_sticky_grenade::init();
	level.level_specific_stats_init = ::init_transit_stats;
	maps/mp/zombies/_load::main();
	init_clientflags();
	level thread transit_pathnode_spawning();
	registerclientfield( "allplayers", "playerinfog", 1, 1, "int" );
	level.set_player_in_fog = ::set_player_in_fog;
	level.custom_breadcrumb_store_func = ::transit_breadcrumb_store_func;
	register_screecher_lights();
	if ( getDvar( "createfx" ) == "1" )
	{
		return;
	}
	maps/mp/teams/_teamset_cdc::level_init();
	maps/mp/zm_transit_ai_screecher::init();
	level.is_player_in_screecher_zone = ::is_player_in_screecher_zone;
	level.revive_trigger_spawn_override_link = ::revive_trigger_spawn_override_link;
	level.revive_trigger_should_ignore_sight_checks = ::revive_trigger_should_ignore_sight_checks;
	level.allow_move_in_laststand = ::allow_move_in_laststand;
	level.can_revive = ::can_revive;
	level.melee_miss_func = ::melee_miss_func;
	level.grenade_watcher = ::grenade_watcher;
	level.ignore_find_flesh = ::ignore_find_flesh;
	level.ignore_equipment = ::ignore_equipment;
	level.should_attack_equipment = ::should_attack_equipment;
	level.gib_on_damage = ::gib_on_damage;
	level.melee_anim_state = ::melee_anim_state;
	level.ignore_stop_func = ::ignore_stop_func;
	level.can_melee = ::can_melee;
	level.ignore_traverse = ::ignore_traverse;
	level.exit_level_func = ::exit_level_func;
	level.inert_substate_override = ::inert_substate_override;
	level.attack_item = ::attack_item;
	level.attack_item_stop = ::attack_item_stop;
	level.check_valid_poi = ::check_valid_poi;
	level.dog_melee_miss = ::dog_melee_miss;
	precacheshellshock( "lava" );
	precacheshellshock( "lava_small" );
	precache_survival_barricade_assets();
	include_game_modules();
	maps/mp/gametypes_zm/_spawning::level_use_unified_spawning( 1 );
	level.givecustomloadout = ::givecustomloadout;
	level.giveextrazombies = ::giveextrazombies;
	initcharacterstartindex();
	if ( level.xenon )
	{
		level.giveextrazombies = ::giveextrazombies;
		precacheextrazombies();
	}
	level.custom_player_fake_death = ::transit_player_fake_death;
	level.custom_player_fake_death_cleanup = ::transit_player_fake_death_cleanup;
	level.initial_round_wait_func = ::initial_round_wait_func;
	level.zombie_speed_up = ::zombie_speed_up;
	level.zombie_init_done = ::zombie_init_done;
	level.zombiemode_using_pack_a_punch = 1;
	level.zombiemode_reusing_pack_a_punch = 1;
	level.pap_interaction_height = 47;
	level.zombiemode_using_doubletap_perk = 1;
	level.zombiemode_using_juggernaut_perk = 1;
	level.zombiemode_using_marathon_perk = 1;
	level.zombiemode_using_revive_perk = 1;
	level.zombiemode_using_sleightofhand_perk = 1;
	level.zombiemode_using_tombstone_perk = 1;
	init_persistent_abilities();
	level.register_offhand_weapons_for_level_defaults_override = ::offhand_weapon_overrride;
	if ( is_classic() )
	{
		level.player_intersection_tracker_override = ::zombie_transit_player_intersection_tracker_override;
		level.taser_trig_adjustment = ( 2, 7, 0 );
	}
	level.player_too_many_weapons_monitor_callback = ::zombie_transit_player_too_many_weapons_monitor_callback;
	level._zmbvoxlevelspecific = ::zombie_transit_audio_alias_override;
	level._zombie_custom_add_weapons = ::custom_add_weapons;
	level._allow_melee_weapon_switching = 1;
	level.disable_melee_wallbuy_icons = 1;
	level.uses_gumps = 1;
	setdvar( "aim_target_fixed_actor_size", 1 );
	level.banking_update_enabled = 1;
	level.raygun2_included = 1;
	include_weapons();
	include_powerups();
	include_equipment_for_level();
	include_powered_items();
	level.powerup_bus_range = 500;
	level.pay_turret_cost = 300;
	level.auto_turret_cost = 500;
	setup_dvars();
	onplayerconnect_callback( ::setup_players );
	level thread disable_triggers();
	level thread maps/mp/zm_transit_lava::lava_damage_init();
	level.zm_transit_burn_max_duration = 2;
	level thread maps/mp/zm_transit_power::precache_models();
	setup_zombie_init();
	maps/mp/zombies/_zm::init();
	maps/mp/zombies/_zm_ai_basic::init_inert_zombies();
	maps/mp/zombies/_zm_weap_riotshield::init();
	maps/mp/zombies/_zm_weap_jetgun::init();
	level.special_weapon_magicbox_check = ::transit_special_weapon_magicbox_check;
	maps/mp/zombies/_zm_weap_emp_bomb::init();
	zm_transit_emp_init();
	level.legacy_cymbal_monkey = 1;
	maps/mp/zombies/_zm_weap_cymbal_monkey::init();
	maps/mp/zombies/_zm_weap_tazer_knuckles::init();
	maps/mp/zombies/_zm_weap_bowie::init();
	maps/mp/zombies/_zm_weap_claymore::init();
	maps/mp/zombies/_zm_weap_ballistic_knife::init();
	if ( !isDefined( level.vsmgr_prio_overlay_zm_transit_burn ) )
	{
		level.vsmgr_prio_overlay_zm_transit_burn = 20;
	}
	maps/mp/_visionset_mgr::vsmgr_register_info( "overlay", "zm_transit_burn", 1, level.vsmgr_prio_overlay_zm_transit_burn, 15, 1, maps/mp/_visionset_mgr::vsmgr_duration_lerp_thread_per_player, 0 );
	level maps/mp/zm_transit_achievement::init();
	precacheitem( "death_throe_zm" );
	if ( level.splitscreen && getDvarInt( "splitscreen_playerCount" ) > 2 )
	{
		level.optimise_for_splitscreen = 1;
	}
	else
	{
		level.optimise_for_splitscreen = 0;
	}
	if ( level.ps3 )
	{
		if ( is_true( level.optimise_for_splitscreen ) )
		{
			level.culldist = 1500;
		}
		else
		{
			level.culldist = 4500;
		}
	}
	else if ( is_true( level.optimise_for_splitscreen ) )
	{
		level.culldist = 2500;
	}
	else
	{
		level.culldist = 5500;
	}
	setculldist( level.culldist );
	level.zones = [];
	level.zone_manager_init_func = ::transit_zone_init;
	init_zones = [];
	init_zones[ 0 ] = "zone_pri";
	init_zones[ 1 ] = "zone_station_ext";
	init_zones[ 2 ] = "zone_tow";
	if ( is_classic() )
	{
		init_zones[ 3 ] = "zone_far";
		init_zones[ 4 ] = "zone_pow";
		init_zones[ 5 ] = "zone_trans_1";
		init_zones[ 6 ] = "zone_trans_2";
		init_zones[ 7 ] = "zone_trans_3";
		init_zones[ 8 ] = "zone_trans_4";
		init_zones[ 9 ] = "zone_trans_5";
		init_zones[ 10 ] = "zone_trans_6";
		init_zones[ 11 ] = "zone_trans_7";
		init_zones[ 12 ] = "zone_trans_8";
		init_zones[ 13 ] = "zone_trans_9";
		init_zones[ 14 ] = "zone_trans_10";
		init_zones[ 15 ] = "zone_trans_11";
		init_zones[ 16 ] = "zone_amb_tunnel";
		init_zones[ 17 ] = "zone_amb_forest";
		init_zones[ 18 ] = "zone_amb_cornfield";
		init_zones[ 19 ] = "zone_amb_power2town";
		init_zones[ 20 ] = "zone_amb_bridge";
	}
	else
	{
		init_zones[ 3 ] = "zone_far_ext";
		init_zones[ 4 ] = "zone_brn";
	}
	level thread maps/mp/zombies/_zm_zonemgr::manage_zones( init_zones );
	if ( is_true( level.optimise_for_splitscreen ) )
	{
		if ( is_classic() )
		{
			level.zombie_ai_limit = 20;
		}
		setdvar( "fx_marks_draw", 0 );
		setdvar( "disable_rope", 1 );
		setdvar( "cg_disableplayernames", 1 );
		setdvar( "disableLookAtEntityLogic", 1 );
	}
	else
	{
		level.zombie_ai_limit = 24;
	}
	setdvar( "zombiemode_path_minz_bias", 13 );
	level thread maps/mp/zm_transit_ffotd::main_end();
	flag_wait( "start_zombie_round_logic" );
	level notify( "players_done_connecting" );
	/*
/#
	execdevgui( "devgui_zombie_transit" );
	level.custom_devgui = ::zombie_transit_devgui;
#/
	*/
	level thread set_transit_wind();
	if ( is_classic() )
	{
		level thread player_name_fade_control();
	}
	level._audio_custom_response_line = ::transit_audio_custom_response_line;
	level.speed_change_round = 15;
	level.speed_change_max = 5;
	init_screecher_zones();
	elec_door_triggers = getentarray("local_electric_door", "script_noteworthy");
	foreach ( trigger in elec_door_triggers )
	{
		if ( isDefined( trigger.door_hold_trigger ) && trigger.door_hold_trigger == "zombie_door_hold_farm" )
		{
			if ( isDefined( trigger.doors ) )
			{
				for ( i = 0; i < trigger.doors.size; i++ )
				{
					if ( trigger.doors[ i ].origin == ( 8833, -5697, 135 ) )
					{
						trigger.doors[ i ].ignore_use_blocker_clip_for_pathing_check = 1;
					}
				}
			}
		}
	}
}

init_persistent_abilities() //checked matches cerberus output
{
	if ( is_classic() )
	{
		level.pers_upgrade_boards = 1;
		level.pers_upgrade_revive = 1;
		level.pers_upgrade_multi_kill_headshots = 1;
		level.pers_upgrade_cash_back = 1;
		level.pers_upgrade_insta_kill = 1;
		level.pers_upgrade_jugg = 1;
		level.pers_upgrade_carpenter = 1;
		level.pers_upgrade_box_weapon = 1;
		level.pers_magic_box_firesale = 1;
		level.pers_treasure_chest_get_weapons_array_func = ::pers_treasure_chest_get_weapons_array_transit;
		level.pers_upgrade_sniper = 1;
		level.pers_upgrade_pistol_points = 1;
		level.pers_upgrade_perk_lose = 1;
		level.pers_upgrade_double_points = 1;
		level.pers_upgrade_nube = 1;
	}
}

pers_treasure_chest_get_weapons_array_transit() //checked matches cerberus output
{
	if ( !isDefined( level.pers_box_weapons ) )
	{
		level.pers_box_weapons = [];
		level.pers_box_weapons[ level.pers_box_weapons.size ] = "knife_ballistic_zm";
		level.pers_box_weapons[ level.pers_box_weapons.size ] = "cymbal_monkey_zm";
		level.pers_box_weapons[ level.pers_box_weapons.size ] = "judge_zm";
		level.pers_box_weapons[ level.pers_box_weapons.size ] = "emp_grenade_zm";
		level.pers_box_weapons[ level.pers_box_weapons.size ] = "galil_zm";
		level.pers_box_weapons[ level.pers_box_weapons.size ] = "hamr_zm";
		level.pers_box_weapons[ level.pers_box_weapons.size ] = "ray_gun_zm";
		level.pers_box_weapons[ level.pers_box_weapons.size ] = "rpd_zm";
	}
}

setup_rex_starts() //checked matches cerberus output
{
	add_gametype( "zclassic", ::dummy, "zclassic", ::dummy );
	add_gametype( "zstandard", ::dummy, "zstandard", ::dummy );
	add_gametype( "zgrief", ::dummy, "zgrief", ::dummy );
	add_gameloc( "transit", ::dummy, "transit", ::dummy );
	add_gameloc( "town", ::dummy, "town", ::dummy );
	add_gameloc( "farm", ::dummy, "farm", ::dummy );
}

dummy() //checked matches cerberus output
{
}

init_clientflags() //checked matches cerberus output
{
	level._clientflag_vehicle_bus_flashing_lights = 0;
	level._clientflag_vehicle_bus_head_lights = 1;
	level._clientflag_vehicle_bus_brake_lights = 2;
	level._clientflag_vehicle_bus_turn_signal_left_lights = 3;
	level._clientflag_vehicle_bus_turn_signal_right_lights = 4;
}

set_player_in_fog( onoff ) //checked matches cerberus output
{
	if ( onoff )
	{
		self setclientfield( "playerinfog", 1 );
	}
	else
	{
		self setclientfield( "playerinfog", 0 );
	}
}

transit_breadcrumb_store_func( store_crumb ) //checked matches cerberus output used is_true instead
{
	if ( is_true( self.isonbus ) )
	{
		return 0;
	}
	return store_crumb;
}

transit_ignore_spawner( spawner ) //checked matches cerberus output
{
	if ( spawner.classname == "actor_zm_zombie_transit_screecher" )
	{
		return 1;
	}
	return 0;
}

allow_move_in_laststand( player_down ) //checked matches cerberus output used is_true instead
{
	if ( is_true( player_down.isonbus ) )
	{
		return 0;
	}
	return 1;
}

can_revive( player_down )
{
	if ( isDefined( self.screecher ) )
	{
		return 0;
	}
	return 1;
}

melee_miss_func() //checked changed to match cerberus output
{
	if ( isDefined( self.enemy ) )
	{
		if ( !isDefined( self.enemy.screecher ) || self.enemy getstance() == "prone" || self.enemy maps/mp/zombies/_zm_laststand::is_reviving_any() )
		{
			dist_sq = distancesquared( self.enemy.origin, self.origin );
			melee_dist_sq = self.meleeattackdist * self.meleeattackdist;
			if ( dist_sq < melee_dist_sq )
			{
				self.enemy dodamage( self.meleedamage, self.origin, self, self, "none", "MOD_MELEE" );
			}
		}
	}
}

grenade_watcher( grenade, weapname ) //checked changed to match cerberus output
{
	if ( weapname == "frag_grenade_zm" || weapname == "claymore_zm" || weapname == "sticky_grenade_zm" )
	{
		self thread maps/mp/zombies/_zm_ai_basic::grenade_watcher( grenade );
	}
}

ignore_find_flesh() //checked matches cerberus output used is_true instead
{
	if ( is_true( self.isonbus ) )
	{
		return 1;
	}
	return 0;
}

ignore_equipment( zombie ) //checked matches cerberus output used is_true instead
{
	if ( !is_true( zombie.completed_emerging_into_playable_area ) )
	{
		return 1;
	}
	if ( is_true( zombie.is_avogadro ) )
	{
		return 1;
	}
	if ( is_true( zombie.is_inert ) )
	{
		return 1;
	}
	if ( isDefined( zombie.inert_delay ) )
	{
		return 1;
	}
	return 0;
}

should_attack_equipment( dist ) //checked changed to match cerberus output
{
	if ( !isDefined( level.door_triggers ) )
	{
		level.door_triggers = getentarray( "bus_door_trigger", "targetname" );
	}
	
	for ( i = 0; i < level.door_triggers.size; i++ )
	{
		if ( self istouching( level.door_triggers[ i ] ) )
		{
			if ( dist < 4096 )
			{
				return 1;
			}
		}
	}
	return 0;
}

gib_on_damage() //checked changed to match cerberus output used is_true instead
{
	opening = self.opening;
	if ( isDefined( opening ) )
	{
		if ( isDefined( self.a.gib_ref ) || self.a.gib_ref == "left_arm" || self.a.gib_ref == "right_arm" )
		{
			level maps/mp/zombies/_zm_spawner::zombie_death_points( self.origin, self.damagemod, self.a.gib_ref, self.attacker, self );
			opening.zombie = undefined;
			launchvector = ( 0, 0, -1 );
			self thread maps/mp/zombies/_zm_spawner::zombie_ragdoll_then_explode( launchvector, self.attacker );
			self notify( "killanimscript" );
			return;
		}
	}
	if ( is_true( self.is_inert ) )
	{
		if ( !is_true( self.has_legs ) )
		{
			self notify( "stop_zombie_inert_transition" );
			self setanimstatefromasd( "zm_inert_crawl", maps/mp/zombies/_zm_ai_basic::get_inert_crawl_substate() );
		}
	}
}

melee_anim_state() //checked matches cerberus output
{
	if ( self.zombie_move_speed == "bus_walk" )
	{
		return maps/mp/animscripts/zm_utility::append_missing_legs_suffix( "zm_walk_melee" );
	}
	return undefined;
}

ignore_stop_func() //checked matches cerberus output used is_true instead
{
	if ( is_true( self.is_inert ) )
	{
		return 1;
	}
	if ( isDefined( self.opening ) )
	{
		return 1;
	}
	if ( isDefined( self.entering_bus ) )
	{
		return 1;
	}
	return 0;
}

can_melee() //checked matches cerberus output used is_true instead
{
	if ( is_true( self.dont_die_on_me ) )
	{
		return 0;
	}
	if ( is_true( self.isonbus ) || is_true( self.isonbusroof ) )
	{
		if ( self.enemydistancesq > anim.meleerangesq )
		{
			return 0;
		}
	}
	return 1;
}

ignore_traverse() //checked matches cerberus output used is_true instead
{
	if ( is_true( self.is_inert ) )
	{
		if ( !is_true( self.in_place ) )
		{
			self setgoalpos( self.origin );
			if ( randomint( 100 ) > 50 )
			{
				self setanimstatefromasd( "zm_inert", "inert1" );
			}
			else
			{
				self setanimstatefromasd( "zm_inert", "inert2" );
			}
			self.in_place = 1;
		}
		return 1;
	}
	return 0;
}

exit_level_func() //checked partially changed to match cerberus output see info.md No. 2
{
	zombies = getaiarray( level.zombie_team );
	foreach ( zombie in zombies )
	{
		if ( is_true( zombie.ignore_solo_last_stand ) )
		{
		}
		else if ( isDefined( zombie.find_exit_point ) )
		{
			zombie thread [[ zombie.find_exit_point ]]();
		}
		else if ( is_true( zombie.isonbus ) )
		{
			zombie thread find_exit_bus();
		}
		else if ( zombie.ignoreme )
		{
			zombie thread maps/mp/zombies/_zm::default_delayed_exit();
		}
		else
		{
			zombie thread maps/mp/zombies/_zm::default_find_exit_point();
		}
	}
}

inert_substate_override( substate ) //checked matches cerberus output used is_true instead
{
	in_bar = 0;
	if ( flag( "OnTowDoorBar" ) )
	{
		if ( self maps/mp/zombies/_zm_zonemgr::entity_in_zone( "zone_bar" ) )
		{
			in_bar = 1;
		}
	}
	if ( is_true( self.isonbus ) || in_bar )
	{
		if ( randomint( 100 ) > 50 )
		{
			substate = "inert1";
		}
		else
		{
			substate = "inert2";
		}
	}
	return substate;
}

attack_item() //checked matches cerberus output used is_true instead
{
	if ( is_true( self.isonbus ) )
	{
		self linkto( level.the_bus );
	}
}

attack_item_stop() //checked matches cerberus output used is_true instead
{
	if ( is_true( self.isonbus ) )
	{
		self unlink();
	}
}

check_valid_poi( valid ) //checked changed to match cerberus output
{
	if ( self maps/mp/zombies/_zm_zonemgr::entity_in_zone( "zone_bar" ) )
	{
		if ( !flag( "OnTowDoorBar" ) )
		{
			return 0;
		}
	}
	else if ( self maps/mp/zombies/_zm_zonemgr::entity_in_zone( "zone_town_barber" ) )
	{
		if ( !flag( "OnTowDoorBarber" ) )
		{
			return 0;
		}
	}
	return valid;
}

dog_melee_miss() //checked matches cerberus output
{
	if ( isDefined( self.enemy ) )
	{
		stance = self.enemy getstance();
		if ( stance == "prone" || stance == "crouch" )
		{
			dist_sq = distancesquared( self.enemy.origin, self.origin );
			if ( dist_sq < 10000 )
			{
				meleedamage = getDvarInt( "dog_MeleeDamage" );
				self.enemy dodamage( meleedamage, self.origin, self, self, "none", "MOD_MELEE" );
			}
		}
	}
}

find_exit_loc() //checked changed to match cerberus output
{
	player = self.favoriteenemy;
	dist_zombie = 0;
	dist_player = 0;
	dest = 0;
	away = vectornormalize( self.origin - player.origin );
	endpos = self.origin + vectorScale( away, 600 );
	locs = array_randomize( level.enemy_dog_locations );
	for ( i = 0; i < locs.size; i++ )
	{
		dist_zombie = distancesquared( locs[ i ].origin, endpos );
		dist_player = distancesquared( locs[ i ].origin, player.origin );
		if ( dist_zombie < dist_player )
		{
			dest = i;
			break;
		}
	}
	if ( isDefined( locs[ dest ] ) )
	{
		self.solo_revive_exit_pos = locs[ dest ].origin;
	}
}

find_exit_bus() //checked matches cerberus output used is_true instead
{
	self endon( "death" );
	self.solo_revive_exit = 1;
	self notify( "endOnBus" );
	self thread maps/mp/zm_transit_openings::zombieexitbus();
	self find_exit_loc();
	off_the_bus = 0;
	while ( flag( "wait_and_revive" ) )
	{
		if ( !off_the_bus && self.ai_state == "find_flesh" )
		{
			off_the_bus = 1;
			self thread maps/mp/zombies/_zm::default_find_exit_point();
		}
		wait 0.1;
	}
	self.solo_revive_exit = 0;
	if ( !is_true( self.exiting_window ) )
	{
		if ( is_true( self.isonbus ) )
		{
			self notify( "stop_zombieExitBus" );
			self.walk_to_exit = 0;
			self thread zombiemoveonbus();
		}
	}
}

post_first_init() //checked matches cerberus output
{
	while ( !isDefined( anim.notfirsttime ) )
	{
		wait 0.5;
	}
	anim.meleerange = 36;
	anim.meleerangesq = anim.meleerange * anim.meleerange;
}

set_transit_wind() //checked matches cerberus output
{
	setdvar( "enable_global_wind", 1 );
	setdvar( "wind_global_vector", "-120 -115 -120" );
	setdvar( "wind_global_low_altitude", 0 );
	setdvar( "wind_global_hi_altitude", 2000 );
	setdvar( "wind_global_low_strength_percent", 0,5 );
}

revive_trigger_move_with_player() //checked matches cerberus output
{
	self endon( "stop_revive_trigger" );
	self endon( "death" );
	while ( isDefined( self.revivetrigger ) )
	{
		my_position = self gettagorigin( "J_SpineLower" );
		self.revivetrigger unlink();
		self.revivetrigger.origin = my_position;
		self.revivetrigger linkto( level.the_bus );
		wait 0.1;
	}
}

revive_trigger_should_ignore_sight_checks( player_down ) //checked matches cerberus output used is_true instead
{
	if ( is_true( player_down.isonbus ) && level.the_bus.ismoving )
	{
		return 1;
	}
	return 0;
}

revive_trigger_spawn_override_link( player_down ) //checked changed to match cerberus output used is_true instead
{
	radius = getDvarInt( "revive_trigger_radius" );
	player_down.revivetrigger = spawn( "trigger_radius", ( 0, 0, 0 ), 0, radius, radius );
	player_down.revivetrigger sethintstring( "" );
	player_down.revivetrigger setcursorhint( "HINT_NOICON" );
	player_down.revivetrigger setmovingplatformenabled( 1 );
	player_down.revivetrigger enablelinkto();
	if ( is_true( player_down.isonbus ) )
	{
		player_down.revivetrigger linkto( level.the_bus );
		player_down thread revive_trigger_move_with_player();
	}
	else
	{
		player_down.revivetrigger.origin = player_down.origin;
		player_down.revivetrigger linkto( player_down );
	}
	player_down.revivetrigger.beingrevived = 0;
	player_down.revivetrigger.createtime = getTime();
}

init_screecher_zones() //checked partially changed to match cerberus output see info.md No. 2
{
	foreach ( key in level.zone_keys )
	{
		if ( issubstr( key, "_trans_" ) || issubstr( key, "_amb_" ) )
		{
			level.zones[ key ].screecher_zone = 1;
		}
		else
		{
			level.zones[ key ].screecher_zone = 0;
		}
	}
}

is_player_in_screecher_zone( player ) //checked changed to match cerberus output used is_true instead
{
	if ( is_true( player.isonbus ) )
	{
		return 0;
	}
	if ( player_entered_safety_zone( player ) )
	{
		return 0;
	}
	if ( player_entered_safety_light( player ) )
	{
		return 0;
	}
	curr_zone = player get_current_zone( 1 );
	if ( isDefined( curr_zone ) && !is_true( curr_zone.screecher_zone ) )
	{
		return 0;
	}
	return 1;
}

player_entered_safety_zone( player ) //checked changed to match cerberus output
{
	if ( !isDefined( level.safety_volumes ) )
	{
		level.safety_volumes = getentarray( "screecher_volume", "targetname" );
	}
	if ( isDefined( player.last_safety_volume ) )
	{
		if ( player istouching( player.last_safety_volume ) )
		{
			return 1;
		}
	}
	if ( isDefined( level.safety_volumes ) )
	{
		for ( i = 0; i < level.safety_volumes.size; i++ )
		{
			if ( player istouching( level.safety_volumes[ i ] ) )
			{
				player.last_safety_volume = level.safety_volumes[ i ];
				return 1;
			}
		}
	}
	player.last_safety_volume = undefined;
	return 0;
}

player_entered_safety_light( player ) //checked partially changed to match cerberus output see info.md No. 2
{
	safety = getstructarray( "screecher_escape", "targetname" );
	if ( !isDefined( safety ) )
	{
		return 0;
	}
	player.green_light = undefined;
	for ( i = 0; i < safety.size; i++ )
	{
		if ( !is_true( safety[ i ].power_on ) )
		{
		}
		else
		{
			if ( !isDefined( safety[ i ].radius ) )
			{
				safety[ i ].radius = 256;
			}
			plyr_dist = distancesquared( player.origin, safety[ i ].origin );
			if ( plyr_dist < ( safety[ i ].radius * safety[ i ].radius ) )
			{
				player.green_light = safety[ i ];
				return 1;
			}
		}
	}
	return 0;
}

zombie_transit_player_intersection_tracker_override( other_player ) //checked changed at own discretion
{
	if ( is_true( self.isonbus ) )
	{
		return 1;
	}
	if ( is_true( other_player.isonbus ) )
	{
		return 1;
	}
	return 0;
}

precache_team_characters() //checked matches cerberus output
{
	precachemodel( "c_zom_player_cdc_fb" );
	precachemodel( "c_zom_hazmat_viewhands" );
	precachemodel( "c_zom_player_cia_fb" );
	precachemodel( "c_zom_suit_viewhands" );
}

precache_personality_characters() //checked matches cerberus output
{
	character/c_transit_player_farmgirl::precache();
	character/c_transit_player_oldman::precache();
	character/c_transit_player_engineer::precache();
	character/c_transit_player_reporter::precache();
	precachemodel( "c_zom_farmgirl_viewhands" );
	precachemodel( "c_zom_oldman_viewhands" );
	precachemodel( "c_zom_engineer_viewhands" );
	precachemodel( "c_zom_reporter_viewhands" );
}

precache_survival_barricade_assets() //checked changed to match cerberus output
{
	survival_barricades = getstructarray( "game_mode_object" );
	for ( i = 0; i < survival_barricades.size; i++ )
	{
		if ( isDefined( survival_barricades[ i ].script_string ) && survival_barricades[ i ].script_string == "survival" )
		{
			if ( isDefined( survival_barricades[ i ].script_parameters ) )
			{
				precachemodel( survival_barricades[ i ].script_parameters );
			}
		}
	}
}

initcharacterstartindex() //checked matches cerberus output
{
	level.characterstartindex = 0;
	/*
/#
	forcecharacter = getDvarInt( "zombie_transit_character_force" );
	if ( forcecharacter != 0 )
	{
		level.characterstartindex = forcecharacter - 1;
#/
	}
	*/
}

precacheextrazombies() //checked matches cerberus output
{
}

giveextrazombies() //checked matches cerberus output
{
}

give_team_characters() //checked matches cerberus output
{
	if ( isDefined( level.hotjoin_player_setup ) && [[ level.hotjoin_player_setup ]]( "c_zom_suit_viewhands" ) )
	{
		return;
	}
	self detachall();
	self set_player_is_female( 0 );
	if ( isDefined( level.should_use_cia ) )
	{
		if ( level.should_use_cia )
		{
			self setmodel( "c_zom_player_cia_fb" );
			self setviewmodel( "c_zom_suit_viewhands" );
			self.characterindex = 0;
		}
		else
		{
			self setmodel( "c_zom_player_cdc_fb" );
			self setviewmodel( "c_zom_hazmat_viewhands" );
			self.characterindex = 1;
		}
	}
	else if ( !isDefined( self.characterindex ) )
	{
		self.characterindex = 1;
		if ( self.team == "axis" )
		{
			self.characterindex = 0;
		}
	}
	switch( self.characterindex )
	{
		case 0:
		case 2:
			self setmodel( "c_zom_player_cia_fb" );
			self.voice = "american";
			self.skeleton = "base";
			self setviewmodel( "c_zom_suit_viewhands" );
			self.characterindex = 0;
			break;
		case 1:
		case 3:
			self setmodel( "c_zom_player_cdc_fb" );
			self.voice = "american";
			self.skeleton = "base";
			self setviewmodel( "c_zom_hazmat_viewhands" );
			self.characterindex = 1;
			break;
	}
	self setmovespeedscale( 1 );
	self setsprintduration( 4 );
	self setsprintcooldown( 0 );
	self set_player_tombstone_index();
}

give_personality_characters() //checked matches cerberus output
{
	if ( isDefined( level.hotjoin_player_setup ) && [[ level.hotjoin_player_setup ]]( "c_zom_farmgirl_viewhands" ) )
	{
		return;
	}
	self detachall();
	if ( !isDefined( self.characterindex ) )
	{
		self.characterindex = assign_lowest_unused_character_index();
	}
	self.favorite_wall_weapons_list = [];
	self.talks_in_danger = 0;
	/*
/#
	if ( getDvar( #"40772CF1" ) != "" )
	{
		self.characterindex = getDvarInt( #"40772CF1" );
#/
	}
	*/
	switch( self.characterindex )
	{
		case 2:
			self character/c_transit_player_farmgirl::main();
			self setviewmodel( "c_zom_farmgirl_viewhands" );
			level.vox maps/mp/zombies/_zm_audio::zmbvoxinitspeaker( "player", "vox_plr_", self );
			self.favorite_wall_weapons_list[ self.favorite_wall_weapons_list.size ] = "rottweil72_zm";
			self.favorite_wall_weapons_list[ self.favorite_wall_weapons_list.size ] = "870mcs_zm";
			self set_player_is_female( 1 );
			break;
		case 0:
			self character/c_transit_player_oldman::main();
			self setviewmodel( "c_zom_oldman_viewhands" );
			level.vox maps/mp/zombies/_zm_audio::zmbvoxinitspeaker( "player", "vox_plr_", self );
			self.favorite_wall_weapons_list[ self.favorite_wall_weapons_list.size ] = "frag_grenade_zm";
			self.favorite_wall_weapons_list[ self.favorite_wall_weapons_list.size ] = "claymore_zm";
			self set_player_is_female( 0 );
			break;
		case 3:
			self character/c_transit_player_engineer::main();
			self setviewmodel( "c_zom_engineer_viewhands" );
			level.vox maps/mp/zombies/_zm_audio::zmbvoxinitspeaker( "player", "vox_plr_", self );
			self.favorite_wall_weapons_list[ self.favorite_wall_weapons_list.size ] = "m14_zm";
			self.favorite_wall_weapons_list[ self.favorite_wall_weapons_list.size ] = "m16_zm";
			self set_player_is_female( 0 );
			break;
		case 1:
			self character/c_transit_player_reporter::main();
			self setviewmodel( "c_zom_reporter_viewhands" );
			level.vox maps/mp/zombies/_zm_audio::zmbvoxinitspeaker( "player", "vox_plr_", self );
			self.talks_in_danger = 1;
			level.rich_sq_player = self;
			self.favorite_wall_weapons_list[ self.favorite_wall_weapons_list.size ] = "beretta93r_zm";
			self set_player_is_female( 0 );
			break;
	}
	self setmovespeedscale( 1 );
	self setsprintduration( 4 );
	self setsprintcooldown( 0 );
	self set_player_tombstone_index();
	self thread set_exert_id();
}

set_exert_id() //checked matches cerberus output
{
	self endon( "disconnect" );
	wait_network_frame();
	wait_network_frame();
	self maps/mp/zombies/_zm_audio::setexertvoice( self.characterindex + 1 );
}

setup_personality_character_exerts() //checked matches cerberus output
{
	level.exert_sounds[ 1 ][ "burp" ][ 0 ] = "vox_plr_0_exert_burp_0";
	level.exert_sounds[ 1 ][ "burp" ][ 1 ] = "vox_plr_0_exert_burp_1";
	level.exert_sounds[ 1 ][ "burp" ][ 2 ] = "vox_plr_0_exert_burp_2";
	level.exert_sounds[ 1 ][ "burp" ][ 3 ] = "vox_plr_0_exert_burp_3";
	level.exert_sounds[ 1 ][ "burp" ][ 4 ] = "vox_plr_0_exert_burp_4";
	level.exert_sounds[ 1 ][ "burp" ][ 5 ] = "vox_plr_0_exert_burp_5";
	level.exert_sounds[ 1 ][ "burp" ][ 6 ] = "vox_plr_0_exert_burp_6";
	level.exert_sounds[ 2 ][ "burp" ][ 0 ] = "vox_plr_1_exert_burp_0";
	level.exert_sounds[ 2 ][ "burp" ][ 1 ] = "vox_plr_1_exert_burp_1";
	level.exert_sounds[ 2 ][ "burp" ][ 2 ] = "vox_plr_1_exert_burp_2";
	level.exert_sounds[ 2 ][ "burp" ][ 3 ] = "vox_plr_1_exert_burp_3";
	level.exert_sounds[ 3 ][ "burp" ][ 0 ] = "vox_plr_2_exert_burp_0";
	level.exert_sounds[ 3 ][ "burp" ][ 1 ] = "vox_plr_2_exert_burp_1";
	level.exert_sounds[ 3 ][ "burp" ][ 2 ] = "vox_plr_2_exert_burp_2";
	level.exert_sounds[ 3 ][ "burp" ][ 3 ] = "vox_plr_2_exert_burp_3";
	level.exert_sounds[ 3 ][ "burp" ][ 4 ] = "vox_plr_2_exert_burp_4";
	level.exert_sounds[ 3 ][ "burp" ][ 5 ] = "vox_plr_2_exert_burp_5";
	level.exert_sounds[ 3 ][ "burp" ][ 6 ] = "vox_plr_2_exert_burp_6";
	level.exert_sounds[ 4 ][ "burp" ][ 0 ] = "vox_plr_3_exert_burp_0";
	level.exert_sounds[ 4 ][ "burp" ][ 1 ] = "vox_plr_3_exert_burp_1";
	level.exert_sounds[ 4 ][ "burp" ][ 2 ] = "vox_plr_3_exert_burp_2";
	level.exert_sounds[ 4 ][ "burp" ][ 3 ] = "vox_plr_3_exert_burp_3";
	level.exert_sounds[ 4 ][ "burp" ][ 4 ] = "vox_plr_3_exert_burp_4";
	level.exert_sounds[ 4 ][ "burp" ][ 5 ] = "vox_plr_3_exert_burp_5";
	level.exert_sounds[ 4 ][ "burp" ][ 6 ] = "vox_plr_3_exert_burp_6";
	level.exert_sounds[ 1 ][ "hitmed" ][ 0 ] = "vox_plr_0_exert_pain_medium_0";
	level.exert_sounds[ 1 ][ "hitmed" ][ 1 ] = "vox_plr_0_exert_pain_medium_1";
	level.exert_sounds[ 1 ][ "hitmed" ][ 2 ] = "vox_plr_0_exert_pain_medium_2";
	level.exert_sounds[ 1 ][ "hitmed" ][ 3 ] = "vox_plr_0_exert_pain_medium_3";
	level.exert_sounds[ 2 ][ "hitmed" ][ 0 ] = "vox_plr_1_exert_pain_medium_0";
	level.exert_sounds[ 2 ][ "hitmed" ][ 1 ] = "vox_plr_1_exert_pain_medium_1";
	level.exert_sounds[ 2 ][ "hitmed" ][ 2 ] = "vox_plr_1_exert_pain_medium_2";
	level.exert_sounds[ 2 ][ "hitmed" ][ 3 ] = "vox_plr_1_exert_pain_medium_3";
	level.exert_sounds[ 3 ][ "hitmed" ][ 0 ] = "vox_plr_2_exert_pain_medium_0";
	level.exert_sounds[ 3 ][ "hitmed" ][ 1 ] = "vox_plr_2_exert_pain_medium_1";
	level.exert_sounds[ 3 ][ "hitmed" ][ 2 ] = "vox_plr_2_exert_pain_medium_2";
	level.exert_sounds[ 3 ][ "hitmed" ][ 3 ] = "vox_plr_2_exert_pain_medium_3";
	level.exert_sounds[ 4 ][ "hitmed" ][ 0 ] = "vox_plr_3_exert_pain_medium_0";
	level.exert_sounds[ 4 ][ "hitmed" ][ 1 ] = "vox_plr_3_exert_pain_medium_1";
	level.exert_sounds[ 4 ][ "hitmed" ][ 2 ] = "vox_plr_3_exert_pain_medium_2";
	level.exert_sounds[ 4 ][ "hitmed" ][ 3 ] = "vox_plr_3_exert_pain_medium_3";
	level.exert_sounds[ 1 ][ "hitlrg" ][ 0 ] = "vox_plr_0_exert_pain_high_0";
	level.exert_sounds[ 1 ][ "hitlrg" ][ 1 ] = "vox_plr_0_exert_pain_high_1";
	level.exert_sounds[ 1 ][ "hitlrg" ][ 2 ] = "vox_plr_0_exert_pain_high_2";
	level.exert_sounds[ 1 ][ "hitlrg" ][ 3 ] = "vox_plr_0_exert_pain_high_3";
	level.exert_sounds[ 2 ][ "hitlrg" ][ 0 ] = "vox_plr_1_exert_pain_high_0";
	level.exert_sounds[ 2 ][ "hitlrg" ][ 1 ] = "vox_plr_1_exert_pain_high_1";
	level.exert_sounds[ 2 ][ "hitlrg" ][ 2 ] = "vox_plr_1_exert_pain_high_2";
	level.exert_sounds[ 2 ][ "hitlrg" ][ 3 ] = "vox_plr_1_exert_pain_high_3";
	level.exert_sounds[ 3 ][ "hitlrg" ][ 0 ] = "vox_plr_2_exert_pain_high_0";
	level.exert_sounds[ 3 ][ "hitlrg" ][ 1 ] = "vox_plr_2_exert_pain_high_1";
	level.exert_sounds[ 3 ][ "hitlrg" ][ 2 ] = "vox_plr_2_exert_pain_high_2";
	level.exert_sounds[ 3 ][ "hitlrg" ][ 3 ] = "vox_plr_2_exert_pain_high_3";
	level.exert_sounds[ 4 ][ "hitlrg" ][ 0 ] = "vox_plr_3_exert_pain_high_0";
	level.exert_sounds[ 4 ][ "hitlrg" ][ 1 ] = "vox_plr_3_exert_pain_high_1";
	level.exert_sounds[ 4 ][ "hitlrg" ][ 2 ] = "vox_plr_3_exert_pain_high_2";
	level.exert_sounds[ 4 ][ "hitlrg" ][ 3 ] = "vox_plr_3_exert_pain_high_3";
}

givecustomloadout( takeallweapons, alreadyspawned ) //checked matches cerberus output
{
	self giveweapon( "knife_zm" );
	self give_start_weapon( 1 );
}

transit_intermission() //checked changed to match cerberus output
{
	self closemenu();
	self closeingamemenu();
	level endon( "stop_intermission" );
	self endon( "disconnect" );
	self endon( "death" );
	self notify( "_zombie_game_over" );
	self.score = self.score_total;
	self.sessionstate = "intermission";
	self.spectatorclient = -1;
	self.killcamentity = -1;
	self.archivetime = 0;
	self.psoffsettime = 0;
	self.friendlydamage = undefined;
	maps/mp/_visionset_mgr::vsmgr_deactivate( "overlay", "zm_transit_burn", self );
	self stopshellshock();
	self.game_over_bg = newclienthudelem( self );
	self.game_over_bg.x = 0;
	self.game_over_bg.y = 0;
	self.game_over_bg.horzalign = "fullscreen";
	self.game_over_bg.vertalign = "fullscreen";
	self.game_over_bg.foreground = 1;
	self.game_over_bg.sort = 1;
	self.game_over_bg setshader( "black", 640, 480 );
	self.game_over_bg.alpha = 1;
	if ( !isDefined( level.the_bus ) )
	{
		self.game_over_bg fadeovertime( 1 );
		self.game_over_bg.alpha = 0;
		wait 5;
		self.game_over_bg thread maps/mp/zombies/_zm::fade_up_over_time( 1 );
	}
	else
	{
		zonestocheck = [];
		zonestocheck[ zonestocheck.size ] = "zone_amb_bridge";
		zonestocheck[ zonestocheck.size ] = "zone_trans_11";
		zonestocheck[ zonestocheck.size ] = "zone_town_west";
		zonestocheck[ zonestocheck.size ] = "zone_town_west2";
		zonestocheck[ zonestocheck.size ] = "zone_tow";
		near_bridge = 0;
		foreach ( zone in zonestocheck )
		{
			if ( level.the_bus maps/mp/zombies/_zm_zonemgr::entity_in_zone( "zone_amb_bridge" ) )
			{
				near_bridge = 1;
			}
		}
		if ( near_bridge )
		{
			trig = getent( "bridge_trig", "targetname" );
			trig notify( "trigger" );
		}
		org = spawn( "script_model", level.the_bus gettagorigin( "tag_camera" ) );
		org setmodel( "tag_origin" );
		org.angles = level.the_bus gettagangles( "tag_camera" );
		org linkto( level.the_bus );
		self setorigin( org.origin );
		self.angles = org.angles;
		if ( !flag( "OnPriDoorYar" ) || !flag( "OnPriDoorYar2" ) )
		{
			flag_set( "OnPriDoorYar" );
			wait_network_frame();
		}
		if ( !level.the_bus.ismoving )
		{
			level.the_bus.gracetimeatdestination = 0.1;
			level.the_bus notify( "depart_early" );
		}
		players = get_players();
		j = 0;
		while ( j < players.size )
		{
			player = players[ j ];
			player camerasetposition( org );
			player camerasetlookat();
			player cameraactivate( 1 );
			j++;
		}
		self.game_over_bg fadeovertime( 1 );
		self.game_over_bg.alpha = 0;
		wait 12;
		self.game_over_bg fadeovertime( 1 );
		self.game_over_bg.alpha = 1;
		wait 1;
	}
}

transit_standard_intermission() //checked changed to match cerberus output
{
	self closemenu();
	self closeingamemenu();
	level endon( "stop_intermission" );
	self endon( "disconnect" );
	self endon( "death" );
	self notify( "_zombie_game_over" );
	self.score = self.score_total;
	self.sessionstate = "intermission";
	self.spectatorclient = -1;
	self.killcamentity = -1;
	self.archivetime = 0;
	self.psoffsettime = 0;
	self.friendlydamage = undefined;
	maps/mp/_visionset_mgr::vsmgr_deactivate( "overlay", "zm_transit_burn", self );
	self stopshellshock();
	points = getstructarray( "intermission", "targetname" );
	point = undefined;
	if ( !isDefined( points ) || points.size == 0 )
	{
		points = getentarray( "info_intermission", "classname" );
		if ( points.size < 1 )
		{
			/*
/#
			println( "NO info_intermission POINTS IN MAP" );
#/
			*/
			return;
		}
	}
	self.game_over_bg = newclienthudelem( self );
	self.game_over_bg.x = 0;
	self.game_over_bg.y = 0;
	self.game_over_bg.horzalign = "fullscreen";
	self.game_over_bg.vertalign = "fullscreen";
	self.game_over_bg.foreground = 1;
	self.game_over_bg.sort = 1;
	self.game_over_bg setshader( "black", 640, 480 );
	self.game_over_bg.alpha = 1;
	org = undefined;
	while ( 1 )
	{
		foreach ( struct in points )
		{
			if ( isDefined( struct.script_string ) && struct.script_string == level.scr_zm_map_start_location )
			{
				point = struct;
			}
		}
		if ( !isDefined( point ) )
		{
			point = points[ 0 ];
		}
		if ( !isDefined( org ) )
		{
			self spawn( point.origin, point.angles );
		}
		if ( isDefined( point.target ) )
		{
			if ( !isDefined( org ) )
			{
				org = spawn( "script_model", self.origin + vectorScale( ( 0, -1, 0 ), 60 ) );
				org setmodel( "tag_origin" );
			}
			org.origin = point.origin;
			org.angles = point.angles;
			for ( j = 0; j < get_players().size; j++ )
			{
				player = get_players()[ j ];
				player camerasetposition( org );
				player camerasetlookat();
				player cameraactivate( 1 );
			}
			speed = 20;
			if ( isDefined( point.speed ) )
			{
				speed = point.speed;
			}
			target_point = getstruct( point.target, "targetname" );
			dist = distance( point.origin, target_point.origin );
			time = dist / speed;
			q_time = time * 0.25;
			if ( q_time > 1 )
			{
				q_time = 1;
			}
			self.game_over_bg fadeovertime( q_time );
			self.game_over_bg.alpha = 0;
			org moveto( target_point.origin, time, q_time, q_time );
			org rotateto( target_point.angles, time, q_time, q_time );
			wait ( time - q_time );
			self.game_over_bg fadeovertime( q_time );
			self.game_over_bg.alpha = 1;
			wait q_time;
			continue;
		}
		else
		{
			self.game_over_bg fadeovertime( 1 );
			self.game_over_bg.alpha = 0;
			wait 5;
			self.game_over_bg thread fade_up_over_time( 1 );
		}
	}
}

meetupwithothercharacters() //checked partially changed to match beta dump see info.md No. 2
{
	self endon( "disconnect" );
	isalone = 1;
	flag_wait( "begin_spawning" );
	while ( isalone )
	{
		players = get_players();
		if ( flag( "solo_game" ) )
		{
			break;
		}
		foreach ( player in players )
		{
			if ( player == self )
			{
			}
			else
			{
				if ( distancesquared( self.origin, player.origin ) < 1048576 )
				{
					/*					
/#
					println( "^2Transit Debug: " + self.name + " met up with " + player.name );
#/
					*/
					isalone = 0;
				}
			}
		}
		wait 1;
	}
	self.characterrespawnpoint = undefined;
}

transit_respawn_override( player ) //checked matches cerberus output
{
	if ( isDefined( player.characterrespawnpoint ) )
	{
		/*
/#
		println( "^2Transit Debug: Using character respawn point for " + player.name );
#/
		*/
		return player.characterrespawnpoint.origin;
	}
	return undefined;
}

disable_triggers() //checked changed to match cerberus output
{
	trig = getentarray( "trigger_Keys", "targetname" );
	for ( i = 0; i < trig.size; i++ )
	{
		trig[ i ] trigger_off();
	}
}

transit_zone_init() //checked changed to match cerberus output
{
	flag_init( "always_on" );
	flag_init( "init_classic_adjacencies" );
	flag_set( "always_on" );
	if ( is_classic() )
	{
		flag_set( "init_classic_adjacencies" );
		add_adjacent_zone( "zone_trans_2", "zone_trans_2b", "init_classic_adjacencies" );
		add_adjacent_zone( "zone_station_ext", "zone_trans_2b", "init_classic_adjacencies", 1 );
		add_adjacent_zone( "zone_town_west2", "zone_town_west", "init_classic_adjacencies" );
		add_adjacent_zone( "zone_town_south", "zone_town_church", "init_classic_adjacencies" );
		add_adjacent_zone( "zone_trans_pow_ext1", "zone_trans_7", "init_classic_adjacencies" );
		add_adjacent_zone( "zone_far", "zone_far_ext", "OnFarm_enter" );
	}
	else
	{
		playable_area = getentarray( "player_volume", "script_noteworthy" );
		foreach ( area in playable_area )
		{
			add_adjacent_zone( "zone_station_ext", "zone_trans_2b", "always_on" );
			if ( isDefined( area.script_parameters ) && area.script_parameters == "classic_only" )
			{
				area delete();
			}
		}
	}
	add_adjacent_zone( "zone_pri2", "zone_station_ext", "OnPriDoorYar", 1 );
	add_adjacent_zone( "zone_pri2", "zone_pri", "OnPriDoorYar3", 1 );
	if ( getDvar( "ui_zm_mapstartlocation" ) == "transit" )
	{
		level thread disconnect_door_zones( "zone_pri2", "zone_station_ext", "OnPriDoorYar" );
		level thread disconnect_door_zones( "zone_pri2", "zone_pri", "OnPriDoorYar3" );
	}
	add_adjacent_zone( "zone_station_ext", "zone_pri", "OnPriDoorYar2" );
	add_adjacent_zone( "zone_roadside_west", "zone_din", "OnGasDoorDin" );
	add_adjacent_zone( "zone_roadside_west", "zone_gas", "always_on" );
	add_adjacent_zone( "zone_roadside_east", "zone_gas", "always_on" );
	add_adjacent_zone( "zone_roadside_east", "zone_gar", "OnGasDoorGar" );
	add_adjacent_zone( "zone_trans_diner", "zone_roadside_west", "always_on", 1 );
	add_adjacent_zone( "zone_trans_diner", "zone_gas", "always_on", 1 );
	add_adjacent_zone( "zone_trans_diner2", "zone_roadside_east", "always_on", 1 );
	add_adjacent_zone( "zone_gas", "zone_din", "OnGasDoorDin" );
	add_adjacent_zone( "zone_gas", "zone_gar", "OnGasDoorGar" );
	add_adjacent_zone( "zone_diner_roof", "zone_din", "OnGasDoorDin", 1 );
	add_adjacent_zone( "zone_amb_cornfield", "zone_cornfield_prototype", "always_on" );
	add_adjacent_zone( "zone_tow", "zone_bar", "always_on", 1 );
	add_adjacent_zone( "zone_bar", "zone_tow", "OnTowDoorBar", 1 );
	add_adjacent_zone( "zone_tow", "zone_ban", "OnTowDoorBan" );
	add_adjacent_zone( "zone_ban", "zone_ban_vault", "OnTowBanVault" );
	add_adjacent_zone( "zone_tow", "zone_town_north", "always_on" );
	add_adjacent_zone( "zone_town_north", "zone_ban", "OnTowDoorBan" );
	add_adjacent_zone( "zone_tow", "zone_town_west", "always_on" );
	add_adjacent_zone( "zone_tow", "zone_town_south", "always_on" );
	add_adjacent_zone( "zone_town_south", "zone_town_barber", "always_on", 1 );
	add_adjacent_zone( "zone_tow", "zone_town_east", "always_on" );
	add_adjacent_zone( "zone_town_east", "zone_bar", "OnTowDoorBar" );
	add_adjacent_zone( "zone_tow", "zone_town_barber", "always_on", 1 );
	add_adjacent_zone( "zone_town_barber", "zone_tow", "OnTowDoorBarber", 1 );
	add_adjacent_zone( "zone_town_barber", "zone_town_west", "OnTowDoorBarber" );
	add_adjacent_zone( "zone_far_ext", "zone_brn", "OnFarm_enter" );
	add_adjacent_zone( "zone_far_ext", "zone_farm_house", "open_farmhouse" );
	add_adjacent_zone( "zone_prr", "zone_pow", "OnPowDoorRR", 1 );
	add_adjacent_zone( "zone_pcr", "zone_prr", "OnPowDoorRR" );
	add_adjacent_zone( "zone_pcr", "zone_pow_warehouse", "OnPowDoorWH" );
	add_adjacent_zone( "zone_pow", "zone_pow_warehouse", "OnPowDoorWH" );
	add_adjacent_zone( "zone_tbu", "zone_tow", "vault_opened", 1 );
}

include_powerups() //checked matches cerberus output
{
	gametype = getDvar( "ui_gametype" );
	include_powerup( "nuke" );
	include_powerup( "insta_kill" );
	include_powerup( "double_points" );
	include_powerup( "full_ammo" );
	include_powerup( "insta_kill_ug" );
	if ( gametype != "zgrief" )
	{
		include_powerup( "carpenter" );
	}
	if ( is_encounter() && gametype != "zgrief" )
	{
		include_powerup( "minigun" );
	}
	include_powerup( "teller_withdrawl" );
}

add_transit_powerups() //checked matches cerberus output
{
	maps/mp/zombies/_zm_powerups::add_zombie_powerup( "teller_withdrawl", "zombie_z_money_icon", &"ZOMBIE_TELLER_PICKUP_DEPOSIT", maps/mp/zombies/_zm_powerups::func_should_never_drop, 1, 0, 0 );
}

include_equipment_for_level() //checked matches cerberus output
{
	level.equipment_turret_needs_power = 1;
	level.equipment_etrap_needs_power = 1;
	include_equipment( "jetgun_zm" );
	include_equipment( "riotshield_zm" );
	include_equipment( "equip_turbine_zm" );
	include_equipment( "equip_turret_zm" );
	include_equipment( "equip_electrictrap_zm" );
	level.equipment_planted = ::equipment_planted;
	level.equipment_safe_to_drop = ::equipment_safe_to_drop;
	level.check_force_deploy_origin = ::use_safe_spawn_on_bus;
	limit_equipment( "jetgun_zm", 1 );
	level.explode_overheated_jetgun = 1;
	level.exploding_jetgun_fx = level._effect[ "lava_burning" ];
}

transit_bus_update_retrieve_trigger( player ) //checked matches cerberus output used is_true instead
{
	self endon( "death" );
	player endon( "zmb_lost_knife" );
	if ( isDefined( level.the_bus ) && is_true( player.isonbus ) )
	{
		wait 2;
		trigger = self.retrievabletrigger;
		trigger.origin = ( self.origin[ 0 ], self.origin[ 1 ], self.origin[ 2 ] + 10 );
		self linkto( level.the_bus );
		trigger linkto( self );
	}
	else
	{
		self waittill( "stationary" );
		trigger = self.retrievabletrigger;
		trigger.origin = ( self.origin[ 0 ], self.origin[ 1 ], self.origin[ 2 ] + 10 );
		trigger linkto( self );
	}
}

claymore_safe_to_plant() //checked matches cerberus output
{
	if ( self maps/mp/zm_transit_lava::object_touching_lava() )
	{
		return 0;
	}
	if ( self.owner maps/mp/zm_transit_lava::object_touching_lava() )
	{
		return 0;
	}
	return 1;
}

claymore_planted( weapon ) //checked matches cerberus output
{
	weapon waittill( "stationary" );
	if ( !isDefined( weapon ) )
	{
		return;
	}
	weaponbus = weapon maps/mp/zm_transit_bus::object_is_on_bus();
	if ( weaponbus )
	{
		if ( isDefined( weapon ) )
		{
			weapon setmovingplatformenabled( 1 );
			weapon.equipment_can_move = 1;
			weapon.isonbus = 1;
			weapon.move_parent = level.the_bus;
			if ( isDefined( weapon.damagearea ) )
			{
				weapon.damagearea setmovingplatformenabled( 1 );
			}
		}
	}
}

fakelinkto( linkee ) //checked matches cerberus output
{
	self.backlinked = 1;
	while ( isDefined( self ) && isDefined( linkee ) )
	{
		self.origin = linkee.origin;
		self.angles = linkee.angles;
		wait 0.05;
	}
}

knife_planted( knife, trigger, parent ) //checked matches cerberus output
{
	if ( !isDefined( knife ) )
	{
		return;
	}
	weaponbus = knife maps/mp/zm_transit_bus::object_is_on_bus();
	if ( weaponbus )
	{
		trigger linkto( knife );
		trigger setmovingplatformenabled( 1 );
		trigger.isonbus = 1;
		knife setmovingplatformenabled( 1 );
		knife.isonbus = 1;
	}
}

grenade_planted( grenade, model ) //checked matches cerberus output
{
	if ( !isDefined( grenade ) )
	{
		return;
	}
	weaponbus = grenade maps/mp/zm_transit_bus::object_is_on_bus();
	if ( weaponbus )
	{
		if ( isDefined( grenade ) )
		{
			grenade setmovingplatformenabled( 1 );
			grenade.equipment_can_move = 1;
			grenade.isonbus = 1;
			grenade.move_parent = level.the_bus;
			if ( isDefined( model ) )
			{
				model setmovingplatformenabled( 1 );
				model linkto( level.the_bus );
				model.isonbus = 1;
				grenade fakelinkto( model );
			}
		}
	}
}

grenade_safe_to_throw( player, weapname ) //checked matches cerberus output
{
	return 1;
}

grenade_safe_to_bounce( player, weapname ) //checked matches cerberus output
{
	if ( !is_offhand_weapon( weapname ) && !is_grenade_launcher( weapname ) )
	{
		return 1;
	}
	if ( self maps/mp/zm_transit_lava::object_touching_lava() )
	{
		return 0;
	}
	return 1;
}

equipment_safe_to_drop( weapon ) //checked matches cerberus output used is_true instead
{
	if ( !isDefined( weapon.canmove ) )
	{
		weapon.canmove = weapon maps/mp/zm_transit_bus::object_is_on_bus();
	}
	if ( is_true( weapon.canmove ) )
	{
		return 1;
	}
	if ( weapon maps/mp/zm_transit_lava::object_touching_lava() )
	{
		return 0;
	}
	return 1;
}

use_safe_spawn_on_bus( weapon, origin, angles ) //checked matches cerberus output used is_true instead
{
	if ( is_true( self.isonbus ) && level.the_bus.ismoving )
	{
		weapon.canmove = 1;
		return 1;
	}
	return 0;
}

equipment_planted( weapon, equipname, groundfrom ) //checked matches cerberus output used is_true instead
{
	weaponbus = groundfrom maps/mp/zm_transit_bus::object_is_on_bus();
	if ( !weaponbus && weapon maps/mp/zm_transit_lava::object_touching_lava() )
	{
		self maps/mp/zombies/_zm_equipment::equipment_take( equipname );
		wait 0.05;
		self notify( equipname + "_taken" );
		return;
	}
	if ( isDefined( self ) && weaponbus )
	{
		if ( isDefined( weapon ) )
		{
			if ( !is_true( weapon.canmove ) )
			{
				weapon.canmove = 1;
				reregister_unitrigger_as_dynamic( weapon.stub );
			}
			weapon linkto( level.the_bus );
			weapon setmovingplatformenabled( 1 );
			if ( isDefined( weapon.stub ) )
			{
				weapon.stub.link_parent = level.the_bus;
				weapon.stub.origin_parent = weapon;
			}
			weapon.equipment_can_move = 1;
			weapon.isonbus = 1;
			weapon.move_parent = level.the_bus;
		}
	}
}

offhand_weapon_overrride() //checked matches cerberus output
{
	register_lethal_grenade_for_level( "frag_grenade_zm" );
	level.zombie_lethal_grenade_player_init = "frag_grenade_zm";
	register_lethal_grenade_for_level( "sticky_grenade_zm" );
	register_tactical_grenade_for_level( "cymbal_monkey_zm" );
	register_tactical_grenade_for_level( "emp_grenade_zm" );
	level.zombie_tactical_grenade_player_init = undefined;
	level.grenade_safe_to_throw = ::grenade_safe_to_throw;
	level.grenade_safe_to_bounce = ::grenade_safe_to_bounce;
	level.grenade_planted = ::grenade_planted;
	level.knife_planted = ::knife_planted;
	register_placeable_mine_for_level( "claymore_zm" );
	level.zombie_placeable_mine_player_init = undefined;
	level.claymore_safe_to_plant = ::claymore_safe_to_plant;
	level.claymore_planted = ::claymore_planted;
	register_melee_weapon_for_level( "knife_zm" );
	register_melee_weapon_for_level( "bowie_knife_zm" );
	register_melee_weapon_for_level( "tazer_knuckles_zm" );
	level.zombie_melee_weapon_player_init = "knife_zm";
	register_equipment_for_level( "jetgun_zm" );
	register_equipment_for_level( "riotshield_zm" );
	register_equipment_for_level( "equip_turbine_zm" );
	register_equipment_for_level( "equip_turret_zm" );
	register_equipment_for_level( "equip_electrictrap_zm" );
	level.zombie_equipment_player_init = undefined;
}

include_weapons() //checked matches cerberus output used is_true instead
{
	gametype = getDvar( "ui_gametype" );
	include_weapon( "knife_zm", 0 );
	include_weapon( "frag_grenade_zm", 0 );
	include_weapon( "claymore_zm", 0 );
	include_weapon( "sticky_grenade_zm", 0 );
	include_weapon( "m1911_zm", 0 );
	include_weapon( "m1911_upgraded_zm", 0 );
	include_weapon( "python_zm" );
	include_weapon( "python_upgraded_zm", 0 );
	include_weapon( "judge_zm" );
	include_weapon( "judge_upgraded_zm", 0 );
	include_weapon( "kard_zm" );
	include_weapon( "kard_upgraded_zm", 0 );
	include_weapon( "fiveseven_zm" );
	include_weapon( "fiveseven_upgraded_zm", 0 );
	include_weapon( "beretta93r_zm", 0 );
	include_weapon( "beretta93r_upgraded_zm", 0 );
	include_weapon( "fivesevendw_zm" );
	include_weapon( "fivesevendw_upgraded_zm", 0 );
	include_weapon( "ak74u_zm", 0 );
	include_weapon( "ak74u_upgraded_zm", 0 );
	include_weapon( "mp5k_zm", 0 );
	include_weapon( "mp5k_upgraded_zm", 0 );
	include_weapon( "qcw05_zm" );
	include_weapon( "qcw05_upgraded_zm", 0 );
	include_weapon( "870mcs_zm", 0 );
	include_weapon( "870mcs_upgraded_zm", 0 );
	include_weapon( "rottweil72_zm", 0 );
	include_weapon( "rottweil72_upgraded_zm", 0 );
	include_weapon( "saiga12_zm" );
	include_weapon( "saiga12_upgraded_zm", 0 );
	include_weapon( "srm1216_zm" );
	include_weapon( "srm1216_upgraded_zm", 0 );
	include_weapon( "m14_zm", 0 );
	include_weapon( "m14_upgraded_zm", 0 );
	include_weapon( "saritch_zm" );
	include_weapon( "saritch_upgraded_zm", 0 );
	include_weapon( "m16_zm", 0 );
	include_weapon( "m16_gl_upgraded_zm", 0 );
	include_weapon( "xm8_zm" );
	include_weapon( "xm8_upgraded_zm", 0 );
	include_weapon( "type95_zm" );
	include_weapon( "type95_upgraded_zm", 0 );
	include_weapon( "tar21_zm" );
	include_weapon( "tar21_upgraded_zm", 0 );
	include_weapon( "galil_zm" );
	include_weapon( "galil_upgraded_zm", 0 );
	include_weapon( "fnfal_zm" );
	include_weapon( "fnfal_upgraded_zm", 0 );
	include_weapon( "dsr50_zm" );
	include_weapon( "dsr50_upgraded_zm", 0 );
	include_weapon( "barretm82_zm" );
	include_weapon( "barretm82_upgraded_zm", 0 );
	include_weapon( "rpd_zm" );
	include_weapon( "rpd_upgraded_zm", 0 );
	include_weapon( "hamr_zm" );
	include_weapon( "hamr_upgraded_zm", 0 );
	include_weapon( "usrpg_zm" );
	include_weapon( "usrpg_upgraded_zm", 0 );
	include_weapon( "m32_zm" );
	include_weapon( "m32_upgraded_zm", 0 );
	include_weapon( "cymbal_monkey_zm" );
	include_weapon( "emp_grenade_zm", 1, undefined, ::less_than_normal );
	if ( is_classic() )
	{
		include_weapon( "screecher_arms_zm", 0 );
	}
	if ( gametype != "zgrief" )
	{
		include_weapon( "ray_gun_zm" );
		include_weapon( "ray_gun_upgraded_zm", 0 );
		include_weapon( "jetgun_zm", 0, undefined, ::less_than_normal );
		include_weapon( "riotshield_zm", 0 );
		include_weapon( "tazer_knuckles_zm", 0 );
		include_weapon( "knife_ballistic_no_melee_zm", 0 );
		include_weapon( "knife_ballistic_no_melee_upgraded_zm", 0 );
		include_weapon( "knife_ballistic_zm" );
		include_weapon( "knife_ballistic_upgraded_zm", 0 );
		include_weapon( "knife_ballistic_bowie_zm", 0 );
		include_weapon( "knife_ballistic_bowie_upgraded_zm", 0 );
		level._uses_retrievable_ballisitic_knives = 1;
		add_limited_weapon( "knife_ballistic_zm", 1 );
		add_limited_weapon( "jetgun_zm", 1 );
		add_limited_weapon( "ray_gun_zm", 4 );
		add_limited_weapon( "ray_gun_upgraded_zm", 4 );
		add_limited_weapon( "knife_ballistic_upgraded_zm", 0 );
		add_limited_weapon( "knife_ballistic_no_melee_zm", 0 );
		add_limited_weapon( "knife_ballistic_no_melee_upgraded_zm", 0 );
		add_limited_weapon( "knife_ballistic_bowie_zm", 0 );
		add_limited_weapon( "knife_ballistic_bowie_upgraded_zm", 0 );
		if ( is_true( level.raygun2_included ) )
		{
			include_weapon( "raygun_mark2_zm" );
			include_weapon( "raygun_mark2_upgraded_zm", 0 );
			add_weapon_to_content( "raygun_mark2_zm", "dlc3" );
			add_limited_weapon( "raygun_mark2_zm", 1 );
			add_limited_weapon( "raygun_mark2_upgraded_zm", 1 );
		}
	}
	add_limited_weapon( "m1911_zm", 0 );
	add_weapon_locker_mapping( "lsat_zm", "hamr_zm" );
	add_weapon_locker_mapping( "lsat_upgraded_zm", "hamr_upgraded_zm" );
	add_weapon_locker_mapping( "svu_zm", "fnfal_zm" );
	add_weapon_locker_mapping( "svu_upgraded_zm", "fnfal_upgraded_zm" );
	add_weapon_locker_mapping( "pdw57_zm", "qcw05_zm" );
	add_weapon_locker_mapping( "pdw57_upgraded_zm", "qcw05_upgraded_zm" );
	add_weapon_locker_mapping( "an94_zm", "galil_zm" );
	add_weapon_locker_mapping( "an94_upgraded_zm", "galil_upgraded_zm" );
	add_weapon_locker_mapping( "rnma_zm", "python_zm" );
	add_weapon_locker_mapping( "rnma_upgraded_zm", "python_upgraded_zm" );
}

less_than_normal() //checked matches cerberus output
{
	return 0.5;
}

custom_add_weapons() //checked matches cerberus output used is_true instead
{
	add_zombie_weapon( "m1911_zm", "m1911_upgraded_zm", &"ZOMBIE_WEAPON_M1911", 50, "", "", undefined );
	add_zombie_weapon( "python_zm", "python_upgraded_zm", &"ZOMBIE_WEAPON_PYTHON", 50, "wpck_python", "", undefined, 1 );
	add_zombie_weapon( "judge_zm", "judge_upgraded_zm", &"ZOMBIE_WEAPON_JUDGE", 50, "wpck_judge", "", undefined, 1 );
	add_zombie_weapon( "kard_zm", "kard_upgraded_zm", &"ZOMBIE_WEAPON_KARD", 50, "wpck_kap", "", undefined, 1 );
	add_zombie_weapon( "fiveseven_zm", "fiveseven_upgraded_zm", &"ZOMBIE_WEAPON_FIVESEVEN", 50, "wpck_57", "", undefined, 1 );
	add_zombie_weapon( "beretta93r_zm", "beretta93r_upgraded_zm", &"ZOMBIE_WEAPON_BERETTA93r", 1000, "", "", undefined );
	add_zombie_weapon( "fivesevendw_zm", "fivesevendw_upgraded_zm", &"ZOMBIE_WEAPON_FIVESEVENDW", 50, "wpck_duel57", "", undefined, 1 );
	add_zombie_weapon( "ak74u_zm", "ak74u_upgraded_zm", &"ZOMBIE_WEAPON_AK74U", 1200, "smg", "", undefined );
	add_zombie_weapon( "mp5k_zm", "mp5k_upgraded_zm", &"ZOMBIE_WEAPON_MP5K", 1000, "smg", "", undefined );
	add_zombie_weapon( "qcw05_zm", "qcw05_upgraded_zm", &"ZOMBIE_WEAPON_QCW05", 50, "wpck_chicom", "", undefined, 1 );
	add_zombie_weapon( "870mcs_zm", "870mcs_upgraded_zm", &"ZOMBIE_WEAPON_870MCS", 1500, "shotgun", "", undefined );
	add_zombie_weapon( "rottweil72_zm", "rottweil72_upgraded_zm", &"ZOMBIE_WEAPON_ROTTWEIL72", 500, "shotgun", "", undefined );
	add_zombie_weapon( "saiga12_zm", "saiga12_upgraded_zm", &"ZOMBIE_WEAPON_SAIGA12", 50, "wpck_saiga12", "", undefined, 1 );
	add_zombie_weapon( "srm1216_zm", "srm1216_upgraded_zm", &"ZOMBIE_WEAPON_SRM1216", 50, "wpck_m1216", "", undefined, 1 );
	add_zombie_weapon( "m14_zm", "m14_upgraded_zm", &"ZOMBIE_WEAPON_M14", 500, "rifle", "", undefined );
	add_zombie_weapon( "saritch_zm", "saritch_upgraded_zm", &"ZOMBIE_WEAPON_SARITCH", 50, "wpck_sidr", "", undefined, 1 );
	add_zombie_weapon( "m16_zm", "m16_gl_upgraded_zm", &"ZOMBIE_WEAPON_M16", 1200, "burstrifle", "", undefined );
	add_zombie_weapon( "xm8_zm", "xm8_upgraded_zm", &"ZOMBIE_WEAPON_XM8", 50, "wpck_m8a1", "", undefined, 1 );
	add_zombie_weapon( "type95_zm", "type95_upgraded_zm", &"ZOMBIE_WEAPON_TYPE95", 50, "wpck_type25", "", undefined, 1 );
	add_zombie_weapon( "tar21_zm", "tar21_upgraded_zm", &"ZOMBIE_WEAPON_TAR21", 50, "wpck_x95l", "", undefined, 1 );
	add_zombie_weapon( "galil_zm", "galil_upgraded_zm", &"ZOMBIE_WEAPON_GALIL", 50, "wpck_galil", "", undefined, 1 );
	add_zombie_weapon( "fnfal_zm", "fnfal_upgraded_zm", &"ZOMBIE_WEAPON_FNFAL", 50, "wpck_fal", "", undefined, 1 );
	add_zombie_weapon( "dsr50_zm", "dsr50_upgraded_zm", &"ZOMBIE_WEAPON_DR50", 50, "wpck_dsr50", "", undefined, 1 );
	add_zombie_weapon( "barretm82_zm", "barretm82_upgraded_zm", &"ZOMBIE_WEAPON_BARRETM82", 50, "sniper", "", undefined );
	add_zombie_weapon( "rpd_zm", "rpd_upgraded_zm", &"ZOMBIE_WEAPON_RPD", 50, "wpck_rpd", "", undefined, 1 );
	add_zombie_weapon( "hamr_zm", "hamr_upgraded_zm", &"ZOMBIE_WEAPON_HAMR", 50, "wpck_hamr", "", undefined, 1 );
	add_zombie_weapon( "frag_grenade_zm", undefined, &"ZOMBIE_WEAPON_FRAG_GRENADE", 250, "grenade", "", 250 );
	add_zombie_weapon( "sticky_grenade_zm", undefined, &"ZOMBIE_WEAPON_STICKY_GRENADE", 250, "grenade", "", 250 );
	add_zombie_weapon( "claymore_zm", undefined, &"ZOMBIE_WEAPON_CLAYMORE", 1000, "grenade", "", undefined );
	add_zombie_weapon( "usrpg_zm", "usrpg_upgraded_zm", &"ZOMBIE_WEAPON_USRPG", 50, "wpck_rpg", "", undefined, 1 );
	add_zombie_weapon( "m32_zm", "m32_upgraded_zm", &"ZOMBIE_WEAPON_M32", 50, "wpck_m32", "", undefined, 1 );
	add_zombie_weapon( "cymbal_monkey_zm", undefined, &"ZOMBIE_WEAPON_SATCHEL_2000", 2000, "wpck_monkey", "", undefined, 1 );
	add_zombie_weapon( "emp_grenade_zm", undefined, &"ZOMBIE_WEAPON_EMP_GRENADE", 2000, "wpck_emp", "", undefined, 1 );
	add_zombie_weapon( "ray_gun_zm", "ray_gun_upgraded_zm", &"ZOMBIE_WEAPON_RAYGUN", 10000, "wpck_ray", "", undefined, 1 );
	add_zombie_weapon( "knife_ballistic_zm", "knife_ballistic_upgraded_zm", &"ZOMBIE_WEAPON_KNIFE_BALLISTIC", 10, "sickle", "", undefined );
	add_zombie_weapon( "knife_ballistic_bowie_zm", "knife_ballistic_bowie_upgraded_zm", &"ZOMBIE_WEAPON_KNIFE_BALLISTIC", 10, "wpck_knife", "", undefined, 1 );
	add_zombie_weapon( "knife_ballistic_no_melee_zm", "knife_ballistic_no_melee_upgraded_zm", &"ZOMBIE_WEAPON_KNIFE_BALLISTIC", 10, "sickle", "", undefined );
	add_zombie_weapon( "riotshield_zm", undefined, &"ZOMBIE_WEAPON_RIOTSHIELD", 2000, "riot", "", undefined );
	add_zombie_weapon( "jetgun_zm", undefined, &"ZOMBIE_WEAPON_JETGUN", 2000, "jet", "", undefined );
	add_zombie_weapon( "tazer_knuckles_zm", undefined, &"ZOMBIE_WEAPON_TAZER_KNUCKLES", 100, "tazerknuckles", "", undefined );
	if ( is_true( level.raygun2_included ) )
	{
		add_zombie_weapon( "raygun_mark2_zm", "raygun_mark2_upgraded_zm", &"ZOMBIE_WEAPON_RAYGUN_MARK2", 10000, "raygun_mark2", "", undefined );
	}
}

include_game_modules() //checked matches cerberus output
{
}

initial_round_wait_func() //checked matches cerberus output
{
	flag_wait( "initial_blackscreen_passed" );
}

zombie_speed_up() //checked matches cerberus output used is_true instead
{
	if ( is_true( self.isonbus ) )
	{
		return;
	}
	if ( self.zombie_move_speed != "sprint" )
	{
		self set_zombie_run_cycle( "sprint" );
	}
}

zombie_init_done() //checked matches cerberus output
{
	self.allowpain = 0;
	self setphysparams( 15, 0, 48 );
}

setup_dvars() //dev call didn't check
{
	/*
/#
	dvars = [];
	dvars[ dvars.size ] = "zombie_bus_debug_path";
	dvars[ dvars.size ] = "zombie_bus_debug_speed";
	dvars[ dvars.size ] = "zombie_bus_debug_near";
	dvars[ dvars.size ] = "zombie_bus_debug_attach";
	dvars[ dvars.size ] = "zombie_bus_skip_objectives";
	dvars[ dvars.size ] = "zombie_bus_debug_spawners";
	i = 0;
	while ( i < dvars.size )
	{
		if ( getDvar( dvars[ i ] ) == "" )
		{
			setdvar( dvars[ i ], "0" );
		}
		i++;
#/
	}
	*/
}

setup_zombie_init() //checked matches cerberus output
{
	zombies = getentarray( "zombie_spawner", "script_noteworthy" );
	array_thread( zombies, ::add_spawn_function, ::custom_zombie_setup );
}

setup_players() //checked matches cerberus output
{
	self.isonbus = 0;
	self.isonbusroof = 0;
	self.isinhub = 1;
	self.insafearea = 1;
}

transit_player_fake_death( vdir ) //checked changed to match cerberus output used is_true instead
{
	level notify( "fake_death" );
	self notify( "fake_death" );
	if ( is_true( self.isonbus ) )
	{
		level thread transit_player_fake_death_zombies();
	}
	stance = self getstance();
	self.ignoreme = 1;
	self enableinvulnerability();
	self takeallweapons();
	if ( is_true( self.insta_killed ) || self istouching( getent( "depot_lava_pit", "targetname" ) ) || is_true( self.isonbus ) && level.the_bus.ismoving )
	{
		self maps/mp/zombies/_zm::player_fake_death();
		self allowprone( 1 );
		self allowcrouch( 0 );
		self allowstand( 0 );
		wait 0.25;
		self freezecontrols( 1 );
	}
	else
	{
		self freezecontrols( 1 );
		self thread fall_down( vdir, stance );
		wait 1;
	}
}

transit_player_fake_death_zombies() //checked partially changed to match cerberus output see info.md No. 2 used is_true instead
{
	zombies = getaiarray( level.zombie_team );
	foreach ( zombie in zombies )
	{
		if ( !isalive( zombie ) )
		{
		}
		else if ( is_true( zombie.ignore_game_over_death ) )
		{
		}
		else if ( isDefined( zombie ) )
		{
			zombie dodamage( zombie.health + 666, zombie.origin );
		}
		else if ( ( index % 3 ) == 0 )
		{
			wait_network_frame();
		}
	}
}

fall_down( vdir, stance ) //checked changed to match cerberus output used is_true instead
{
	self endon( "disconnect" );
	level endon( "game_module_ended" );
	self ghost();
	origin = self.origin;
	xyspeed = ( 0, 0, 0 );
	angles = self getplayerangles();
	angles = ( angles[ 0 ], angles[ 1 ], angles[ 2 ] + randomfloatrange( -5, 5 ) );
	if ( isDefined( vdir ) && length( vdir ) > 0 )
	{
		xyspeedmag = 40 + randomint( 12 ) + randomint( 12 );
		xyspeed = xyspeedmag * vectornormalize( ( vdir[ 0 ], vdir[ 1 ], 0 ) );
	}
	linker = spawn( "script_origin", ( 0, 0, 0 ) );
	linker.origin = origin;
	linker.angles = angles;
	self._fall_down_anchor = linker;
	self playerlinkto( linker );
	self playsoundtoplayer( "zmb_player_death_fall", self );
	falling = stance != "prone";
	if ( falling )
	{
		origin = playerphysicstrace( origin, origin + xyspeed );
		eye = self get_eye();
		floor_height = ( 10 + origin[ 2 ] ) - eye[ 2 ];
		origin += ( 0, 0, floor_height );
		lerptime = 0.5;
		linker moveto( origin, lerptime, lerptime );
		linker rotateto( angles, lerptime, lerptime );
	}
	self freezecontrols( 1 );
	if ( falling )
	{
		linker waittill( "movedone" );
	}
	if ( is_true( self.isonbus ) )
	{
		linker linkto( level.the_bus );
	}
	self giveweapon( "death_throe_zm" );
	self switchtoweapon( "death_throe_zm" );
	if ( falling && !is_true( self.isonbus ) )
	{
		bounce = randomint( 4 ) + 8;
		origin = ( origin + ( 0, 0, bounce ) ) - ( xyspeed * 0.1 );
		lerptime = bounce / 50;
		linker moveto( origin, lerptime, 0, lerptime );
		linker waittill( "movedone" );
		origin = ( origin + ( 0, 0, bounce * -1 ) ) + ( xyspeed * 0.1 );
		lerptime /= 2;
		linker moveto( origin, lerptime, lerptime );
		linker waittill( "movedone" );
		linker moveto( origin, 5, 0 );
	}
	wait 15;
	linker delete();
}

transit_player_fake_death_cleanup() //checked matches cerberus output
{
	if ( isDefined( self._fall_down_anchor ) )
	{
		self._fall_down_anchor delete();
		self._fall_down_anchor = undefined;
	}
}

custom_zombie_setup() //checked matches cerberus output
{
	if ( is_survival() && !is_standard() )
	{
		self.nearbus = 0;
		self.isonbus = 0;
		self.isonbusroof = 0;
		self.was_walking = 0;
		self.candropsafekey = 1;
		self.candropbuskey = 1;
		self.custom_points_on_turret_damage = 0;
	}
}

bunkerdoorrotate( open, time ) //checked matches cerberus output
{
	if ( !isDefined( time ) )
	{
		time = 0.2;
	}
	rotate = self.script_float;
	if ( !open )
	{
		rotate *= -1;
	}
	if ( isDefined( self.script_angles ) )
	{
		self notsolid();
		self rotateto( self.script_angles, time, 0, 0 );
		self thread maps/mp/zombies/_zm_blockers::door_solid_thread();
	}
}

zm_transit_emp_init() //checked matches cerberus output
{
	level.custom_emp_detonate = ::zm_transit_emp_detonate;
	set_zombie_var( "emp_bus_off_range", 1200 );
	set_zombie_var( "emp_bus_off_time", 45 );
}

zm_transit_emp_detonate( grenade_origin ) //checked matches cerberus output
{
	test_ent = spawn( "script_origin", grenade_origin );
	if ( test_ent maps/mp/zombies/_zm_zonemgr::entity_in_zone( "zone_prr" ) )
	{
		if ( flag( "power_on" ) )
		{
			trig = getent( "powerswitch_buildable_trigger_power", "targetname" );
			trig notify( "trigger" );
		}
	}
	test_ent delete();
}

emp_detonate_boss( grenade_origin ) //checked matches cerberus output
{
}

register_screecher_lights() //checked changed to match cerberus output
{
	level.safety_lights = getstructarray( "screecher_escape", "targetname" );
	for ( i = 0; i < level.safety_lights.size; i++ )
	{
		safety = level.safety_lights[ i ];
		name = safety.script_noteworthy;
		if ( !isDefined( name ) )
		{
			/*
/#
			println( "ERROR Unnamed screecher light detected" );
#/
			*/
			name = "light_" + i;
		}
		clientfieldname = "screecher_light_" + name;
		level.safety_lights[ i ].clientfieldname = clientfieldname;
		registerclientfield( "world", clientfieldname, 1, 1, "int" );
	}
}

include_powered_items() //checked changed to match cerberus output
{
	if ( is_classic() )
	{
		include_powered_item( ::bus_power_on, ::bus_power_off, ::bus_range, maps/mp/zombies/_zm_power::cost_negligible, 1, 1, undefined );
		if ( isDefined( level.safety_lights ) )
		{
			for ( i = 0; i < level.safety_lights.size; i++ )
			{
				include_powered_item( ::safety_light_power_on, ::safety_light_power_off, ::safety_light_range, maps/mp/zombies/_zm_power::cost_low_if_local, 0, 0, level.safety_lights[ i ] );
			}
		}
	}
}

bus_range( delta, origin, radius ) //checked matches cerberus output
{
	if ( isDefined( level.the_bus ) )
	{
		if ( distance2dsquared( origin, level.the_bus.origin ) < ( radius * radius ) )
		{
			return 1;
		}
		forward = anglesToForward( level.the_bus.angles );
		forward = vectorScale( forward, 275 );
		bus_front = level.the_bus.origin + forward;
		if ( distance2dsquared( origin, bus_front ) < ( radius * radius ) )
		{
			return 1;
		}
	}
	return 0;
}

bus_power_on( origin, radius ) //checked matches cerberus output
{
	/*
/#
	println( "^1ZM POWER: bus on\n" );
#/
	*/
	level.the_bus thread maps/mp/zm_transit_bus::bus_power_on();
}

bus_power_off( origin, radius ) //checked matches cerberus output
{
	/*
/#
	println( "^1ZM POWER: bus off\n" );
#/
	*/
	level.the_bus thread maps/mp/zm_transit_bus::bus_power_off();
}

safety_light_range( delta, origin, radius ) //checked matches cerberus output
{
	if ( distancesquared( self.target.origin, origin ) < ( radius * radius ) )
	{
		return 1;
	}
	return 0;
}

safety_light_power_on( origin, radius ) //checked changed to match cerberus output
{
	/*
/#
	println( "^1ZM POWER: bus on\n" );
#/
	*/
	self.target.power_on = 1;
	self.target notify( "power_on" );
	if ( isDefined( self.target.clientfieldname ) )
	{
		level setclientfield( self.target.clientfieldname, 1 );
	}
	level notify( "safety_light_power_on", self );
}

safety_light_power_off( origin, radius ) //checked changed to match cerberus output
{
	/*
/#
	println( "^1ZM POWER: bus off\n" );
#/
	*/
	self.target.power_on = 0;
	self.target notify( "power_off" );
	if ( isDefined( self.target.clientfieldname ) )
	{
		level setclientfield( self.target.clientfieldname, 0 );
	}
	level notify( "safety_light_power_off", self );
}

zombie_transit_devgui( cmd ) //dev call didn't check
{
	/*
/#
	cmd_strings = strtok( cmd, " " );
	switch( cmd_strings[ 0 ] )
	{
		case "pickup":
			if ( !level.the_bus.upgrades[ cmd_strings[ 1 ] ].pickedup )
			{
				level.the_bus.upgrades[ cmd_strings[ 1 ] ].trigger notify( "trigger" );
			}
			break;
		case "spawn":
			player = get_players()[ 0 ];
			spawnername = undefined;
			if ( cmd_strings[ 1 ] == "regular" )
			{
				spawnername = "zombie_spawner";
			}
			else if ( cmd_strings[ 1 ] == "screecher" )
			{
			}
			else
			{
				return;
			}
			direction = player getplayerangles();
			direction_vec = anglesToForward( direction );
			eye = player geteye();
			scale = 8000;
			direction_vec = ( direction_vec[ 0 ] * scale, direction_vec[ 1 ] * scale, direction_vec[ 2 ] * scale );
			trace = bullettrace( eye, eye + direction_vec, 0, undefined );
			guy = undefined;
			if ( cmd_strings[ 1 ] == "screecher" )
			{
				spawner = level.screecher_spawners[ 0 ];
				guy = maps/mp/zombies/_zm_utility::spawn_zombie( spawner );
			}
			else
			{
				if ( cmd_strings[ 1 ] == "regular" )
				{
					spawners = getentarray( spawnername, "script_noteworthy" );
					spawner = spawners[ 0 ];
					guy = maps/mp/zombies/_zm_utility::spawn_zombie( spawner );
					guy.favoriteenemy = player;
					guy.script_string = "zombie_chaser";
					guy thread maps/mp/zombies/_zm_spawner::zombie_spawn_init();
					guy custom_zombie_setup();
				}
			}
			guy forceteleport( trace[ "position" ], player.angles + vectorScale( ( 0, -1, 0 ), 180 ) );
			break;
		case "test_attach":
			attach_name = getDvar( "zombie_bus_debug_attach" );
			opening = level.the_bus maps/mp/zm_transit_openings::busgetopeningfortag( attach_name );
			jump = level.the_bus maps/mp/zm_transit_openings::_busgetjumptagfrombindtag( attach_name );
			if ( isDefined( opening ) )
			{
				if ( isDefined( opening.zombie ) )
				{
					iprintln( "Zombie already attached to opening: " + attach_name );
				}
				else
				{
					origin = level.the_bus gettagorigin( attach_name );
					if ( isDefined( jump ) )
					{
						jump_origin = level.the_bus gettagorigin( jump );
						if ( isDefined( opening.enabled ) && opening.enabled )
						{
							debugstar( jump_origin, 1000, ( 0, -1, 0 ) );
						}
						else
						{
							debugstar( jump_origin, 1000, ( 0, -1, 0 ) );
						}
					}
					zombie_spawners = getentarray( "zombie_spawner", "script_noteworthy" );
					zombie = spawn_zombie( zombie_spawners[ 0 ] );
					zombie.cannotattachtobus = 1;
					zombie thread maps/mp/zm_transit_openings::zombieattachtobus( level.the_bus, opening, 0 );
				}
			}
			else
			{
				iprintln( "Couldn't find opening for tag: " + attach_name );
			}
			break;
		case "attach_tag":
			setdvar( "zombie_bus_debug_attach", cmd_strings[ 1 ] );
			break;
		case "hatch_available":
			if ( isDefined( level.the_bus ) )
			{
				level.the_bus notify( "hatch_mantle_allowed" );
			}
			break;
		case "ambush_round":
			if ( isDefined( level.ambushpercentageperstop ) )
			{
				if ( cmd_strings[ 1 ] == "always" )
				{
					level.ambushpercentageperstop = 100;
				}
				else
				{
					if ( cmd_strings[ 1 ] == "never" )
					{
						level.ambushpercentageperstop = 0;
					}
				}
			}
			break;
		case "gas":
			if ( cmd_strings[ 1 ] == "add" )
			{
				level.the_bus maps/mp/zm_transit_bus::busgasadd( getDvarInt( #"69C4D2C1" ) );
			}
			else
			{
				if ( cmd_strings[ 1 ] == "remove" )
				{
					level.the_bus maps/mp/zm_transit_bus::busgasremove( getDvarInt( #"69C4D2C1" ) );
				}
			}
			break;
		case "force_bus_to_leave":
			level.the_bus notify( "depart_early" );
			if ( isDefined( level.bus_leave_hud ) )
			{
				level.bus_leave_hud.alpha = 0;
			}
			break;
		case "teleport_to_bus":
			get_players()[ 0 ] setorigin( level.the_bus localtoworldcoords( vectorScale( ( 0, -1, 0 ), 25 ) ) );
			break;
		case "teleport_bus":
			node = getvehiclenode( cmd_strings[ 1 ], "script_noteworthy" );
			if ( isDefined( node ) )
			{
				level.the_bus thread buspathblockerdisable();
				wait 0,1;
				level.the_bus attachpath( node );
				level.the_bus maps/mp/zm_transit_bus::busstopmoving( 1 );
				wait 0,1;
				level.the_bus thread buspathblockerenable();
			}
			break;
		case "avogadro_round_skip":
			if ( isDefined( level.next_avogadro_round ) )
			{
				maps/mp/zombies/_zm_devgui::zombie_devgui_goto_round( level.next_avogadro_round );
			}
			break;
		case "debug_print_emp_points":
			while ( isDefined( level.debug_print_emp_points ) && !level.debug_print_emp_points )
			{
				level.debug_print_emp_points = 1;
				vehnodes = getvehiclenodearray( "emp_stop_point", "script_noteworthy" );
				_a3190 = vehnodes;
				_k3190 = getFirstArrayKey( _a3190 );
				while ( isDefined( _k3190 ) )
				{
					node = _a3190[ _k3190 ];
					maps/mp/zombies/_zm_devgui::showonespawnpoint( node, ( 0, -1, 0 ), "kill_debug_print_emp_points", undefined, "EMP STOP" );
					_k3190 = getNextArrayKey( _a3190, _k3190 );
				}
			}
			case "debug_stop_print_emp_points":
				if ( isDefined( level.debug_print_emp_points ) && level.debug_print_emp_points )
				{
					level notify( "kill_debug_print_emp_points" );
					level.debug_print_emp_points = undefined;
				}
				break;
			default:
			}
#/
		}
	}
	*/
}

is_valid_powerup_location( powerup ) //checked changed to match cerberus output
{
	valid = 0;
	if ( !isDefined( level.powerup_areas ) )
	{
		level.powerup_areas = getentarray( "powerup_area", "script_noteworthy" );
	}
	if ( !isDefined( level.playable_areas ) )
	{
		level.playable_areas = getentarray( "player_volume", "script_noteworthy" );
	}
	for ( i = 0; i < level.powerup_areas.size && !valid; i++ )
	{
		area = level.powerup_areas[ i ];
		valid = powerup istouching( area );
	}
	for ( i = 0; i < level.playable_areas.size && !valid; i++ )
	{
		area = level.playable_areas[ i ];
		valid = powerup istouching( area );
	}
	return valid;
}

zombie_transit_player_too_many_weapons_monitor_callback( weapon ) //checked matches cerberus output
{
	if ( self maps/mp/zm_transit_cling::playerisclingingtobus() )
	{
		return 0;
	}
	return 1;
}

zombie_transit_audio_alias_override() //checked matches cerberus output
{
	maps/mp/zm_transit_automaton::initaudioaliases();
	init_transit_player_dialogue();
	add_transit_response_chance();
}

falling_death_init() //checked changed to match beta dump
{
	trig = getent( "transit_falling_death", "targetname" );
	if ( isDefined( trig ) )
	{
		while ( 1 )
		{
			trig waittill( "trigger", who );
			if ( !is_true( who.insta_killed ) )
			{
				who thread insta_kill_player();
			}
		}
	}
}

insta_kill_player() //checked changed to match beta dump
{
	self endon( "disconnect" );
	if ( is_true( self.insta_killed ) )
	{
		return;
	}
	self maps/mp/zombies/_zm_buildables::player_return_piece_to_original_spawn();
	if ( is_player_killable( self ) )
	{
		self.insta_killed = 1;
		in_last_stand = 0;
		if ( self maps/mp/zombies/_zm_laststand::player_is_in_laststand() )
		{
			in_last_stand = 1;
		}
		if ( getnumconnectedplayers() == 1 )
		{
			if ( isDefined( self.lives ) && self.lives > 0 )
			{
				self.waiting_to_revive = 1;
				points = getstruct( "zone_pcr", "script_noteworthy" );
				spawn_points = getstructarray( points.target, "targetname" );
				point = spawn_points[ 0 ];
				self dodamage( self.health + 1000, ( 0, 0, 0 ) );
				maps/mp/_visionset_mgr::vsmgr_activate( "overlay", "zm_transit_burn", self, 1, level.zm_transit_burn_max_duration );
				wait 0.5;
				self freezecontrols( 1 );
				wait 0.25;
				self setorigin( point.origin + vectorScale( ( 0, 0, 1 ), 20 ) );
				self.angles = point.angles;
				if ( in_last_stand )
				{
					flag_set( "instant_revive" );
					wait_network_frame();
					flag_clear( "instant_revive" );
				}
				else
				{
					self thread maps/mp/zombies/_zm_laststand::auto_revive( self );
					self.waiting_to_revive = 0;
					self.solo_respawn = 0;
					self.lives = 0;
				}
				self freezecontrols( 0 );
				self.insta_killed = 0;
			}
			else
			{
				self dodamage( self.health + 1000, ( 0, 0, 0 ) );
				maps/mp/_visionset_mgr::vsmgr_activate( "overlay", "zm_transit_burn", self, 2, level.zm_transit_burn_max_duration );
			}
		}
		else
		{
			self dodamage( self.health + 1000, ( 0, 0, 0 ) );
			maps/mp/_visionset_mgr::vsmgr_activate( "overlay", "zm_transit_burn", self, 1, level.zm_transit_burn_max_duration );
			wait_network_frame();
			self.bleedout_time = 0;
		}
		self notify( "burned" );
		self.insta_killed = 0;
	}
}

is_player_killable( player, checkignoremeflag ) //checked matches cerberus output
{
	if ( !isDefined( player ) )
	{
		return 0;
	}
	if ( !isalive( player ) )
	{
		return 0;
	}
	if ( !isplayer( player ) )
	{
		return 0;
	}
	if ( player.sessionstate == "spectator" )
	{
		return 0;
	}
	if ( player.sessionstate == "intermission" )
	{
		return 0;
	}
	if ( isDefined( checkignoremeflag ) && player.ignoreme )
	{
		return 0;
	}
	return 1;
}

delete_bus_pieces() //checked changed to match beta dump
{
	wait 3;
	if ( is_true( level._bus_pieces_deleted ) )
	{
		return;
	}
	level._bus_pieces_deleted = 1;
	hatch_mantle = getent( "hatch_mantle", "targetname" );
	if ( isDefined( hatch_mantle ) )
	{
		hatch_mantle delete();
	}
	hatch_clip = getentarray( "hatch_clip", "targetname" );
	array_thread( hatch_clip, ::self_delete );
	plow_clip = getentarray( "plow_clip", "targetname" );
	array_thread( plow_clip, ::self_delete );
	light = getent( "busLight2", "targetname" );
	if ( isDefined( light ) )
	{
		light delete();
	}
	light = getent( "busLight1", "targetname" );
	if ( isDefined( light ) )
	{
		light delete();
	}
	blocker = getent( "bus_path_blocker", "targetname" );
	if ( isDefined( blocker ) )
	{
		blocker delete();
	}
	lights = getentarray( "bus_break_lights", "targetname" );
	array_thread( lights, ::self_delete );
	orgs = getentarray( "bus_bounds_origin", "targetname" );
	array_thread( orgs, ::self_delete );
	door_blocker = getentarray( "bus_door_blocker", "targetname" );
	array_thread( door_blocker, ::self_delete );
	driver = getent( "bus_driver_head", "targetname" );
	if ( isDefined( driver ) )
	{
		driver delete();
	}
	plow = getent( "trigger_plow", "targetname" );
	if ( isDefined( plow ) )
	{
		plow delete();
	}
	plow_attach_point = getent( "plow_attach_point", "targetname" );
	if ( isDefined( plow_attach_point ) )
	{
		plow_attach_point delete();
	}
	bus = getent( "the_bus", "targetname" );
	if ( isDefined( bus ) )
	{
		bus delete();
	}
	barriers = getzbarrierarray();
	foreach ( barrier in barriers )
	{
		if ( isDefined( barrier.classname ) && issubstr( barrier.classname, "zb_bus" ) )
		{
			for ( x = 0; x < barrier getnumzbarrierpieces(); x++ )
			{
				barrier setzbarrierpiecestate( x, "opening" );
			}
			barrier hide();
		}
	}
}

init_transit_stats() //checked matches cerberus output
{
	self maps/mp/zm_transit_sq::init_player_sidequest_stats();
	self maps/mp/zm_transit_achievement::init_player_achievement_stats();
}

kill_zombies_depot() //checked partially changed to match cerberus output see info.md No. 5
{
	if ( level.zones[ "zone_pri" ].is_occupied == 1 || flag( "OnPriDoorYar2" ) )
	{
		return;
	}
	if ( self maps/mp/zombies/_zm_zonemgr::entity_in_zone( "zone_pri" ) )
	{
		self.marked_for_recycle = 1;
		self dodamage( self.health + 666, self.origin, self );
		return;
	}
	if ( self should_be_killed_depot() )
	{
		self.marked_for_recycle = 1;
		self dodamage( self.health + 666, self.origin, self );
		return;
	}
}

//custom addition
//////////////////////////////////////////
should_be_killed_depot() //added to get around info. No. 5 for kill_zombies_depot() above
{
	if ( ( self.ignoreall || !self in_playable_zone() ) && isDefined( self.zone_name ) && self.zone_name == "zone_pri" )
	{
		return 1;
	}
	if ( ( self.ignoreall || !self in_playable_zone() ) && isDefined( self.zone_name ) && self.zone_name == "zone_pri2" )
	{
		return 1;
	}
	return 0;
}
////////////////////////////////////////

in_playable_zone() //checked changed to match cerberus output
{
	if ( !isDefined( level.playable_areas ) )
	{
		level.playable_areas = getentarray( "player_volume", "script_noteworthy" );
	}
	foreach ( zone in level.playable_areas )
	{
		if ( self istouching( zone ) )
		{
			return 1;
		}
	}
	return 0;
}

lava_damage_depot() //checked changed to match cerberus output
{
	trigs = getentarray( "lava_damage", "targetname" );
	volume = getent( "depot_lava_volume", "targetname" );
	exploder( 2 );
	foreach ( trigger in trigs )
	{
		if ( isDefined( trigger.script_string ) && trigger.script_string == "depot_lava" )
		{
			trig = trigger;
		}
	}
	if ( isDefined( trig ) )
	{
		trig.script_float = 0.05;
	}
	while ( level.round_number < 3 )
	{
		level waittill( "start_of_round" );
	}
	while ( !volume depot_lava_seen() )
	{
		wait 2;
	}
	if ( isDefined( trig ) )
	{
		trig.script_float = 0.4;
		earthquake( 0.5, 1.5, trig.origin, 1000 );
		level clientnotify( "earth_crack" );
		crust = getent( "depot_black_lava", "targetname" );
		crust delete();
	}
	stop_exploder( 2 );
	exploder( 3 );
}

depot_lava_seen() //checked changed to match cerberus output
{
	check_volume = getent( "depot_lava_check", "targetname" );
	players = get_players();
	foreach ( player in players )
	{
		if ( player istouching( check_volume ) )
		{
			seen = self maps/mp/zm_transit_distance_tracking::player_can_see_me( player );
			if ( seen )
			{
				return 1;
			}
		}
	}
	return 0;
}

assign_lowest_unused_character_index() //checked changed to match beta dump
{
	charindexarray = [];
	charindexarray[ 0 ] = 0;
	charindexarray[ 1 ] = 1;
	charindexarray[ 2 ] = 2;
	charindexarray[ 3 ] = 3;
	players = get_players();
	if ( players.size == 1 )
	{
		charindexarray = array_randomize( charindexarray );
		return charindexarray[ 0 ];
	}
	else if ( players.size == 2 )
	{
		foreach ( player in players )
		{
			if ( isDefined( player.characterindex ) )
			{
				if ( player.characterindex == 2 || player.characterindex == 0 )
				{
					if ( randomint( 100 ) > 50 )
					{
						return 1;
					}
					return 3;
				}
				else if ( player.characterindex == 3 || player.characterindex == 1 )
				{
					if ( randomint( 100 ) > 50 )
					{
						return 0;
					}
					return 2;
				}
			}
		}
	}
	else 
	{
		foreach ( player in players )
		{
			if ( isDefined( player.characterindex ) )
			{
				arrayremovevalue( charindexarray, player.characterindex, 0 );
			}
		}
		if ( charindexarray.size > 0 )
		{
			return charindexarray[ 0 ];
		}
	}
	return 0;
}

dog_spawn_transit_logic( dog_array, favorite_enemy ) //checked partially changed to match cerberus output see info.md No. 2
{
	dog_locs = array_randomize( level.enemy_dog_locations );
	for ( i = 0; i < dog_locs.size; i++ )
	{
		if ( isDefined( level.old_dog_spawn ) && level.old_dog_spawn == dog_locs[ i ] )
		{
		}
		else
		{
			canuse = 1;
			players = get_players();
			foreach ( player in players )
			{
				if ( !canuse )
				{
				}
				else
				{
					dist_squared = distancesquared( dog_locs[ i ].origin, player.origin );
					if ( dist_squared < 160000 || dist_squared > 1322500 )
					{
						canuse = 0;
					}
				}
			}
			if ( canuse )
			{
				level.old_dog_spawn = dog_locs[ i ];
				return dog_locs[ i ];
			}
		}
	}
	return dog_locs[ 0 ];
}

bank_teller_init() //checked matches cerberus output
{
	playfx( level._effect[ "fx_zmb_tranzit_key_glint" ], ( 760, 461, -30 ), vectorScale( ( 0, -1, 0 ), 90 ) );
	playfx( level._effect[ "fx_zmb_tranzit_key_glint" ], ( 760, 452, -30 ), vectorScale( ( 0, -1, 0 ), 90 ) );
}

player_name_fade_control() //checked partially changed to match cerberus output see info.md No. 2 used is_true instead
{
	while ( 1 )
	{
		players = get_players();
		foreach ( player in players )
		{
			if ( !isDefined( player.infog ) )
			{
				player.infog = 0;
				player.old_infog = 0;
				player.infogtimer = 0;
			}
			player.old_infog = player.infog;
			infog = is_player_in_fog( player );
			if ( infog )
			{
				player.infogtimer++;
			}
			player.infog = infog;
			if ( player.infog != player.old_infog && !is_true( player.isonbus ) )
			{
				if ( infog )
				{
					if ( player.infogtimer < 5 )
					{
					}
					else 
					{
						line = "in_fog";
					}
				}
				else
				{
					if ( player.infogtimer < 15 )
					{
					}
					else
					{
						line = "out_of_fog";
						player.infogtimer = 0;
					}
					if ( maps/mp/zombies/_zm_audio::get_response_chance( line ) > randomint( 100 ) && !isDefined( player.screecher ) )
					{
						player thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", line );
					}
				}
				if ( isDefined( level.set_player_in_fog ) )
				{
					player thread [[ level.set_player_in_fog ]]( infog );
				}
			}
		}
		wait 1;
	}
}

is_player_in_fog( player ) //checked matches cerberus output used is_true instead
{
	if ( player_entered_safety_zone( player ) )
	{
		return 0;
	}
	if ( player_entered_safety_light( player ) )
	{
		return 0;
	}
	curr_zone = player get_current_zone( 1 );
	if ( isDefined( curr_zone ) && !is_true( curr_zone.screecher_zone ) )
	{
		return 0;
	}
	return 1;
}

add_transit_response_chance() //checked matches cerberus output
{
	add_vox_response_chance( "in_fog", 100 );
	add_vox_response_chance( "out_of_fog", 65 );
	add_vox_response_chance( "killed_screecher", 20 );
	add_vox_response_chance( "screecher_attack", 5 );
	add_vox_response_chance( "screecher_flee", 50 );
	add_vox_response_chance( "screecher_cut", 15 );
	add_vox_response_chance( "screecher_flee_green", 75 );
	add_vox_response_chance( "crawl_spawn", 10 );
	add_vox_response_chance( "screecher_jumpoff", 50 );
	add_vox_response_chance( "reboard", 5 );
	add_vox_response_chance( "jetgun_kill", 10 );
	add_vox_response_chance( "achievement", 100 );
	add_vox_response_chance( "power_on", 100 );
	add_vox_response_chance( "power_off", 100 );
	add_vox_response_chance( "power_core", 100 );
	add_vox_response_chance( "upgrade", 100 );
	add_vox_response_chance( "build_pck_bshield", 45 );
	add_vox_response_chance( "build_pck_bturret", 45 );
	add_vox_response_chance( "build_pck_btrap", 45 );
	add_vox_response_chance( "build_pck_bturbine", 45 );
	add_vox_response_chance( "build_pck_bjetgun", 45 );
	add_vox_response_chance( "build_pck_wshield", 45 );
	add_vox_response_chance( "build_pck_wturret", 45 );
	add_vox_response_chance( "build_pck_wtrap", 45 );
	add_vox_response_chance( "build_pck_wturbine", 45 );
	add_vox_response_chance( "build_pck_wjetgun", 45 );
	add_vox_response_chance( "build_plc_shield", 45 );
	add_vox_response_chance( "build_plc_turret", 45 );
	add_vox_response_chance( "build_plc_trap", 45 );
	add_vox_response_chance( "build_plc_turbine", 45 );
	add_vox_response_chance( "build_pickup", 45 );
	add_vox_response_chance( "build_swap", 45 );
	add_vox_response_chance( "build_add", 45 );
	add_vox_response_chance( "build_final", 45 );
}

init_transit_player_dialogue() //checked matches cerberus output
{
	level.vox zmbvoxadd( "player", "general", "in_fog", "map_in_fog", undefined );
	level.vox zmbvoxadd( "player", "general", "out_of_fog", "map_out_fog", undefined );
	level.vox zmbvoxadd( "player", "perk", "specialty_scavenger", "perk_tombstone", undefined );
	level.vox zmbvoxadd( "player", "general", "revive_down", "bus_down", undefined );
	level.vox zmbvoxadd( "player", "general", "revive_up", "heal_revived", undefined );
	level.vox zmbvoxadd( "player", "general", "screecher_attack", "screecher_attack", "resp_screecher_attack" );
	level.vox zmbvoxadd( "player", "general", "hr_resp_screecher_attack", "hr_resp_screecher_attack", undefined );
	level.vox zmbvoxadd( "player", "general", "riv_resp_screecher_attack", "riv_resp_screecher_attack", undefined );
	level.vox zmbvoxadd( "player", "general", "screecher_flee", "screecher_flee", undefined );
	level.vox zmbvoxadd( "player", "general", "screecher_jumpoff", "screecher_off", undefined );
	level.vox zmbvoxadd( "player", "general", "screecher_flee_green", "screecher_teleport", undefined );
	level.vox zmbvoxadd( "player", "kill", "screecher", "kill_screecher", undefined );
	level.vox zmbvoxadd( "player", "general", "screecher_cut", "screecher_cut", undefined );
	level.vox zmbvoxadd( "player", "general", "achievement", "earn_acheivement", undefined );
	level.vox zmbvoxadd( "player", "general", "no_money_weapon", "nomoney_weapon", undefined );
	level.vox zmbvoxadd( "player", "general", "no_money_box", "nomoney_box", undefined );
	level.vox zmbvoxadd( "player", "general", "exert_sigh", "exert_sigh", undefined );
	level.vox zmbvoxadd( "player", "general", "exert_laugh", "exert_laugh", undefined );
	level.vox zmbvoxadd( "player", "general", "pain_high", "pain_high", undefined );
	level.vox zmbvoxadd( "player", "general", "build_pck_bshield", "build_pck_bshield", undefined );
	level.vox zmbvoxadd( "player", "general", "build_pck_bturret", "build_pck_bturret", undefined );
	level.vox zmbvoxadd( "player", "general", "build_pck_btrap", "build_pck_btrap", undefined );
	level.vox zmbvoxadd( "player", "general", "build_pck_bturbine", "build_pck_bturbine", undefined );
	level.vox zmbvoxadd( "player", "general", "build_pck_bjetgun", "build_pck_bjetgun", undefined );
	level.vox zmbvoxadd( "player", "general", "build_pck_wshield", "build_pck_wshield", undefined );
	level.vox zmbvoxadd( "player", "general", "build_pck_wturret", "build_pck_wturret", undefined );
	level.vox zmbvoxadd( "player", "general", "build_pck_wtrap", "build_pck_wtrap", undefined );
	level.vox zmbvoxadd( "player", "general", "build_pck_wturbine", "build_pck_wturbine", undefined );
	level.vox zmbvoxadd( "player", "general", "build_pck_wjetgun", "build_pck_wjetgun", undefined );
	level.vox zmbvoxadd( "player", "general", "build_plc_shield", "build_plc_shield", undefined );
	level.vox zmbvoxadd( "player", "general", "build_plc_turret", "build_plc_turret", undefined );
	level.vox zmbvoxadd( "player", "general", "build_plc_trap", "build_plc_trap", undefined );
	level.vox zmbvoxadd( "player", "general", "build_plc_turbine", "build_plc_turbine", undefined );
	level.vox zmbvoxadd( "player", "general", "build_pickup", "build_pickup", undefined );
	level.vox zmbvoxadd( "player", "general", "build_swap", "build_swap", undefined );
	level.vox zmbvoxadd( "player", "general", "build_add", "build_add", undefined );
	level.vox zmbvoxadd( "player", "general", "build_final", "build_final", undefined );
	level.vox zmbvoxadd( "player", "general", "intro", "power_off", undefined );
	level.vox zmbvoxadd( "player", "power", "power_on", "power_on", undefined );
	level.vox zmbvoxadd( "player", "power", "power_core", "power_core", undefined );
	level.vox zmbvoxadd( "player", "general", "reboard", "rebuild_boards", undefined );
	level.vox zmbvoxadd( "player", "general", "upgrade", "find_secret", undefined );
	level.vox zmbvoxadd( "player", "general", "map_out_bus", "map_out_bus", undefined );
	level.vox zmbvoxadd( "player", "general", "map_out_tunnel", "map_out_tunnel", undefined );
	level.vox zmbvoxadd( "player", "general", "map_out_diner", "map_out_diner", undefined );
	level.vox zmbvoxadd( "player", "general", "map_out_1forest", "map_out_1forest", undefined );
	level.vox zmbvoxadd( "player", "general", "map_out_farm", "map_out_farm", undefined );
	level.vox zmbvoxadd( "player", "general", "map_out_corn", "map_out_corn", undefined );
	level.vox zmbvoxadd( "player", "general", "map_out_power", "map_out_power", undefined );
	level.vox zmbvoxadd( "player", "general", "map_out_2forest", "map_out_2forest", undefined );
	level.vox zmbvoxadd( "player", "general", "map_out_town", "map_out_town", undefined );
	level.vox zmbvoxadd( "player", "general", "map_out_bridge", "map_out_bridge", undefined );
	level.vox zmbvoxadd( "player", "general", "map_in_bus1", "map_in_bus1", undefined );
	level.vox zmbvoxadd( "player", "general", "map_in_tunnel1", "map_in_tunnel1", undefined );
	level.vox zmbvoxadd( "player", "general", "map_in_diner1", "map_in_diner1", undefined );
	level.vox zmbvoxadd( "player", "general", "map_in_1forest1", "map_in_1forest1", undefined );
	level.vox zmbvoxadd( "player", "general", "map_in_farm1", "map_in_farm1", undefined );
	level.vox zmbvoxadd( "player", "general", "map_in_corn1", "map_in_corn1", undefined );
	level.vox zmbvoxadd( "player", "general", "map_in_power1", "map_in_power1", undefined );
	level.vox zmbvoxadd( "player", "general", "map_in_2forest1", "map_in_2forest1", undefined );
	level.vox zmbvoxadd( "player", "general", "map_in_town1", "map_in_town1", undefined );
	level.vox zmbvoxadd( "player", "general", "map_in_bridge1", "map_in_bridge1", undefined );
	level.vox zmbvoxadd( "player", "general", "map_in_bus2", "map_in_bus2", undefined );
	level.vox zmbvoxadd( "player", "general", "map_in_tunnel2", "map_in_tunnel2", undefined );
	level.vox zmbvoxadd( "player", "general", "map_in_diner2", "map_in_diner2", undefined );
	level.vox zmbvoxadd( "player", "general", "map_in_1forest2", "map_in_1forest2", undefined );
	level.vox zmbvoxadd( "player", "general", "map_in_farm2", "map_in_farm2", undefined );
	level.vox zmbvoxadd( "player", "general", "map_in_corn2", "map_in_corn2", undefined );
	level.vox zmbvoxadd( "player", "general", "map_in_power2", "map_in_power2", undefined );
	level.vox zmbvoxadd( "player", "general", "map_in_2forest2", "map_in_2forest2", undefined );
	level.vox zmbvoxadd( "player", "general", "map_in_town2", "map_in_town2", undefined );
	level.vox zmbvoxadd( "player", "general", "map_in_bridge2", "map_in_bridge2", undefined );
	level.vox zmbvoxadd( "player", "general", "map_in_bus3", "map_in_bus3", undefined );
	level.vox zmbvoxadd( "player", "general", "map_in_tunnel3", "map_in_tunnel3", undefined );
	level.vox zmbvoxadd( "player", "general", "map_in_diner3", "map_in_diner3", undefined );
	level.vox zmbvoxadd( "player", "general", "map_in_1forest3", "map_in_1forest3", undefined );
	level.vox zmbvoxadd( "player", "general", "map_in_farm3", "map_in_farm3", undefined );
	level.vox zmbvoxadd( "player", "general", "map_in_corn3", "map_in_corn3", undefined );
	level.vox zmbvoxadd( "player", "general", "map_in_power3", "map_in_power3", undefined );
	level.vox zmbvoxadd( "player", "general", "map_in_2forest3", "map_in_2forest3", undefined );
	level.vox zmbvoxadd( "player", "general", "map_in_town3", "map_in_town3", undefined );
	level.vox zmbvoxadd( "player", "general", "map_in_bridge3", "map_in_bridge3", undefined );
	level.vox zmbvoxadd( "player", "general", "map_in_bus4", "map_in_bus4", undefined );
	level.vox zmbvoxadd( "player", "general", "map_in_tunnel4", "map_in_tunnel4", undefined );
	level.vox zmbvoxadd( "player", "general", "map_in_diner4", "map_in_diner4", undefined );
	level.vox zmbvoxadd( "player", "general", "map_in_1forest4", "map_in_1forest4", undefined );
	level.vox zmbvoxadd( "player", "general", "map_in_farm4", "map_in_farm4", undefined );
	level.vox zmbvoxadd( "player", "general", "map_in_corn4", "map_in_corn4", undefined );
	level.vox zmbvoxadd( "player", "general", "map_in_power4", "map_in_power4", undefined );
	level.vox zmbvoxadd( "player", "general", "map_in_2forest4", "map_in_2forest4", undefined );
	level.vox zmbvoxadd( "player", "general", "map_in_town4", "map_in_town4", undefined );
	level.vox zmbvoxadd( "player", "general", "map_in_bridge4", "map_in_bridge4", undefined );
	level.vox zmbvoxadd( "player", "general", "bus_zom_roof", "bus_zom_roof", undefined );
	level.vox zmbvoxadd( "player", "general", "bus_zom_climb", "bus_zom_climb", undefined );
	level.vox zmbvoxadd( "player", "general", "bus_zom_atk", "bus_zom_atk", undefined );
	level.vox zmbvoxadd( "player", "general", "bus_zom_ent", "bus_zom_ent", undefined );
	level.vox zmbvoxadd( "player", "general", "bus_zom_none", "bus_zom_none", undefined );
	level.vox zmbvoxadd( "player", "general", "bus_zom_chase", "bus_zom_chase", undefined );
	level.vox zmbvoxadd( "player", "general", "bus_stop", "bus_stop", undefined );
	level.vox zmbvoxadd( "player", "general", "bus_ride", "bus_ride", undefined );
	level.vox zmbvoxadd( "player", "general", "avogadro_reveal", "avogadro_reveal", undefined );
	level.vox zmbvoxadd( "player", "general", "avogadro_above", "avogadro_above", undefined );
	level.vox zmbvoxadd( "player", "general", "avogadro_storm", "avogadro_storm", undefined );
	level.vox zmbvoxadd( "player", "general", "avogadro_arrive", "avogadro_arrive", undefined );
	level.vox zmbvoxadd( "player", "general", "avogadro_attack", "avogadro_attack", "resp_avogadro_attack" );
	level.vox zmbvoxadd( "player", "general", "hr_resp_avogadro_attack", "hr_resp_avogadro_attack", undefined );
	level.vox zmbvoxadd( "player", "general", "riv_resp_avogadro_attack", "riv_resp_avogadro_attack", undefined );
	level.vox zmbvoxadd( "player", "general", "avogadro_wound", "avogadro_wound", undefined );
	level.vox zmbvoxadd( "player", "general", "avogadro_flee", "avogadro_flee", undefined );
	level.vox zmbvoxadd( "player", "general", "avogadro_onbus", "avogadro_onbus", undefined );
	level.vox zmbvoxadd( "player", "general", "avogadro_atkbus", "avogadro_atkbus", undefined );
	level.vox zmbvoxadd( "player", "general", "avogadro_stopbus", "avogadro_stopbus", undefined );
	level.vox zmbvoxadd( "player", "general", "exert_death", "exert_death_high", undefined );
	level.vox zmbvoxadd( "player", "kill", "jetgun_kill", "kill_jet", undefined );
	level.vox zmbvoxadd( "player", "general", "pap_wait", "pap_wait", undefined );
	level.vox zmbvoxadd( "player", "general", "pap_wait2", "pap_wait2", undefined );
	level.vox zmbvoxadd( "player", "general", "pap_arm", "pap_arm", undefined );
	level.vox zmbvoxadd( "player", "general", "pap_arm2", "pap_arm2", undefined );
	level.vox zmbvoxadd( "player", "general", "pap_hint", "pap_hint", undefined );
	maps/mp/zombies/_zm_audio_announcer::createvox( "first_drop", "first_drop" );
	level.station_pa_vox = [];
	for ( i = 0; i < 10; i++ )
	{
		level.station_pa_vox[ i ] = "vox_stat_pa_generic_" + i;
	}
	level.survivor_vox = [];
	for ( i = 0; i < 5; i++ )
	{
		level.survivor_vox[ i ] = "vox_radi_distress_message_" + i;
	}
}

transit_audio_custom_response_line( player, index, category, type ) //checked matches cerberus output
{
	russman = 0;
	samuel = 1;
	misty = 2;
	marlton = 3;
	switch( player.characterindex )
	{
		case 0:
			level maps/mp/zombies/_zm_audio::setup_hero_rival( player, samuel, marlton, category, type );
			break;
		case 1:
			level maps/mp/zombies/_zm_audio::setup_hero_rival( player, russman, misty, category, type );
			break;
		case 2:
			level maps/mp/zombies/_zm_audio::setup_hero_rival( player, marlton, samuel, category, type );
			break;
		case 3:
			level maps/mp/zombies/_zm_audio::setup_hero_rival( player, misty, russman, category, type );
			break;
	}
	return;
}

powerup_intro_vox( powerup ) //checked partially changed to match cerberus output see info.md No. 2
{
	say_intro = 0;
	players = get_players();
	foreach ( player in players )
	{
		if ( player maps/mp/zombies/_zm_stats::get_global_stat( "POWERUP_INTRO_PLAYED" ) == 1 )
		{
		}
		else 
		{
			player maps/mp/zombies/_zm_stats::set_global_stat( "powerup_intro_played", 1 );
			say_intro = 1;
		}
	}
	level.powerup_intro_vox = undefined;
	powerup_name = powerup.powerup_name;
	powerup thread maps/mp/zombies/_zm_powerups::powerup_delete();
	powerup notify( "powerup_grabbed" );
	if ( !say_intro )
	{
		level thread maps/mp/zombies/_zm_audio_announcer::leaderdialog( powerup_name );
		level.powerup_vo_available = undefined;
		return;
	}
	flag_clear( "zombie_drop_powerups" );
	level.powerup_intro = 1;
	org = spawn( "script_origin", get_players()[ 0 ].origin );
	org playsoundwithnotify( "vox_zmba_first_drop_0", "first_powerup_intro_done" );
	org waittill( "first_powerup_intro_done" );
	level thread maps/mp/zombies/_zm_audio_announcer::leaderdialog( powerup_name );
	org delete();
	flag_set( "zombie_drop_powerups" );
	level.powerup_intro = 0;
	level.powerup_vo_available = undefined;
}

powerup_vo_available() //checked matches cerberus output used is_true instead
{
	wait 0.1;
	if ( is_true( level.powerup_intro ) )
	{
		return 0;
	}
	return 1;
}

buildable_build_custom_func( stub ) //checked changed to match cerberus output
{
	buildable = stub.buildablezone;
	counter = 0;
	for ( i = 0; i < buildable.pieces.size; i++ )
	{
		if ( isDefined( buildable.pieces[ i ].built ) && buildable.pieces[ i ].built )
		{
			counter++;
		}
	}
	if ( counter == ( buildable.pieces.size - 1 ) )
	{
		self thread do_player_general_vox( "general", "build_final", 45 );
	}
}

bank_pap_hint() //checked changed to match cerberus output
{
	volume = getent( "zone_ban", "targetname" );
	while ( 1 )
	{
		players = get_players();
		foreach ( player in players )
		{
			if ( player istouching( volume ) && is_player_valid( player ) )
			{
				player thread do_player_general_vox( "general", "pap_hint", undefined, 100 );
				return;
			}
		}
		wait 10;
	}
}

power_pap_hint() //checked changed to match cerberus output
{
	trigs = getentarray( "local_electric_door", "script_noteworthy" );
	lab_trig = undefined;
	foreach ( trig in trigs )
	{
		if ( isDefined( trig.target ) && trig.target == "lab_secret_hatch" )
		{
			lab_trig = trig;
		}
	}
	if ( !isDefined( lab_trig ) )
	{
		return;
	}
	while ( 1 )
	{
		lab_trig waittill( "trigger", who );
		if ( isplayer( who ) && is_player_valid( who ) )
		{
			who thread do_player_general_vox( "general", "pap_hint", undefined, 100 );
			return;
		}
	}
}

transit_buildable_vo_override( name, from_world ) //checked matches cerberus output used is_true instead
{
	if ( is_true( level.power_cycled ) && name == "turbine" && !is_true( from_world ) && !flag( "power_on" ) )
	{
		level.maxis_turbine_pickedup_vox = 1;
		level thread maps/mp/zm_transit_sq::maxissay( "vox_maxi_build_complete_0", ( -6848, 5056, 56 ) );
		return 1;
	}
	return 0;
}

sndsetupmusiceasteregg() //checked changed to match cerberus output
{
	origins = [];
	origins[ 0 ] = ( -7562, 4570, -19 );
	origins[ 1 ] = ( 7914, -6557, 269 );
	origins[ 2 ] = ( 1864, -7, -19 );
	level.meteor_counter = 0;
	level.music_override = 0;
	for ( i = 0; i < origins.size; i++ )
	{
		level thread sndmusicegg( origins[ i ] );
	}
}

sndmusicegg( bear_origin ) //checked matches cerberus output
{
	temp_ent = spawn( "script_origin", bear_origin );
	temp_ent playloopsound( "zmb_meteor_loop" );
	temp_ent thread maps/mp/zombies/_zm_sidequests::fake_use( "main_music_egg_hit", ::waitfor_override );
	temp_ent waittill( "main_music_egg_hit", player );
	temp_ent stoploopsound( 1 );
	player playsound( "zmb_meteor_activate" );
	level.meteor_counter += 1;
	if ( level.meteor_counter == 3 )
	{
		level thread sndplaymusicegg( player, temp_ent );
	}
	else
	{
		wait 1.5;
		temp_ent delete();
	}
}

waitfor_override() //checked matches cerberus output used is_true instead
{
	if ( is_true( level.music_override ) )
	{
		return 0;
	}
	return 1;
}

sndplaymusicegg( player, ent ) //checked matches cerberus output
{
	wait 1;
	ent playsound( "mus_zmb_secret_song" );
	level waittill( "end_game" );
	ent stopsounds();
	wait 0.05;
	ent delete();
}

sndtoiletflush() //checked matches cerberus output
{
	toilettrig = spawn( "trigger_radius", ( 11182, 7584, -596 ), 0, 150, 5 );
	toilettrig sethintstring( "" );
	toilettrig setcursorhint( "HINT_NOICON" );
	while ( 1 )
	{
		toilettrig waittill( "trigger", who );
		if ( who is_player() )
		{
			toilettrig playsound( "zmb_toilet_flush" );
			wait 5;
		}
		wait 0.1;
	}
}

transit_special_weapon_magicbox_check( weapon ) //checked matches cerberus output used is_true instead
{
	if ( is_true( level.raygun2_included ) )
	{
		if ( weapon == "ray_gun_zm" )
		{
			if ( self has_weapon_or_upgrade( "raygun_mark2_zm" ) || maps/mp/zombies/_zm_tombstone::is_weapon_available_in_tombstone( "raygun_mark2_zm", self ) )
			{
				return 0;
			}
		}
		if ( weapon == "raygun_mark2_zm" )
		{
			if ( self has_weapon_or_upgrade( "ray_gun_zm" ) || maps/mp/zombies/_zm_tombstone::is_weapon_available_in_tombstone( "ray_gun_zm", self ) )
			{
				return 0;
			}
			if ( randomint( 100 ) >= 33 )
			{
				return 0;
			}
		}
	}
	return 1;
}
