// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool

escape_start()
{
    maps\odin_util::move_player_to_start_point( "start_odin_escape" );
    wait 0.1;
    maps\odin_util::actor_teleport( level.ally, "odin_escape_ally_tp" );
    level.ally.animname = "odin_ally";
    maps\odin_util::fx_odin_monitor_bink_init();
    thread maps\odin_util::dynamic_object_pusher();
    level.player thread maps\odin::give_weapons();
    common_scripts\utility::flag_set( "ally_clear" );
    common_scripts\utility::flag_set( "ally_out_of_z" );
    thread crew_quarters_combat();
    thread maps\odin_audio::sfx_play_alarms();
    thread maps\odin_fx::satellite_rcs_thrusters();
    maps\_utility::delaythread( 2, maps\odin_ally::post_z_push );
    wait 1;
    thread maps\odin_util::create_sliding_space_door( "z_hall_close_door", 1, 0, 0, 0, "lock_z_hall_close_door", "unlock_z_hall_close_door" );
    common_scripts\utility::flag_set( "lock_z_hall_close_door" );
}

section_precache()
{
    precacheitem( "odin_rod_missile" );
    precachestring( &"ODIN_ADS_TIP" );
    precachestring( &"ODIN_ESCAPE_DOOR_PROMPT" );
}

section_flag_init()
{
    common_scripts\utility::flag_init( "escape_clear" );
    common_scripts\utility::flag_init( "player_open_escape_door" );
    common_scripts\utility::flag_init( "kyra_push_bag_anim" );
    common_scripts\utility::flag_init( "window_VO_Done" );
    common_scripts\utility::flag_init( "remove_window_blocker" );
    common_scripts\utility::flag_init( "open_second_pod" );
    common_scripts\utility::flag_init( "escape_blocker_door_trig" );
    common_scripts\utility::flag_init( "clear_to_tweak_player" );
    common_scripts\utility::flag_init( "lock_escape_window_auto_door" );
    common_scripts\utility::flag_init( "unlock_escape_window_auto_door" );
    common_scripts\utility::flag_init( "lock_z_hall_close_door" );
    common_scripts\utility::flag_init( "lock_escape_door_blocker" );
    common_scripts\utility::flag_init( "unlock_escape_door_blocker" );
    common_scripts\utility::flag_init( "lock_spin_door_blocker" );
    common_scripts\utility::flag_init( "unlock_spin_door_blocker" );
    common_scripts\utility::flag_init( "escape_enc_activated" );
    common_scripts\utility::flag_init( "cq_killer_dead" );
    common_scripts\utility::flag_init( "enc_movement_token_taken" );
    common_scripts\utility::flag_init( "esc_combat_done" );
    common_scripts\utility::flag_init( "ready_to_fire_next_salvo" );
    common_scripts\utility::flag_init( "fire_rog" );
    common_scripts\utility::flag_init( "ally_at_console" );
    common_scripts\utility::flag_init( "ally_console_scene_done" );
    common_scripts\utility::flag_init( "destruction_sequence_started" );
    common_scripts\utility::flag_init( "objective_escape_sat" );
    common_scripts\utility::flag_init( "escape_overlap_dialogue" );
}

section_hint_string_init()
{
    maps\_utility::add_hint_string( "escape_ADS_Hint", &"ODIN_ADS_TIP", ::hints_ads_escape );
    maps\_utility::add_hint_string( "escape_door_prompt", &"ODIN_ESCAPE_DOOR_PROMPT", ::hints_ads_escape );
}

hints_ads_escape()
{
    if ( common_scripts\utility::flag( "esc_combat_done" ) || level.player adsbuttonpressed() )
        return 1;
    else
        return 0;
}

escape_main()
{
    common_scripts\utility::flag_wait( "ally_clear" );
    common_scripts\utility::flag_set( "unlock_escape_window_auto_door" );
    setsaveddvar( "ammoCounterHide", "0" );
    thread escape_combat_door();
    escape_setup();
    common_scripts\utility::flag_wait( "esc_combat_done" );
    maps\_utility::autosave_by_name( "escape_combat_done" );
    crew_quarters_aftermath();
    thread early_decomp_checker();
    ally_console_scene();
    maps\_utility::autosave_by_name( "escape_window_done" );

    if ( !common_scripts\utility::flag( "absolute_fire_decompression" ) )
        destruction_sequence();

    common_scripts\utility::flag_wait_all( "escape_clear", "player_exited_escape_hallway" );
    escape_cleanup();
}

escape_combat_door()
{
    level endon( "kyra_got_impatient" );
    thread escape_no_push_zone();
    var_0 = maps\_utility::spawn_anim_model( "space_square_hatch" );
    var_0.targetname = "escape_door_to_open";
    var_1 = getent( "player_escape_door_blocker", "targetname" );
    var_2 = getent( "player_escape_door_blocker_origin", "targetname" );
    var_3 = common_scripts\utility::getstruct( "kyra_move_node01", "targetname" );
    var_3 maps\_anim::anim_first_frame_solo( var_0, "odin_escape_open_door_player" );
    var_2 linkto( var_0, "tag_origin" );
    var_1 linkto( var_2 );
    common_scripts\utility::flag_wait( "esc_combat_done" );
    common_scripts\utility::flag_clear( "clear_to_tweak_player" );
    var_0 makeusable();
    var_0 sethintstring( &"ODIN_ESCAPE_DOOR_PROMPT" );
    var_0 waittill( "trigger" );
    thread player_escape_door_open( var_3, var_0 );
    var_0 makeunusable();
    common_scripts\utility::flag_wait( "player_open_escape_door" );
    var_3 maps\_anim::anim_single_solo( var_0, "odin_escape_open_door_player" );
    common_scripts\utility::flag_set( "clear_to_tweak_player" );
    var_1 delete();
    var_2 delete();
}

