// IW6 GSC SOURCE // Generated by https://github.com/xensik/gsc-tool section_main() { } section_precache() { } section_flag_inits() { common_scripts\utility::flag_init( "player_is_firing" ); common_scripts\utility::flag_init( "combat_two_stage_1_done" ); common_scripts\utility::flag_init( "section6" ); common_scripts\utility::flag_init( "section5" ); common_scripts\utility::flag_init( "section4" ); common_scripts\utility::flag_init( "section3" ); common_scripts\utility::flag_init( "section2" ); common_scripts\utility::flag_init( "section1" ); common_scripts\utility::flag_init( "turn_on_tracker" ); common_scripts\utility::flag_init( "combat_two_stop_ignore" ); common_scripts\utility::flag_init( "section3_justmove" ); common_scripts\utility::flag_init( "combat_two_dialogue_done" ); common_scripts\utility::flag_init( "allies_in_position" ); common_scripts\utility::flag_init( "first_enemies_dead" ); common_scripts\utility::flag_init( "combat_two_anim_intro_ally0_done" ); common_scripts\utility::flag_init( "combat_two_anim_intro_ally1_done" ); common_scripts\utility::flag_init( "combat_two_charge_enemy_spawned" ); common_scripts\utility::flag_init( "enemies_above" ); common_scripts\utility::flag_init( "sneaky_player" ); common_scripts\utility::flag_init( "ally_0_combat_two_anims_finished" ); common_scripts\utility::flag_init( "ally_1_combat_two_anims_finished" ); } combat_two_start() { maps\loki_util::player_move_to_checkpoint_start( "combat_two" ); maps\loki_util::spawn_allies(); maps\loki_space_breach::set_num_allies( 2 ); level.player giveweapon( level.primary_weapon ); level.player switchtoweapon( level.primary_weapon ); level.player givemaxammo( level.primary_weapon ); level.moving_cover_guys = []; wait 1.0; teleport_enemies(); level thread show_combat_two_intro_debris(); level thread maps\loki_moving_cover::lastframe_moving_cover(); level thread combat_two_intro_vignette( 0.0 ); level thread moving_large_debris(); common_scripts\utility::flag_set( "moving_cover_done2" ); level thread play_helmet_light_damage( 10 ); } combat_two() { thread maps\loki_util::loki_autosave_by_name_silent( "combat_two" ); thread maps\loki_audio::audio_set_default_ambience(); thread maps\loki_fx::light_combat2_threads(); common_scripts\utility::exploder( "mc_end_impact_smk" ); common_scripts\utility::exploder( "combat_two_amb_dust" ); maps\_utility::stop_exploder( "mc_flare" ); common_scripts\utility::exploder( "combat2_flare" ); common_scripts\utility::exploder( "mc_steam_01" ); level.current_volume = getent( "wave_3_in_debris_goal_volume", "targetname" ); level.current_high_volume = level.current_volume; level.allies[0] thread combat_two_ally_logic( "y", "ally0", "combat_two_anim_intro_ally0_done" ); level.allies[1] thread combat_two_ally_logic( "b", "ally1", "combat_two_anim_intro_ally1_done" ); level thread trigger_wave_3_during_moving_cover(); level thread convert_moving_cover_enemies_to_wave_3(); level thread combat_two_dialogue(); level thread vo_move_up(); level thread set_stop_ignore_flag(); level thread ai_advancing_logic(); level thread check_for_combat_two_done(); level thread ally_target_logic(); level thread change_enemy_priority(); level thread set_sneaky_player_flag_on_trigger(); level thread rotate_intel(); level thread maps\loki_util::player_boundaries_on(); level thread turn_on_node_once_player_advances( "exposed_node_advance" ); level thread turn_on_node_once_player_advances( "side_node_advance" ); level thread disable_nodes_before_allies_move(); level thread fail_if_player_too_far(); level thread combat_two_fire_straight_setup(); level.combat_two_spawns = 0; var_0 = getent( "combat_two_second_wave_retreat", "targetname" ); thread maps\_utility::set_flag_on_trigger( var_0, "combat_two_stage_1_done" ); wait 0.5; level thread spawn_enemies_on_ai_count(); level thread spawn_enemies_on_flag(); wait 1.5; common_scripts\utility::flag_wait( "combat_two_done" ); level notify( "end_of_combat_two" ); } play_helmet_light_damage( var_0 ) { level.player.helmet_show_damage = 1; while ( !common_scripts\utility::flag( "moving_cover_done2" ) ) common_scripts\utility::waitframe(); for ( var_1 = 0; var_1 < var_0; var_1++ ) wait 1.0; level.player.helmet_show_damage = 0; } combat_two_ally_logic( var_0, var_1, var_2 ) { common_scripts\utility::flag_wait( var_2 ); maps\_utility::clear_force_color(); self cleargoalvolume(); common_scripts\utility::flag_wait( "combat_two_stage_1_done" ); self.ignoreme = 0; self.ignoreall = 0; } hide_combat_two_intro_debris() { var_0 = getentarray( "combat_two_intro_debris", "targetname" ); foreach ( var_2 in var_0 ) { var_2 hide(); var_2 notsolid(); } var_4 = getentarray( "intel_laptop", "script_noteworthy" ); foreach ( var_6 in var_4 ) var_6 hide(); } show_combat_two_intro_debris() { var_0 = getentarray( "combat_two_intro_debris", "targetname" ); foreach ( var_2 in var_0 ) { var_2 show(); var_2 solid(); } var_4 = getentarray( "intel_laptop", "script_noteworthy" ); foreach ( var_6 in var_4 ) { if ( !getdvarint( "ui_level_player_cheatpoints" ) ) var_6 show(); } } trigger_enemy_spawn( var_0, var_1, var_2 ) { var_3 = getent( var_0, "targetname" ); if ( isdefined( var_3 ) ) var_3 waittill( "trigger" ); enemy_spawn( var_1, var_2 ); } trigger_enemy_spawn_in_order( var_0, var_1, var_2, var_3 ) { var_4 = getent( var_0, "targetname" ); if ( isdefined( var_4 ) ) var_4 waittill( "trigger" ); thread maps\loki_audio::sfx_set_combat_two_amb(); var_5 = 1; for ( var_5 = 0; var_5 <= var_3; var_5++ ) { enemy_spawn( var_1 + "_" + var_5, var_2 ); wait 1.0; } } enemy_spawn( var_0, var_1 ) { if ( isdefined( var_1 ) ) { var_2 = getentarray( var_0, "targetname" ); foreach ( var_4 in var_2 ) var_4 maps\_utility::add_spawn_function( var_1 ); } var_6 = maps\loki_util::spawn_space_ais_from_targetname( var_0 ); foreach ( var_8 in var_6 ) { var_8 thread set_ai_attackeraccuracy(); var_8 thread detectexposedandreacquire(); } } detectexposedandreacquire() { self endon( "death" ); var_0 = 64; var_1 = 5000; var_2 = self.origin; var_3 = gettime(); for (;;) { var_4 = 0; if ( isdefined( self.node ) && self.node.type != "Exposed 3D" && distancesquared( self.origin, self.node.origin ) < var_0 ) var_4 = 1; else if ( distancesquared( self.origin, var_2 ) > var_0 ) var_4 = 1; var_5 = gettime(); if ( var_4 ) { var_2 = self.origin; var_3 = gettime(); } else if ( var_5 - var_1 > var_3 ) { animscripts\combat_utility::lookforbettercover(); wait 2.0; } else { } wait 1.0; } } set_ai_attackeraccuracy() { self endon( "death" ); self.attackeraccuracy = 0.1; var_0 = getent( "combat_two_second_wave_retreat", "targetname" ); var_1 = getent( "no_cover", "targetname" ); if ( isdefined( var_0 ) && isdefined( var_1 ) ) common_scripts\utility::waittill_any_ents( var_0, "trigger", var_1, "trigger" ); self.attackeraccuracy = 0.1; var_0 = getent( "combat_two_third_wave_extra", "targetname" ); if ( isdefined( var_0 ) ) common_scripts\utility::waittill_any_ents( var_0, "trigger" ); self.attackeraccuracy = 0.1; } wait_until_volume_empty( var_0 ) { var_1 = getent( var_0, "targetname" ); while ( isdefined( self ) && !common_scripts\utility::flag( "combat_two_done" ) ) { var_2 = getaiarray( "axis" ); var_3 = 1; foreach ( var_5 in var_2 ) { if ( var_5 istouching( var_1 ) ) var_3 = 0; } if ( var_3 ) break; wait 0.1; } } teleport_enemies() { var_0 = getaiarray( "axis" ); var_1 = getent( "combat_two_teleport_node", "targetname" ); var_2 = 0; foreach ( var_4 in var_0 ) { var_1.origin = var_1.origin + ( var_2, 0, 0 ); var_4 forceteleport( var_1.origin, var_1.angles ); var_4 notify( "stop_following_node_path" ); var_2 = var_2 - 40; } } convert_moving_cover_enemies_to_wave_3() { level.moving_cover_guys = []; var_0 = getent( "ignore_volume", "targetname" ); var_0 waittill( "trigger" ); var_1 = getaiarray( "axis" ); var_2 = maps\_utility::get_ai_group_ai( "combat_two_enemies" ); foreach ( var_4 in var_1 ) { if ( !maps\_utility::is_in_array( var_2, var_4 ) ) { var_4 unlink(); level.moving_cover_guys[level.moving_cover_guys.size] = var_4; if ( isdefined( var_4 ) && isalive( var_4 ) ) { if ( isdefined( var_4.magic_bullet_shield ) ) var_4 maps\_utility::stop_magic_bullet_shield(); var_4 kill(); } } } } combat_two_fire_straight_setup() { anim.fire_notetrack_functions["scripted"] = ::combat_two_fire_straight; common_scripts\utility::flag_wait( "charge_set" ); anim.fire_notetrack_functions["scripted"] = animscripts\notetracks::fire_straight; } combat_two_fire_straight() { if ( maps\_utility::get_ai_group_sentient_count( "combat_two_enemies" ) ) animscripts\notetracks::fire_straight(); } trigger_on_ai_group_size( var_0, var_1 ) { self endon( "death" ); self endon( "trigger" ); for (;;) { if ( var_1 == "axis" ) { var_2 = getaiarray( "axis" ); var_3 = var_2.size; } else var_3 = maps\_utility::get_ai_group_sentient_count( var_1 ); if ( var_3 <= var_0 ) break; else wait 0.1; } self notify( "trigger" ); } turn_off_triggers_until_trigger() { var_0 = [ "combat_two_third_wave_push_0", "combat_two_third_wave_push_1", "combat_two_third_wave_push_2" ]; foreach ( var_2 in var_0 ) { var_2 = getent( var_2, "targetname" ); if ( isdefined( var_2 ) ) var_2 common_scripts\utility::trigger_off(); } var_2 = getent( "combat_two_third_wave_extra", "targetname" ); if ( isdefined( var_2 ) ) var_2 waittill( "trigger" ); foreach ( var_2 in var_0 ) { var_2 = getent( var_2, "targetname" ); if ( isdefined( var_2 ) ) var_2 common_scripts\utility::trigger_on(); } } wave_3_spawn_func() { self endon( "death" ); level.combat_two_spawns++; wait 0.1; thread set_accuracy_when_allies_are_close(); thread ignore_all_until_damaged(); thread maps\loki_util::loki_drop_weapon(); thread set_sneaky_player_flag_on_damage(); waittill_player_advances_or_timeout(); common_scripts\utility::flag_wait( "combat_two_stop_ignore" ); common_scripts\utility::flag_wait_any( "first_enemies_dead", "sneaky_player" ); wait 2.0; self notify( "stop_ignoring" ); self.ignoreall = 0; self.ignoreme = 0; self.favoriteenemy = level.player; thread swap_goal_volumes( level.current_volume ); level waittill( "enemies_charge_player" ); self notify( "stop_goal_volume_swap" ); self.attackeraccuracy = 2; for (;;) { self setgoalpos( level.player.origin ); wait 0.1; } } wave_3_high_spawn_func() { self endon( "death" ); level.combat_two_spawns++; wait 0.1; thread set_accuracy_when_allies_are_close(); thread ignore_all_until_damaged(); thread maps\loki_util::loki_drop_weapon(); thread set_sneaky_player_flag_on_damage(); waittill_player_advances_or_timeout(); common_scripts\utility::flag_wait( "combat_two_stop_ignore" ); common_scripts\utility::flag_wait_any( "first_enemies_dead", "sneaky_player" ); wait 2.0; self notify( "stop_ignoring" ); self.ignoreall = 0; self.ignoreme = 0; self.favoriteenemy = level.player; thread swap_goal_volumes( level.current_high_volume ); level waittill( "enemies_charge_player" ); self notify( "stop_goal_volume_swap" ); self.attackeraccuracy = 2; for (;;) { self setgoalpos( level.player.origin ); wait 0.1; } } wave_3_charge_spawn_func() { self endon( "death" ); level.combat_two_spawns++; level thread vo_flag_timer( 4, "enemies_above" ); thread maps\loki_util::loki_drop_weapon(); self.ignoresuppression = 1; wait 0.1; common_scripts\utility::flag_set( "combat_two_charge_enemy_spawned" ); var_0 = level.enemy_chargers.size + 1; level.enemy_chargers[level.enemy_chargers.size] = self; var_1 = getent( "enemy_charge_target_" + var_0, "targetname" ); self setentitytarget( var_1 ); self waittill( "goal" ); common_scripts\utility::flag_set( "enemies_above" ); self notify( "stop_ignoring" ); self.ignoreme = 0; self.attackeraccuracy = 1.0; self clearentitytarget(); var_2 = getent( "wave_3_in_debris_goal_volume", "targetname" ); self setgoalvolume( var_2 ); wait 1.0; self.favoriteenemy = level.player; } vo_flag_timer( var_0, var_1 ) { wait( var_0 ); common_scripts\utility::flag_set( var_1 ); } set_sneaky_player_flag_on_damage() { common_scripts\utility::waittill_any( "death", "damage" ); common_scripts\utility::flag_set( "sneaky_player" ); } set_sneaky_player_flag_on_trigger() { var_0 = getent( "combat_two_third_wave_extra", "targetname" ); var_0 waittill( "trigger" ); common_scripts\utility::flag_set( "sneaky_player" ); } wave_3_extra_spawn_func() { self endon( "death" ); wait 0.1; thread set_accuracy_when_allies_are_close(); common_scripts\utility::flag_wait( "combat_two_stop_ignore" ); self notify( "stop_ignoring" ); self.ignoreall = 0; self.ignoreme = 0; thread swap_goal_volumes( level.current_volume ); level waittill( "enemies_charge_player" ); self notify( "stop_goal_volume_swap" ); self.attackeraccuracy = 1; for (;;) { self setgoalpos( level.player.origin ); wait 0.1; } } set_stop_ignore_flag() { var_0 = getent( "ignore_volume", "targetname" ); var_0 thread ignore_timer( 10 ); var_1 = getent( "combat_two_second_wave_retreat", "targetname" ); var_2 = getent( "no_cover", "targetname" ); if ( isdefined( var_1 ) && isdefined( var_2 ) ) common_scripts\utility::waittill_any_ents( var_1, "trigger", var_2, "trigger", var_0, "time_up" ); common_scripts\utility::flag_set( "combat_two_stop_ignore" ); } ignore_timer( var_0 ) { self waittill( "trigger" ); wait( var_0 ); self notify( "time_up" ); } waittill_player_advances_or_timeout() { var_0 = getent( "ignore_volume", "targetname" ); var_1 = getent( "no_cover", "targetname" ); if ( isdefined( var_0 ) && isdefined( var_1 ) ) common_scripts\utility::waittill_any_ents( var_0, "trigger", var_1, "trigger", self, "initial_path_completed", self, "stop_ignoring" ); } ai_advancing_logic() { level thread enemy_goal_volume_logic(); var_0 = getent( "combat_two_third_wave", "targetname" ); var_0 waittill( "trigger" ); var_1 = spawn( "script_origin", level.player.origin ); wait 0.1; var_1.angles = level.player.angles; level.player playerlinktodelta( var_1 ); level.player disableweapons(); wait 0.2; level.player unlink(); var_1 delete(); var_2 = level.space_speed / 5; setsaveddvar( "player_swimSpeed", var_2 ); wait 3.0; level.allies[0] maps\_utility::set_goal_node_targetname( "combat_two_ally0_node_start" ); wait 1.0; level.allies[1] maps\_utility::set_goal_node_targetname( "combat_two_ally1_node_start" ); var_0 = getent( "combat_two_second_wave_push", "targetname" ); var_0 notify( "trigger" ); level thread allies_color_advance_logic(); wait 1.0; level thread set_flag_on_trigger_or_ai_count( "section2", "combat_two_second_wave_retreat_trigger", 4, 0 ); level thread set_flag_on_trigger_or_ai_count( "section3", "combat_two_third_wave_push_0_trigger", 7, 1 ); level thread set_flag_on_trigger_or_ai_count( "section4", "combat_two_third_wave_push_1_trigger", 4, 1 ); level thread set_flag_on_trigger_or_ai_count( "section5", "combat_two_third_wave_push_1_5_trigger", 3, 1 ); wait 4.0; setsaveddvar( "player_swimSpeed", var_2 * 2 ); if ( maps\_utility::is_gen4() ) setsaveddvar( "r_mbEnable", 0 ); wait 3.0; level.player enableweapons(); level.player enableweaponswitch(); level.player showviewmodel(); setsaveddvar( "player_swimSpeed", level.space_speed ); thread maps\loki_util::loki_autosave_by_name( "combat_two_begin" ); level notify( "combat_2_unlinked" ); } set_flag_on_trigger_or_ai_count( var_0, var_1, var_2, var_3 ) { var_4 = getent( var_1, "targetname" ); if ( isdefined( var_4 ) ) var_4 waittill( "trigger" ); common_scripts\utility::flag_set( var_0 ); } spawn_enemies_on_ai_count() { while ( maps\_utility::get_ai_group_sentient_count( "combat_two_enemies" ) > 3 || level.combat_two_spawns < 6 ) wait 0.1; common_scripts\utility::flag_set( "section3_justmove" ); wait 0.5; while ( maps\_utility::get_ai_group_sentient_count( "combat_two_enemies" ) > 3 || level.combat_two_spawns < 9 ) { if ( !common_scripts\utility::flag( "section3" ) && maps\_utility::get_ai_group_sentient_count( "combat_two_enemies" ) < 1 ) common_scripts\utility::flag_set( "section3" ); wait 0.1; } common_scripts\utility::flag_set( "section4" ); wait 0.5; while ( maps\_utility::get_ai_group_sentient_count( "combat_two_enemies" ) > 2 || level.combat_two_spawns < 13 ) wait 0.1; level notify( "enemies_charge_player" ); while ( maps\_utility::get_ai_group_sentient_count( "combat_two_enemies" ) > 0 ) wait 0.1; common_scripts\utility::flag_set( "section5" ); } spawn_enemies_on_flag() { common_scripts\utility::flag_wait_any( "section5", "section4", "section3", "section2" ); enemy_spawn( "combat_two_enemy_wave_3_extra", ::wave_3_spawn_func ); enemy_spawn( "combat_two_enemy_wave_3_extra_high", ::wave_3_high_spawn_func ); common_scripts\utility::flag_wait_any( "section5", "section4", "section3" ); enemy_spawn( "combat_two_enemy_wave_3_extra_2", ::wave_3_spawn_func ); enemy_spawn( "combat_two_enemy_wave_3_extra_2_high", ::wave_3_high_spawn_func ); common_scripts\utility::flag_wait_any( "section5", "section4" ); enemy_spawn( "combat_two_enemy_wave_3_extra_3", ::wave_3_spawn_func ); enemy_spawn( "combat_two_enemy_wave_3_extra_3_high", ::wave_3_high_spawn_func ); } allies_color_advance_logic() { for (;;) { if ( common_scripts\utility::flag( "section5" ) ) { var_0 = getent( "combat_two_third_wave_push_1_5", "targetname" ); if ( isdefined( var_0 ) ) var_0 notify( "trigger" ); break; } else if ( common_scripts\utility::flag( "section4" ) ) { var_0 = getent( "combat_two_third_wave_push_1", "targetname" ); if ( isdefined( var_0 ) ) var_0 notify( "trigger" ); } else if ( common_scripts\utility::flag( "section3" ) || common_scripts\utility::flag( "section3_justmove" ) ) { var_0 = getent( "combat_two_third_wave_push_0", "targetname" ); if ( isdefined( var_0 ) ) { var_0 notify( "trigger" ); if ( !common_scripts\utility::flag( "section3" ) ) level notify( "section_3_move_up" ); } } else if ( common_scripts\utility::flag( "section2" ) ) { var_0 = getent( "combat_two_second_wave_retreat", "targetname" ); if ( isdefined( var_0 ) ) var_0 notify( "trigger" ); } wait 0.1; } } ally0_traversal_logic() { while ( !common_scripts\utility::flag( "section2" ) ) wait 0.1; } ally_target_logic() { level.allies[0].ignoreall = 1; level.allies[0].ignoresuppression = 1; thread set_flag_when_first_enemies_dead( "first_enemies_dead", level.enemy_chargers ); common_scripts\utility::flag_wait( "section2" ); common_scripts\utility::flag_wait( "combat_two_anim_intro_ally0_done" ); level.allies[0].ignoreall = 1; thread wait_for_time_then_shoot_bomb( 8.0 ); common_scripts\utility::flag_wait( "first_enemies_dead" ); wait 2.2; level.allies[0] clearentitytarget(); level.allies[0].ignoresuppression = 0; level.allies[0] maps\_utility::set_goal_node_targetname( "combat_two_ally0_node" ); level.allies[1] maps\_utility::set_goal_node_targetname( "combat_two_ally1_node" ); } enemies_around_nitro( var_0 ) { if ( isdefined( var_0 ) ) { foreach ( var_2 in level.enemy_chargers ) { if ( isalive( var_2 ) && distance( var_2.origin, var_0.origin ) < 250 ) return 1; } } return 0; } wait_for_time_then_shoot_bomb( var_0 ) { level endon( "first_enemies_dead" ); var_1 = getent( "nitro_target", "targetname" ); var_2 = getent( "nitro_target_first", "targetname" ); common_scripts\utility::flag_wait_or_timeout( "section3", var_0 ); while ( enemies_around_nitro( var_1 ) ) { level.allies[0] setentitytarget( var_1 ); wait 0.1; } level.allies[0] clearentitytarget(); } set_flag_when_first_enemies_dead( var_0, var_1 ) { while ( !isdefined( level.enemy_chargers ) || level.enemy_chargers.size < 2 ) wait 0.1; while ( level.enemy_chargers.size ) { level.enemy_chargers = maps\_utility::array_removedead_or_dying( level.enemy_chargers ); wait 0.1; } common_scripts\utility::flag_set( var_0 ); } set_flag_after_timer( var_0, var_1 ) { wait( var_1 ); common_scripts\utility::flag_set( var_0 ); } change_enemy_priority() { createthreatbiasgroup( "higher_targets" ); createthreatbiasgroup( "lower_targets" ); setthreatbias( "allies", "higher_targets", 1000 ); setthreatbias( "allies", "lower_targets", 10 ); while ( !common_scripts\utility::flag( "combat_two_done" ) ) { var_0 = getaiarray( "axis" ); foreach ( var_2 in var_0 ) { if ( var_2.origin[2] > 73950 ) { var_2 setthreatbiasgroup(); var_2 setthreatbiasgroup( "higher_targets" ); continue; } var_2 setthreatbiasgroup(); var_2 setthreatbiasgroup( "lower_targets" ); } wait 0.1; } } orient_ally( var_0 ) { var_1 = ( self.angles[0], self.angles[1], 0 ); for ( var_2 = 0; var_2 < var_0; var_2++ ) { var_3 = maps\_space_ai::fake_slerp( self.angles, var_1, var_2 / var_0 ); self orientmode( "face angle 3d", var_3, 1 ); wait 0.05; } } enemy_goal_volume_logic() { for (;;) { if ( common_scripts\utility::flag( "section5" ) ) { var_0 = getent( "wave_3_push_advance_volume_2", "targetname" ); level.current_volume = var_0; var_0 = getent( "wave_3_push_advance_volume_2_high", "targetname" ); level.current_high_volume = var_0; break; } else if ( common_scripts\utility::flag( "section4" ) ) { var_0 = getent( "wave_3_push_advance_volume_2", "targetname" ); level.current_volume = var_0; var_0 = getent( "wave_3_push_advance_volume_2_high", "targetname" ); level.current_high_volume = var_0; } else if ( common_scripts\utility::flag( "section3" ) ) { var_0 = getent( "wave_3_push_advance_volume_1", "targetname" ); level.current_volume = var_0; var_0 = getent( "wave_3_push_advance_volume_1_high", "targetname" ); level.current_high_volume = var_0; } else { var_0 = getent( "wave_3_safe_volume", "targetname" ); level.current_volume = var_0; var_0 = getent( "wave_3_safe_volume_high", "targetname" ); level.current_high_volume = var_0; } wait 0.1; } } turn_off_trigger_on_notify( var_0, var_1 ) { level endon( "end_of_combat_two" ); level waittill( var_1 ); var_2 = getent( var_0, "targetname" ); if ( isdefined( var_2 ) ) var_2 delete(); } swap_goal_volumes( var_0 ) { self endon( "death" ); self endon( "stop_goal_volume_swap" ); var_1 = getent( "no_cover", "targetname" ); var_2 = getent( "wave_3_underside", "targetname" ); var_3 = getent( "wave_3_in_open_goal_volume", "targetname" ); var_4 = getent( "wave_3_everywhere_below_goal_volume", "targetname" ); wait 0.1; if ( isalive( self ) ) { self setgoalvolumeauto( var_0 ); if ( isdefined( self.node ) ) self setgoalpos( self.node.origin ); var_5 = level.current_volume; var_6 = self.baseaccuracy; while ( !common_scripts\utility::flag( "combat_two_done" ) ) { if ( level.player istouching( var_1 ) && !common_scripts\utility::flag( "combat_two_stage_1_done" ) ) { if ( var_5 != var_3 ) { var_5 = var_3; self setgoalvolumeauto( var_3 ); self.favoriteenemy = level.player; } } else if ( level.player istouching( var_2 ) ) { if ( var_5 != var_4 ) { var_5 = var_4; self setgoalvolumeauto( var_4 ); self.favoriteenemy = level.player; } } else if ( var_5 != var_0 ) { var_5 = var_0; self setgoalvolumeauto( var_0 ); self.favoriteenemy = undefined; } wait 0.1; } } } send_guy_to_node_then_rotate() { var_0 = undefined; while ( !isdefined( var_0 ) ) { var_1 = getaiarray( "axis" ); foreach ( var_3 in var_1 ) { if ( isdefined( var_3.script_noteworthy ) && var_3.script_noteworthy == "spinning_cover_guy" ) var_0 = var_3; } wait 0.1; } var_0.goalradius = 4; var_0.ignoreall = 1; thread spinning_object( "spinning_crate", 1 ); } spinning_cover( var_0, var_1 ) { var_2 = getent( var_0, "targetname" ); var_3 = getent( var_0 + "_clip", "targetname" ); if ( isdefined( var_1 ) && isalive( var_1 ) ) { var_1 waittill( "goal" ); var_1 linkto( var_2 ); var_1.ignoreall = 0; var_2 rotatevelocity( ( 0, 0, 2 ), 9999 ); var_3 rotatevelocity( ( 0, 0, 2 ), 9999 ); } while ( isdefined( var_1 ) && isalive( var_1 ) ) { var_1 thread maps\_space_ai::doing_in_space_rotation( var_1.angles, var_2.angles, 4 ); wait 0.1; } } spinning_object( var_0, var_1 ) { var_2 = getentarray( var_0, "script_noteworthy" ); foreach ( var_4 in var_2 ) { if ( isdefined( var_4.target ) ) { var_5 = getent( var_4.target, "targetname" ); var_5 linkto( var_4 ); } var_4 rotatevelocity( ( 0, 0, 2 ), 9999 ); } } check_for_combat_two_done() { common_scripts\utility::flag_wait( "section5" ); while ( level.combat_two_spawns < 13 ) wait 0.1; wait 1.0; while ( maps\_utility::get_ai_group_sentient_count( "combat_two_enemies" ) > 0 ) wait 0.1; level.allies[0].goalradius = 4; level.allies[1].goalradius = 4; var_0 = getent( "combat_two_final_orders", "targetname" ); var_0 notify( "trigger" ); common_scripts\utility::flag_set( "combat_two_done" ); } trigger_wave_3_during_moving_cover() { level.enemy_chargers = []; level thread trigger_enemy_spawn( "combat_two_third_wave", "combat_two_enemy_wave_3", ::wave_3_spawn_func ); level thread trigger_enemy_spawn( "combat_two_third_wave", "combat_two_enemy_wave_3_high", ::wave_3_high_spawn_func ); level thread trigger_enemy_spawn_in_order( "combat_two_second_wave_retreat_trigger", "combat_two_enemy_wave_3_charge", ::wave_3_charge_spawn_func, 2 ); } ignore_all_until_damaged() { self endon( "stop_ignoring" ); self.ignoreall = 1; self.ignoreme = 1; self waittill( "damage", var_0, var_1 ); if ( isdefined( var_1 ) ) { if ( var_1 == level.player ) { self.ignoreall = 0; var_2 = getaiarray( "axis" ); var_3 = maps\_utility::get_closest_living( self.origin, var_2, 100 ); if ( isdefined( var_3 ) && isalive( var_3 ) ) { var_3.ignoreall = 0; var_3 notify( "stop_ignoring" ); } } } } ignore_player_after_time( var_0, var_1 ) { level thread set_flag_when_not_firing( var_0 ); var_2 = getent( "ignore_volume", "targetname" ); for (;;) { if ( level.player istouching( var_2 ) && !common_scripts\utility::flag( "player_is_firing" ) && var_1 > 0 ) { if ( !level.player.ignoreme ) { level.player.ignoreme = 1; var_1--; } } else if ( level.player.ignoreme ) level.player.ignoreme = 0; wait 0.1; } } set_flag_when_not_firing( var_0 ) { var_1 = 60 * var_0; var_2 = var_1; for (;;) { if ( level.player attackbuttonpressed() ) { var_2 = 0; if ( !common_scripts\utility::flag( "player_is_firing" ) ) common_scripts\utility::flag_set( "player_is_firing" ); } else var_2++; if ( var_2 > var_1 ) { if ( common_scripts\utility::flag( "player_is_firing" ) ) common_scripts\utility::flag_clear( "player_is_firing" ); } common_scripts\utility::waitframe(); } } set_accuracy_when_allies_are_close() { self endon( "death" ); for (;;) { foreach ( var_1 in level.allies ) { if ( isalive( var_1 ) ) { if ( distance( self.origin, var_1.origin ) < 300 ) self.attackeraccuracy = 1; } } wait 0.1; } } combat_two_intro_vignette( var_0 ) { wait( var_0 ); level.allies[0] thread ally_0_animation(); level.allies[1] thread ally_1_animation(); } push_crates( var_0 ) { level.space_crate_01.animname = "combat_two_ally_01_crate_01"; level.space_crate_01 maps\_utility::assign_animtree(); level.space_crate_02.animname = "combat_two_ally_01_crate_02"; level.space_crate_02 maps\_utility::assign_animtree(); level.space_crate_01 thread maps\_anim::anim_single_solo( level.space_crate_01, "combat_two_trans_1" ); level.space_crate_02 thread maps\_anim::anim_single_solo( level.space_crate_02, "combat_two_trans_1" ); } ally_0_animation() { self stopanimscripted(); self pushplayer( 1 ); self.fixednode = 1; self notify( "stop_traversal_hit_detection" ); common_scripts\utility::waitframe(); var_0 = getnode( "combat_two_ally1_node", "targetname" ); var_1 = spawn( "script_origin", var_0.origin ); var_1.angles = ( 0, 0, 0 ); level.combat_two_start_anim_node = var_1; wait 0.1; maps\_utility::set_goal_node_targetname( "combat_two_ally0_node_start" ); var_2 = maps\_utility::spawn_anim_model( "combat_two_ally_02_crate_01" ); var_3 = []; var_3["ally_0"] = level.allies[0]; var_3["combat_two_ally_02_crate_01"] = var_2; var_1 maps\_anim::anim_single( var_3, "combat_two_trans_1" ); common_scripts\utility::flag_set( "combat_two_anim_intro_ally0_done" ); common_scripts\utility::flag_wait( "section2" ); common_scripts\utility::flag_wait( "first_enemies_dead" ); wait 2.0; self.ignoreall = 1; var_4 = getnode( "combat_two_ally0_node", "targetname" ); self setgoalnode( var_4 ); self.disablearrivals = undefined; self waittill( "goal" ); self.ignoreall = 0; common_scripts\utility::flag_wait_any( "section3_justmove", "section3" ); wait_until_volume_empty( "combat_two_safe_volume_2" ); var_5 = getnode( "combat_two_ally0_node_2", "targetname" ); while ( distance( level.player.origin, var_5.origin ) < 50 ) wait 0.1; var_3 = []; var_3["ally_0"] = level.allies[0]; thread maps\loki_combat_one::force_traversal_check_hit(); var_1 maps\_anim::anim_reach_solo( self, "combat_two_trans_2" ); maps\_utility::delaythread( 0.5, maps\_utility::set_goal_node_targetname, "combat_two_ally0_node_2" ); var_1 maps\_anim::anim_single( var_3, "combat_two_trans_2" ); self notify( "stop_traversal_hit_detection" ); common_scripts\utility::flag_wait( "section3" ); common_scripts\utility::flag_wait( "section4" ); wait_until_volume_empty( "combat_two_safe_volume_3" ); wait 4.0; var_5 = getnode( "combat_two_ally0_node_3", "targetname" ); while ( distance( level.player.origin, var_5.origin ) < 50 ) wait 0.1; thread maps\loki_combat_one::force_traversal_check_hit(); var_1 maps\_anim::anim_reach_solo( self, "combat_two_trans_3" ); maps\_utility::delaythread( 0.5, maps\_utility::set_goal_node_targetname, "combat_two_ally0_node_3" ); var_1 maps\_anim::anim_single( var_3, "combat_two_trans_3" ); self notify( "stop_traversal_hit_detection" ); common_scripts\utility::flag_wait( "combat_two_done" ); var_1 notify( "stop_loop" ); common_scripts\utility::waitframe(); var_1 maps\_anim::anim_reach_solo( self, "combat_two_trans_4" ); maps\_utility::delaythread( 0.5, maps\_utility::set_goal_node_targetname, "ally_0_breach_node" ); var_1 maps\_anim::anim_single( var_3, "combat_two_trans_4" ); common_scripts\utility::flag_set( "ally_0_combat_two_anims_finished" ); var_1 thread maps\_anim::anim_loop( var_3, "combat_two_trans_4_loop", "stop_loop" ); common_scripts\utility::flag_wait( "charge_set" ); var_1 notify( "stop_loop" ); level.space_crate_01 delete(); level.space_crate_02 delete(); var_2 delete(); var_1 delete(); } ally_1_animation() { self stopanimscripted(); self pushplayer( 1 ); self.fixednode = 1; self.goalradius = 40; self notify( "stop_traversal_hit_detection" ); common_scripts\utility::waitframe(); var_0 = getnode( "combat_two_ally1_node", "targetname" ); var_1 = spawn( "script_origin", var_0.origin ); var_1.angles = ( 0, 0, 0 ); wait 0.1; var_2 = maps\_utility::spawn_anim_model( "combat_two_ally_02_trans_2_crate", var_1.origin ); var_3 = []; var_3["combat_two_ally_02_trans_2_crate"] = var_2; var_1 maps\_anim::anim_first_frame( var_3, "combat_two_trans_2" ); var_4 = spawn( "script_origin", var_2.origin ); var_4 linkto( var_2 ); var_5 = getentarray( "spinning_crate_collision", "targetname" ); foreach ( var_7 in var_5 ) var_7 linkto( var_4 ); var_3 = []; var_3["ally_1"] = level.allies[1]; var_1 maps\_anim::anim_single( var_3, "combat_two_trans_1" ); var_1 thread maps\_anim::anim_loop( var_3, "combat_two_trans_1_loop", "stop_loop" ); common_scripts\utility::flag_wait( "section2" ); common_scripts\utility::flag_wait( "first_enemies_dead" ); wait 2.0; var_1 notify( "stop_loop" ); thread maps\loki_combat_one::force_traversal_check_hit(); maps\_utility::delaythread( 0.5, maps\_utility::set_goal_node_targetname, "combat_two_ally1_node" ); var_1 maps\_anim::anim_single( var_3, "combat_two_trans_1_exit" ); self notify( "stop_traversal_hit_detection" ); self.goalradius = 40; common_scripts\utility::flag_set( "combat_two_anim_intro_ally1_done" ); self.fixednode = 1; self notify( "force_space_rotation_update", 0, 0 ); common_scripts\utility::flag_wait_any( "section3_justmove", "section3" ); wait_until_volume_empty( "combat_two_safe_volume_2" ); var_9 = getnode( "combat_two_ally1_node_2", "targetname" ); while ( distance( level.player.origin, var_9.origin ) < 50 ) wait 0.1; thread maps\loki_combat_one::force_traversal_check_hit(); var_1 maps\_anim::anim_reach_solo( self, "combat_two_trans_2" ); maps\_utility::delaythread( 0.5, maps\_utility::set_goal_node_targetname, "combat_two_ally1_node_2" ); level thread handle_player_crate_interaction(); var_3 = []; var_3["ally_1"] = level.allies[1]; var_3["combat_two_ally_02_trans_2_crate"] = var_2; var_1 maps\_anim::anim_single( var_3, "combat_two_trans_2" ); self notify( "stop_traversal_hit_detection" ); self.goalradius = 40; level thread kill_enemy_at_arm_node(); common_scripts\utility::flag_wait( "section3" ); common_scripts\utility::flag_wait( "section4" ); wait_until_volume_empty( "combat_two_safe_volume_3" ); var_9 = getnode( "combat_two_ally1_node_3", "targetname" ); while ( distance( level.player.origin, var_9.origin ) < 50 ) wait 0.1; thread maps\loki_combat_one::force_traversal_check_hit(); var_1 maps\_anim::anim_reach_solo( self, "combat_two_trans_3" ); maps\_utility::delaythread( 0.5, maps\_utility::set_goal_node_targetname, "combat_two_ally1_node_3" ); var_3 = []; var_3["ally_1"] = level.allies[1]; var_1 maps\_anim::anim_single( var_3, "combat_two_trans_3" ); self notify( "stop_traversal_hit_detection" ); common_scripts\utility::flag_wait( "combat_two_done" ); var_1 notify( "stop_loop" ); common_scripts\utility::waitframe(); var_1 maps\_anim::anim_reach_solo( self, "combat_two_trans_4" ); maps\_utility::delaythread( 0.5, maps\_utility::set_goal_node_targetname, "ally_1_breach_node" ); var_1 maps\_anim::anim_single( var_3, "combat_two_trans_4" ); common_scripts\utility::flag_set( "ally_1_combat_two_anims_finished" ); var_1 thread maps\_anim::anim_loop( var_3, "combat_two_trans_4_loop", "stop_loop" ); common_scripts\utility::flag_wait( "charge_set" ); var_1 notify( "stop_loop" ); var_1 delete(); } handle_player_crate_interaction() { level endon( "crate_anim_done" ); while ( !common_scripts\utility::flag( "charge_set" ) ) { level.player forcemovingplatformentity( undefined ); common_scripts\utility::waitframe(); } } turn_on_node_once_player_advances( var_0 ) { wait 0.1; var_1 = getnode( var_0, "targetname" ); if ( isdefined( var_1 ) ) { var_1 disconnectnode(); common_scripts\utility::flag_wait( "combat_two_anim_intro_ally1_done" ); var_1 connectnode(); } } rotate_intel() { wait 3.0; var_0 = getentarray( "intel_laptop", "script_noteworthy" ); var_1 = getent( "intelligence_item", "targetname" ); var_2 = undefined; foreach ( var_4 in var_0 ) { if ( var_4.classname == "script_model" ) { var_4 rotatevelocity( ( -2, 0, -7 ), 9999 ); var_4 moveto( var_4.origin + ( 0, 0, 450 ), 120 ); var_2 = var_4; } } if ( isdefined( var_2 ) ) { while ( !common_scripts\utility::flag( "space_breach_done" ) ) { var_1.origin = var_2.origin; common_scripts\utility::waitframe(); } } } fake_function() { level.player setplayerangles( ( 0, 90, 0 ) ); } turn_on_ally_tracker() { common_scripts\utility::flag_wait( "turn_on_tracker" ); var_0 = newhudelem(); var_0 setshader( "apache_target_lock", 1, 1 ); var_0.alpha = 1.0; var_0.color = ( 0, 1, 1 ); var_0 setwaypoint( 1 ); objective_position( maps\_utility::obj( "obj_advance" ), self.origin ); while ( !common_scripts\utility::flag( "combat_two_done" ) ) { var_0.x = self gettagorigin( "j_spinelower" )[0]; var_0.y = self gettagorigin( "j_spinelower" )[1]; var_0.z = self gettagorigin( "j_spinelower" )[2]; common_scripts\utility::waitframe(); } var_0 destroy(); } kill_enemy_at_arm_node() { var_0 = getnode( "combat_two_ally1_node_2", "targetname" ); var_1 = getnode( "arm_node", "script_noteworthy" ); var_2 = spawn( "script_origin", var_1.origin ); var_3 = undefined; var_4 = 0.1; while ( !common_scripts\utility::flag( "combat_two_done" ) ) { if ( isnodeoccupied( var_0 ) && isnodeoccupied( var_1 ) ) { var_5 = getaiarray( "axis" ); var_3 = undefined; foreach ( var_7 in var_5 ) { if ( distance( var_7.origin, var_1.origin ) < 60 ) var_3 = var_7; } if ( isdefined( var_3 ) ) { var_4 = var_3.attackeraccuracy; var_3.attackeraccuracy = 10.0; var_2.origin = var_3.origin + ( 5, 5, 20 ); level.allies[1].favoriteenemy = var_3; } } else { if ( isdefined( var_3 ) && isalive( var_3 ) ) { var_3.attackeraccuracy = var_4; var_3 = undefined; } level.allies[1].favoriteenemy = undefined; } wait 0.1; } level.allies[1].ignoreall = 0; var_2 delete(); } diable_nodes_if_near_player() { var_0 = getentarray( "disable_nodes", "targetname" ); foreach ( var_2 in var_0 ) var_2 thread turn_off_nodes(); } disable_nodes_if_allies_nearby( var_0 ) { var_1 = 200; while ( !common_scripts\utility::flag( "combat_two_done" ) ) { var_2 = 0; var_3 = getnodearray( "close_node", "script_noteworthy" ); foreach ( var_5 in var_3 ) { if ( distance( self.origin, var_5.origin ) < var_1 ) { var_2 = 1; var_5 disconnectnode(); badplace_cylinder( var_0, 0, var_5.origin, 32, 32, "axis" ); } } if ( !var_2 ) badplace_delete( var_0 ); wait 0.1; } } disable_nodes_before_allies_move() { common_scripts\utility::flag_wait( "section3" ); thread disconnect_and_bad_place( "left_pallet_node", "script_noteworthy" ); thread disconnect_and_bad_place( "right_pallet_node", "script_noteworthy" ); thread disconnect_and_bad_place( "exposed_node_advance", "targetname" ); common_scripts\utility::flag_wait( "section4" ); thread disconnect_and_bad_place( "center_cover_1", "script_noteworthy" ); thread disconnect_and_bad_place( "center_cover_2", "script_noteworthy" ); thread disconnect_and_bad_place( "right_three_box_node", "script_noteworthy" ); thread disconnect_and_bad_place( "right_back_three_box_node", "script_noteworthy" ); thread disconnect_and_bad_place( "back_three_box_node", "script_noteworthy" ); } disconnect_and_bad_place( var_0, var_1 ) { var_2 = getnode( var_0, var_1 ); if ( isdefined( var_2 ) ) { var_2 disconnectnode(); badplace_cylinder( var_0, 0, var_2.origin, 32, 32, "axis" ); } } turn_off_nodes() { while ( !common_scripts\utility::flag( "combat_two_done" ) ) { if ( level.player istouching( self ) ) { var_0 = getnodearray( "node_to_disable", "targetname" ); foreach ( var_2 in var_0 ) var_2 disconnectnode(); } else { var_0 = getnodearray( "node_to_disable", "targetname" ); foreach ( var_2 in var_0 ) var_2 connectnode(); } wait 0.1; } } node_preference_logic() { var_0 = getnode( "arm_node", "script_noteworthy" ); var_1 = getnode( "left_pallet_node", "targetname" ); level thread node_change_logic( var_0, var_1 ); common_scripts\utility::flag_wait_any( "section5", "section4", "section3" ); var_0 = getnode( "small_crates_node", "script_noteworthy" ); var_2 = getnode( "center_cover_1", "script_noteworthy" ); var_3 = getnode( "center_cover_2", "script_noteworthy" ); var_1 = maps\_utility::make_array( var_2, var_3 ); level thread node_change_logic( var_0, var_1 ); common_scripts\utility::flag_wait_any( "section5", "section4" ); var_0 = getnode( "floating_crate_2", "script_noteworthy" ); var_1 = getnode( "back_cover_2", "script_noteworthy" ); level thread node_change_logic( var_0, var_1 ); var_0 = getnode( "floating_crate_1", "script_noteworthy" ); var_1 = getnode( "back_cover_1", "script_noteworthy" ); level thread node_change_logic( var_0, var_1 ); } node_change_logic( var_0, var_1 ) { if ( !isarray( var_1 ) ) var_1 = maps\_utility::make_array( var_1 ); var_2 = 1; while ( !common_scripts\utility::flag( "combat_two_done" ) ) { var_3 = 0; if ( !isnodeoccupied( var_0 ) ) { foreach ( var_5 in var_1 ) { if ( isnodeoccupied( var_5 ) ) { if ( !var_3 ) { var_0 disconnectnode(); var_3 = 1; var_2 = 0; } } } if ( !var_3 && !var_2 ) { var_0 connectnode(); var_2 = 1; } } common_scripts\utility::waitframe(); } } moving_large_debris() { var_0 = getentarray( "ambient_debris", "targetname" ); var_1 = getent( "ambient_debris_ref_node", "targetname" ); var_2 = 20000; var_3 = 2000; foreach ( var_5 in var_0 ) var_5 hide(); common_scripts\utility::flag_wait( "moving_cover_done2" ); foreach ( var_5 in var_0 ) { var_5 show(); var_8 = var_5.origin - var_1.origin; var_8 = vectornormalize( var_8 ); if ( isdefined( var_5.script_noteworthy ) && var_5.script_noteworthy == "small_debris" ) { var_9 = var_3 * randomfloatrange( 0.2, 0.3 ); var_10 = ( randomintrange( 10, 20 ), randomintrange( 10, 20 ), randomintrange( 10, 20 ) ); } else { var_9 = var_3 * randomfloatrange( 1.0, 2.0 ); var_10 = ( randomintrange( 1, 20 ), randomintrange( 1, 20 ), randomintrange( 1, 20 ) ); } var_11 = var_8 * var_2 + var_5.origin; var_5 moveto( var_11, var_9 ); var_5 rotatevelocity( var_10, var_3 ); } common_scripts\utility::flag_wait( "charge_set" ); foreach ( var_5 in var_0 ) var_5 delete(); } fail_if_player_too_far() { level endon( "charge_set" ); var_0 = getent( "player_too_far", "targetname" ); var_0 waittill( "trigger" ); setdvar( "ui_deadquote", &"LOKI_BOUNDS_FAIL" ); level thread maps\_utility::missionfailedwrapper(); } combat_two_dialogue() { level.player endon( "death" ); waittill_trigger_targetname( "ignore_volume" ); maps\_utility::battlechatter_off( "allies" ); wait 7.0; maps\_utility::smart_radio_dialogue( "loki_gs3_thompsonwecantstop" ); common_scripts\utility::flag_set( "combat_two_music_start" ); common_scripts\utility::flag_wait( "combat_two_charge_enemy_spawned" ); wait 2.0; while ( !common_scripts\utility::flag( "first_enemies_dead" ) ) { if ( common_scripts\utility::flag( "enemies_above" ) ) { maps\_utility::smart_radio_dialogue( "loki_kgn_thompsontangos12high" ); break; } wait 0.1; } common_scripts\utility::flag_wait( "first_enemies_dead" ); wait 2.0; maps\_utility::smart_radio_dialogue( "loki_mrk_icaruscommandweretaking" ); maps\_utility::smart_radio_dialogue( "loki_gs3_werenearthecontrol" ); maps\_utility::smart_radio_dialogue( "loki_gs3_wellhavetobreach" ); maps\_utility::battlechatter_on( "allies" ); waittill_trigger_targetname( "combat_two_second_wave_push", 10 ); waittill_trigger_targetname( "combat_two_third_wave_extra" ); wait 2.0; common_scripts\utility::flag_wait( "combat_two_done" ); maps\_utility::battlechatter_off( "allies" ); thread maps\loki_audio::sfx_end_combat_amb(); maps\_utility::smart_radio_dialogue( "loki_gs3_allclearmoveup" ); var_0 = getent( "combat_two_third_wave_push_2_trigger", "targetname" ); if ( !level.player istouching( var_0 ) ) { maps\_utility::smart_radio_dialogue( "loki_mrk_icaruscommandourground" ); maps\_utility::smart_radio_dialogue( "loki_gs3_copywerebreachingnow" ); } else maps\_utility::smart_radio_dialogue( "loki_kgn_controlmodulesjustahead" ); common_scripts\utility::flag_set( "combat_two_dialogue_done" ); } vo_move_up() { level waittill( "section_3_move_up" ); wait 5.0; if ( !common_scripts\utility::flag( "section3" ) ) maps\_utility::smart_radio_dialogue( "loki_kgn_keeppressingthompson" ); } waittill_trigger_targetname( var_0, var_1 ) { var_2 = getent( var_0, "targetname" ); if ( isdefined( var_2 ) ) { if ( isdefined( var_1 ) ) var_2 childthread common_scripts\utility::_timeout( var_1 ); var_2 common_scripts\utility::waittill_any( "trigger", "returned" ); } }