// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_weapons;
#include maps\mp\zm_buried_gamemodes;
#include maps\mp\zombies\_zm_banking;
#include maps\mp\zm_buried_sq;
#include maps\mp\zombies\_zm_weapon_locker;
#include maps\mp\zm_buried_distance_tracking;
#include maps\mp\zm_buried_fx;
#include maps\mp\zm_buried_ffotd;
#include maps\mp\zm_buried_buildables;
#include maps\mp\zombies\_zm;
#include maps\mp\animscripts\zm_death;
#include maps\mp\zm_buried_amb;
#include maps\mp\zombies\_zm_ai_ghost;
#include maps\mp\zombies\_zm_ai_sloth;
#include maps\mp\zombies\_load;
#include maps\mp\teams\_teamset_cdc;
#include maps\mp\gametypes_zm\_spawning;
#include maps\mp\zombies\_zm_perk_divetonuke;
#include maps\mp\zombies\_zm_perk_vulture;
#include maps\mp\zm_buried_jail;
#include maps\mp\zombies\_zm_weap_bowie;
#include maps\mp\zombies\_zm_weap_cymbal_monkey;
#include maps\mp\zombies\_zm_weap_claymore;
#include maps\mp\zombies\_zm_weap_ballistic_knife;
#include maps\mp\zombies\_zm_weap_slowgun;
#include maps\mp\zombies\_zm_weap_tazer_knuckles;
#include maps\mp\zombies\_zm_weap_time_bomb;
#include maps\mp\zm_buried_achievement;
#include maps\mp\zm_buried_maze;
#include maps\mp\zombies\_zm_zonemgr;
#include maps\mp\zm_buried_classic;
#include maps\mp\zombies\_zm_pers_upgrades_functions;
#include maps\mp\zombies\_zm_devgui;
#include maps\mp\zombies\_zm_buildables;
#include character\c_transit_player_farmgirl;
#include character\c_transit_player_oldman;
#include character\c_transit_player_engineer;
#include character\c_buried_player_reporter_dam;
#include maps\mp\zombies\_zm_audio;
#include maps\mp\zombies\_zm_powerups;
#include maps\mp\zombies\_zm_ai_faller;
#include maps\mp\zombies\_zm_laststand;
#include maps\mp\zombies\_zm_stats;
#include maps\mp\zombies\_zm_equip_headchopper;
#include maps\mp\zm_buried;

gamemode_callback_setup()
{
    maps\mp\zm_buried_gamemodes::init();
}

survival_init()
{
    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;
    zm_buried_common_init();
    flag_wait( "start_zombie_round_logic" );
}

zstandard_preinit()
{
    survival_init();
}

zcleansed_preinit()
{
    level._zcleansed_weapon_progression = array( "judge_zm", "srm1216_zm", "hk416_zm", "qcw05_zm", "kard_zm" );
    level.cymbal_monkey_clone_weapon = "srm1216_zm";
    trig_removal = getentarray( "zombie_door", "targetname" );

    foreach ( trig in trig_removal )
    {
        if ( isdefined( trig.script_parameters ) && trig.script_parameters == "grief_remove" )
            trig delete();

        if ( isdefined( trig.script_parameters ) && trig.script_parameters == "zcleansed_remove" )
        {
            parts = getentarray( trig.target, "targetname" );

            if ( isdefined( parts ) )
            {
                for ( i = 0; i < parts.size; i++ )
                    parts[i] delete();
            }

            trig delete();
        }
    }

    survival_init();
}

zgrief_preinit()
{
    registerclientfield( "toplayer", "meat_stink", 1, 1, "int" );
    zgrief_init();
}

zgrief_init()
{
    encounter_init();
    zm_buried_common_init();
    flag_wait( "start_zombie_round_logic" );
    trig_removal = getentarray( "zombie_door", "targetname" );

    foreach ( trig in trig_removal )
    {
        if ( isdefined( trig.script_parameters ) && trig.script_parameters == "grief_remove" )
            trig delete();
    }
}

encounter_init()
{
    level.precachecustomcharacters = ::precache_team_characters;
    level.givecustomcharacters = ::give_team_characters;
}

createfx_callback()
{
    ents = getentarray();

    for ( i = 0; i < ents.size; i++ )
    {
        if ( ents[i].classname != "info_player_start" )
            ents[i] delete();
    }
}

zclassic_init()
{
    level.precachecustomcharacters = ::precache_personality_characters;
    level.givecustomcharacters = ::give_personality_characters;
    level.setupcustomcharacterexerts = ::setup_personality_character_exerts;
    level.check_valid_poi = ::check_valid_poi;
    level.tear_into_position = ::tear_into_position;
    level.tear_into_wait = ::tear_into_wait;
    level.melee_miss_func = ::melee_miss_func;
    precachemodel( "p6_zm_keycard" );
    zm_buried_common_init();
    level.banking_map = "zm_transit";
    level.weapon_locker_map = "zm_transit";
    level thread maps\mp\zombies\_zm_banking::init();
    level.disable_free_perks_before_power = 1;
    maps\mp\zm_buried_sq::sq_buried_clientfield_init();
    flag_wait( "start_zombie_round_logic" );
    level thread maps\mp\zombies\_zm_weapon_locker::main();
    level thread maps\mp\zombies\_zm_banking::main();
    level thread collapsing_catwalk_init();
    level thread maps\mp\zm_buried_distance_tracking::zombie_tracking_init();
    maps\mp\zombies\_zm_weapons::register_zombie_weapon_callback( "lsat_zm", ::player_give_lsat );
}

zclassic_preinit()
{
    zclassic_init();
}

zmaxis_preinit()
{
    zmaxis_init();
}

zmaxis_init()
{
    encounter_init();
    zm_buried_common_init();
    flag_wait( "start_zombie_round_logic" );
}

zrichtofen_preinit()
{
    zrichtofen_init();
}

zrichtofen_init()
{
    encounter_init();
    zm_buried_common_init();
    flag_wait( "start_zombie_round_logic" );
}

zm_buried_common_init()
{
    num_bits = 2;
    registerclientfield( "world", "GENERATOR_POWER_STATES", 12000, num_bits, "int" );
    registerclientfield( "world", "GENERATOR_POWER_STATES_COLOR", 12000, 1, "int" );
    registerclientfield( "world", "GENERATOR_POWER_STATES_LERP", 12000, 5, "float" );
    registerclientfield( "world", "cw_fall", 12000, 1, "int" );
    registerclientfield( "world", "maze_fountain_start", 12000, 1, "int" );
    registerclientfield( "world", "sloth_fountain_start", 12000, 1, "int" );
    registerclientfield( "world", "mansion_piano_play", 12000, 1, "int" );
    registerclientfield( "world", "saloon_piano_play", 12000, 1, "int" );
    registerclientfield( "world", "mus_noir_snapshot_loop", 12000, 1, "int" );
    registerclientfield( "world", "mus_zmb_egg_snapshot_loop", 12000, 1, "int" );
    registerclientfield( "toplayer", "sndBackgroundMus", 12000, 3, "int" );
    registerclientfield( "toplayer", "clientfield_underground_lighting", 12000, 1, "int" );
}