escape_no_push_zone()
{
    level endon( "escape_clear" );
    wait 1;

    while ( !common_scripts\utility::flag( "player_open_escape_door" ) )
    {
        if ( common_scripts\utility::flag( "player_at_escape_door" ) )
            common_scripts\utility::flag_set( "no_push_zone" );
        else
            common_scripts\utility::flag_clear( "no_push_zone" );

        wait 0.05;
    }
}

escape_ally_movement_start()
{
    level endon( "player_opened_escape_door" );
    var_0 = common_scripts\utility::getstruct( "kyra_move_node01", "targetname" );
    thread kyra_escape_move_bags( var_0 );
    var_0 notify( "stop_loop" );
    thread kyra_grabs_escape_gun( var_0 );
    var_0 maps\_anim::anim_single_solo( self, "odin_escape_first_encounter_end_ally01" );
    var_0 thread maps\_anim::anim_loop_solo( self, "odin_escape_first_encounter_end_loop_ally01", "stop_loop" );
    thread maps\odin_util::finale_anim_loop_killer( var_0, "stop_loop" );
    ally_wait_to_get_impatient( 4.5 );
    common_scripts\utility::flag_waitopen( "player_at_escape_door" );
    level notify( "kyra_got_impatient" );
    var_0 notify( "stop_loop" );
    var_1 = getent( "escape_door_to_open", "targetname" );
    var_1 makeunusable();
    level.ally.escape_bag_push = "odin_escape_zigzag_bag_02";
    common_scripts\utility::flag_set( "kyra_push_bag_anim" );
    thread maps\odin_util::push_out_of_doorway( "X", "<", 1000, 1000 );
    var_0 thread maps\_anim::anim_single_solo( var_1, "odin_escape_zigzag_start_door" );
    common_scripts\utility::flag_set( "clear_to_tweak_player" );
    thread maps\odin_audio::sfx_kyra_open_station_door();
    var_0 maps\_anim::anim_single_solo( self, "odin_escape_zigzag_start_ally01" );
    thread escape_ally_movement_start_part_2( var_0 );
}

escape_ally_movement_start_part_2( var_0 )
{
    level endon( "early_decomp" );
    thread maps\odin_spin::prespawn_decomp_crates();
    var_0 notify( "stop_loop" );
    var_0 thread maps\_anim::anim_loop_solo( self, "odin_escape_zigzag_start_loop_ally01", "stop_loop" );
    thread maps\odin_util::finale_anim_loop_killer( var_0, "stop_loop" );
    common_scripts\utility::flag_wait( "escape_blocker_door_trig" );
    var_0 notify( "stop_loop" );
    var_0 = common_scripts\utility::getstruct( "kyra_move_node02", "targetname" );
    var_0 maps\_anim::anim_single_solo( self, "odin_escape_zigzag_second_ally01" );
    var_0 maps\_anim::anim_single_solo( self, "odin_escape_zigzag_to_spin_ally01" );
    var_0 thread maps\_anim::anim_loop_solo( self, "odin_escape_zigzag_to_spin_loop_ally01", "stop_loop" );
    thread maps\odin_util::finale_anim_loop_killer( var_0, "stop_loop" );
    self setgoalpos( self.origin );
    common_scripts\utility::flag_set( "escape_clear" );
    self notify( "done_with_escape" );
    common_scripts\utility::flag_wait( "start_near_explosion_sequence" );
    var_0 notify( "stop_loop" );
}

kyra_grabs_escape_gun( var_0 )
{
    level.ally maps\_utility::gun_remove();
    var_1 = maps\_utility::spawn_anim_model( "kyra_gun" );
    var_1 attach( "weapon_acog_iw6", "tag_acog_2", 1 );
    var_1 attach( "weapon_barrel_shroud_iw6", "tag_silencer", 1 );
    var_0 maps\_anim::anim_single_solo( var_1, "odin_escape_first_encounter_end_tar21" );
    var_1 delete();
    level.ally maps\_utility::gun_recall();
}

ally_wait_to_get_impatient( var_0 )
{
    for ( var_1 = 0; var_1 < var_0; var_1++ )
    {
        if ( level.ally.origin[0] < level.player.origin[0] - 64 )
            break;

        wait 1;
    }
}

kyra_escape_move_bags( var_0 )
{
    var_1 = maps\_utility::spawn_anim_model( "space_escape_pack" );
    var_0 maps\_anim::anim_first_frame_solo( var_1, "odin_escape_zigzag_bag_01" );
    common_scripts\utility::flag_wait( "kyra_push_bag_anim" );
    var_0 maps\_anim::anim_single_solo( var_1, level.ally.escape_bag_push );
}

