// 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_transit_utility;
#include maps\mp\zombies\_zm_buildables;
#include maps\mp\zm_highrise_elevators;
#include maps\mp\zombies\_zm_unitrigger;

init_buildables()
{
    level.buildable_piece_count = 13;
    add_zombie_buildable( "springpad_zm", &"ZM_HIGHRISE_BUILD_SPRINGPAD", &"ZM_HIGHRISE_BUILDING_SPRINGPAD", &"ZM_HIGHRISE_BOUGHT_SPRINGPAD" );
    add_zombie_buildable( "slipgun_zm", &"ZM_HIGHRISE_BUILD_SLIPGUN", &"ZM_HIGHRISE_BUILDING_SLIPGUN", &"ZM_HIGHRISE_BOUGHT_SLIPGUN" );
    add_zombie_buildable( "keys_zm", &"ZM_HIGHRISE_BUILD_KEYS", &"ZM_HIGHRISE_BUILDING_KEYS", &"ZM_HIGHRISE_BOUGHT_KEYS" );
    add_zombie_buildable( "ekeys_zm", &"ZM_HIGHRISE_BUILD_KEYS", &"ZM_HIGHRISE_BUILDING_KEYS", &"ZM_HIGHRISE_BOUGHT_KEYS" );
    add_zombie_buildable( "sq_common", &"ZOMBIE_BUILD_SQ_COMMON", &"ZOMBIE_BUILDING_SQ_COMMON" );
}