main()
{
    maps\mp\zm_buried_fx::main();
    level thread maps\mp\zm_buried_ffotd::main_start();
    setdvarint( "sm_sunShadowSmallScriptPS3OnlyEnable", 1 );
    level.disable_fx_zmb_wall_buy_semtex = 1;
    level.disable_fx_zmb_tranzit_shield_explo = 1;
    level.default_game_mode = "zclassic";
    level.default_start_location = "processing";
    setup_rex_starts();
    level.disable_blackscreen_clientfield = 1;
    level.disable_deadshot_clientfield = 1;
    level.custom_zombie_player_loadout_init = 1;
    maps\mp\zm_buried_buildables::prepare_chalk_weapon_list();
    level.fx_exclude_edge_fog = 1;
    level.fx_exclude_tesla_head_light = 1;
    level.fx_exclude_default_explosion = 1;
    level.fx_exclude_default_eye_glow = 1;
    maps\mp\zombies\_zm::init_fx();
    maps\mp\animscripts\zm_death::precache_gib_fx();
    level.zombiemode = 1;
    level._no_water_risers = 1;
    level._foliage_risers = 1;
    maps\mp\zm_buried_amb::main();
    maps\mp\zombies\_zm_ai_ghost::precache_fx();
    maps\mp\zombies\_zm_ai_sloth::precache();
    maps\mp\zm_buried_sq::precache_sq();
    level.level_specific_stats_init = ::init_buried_stats;
    maps\mp\zombies\_load::main();
    setdvar( "zombiemode_path_minz_bias", 13 );

    if ( getdvar( "createfx" ) != "" )
        return;

    maps\mp\teams\_teamset_cdc::level_init();
    maps\mp\gametypes_zm\_spawning::level_use_unified_spawning( 1 );
    level.givecustomloadout = ::givecustomloadout;
    level.custom_player_fake_death = ::zm_player_fake_death;
    level.custom_player_fake_death_cleanup = ::zm_player_fake_death_cleanup;
    level.initial_round_wait_func = ::initial_round_wait_func;
    level.level_specific_init_powerups = ::add_buried_powerups;
    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_revive_perk = 1;
    level.zombiemode_using_sleightofhand_perk = 1;
    level.zombiemode_using_additionalprimaryweapon_perk = 1;
    level.zombiemode_using_marathon_perk = 1;

    if ( is_gametype_active( "zclassic" ) )
    {
        maps\mp\zombies\_zm_perk_divetonuke::enable_divetonuke_perk_for_level();
        maps\mp\zombies\_zm_perk_vulture::enable_vulture_perk_for_level();
    }

    maps\mp\zm_buried_jail::init_jail_animtree();
    init_persistent_abilities();
    level.register_offhand_weapons_for_level_defaults_override = ::offhand_weapon_overrride;
    level.zombiemode_offhand_weapon_give_override = ::offhand_weapon_give_override;
    level._zombie_custom_add_weapons = ::custom_add_weapons;
    level._allow_melee_weapon_switching = 1;

    if ( is_gametype_active( "zclassic" ) )
    {
        level.custom_ai_type = [];
        level.custom_ai_type[level.custom_ai_type.size] = maps\mp\zombies\_zm_ai_ghost::init;
        level.custom_ai_type[level.custom_ai_type.size] = maps\mp\zombies\_zm_ai_sloth::init;
        level.sloth_enable = 1;
    }

    level._zmbvoxlevelspecific = ::init_level_specific_audio;
    maps\mp\zm_buried_jail::init_jail();
    include_weapons();
    include_powerups();
    include_equipment_for_level();
    init_level_specific_wall_buy_fx();
    registerclientfield( "world", "buried_sq_maxis_eye_glow_override", 12000, 1, "int" );
    registerclientfield( "allplayers", "buried_sq_richtofen_player_eyes_stuhlinger", 12000, 1, "int" );
    registerclientfield( "allplayers", "phd_flopper_effects", 12000, 1, "int" );
    maps\mp\zombies\_zm::init();

    if ( !sessionmodeisonlinegame() )
        level.pers_nube_lose_round = 0;

    maps\mp\zombies\_zm_weap_bowie::init();
    maps\mp\zombies\_zm_weap_cymbal_monkey::init();
    maps\mp\zombies\_zm_weap_claymore::init();
    maps\mp\zombies\_zm_weap_ballistic_knife::init();
    maps\mp\zombies\_zm_weap_slowgun::init();
    level.slowgun_allow_player_paralyze = ::buried_paralyzer_check;
    maps\mp\zombies\_zm_weap_tazer_knuckles::init();

    if ( is_gametype_active( "zclassic" ) )
        maps\mp\zombies\_zm_weap_time_bomb::init_time_bomb();

    level maps\mp\zm_buried_achievement::init();
    precacheitem( "death_throe_zm" );

    if ( level.splitscreen && getdvarint( "splitscreen_playerCount" ) > 2 )
        level.optimise_for_splitscreen = 1;
    else
        level.optimise_for_splitscreen = 0;

    maps\mp\zm_buried_maze::maze_precache();
    maps\mp\zm_buried_maze::init();

    if ( is_gametype_active( "zclassic" ) )
        level thread maps\mp\zm_buried_sq::init();

    level.zones = [];
    level.zone_manager_init_func = ::buried_zone_init;
    init_zones[0] = "zone_start";
    init_zones[1] = "zone_tunnels_north";
    init_zones[2] = "zone_tunnels_center";
    init_zones[3] = "zone_tunnels_south";
    init_zones[4] = "zone_stables";
    init_zones[5] = "zone_street_darkeast";
    init_zones[6] = "zone_street_darkwest";
    init_zones[7] = "zone_street_lightwest";
    init_zones[8] = "zone_street_lighteast";
    init_zones[9] = "zone_underground_bar";
    init_zones[10] = "zone_bank";
    init_zones[11] = "zone_general_store";
    init_zones[12] = "zone_candy_store";
    init_zones[13] = "zone_candy_store_floor2";
    init_zones[14] = "zone_toy_store";
    init_zones[15] = "zone_gun_store";
    init_zones[16] = "zone_underground_jail";
    init_zones[17] = "zone_start_lower";
    init_zones[18] = "zone_tunnels_south2";
    init_zones[19] = "zone_tunnels_north2";
    init_zones[20] = "zone_mansion";
    init_zones[21] = "zone_mansion_lawn";
    level thread maps\mp\zombies\_zm_zonemgr::manage_zones( init_zones );

    if ( isdefined( level.optimise_for_splitscreen ) && level.optimise_for_splitscreen )
    {
        if ( is_classic() )
            level.zombie_ai_limit = 20;

        level.claymores_max_per_player /= 2;
        setdvar( "fx_marks_draw", 0 );
        setdvar( "disable_rope", 1 );
        setdvar( "cg_disableplayernames", 1 );
        setdvar( "disableLookAtEntityLogic", 1 );
    }
    else
        level.zombie_ai_limit = 24;

    level.speed_change_round = 15;
    level.speed_change_max = 5;
    level thread bell_watch();
    trigs = getentarray( "force_from_prone", "targetname" );
    array_thread( trigs, ::player_force_from_prone );
    level thread maps\mp\zm_buried_classic::collapsing_holes_init();

    if ( level.scr_zm_ui_gametype == "zcleansed" )
        level thread init_turned_zones();

    level.calc_closest_player_using_paths = 1;
    level.validate_enemy_path_length = ::buried_validate_enemy_path_length;
    level.customrandomweaponweights = ::buried_custom_weapon_weights;
    level.special_weapon_magicbox_check = ::buried_special_weapon_magicbox_check;

    if ( level.scr_zm_ui_gametype == "zclassic" )
    {
        level thread init_fountain_zone();
        level thread maps\mp\zm_buried_classic::generator_oil_lamp_control();
        level.ignore_equipment = ::ignore_equipment;
        level.ghost_zone_teleport_logic = ::buried_ghost_zone_teleport_logic;
        level.ghost_zone_fountain_teleport_logic = ::ghost_zone_fountain_teleport_logic;
        maps\mp\zombies\_zm_perk_vulture::add_additional_stink_locations_for_zone( "zone_bank", array( "zone_street_darkwest", "zone_gun_store" ) );
        level thread maps\mp\zombies\_zm::post_main();
    }
/#
    execdevgui( "devgui_zombie_buried" );
    level.custom_devgui = ::zombie_buried_devgui;
#/
    level thread maps\mp\zm_buried_ffotd::main_end();
}

buried_validate_enemy_path_length( player )
{
    max_dist = 1296;
    d = distancesquared( self.origin, player.origin );

    if ( d <= max_dist )
        return true;

    return false;
}

init_persistent_abilities()
{
    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_flopper = 1;
        level.divetonuke_precache_override_func = maps\mp\zombies\_zm_pers_upgrades_functions::divetonuke_precache_override_func;
        level.pers_flopper_divetonuke_func = maps\mp\zombies\_zm_pers_upgrades_functions::pers_flopper_explode;
        level.pers_flopper_network_optimized = 1;
        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_box_weapon = 1;
        level.pers_magic_box_firesale = 1;
        level.pers_treasure_chest_get_weapons_array_func = ::pers_treasure_chest_get_weapons_array_buried;
        level.pers_upgrade_nube = 1;
    }
}

pers_treasure_chest_get_weapons_array_buried()
{
    if ( !isdefined( level.pers_box_weapons ) )
    {
        level.pers_box_weapons = [];
        level.pers_box_weapons[level.pers_box_weapons.size] = "cymbal_monkey_zm";
        level.pers_box_weapons[level.pers_box_weapons.size] = "ray_gun_zm";
        level.pers_box_weapons[level.pers_box_weapons.size] = "raygun_mark2_zm";
        level.pers_box_weapons[level.pers_box_weapons.size] = "slowgun_zm";
        level.pers_box_weapons[level.pers_box_weapons.size] = "time_bomb_zm";
        level.pers_box_weapons[level.pers_box_weapons.size] = "tar21_zm";
        level.pers_box_weapons[level.pers_box_weapons.size] = "hamr_zm";
        level.pers_box_weapons[level.pers_box_weapons.size] = "srm1216_zm";
        level.pers_box_weapons[level.pers_box_weapons.size] = "knife_ballistic_zm";
        level.pers_box_weapons[level.pers_box_weapons.size] = "galil_zm";
        level.pers_box_weapons[level.pers_box_weapons.size] = "saiga12_zm";
    }
}

buried_custom_weapon_weights( keys )
{
    return keys;
}

buried_special_weapon_magicbox_check( weapon )
{
    if ( weapon == "ray_gun_zm" )
    {
        if ( self has_weapon_or_upgrade( "raygun_mark2_zm" ) )
            return false;
    }

    if ( weapon == "raygun_mark2_zm" )
    {
        if ( self has_weapon_or_upgrade( "ray_gun_zm" ) )
            return false;
    }

    if ( weapon == "time_bomb_zm" )
    {
        players = get_players();

        for ( i = 0; i < players.size; i++ )
        {
            if ( is_player_valid( players[i], undefined, 1 ) && players[i] is_player_tactical_grenade( weapon ) )
                return false;
        }
    }

    return true;
}