player_escape_door_open( var_0, var_1 )
{
    level endon( "kyra_got_impatient" );
    level notify( "player_opened_escape_door" );
    var_2 = maps\_utility::spawn_anim_model( "player_rig" );
    var_2 hide();
    var_0 maps\_anim::anim_first_frame_solo( var_2, "odin_escape_open_door_player" );
    var_3 = 0;
    thread maps\odin_audio::sfx_plr_open_station_door();
    level.player disableweapons();
    level.player playerlinktoblend( var_2, "tag_player", 0.5, 0, 0 );
    wait 0.5;
    level.player playerlinktodelta( var_2, "tag_player", 1, var_3, var_3, var_3, var_3, 1 );
    thread escape_door_anim_player( var_0, var_2 );
    var_0 notify( "stop_loop" );
    level.ally.escape_bag_push = "odin_escape_zigzag_bag_01";
    common_scripts\utility::flag_set( "kyra_push_bag_anim" );
    var_0 maps\_anim::anim_single_solo( level.ally, "odin_escape_open_door_player" );
    level.ally thread escape_ally_movement_start_part_2( var_0 );
}

escape_door_anim_player( var_0, var_1 )
{
    var_2 = maps\_utility::spawn_anim_model( "finale_gun" );
    var_2.origin = var_1 gettagorigin( "tag_weapon" );
    var_2.angles = var_1 gettagangles( "tag_weapon" );
    var_2 linkto( var_1, "tag_weapon" );
    var_1 show();
    var_0 maps\_anim::anim_single_solo( var_1, "odin_escape_open_door_player" );
    common_scripts\utility::flag_clear( "no_push_zone" );
    level.player unlink();
    var_2 delete();
    var_1 delete();
    level.player enableweapons();
    wait 1;
}

escape_door_open_rumble( var_0 )
{
    level.player playrumbleonentity( "light_1s" );
}

escape_door_open_flag( var_0 )
{
    common_scripts\utility::flag_set( "player_open_escape_door" );
}

escape_setup()
{
    setsaveddvar( "ragdoll_max_life", 90000 );
    thread maps\odin_util::floating_corpses( "floaters_zigzag_module" );
    thread maps\odin_util::create_sliding_space_door( "post_z_door", 1.2, 0.1, 0, 0, "lock_post_z_room", "unlock_post_z_room" );
    thread maps\odin_util::create_sliding_space_door( "escape_window_auto_door", 1.2, 0.1, 0, 0, "lock_escape_window_auto_door", "unlock_escape_window_auto_door" );
    thread maps\odin_util::create_sliding_space_door( "escape_door_blocker", 1, 0, 0, 0, "lock_escape_door_blocker", "unlock_escape_door_blocker" );
    thread maps\odin_util::create_sliding_space_door( "spin_door_blocker", 0.75, 0, 0, 0, "lock_spin_door_blocker", "unlock_spin_door_blocker" );
    thread escape_blocker_door_lens_cap();
    common_scripts\utility::flag_set( "unlock_escape_door_blocker" );
    common_scripts\utility::flag_set( "unlock_spin_door_blocker" );
    thread manage_earth( "show" );
    var_0 = maps\odin_util::satellite_get_script_mover();
    var_1 = getent( "escape_sat_orientation", "targetname" );
    var_0 moveto( var_1.origin, 0.1, 0, 0 );
    var_0 rotateto( var_1.angles, 0.1, 0, 0 );
    wait 0.15;
    thread prepare_odin_for_window_scene();
    level.decomp_door = thread maps\odin_util::create_sliding_space_door( "spin_decomp_door", 0.3, 0.1, 0, 0, "lock_decomp_room", "open_decomp_room_door" );
}

prepare_odin_for_window_scene()
{
    level.odin_animnode maps\_anim::anim_single( level.animated_sat_part, "sat_blossom_close" );
    var_0 = [];
    var_1 = [];
    var_2 = [];
    var_0["odin_sat_section_04_pod_doorR_01"] = level.animated_sat_part["odin_sat_section_04_pod_doorR_01"];
    var_2["odin_sat_section_04_pod_doorR_02"] = level.animated_sat_part["odin_sat_section_04_pod_doorR_02"];
    var_1["odin_sat_section_04_pod_doorR_03"] = level.animated_sat_part["odin_sat_section_04_pod_doorR_03"];
    var_0["odin_sat_section_04_pod_doorR_04"] = level.animated_sat_part["odin_sat_section_04_pod_doorR_04"];
    var_0["odin_sat_section_04_pod_doorL_01"] = level.animated_sat_part["odin_sat_section_04_pod_doorL_01"];
    var_2["odin_sat_section_04_pod_doorL_02"] = level.animated_sat_part["odin_sat_section_04_pod_doorL_02"];
    var_1["odin_sat_section_04_pod_doorL_03"] = level.animated_sat_part["odin_sat_section_04_pod_doorL_03"];
    var_0["odin_sat_section_04_pod_doorL_04"] = level.animated_sat_part["odin_sat_section_04_pod_doorL_04"];
    level.odin_animnode maps\_anim::anim_first_frame( var_0, "sat_blossom_open" );
    level.odin_animnode maps\_anim::anim_first_frame( var_1, "sat_blossom_open" );
    level.odin_animnode maps\_anim::anim_first_frame( var_2, "sat_blossom_open" );
    level thread maps\odin_fx::fx_sat_doors_open( var_0 );
    level.odin_animnode thread maps\_anim::anim_single( var_0, "sat_blossom_open" );
    common_scripts\utility::flag_wait( "start_odin_firing_scene" );
    level thread maps\odin_fx::fx_sat_doors_open( var_1 );
    level.odin_animnode thread maps\_anim::anim_single( var_1, "sat_blossom_open" );
    wait 5;
    level thread maps\odin_fx::fx_sat_doors_open( var_2 );
    level.odin_animnode thread maps\_anim::anim_single( var_2, "sat_blossom_open" );
}

