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