zombie_buried_devgui( cmd )
{
/#
    cmd_strings = strtok( cmd, " " );

    switch ( cmd_strings[0] )
    {
        case "richtofen_street":
            level notify( "richtofen_street" );
            break;
        case "maxis_street":
            level notify( "maxis_street" );
            break;
        case "ghost_toggle_force_killable":
            if ( !isdefined( level.ghost_force_killable ) )
                level.ghost_force_killable = 1;
            else
                level.ghost_force_killable = !level.ghost_force_killable;

            break;
        case "ghost_toggle_debug":
            if ( !isdefined( level.ghost_debug ) )
                level.ghost_debug = 1;
            else
                level.ghost_debug = !level.ghost_debug;

            break;
        case "ghost_warp_to_mansion":
            if ( isdefined( level.ghost_devgui_warp_to_mansion ) )
                [[ level.ghost_devgui_warp_to_mansion ]]();

            break;
        case "ghost_toggle_no_ghost":
            if ( isdefined( level.ghost_devgui_toggle_no_ghost ) )
                [[ level.ghost_devgui_toggle_no_ghost ]]();

            break;
        case "spawn_vulture_stink":
            if ( isdefined( level.vulture_devgui_spawn_stink ) )
                [[ level.vulture_devgui_spawn_stink ]]();

            break;
        case "sloth_double_wide":
            if ( isdefined( level.sloth_devgui_double_wide ) )
                [[ level.sloth_devgui_double_wide ]]();

            break;
        case "sloth_destroy_barricade":
            if ( isdefined( level.sloth_devgui_barricade ) )
                [[ level.sloth_devgui_barricade ]]();

            break;
        case "sloth_toggle_doors":
            if ( !isdefined( level.sloth_debug_doors ) )
                level.sloth_debug_doors = 1;
            else
                level.sloth_debug_doors = !level.sloth_debug_doors;

            break;
        case "sloth_toggle_buildables":
            if ( !isdefined( level.sloth_debug_buildables ) )
                level.sloth_debug_buildables = 1;
            else
                level.sloth_debug_buildables = !level.sloth_debug_buildables;

            break;
        case "sloth_move_lamp":
            if ( isdefined( level.sloth_devgui_move_lamp ) )
                [[ level.sloth_devgui_move_lamp ]]();

            break;
        case "sloth_make_crawler":
            if ( isdefined( level.sloth_devgui_make_crawler ) )
                [[ level.sloth_devgui_make_crawler ]]();

            break;
        case "sloth_teleport":
            if ( isdefined( level.sloth_devgui_teleport ) )
                [[ level.sloth_devgui_teleport ]]();

            break;
        case "sloth_drink_booze":
            if ( isdefined( level.sloth_devgui_booze ) )
                [[ level.sloth_devgui_booze ]]();

            break;
        case "sloth_eat_candy":
            if ( isdefined( level.sloth_devgui_candy ) )
                [[ level.sloth_devgui_candy ]]();

            break;
        case "sloth_context":
            if ( isdefined( level.sloth_devgui_context ) )
                [[ level.sloth_devgui_context ]]();

            break;
        case "sloth_warp_to_jail":
            if ( isdefined( level.sloth_devgui_warp_to_jail ) )
                [[ level.sloth_devgui_warp_to_jail ]]();

            break;
        case "lights_on":
            level notify( "generator_lights_on" );
            break;
        case "sloth_open":
            level notify( "open_sloth_barricades" );
            level notify( "courtyard_fountain_open" );
            break;
        case "cell_open":
            level notify( "cell_open" );

            if ( isdefined( level.jail_open_door ) )
                [[ level.jail_open_door ]]();

            break;
        case "cell_close":
            level notify( "cell_close" );

            if ( isdefined( level.jail_close_door ) )
                [[ level.jail_close_door ]]();

            break;
        case "pick_up_keys":
            thread pick_up( "keys_zm" );
            break;
        case "pick_up_candy":
            if ( !( isdefined( level.jail_barricade_down ) && level.jail_barricade_down ) )
            {
                level notify( "jail_barricade_down" );
                wait 0.05;
            }

            thread pick_up( "candy" );
            break;
        case "pick_up_booze":
            thread pick_up( "booze" );
            break;
        case "bell_ring":
            players = get_players();
            bells = getentarray( "church_bell", "targetname" );
            bell_ring( players[0], bells[0] );
            break;
        case "destroy_sloth_fountain":
            level notify( "courtyard_fountain_open" );
            break;
        case "destroy_maze_fountain":
            level notify( "_destroy_maze_fountain" );
            break;
        case "warp_player_to_maze_fountain":
            level notify( "warp_player_to_maze_fountain" );
            break;
        case "warp_player_to_courtyard_fountain":
            level notify( "warp_player_to_courtyard_fountain" );
            break;
        case "yellow_nuke":
        case "yellow_double":
        case "red_nuke":
        case "red_double":
        case "red_ammo":
        case "green_nuke":
        case "green_monkey":
        case "green_insta":
        case "green_double":
        case "green_ammo":
        case "blue_monkey":
            maps\mp\zombies\_zm_devgui::zombie_devgui_give_powerup( cmd_strings[0], 1 );
            break;
        case "slow_test":
            maps\mp\zombies\_zm_weap_time_bomb::slow_all_actors();
            thread maps\mp\zombies\_zm_weap_time_bomb::all_actors_resume_speed();
            flag_set( "time_bomb_enemies_restored" );
        case "catwalk_keep":
            level notify( "catwalk_collapsed" );
            break;
        case "start_ghost_piano":
            flag_set( "player_piano_song_active" );
            level notify( "player_can_interact_with_ghost_piano_player", get_players()[0] );
            break;
        case "ghost_piano_warp_to_mansion_piano":
            level notify( "ghost_piano_warp_to_mansion_piano" );
            break;
        case "ghost_piano_warp_to_bar":
            level notify( "ghost_piano_warp_to_bar" );
            break;
        default:
            break;
    }
#/
}

pick_up( thing )
{
/#
    players = get_players();

    foreach ( player in players )
    {
        if ( isdefined( player player_get_buildable_piece( 1 ) ) && player player_get_buildable_piece( 1 ).buildablename == thing )
            continue;

        candidate_list = [];

        foreach ( zone in level.zones )
        {
            if ( isdefined( zone.unitrigger_stubs ) )
                candidate_list = arraycombine( candidate_list, zone.unitrigger_stubs, 1, 0 );
        }

        foreach ( stub in candidate_list )
        {
            if ( isdefined( stub.piece ) && stub.piece.buildablename == thing )
            {
                player thread maps\mp\zombies\_zm_buildables::player_take_piece( stub.piece );
                break;
            }
        }

        if ( isdefined( player player_get_buildable_piece( 1 ) ) && player player_get_buildable_piece( 1 ).buildablename == thing )
            continue;

        level notify( "player_purchase_" + thing, player );
    }
#/
}

givecustomloadout( takeallweapons, alreadyspawned )
{
    self giveweapon( "knife_zm" );
    self give_start_weapon( 1 );
}

precache_team_characters()
{
    precachemodel( "c_zom_player_cdc_dlc1_fb" );
    precachemodel( "c_zom_hazmat_viewhands" );
    precachemodel( "c_zom_player_cia_dlc1_fb" );
    precachemodel( "c_zom_suit_viewhands" );
}