escape_blocker_door_lens_cap()
{
    var_0 = getent( "escape_door_blocker_lens_cap", "targetname" );
    var_1 = getent( "escape_door_blocker_lens_cap_origin", "targetname" );
    var_2 = var_1.origin;
    var_0 linkto( var_1 );
    var_1 moveto( ( 0, 0, 0 ), 0.1, 0, 0 );
    var_0 hide();
    common_scripts\utility::flag_wait( "lock_escape_door_blocker" );
    var_1 moveto( var_2, 0.1, 0, 0 );
    wait 1;
    var_0 show();
}

crew_quarters_combat()
{
    level.ally maps\_utility::set_ignoreall( 1 );
    level.ally maps\_utility::gun_remove();
    level.ally.ignoreme = 1;
    common_scripts\utility::flag_set( "unlock_post_z_room" );
    crew_quarters_combat_setup();
    level.ally thread move_ally_into_cq();
    wait 1.0;
    thread set_flag_on_player_action( "escape_enc_activated" );
    crew_quarters_crew_killed();
    common_scripts\utility::flag_wait_all( "first_enc_dead", "cq_killer_dead" );
    common_scripts\utility::flag_set( "esc_combat_done" );
    common_scripts\utility::flag_set( "kyra_ally_vo_01" );
}

create_escape_doors()
{

}

move_ally_into_cq()
{
    maps\_utility::delaythread( 3.0, maps\_utility::smart_radio_dialogue, "odin_kyr_budlookouttheres" );
    common_scripts\utility::flag_wait( "ally_out_of_z" );
    var_0 = common_scripts\utility::getstruct( "kyra_move_node01", "targetname" );
    var_0 maps\_anim::anim_single_solo( self, "odin_escape_first_encounter_ally01" );
    var_0 thread maps\_anim::anim_loop_solo( self, "odin_escape_first_encounter_loop_ally01", "stop_loop" );
    thread maps\odin_util::finale_anim_loop_killer( var_0, "stop_loop" );
}

crew_quarters_crew_killed()
{
    var_0 = getent( "cq_enc_enemy_killer", "script_noteworthy" );
    var_1 = var_0 maps\odin_util::spawn_odin_actor_internal( 1 );
    var_1 maps\_utility::forceuseweapon( level.player.weapon_interior, "primary" );
    var_1 hidepart( "tag_silencer" );
    var_2 = getent( "cq_killed_crew", "targetname" );
    var_3 = var_2 maps\odin_util::spawn_odin_actor_internal( 1 );
    var_3.team = "neutral";
    var_1.ignoreall = 1;
    var_1.animname = "odin_opfor";
    var_1.allowdeath = 1;
    var_1 thread maps\odin_util::odin_drop_weapon();
    var_3.ignoreall = 1;
    var_3.nodeathimpulse = 1;
    var_3.animname = "odin_redshirt";
    var_3 maps\_utility::gun_remove();
    var_4 = common_scripts\utility::getstruct( "kyra_move_node01", "targetname" );
    var_4 thread maps\_anim::anim_single_solo( var_1, "odin_escape_first_encounter_opfor" );
    thread redshirt_cq_enc_handles( var_3, var_4 );
    var_4 = getnode( "node_cq_enc_middle_middle", "targetname" );

    if ( isalive( var_1 ) )
    {
        var_1.fixednode = 1;
        var_1.ignoreall = 0;
        var_1 setgoalpos( var_1.origin );
        var_1.favoriteenemy = level.player;
    }

    while ( isalive( var_1 ) )
        wait 0.01;

    if ( isalive( var_3 ) )
        var_3 kill();

    wait 1.5;

    for ( var_5 = 0; var_5 < 25; var_5++ )
    {
        physicsexplosionsphere( var_4.origin, 48, 32, 0.1 );
        wait 0.05;
    }
}

redshirt_cq_enc_handles( var_0, var_1 )
{
    var_0 endon( "death" );
    var_0.forceragdollimmediate = 1;
    var_1 maps\_anim::anim_single_solo( var_0, "odin_escape_first_encounter_redshirt" );
    wait 0.1;

    if ( isalive( var_0 ) )
        var_0 kill();
}

escape_destruct_boxes( var_0 )
{
    var_1 = getscriptablearray( var_0, "targetname" );

    foreach ( var_3 in var_1 )
    {
        wait( randomfloatrange( 0.2, 0.6 ) );
        magicbullet( "microtar_space_interior+acogsmg_sp+spaceshroud_sp", var_3.origin + ( randomfloatrange( 1, 2 ), randomfloatrange( 1, 2 ), randomfloatrange( 1, 2 ) ), var_3.origin );
    }
}