include_buildables()
{
    springpad_door = generate_zombie_buildable_piece( "springpad_zm", "p6_zm_buildable_tramplesteam_door", 32, 64, 0, "zom_hud_trample_steam_screen", ::onpickup_common, ::ondrop_common, undefined, "Tag_part_02", undefined, 1 );
    springpad_flag = generate_zombie_buildable_piece( "springpad_zm", "p6_zm_buildable_tramplesteam_bellows", 48, 15, 0, "zom_hud_trample_steam_bellow", ::onpickup_common, ::ondrop_common, undefined, "Tag_part_04", undefined, 2 );
    springpad_motor = generate_zombie_buildable_piece( "springpad_zm", "p6_zm_buildable_tramplesteam_compressor", 48, 15, 0, "zom_hud_trample_steam_compressor", ::onpickup_common, ::ondrop_common, undefined, "Tag_part_01", undefined, 3 );
    springpad_whistle = generate_zombie_buildable_piece( "springpad_zm", "p6_zm_buildable_tramplesteam_flag", 48, 15, 0, "zom_hud_trample_steam_whistle", ::onpickup_common, ::ondrop_common, undefined, "Tag_part_03", undefined, 4 );
    springpad = spawnstruct();
    springpad.name = "springpad_zm";
    springpad add_buildable_piece( springpad_door );
    springpad add_buildable_piece( springpad_flag );
    springpad add_buildable_piece( springpad_motor );
    springpad add_buildable_piece( springpad_whistle );
    springpad.triggerthink = ::springpadbuildable;
    include_buildable( springpad );
    slipgun_canister = generate_zombie_buildable_piece( "slipgun_zm", "t6_zmb_buildable_slipgun_extinguisher", 32, 64, 0, "zom_hud_icon_buildable_slip_ext", ::onpickup_common, ::ondrop_common, undefined, "TAG_CO2", undefined, 5 );
    slipgun_cooker = generate_zombie_buildable_piece( "slipgun_zm", "t6_zmb_buildable_slipgun_cooker", 48, 15, 0, "zom_hud_icon_buildable_slip_cooker", ::onpickup_common, ::ondrop_common, undefined, "TAG_COOKER", undefined, 6 );
    slipgun_foot = generate_zombie_buildable_piece( "slipgun_zm", "t6_zmb_buildable_slipgun_foot", 48, 15, 0, "zom_hud_icon_buildable_slip_foot", ::onpickup_common, ::ondrop_common, undefined, "TAG_FOOT", undefined, 7 );
    slipgun_throttle = generate_zombie_buildable_piece( "slipgun_zm", "t6_zmb_buildable_slipgun_throttle", 48, 15, 0, "zom_hud_icon_buildable_slip_handle", ::onpickup_common, ::ondrop_common, undefined, "TAG_THROTTLE", undefined, 8 );
    slipgun = spawnstruct();
    slipgun.name = "slipgun_zm";
    slipgun add_buildable_piece( slipgun_canister );
    slipgun add_buildable_piece( slipgun_cooker );
    slipgun add_buildable_piece( slipgun_foot );
    slipgun add_buildable_piece( slipgun_throttle );
    slipgun.onbuyweapon = ::onbuyweapon_slipgun;
    slipgun.triggerthink = ::slipgunbuildable;
    slipgun.onuseplantobject = ::onuseplantobject_slipgun;
    include_buildable( slipgun );
    key_chain = generate_zombie_buildable_piece( "keys_zm", "P6_zm_hr_key", 32, 64, 2.4, "zom_hud_icon_epod_key", ::onpickup_keys, ::ondrop_keys, undefined, undefined, 0, 9 );
    key_chain.onspawn = ::onspawn_keys;
    key_chain manage_multiple_pieces( 4 );
    key = spawnstruct();
    key.name = "keys_zm";
    key add_buildable_piece( key_chain );
    key.triggerthink = ::keysbuildable;
    key.onuseplantobject = ::onuseplantobject_escapepodkey;
    key.buildablepieces[0].onspawn = ::onspawn_keys;
    include_buildable( key );
    ekey = spawnstruct();
    ekey.name = "ekeys_zm";
    ekey add_buildable_piece( key_chain );
    ekey.triggerthink = ::ekeysbuildable;
    ekey.onuseplantobject = ::onuseplantobject_elevatorkey;
    ekey.buildablepieces[0].onspawn = ::onspawn_keys;
    include_buildable( ekey );

    if ( !isdefined( level.gamedifficulty ) || level.gamedifficulty != 0 )
    {
        sq_common_electricbox = generate_zombie_buildable_piece( "sq_common", "p6_zm_buildable_sq_electric_box", 32, 64, 0, "zm_hud_icon_sq_powerbox", ::onpickup_common, ::ondrop_common, undefined, "tag_part_02", undefined, 10 );
        sq_common_meteor = generate_zombie_buildable_piece( "sq_common", "p6_zm_buildable_sq_meteor", 32, 64, 0, "zm_hud_icon_sq_meteor", ::onpickup_common, ::ondrop_common, undefined, "tag_part_04", undefined, 11 );
        sq_common_scaffolding = generate_zombie_buildable_piece( "sq_common", "p6_zm_buildable_sq_scaffolding", 64, 96, 0, "zm_hud_icon_sq_scafold", ::onpickup_common, ::ondrop_common, undefined, "tag_part_01", undefined, 12 );
        sq_common_transceiver = generate_zombie_buildable_piece( "sq_common", "p6_zm_buildable_sq_transceiver", 64, 96, 0, "zm_hud_icon_sq_tranceiver", ::onpickup_common, ::ondrop_common, undefined, "tag_part_03", undefined, 13 );
        sqcommon = spawnstruct();
        sqcommon.name = "sq_common";
        sqcommon add_buildable_piece( sq_common_electricbox );
        sqcommon add_buildable_piece( sq_common_meteor );
        sqcommon add_buildable_piece( sq_common_scaffolding );
        sqcommon add_buildable_piece( sq_common_transceiver );
        sqcommon.triggerthink = ::sqcommonbuildable;
        include_buildable( sqcommon );
        maps\mp\zombies\_zm_buildables::hide_buildable_table_model( "sq_common_buildable_trigger" );
    }
}