give_team_characters()
{
    self detachall();
    self set_player_is_female( 0 );

    if ( !isdefined( self.characterindex ) )
    {
        self.characterindex = 1;

        if ( self.team == "axis" )
            self.characterindex = 0;
    }

    switch ( self.characterindex )
    {
        case 2:
        case 0:
            self setmodel( "c_zom_player_cia_dlc1_fb" );
            self.voice = "american";
            self.skeleton = "base";
            self setviewmodel( "c_zom_suit_viewhands" );
            self.characterindex = 0;
            break;
        case 3:
        case 1:
            self setmodel( "c_zom_player_cdc_dlc1_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 );
}

initcharacterstartindex()
{
    level.characterstartindex = randomint( 4 );
}

precache_personality_characters()
{
    character\c_transit_player_farmgirl::precache();
    character\c_transit_player_oldman::precache();
    character\c_transit_player_engineer::precache();
    character\c_buried_player_reporter_dam::precache();
    precachemodel( "c_zom_farmgirl_viewhands" );
    precachemodel( "c_zom_oldman_viewhands" );
    precachemodel( "c_zom_engineer_viewhands" );
    precachemodel( "c_zom_reporter_viewhands" );
}

give_personality_characters()
{
    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( _hash_40772CF1 ) != "" )
        self.characterindex = getdvarint( _hash_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_buried_player_reporter_dam::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 thread set_exert_id();
}

set_exert_id()
{
    self endon( "disconnect" );
    wait_network_frame();
    wait_network_frame();
    self maps\mp\zombies\_zm_audio::setexertvoice( self.characterindex + 1 );
}

setup_personality_character_exerts()
{
    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";
}

assign_lowest_unused_character_index()
{
    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;
}

zm_player_fake_death_cleanup()
{
    if ( isdefined( self._fall_down_anchor ) )
    {
        self._fall_down_anchor delete();
        self._fall_down_anchor = undefined;
    }
}

zm_player_fake_death( vdir )
{
    level notify( "fake_death" );
    self notify( "fake_death" );
    stance = self getstance();
    self.ignoreme = 1;
    self enableinvulnerability();
    self takeallweapons();

    if ( isdefined( self.insta_killed ) && self.insta_killed )
    {
        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;
    }
}

fall_down( vdir, stance )
{
    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" );

    self giveweapon( "death_throe_zm" );
    self switchtoweapon( "death_throe_zm" );

    if ( falling )
    {
        bounce = randomint( 4 ) + 8;
        origin = origin + ( 0, 0, bounce ) - xyspeed * 0.1;
        lerptime = bounce / 50.0;
        linker moveto( origin, lerptime, 0, lerptime );

        linker waittill( "movedone" );

        origin = origin + ( 0, 0, bounce * -1 ) + xyspeed * 0.1;
        lerptime /= 2.0;
        linker moveto( origin, lerptime, lerptime );

        linker waittill( "movedone" );

        linker moveto( origin, 5, 0 );
    }

    wait 15;
    linker delete();
}

initial_round_wait_func()
{
    flag_wait( "initial_blackscreen_passed" );
}

offhand_weapon_overrride()
{
    register_lethal_grenade_for_level( "frag_grenade_zm" );
    level.zombie_lethal_grenade_player_init = "frag_grenade_zm";
    register_tactical_grenade_for_level( "cymbal_monkey_zm" );
    register_tactical_grenade_for_level( "emp_grenade_zm" );
    register_placeable_mine_for_level( "claymore_zm" );
    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( "equip_turbine_zm" );
    register_equipment_for_level( "equip_springpad_zm" );
    register_equipment_for_level( "equip_subwoofer_zm" );
    register_equipment_for_level( "equip_headchopper_zm" );
    level.zombie_equipment_player_init = undefined;
}

offhand_weapon_give_override( str_weapon )
{
    self endon( "death" );

    if ( is_tactical_grenade( str_weapon ) && isdefined( self get_player_tactical_grenade() ) && !self is_player_tactical_grenade( str_weapon ) )
    {
        self setweaponammoclip( self get_player_tactical_grenade(), 0 );
        self takeweapon( self get_player_tactical_grenade() );
    }

    return 0;
}

init_buried_stats()
{
    self maps\mp\zm_buried_sq::init_player_sidequest_stats();
    self maps\mp\zm_buried_achievement::init_player_achievement_stats();
}

init_level_specific_wall_buy_fx()
{
    level._effect["an94_zm_fx"] = loadfx( "maps/zombie/fx_zmb_wall_buy_an94" );
    level._effect["pdw57_zm_fx"] = loadfx( "maps/zombie/fx_zmb_wall_buy_pdw57" );
    level._effect["svu_zm_fx"] = loadfx( "maps/zombie/fx_zmb_wall_buy_svuas" );
    level._effect["lsat_zm_fx"] = loadfx( "maps/zombie/fx_zmb_wall_buy_lsat" );
    level._effect["tazer_knuckles_zm_fx"] = loadfx( "maps/zombie/fx_zmb_buried_buy_taseknuck" );
    level._effect["tazer_knuckles_zm_chalk_fx"] = loadfx( "maps/zombie/fx_zmb_buried_dyn_taseknuck" );
    level._effect["870mcs_zm_chalk_fx"] = loadfx( "maps/zombie/fx_zmb_wall_dyn_870mcs" );
    level._effect["ak74u_zm_chalk_fx"] = loadfx( "maps/zombie/fx_zmb_wall_dyn_ak74u" );
    level._effect["an94_zm_chalk_fx"] = loadfx( "maps/zombie/fx_zmb_wall_dyn_an94" );
    level._effect["pdw57_zm_chalk_fx"] = loadfx( "maps/zombie/fx_zmb_wall_dyn_pdw57" );
    level._effect["svu_zm_chalk_fx"] = loadfx( "maps/zombie/fx_zmb_wall_dyn_svuas" );
}

custom_add_weapons()
{
    gametype = getdvar( "ui_gametype" );
    add_zombie_weapon( "m1911_zm", "m1911_upgraded_zm", &"ZOMBIE_WEAPON_M1911", 50, "", "", undefined );
    add_zombie_weapon( "rnma_zm", "rnma_upgraded_zm", &"ZOMBIE_WEAPON_RNMA", 50, "pickup_six_shooter", "", 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( "pdw57_zm", "pdw57_upgraded_zm", &"ZOMBIE_WEAPON_PDW57", 1000, "smg", "", undefined );

    if ( gametype == "zcleansed" )
        add_zombie_weapon( "qcw05_zm", undefined, &"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_smr", "", undefined, 1 );
    add_zombie_weapon( "m16_zm", "m16_gl_upgraded_zm", &"ZOMBIE_WEAPON_M16", 1200, "burstrifle", "", undefined );
    add_zombie_weapon( "tar21_zm", "tar21_upgraded_zm", &"ZOMBIE_WEAPON_TAR21", 50, "wpck_mtar", "", 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, "wpck_m82a1", "", undefined, 1 );
    add_zombie_weapon( "svu_zm", "svu_upgraded_zm", &"ZOMBIE_WEAPON_SVU", 1000, "wpck_svuas", "", undefined, 1 );
    add_zombie_weapon( "lsat_zm", "lsat_upgraded_zm", &"ZOMBIE_WEAPON_LSAT", 2000, "wpck_lsat", "", 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( "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( "an94_zm", "an94_upgraded_zm", &"ZOMBIE_WEAPON_AN94", 1200, "", "", undefined );
    add_zombie_weapon( "cymbal_monkey_zm", undefined, &"ZOMBIE_WEAPON_SATCHEL_2000", 2000, "wpck_monkey", "", undefined, 1 );
    add_zombie_weapon( "ray_gun_zm", "ray_gun_upgraded_zm", &"ZOMBIE_WEAPON_RAYGUN", 10000, "wpck_ray", "", undefined, 1 );
    add_zombie_weapon( "raygun_mark2_zm", "raygun_mark2_upgraded_zm", &"ZOMBIE_WEAPON_RAYGUN_MARK2", 10000, "pickup_raymk2", "", undefined, 1 );
    add_zombie_weapon( "knife_ballistic_zm", "knife_ballistic_upgraded_zm", &"ZOMBIE_WEAPON_KNIFE_BALLISTIC", 10, "wpck_knife", "", undefined, 1 );
    add_zombie_weapon( "knife_ballistic_bowie_zm", "knife_ballistic_bowie_upgraded_zm", &"ZOMBIE_WEAPON_KNIFE_BALLISTIC", 10, "sickle", "", undefined, 1 );
    add_zombie_weapon( "knife_ballistic_no_melee_zm", "knife_ballistic_no_melee_upgraded_zm", &"ZOMBIE_WEAPON_KNIFE_BALLISTIC", 10, "wpck_knife", "", undefined, 1 );
    add_zombie_weapon( "tazer_knuckles_zm", undefined, &"ZOMBIE_WEAPON_TAZER_KNUCKLES", 100, "tazerknuckles", "", undefined );
    add_zombie_weapon( "slowgun_zm", "slowgun_upgraded_zm", &"ZOMBIE_WEAPON_SLOWGUN", 10, "wpck_paralyzer", "", undefined, 1 );
}

less_than_normal()
{
    return 0.5;
}

include_weapons()
{
    gametype = getdvar( "ui_gametype" );
    include_weapon( "knife_zm", 0 );
    include_weapon( "frag_grenade_zm", 0 );
    include_weapon( "claymore_zm", 0 );
    include_weapon( "m1911_zm", 0 );
    include_weapon( "m1911_upgraded_zm", 0 );
    include_weapon( "rnma_zm" );
    include_weapon( "rnma_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 );

    if ( gametype == "zcleansed" )
        include_weapon( "qcw05_zm" );

    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( "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( "svu_zm", 0 );
    include_weapon( "svu_upgraded_zm", 0 );
    include_weapon( "lsat_zm", 0 );
    include_weapon( "lsat_upgraded_zm", 0 );
    include_weapon( "hamr_zm" );
    include_weapon( "hamr_upgraded_zm", 0 );
    include_weapon( "pdw57_zm", 0 );
    include_weapon( "pdw57_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( "an94_zm", 0 );
    include_weapon( "an94_upgraded_zm", 0 );
    include_weapon( "cymbal_monkey_zm" );
    include_weapon( "ray_gun_zm" );
    include_weapon( "ray_gun_upgraded_zm", 0 );
    include_weapon( "raygun_mark2_zm", 1 );
    include_weapon( "raygun_mark2_upgraded_zm", 0 );
    include_weapon( "slowgun_zm", 1 );
    include_weapon( "slowgun_upgraded_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_weapon_to_content( "raygun_mark2_zm", "dlc3" );
    add_limited_weapon( "m1911_zm", 0 );
    add_limited_weapon( "knife_ballistic_zm", 1 );
    add_limited_weapon( "slowgun_zm", 1 );
    add_limited_weapon( "slowgun_upgraded_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 );
    add_limited_weapon( "raygun_mark2_zm", 4 );
    add_limited_weapon( "raygun_mark2_upgraded_zm", 4 );
    add_weapon_locker_mapping( "python_zm", "rnma_zm" );
    add_weapon_locker_mapping( "qcw05_zm", "pdw57_zm" );
    add_weapon_locker_mapping( "xm8_zm", "tar21_zm" );
    add_weapon_locker_mapping( "type95_zm", "tar21_zm" );
    add_weapon_locker_mapping( "rpd_zm", "galil_zm" );
    add_weapon_locker_mapping( "python_upgraded_zm", "rnma_upgraded_zm" );
    add_weapon_locker_mapping( "qcw05_upgraded_zm", "pdw57_upgraded_zm" );
    add_weapon_locker_mapping( "xm8_upgraded_zm", "tar21_upgraded_zm" );
    add_weapon_locker_mapping( "type95_upgraded_zm", "tar21_upgraded_zm" );
    add_weapon_locker_mapping( "rpd_upgraded_zm", "galil_upgraded_zm" );
}

include_powerups()
{
    include_powerup( "nuke" );
    include_powerup( "insta_kill" );
    include_powerup( "double_points" );
    include_powerup( "full_ammo" );
    include_powerup( "carpenter" );
    include_powerup( "fire_sale" );
    include_powerup( "teller_withdrawl" );
    include_powerup( "free_perk" );
    include_powerup( "insta_kill_ug" );
    include_powerup( "random_weapon" );
}

add_buried_powerups()
{
    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 );
}

zombie_init_done()
{
    self.allowpain = 0;
    self.zombie_path_bad = 0;
    self thread maps\mp\zm_buried_distance_tracking::escaped_zombies_cleanup_init();
}

include_equipment_for_level()
{
    level.equipment_subwoofer_needs_power = 1;
    include_equipment( "equip_turbine_zm" );
    include_equipment( "equip_springpad_zm" );
    include_equipment( "equip_subwoofer_zm" );
    include_equipment( "equip_headchopper_zm" );
    level.equipment_planted = ::equipment_planted;
    level.equipment_safe_to_drop = ::equipment_safe_to_drop;
}

setup_rex_starts()
{
    add_gametype( "zclassic", ::dummy, "zclassic", ::dummy );
    add_gametype( "zcleansed", ::dummy, "zcleansed", ::dummy );
    add_gametype( "zgrief", ::dummy, "zgrief", ::dummy );
    add_gameloc( "processing", ::dummy, "processing", ::dummy );
    add_gameloc( "street", ::dummy, "street", ::dummy );
}

dummy()
{

}

buried_zone_init()
{
    flag_init( "always_on" );
    flag_set( "always_on" );
    add_adjacent_zone( "zone_tunnels_center", "zone_tunnels_north", "always_on" );
    add_adjacent_zone( "zone_tunnels_north", "zone_tunnels_north2", "tunnels2courthouse" );
    add_adjacent_zone( "zone_tunnels_south", "zone_tunnels_south2", "tunnel2saloon" );
    add_adjacent_zone( "zone_tunnels_south3", "zone_tunnels_south2", "always_on" );
    add_adjacent_zone( "zone_tunnels_center", "zone_tunnels_south", "always_on" );
    add_adjacent_zone( "zone_street_lightwest", "zone_general_store", "general_store_door1" );
    add_adjacent_zone( "zone_street_lighteast", "zone_general_store", "always_on" );
    add_adjacent_zone( "zone_street_darkwest", "zone_general_store", "general_store_door2" );
    add_adjacent_zone( "zone_street_lightwest", "zone_morgue_upstairs", "always_on" );
    add_adjacent_zone( "zone_street_fountain", "zone_mansion_lawn", "mansion_lawn_door1" );
    add_adjacent_zone( "zone_street_darkwest", "zone_gun_store", "gun_store_door1" );
    add_adjacent_zone( "zone_stables", "zone_street_lightwest", "always_on", 1 );
    add_adjacent_zone( "zone_street_darkwest", "zone_street_darkwest_nook", "darkwest_nook_door1" );
    add_adjacent_zone( "zone_street_darkwest", "zone_general_store", "general_store_door3" );
    add_adjacent_zone( "zone_street_darkwest_nook", "zone_stables", "stables_door2" );
    add_adjacent_zone( "zone_street_darkeast", "zone_underground_bar", "bar_door1" );
    add_adjacent_zone( "zone_street_darkeast", "zone_street_darkeast_nook", "always_on" );
    add_adjacent_zone( "zone_underground_courthouse2", "zone_underground_courthouse", "always_on" );
    add_adjacent_zone( "zone_street_lighteast", "zone_underground_courthouse", "courthouse_door1" );
    add_adjacent_zone( "zone_street_lightwest", "zone_underground_jail", "jail_door1" );
    add_adjacent_zone( "zone_street_lightwest", "zone_street_lightwest_alley", "jail_jugg" );
    add_adjacent_zone( "zone_underground_jail", "zone_underground_jail2", "always_on" );
    add_adjacent_zone( "zone_underground_jail2", "zone_street_lightwest", "always_on" );
    add_adjacent_zone( "zone_street_lighteast", "zone_candy_store", "candy_store_door1" );
    add_adjacent_zone( "zone_candy_store", "zone_candy_store_floor2", "always_on" );
    add_adjacent_zone( "zone_toy_store_floor2", "zone_candy_store_floor2", "always_on" );
    add_adjacent_zone( "zone_toy_store", "zone_toy_store_floor2", "always_on" );
    add_adjacent_zone( "zone_street_darkeast", "zone_toy_store_floor2", "always_on" );
    add_adjacent_zone( "zone_street_darkeast", "zone_toy_store", "candy_store_door2" );
    add_adjacent_zone( "zone_street_lighteast", "zone_candy_store_floor2", "candy2lighteast", 1 );
    add_adjacent_zone( "zone_street_darkeast", "zone_candy_store_floor2", "always_on", 1 );
    add_adjacent_zone( "zone_toy_store_tunnel", "zone_toy_store_floor2", "always_on", 1 );
    add_adjacent_zone( "zone_street_lighteast", "zone_street_fountain", "always_on" );
    add_adjacent_zone( "zone_street_fountain", "zone_church_graveyard", "always_on" );
    add_adjacent_zone( "zone_church_graveyard", "zone_church_main", "church_door1" );
    add_adjacent_zone( "zone_church_main", "zone_church_upstairs", "church_door1" );
    add_adjacent_zone( "zone_gun_store", "zone_tunnel_gun2stables", "gunshop2tunnel" );
    add_adjacent_zone( "zone_tunnel_gun2saloon", "zone_underground_bar", "always_on" );
    add_adjacent_zone( "zone_maze", "zone_mansion_backyard", "mansion_door1", 1 );
    add_adjacent_zone( "zone_maze", "zone_maze_staircase", "mansion_door1", 1 );
    add_adjacent_zone( "zone_stables", "zone_tunnel_gun2stables2", "always_on" );
    add_adjacent_zone( "zone_tunnel_gun2stables2", "zone_tunnel_gun2stables", "always_on" );
}

init_turned_zones()
{
    a_zones = array( "zone_street_lighteast", "zone_street_lightwest", "zone_street_darkeast", "zone_street_darkwest", "zone_church_main", "zone_church_upstairs", "zone_mansion", "zone_candy_store", "zone_candy_store_floor2", "zone_underground_courthouse", "zone_underground_jail", "zone_underground_jail2", "zone_toy_store", "zone_toy_store_floor2", "zone_underground_bar", "zone_gun_store", "zone_stables", "zone_bank", "zone_general_store", "zone_morgue_upstairs" );

    foreach ( zone in a_zones )
    {
        zone_init( zone );
        enable_zone( zone );
    }
}

init_fountain_zone()
{
    flag_wait( "fountain_transport_active" );

    if ( !isdefined( level.snd_ent ) )
    {
        level.snd_ent = spawn( "script_origin", ( 4918, 575, 11 ) );
        level.snd_ent playloopsound( "amb_water_vortex", 1 );
    }

    zone_volumes = getentarray( "zone_start_lower", "targetname" );

    foreach ( zone in zone_volumes )
        zone.script_noteworthy = "player_volume";
}

buried_ghost_zone_teleport_logic()
{
    if ( isdefined( level.zombie_ghost_round_states.is_teleporting ) && level.zombie_ghost_round_states.is_teleporting )
        return;

    if ( !isdefined( level.ghost_drop_down_locations ) || level.ghost_drop_down_locations.size < 1 )
        return;

    if ( !isdefined( level.zones["zone_start"] ) || isdefined( level.zones["zone_start"].is_occupied ) && level.zones["zone_start"].is_occupied )
        return;

    if ( !isdefined( level.zones["zone_start_lower"] ) || isdefined( level.zones["zone_start_lower"].is_occupied ) && level.zones["zone_start_lower"].is_occupied )
        return;

    teleport_location_index = 0;
    axises = getaiarray( "axis" );

    foreach ( axis in axises )
    {
        if ( is_true( axis.is_ghost ) && axis maps\mp\zombies\_zm_ai_ghost::is_in_start_area() )
        {
            if ( teleport_location_index == level.ghost_drop_down_locations.size )
                teleport_location_index = 0;

            teleport_location_origin = level.ghost_drop_down_locations[teleport_location_index].origin;
            teleport_location_angles = level.ghost_drop_down_locations[teleport_location_index].angles;
            axis forceteleport( teleport_location_origin, teleport_location_angles );
            teleport_location_index++;
        }
    }
}

ghost_zone_fountain_teleport_logic()
{
    if ( isdefined( level.zombie_ghost_round_states.is_teleporting ) && level.zombie_ghost_round_states.is_teleporting )
        return;

    if ( !isdefined( level.ghost_zone_start_lower_locations ) || level.ghost_zone_start_lower_locations.size < 1 )
        return;

    if ( !level.zones["zone_start_lower"].is_occupied )
        return;

    teleport_location_index = 0;
    axises = getaiarray( "axis" );

    foreach ( axis in axises )
    {
        if ( is_true( axis.is_ghost ) && !axis maps\mp\zombies\_zm_ai_ghost::is_in_start_area() )
        {
            if ( isdefined( axis.favoriteenemy ) && axis.favoriteenemy maps\mp\zombies\_zm_ai_ghost::is_in_start_area() )
            {
                if ( teleport_location_index == level.ghost_zone_start_lower_locations.size )
                    teleport_location_index = 0;

                teleport_location_origin = level.ghost_zone_start_lower_locations[teleport_location_index].origin;
                teleport_location_angles = level.ghost_zone_start_lower_locations[teleport_location_index].angles;
                axis forceteleport( teleport_location_origin, teleport_location_angles );
                teleport_location_index++;
            }
        }
    }
}

init_level_specific_audio()
{
    level thread establish_mystery_wallbuy_categories();
    level._audio_custom_response_line = ::buried_audio_custom_response_line;
    level.oh_shit_vo_cooldown = 0;
    level.snd_pers_upgrade_force_variant = 0;
    level.pers_upgrade_vo_spoken = 1;
    level.snd_pers_upgrade_force_type = "achievement";
    level.custom_banking_vo = 1;
    level.custom_buildable_need_part_vo = ::buried_custom_buildable_need_part_vo;
    level.custom_buildable_wrong_part_vo = ::buried_custom_buildable_wrong_part_vo;
    level.custom_bank_deposit_vo = ::buried_custom_bank_deposit_vo;
    level.custom_bank_withdrawl_vo = ::buried_custom_bank_withdrawl_vo;
    level.custom_faller_death = maps\mp\zombies\_zm_ai_faller::faller_death_ragdoll;

    if ( is_classic() )
    {
        level.audio_get_mod_type = ::buried_audio_get_mod_type_override;
        level.custom_kill_damaged_vo = maps\mp\zombies\_zm_audio::custom_kill_damaged_vo;
        level.gib_on_damage = ::buried_custom_zombie_gibbed_vo;
        level._audio_custom_weapon_check = ::buried_audio_custom_weapon_check;
        level._custom_zombie_oh_shit_vox_func = ::buried_custom_zombie_oh_shit_vox;
        level.custom_player_track_ammo_count = ::buried_player_track_ammo_count;
        onplayerconnect_callback( ::zm_buried_buildable_pickedup_vo );
        level thread ghost_steal_vo_watcher();
        level thread ghost_damage_vo_watcher();
        level thread sloth_first_encounter_vo();
        level thread sloth_crawler_vo();
    }

    buried_add_player_dialogue( "player", "general", "no_money_weapon", "nomoney_generic", undefined );
    buried_add_player_dialogue( "player", "general", "no_money_box", "nomoney_generic", undefined );
    buried_add_player_dialogue( "player", "general", "perk_deny", "nomoney_generic", undefined );
    buried_add_player_dialogue( "player", "kill", "closekill", "kill_close", undefined, 15 );
    buried_add_player_dialogue( "player", "kill", "damage", "kill_damaged", undefined, 50 );
    buried_add_player_dialogue( "player", "kill", "headshot", "kill_headshot", "resp_kill_headshot", 25 );
    buried_add_player_dialogue( "player", "kill", "raymk2", "kill_raymk2", undefined, 15 );
    buried_add_player_dialogue( "player", "kill", "paralyzer", "kill_paralyzer", undefined, 15 );
    buried_add_player_dialogue( "player", "kill", "headchopper", "kill_headchopper", undefined, 15 );
    buried_add_player_dialogue( "player", "kill", "subwoofer", "kill_subwoofer", undefined, 15 );
    buried_add_player_dialogue( "player", "kill", "six_shooter", "kill_six_shooter", undefined, 15 );
    buried_add_player_dialogue( "player", "perk", "specialty_armorvest", "perk_jugga", undefined, 100 );
    buried_add_player_dialogue( "player", "perk", "specialty_quickrevive", "perk_revive", undefined, 100 );
    buried_add_player_dialogue( "player", "perk", "specialty_fastreload", "perk_speed", undefined, 100 );
    buried_add_player_dialogue( "player", "perk", "specialty_rof", "perk_doubletap", undefined, 100 );
    buried_add_player_dialogue( "player", "perk", "specialty_longersprint", "perk_stamine", undefined, 100 );
    buried_add_player_dialogue( "player", "perk", "specialty_additionalprimaryweapon", "perk_mule", undefined, 100 );
    buried_add_player_dialogue( "player", "perk", "specialty_nomotionsensor", "perk_vulture", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "revive_up", "heal_revived", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "exert_sigh", "exert_sigh", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "exert_laugh", "exert_laugh", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "pain_high", "pain_high", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "build_pickup", "build_pickup", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "build_swap", "build_swap", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "build_add", "build_add", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "build_final", "build_final", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "build_wrong_part", "build_wrong_part", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "build_need_part", "build_need_part", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "build_hc_final", "build_hc_final", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "build_pck_bheadchopper_zm", "build_hc_take", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "build_plc_headchopper_zm", "build_hc_drop", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "build_pck_wheadchopper_zm", "build_hc_pickup", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "build_sw_final", "build_sw_final", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "build_pck_bsubwoofer_zm", "build_sw_take", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "build_plc_subwoofer_zm", "build_sw_drop", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "build_pck_wsubwoofer_zm", "build_sw_pickup", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "build_trb_final", "build_trb_final", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "build_pck_bturbine", "build_trb_take", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "build_plc_turbine", "build_trb_drop", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "build_pck_wturbine", "build_trb_pickup", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "build_stm_final", "build_stm_final", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "build_pck_bspringpad_zm", "build_stm_take", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "build_plc_springpad_zm", "build_stm_drop", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "build_pck_wspringpad_zm", "build_stm_pickup", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "gunshop_chalk_pickup", "gunshop_chalk", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "booze_pickup", "pickup_booze", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "candy_pickup", "pickup_candy", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "key_pickup", "pickup_key", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "first_bersek", "sloth_1st_bottle", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "sloth_generic_feed", "sloth_generic_feed", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "sloth_retreat_cell", "sloth_retreat_cell", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "sloth_clears_path", "sloth_clears_path", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "sloth_unlocked", "sloth_unlocked", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "sloth_run", "sloth_run", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "sloth_encounter", "sloth_encounter", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "sloth_crawler", "sloth_crawler", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "ghost_theft", "ghost_theft", undefined, 25 );
    buried_add_player_dialogue( "player", "general", "ghost_damage", "ghost_damage", undefined, 25 );
    buried_add_player_dialogue( "player", "general", "vulture_stink", "react_stink", "vulture_stink_react", 25 );
    buried_add_player_dialogue( "player", "general", "vulture_stink_react", "response_stink", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "vulture_ammo_drop", "ammo_drop", undefined, 15 );
    buried_add_player_dialogue( "player", "general", "vulture_money_drop", "money_drop", undefined, 15 );
    buried_add_player_dialogue( "player", "general", "throw_bomb", "throw_bomb", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "activate_bomb", "activate_bomb", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "ammo_switch", "ammo_switch", undefined, 100 );
    buried_add_player_dialogue( "player", "power", "power_on", "power_on", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "reboard", "rebuild_boards", undefined, 50 );
    buried_add_player_dialogue( "player", "general", "generic_wall_buy", "generic_wall_buy", undefined, 25 );
    buried_add_player_dialogue( "player", "general", "favorite_wall_buy", "favorite_wall_buy", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "in_maze", "in_maze", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "game_start", "game_start", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "find_town", "find_town", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "stay_topside", "stay_topside", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "fall_down_hole", "fall_down_hole", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "fall_down_hole_response", "fall_response", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "pap_wait", "pap_wait", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "pap_arm", "pap_arm", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "pap_wait2", "pap_wait2", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "pap_arm2", "pap_arm2", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "weapon_storage", "weapon_storage", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "wall_withdrawl", "wall_withdrawl", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "bank_deposit", "bank_deposit", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "bank_withdrawl", "bank_withdrawl", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "achievement", "earn_acheivement", undefined, 100 );
    buried_add_player_dialogue( "player", "quest", "find_secret", "find_secret", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "upgrade", "find_secret", undefined, 100 );
    buried_add_player_dialogue( "player", "general", "invisible_collision", "invisible_collision", undefined, 25 );
    buried_add_player_dialogue( "player", "general", "stuhlinger_possessed", "stuhlinger_2nd_possession_1", undefined, 100 );
}

buried_add_player_dialogue( speaker, category, type, alias, response, chance )
{
    level.vox zmbvoxadd( speaker, category, type, alias, response );

    if ( isdefined( chance ) )
        add_vox_response_chance( type, chance );
}

buried_audio_custom_response_line( player, index, category, type )
{
    if ( type == "vulture_stink" )
    {
        a_players = getplayers();
        arrayremovevalue( a_players, player );

        if ( a_players.size > 0 )
        {
            a_closest = get_array_of_closest( player.origin, a_players );

            for ( i = 0; i < a_closest.size; i++ )
            {
                if ( !( isdefined( a_closest[i].dontspeak ) && a_closest[i].dontspeak ) )
                {
                    if ( isalive( a_closest[i] ) )
                    {
                        n_dist = distance2dsquared( player.origin, a_closest[i].origin );

                        if ( n_dist <= 250000 )
                        {
                            a_closest[i] thread maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "vulture_stink_react" );
                            return;
                        }
                    }
                }
            }
        }
    }

    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;
    }
}

buried_audio_get_mod_type_override( impact, mod, weapon, zombie, instakill, dist, player )
{
    close_dist = 4096;
    med_dist = 15376;
    far_dist = 75625;
    a_str_mod = [];

    if ( isdefined( zombie.damageweapon ) && zombie.damageweapon == "cymbal_monkey_zm" )
        a_str_mod[a_str_mod.size] = "monkey";

    if ( weapon == "slowgun_zm" || weapon == "slowgun_upgraded_zm" )
        a_str_mod[a_str_mod.size] = "paralyzer";

    if ( weapon == "rnma_zm" || weapon == "rnma_upgraded_zm" )
        a_str_mod[a_str_mod.size] = "six_shooter";

    if ( is_headshot( weapon, impact, mod ) && dist >= far_dist )
        a_str_mod[a_str_mod.size] = "headshot";

    if ( is_explosive_damage( mod ) && weapon != "ray_gun_zm" && weapon != "ray_gun_upgraded_zm" && weapon != "raygun_mark2_zm" && weapon != "raygun_mark2_upgraded_zm" && !( isdefined( zombie.is_on_fire ) && zombie.is_on_fire ) )
    {
        if ( !isinarray( a_str_mod, "monkey" ) )
        {
            if ( !instakill )
                a_str_mod[a_str_mod.size] = "explosive";
            else
                a_str_mod[a_str_mod.size] = "weapon_instakill";
        }
    }

    if ( weapon == "ray_gun_zm" || weapon == "ray_gun_upgraded_zm" )
    {
        if ( !isinarray( a_str_mod, "monkey" ) )
        {
            if ( dist > far_dist )
            {
                if ( !instakill )
                    a_str_mod[a_str_mod.size] = "raygun";
                else
                    a_str_mod[a_str_mod.size] = "weapon_instakill";
            }
        }
    }

    if ( weapon == "raygun_mark2_zm" || weapon == "raygun_mark2_upgraded_zm" )
    {
        if ( !isinarray( a_str_mod, "monkey" ) )
        {
            if ( dist > far_dist )
            {
                if ( !instakill )
                    a_str_mod[a_str_mod.size] = "raymk2";
                else
                    a_str_mod[a_str_mod.size] = "weapon_instakill";
            }
        }
    }

    if ( instakill )
    {
        if ( mod == "MOD_MELEE" )
            a_str_mod[a_str_mod.size] = "melee_instakill";
        else
            a_str_mod[a_str_mod.size] = "weapon_instakill";
    }

    if ( mod != "MOD_MELEE" && !zombie.has_legs )
        a_str_mod[a_str_mod.size] = "crawler";

    if ( mod != "MOD_BURNED" && dist < close_dist )
        a_str_mod[a_str_mod.size] = "closekill";

    if ( a_str_mod.size == 0 )
        str_mod_final = "default";
    else if ( a_str_mod.size == 1 )
        str_mod_final = a_str_mod[0];
    else
    {
        for ( i = 0; i < a_str_mod.size; i++ )
        {
            if ( cointoss() )
                str_mod_final = a_str_mod[i];
        }

        str_mod_final = a_str_mod[randomint( a_str_mod.size )];
    }

    return str_mod_final;
}

buried_custom_zombie_gibbed_vo()
{
    self endon( "death" );

    if ( isdefined( self.a.gib_ref ) && isalive( self ) )
    {
        if ( self.a.gib_ref == "no_legs" || self.a.gib_ref == "right_leg" || self.a.gib_ref == "left_leg" )
        {
            if ( isdefined( self.attacker ) && isplayer( self.attacker ) )
            {
                if ( isdefined( self.attacker.crawler_created_vo_cooldown ) && self.attacker.crawler_created_vo_cooldown )
                    return;

                rand = randomintrange( 0, 100 );

                if ( rand < 15 )
                {
                    self.attacker maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "crawl_spawn" );
                    self.attacker thread crawler_created_vo_cooldown();
                }
            }
        }
        else if ( isdefined( self.a.gib_ref ) && ( self.a.gib_ref == "right_arm" || self.a.gib_ref == "left_arm" ) )
        {
            if ( self.has_legs && isalive( self ) )
            {
                if ( isdefined( self.attacker ) && isplayer( self.attacker ) )
                {
                    rand = randomintrange( 0, 100 );

                    if ( rand < 7 )
                        self.attacker create_and_play_dialog( "general", "shoot_arm" );
                }
            }
        }
    }
}

crawler_created_vo_cooldown()
{
    self endon( "disconnect" );
    self.crawler_created_vo_cooldown = 1;
    wait 30;
    self.crawler_created_vo_cooldown = 0;
}

buried_audio_custom_weapon_check( weapon, magic_box )
{
    self endon( "death" );
    self endon( "disconnect" );

    if ( isdefined( magic_box ) && magic_box )
    {
        type = self maps\mp\zombies\_zm_weapons::weapon_type_check( weapon );
        return type;
    }

    if ( flag( "time_bomb_restore_active" ) )
        return "crappy";

    if ( issubstr( weapon, "upgraded" ) )
    {
        self thread maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "wpck_pap" );
        return "crappy";
    }
    else if ( weapon == "ray_gun_zm" )
    {
        self thread maps\mp\zombies\_zm_audio::create_and_play_dialog( "weapon_pickup", "ray_gun_zm" );
        return "crappy";
    }
    else if ( weapon == "raygun_mark2_zm" )
    {
        self thread maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "build_take_raygun" );
        return "crappy";
    }
    else if ( isdefined( self.favorite_wall_weapons_list ) )
    {
        foreach ( fav_weapon in self.favorite_wall_weapons_list )
        {
            if ( weapon == fav_weapon )
            {
                self thread maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "favorite_wall_buy" );
                return "crappy";
            }
        }
    }

    self thread maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "generic_wall_buy" );
    return "crappy";
}

buried_custom_zombie_oh_shit_vox()
{
    self endon( "death_or_disconnect" );

    while ( true )
    {
        wait 1;

        if ( isdefined( self.oh_shit_vo_cooldown ) && self.oh_shit_vo_cooldown )
            continue;

        players = get_players();
        zombs = get_round_enemy_array();

        if ( players.size <= 1 )
            n_cooldown_time = 20;
        else
            n_cooldown_time = 15;

        n_distance_sq = 62500;
        n_zombies = 5;
        n_chance = 30;
        close_zombs = 0;

        for ( i = 0; i < zombs.size; i++ )
        {
            if ( isdefined( zombs[i].favoriteenemy ) && zombs[i].favoriteenemy == self || !isdefined( zombs[i].favoriteenemy ) )
            {
                if ( distancesquared( zombs[i].origin, self.origin ) < n_distance_sq )
                    close_zombs++;
            }
        }

        if ( close_zombs >= n_zombies )
        {
            if ( randomint( 100 ) < n_chance && !( isdefined( self.isonbus ) && self.isonbus ) )
            {
                self maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "oh_shit" );
                self thread global_oh_shit_cooldown_timer( n_cooldown_time );
            }
        }
    }
}

global_oh_shit_cooldown_timer( n_cooldown_time )
{
    self endon( "disconnect" );
    self.oh_shit_vo_cooldown = 1;
    wait( n_cooldown_time );
    self.oh_shit_vo_cooldown = 0;
}

establish_mystery_wallbuy_categories()
{
    level.good_mystery_wallbuy = [];
    level.good_mystery_wallbuy[0] = "ak74u_zm";
    level.good_mystery_wallbuy[1] = "pdw57_zm";
    level.good_mystery_wallbuy[2] = "tazer_knuckles_zm";
    level.bad_mystery_wallbuy = [];
    level.bad_mystery_wallbuy[0] = "an94_zm";
    level.bad_mystery_wallbuy[1] = "svu_zm";
    level.bad_mystery_wallbuy[2] = "870mcs_zm";
}

buried_player_track_ammo_count()
{
    self notify( "stop_ammo_tracking" );
    self endon( "disconnect" );
    self endon( "stop_ammo_tracking" );
    ammolowcount = 0;
    ammooutcount = 0;

    while ( true )
    {
        wait 0.5;
        weap = self getcurrentweapon();

        if ( !isdefined( weap ) || weap == "none" || !can_track_ammo( weap ) )
            continue;

        if ( self getammocount( weap ) > 5 || self maps\mp\zombies\_zm_laststand::player_is_in_laststand() )
        {
            ammooutcount = 0;
            ammolowcount = 0;
            continue;
        }

        if ( self getammocount( weap ) > 0 )
        {
            if ( ammolowcount < 1 )
            {
                self maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "ammo_low" );
                ammolowcount++;
            }
        }
        else if ( ammooutcount < 1 )
        {
            a_weapons = self getweaponslistprimaries();

            if ( a_weapons.size > 1 )
            {
                foreach ( weapon in a_weapons )
                {
                    if ( weapon == weap )
                        continue;
                    else if ( self getammocount( weapon ) > 0 )
                    {
                        self maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "ammo_switch" );
                        self.ammo_switch_vo_played = 1;
                        break;
                    }
                }

                if ( !( isdefined( self.ammo_switch_vo_played ) && self.ammo_switch_vo_played ) )
                {
                    self maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "ammo_out" );
                    ammooutcount++;
                }

                self.ammo_switch_vo_played = 0;
            }
            else
            {
                self maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "ammo_out" );
                ammooutcount++;
            }
        }

        wait 20;
    }
}