crew_quarters_combat_setup()
{
    var_0 = getentarray( "cq_enc_enemies", "targetname" );
    level.aenemies = [];

    for ( var_1 = 0; var_1 < var_0.size; var_1++ )
    {
        switch ( var_0[var_1].script_noteworthy )
        {
            case "cq_enc_enemy_00":
                var_0[var_1] maps\_utility::add_spawn_function( ::escape_enemy_00_think );
                break;
            case "cq_enc_enemy_01":
                var_0[var_1] maps\_utility::add_spawn_function( ::escape_enemy_01_think );
                break;
            case "cq_enc_enemy_02":
                var_0[var_1] maps\_utility::add_spawn_function( ::escape_enemy_02_think );
                break;
            case "cq_enc_enemy_03":
                var_0[var_1] maps\_utility::add_spawn_function( ::escape_enemy_03_think );
                break;
        }

        level.cq_enemies[var_1] = var_0[var_1] maps\odin_util::spawn_odin_actor_internal( 1 );
    }
}

cq_room_destruction()
{
    level endon( "enter_window_scene" );
    common_scripts\utility::flag_wait( "escape_enc_activated" );
    var_0 = getent( "escape_crates_damage_check", "targetname" );
    var_0 setcandamage( 1 );
    var_0 waittill( "damage" );
    var_1 = getentarray( "cq_dyn_cargo_01_static", "targetname" );

    foreach ( var_3 in var_1 )
        var_3 delete();
}

escape_enemy_setup()
{
    self.ignoreall = 1;
    self.moveplaybackrate = 1.0;
    self.goalradius = 16;
    thread maps\odin_util::odin_drop_weapon();
}

cq_combat_movement()
{
    self endon( "stop_combat" );
    self endon( "death" );
    var_0 = getnodearray( "nodes_cq_enc", "script_noteworthy" );

    for (;;)
    {
        wait( randomfloatrange( 0.5, 2.5 ) );

        if ( common_scripts\utility::flag( "enc_movement_token_taken" ) )
            common_scripts\utility::flag_waitopen_or_timeout( "enc_movement_token_taken", 4 );

        if ( getaicount( "axis" ) == 1 )
        {
            self endon( "death" );
            self.goalradius = 64;

            for (;;)
            {
                self setgoalpos( level.player.origin );
                wait 2.0;
            }

            continue;
        }

        var_1 = var_0[randomintrange( 0, var_0.size )];
        self.goalradius = 16;

        if ( !isnodeoccupied( var_1 ) )
        {
            common_scripts\utility::flag_set( "enc_movement_token_taken" );
            self setgoalnode( var_1 );
            self waittill( "goal" );
            common_scripts\utility::flag_clear( "enc_movement_token_taken" );
            wait 2.0;
        }
    }

    common_scripts\utility::flag_clear( "enc_movement_token_taken" );
}

escape_enemy_00_think()
{
    self endon( "death" );
    maps\_utility::gun_remove();
    maps\_utility::forceuseweapon( level.player.weapon_interior, "primary" );
    self.fixednode = 1;
    maps\_utility::set_goal_radius( 2 );
    thread maps\odin_util::npc_physics_pulse();
    escape_enemy_setup();
    common_scripts\utility::flag_wait_or_timeout( "escape_enc_activated", 6 );
    common_scripts\utility::flag_set( "escape_enc_activated" );
    wait( randomfloatrange( 0.3, 1.0 ) );
    self.ignoreall = 0;
    self.favoriteenemy = level.player;
    var_0 = getnode( "node_cq_enc_forward_left", "targetname" );
    self setgoalnode( var_0 );
    self waittill( "goal" );
}

escape_enemy_01_think()
{
    maps\_utility::gun_remove();
    maps\_utility::forceuseweapon( level.player.weapon_interior, "primary" );
    self.fixednode = 1;
    maps\_utility::set_goal_radius( 2 );
    thread maps\odin_util::npc_physics_pulse();
    escape_enemy_setup();
    common_scripts\utility::flag_wait_or_timeout( "escape_enc_activated", 6 );
    common_scripts\utility::flag_set( "escape_enc_activated" );
    wait( randomfloatrange( 0.3, 1.0 ) );
    self.ignoreall = 0;
    self.favoriteenemy = level.player;
    var_0 = getnode( "node_cq_enc_middle_right", "targetname" );
    self setgoalnode( var_0 );
    self waittill( "goal" );
    thread cq_combat_movement();
    self waittill( "death" );
    common_scripts\utility::flag_clear( "enc_movement_token_taken" );
    self notify( "stop_combat" );
}