springpadbuildable()
{
    maps\mp\zombies\_zm_buildables::buildable_trigger_think( "springpad_zm_buildable_trigger", "springpad_zm", "equip_springpad_zm", &"ZM_HIGHRISE_GRAB_SPRINGPAD", 1, 1 );
}

slipgunbuildable()
{
    level thread wait_for_slipgun();

    if ( !( isdefined( level.slipgun_as_equipment ) && level.slipgun_as_equipment ) )
        persist = 2;
    else
        persist = 1;

    maps\mp\zombies\_zm_buildables::buildable_trigger_think( "slipgun_zm_buildable_trigger", "slipgun_zm", "slipgun_zm", &"ZM_HIGHRISE_GRAB_SLIPGUN", 1, persist );
}

keysbuildable()
{
    pod_key = maps\mp\zombies\_zm_buildables::buildable_trigger_think( "escape_pod_key_console_trigger", "keys_zm", "keys_zm", "", 1, 3 );
    pod_key.prompt_and_visibility_func = ::escape_pod_key_prompt;
}

ekeysbuildable()
{
    elevator_keys = maps\mp\zombies\_zm_buildables::buildable_trigger_think_array( "elevator_key_console_trigger", "ekeys_zm", "keys_zm", "", 1, 3 );

    foreach ( stub in elevator_keys )
    {
        stub.prompt_and_visibility_func = ::elevator_key_prompt;
        stub.buildablezone.stat_name = "keys_zm";
    }
}

ondrop_common( player )
{
/#
    println( "ZM >> Common part callback onDrop()" );
#/
    self droponelevator( player );
    self.piece_owner = undefined;
}

onpickup_common( player )
{
/#
    println( "ZM >> Common part callback onPickup()" );
#/
    player playsound( "zmb_buildable_pickup" );
    self pickupfromelevator();
    self.piece_owner = player;
}

sqcommonbuildable()
{
    level.sq_buildable = maps\mp\zombies\_zm_buildables::buildable_trigger_think( "sq_common_buildable_trigger", "sq_common", "sq_common", "", 1, 0 );
}

onbuyweapon_slipgun( player )
{
    player givestartammo( self.stub.weaponname );
    player switchtoweapon( self.stub.weaponname );
    level notify( "slipgun_bought", player );
}

wait_for_slipgun()
{
    level.zombie_include_weapons["slipgun_zm"] = 0;

    if ( !( isdefined( level.slipgun_as_equipment ) && level.slipgun_as_equipment ) )
    {
        level waittill( "slipgun_bought", player );

        level.zombie_include_weapons["slipgun_zm"] = 1;
        level.zombie_weapons["slipgun_zm"].is_in_box = 1;
    }
}

keyscreateglint()
{
    if ( !isdefined( self.model.glint_fx ) )
        playfxontag( level._effect["elevator_glint"], self.model, "tag_origin" );
}

onspawn_keys()
{
    self keyscreateglint();
}

ondrop_keys( player )
{
    self keyscreateglint();
}

onpickup_keys( player )
{

}

escape_pod_key_prompt( player )
{
    if ( !flag( "escape_pod_needs_reset" ) )
    {
        self.stub.hint_string = "";
        self sethintstring( self.stub.hint_string );
        return 0;
    }

    return self buildabletrigger_update_prompt( player );
}

onuseplantobject_escapepodkey( player )
{
    level notify( "reset_escape_pod" );
}

watch_elevator_prompt( player, trig )
{
    player notify( "watch_elevator_prompt" );
    player endon( "watch_elevator_prompt" );
    trig endon( "kill_trigger" );

    while ( true )
    {
        trig.stub.elevator waittill( "floor_changed" );

        if ( isdefined( self.stub.elevator ) )
        {
            if ( trig.stub.elevator maps\mp\zm_highrise_elevators::elevator_is_on_floor( trig.stub.floor ) )
            {
                thread maps\mp\zombies\_zm_unitrigger::cleanup_trigger( trig, player );
                return;
            }
        }
    }
}