zm_buried_buildable_pickedup_vo()
{
    self.buildable_pickedup_timer = 0;
}

ghost_steal_vo_watcher()
{
    while ( true )
    {
        level waittill( "ghost_drained_player", player );

        chance = get_response_chance( "ghost_theft" );

        if ( chance > randomintrange( 1, 100 ) )
            player thread maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "ghost_theft" );
    }
}

ghost_damage_vo_watcher()
{
    while ( true )
    {
        level waittill( "ghost_damaged_player", player );

        chance = get_response_chance( "ghost_damage" );

        if ( chance > randomintrange( 1, 100 ) )
            player thread maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "ghost_damage" );
    }
}

buried_custom_buildable_need_part_vo()
{
    self endon( "death" );
    self endon( "disconnect" );

    if ( !( isdefined( self.build_need_part_vo_cooldown ) && self.build_need_part_vo_cooldown ) )
    {
        self thread maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "build_need_part" );
        self thread buildable_need_part_vo_cooldown();
    }
}

buildable_need_part_vo_cooldown()
{
    self endon( "disconnect" );
    self.build_need_part_vo_cooldown = 1;
    wait 60;
    self.build_need_part_vo_cooldown = 0;
}

buried_custom_buildable_wrong_part_vo()
{
    self endon( "death" );
    self endon( "disconnect" );

    if ( !( isdefined( self.build_wrong_part_vo_cooldown ) && self.build_wrong_part_vo_cooldown ) )
    {
        self thread maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "build_wrong_part" );
        self thread buildable_wrong_part_vo_cooldown();
    }
}