escape_enemy_02_think()
{
    maps\_utility::gun_remove();
    maps\_utility::forceuseweapon( level.player.weapon_interior, "primary" );
    thread maps\odin_util::npc_physics_pulse();
    var_0 = getent( "cq_killed_crew2", "targetname" );
    var_1 = var_0 maps\odin_util::spawn_odin_actor_internal( 1 );
    var_1.team = "neutral";
    self.ignoreall = 1;
    self.animname = "odin_opfor";
    self.allowdeath = 1;
    var_1.ignoreall = 1;
    var_1.nodeathimpulse = 1;
    var_1.animname = "odin_redshirt";
    var_1 maps\_utility::gun_remove();
    var_2 = common_scripts\utility::getstruct( "kyra_move_node01", "targetname" );
    var_2 thread maps\_anim::anim_single_solo( self, "odin_escape_first_encounter_opfor02" );
    thread redshirt_cq_enc_handles2( var_1, var_2 );
    var_2 = getnode( "node_cq_enc_middle_right", "targetname" );

    if ( isalive( self ) )
    {
        self.fixednode = 1;
        self.ignoreall = 0;
        self setgoalnode( var_2 );
        thread cq_combat_movement();
        self.favoriteenemy = level.player;
    }

    self.fixednode = 1;
    maps\_utility::set_goal_radius( 2 );
    escape_enemy_setup();
    thread firing_into_bunks();
    common_scripts\utility::flag_wait_or_timeout( "escape_enc_activated", 6 );
    common_scripts\utility::flag_set( "escape_enc_activated" );
    wait( randomfloatrange( 0.3, 1.0 ) );
    self.ignoreall = 0;
    self.favoriteenemy = level.player;
    var_3 = getnode( "node_cq_enc_middle_right", "targetname" );
    self setgoalnode( var_3 );
    self waittill( "death" );
    thread escape_destruct_boxes( "esc_fuse_boxes_01_exploder" );
    common_scripts\utility::flag_set( "trigger_third_guy" );
    common_scripts\utility::flag_clear( "enc_movement_token_taken" );
    self notify( "stop_combat" );
}

redshirt_cq_enc_handles2( var_0, var_1 )
{
    var_1 maps\_anim::anim_single_solo( var_0, "odin_escape_first_encounter_redshirt02" );
    var_0.forceragdollimmediate = 1;
    wait 0.1;

    if ( isalive( var_0 ) )
        var_0 kill();
}

escape_enemy_03_think()
{
    self endon( "death" );
    maps\_utility::gun_remove();
    maps\_utility::forceuseweapon( level.player.weapon_interior, "primary" );
    var_0 = level.player.threatbias;
    var_1 = level.ally.threatbias;
    var_2 = getent( "thirdGuyTarget", "targetname" );
    maps\_utility::set_goal_radius( 2 );
    self setgoalpos( var_2.origin );
    self.fixednode = 1;
    maps\_utility::magic_bullet_shield();
    maps\_utility::disable_arrivals();
    thread maps\odin_util::odin_drop_weapon();
    thread maps\odin_util::npc_physics_pulse();
    common_scripts\utility::flag_wait_or_timeout( "trigger_third_guy", 8 );
    thread maps\odin_audio::sfx_phantom_door_close();
    maps\_utility::stop_magic_bullet_shield();
    level.ally.ignoreme = 1;
    var_2 = getnode( "third_guy_destination", "targetname" );
    self setgoalpos( var_2.origin );
    self.ignoreall = 0;
    self.favoriteenemy = level.ally;
    level.ally.threatbias = 10000;
    self waittill( "goal" );
    level.player.threatbias = var_0;
    level.ally.threatbias = var_1;
    level.player.ignoreme = 0;
    level.ally.ignoreme = 1;
    self waittill( "death" );
    thread escape_destruct_boxes( "esc_fuse_boxes_02_exploder" );
    common_scripts\utility::flag_clear( "enc_movement_token_taken" );
    self notify( "stop_combat" );
}

third_enemy_shooting()
{
    self endon( "death" );
    var_0 = gettime();
    var_1 = gettime() - 3000;
    var_2 = getnode( "cq_ally_position", "targetname" );

    while ( var_1 < var_0 )
    {
        var_1 = gettime() - 3000;
        var_3 = randomfloatrange( 0.1, 0.5 );

        for ( var_4 = 0; var_4 < 3; var_4++ )
        {
            if ( isalive( self ) )
                self shoot( 1, var_2.origin, 1 );
            else
                break;

            wait 0.05;
        }

        wait( var_3 );
    }
}

firing_into_bunks()
{
    self endon( "death" );
    level endon( "escape_enc_activated" );
    self.goalradius = 16;
    self waittill( "goal" );
    maps\_utility::disable_pain();
    var_0 = getent( self.script_noteworthy + "_aim", "targetname" );

    for ( var_1 = 0; var_1 < 5; var_1++ )
    {
        magicbullet( self.weapon, self gettagorigin( "tag_flash" ), var_0.origin );
        wait( randomfloatrange( 0.1, 0.5 ) );
    }

    self setgoalpos( self.origin );
}

set_flag_on_player_action( var_0 )
{
    level endon( var_0 );

    if ( common_scripts\utility::flag( var_0 ) )
        return;

    for (;;)
    {
        level.player waittill( "weapon_fired" );
        break;
    }

    common_scripts\utility::flag_set( var_0 );
}

crew_quarters_aftermath()
{
    level.ally thread escape_ally_movement_start();
    thread escape_dialogue();
    common_scripts\utility::flag_wait( "start_odin_firing_scene" );
}