elevator_key_prompt( player )
{
    if ( !isdefined( self.stub.elevator ) )
    {
        elevatorname = self.stub.script_noteworthy;

        if ( isdefined( elevatorname ) && isdefined( self.stub.script_parameters ) )
        {
            elevator = level.elevators[elevatorname];
            floor = int( self.stub.script_parameters );
            flevel = elevator maps\mp\zm_highrise_elevators::elevator_level_for_floor( floor );
            self.stub.elevator = elevator;
            self.stub.floor = flevel;
        }
    }
/#
    if ( !isdefined( self.stub.elevator ) )
    {
        if ( isdefined( self.stub.script_noteworthy ) )
            error( "Cannot locate elevator " + self.stub.script_noteworthy );
        else
            error( "Cannot locate elevator " );
    }
    else
    {
        color = vectorscale( ( 0, 0, 1 ), 0.7 );
        stop = self.stub.floor;
        floor = self.stub.elevator.floors["" + stop].script_location;
        text = "call " + self.stub.script_noteworthy + " to stop " + stop + " floor " + floor + "";

        if ( getdvarint( _hash_B67910B4 ) )
            print3d( self.stub.origin, text, color, 1, 0.5, 300 );
    }
#/
    if ( isdefined( self.stub.elevator ) )
    {
        if ( self.stub.elevator maps\mp\zm_highrise_elevators::elevator_is_on_floor( self.stub.floor ) )
        {
            self.stub.hint_string = "";
            self sethintstring( self.stub.hint_string );
            return 0;
        }
    }

    if ( !flag( "power_on" ) )
    {
        self.stub.hint_string = "";
        self sethintstring( self.stub.hint_string );
        return 0;
    }

    can_use = self buildabletrigger_update_prompt( player );

    if ( can_use )
        thread watch_elevator_prompt( player, self );

    return can_use;
}

onuseplantobject_elevatorkey( player )
{
    elevatorname = self.script_noteworthy;

    if ( isdefined( elevatorname ) && isdefined( self.script_parameters ) )
    {
        floor = int( self.script_parameters );
        elevator = level.elevators[elevatorname];

        if ( isdefined( elevator ) )
        {
            elevator.body.force_starting_floor = floor;
            elevator.body notify( "forcego" );
        }
    }
}

droponelevator( player )
{
    if ( isdefined( player ) && ( isdefined( player maps\mp\zm_highrise_elevators::object_is_on_elevator() ) && player maps\mp\zm_highrise_elevators::object_is_on_elevator() ) )
    {
        self.model linkto( player.elevator_parent );
        self.linked_to_elevator = 1;
        self.unitrigger.link_parent = player.elevator_parent;
    }
    else
        self.unitrigger.link_parent = undefined;
}

pickupfromelevator()
{
    if ( isdefined( self.linked_to_elevator ) && self.linked_to_elevator )
    {
        if ( isdefined( self.model ) )
            self.model unlink();

        self.linked_to_elevator = undefined;
    }

    if ( isdefined( self.unitrigger ) )
        self.unitrigger.link_parent = undefined;
}

onuseplantobject_slipgun( player )
{
/#
    println( "ZM >> Slipgun Buildable CallBack onUsePlantObject()" );
#/
    buildable = self.buildablezone;
    first_part = "TAG_COOKER";
    second_part = "TAG_BASE";

    for ( i = 0; i < buildable.pieces.size; i++ )
    {
        if ( buildable.pieces[i].part_name == first_part )
        {
            if ( isdefined( buildable.pieces[i].built ) && buildable.pieces[i].built || player player_get_buildable_piece().part_name == first_part )
            {
                buildable.stub.model showpart( second_part );
                continue;
            }

            buildable.stub.model hidepart( second_part );
        }
    }
}