buildable_wrong_part_vo_cooldown()
{
    self endon( "disconnect" );
    self.build_wrong_part_vo_cooldown = 1;
    wait 60;
    self.build_wrong_part_vo_cooldown = 0;
}

buried_custom_bank_deposit_vo()
{
    self thread maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "bank_deposit" );
}

buried_custom_bank_withdrawl_vo()
{
    self thread maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "bank_withdrawl" );
}

sloth_first_encounter_vo()
{
    trigger = getent( "sloth_first_encounter_trigger", "targetname" );

    while ( true )
    {
        trigger waittill( "trigger", ent );

        if ( isplayer( ent ) )
        {
            if ( ent is_player_looking_at( level.sloth.origin, 0.25, 0 ) )
            {
                ent thread maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "sloth_encounter" );
                trigger delete();
                break;
            }
        }

        wait 0.1;
    }
}

sloth_crawler_vo()
{
    while ( true )
    {
        if ( !isdefined( level.sloth ) )
        {
            wait 1.0;
            continue;
        }

        if ( level.sloth is_jail_state() )
        {
            wait 1.0;
            continue;
        }

        if ( level.sloth.state == "berserk" || level.sloth.state == "crash" )
        {
            wait 1.0;
            continue;
        }

        if ( isdefined( level.sloth.carrying_crawler ) && level.sloth.carrying_crawler )
        {
            wait 1.0;
            continue;
        }

        if ( isdefined( level.time_bomb_detonation_vo ) && level.time_bomb_detonation_vo )
        {
            wait 1.0;
            continue;
        }

        zombies = get_round_enemy_array();

        for ( i = 0; i < zombies.size; i++ )
        {
            zombie = zombies[i];

            if ( isdefined( zombie ) && !( isdefined( zombie.has_legs ) && zombie.has_legs ) )
            {
                a_players = getplayers();

                foreach ( player in a_players )
                {
                    if ( is_player_valid( player ) && !( isdefined( player.isspeaking ) && player.isspeaking ) )
                    {
                        if ( player is_player_looking_at( zombie.origin, 0.25 ) )
                        {
                            if ( distancesquared( player.origin, level.sloth.origin ) < 9000000 )
                            {
                                player thread maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "sloth_crawler" );
                                wait 10.0;
                            }
                        }
                    }
                }
            }
        }

        wait 1.0;
    }
}