escape_dialogue()
{
    maps\_utility::smart_radio_dialogue( "odin_shq_odinpayload1uploading" );

    if ( !common_scripts\utility::flag( "start_odin_firing_scene" ) )
        maps\_utility::smart_radio_dialogue( "odin_atl_targetinglosangeles" );

    wait 0.9;

    if ( !common_scripts\utility::flag( "start_odin_firing_scene" ) )
        maps\_utility::smart_radio_dialogue( "odin_atl_sandiegolocked" );

    wait 1.2;

    if ( !common_scripts\utility::flag( "start_odin_firing_scene" ) )
        maps\_utility::smart_radio_dialogue( "odin_atl_phoenixlocked" );

    wait 0.4;

    if ( !common_scripts\utility::flag( "start_odin_firing_scene" ) )
        maps\_utility::smart_radio_dialogue( "odin_atl_targetinghouston" );

    if ( !common_scripts\utility::flag( "start_odin_firing_scene" ) )
        maps\_utility::smart_radio_dialogue( "odin_atl_targetingmiami" );

    if ( !common_scripts\utility::flag( "start_odin_firing_scene" ) )
        maps\_utility::smart_radio_dialogue( "odin_shq_odintargetingsolutionsare" );

    if ( !common_scripts\utility::flag( "start_odin_firing_scene" ) )
        maps\_utility::smart_radio_dialogue( "odin_shq_rodfeedengaging" );

    if ( !common_scripts\utility::flag( "start_odin_firing_scene" ) )
        maps\_utility::smart_radio_dialogue( "odin_kyr_budfollowmewe" );
}

check_for_escape_dialogue_overlap( var_0 )
{
    common_scripts\utility::flag_set( "escape_overlap_dialogue" );
    maps\_utility::smart_radio_dialogue( var_0 );
    common_scripts\utility::flag_clear( "escape_overlap_dialogue" );
}

ally_console_scene()
{
    level endon( "early_decomp" );
    common_scripts\utility::flag_wait( "start_odin_firing_scene" );
    thread lock_auto_door();
    thread console_scene_player_blocker();
    level.ally play_console_scene();
}

lock_auto_door()
{
    level endon( "early_decomp" );
    common_scripts\utility::flag_wait( "escape_blocker_door_trig" );
    common_scripts\utility::flag_set( "lock_escape_window_auto_door" );
}

play_console_scene()
{
    level endon( "early_decomp" );
    thread odin_firing_sequence();
    console_scene_dialogue();
}

ally_dialogue_overlap_check( var_0 )
{
    if ( common_scripts\utility::flag( "escape_overlap_dialogue" ) )
        maps\_utility::smart_radio_dialogue_overlap( var_0 );
    else
        maps\_utility::smart_radio_dialogue( var_0 );
}

window_vo_01( var_0 )
{
    ally_dialogue_overlap_check( "odin_ast1_ohnoodinis" );
}

window_vo_02( var_0 )
{
    common_scripts\utility::flag_set( "open_second_pod" );
    ally_dialogue_overlap_check( "odin_kyr_theyreuploadingmore" );
    common_scripts\utility::flag_set( "fire_rog" );
}

window_vo_03( var_0 )
{
    maps\_utility::radio_dialogue_stop();
    maps\_utility::smart_radio_dialogue( "odin_ast1_houstonwhatdowe" );
}

window_vo_04( var_0 )
{
    maps\_utility::radio_dialogue_stop();
    maps\_utility::smart_radio_dialogue( "odin_ho2_odincontrolwehave" );
}

window_vo_05( var_0 )
{
    maps\_utility::radio_dialogue_stop();
    maps\_utility::smart_radio_dialogue( "odin_ho2_imsorrymosley" );
}

window_vo_06( var_0 )
{
    maps\_utility::radio_dialogue_stop();
    maps\_utility::smart_radio_dialogue( "odin_ast1_copyhouston" );
    common_scripts\utility::flag_set( "remove_window_blocker" );
}

window_vo_07( var_0 )
{
    maps\_utility::radio_dialogue_stop();
    thread maps\_utility::smart_radio_dialogue( "odin_ho2_initiatingin10seconds_2" );
    maps\_utility::smart_radio_dialogue_overlap( "odin_kyr_budweneedto_2" );
    common_scripts\utility::flag_set( "window_VO_Done" );
}

console_scene_dialogue()
{
    level endon( "early_decomp" );
    common_scripts\utility::flag_set( "fire_rog" );
    level notify( "player_has_shroud_now" );
    check_for_escape_dialogue_overlap( "odin_shq_estimatedcasualties112" );
    common_scripts\utility::flag_wait( "window_VO_Done" );
    common_scripts\utility::flag_clear( "clear_to_tweak_player" );
    common_scripts\utility::flag_set( "objective_escape_sat" );
    common_scripts\utility::flag_set( "ally_console_scene_done" );
    thread maps\_utility::smart_radio_dialogue( "odin_kyr_comeonbudif" );
    common_scripts\utility::flag_set( "fire_rog" );
    thread maps\odin_audio::sfx_scuttle_pre_decomp();
    wait 2.0;
    maps\_utility::smart_radio_dialogue_overlap( "odin_shq_stationdetonationin3" );
    common_scripts\utility::flag_set( "destruction_sequence_started" );
    thread post_window_nag();
}

post_window_nag()
{
    level endon( "early_decomp" );
    level endon( "player_exited_escape_hallway" );
    var_0 = 4;

    for (;;)
    {
        wait( var_0 );
        maps\_utility::smart_radio_dialogue( "odin_kyr_budweneedto_2" );
        var_0 = var_0 + 2;

        if ( var_0 > 20 )
            var_0 = 20;
    }
}

odin_firing_sequence()
{
    level endon( "player_exited_escape_hallway" );
    thread prepare_odin_to_fire();
    thread maps\odin_fx::fx_escape_fire_rods();
    common_scripts\utility::flag_wait( "ally_at_console" );
    wait 3.0;
}

