933 lines
34 KiB
Plaintext
933 lines
34 KiB
Plaintext
// IW6 GSC SOURCE
|
|
// Generated by https://github.com/xensik/gsc-tool
|
|
|
|
enemyhq_finale_pre_load()
|
|
{
|
|
common_scripts\utility::flag_init( "finale_sniping" );
|
|
common_scripts\utility::flag_init( "open_finale_doors" );
|
|
common_scripts\utility::flag_init( "start_butchdance" );
|
|
common_scripts\utility::flag_init( "end_of_sniping" );
|
|
common_scripts\utility::flag_init( "butchdance_sniping" );
|
|
common_scripts\utility::flag_init( "finale_combat1" );
|
|
common_scripts\utility::flag_init( "finale_combat3" );
|
|
common_scripts\utility::flag_init( "more_finale_guys" );
|
|
common_scripts\utility::flag_init( "flyaway_baddies" );
|
|
common_scripts\utility::flag_init( "flyaway_lynx2" );
|
|
common_scripts\utility::flag_init( "finale_done" );
|
|
common_scripts\utility::flag_init( "merrick_exfil" );
|
|
common_scripts\utility::flag_init( "ghosts_exfil2" );
|
|
common_scripts\utility::flag_init( "chopper_ready" );
|
|
common_scripts\utility::flag_init( "killed_trucks" );
|
|
common_scripts\utility::flag_init( "obj_escape_complete" );
|
|
common_scripts\utility::flag_init( "stop_drones" );
|
|
}
|
|
|
|
setup_finale()
|
|
{
|
|
level.start_point = "finale";
|
|
maps\enemyhq::setup_common();
|
|
thread maps\enemyhq_audio::aud_check( "finale" );
|
|
common_scripts\utility::flag_set( "hvt_done" );
|
|
var_0 = getent( "bishop", "targetname" );
|
|
level.bishop = var_0 maps\_utility::spawn_ai( 1, 1 );
|
|
level.bishop.animname = "bishop";
|
|
level.bishop maps\_utility::make_hero();
|
|
level.bishop maps\_utility::gun_remove();
|
|
level.allies[1] maps\enemyhq_code::carry_bishop();
|
|
maps\enemyhq_code::safe_activate_trigger_with_targetname( "pre_exit" );
|
|
thread keegan_idle_with_bishop();
|
|
thread enable_finale_and_ghost_chopper_clips();
|
|
thread maps\enemyhq_code::handle_leave_team_fail( "leaving_clubhouse", "left_clubhouse" );
|
|
}
|
|
|
|
setup_new_finale()
|
|
{
|
|
setup_finale();
|
|
thread maps\enemyhq_audio::aud_check( "newfinale" );
|
|
}
|
|
|
|
begin_new_finale()
|
|
{
|
|
begin_finale();
|
|
}
|
|
|
|
#using_animtree("player");
|
|
|
|
begin_finale()
|
|
{
|
|
var_0 = getent( "dog_chopper_clip", "targetname" );
|
|
var_0 notsolid();
|
|
var_0 connectpaths();
|
|
level.sniper_vision_override = "enemyhq_sniper_view_b";
|
|
var_1 = getent( "finale_dead_truck_clip", "targetname" );
|
|
|
|
if ( isdefined( var_1 ) )
|
|
var_1 solid();
|
|
|
|
var_1 = getent( "finale_dead_truck", "targetname" );
|
|
|
|
if ( isdefined( var_1 ) )
|
|
var_1 show();
|
|
|
|
maps\_utility::stop_exploder( 8 );
|
|
common_scripts\utility::exploder( 888 );
|
|
maps\_utility::stop_exploder( 8010 );
|
|
maps\_utility::stop_exploder( 9090 );
|
|
level.ghost_chopper = maps\_vehicle::spawn_vehicles_from_targetname( "ghost_chopper" );
|
|
level.ghost_chopper = level.ghost_chopper[0];
|
|
var_2 = getaiarray( "axis" );
|
|
common_scripts\utility::array_thread( var_2, maps\enemyhq_code::die_quietly );
|
|
common_scripts\utility::array_thread( level.allies, maps\_utility::disable_pain );
|
|
common_scripts\utility::flag_clear( "done_sniping_early" );
|
|
maps\_utility::autosave_by_name( "finale" );
|
|
thread handle_agressive_player();
|
|
thread finale_vo();
|
|
thread new_finale_dog_hijack();
|
|
level.dog maps\enemyhq_code::lock_player_control();
|
|
thread butchdance_combat();
|
|
common_scripts\utility::flag_wait( "open_finale_doors" );
|
|
thread maps\enemyhq_audio::aud_door_bust_open();
|
|
thread open_exit_doors();
|
|
level.remote_sniper_return_struct = common_scripts\utility::getstruct( "butchdance_return_struct", "targetname" );
|
|
maps\enemyhq_code::safe_activate_trigger_with_targetname( "to_exit" );
|
|
common_scripts\utility::flag_wait( "start_butchdance" );
|
|
var_3 = common_scripts\utility::array_combine( level.allies, maps\_utility::make_array( level.bishop, level.dog ) );
|
|
common_scripts\utility::array_thread( var_3, ::super_guy, 1 );
|
|
common_scripts\utility::flag_wait( "butchdance_sniping" );
|
|
level notify( "stop_leave_fails" );
|
|
level.dog thread maps\_utility::disable_pain();
|
|
level.dog maps\_utility::set_ignoresuppression( 1 );
|
|
wait 0.5;
|
|
maps\enemyhq_code::safe_activate_trigger_with_targetname( "butchdance0" );
|
|
var_4 = getnode( "pre_exit_spot0", "targetname" );
|
|
level.allies[0] maps\_utility::teleport_ai( var_4 );
|
|
var_4 = getnode( "pre_exit_spot1", "targetname" );
|
|
level.allies[1] maps\_utility::teleport_ai( var_4 );
|
|
common_scripts\utility::flag_wait( "finale_asplode" );
|
|
var_5 = maps\_utility::spawn_anim_model( "player_rig" );
|
|
var_5 linkto( level.finale_chopper, "tag_origin", ( 0, 0, 0 ), ( 0, 0, 0 ) );
|
|
var_5 thread maps\_anim::anim_first_frame_solo( var_5, "get_in_chopper" );
|
|
var_5 hide();
|
|
wait 0.1;
|
|
common_scripts\utility::flag_wait( "get_in_choppa" );
|
|
var_6 = level.player.origin - level.finale_chopper.origin;
|
|
var_7 = anglestoright( level.finale_chopper.angles );
|
|
var_8 = vectordot( var_6, var_7 );
|
|
|
|
if ( var_8 > 0 )
|
|
{
|
|
var_9 = "right";
|
|
level.scr_anim["player_rig"]["get_in_chopper"] = %ehq_helicopter_enter_opposite_side_player;
|
|
var_5 thread maps\_anim::anim_first_frame_solo( var_5, "get_in_chopper" );
|
|
wait 0.05;
|
|
}
|
|
else
|
|
var_9 = "left";
|
|
|
|
level.player enableinvulnerability();
|
|
thread maps\_utility::autosave_now();
|
|
level.player allowcrouch( 0 );
|
|
level.player allowprone( 0 );
|
|
level.player setstance( "stand" );
|
|
level.player disableweapons();
|
|
level.player disableoffhandweapons();
|
|
level.player playerlinktoblend( var_5, "tag_player", 0.5 );
|
|
var_5 thread arms_delayed_show();
|
|
thread dog_ride_chopper( var_9 );
|
|
var_5 maps\_anim::anim_single_solo( var_5, "get_in_chopper" );
|
|
var_5 hide();
|
|
level.player playerlinktodelta( var_5, "tag_player", 1, 25, 45, 30, 30, 1 );
|
|
level.player enableweapons();
|
|
thread finale_flyaway();
|
|
thread finale_sniping();
|
|
wait 28;
|
|
var_10 = 5;
|
|
thread digital_out( 0.5, var_10 );
|
|
wait 2.5;
|
|
common_scripts\utility::flag_set( "finale_done" );
|
|
level.player notify( "fadeup_static_finale" );
|
|
wait 3.5;
|
|
var_11 = maps\enemyhq_code::create_overlay_element( "black", 0 );
|
|
var_11 fadeovertime( 2 );
|
|
var_11.alpha = 1;
|
|
wait 2;
|
|
maps\_utility::nextmission();
|
|
wait 10;
|
|
}
|
|
|
|
arms_delayed_show()
|
|
{
|
|
wait 0.5;
|
|
self show();
|
|
}
|
|
|
|
digital_out( var_0, var_1 )
|
|
{
|
|
var_2 = 0;
|
|
var_3 = 0.3;
|
|
var_4 = var_2;
|
|
|
|
if ( isdefined( var_0 ) )
|
|
var_3 = var_0;
|
|
|
|
var_5 = 1.25;
|
|
|
|
if ( isdefined( var_1 ) )
|
|
var_5 = var_1;
|
|
|
|
var_6 = 0.05;
|
|
var_7 = var_5 / var_6;
|
|
var_8 = 1 / var_7;
|
|
var_9 = 90 / var_7;
|
|
var_10 = 89.9;
|
|
|
|
while ( var_10 > 0 )
|
|
{
|
|
var_11 = cos( var_10 );
|
|
level.player digitaldistortsetparams( var_11, var_11 );
|
|
wait 0.05;
|
|
var_4 = var_4 + var_8;
|
|
|
|
if ( var_10 > 45 )
|
|
{
|
|
var_10 = var_10 - var_9 / 2;
|
|
continue;
|
|
}
|
|
|
|
var_10 = var_10 - var_9;
|
|
}
|
|
|
|
level.player digitaldistortsetparams( 1, 0 );
|
|
}
|
|
|
|
keegan_idle_with_bishop()
|
|
{
|
|
level.allies[1] maps\_utility::disable_ai_color();
|
|
var_0 = common_scripts\utility::getstruct( "keegan_putdown_bishop_org", "targetname" );
|
|
var_0 maps\_anim::anim_reach_solo( level.allies[1], "wounded_carry_putdown" );
|
|
level.allies[1] notify( "stop_anim" );
|
|
level.bishop notify( "stop_anim" );
|
|
level.bishop maps\_utility::anim_stopanimscripted();
|
|
waittillframeend;
|
|
level.allies[1] thread maps\_anim::anim_loop_solo( level.allies[1], "wounded_carry_idle" );
|
|
level.bishop thread bishop_loop_carry_pose();
|
|
common_scripts\utility::flag_wait( "butchdance_sniping" );
|
|
level.allies[1] maps\_utility::anim_stopanimscripted();
|
|
common_scripts\utility::waitframe();
|
|
level.allies[1] maps\_utility::enable_ai_color();
|
|
level.allies[1] maps\enemyhq_code::carry_bishop();
|
|
}
|
|
|
|
bishop_loop_carry_pose()
|
|
{
|
|
level.bishop thread maps\_anim::anim_loop_solo( level.bishop, "wounded_carry_idle" );
|
|
common_scripts\utility::flag_wait( "butchdance_sniping" );
|
|
level.bishop maps\_utility::anim_stopanimscripted();
|
|
}
|
|
|
|
hesh_ride_chopper()
|
|
{
|
|
var_0 = level.allies[0];
|
|
var_0.ignoreme = 0;
|
|
var_0 linkto( level.finale_chopper );
|
|
var_0 maps\_utility::gun_remove();
|
|
level.finale_chopper maps\_anim::anim_single_solo( var_0, "get_in_chopper", "tag_origin" );
|
|
var_0.script_startingposition = 0;
|
|
level.finale_chopper thread maps\_vehicle::vehicle_load_ai( level.allies );
|
|
}
|
|
|
|
dog_ride_chopper( var_0 )
|
|
{
|
|
level.dog maps\enemyhq_code::set_dog_scripted_mode( level.player );
|
|
|
|
if ( isdefined( var_0 ) && var_0 == "right" )
|
|
wait 3.0;
|
|
else
|
|
level.finale_chopper maps\_anim::anim_single_solo( level.dog, "get_in_chopper", "tag_origin" );
|
|
|
|
if ( isdefined( level.dog.magic_bullet_shield ) && level.dog.magic_bullet_shield == 1 )
|
|
level.dog maps\_utility::stop_magic_bullet_shield();
|
|
|
|
level.dog maps\_utility_dogs::kill_dog_fur_effect_and_delete();
|
|
}
|
|
|
|
super_guy( var_0 )
|
|
{
|
|
self.ignoresuppression = var_0;
|
|
|
|
if ( var_0 )
|
|
{
|
|
self.old_accuracy = self.baseaccuracy;
|
|
self.baseaccuracy = 0.1;
|
|
}
|
|
else
|
|
self.baseaccuracy = self.old_accuracy;
|
|
|
|
self.dodangerreact = !var_0;
|
|
self.disablebulletwhizbyreaction = var_0;
|
|
}
|
|
|
|
new_finale_dog_hijack()
|
|
{
|
|
var_0 = common_scripts\utility::getstruct( "finale_dog_scene", "targetname" );
|
|
var_1 = maps\_vehicle::spawn_vehicle_from_targetname( "new_finale_chopper" );
|
|
var_1.animname = "heli";
|
|
level.finale_chopper = var_1;
|
|
level.finale_chopper maps\_vehicle::godon();
|
|
thread maps\enemyhq_audio::aud_chopper_second( var_1 );
|
|
common_scripts\utility::flag_wait( "end_of_sniping" );
|
|
var_2 = getent( "dog_chopper_clip", "targetname" );
|
|
var_2 solid();
|
|
var_2 disconnectpaths();
|
|
var_3 = getent( "amazing_crate", "targetname" );
|
|
var_4 = getent( "amazing_crate_clip", "targetname" );
|
|
var_4 linkto( var_3 );
|
|
var_4 connectpaths();
|
|
var_5 = common_scripts\utility::getstruct( "amazing_crate_loc", "targetname" );
|
|
var_3.origin = var_5.origin;
|
|
var_4 disconnectpaths();
|
|
var_6 = getent( "dog_hijackee", "targetname" );
|
|
var_7 = var_6 maps\_utility::spawn_ai( 1, 1 );
|
|
var_7.ignoreall = 1;
|
|
var_7.ignoreme = 1;
|
|
var_7.animname = "generic";
|
|
level.dog maps\_utility::anim_stopanimscripted();
|
|
level.dog unlink();
|
|
wait 0.1;
|
|
level.allies[0].animname = "hesh";
|
|
var_8 = maps\_utility::make_array( var_1, level.dog, var_7, level.allies[0] );
|
|
var_9 = var_1 setcontents( 0 );
|
|
var_0 thread maps\_anim::anim_single( var_8, "new_dog_hijack" );
|
|
var_1 waittillmatch( "single anim", "end" );
|
|
var_2 connectpaths();
|
|
var_2 notsolid();
|
|
var_10 = getent( "dog_chopper_player_clip", "targetname" );
|
|
var_10 notsolid();
|
|
var_1 setcontents( var_9 );
|
|
var_1 thread maps\_vehicle_code::animate_drive_idle();
|
|
wait 1;
|
|
common_scripts\utility::flag_set( "chopper_ready" );
|
|
}
|
|
|
|
finale_flyaway()
|
|
{
|
|
var_0 = common_scripts\utility::getstruct( "finale_chopper_path", "targetname" );
|
|
level.finale_chopper.attachedpath = undefined;
|
|
level.finale_chopper notify( "newpath" );
|
|
level.finale_chopper thread maps\_vehicle::vehicle_paths( var_0 );
|
|
level.finale_chopper vehicle_setspeed( 5, 30, 30 );
|
|
level.finale_chopper resumespeed( 5 );
|
|
wait 5.0;
|
|
level notify( "finale_chopper_taking_off" );
|
|
common_scripts\utility::flag_set( "finale_chopper_continue" );
|
|
}
|
|
|
|
open_exit_doors()
|
|
{
|
|
var_0 = getent( "dugout_exit_door_left", "targetname" );
|
|
var_1 = getent( "dugout_exit_door_right", "targetname" );
|
|
var_0 rotateyaw( -105, 0.2, 0.1, 0.1 );
|
|
var_0 connectpaths();
|
|
var_1 rotateyaw( 105, 0.2, 0.1, 0.1 );
|
|
var_1 connectpaths();
|
|
wait 1;
|
|
level.allies[1] maps\enemyhq_code::char_dialog_add_and_go( "enemyhq_kgn_incomingbackdown" );
|
|
}
|
|
|
|
watch_for_end_of_sniping()
|
|
{
|
|
level waittill( "hot_butchdance_action" );
|
|
common_scripts\utility::flag_set( "butchdance_sniping" );
|
|
level.player waittill( "remote_turret_deactivate" );
|
|
common_scripts\utility::flag_set( "end_of_sniping" );
|
|
thread player_fail_finale();
|
|
thread player_fail_finale_instakill();
|
|
common_scripts\utility::array_thread( level.allies, maps\_utility::enable_pain );
|
|
}
|
|
|
|
spawn_lockdown_guy()
|
|
{
|
|
while ( !common_scripts\utility::flag( "finale_sniping" ) )
|
|
{
|
|
var_0 = maps\_utility::spawn_ai( 1 );
|
|
var_0 maps\enemyhq_code::gasmask_on_npc();
|
|
|
|
if ( isdefined( self.script_aigroup ) && self.script_aigroup == "finale_lmgs" )
|
|
var_0 getenemyinfo( level.player );
|
|
|
|
var_0 thread handle_butchdance_enemies();
|
|
|
|
if ( isdefined( var_0 ) )
|
|
{
|
|
var_0 waittill( "death" );
|
|
wait 0.5;
|
|
continue;
|
|
}
|
|
|
|
return;
|
|
}
|
|
}
|
|
|
|
clear_lmgs()
|
|
{
|
|
wait 0.2;
|
|
maps\_utility::waittill_aigroupcleared( "finale_lmgs" );
|
|
common_scripts\utility::flag_set( "finale_combat1" );
|
|
}
|
|
|
|
handle_agressive_player()
|
|
{
|
|
level endon( "death" );
|
|
var_0 = common_scripts\utility::getstruct( "killer_org", "targetname" );
|
|
common_scripts\utility::flag_wait( "open_finale_doors" );
|
|
wait 1;
|
|
|
|
while ( !common_scripts\utility::flag( "end_of_sniping" ) )
|
|
{
|
|
common_scripts\utility::flag_wait_any( "finale_kill", "finale_really_kill", "end_of_sniping" );
|
|
var_1 = 0.5;
|
|
|
|
if ( common_scripts\utility::flag( "end_of_sniping" ) )
|
|
break;
|
|
|
|
while ( common_scripts\utility::flag( "finale_kill" ) || common_scripts\utility::flag( "finale_really_kill" ) )
|
|
{
|
|
magicbullet( "m27", var_0.origin, level.player.origin + ( 0, 0, 32 ) );
|
|
|
|
if ( common_scripts\utility::flag( "finale_really_kill" ) )
|
|
level.player kill();
|
|
|
|
wait( var_1 );
|
|
|
|
if ( !common_scripts\utility::flag( "finale_kill" ) )
|
|
{
|
|
var_1 = 0.5;
|
|
continue;
|
|
}
|
|
|
|
var_1 = var_1 - 0.1;
|
|
|
|
if ( var_1 < 0.1 )
|
|
var_1 = 0.1;
|
|
}
|
|
}
|
|
}
|
|
|
|
butchdance_combat()
|
|
{
|
|
var_0 = getentarray( "exfil_guys1", "targetname" );
|
|
|
|
foreach ( var_2 in var_0 )
|
|
var_2 thread spawn_lockdown_guy();
|
|
|
|
thread maps\enemyhq_code::toggle_ally_outlines( 0 );
|
|
level.player waittill( "player_switching_to_tablet" );
|
|
thread maps\enemyhq_audio::aud_start_sniper( "enhq_stadium_large_room" );
|
|
common_scripts\utility::flag_set( "finale_sniping" );
|
|
var_4 = maps\enemyhq_code::array_spawn_targetname_allow_fail( "exfil_guys1b", 1 );
|
|
common_scripts\utility::array_thread( var_4, ::handle_butchdance_enemies );
|
|
var_4 = getaiarray( "axis" );
|
|
thread maps\enemyhq_code::ai_array_killcount_flag_set( var_4, 2, "finale_combat1" );
|
|
thread clear_lmgs();
|
|
common_scripts\utility::flag_wait( "finale_combat1" );
|
|
var_4 = getaiarray( "axis" );
|
|
var_4 common_scripts\utility::array_thread( var_4, maps\_utility::set_force_color, "y" );
|
|
var_4 common_scripts\utility::array_thread( var_4, maps\_utility::enable_ai_color );
|
|
common_scripts\utility::array_thread( level.allies, maps\_utility::set_ignoresuppression, 1 );
|
|
var_5 = common_scripts\utility::array_add( level.allies, level.dog );
|
|
common_scripts\utility::array_thread( var_5, ::super_guy, 0 );
|
|
wait 0.5;
|
|
var_6 = maps\_utility::obj( "defendsnipe" );
|
|
objective_onentity( var_6, level.allies[0], ( 0, 0, 0 ) );
|
|
objective_add( var_6, "current", &"ENEMY_HQ_PROTECT_MERRICK_AND_KEEGAN" );
|
|
objective_setpointertextoverride( var_6, &"ENEMY_HQ_PROTECT" );
|
|
maps\enemyhq_code::safe_activate_trigger_with_targetname( "butchdance1" );
|
|
var_4 = maps\enemyhq_code::array_spawn_targetname_allow_fail( "ghost_exfil_wave1", 1 );
|
|
thread maps\enemyhq_code::ai_array_killcount_flag_set( var_4, var_4.size - 1, "ghosts_exfil2" );
|
|
|
|
foreach ( var_8 in var_4 )
|
|
var_8 thread maps\enemyhq_audio::aud_handle_remote_sniper_ai( level.aud_finale_sniper );
|
|
|
|
common_scripts\utility::flag_wait( "ghost_timer_start" );
|
|
level.player thread maps\enemyhq_code::radio_dialog_add_and_go( "enemyhq_mrk_giveussomecovering" );
|
|
common_scripts\utility::flag_wait_or_timeout( "ghosts_exfil2", 10 );
|
|
|
|
if ( !common_scripts\utility::flag( "ghosts_exfil2" ) )
|
|
level.player thread maps\enemyhq_code::radio_dialog_add_and_go( "enemyhq_mrk_weretakingfire" );
|
|
|
|
common_scripts\utility::flag_wait_or_timeout( "ghosts_exfil2", 10 );
|
|
|
|
if ( !common_scripts\utility::flag( "ghosts_exfil2" ) )
|
|
{
|
|
var_10 = common_scripts\utility::getstruct( "ghost_kill", "targetname" );
|
|
level.allies[0] maps\_utility::stop_magic_bullet_shield();
|
|
level.allies[1] maps\_utility::stop_magic_bullet_shield();
|
|
magicbullet( "m27", var_10.origin, level.allies[0].origin );
|
|
magicbullet( "m27", var_10.origin, level.allies[1].origin );
|
|
wait 0.5;
|
|
setdvar( "ui_deadquote", &"ENEMY_HQ_MERRICK_AND_KEEGAN_WERE" );
|
|
maps\_utility::missionfailedwrapper();
|
|
return;
|
|
}
|
|
else
|
|
var_4 = maps\enemyhq_code::array_spawn_targetname_allow_fail( "ghost_exfil_wave2", 1 );
|
|
|
|
var_11 = getnode( "merrick_node", "targetname" );
|
|
var_12 = getnode( "keegan_node", "targetname" );
|
|
level.allies[0] maps\_utility::disable_ai_color();
|
|
level.allies[1] maps\_utility::disable_ai_color();
|
|
level.allies[0] maps\_utility::set_goalradius( 20 );
|
|
level.allies[1] maps\_utility::set_goalradius( 20 );
|
|
level.allies[0] maps\_utility::set_goal_node( var_11 );
|
|
level.allies[1] maps\_utility::set_goal_node( var_12 );
|
|
level.allies[0] maps\_utility::set_ignoresuppression( 1 );
|
|
level.allies[0] clearenemy();
|
|
level.allies[1] maps\_utility::set_ignoresuppression( 1 );
|
|
level.allies[1] clearenemy();
|
|
level.allies[0].ignoreall = 1;
|
|
level.allies[1].ignoreall = 1;
|
|
level.allies[1].ignoreme = 1;
|
|
wait 1;
|
|
thread waitfor_merrick();
|
|
level.allies[1] waittill( "goal" );
|
|
objective_position( var_6, ( 0, 0, 0 ) );
|
|
common_scripts\utility::flag_wait( "merrick_exfil" );
|
|
level.player thread maps\enemyhq_code::radio_dialog_add_and_go( "enemyhq_mrk_wemadeitthanks" );
|
|
level.allies[0].vehicle_position = 1;
|
|
level.allies[0].script_startingposition = 1;
|
|
level.ghost_chopper thread maps\_vehicle::vehicle_load_ai( [ level.allies[0] ] );
|
|
level.bishop notify( "stop_anim" );
|
|
level.allies[1] notify( "stop_anim" );
|
|
level.allies[1] hide();
|
|
level.bishop hide();
|
|
level.allies[1] maps\enemyhq_code::die_quietly();
|
|
level.bishop maps\enemyhq_code::die_quietly();
|
|
level.allies = maps\_utility::make_array( level.allies[2] );
|
|
var_13 = common_scripts\utility::getstruct( "ghost_chopper_path", "targetname" );
|
|
level.ghost_chopper.attachedpath = undefined;
|
|
level.ghost_chopper notify( "newpath" );
|
|
level.ghost_chopper thread maps\_vehicle::vehicle_paths( var_13 );
|
|
level.ghost_chopper vehicle_setspeed( 5, 30, 30 );
|
|
level.ghost_chopper resumespeed( 5 );
|
|
level notify( "ghost_chopper_taking_off" );
|
|
wait 2;
|
|
level.player thread maps\enemyhq_code::radio_dialog_add_and_go( "enemyhq_mrk_takinoff" );
|
|
wait 4;
|
|
level.player thread maps\enemyhq_code::radio_dialog_add_and_go( "enemyhq_mrk_weregoodnowget" );
|
|
wait 2;
|
|
maps\_utility::objective_complete( var_6 );
|
|
thread handle_ghost_chopper_removal();
|
|
common_scripts\utility::flag_set( "done_sniping_early" );
|
|
var_4 = getaiarray( "axis" );
|
|
var_4 = maps\_utility::array_removedead_or_dying( var_4 );
|
|
var_4 = sortbydistance( var_4, level.dog.origin );
|
|
|
|
if ( var_4.size > 2 )
|
|
{
|
|
var_4 = common_scripts\utility::array_remove( var_4, var_4[0] );
|
|
var_4 = common_scripts\utility::array_remove( var_4, var_4[1] );
|
|
}
|
|
|
|
level.dog.ignoreme = 1;
|
|
level.dog thread maps\enemyhq_code::dog_attack_targets_by_priority( var_4, "finale_push1" );
|
|
thread maps\enemyhq_code::toggle_ally_outlines( 1 );
|
|
var_4 = maps\enemyhq_code::array_spawn_targetname_allow_fail( "exfil_guys2", 1 );
|
|
var_14 = getaiarray( "axis" );
|
|
var_14 = maps\_utility::array_removedead_or_dying( var_14 );
|
|
thread maps\enemyhq_code::ai_array_killcount_flag_set( var_14, var_14.size - 1, "finale_push2" );
|
|
common_scripts\utility::flag_wait_or_timeout( "start_finale_truck", 4 );
|
|
common_scripts\utility::flag_wait( "start_finale_truck" );
|
|
maps\_utility::delaythread( 3, maps\enemyhq_code::safe_activate_trigger_with_targetname, "butchdance1a" );
|
|
wait 2;
|
|
var_4 = getaiarray( "axis" );
|
|
thread maps\enemyhq_code::ai_array_killcount_flag_set( var_4, 2, "finale_push1" );
|
|
common_scripts\utility::flag_wait_or_timeout( "finale_push1", 5 );
|
|
common_scripts\utility::flag_set( "finale_push1" );
|
|
thread handle_final_finale_guys();
|
|
thread handle_finale_drones();
|
|
maps\enemyhq_code::safe_activate_trigger_with_targetname( "butchdance2" );
|
|
var_4 = getaiarray( "axis" );
|
|
thread maps\enemyhq_code::ai_array_killcount_flag_set( var_4, 2, "finale_push1" );
|
|
common_scripts\utility::flag_wait( "chopper_ready" );
|
|
thread handle_final_combat();
|
|
common_scripts\utility::flag_wait( "get_in_choppa" );
|
|
var_15 = getaiarray( "axis" );
|
|
var_5 = level.allies;
|
|
level.dog.ignoreall = 1;
|
|
level.dog.ignoreme = 1;
|
|
level.finale_chopper setvehicleteam( "allies" );
|
|
level.finale_chopper.script_team = "allies";
|
|
thread hesh_ride_chopper();
|
|
wait 1;
|
|
level.dead_finale_trucks = 0;
|
|
var_16 = maps\_vehicle::spawn_vehicles_from_targetname_and_drive( "flyaway_lynx" );
|
|
var_17 = get_vehicle_turret_ai( var_16 );
|
|
|
|
foreach ( var_8 in var_17 )
|
|
var_8 getenemyinfo( level.allies[0] );
|
|
|
|
common_scripts\utility::array_thread( var_16, ::flyaway_lynx_death_watcher );
|
|
common_scripts\utility::array_thread( var_16, ::handle_truck_shooting );
|
|
thread maps\enemyhq_code::ai_array_killcount_flag_set( var_17, var_17.size - 1, "killed_trucks" );
|
|
common_scripts\utility::flag_wait( "flyaway_baddies" );
|
|
wait 2;
|
|
maps\_utility::delaythread( 2, ::finale_explosions );
|
|
var_20 = maps\_utility::obj( "finale_defend" );
|
|
objective_add( var_20, "current", &"ENEMY_HQ_DESTROY_VEHICLE_MOUNTED" );
|
|
objective_onentity( var_20, level.finale_chopper, ( 0, 0, 0 ) );
|
|
objective_setpointertextoverride( var_20, &"ENEMY_HQ_PROTECT" );
|
|
|
|
if ( 1 )
|
|
{
|
|
common_scripts\utility::flag_set( "stop_drones" );
|
|
maps\_utility::array_delete( level.drones["axis"].array );
|
|
var_15 = maps\_utility::array_removedead_or_dying( var_15 );
|
|
var_4 = maps\enemyhq_code::array_spawn_targetname_allow_fail( "dan_guys", 1 );
|
|
wait 0.1;
|
|
common_scripts\utility::array_thread( var_15, maps\enemyhq_code::die_quietly );
|
|
level.allies[0].ignoreme = 0;
|
|
common_scripts\utility::array_thread( var_4, ::fire_at_chopper, level.allies[0], 3, 5 );
|
|
}
|
|
else
|
|
{
|
|
var_21 = getaiarray( "axis" );
|
|
|
|
if ( var_21.size < 7 )
|
|
{
|
|
var_4 = maps\enemyhq_code::array_spawn_targetname_allow_fail( "exfil_guys4", 1 );
|
|
common_scripts\utility::array_thread( var_4, ::fire_at_chopper, level.finale_chopper, 3, 5 );
|
|
}
|
|
}
|
|
|
|
thread maps\enemyhq_audio::aud_lynx_turrets( var_16 );
|
|
common_scripts\utility::array_thread( var_16, ::handle_end_lynxes );
|
|
|
|
while ( level.dead_finale_trucks < 2 )
|
|
wait 0.1;
|
|
|
|
common_scripts\utility::flag_set( "killed_trucks" );
|
|
common_scripts\utility::flag_wait( "finale_done" );
|
|
common_scripts\utility::flag_set( "obj_escape_complete" );
|
|
maps\_utility::objective_complete( var_20 );
|
|
}
|
|
|
|
handle_final_combat()
|
|
{
|
|
common_scripts\utility::flag_wait_or_timeout( "finale_push2", 9 );
|
|
common_scripts\utility::flag_set( "finale_push2" );
|
|
level.allies[0].ignoreall = 1;
|
|
level.allies[0] maps\_utility::set_ignoresuppression( 1 );
|
|
level.allies[0] clearenemy();
|
|
maps\enemyhq_code::safe_activate_trigger_with_targetname( "butchdance3" );
|
|
level.allies[0] maps\_utility::delaythread( 2, maps\_utility::set_ignoreall, 0 );
|
|
}
|
|
|
|
handle_truck_shooting()
|
|
{
|
|
var_0 = self.mgturret[0];
|
|
var_0 settoparc( 90 );
|
|
var_0 setsuppressiontime( 10 );
|
|
var_0 setaispread( 10 );
|
|
level.allies[0].ignoreme = 0;
|
|
var_0 setmode( "manual_ai" );
|
|
var_0 settargetentity( level.finale_chopper );
|
|
|
|
foreach ( var_2 in self.riders )
|
|
{
|
|
var_2.favoriteenemy = level.player;
|
|
var_2.maxsightdistsqrd = 400000000;
|
|
}
|
|
|
|
self waittill( "reached_dynamic_path_end" );
|
|
self setturrettargetent( level.finale_chopper );
|
|
}
|
|
|
|
flyaway_lynx_death_watcher()
|
|
{
|
|
self waittill( "death" );
|
|
playfx( level._effect["vfx_ehq_lynxexplode"], self.origin );
|
|
playfx( level._effect["vfx_lynx_fire_exfil"], self.origin );
|
|
level.player thread maps\_utility::play_sound_on_entity( "car_explode_2" );
|
|
}
|
|
|
|
handle_ghost_chopper_removal()
|
|
{
|
|
level.ghost_chopper waittill( "reached_dynamic_path_end" );
|
|
|
|
foreach ( var_1 in level.ghost_chopper.riders )
|
|
var_1 maps\enemyhq_code::die_quietly();
|
|
|
|
level.ghost_chopper delete();
|
|
}
|
|
|
|
get_vehicle_turret_ai( var_0 )
|
|
{
|
|
var_1 = [];
|
|
|
|
foreach ( var_3 in var_0 )
|
|
{
|
|
foreach ( var_5 in var_3.riders )
|
|
{
|
|
if ( var_5.vehicle_position == 3 )
|
|
var_1[var_1.size] = var_5;
|
|
}
|
|
}
|
|
|
|
return var_1;
|
|
}
|
|
|
|
handle_flyaway_fail()
|
|
{
|
|
wait 17;
|
|
|
|
if ( !common_scripts\utility::flag( "killed_trucks" ) )
|
|
{
|
|
level.finale_chopper notify( "going_down" );
|
|
playfxontag( level._effect["vfx_heli_fire"], level.finale_chopper, "tag_engine_right" );
|
|
var_0 = common_scripts\utility::getstruct( "finale_crash_path", "targetname" );
|
|
level.finale_chopper thread maps\_vehicle_code::helicopter_crash_rotate();
|
|
thread truck_turret_fail();
|
|
level.finale_chopper maps\_vehicle_code::helicopter_crash_path( var_0 );
|
|
playfxontag( level._effect["vfx_heli_crash"], level.finale_chopper, "tag_deathfx" );
|
|
}
|
|
}
|
|
|
|
truck_turret_fail()
|
|
{
|
|
wait 4;
|
|
setdvar( "ui_deadquote", &"ENEMY_HQ_YOU_WERE_SHOT_DOWN_BY" );
|
|
maps\_utility::missionfailedwrapper();
|
|
}
|
|
|
|
waitfor_merrick()
|
|
{
|
|
level.allies[0] waittill( "goal" );
|
|
common_scripts\utility::flag_set( "merrick_exfil" );
|
|
}
|
|
|
|
handle_end_lynxes()
|
|
{
|
|
thread handle_dead_truck();
|
|
var_0 = self.riders;
|
|
}
|
|
|
|
handle_dead_truck()
|
|
{
|
|
self waittill( "death" );
|
|
level.dead_finale_trucks++;
|
|
}
|
|
|
|
fire_at_chopper( var_0, var_1, var_2 )
|
|
{
|
|
var_0.ignoreme = 0;
|
|
self.ignoreall = 0;
|
|
self getenemyinfo( var_0 );
|
|
}
|
|
|
|
handle_butchdance_enemies( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
level waittill( "hot_butchdance_action" );
|
|
self.ignoreme = 0;
|
|
wait( randomfloatrange( 1.5, 2.5 ) );
|
|
self.accuracy = 0.1;
|
|
self.ignoreall = 0;
|
|
}
|
|
|
|
handle_finale_drones()
|
|
{
|
|
level endon( "death" );
|
|
var_0 = getentarray( "finale_drone", "targetname" );
|
|
var_0 = common_scripts\utility::array_randomize( var_0 );
|
|
|
|
foreach ( var_2 in var_0 )
|
|
{
|
|
var_3 = maps\_utility::dronespawn( var_2 );
|
|
var_3.spawner = var_2;
|
|
var_3 thread handle_drone();
|
|
wait( randomfloatrange( 0.2, 0.75 ) );
|
|
}
|
|
}
|
|
|
|
handle_drone()
|
|
{
|
|
self endon( "death" );
|
|
self waittill( "goal" );
|
|
|
|
if ( !common_scripts\utility::flag( "finale_done" ) && !common_scripts\utility::flag( "stop_drones" ) )
|
|
{
|
|
var_0 = maps\_utility::dronespawn( self.spawner );
|
|
var_0.spawner = self.spawner;
|
|
var_0 thread handle_drone();
|
|
}
|
|
|
|
self delete();
|
|
}
|
|
|
|
handle_final_finale_guys()
|
|
{
|
|
level endon( "death" );
|
|
|
|
while ( !common_scripts\utility::flag( "finale_done" ) )
|
|
{
|
|
var_0 = maps\enemyhq_code::array_spawn_targetname_allow_fail( "exfil_guys3", 1 );
|
|
|
|
if ( common_scripts\utility::flag( "get_in_choppa" ) )
|
|
common_scripts\utility::array_thread( var_0, ::fire_at_chopper, level.allies[0], 3, 5 );
|
|
|
|
var_0 = getaiarray( "axis" );
|
|
maps\enemyhq_code::ai_array_killcount_flag_set( var_0, int( var_0.size / 2 ), "more_finale_guys" );
|
|
common_scripts\utility::flag_wait( "more_finale_guys" );
|
|
common_scripts\utility::flag_clear( "more_finale_guys" );
|
|
}
|
|
}
|
|
|
|
finale_explosions()
|
|
{
|
|
var_0 = common_scripts\utility::getstructarray( "finale_explosion", "targetname" );
|
|
|
|
foreach ( var_2 in var_0 )
|
|
{
|
|
playfx( level._effect["finale_explosion"], var_2.origin );
|
|
wait( randomfloatrange( 0.5, 1 ) );
|
|
}
|
|
}
|
|
|
|
finale_sniping()
|
|
{
|
|
level.player thread maps\enemyhq_code::radio_dialog_add_and_go( "enemyhq_hsh_coveruswiththe" );
|
|
wait 1.5;
|
|
common_scripts\utility::flag_set( "start_exfil_sniper" );
|
|
wait 0.2;
|
|
level.player notify( "scripted_sniper_dpad" );
|
|
thread handle_flyaway_fail();
|
|
common_scripts\utility::flag_set( "flyaway_baddies" );
|
|
wait 7;
|
|
maps\enemyhq_code::safe_activate_trigger_with_targetname( "butchdance4" );
|
|
}
|
|
|
|
spawn_player_dummy()
|
|
{
|
|
wait 1;
|
|
var_0 = getent( "player_dummy", "targetname" );
|
|
var_1 = var_0 maps\_utility::spawn_ai();
|
|
var_1 maps\_utility::magic_bullet_shield();
|
|
var_1.animname = "generic";
|
|
var_1 linkto( level.finale_chopper, "tag_guy4", ( 0, 0, 0 ), ( 0, 0, 0 ) );
|
|
}
|
|
|
|
finale_vo()
|
|
{
|
|
common_scripts\utility::flag_wait( "pre_exit_scene" );
|
|
var_0 = level.allies[2];
|
|
level.allies[0] maps\enemyhq_code::char_dialog_add_and_go( "enemyhq_mrk_youboysdidok" );
|
|
thread watch_for_end_of_sniping();
|
|
common_scripts\utility::flag_wait( "open_finale_doors" );
|
|
wait 3;
|
|
thread maps\enemyhq_code::nag_player_until_flag( level.allies[0], "start_butchdance", "enemyhq_mrk_adamthinemout", "enemyhq_mrk_usetheremotesniper_2", "enemyhq_mrk_adamgetonthe" );
|
|
common_scripts\utility::flag_set( "enable_butchdance" );
|
|
maps\_utility::delaythread( 1, maps\enemyhq_code::sniper_hint, "start_butchdance", 4 );
|
|
level.player waittill( "player_switching_to_tablet" );
|
|
common_scripts\utility::flag_set( "start_butchdance" );
|
|
wait 3;
|
|
level.player maps\enemyhq_code::radio_dialog_add_and_go( "enemyhq_mrk_thosechoppersareour" );
|
|
level.player thread maps\enemyhq_code::radio_dialog_add_and_go( "enemyhq_mrk_welltaketheone" );
|
|
wait 1;
|
|
thread maps\enemyhq_code::nag_player_until_flag( level.player, "butchdance_sniping", "enemyhq_mrk_takeoutthoselmgs", "enemyhq_mrk_wheneveryoureready", "enemyhq_mrk_takeashot_2" );
|
|
common_scripts\utility::flag_wait( "butchdance_sniping" );
|
|
thread hurry_lines();
|
|
common_scripts\utility::flag_wait( "finale_combat1" );
|
|
level.player maps\enemyhq_code::radio_dialog_add_and_go( "enemyhq_mrk_itsclear" );
|
|
level.player maps\enemyhq_code::radio_dialog_add_and_go( "enemyhq_mrk_gogogo_2" );
|
|
level.player maps\enemyhq_code::radio_dialog_add_and_go( "enemyhq_mrk_coverus" );
|
|
common_scripts\utility::flag_wait( "end_of_sniping" );
|
|
wait 0.25;
|
|
level.player maps\enemyhq_code::radio_dialog_add_and_go( "enemyhq_hsh_ourrideisleaving" );
|
|
level.player maps\enemyhq_code::radio_dialog_add_and_go( "enemyhq_hsh_riley" );
|
|
wait 3;
|
|
common_scripts\utility::flag_wait( "chopper_ready" );
|
|
level.player maps\enemyhq_code::radio_dialog_add_and_go( "enemyhq_hsh_clearapathto" );
|
|
common_scripts\utility::flag_wait( "finale_push2" );
|
|
thread maps\enemyhq_code::nag_player_until_flag( var_0, "get_in_choppa", "enemyhq_hsh_gettothechopper", "enemyhq_hsh_adamthechopper", "enemyhq_hsh_adamgetoverhere", "enemyhq_hsh_weveleaving" );
|
|
common_scripts\utility::flag_wait( "get_in_choppa" );
|
|
wait 8;
|
|
level.player thread maps\enemyhq_code::radio_dialog_add_and_go( "enemyhq_hsh_takeouttheturrets" );
|
|
wait 5;
|
|
|
|
if ( !common_scripts\utility::flag( "killed_trucks" ) )
|
|
{
|
|
level.player thread maps\enemyhq_code::radio_dialog_add_and_go( "enemyhq_hsh_shootthetrucks" );
|
|
wait 5;
|
|
|
|
if ( !common_scripts\utility::flag( "killed_trucks" ) )
|
|
level.player thread maps\enemyhq_code::radio_dialog_add_and_go( "enemyhq_hsh_yougottahitthose" );
|
|
}
|
|
|
|
common_scripts\utility::flag_wait( "killed_trucks" );
|
|
wait 3;
|
|
level.player maps\enemyhq_code::radio_dialog_add_and_go( "enemyhq_hsh_commandthisisviking" );
|
|
level.player maps\enemyhq_code::radio_dialog_add_and_go( "enemyhq_els_heshlogancanyou" );
|
|
level.player maps\enemyhq_code::radio_dialog_add_and_go( "enemyhq_hsh_dad" );
|
|
level.player maps\enemyhq_code::radio_dialog_add_and_go( "enemyhq_els_wevegotafull" );
|
|
level.player maps\enemyhq_code::radio_dialog_add_and_go( "enemyhq_hsh_daddad" );
|
|
}
|
|
|
|
hurry_lines()
|
|
{
|
|
level waittill( "hot_butchdance_action" );
|
|
wait 6;
|
|
level.player maps\enemyhq_code::radio_dialog_add_and_go( "enemyhq_hsh_chopperswindingup" );
|
|
wait 1;
|
|
|
|
if ( !common_scripts\utility::flag( "end_of_sniping" ) )
|
|
level.player maps\enemyhq_code::radio_dialog_add_and_go( "enemyhq_hsh_loganhurry" );
|
|
}
|
|
|
|
enable_finale_and_ghost_chopper_clips()
|
|
{
|
|
var_0 = getent( "new_finale_chopper_ai_clip", "targetname" );
|
|
var_1 = getent( "ghost_chopper_ai_clip", "targetname" );
|
|
level waittill( "ghost_chopper_taking_off" );
|
|
var_1 notsolid();
|
|
var_1 connectpaths();
|
|
level waittill( "finale_chopper_taking_off" );
|
|
var_0 notsolid();
|
|
var_0 connectpaths();
|
|
}
|
|
|
|
player_fail_finale()
|
|
{
|
|
level.player endon( "death" );
|
|
var_0 = [];
|
|
var_0[0] = "enemyhq_hsh_whereareyougoing";
|
|
var_0[1] = "enemyhq_hsh_logangetoverhere";
|
|
|
|
for (;;)
|
|
{
|
|
common_scripts\utility::flag_wait( "player_left_finale_area" );
|
|
var_1 = 0;
|
|
|
|
while ( common_scripts\utility::flag( "player_left_finale_area" ) )
|
|
{
|
|
if ( var_1 > var_0.size - 1 )
|
|
{
|
|
setdvar( "ui_deadquote", &"ENEMY_HQ_YOU_LEFT_YOUR_TEAM_BEHIND" );
|
|
maps\_utility::missionfailedwrapper();
|
|
break;
|
|
}
|
|
|
|
level.player maps\enemyhq_code::radio_dialog_add_and_go( var_0[var_1] );
|
|
var_1++;
|
|
wait( randomfloatrange( 2, 4 ) );
|
|
}
|
|
}
|
|
}
|
|
|
|
player_fail_finale_instakill()
|
|
{
|
|
level.player endon( "death" );
|
|
common_scripts\utility::flag_wait( "player_left_finale_area_instakill" );
|
|
setdvar( "ui_deadquote", &"ENEMY_HQ_YOU_LEFT_YOUR_TEAM_BEHIND" );
|
|
maps\_utility::missionfailedwrapper();
|
|
}
|