collapsing_catwalk_init()
{
    level endon( "catwalk_collapsed" );
    trig = getent( "start_platform_trig", "targetname" );
    platform = getent( "start_platform", "targetname" );

    while ( true )
    {
        trig waittill( "trigger", who );

        if ( isplayer( who ) )
        {
            if ( !( isdefined( who.on_platform ) && who.on_platform ) )
            {
                trig thread collapsing_platform_watcher( who, platform );
                return;
            }
        }
    }
}

collapsing_platform_watcher( who, platform )
{
    who.on_platform = 1;
    timed_collapse = 0;

    if ( isdefined( platform ) )
        platform playsound( "zmb_catwalk_shake" );

    jump_blocker_clip = getent( "start_platform_delayed_clip", "targetname" );
    earthquake( 0.3, 3, who.origin, 128 );
    level waittill_notify_or_timeout( "lsat_purchased", 2 );

    if ( isdefined( who ) )
    {
        who notify( "platform_collapse" );
        who.on_platform = 0;
    }

    if ( isdefined( platform ) )
    {
        exploder( 410 );
        platform notsolid();
        level setclientfield( "cw_fall", 1 );
        platform playsound( "zmb_catwalk_fall" );

        if ( isdefined( platform.pieces ) )
            array_thread( platform.pieces, ::self_delete );

        if ( isdefined( platform ) )
            platform delete();
    }

    wait 3;
    level notify( "catwalk_collapsed" );
    level.catwalk_collapsed = 1;

    if ( isdefined( jump_blocker_clip ) )
        jump_blocker_clip delete();

    if ( isdefined( self ) )
        self delete();
}