prepare_odin_to_fire()
{
    level endon( "player_exited_escape_hallway" );
    common_scripts\utility::flag_wait( "ready_to_fire_next_salvo" );

    for ( var_0 = 1; var_0 <= 4; var_0++ )
    {
        common_scripts\utility::exploder( "fx_odin_pods_opening_0" + var_0 );
        var_1 = getentarray( "odin_pod_panels_0" + var_0, "targetname" );

        foreach ( var_3 in var_1 )
        {
            var_4 = getent( var_3.target, "targetname" );
            var_3 moveto( var_4.origin, randomfloatrange( 10, 14 ), 0.5, 5 );
            var_3 rotateto( ( var_3.angles[0] + randomint( 4 ), var_3.angles[1] + randomint( 4 ), var_3.angles[2] + randomint( 4 ) ), 12, 0.5, 10 );
        }

        common_scripts\utility::flag_clear( "ready_to_fire_next_salvo" );
        common_scripts\utility::flag_wait( "ready_to_fire_next_salvo" );
        wait 0.1;
    }
}

add_dialogue_line_timed( var_0, var_1, var_2, var_3 )
{
    thread maps\_utility::add_dialogue_line( var_0, var_1, var_2 );
    wait( var_3 );
}

console_scene_player_blocker()
{
    var_0 = getent( "console_player_blocker", "targetname" );
    common_scripts\utility::flag_wait( "remove_window_blocker" );
    var_0 delete();
}

destruction_sequence()
{
    common_scripts\utility::flag_wait( "destruction_sequence_started" );
    thread ramping_explosions();
    thread random_ambient_escape_fx();
    thread escape_explosion_player_timeout();
    common_scripts\utility::flag_wait( "player_exited_escape_hallway" );
}

ramping_explosions()
{
    level endon( "start_near_explosion_sequence" );
    level.play_shake_sound = 1;
    var_0 = 0.02;
    var_1 = 0.1;
    thread maps\odin_audio::sfx_escape_destruction_fire_puffs();
    common_scripts\utility::exploder( "escape_destruction" );

    if ( maps\_utility::is_gen4() )
        common_scripts\utility::exploder( "escape_destruction_ng" );

    thread maps\odin_audio::sfx_scuttle_alarm();

    for (;;)
    {
        thread maps\odin_audio::sfx_shaking_logic();
        earthquake( randomfloatrange( var_0, var_1 ), 1.0, level.player.origin, 500 );

        if ( common_scripts\utility::cointoss() )
            level.player playrumbleonentity( "light_3s" );
        else
            level.player playrumbleonentity( "heavy_1s" );

        common_scripts\utility::exploder( "escape_destruction_random" );
        wait( randomfloatrange( 0.8, 2.4 ) );
        var_0 = var_0 + 0.05;
        var_1 = var_1 + 0.08;

        if ( var_0 > 0.15 )
            var_0 = 0.15;

        if ( var_1 > 0.35 )
            var_1 = 0.35;
    }
}

random_ambient_escape_fx()
{
    level endon( "player_exited_escape_hallway" );
    wait( randomfloatrange( 1.2, 2.2 ) );
    common_scripts\utility::exploder( "escape_destruction_random" );
}

escape_explosion_player_timeout()
{
    level endon( "odin_start_spin_decomp" );
    wait 20;
    var_0 = getentarray( "escape_fail_explosion_FX_Origin", "script_noteworthy" );
    var_1 = 0;
    var_2 = 0;
    var_3 = 0;

    foreach ( var_5 in var_0 )
    {
        var_1 = randomintrange( -40, 40 );
        var_2 = randomintrange( -40, 40 );
        var_3 = randomintrange( 0, 40 );
        var_5.origin = level.player.origin + ( var_1, var_2, var_3 );
        playfx( common_scripts\utility::getfx( "spc_explosion_1200" ), var_5.origin );
    }

    level.player playsound( "scn_odin_decompression_explode2_ss" );
    wait 0.5;

    foreach ( var_5 in var_0 )
        playfx( common_scripts\utility::getfx( "spc_explosion_1200" ), var_5.origin );

    wait 0.5;
    level.player kill();
    level notify( "new_quote_string" );
    setdvar( "ui_deadquote", &"ODIN_WINDOW_TIMEOUT" );
    maps\_utility::missionfailedwrapper();
}

early_decomp_checker()
{
    common_scripts\utility::flag_wait( "absolute_fire_decompression" );
    level notify( "early_decomp" );
    level notify( "player_exited_escape_hallway" );
    level notify( "odin_start_spin_decomp" );
    level notify( "start_near_explosion_sequence" );
    common_scripts\utility::flag_set( "start_near_explosion_sequence" );
    common_scripts\utility::flag_set( "player_exited_escape_hallway" );
    common_scripts\utility::flag_set( "escape_clear" );
}

escape_cleanup( var_0 )
{
    var_1 = getentarray( "space_cover_test", "targetname" );

    foreach ( var_3 in var_1 )
        var_3 delete();

    var_5 = getentarray( "cq_dynamic_objects", "script_noteworthy" );

    foreach ( var_7 in var_5 )
        var_7 delete();
}

manage_earth( var_0 )
{
    var_1 = getent( "fake_earth", "targetname" );

    if ( !isdefined( var_1 ) )
        return;

    switch ( var_0 )
    {
        case "hide":
            var_1 hide();
            break;
        case "show":
            var_1 show();
            break;
        case "delete":
            var_1 delete();
            break;
    }
}