achievement_watcher_lsat_upgrade()
{
    level endon( "end_game" );
    self endon( "disconnect" );

    do
        self waittill( "pap_taken" );
    while ( !self maps\mp\zombies\_zm_weapons::has_weapon_or_attachments( "lsat_upgraded_zm" ) );

    self notify( "player_upgraded_lsat_from_wall" );
}

player_give_lsat()
{
    level notify( "lsat_purchased" );

    if ( !( isdefined( level.catwalk_collapsed ) && level.catwalk_collapsed ) )
    {
        self maps\mp\zombies\_zm_stats::increment_client_stat( "buried_lsat_purchased", 0 );
        self maps\mp\zombies\_zm_stats::increment_player_stat( "buried_lsat_purchased" );
        level.lsat_purchased = 1;
    }

    self thread achievement_watcher_lsat_upgrade();
    self giveweapon( "lsat_zm" );
    maps\mp\zombies\_zm_weapons::acquire_weapon_toggle( "lsat_zm", self );
    self givestartammo( "lsat_zm" );
    self switchtoweapon( "lsat_zm" );
}

bell_watch()
{
    bells = getentarray( "church_bell", "targetname" );
    array_thread( bells, ::bell_watch_ring );
}

bell_watch_ring()
{
    self endon( "delete" );
    self setcandamage( 1 );

    while ( true )
    {
        self waittill( "damage", amount, attacker, direction, point, mod, tagname, modelname, partname, weaponname );

        bell_ring( attacker, self );
    }
}

bell_ring( player, bell )
{
    level notify( "bell_rung", player );
/#

#/
    bell playsound( "amb_church_bell" );
}

player_force_from_prone()
{
    level endon( "intermission" );
    level endon( "end_game" );

    while ( true )
    {
        self waittill( "trigger", who );

        if ( isplayer( who ) && who getstance() == "prone" )
            who setstance( "crouch" );

        wait 0.1;
    }
}

check_valid_poi( valid )
{
    excludes = getentarray( "cymbal_monkey_exclude", "targetname" );

    if ( isdefined( excludes ) )
    {
        foreach ( volume in excludes )
        {
            if ( self istouching( volume ) )
                return 0;
        }
    }

    if ( self maps\mp\zombies\_zm_zonemgr::entity_in_zone( "zone_mansion" ) )
        return 0;

    return valid;
}

tear_into_position()
{
    asd_name = "zm_zbarrier_board_tear_in";
    substate_index = self.attacking_spot_index * 6;
    anim_id = self getanimfromasd( asd_name, substate_index );
    zbarrier = self.first_node.zbarrier;
    start_org = getstartorigin( zbarrier.origin, zbarrier.angles, anim_id );
    start_ang = getstartangles( zbarrier.origin, zbarrier.angles, anim_id );
    self setgoalpos( start_org, start_ang );
    self thread tear_into_facing( start_org, start_ang );
}

tear_into_facing( start_org, start_ang )
{
    self endon( "death" );
    facing_dist = 256;

    while ( true )
    {
        dist = distancesquared( self.origin, start_org );

        if ( dist < facing_dist )
            break;

        wait 0.1;
    }

    self orientmode( "face angle", start_ang[1] );
}

tear_into_wait()
{

}

melee_miss_func()
{
    if ( isdefined( self.enemy ) )
    {
        if ( isdefined( level.sloth ) )
        {
            sloth_dist_sq = distancesquared( self.enemy.origin, level.sloth.origin );

            if ( sloth_dist_sq < 225 )
            {
                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" );
            }
        }
    }
}

equipment_planted( weapon, equipname, groundfrom )
{

}

equipment_safe_to_drop( weapon )
{
    if ( isdefined( weapon.model ) && issubstr( weapon.model, "chopper" ) )
    {
        if ( maps\mp\zombies\_zm_equip_headchopper::check_headchopper_in_bad_area( weapon.origin ) )
            return false;
    }

    valid_location = check_point_in_enabled_zone( weapon.origin, undefined, undefined );

    if ( !( isdefined( valid_location ) && valid_location ) )
    {
        if ( weapon in_playable_area() )
            return true;

        return false;
    }

    return true;
}

ignore_equipment( zombie )
{
    if ( !( isdefined( zombie.completed_emerging_into_playable_area ) && zombie.completed_emerging_into_playable_area ) )
        return true;

    if ( isdefined( zombie.is_ghost ) && zombie.is_ghost )
        return true;

    if ( isdefined( zombie.is_sloth ) && zombie.is_sloth )
        return true;

    if ( isdefined( self.equipname ) && self.equipname == "equip_headchopper_zm" )
    {
        if ( isdefined( self.headchopper_kills ) && self.headchopper_kills < 10 )
            return true;
        else if ( isdefined( zombie.headchopper_last_damage_time ) )
        {
            currenttime = gettime();

            if ( currenttime - zombie.headchopper_last_damage_time <= 2500 )
                return true;
        }
    }

    return false;
}

buried_paralyzer_check()
{
    curr_zone = self get_current_zone();

    if ( isdefined( curr_zone ) )
    {
        if ( curr_zone == "zone_mansion" )
            return false;

        if ( curr_zone == "zone_start" && self.origin[2] < 1222 )
            return false;
    }

    return true;
}

is_courthouse_open()
{
    if ( flag( "courthouse_door1" ) )
        return true;

    if ( flag( "tunnel2saloon" ) && flag( "tunnels2courthouse" ) )
        return true;

    return false;
}

is_tunnel_open()
{
    if ( flag( "tunnel2saloon" ) )
        return true;

    if ( flag( "tunnels2courthouse" ) && maps\mp\zm_buried::is_courthouse_open() )
        return true;

    return false;
}
