nx1-gsc-dump/maps/nx_hithard_b_patriot_run.gsc

1950 lines
56 KiB
Plaintext
Raw Permalink Blame History

//****************************************************************************
// **
// Confidential - (C) Activision Publishing, Inc. 2010 **
// **
//****************************************************************************
// **
// Module: nx_hithard_charge.gsc **
// NOTE: called from nx_hithard.gsc **
// **
// Created: 1/13/2011 - Brian Marvin **
// **
//****************************************************************************
#include maps\_utility;
#include common_scripts\utility;
#include maps\_anim;
#include maps\_vehicle;
#include maps\nx_hithard_b_util;
//#include maps\_nx_objective_util;
//***********************************************************************
// *
// INITIALIZATION: The following are called from nx_hithard.gsc *
// *
//***********************************************************************
// Objective specific flag_init() calls
flag_inits()
{
flag_init( "ch_events_start" );
flag_init( "intro_sequence_complete" );
flag_init( "intro_street_complete" );
flag_init( "uav_reveal" );
flag_init( "city_hall_briefing_end" );
flag_init( "city_hall_cleanup" );
flag_init( "skybridge_seen" );
flag_init( "stairway_dialogue" );
flag_init( "stairway_shake" );
flag_init( "hallway_shake" );
flag_init( "close_ch_east" );
flag_init( "obj_east_done" );
flag_init( "fx_intro_door_opening" );
flag_init( "magicgrenade_teargas_hall_exit" );
flag_init( "magicgrenade_monorail_start" );
flag_init( "left_path_begin" );
flag_init( "left_path_complete" );
flag_init( "left_path_cleanup" );
flag_init( "right_path_commit" );
flag_init( "boundary_breach" );
flag_init( "uav_scene_end" );
flag_init( "vp_protect_moment" );
flag_init( "jungle_enc_moveup_mid" );
flag_init( "last_stand_setup" );
flag_init( "jungle_plaza_enc_complete" );
flag_init( "tunnel_door_setup" );
flag_init( "exit_plaza" );
flag_init( "plaza_dialogue_complete" );
flag_init( "player_interruption" );
flag_init( "slowmotion_done" );
flag_init( "entered_store" );
flag_init( "civ_moment_in_position" );
flag_init( "civ_moment_dialogue_complete" );
flag_init( "civ_moment_interrogation_dialogue_complete" );
flag_init( "civilian_enc_start" );
flag_init( "tunnel_enc_complete" );
flag_init( "flag_mall_door_open" );
flag_init( "civilian_escape" );
flag_init( "gypsy_lockdown_ramp" );
flag_init( "plaza_enc_complete" );
flag_init( "monorail_station_start" );
flag_init( "monorail_dialogue_start" );
flag_init( "monorail_station_enc_complete" );
flag_init( "last_airdrop" );
// VP movement
flag_init( "vp_move_3" );
flag_init( "vp_move_31" );
flag_init( "vp_move_32" );
flag_init( "vp_move_33" );
flag_init( "vp_move_34" );
flag_init( "vp_move_7" );
flag_init( "vp_move_110" ); // PLAZA 2 ENCOUNTER
flag_init( "vp_move_115" ); // PLAZA 2 ENCOUNTER
flag_init( "vp_move_116" ); // PLAZA 2 ENCOUNTER
flag_init( "vp_move_120" ); // PLAZA 2 ENCOUNTER
}
// Objective specific add_hint_string() calls
hint_string_inits()
{
//add_hint_string( "hint_parachute_smoke", &"NX_HITHARD_PARACHUTE_HINT_SMOKE", ::hint_parachute_smoke );
}
//*******************************************************************
// Jungle Plaza (Plaza 1) Intro *
// *
//*******************************************************************
// Setting up escort start point section
escort_main()
{
playerstart_escort_start();
flag_wait( "jungle_plaza_enc_complete" );
}
// Main function that runs the encounters through the underground mall sections
playerstart_escort_start()
{
level._start_point = "escort";
city_hall_east_exit();
// Objective saving and handling
setSavedDvar( "ObjectiveFadeTooFar", 1 );
objective_number = 21;
Objective_Add( objective_number, "current", "Get Patriot to the Monorail Station." );
// Objective_OnEntity( objective_number, level.squad[2], ( 0, 0, 70 ) );
// Objective_SetPointerTextOverride( objective_number, "Protect" );
autosave_now();
waittill_aigroupcleared( "plaza_last_stand" );
// flag_wait( "tunnel_door_setup" );
flag_wait( "jungle_plaza_enc_complete" );
flag_set( "vp_move_7" );
}
city_hall_east_exit()
{
level thread hallway_shake();
level thread intro_door_scene();
level thread city_hall_baker_move_to_door(); // Setting Baker up to open the door while spooling up the encounter ahead
level thread jungle_plaza_enc();
// Set initial visionset
set_vision_set( "nx_hithard_b_opening", 0.1 );
// Baker: <whispered>We'll meet Bravo just north of here - stay low and out of sight...
// radio_dialogue( "hithard_bak_plaza_02" );
level.squad[0] dialogue_queue( "hithard_bak_plaza_02" );
flag_set( "intro_sequence_complete" );
level.squad ignore_me_on();
level.squad ignore_all_on();
level._player.ignoreme = true;
cqb_handling( level.squad, "on" );
level.squad[2] disable_cqbwalk();
intro_street_sequence();
}
intro_door_scene()
{
self endon( "intro_sequence_complete" );
flag_set( "hallway_shake" );
flag_set( "fx_back_half_turn_off" );
level.squad[2].animname = "vp_price";
level.squad[3].animname = "ss_williams";
level.squad[4].animname = "ss_hayes";
// level.squad[2] thread anim_loop_solo( level.squad[2], "cargoship_ch46_rescue_load_1_idle", "stop_idle" );
level.squad[3] thread anim_single_solo( level.squad[3], "exposed_reload" );
level.squad[4] thread anim_single_solo( level.squad[4], "exposed_reloadb" );
flag_wait( "intro_sequence_complete" );
// level.squad[2] notify( "stop_idle" );
}
intro_street_sequence()
{
level thread uav_loop();
level thread VTOL_loop();
a_ugv = GetEntArray( "intro_ugv", "targetname" );
a_uav = GetEntArray( "intro_uav", "targetname" );
foreach( guy in a_ugv )
{
guy gopath();
guy set_cheap_turret();
}
foreach( guy in a_uav )
{
guy maps\_attack_heli::SAV_setup( "pathing" );
}
ugv = GetEnt( "intro_ugv_firing", "script_noteworthy" );
level thread ugv_firing_sequence( ugv, "firing_stop" );
}
ugv_plaza_guard()
{
self endon( "plaza_enc_complete" );
flag_wait( "left_path_complete" );
ugv_spawner = GetEnt( "ugv_plaza_guard", "targetname" );
ugv_spawner spawn_vehicle_and_gopath();
ugv = Get_Vehicle( "ugv_plaza_guard", "targetname" );
ugv Vehicle_TurnEngineOff();
// turret = ugv.mgturret[0];
// turret TurretFireDisable();
flag_wait( "jungle_enc_moveup_mid" );
ugv Delete(); // Delete first ugv that is no longer being used
/*
ugv_border_patrol = GetEnt( "border_patrol", "targetname" );
ugv_border_patrol spawn_vehicle_and_gopath();
ugv_patrol = Get_Vehicle( "border_patrol", "targetname" );
ugv_patrol Vehicle_TurnEngineOff();
*/
}
city_hall_baker_move_to_door()
{
self endon( "last_stand_setup" );
door_opener = level.squad[ 0 ]; // Baker
door_opener.goalradius = 8;
door_opener.animname = "baker"; //assign animname to AI so we can later call animation on.
ready_node = GetNode( "baker_city_hall_exit", "targetname" );
door_opener SetGoalNode( ready_node );
node_door = GetEnt( "baker_door_origin", "targetname" ); //called on script_origin node, grabs KVP, and assigns to variable.
node_door anim_reach_and_approach_solo( door_opener, "hunted_open_barndoor_stop", undefined, "Cover Right" ); //blends into first frame of open door anim based off cover right anim pose. Also ends anim in cover right position.
node_door thread anim_loop_solo( door_opener, "hunted_open_barndoor_idle", "stop_idle" ); // Holds Opener in place until we're ready for them to open the door
flag_wait( "intro_sequence_complete" );
node_door notify( "stop_idle" ); // Notifies the idle animation called earlier to release its hold on the Opener (keeps them from going back into the idle anim)
node_door thread anim_single_solo( door_opener, "hunted_open_barndoor" ); //play anim to open door.
door = getent( "ch_exit", "targetname" );
attachments = GetEntArray( door.target, "targetname" ); //looks at the door entity "target" KVP, then finds every other entity that has the same KVP defined as a targetname. In this case "door_attachments".
//Cycle through entities with "door_attachment" KVP and links them to the door entity.
for ( i = 0; i < attachments.size; i++ )
{
attachments[ i ] LinkTo( door );
}
old_angles = door.angles;
thread maps\nx_hithard_b_amb::ext_door_open();
// flag_set( "fx_intro_door_opening" ); //sets off dust effect as the door opens
door hunted_style_door_open();
// Set initial visionset
set_vision_set( "nx_hithard_b_outdoor_default", 1.0 );
for ( i = 0; i < attachments.size; i++ )
{
if ( attachments[ i ].classname == "script_brushmodel" )
{
attachments[ i ] ConnectPaths();
}
}
// Move baker and gypsy out of the way
level.squad[0] doorClearing( GetNode( "baker_door_clear", "targetname" ) );
level.squad[1] doorClearing( GetNode( "gypsy_door_clear", "script_noteworthy" ) );
door_opener waittill( "goal" );
foreach( guy in level.squad )
{
guy enable_ai_color();
}
level.squad[2] issue_color_orders( "p2", "allies" );
level.squad[3] issue_color_orders( "r2", "allies" );
level.squad[4] issue_color_orders( "r2", "allies" );
// door_opener enable_ai_color();
flag_wait( "intro_street_complete" );
door rotateto( old_angles, 1 );
}
doorClearing( clear_node )
{
self SetGoalNode( clear_node );
self.goalradius = 8;
}
jungle_plaza_enc()
{
flag_wait( "magicgrenade_teargas_hall_exit" ); // wait for the player to get out of the door
level thread uav_reveal();
level thread left_path_setup();
level thread ugv_plaza_guard();
level thread left_path_detail();
level thread right_path_detail();
level thread vp_movement();
level thread last_stand_enc();
// level thread boundary_breach_kill_triggers();
level.squad[1] set_force_color( "c" ); // Gypsy - setting him up to follow player based on which path they take through this section
wait 3.5;
level notify( "firing_stop" );
// Triggered when the player has "beaten" half of the encounter
flag_wait( "jungle_enc_moveup_mid" );
// Shift AI to fill the hall and not flank behind the player
patio_volume = GetEnt( "vol_plaza1_patio", "script_noteworthy" );
hall_volume = GetEnt( "left_to_right_switch", "script_noteworthy" );
a_remaining = GetAiArray( "axis" );
foreach( guy in a_remaining )
{
if ( guy IsTouching( patio_volume ) )
{
guy SetGoalVolumeAuto( hall_volume );
}
}
flag_set( "vp_move_33" ); // vp_movement()
flag_wait( "last_stand_setup" );
waittill_aigroupcleared( "plaza_last_stand" );
trigger_off( "crater_soldiers", "script_noteworthy" );
trigger_off( "uav_last_stand_spawner", "script_noteworthy" );
flag_set( "vp_move_7" );
// Cleaning up stragglers
enemies = GetAiArray( "axis" );
foreach ( guy in enemies )
{
guy kill();
}
UAVs = GetVehicleArray();
foreach ( vehicle in UAVs )
{
vehicle kill( vehicle.origin, level.squad[1] );
}
flag_set( "jungle_plaza_enc_complete" );
// Baker: Clear! Move forward!
// radio_dialogue( "hithard_bak_move_07" );
level.squad[0] thread dialogue_queue( "hithard_bak_move_07" );
autosave_now();
level notify( "plaza_1_end" );
// Setting up vehicle at exit door to explode for flavor
exploding_car = GetEnt( "exploding_car", "script_noteworthy" );
exploding_car kill();
}
uav_reveal()
{
uav = GetEnt( "uav_spotter", "targetname" );
uav waittill( "spawned" );
cqb_handling( level.squad, "off" );
level.squad ignore_me_off();
level._player.ignoreme = false;
// Let Baker and Duke handle the next couple segments without too many interruptions
level.squad[0] disable_pain();
level.squad[1] disable_pain();
// Send Baker and Duke to blocking nodes for the UAV moment
level.squad[0].goalradius = 8;
level.squad[1].goalradius = 8;
level.squad[0] SetGoalNode( GetNode( "baker_uav", "script_noteworthy" ) );
level.squad[1] SetGoalNode( GetNode( "gypsy_uav", "script_noteworthy" ) );
level notify( "intro_done" );
flag_set( "vp_move_3" ); // vp_movement()
uav_ent = Get_Vehicle( "uav_spotter", "targetname" );
PlayFXOnTag( level._effect[ "flashlight" ], uav_ent, "tag_origin" );
level thread uav_baker_dialogue( uav_ent );
// Make squad react to the UAV a little slower than the player
wait 1.0;
level.squad ignore_all_off();
uav_ent waittill( "death" );
level.squad[0].goalradius = 8;
level.squad[1].goalradius = 8;
level.squad[0] SetGoalNode( GetNode( "baker_left_path_start", "script_noteworthy" ) );
level.squad[1] SetGoalNode( GetNode( "gypsy_left_path_start", "script_noteworthy" ) );
level.squad[0].ignoreme = true; // Allow Baker some leeway during this next segment
// baker_node = GetEnt( "baker_uav_talk", "targetname" );
// baker_node thread uav_scene_baker();
level thread uav_scene_baker();
/*
//level.squad[4].animname = "ss";
ss_node = GetNode( "ss_williams_postup", "script_noteworthy" );
ss_node anim_reach_solo( level.squad[4], "hunted_open_barndoor_idle" );
ss_node thread anim_loop_solo( level.squad[4], "hunted_open_barndoor_idle", "stop_idle" );
ss_node notify( "stop_idle" );
*/
autosave_now();
flag_wait( "uav_scene_end" );
flag_set( "left_path_begin" );
level.squad[4] enable_ai_color();
level.squad[0] waittill( "goal" );
// Turn battle back on for all allies
level.squad ignore_me_off();
level.squad ignore_all_off();
level._player.ignoreme = false;
battlechatter_on( "allies" );
battlechatter_off( "axis" );
}
// Threading dialogue so scripts aren't held up
uav_baker_dialogue( uav )
{
level endon( "baker_stop_prodding" );
// Baker: UAV! Take it down!
level.squad[0].animname = "baker";
level.squad[0] dialogue_queue( "hithard_bak_plaza_01" );
uav waittill( "death" );
// Baker: They know we're here!
level.squad[0] thread dialogue_queue( "hithard_bak_plaza_05" );
flag_wait( "left_path_complete" );
add_dialogue_line( "BAKER", "Specter, let's get this hall cleared!", "blue", 2.0 );
// Nag player until they move up and engage the right path
nag = [];
nag [0] = "hithard_bak_plaza2_03";
nag [1] = "hithard_bak_plaza_07";
nag [2] = "hithard_bak_plaza_08";
while( 1 )
{
wait 9.0;
line = random( nag );
level.squad[0] dialogue_queue( line );
// radio_dialogue( line, 2.0 );
}
}
uav_scene_baker()
{
level.squad[0].animname = "baker";
// self anim_reach_and_approach_solo( level.squad[0], "casual_crouch_V2_idle_in" );
// self anim_single_solo( level.squad[0], "stand_exposed_wave_move_out" );
level.squad[0] disable_cqbwalk();
level.squad[0] disable_ai_color();
flag_set( "uav_scene_end" );
}
left_path_setup()
{
flag_wait( "left_path_begin" );
left_path_spawners = GetEntArray( "left_path_main_flood", "script_noteworthy" );
foreach( guy in left_path_spawners )
{
guy spawn_ai();
}
level thread misc_dialogue();
}
left_path_detail()
{
self endon( "last_stand_setup" );
vtol_group_1 = get_ai_group_ai( "vtol_group_1" );
foreach( guy in vtol_group_1 )
{
guy.ignoreall = true;
}
waittill_aigroupcount( "left_path_main_flood", 7 );
// Duke: Fuck, there's a ton of them
// radio_dialogue( "hithard_gyp_monorail_01" );
level.squad[1] dialogue_queue( "hithard_gyp_monorail_01" );
wait 0.5;
// SS Lead: We'll take Patriot on the path to the right!
// radio_dialogue( "hithard_sslead_plaza_02" );
level.squad[3] dialogue_queue( "hithard_sslead_plaza_02" );
flag_set( "vp_move_31" ); // vp_movement()
// Baker: Suppressing Fire!
level.squad[0] dialogue_queue( "hithard_bak_plaza2_05" );
// Prod remaining troops to stop hiding come out of cover
remaining_hallway_troops = get_ai_group_ai( "left_path_main_flood" );
foreach( guy in remaining_hallway_troops )
{
guy set_ignoreSuppression( true );
}
waittill_aigroupcount( "left_path_main_flood", 4 );
flag_set( "left_path_complete" );
wait 1.5;
// Baker: UGV, let's get the fuck outta here!
level.squad[0] dialogue_queue( "hithard_bak_vp2_04" );
// Duke: Gotch'yer back!
add_dialogue_line( "DUKE", "I'll cover our six - you guys keep moving!", "orange", 2.0 );
// Objective saving and handling
objective_number = 22;
Objective_Add( objective_number, "current", "Follow Captain Baker and help run point." );
Objective_OnEntity( objective_number, level.squad[0], ( 0, 0, 70 ) );
// Grab the fast ropers, wake them up, and tell them to stick around in the patio area
vtol_group_1 = get_ai_group_ai( "vtol_group_1" );
patio_vol = GetEnt( "vol_plaza1_patio", "script_noteworthy");
foreach( guy in vtol_group_1 )
{
guy.ignoreall = false;
guy SetGoalVolumeAuto( patio_vol );
}
level.squad[0].goalradius = 8;
level.squad[0] SetGoalNode( GetNode( "baker_right_path_start", "script_noteworthy" ) );
// level.squad[0] disable_pain();
level.squad[1] disable_pain(); // Make Duke take his stand with fewer interruptions
level.squad[4] disable_pain(); // Agent Hayes needs help getting out of the line of fire
level.squad[0] waittill( "goal" ); // Wait until Baker posts up...
flag_wait( "left_path_complete" );
level.squad[0] enable_pain(); // ...and turn pain back on for Baker
level.squad[1].goalradius = 8;
level.squad[1] SetGoalNode( GetNode( "baker_left_path_start", "script_noteworthy" ) ); //Have Duke take over the better firing position
waittill_aigroupcleared( "left_path_main_flood" );
}
misc_dialogue()
{
self endon( "jungle_plaza_enc_complete" );
flag_wait( "left_path_complete" );
waittill_aigroupcleared( "right_path_first_wave" );
// Baker: Specter! Keep moving!
// radio_dialogue( "hithard_bak_plaza_07", 2.0 );
level.squad[0] thread dialogue_queue( "hithard_bak_plaza_07" );
flag_wait( "jungle_enc_moveup_mid" );
add_dialogue_line( "BAKER", "<radio> How're we doing over there, Duke?", "blue", 2.0 );
add_dialogue_line( "DUKE", "<radio> Almost cleared. Flanking left; I'll meet you up ahead.", "orange", 2.0 );
add_dialogue_line( "BAKER", "<radio> Roger that.", "blue", 1.0 );
flag_wait( "left_path_cleanup" );
// Baker: Specter, push the line!
level.squad[0] thread dialogue_queue( "hithard_bak_plaza2_03" );
}
right_path_detail()
{
self endon( "last_stand_setup" );
flag_wait( "vp_move_31" );
level notify( "baker_stop_prodding" );
waittill_aigroupcount( "right_path_first_wave", 2 );
level.squad[0] enable_ai_color(); // Get Baker moving forward
level.squad[0] issue_color_orders( "b31", "allies" );
flag_wait( "right_path_commit" );
level.squad[1].attackeraccuracy = 0; // Make Duke invulnerable while he holds down the rear
left_path_cleaned = get_ai_group_ai( "left_path_main_flood" );
foreach( fool in left_path_cleaned )
{
fool kill();
}
level thread flashbang_right_path();
flag_wait( "vp_move_32" );
// Baker: Get Patriot to cover!
level.squad[0] thread dialogue_queue( "hithard_bak_plaza_16" );
waittill_aigroupcount( "vtol_group_1", 4 );
// Wait for the patio area to be cleared, force reminaing enemies from cover, and then push Baker and crew forward
vol_plaza1_patio = GetEnt( "vol_plaza1_patio", "script_noteworthy" );
// Prod remaining troops to stop hiding come out of cover
patio_remnants = vol_plaza1_patio get_ai_touching_volume( "axis" );
foreach( guy in patio_remnants )
{
guy set_ignoreSuppression( true );
}
vol_plaza1_patio waittill_volume_dead_or_dying();
issue_color_orders( "b33", "allies" ); // Get Baker to move up
issue_color_orders( "r33", "allies" ); // Move extra SS up
level.squad[1].threatbias = -500; // Give Duke a chance at holding down the other side
level.squad[0].threatbias = 10000; // Baker's getting a wake up call
level._player.threatbias = 10000; // ...and so is the player
flag_set( "vp_move_33" );
autosave_now();
flag_wait( "left_path_cleanup" );
// Removing the stalemates at the end of the left path hall to allow Duke to rejoin the group
a_left_path_stalemate = get_ai_group_ai( "left_path_stalemate" );
foreach( fool in a_left_path_stalemate )
{
fool kill();
}
}
flashbang_right_path()
{
flag_wait( "flashbang_right_path" );
MagicGrenade( "flash_grenade", GetStruct( "flashbang_right_path_origin", "targetname" ).origin, GetStruct( "flashbang_right_path_target", "targetname" ).origin, 1.0 );
}
vp_protect_moment()
{
}
last_stand_enc()
{
flag_wait( "last_stand_setup" );
// Moving Duke up to rejoin the squad
teleport_node = GetNode( "duke_teleport_middle_path", "script_noteworthy" );
level.squad[1] ForceTeleport( teleport_node.origin, teleport_node.angles );
level.squad[1] SetGoalNode( GetNode( "duke_last_stand_setup", "script_noteworthy" ) );
level.squad[1] enable_pain();
level.squad[1].goalradius = 64;
level.squad[1] waittill( "goal" );
level.squad[1].animname = "gypsy";
// Duke: Got 'em cornered now!
// radio_dialogue( "hithard_gyp_plaza_01" );
level.squad[1] dialogue_queue( "hithard_gyp_plaza_01" );
// Baker: Finish them off!
// radio_dialogue( "hithard_bak_plaza_17" );
level.squad[0] dialogue_queue( "hithard_bak_plaza_17" );
last_stand_volume = GetEnt( "last_stand_volume", "script_noteworthy" );
a_remaining = GetAiArray( "axis" );
foreach( guy in a_remaining )
{
guy SetGoalVolumeAuto( last_stand_volume );
}
}
vp_movement()
{
//level.squad[2].animname = "vp";
//level.squad[3].animname = "ss";
level.squad[2] disable_pain();
level.squad[3] disable_pain();
// UAV attack
flag_wait( "vp_move_3" );
ss_vignette_move( GetNode( "vp_vig_3", "script_noteworthy" ), level.squad[2], level.squad[3], false );
// Plaza 1 start
flag_wait( "vp_move_31" );
ss_vignette_move( GetNode( "vp_vig_31", "script_noteworthy" ), level.squad[2], level.squad[3], false );
// Sunglass shop
flag_wait( "vp_move_32" );
ss_vignette_move( GetNode( "vp_vig_32", "script_noteworthy" ), level.squad[2], level.squad[3], false );
wait 2.5;
// Baker: Specter! We're pinned down over here!
// radio_dialogue_safe( "hithard_bak_highway_12" );
// Lower level shop start
flag_wait( "vp_move_33" );
// Baker: Specter! Move up!
// radio_dialogue_interupt( "hithard_bak_plaza_08" );
level.squad[0] thread dialogue_queue( "hithard_bak_plaza_08" );
wait 1.5;
ss_vignette_move( GetNode( "vp_vig_33", "script_noteworthy" ), level.squad[2], level.squad[3], false );
// Coffee shop harden point
flag_wait( "vp_move_34" );
ss_vignette_move( GetNode( "vp_vig_34", "script_noteworthy" ), level.squad[2], level.squad[3], false );
flag_set( "vp_protect_moment" );
// Plaza 1 final
flag_wait( "vp_move_7" );
level.squad[ 2 ] notify( "stop_vignette" );
level.squad[2] SetGoalNode( GetNode( "node_mall_tunnel_ally_vp_price", "script_noteworthy" ) );
level.squad[3] SetGoalNode( GetNode( "node_mall_tunnel_ally_ss_walker", "script_noteworthy" ) );
level.squad[4] SetGoalNode( GetNode( "node_mall_tunnel_ally_ss_hayes", "script_noteworthy" ) );
flag_wait( "exit_plaza" );
level.squad[2] enable_ai_color();
level.squad[3] enable_ai_color();
issue_color_orders( "p8", "allies" );
issue_color_orders( "r8", "allies" );
}
//*******************************************************************
// Plaza 1 periphery scripts *
// *
//*******************************************************************
ugv_firing_sequence( ugv, stop_command )
{
self endon( "firing_stop" );
target = getstruct( "ugv_targets", "targetname" );
while ( 1 )
{
turret = ugv.mgturret[0];
turret StartBarrelSpin();
r = RandomFloat( 360 );
s = RandomFloatRange( 120.0, 240.0 );
targetPos = target.origin + ( cos(r)*s, sin(r)*s, 0);
turret SetTurretTargetPosition( targetPos );
turret ShootTurret();
wait RandomFloatRange( 0.2, 2.0);
}
}
uav_loop()
{
self endon( "uav_scene_end" );
while ( 1 )
{
a_uav = GetEntArray( "intro_uav_loop", "targetname" );
foreach( guy in a_uav )
{
guy maps\_attack_heli::SAV_setup( "pathing" );
}
wait 4.0;
}
}
VTOL_loop()
{
self endon( "uav_scene_end" );
while ( 1 )
{
a_VTOL = GetEntArray( "intro_street_VTOL_fill", "targetname" );
foreach( guy in a_VTOL )
{
guy spawn_vehicle_and_gopath();
wait 1.0;
}
wait 5.0;
}
}
//*******************************************************************
// Underground Mall Tunnel *
// *
//*******************************************************************
mall_tunnel_main()
{
level._start_point = "mall_tunnel";
flag_set( "jungle_plaza_enc_complete" );
// Objective and saving handling
objective_number = 21;
thread maps\_utility::set_ambient( "nx_hithard_ext_b" );
// Objective_Add( objective_number, "current", "Get Patriot to the Monorail Station." );
// autosave_now();
playerstart_mall_tunnel_start();
flag_wait( "tunnel_enc_complete" );
// flag_wait( "plaza_enc_complete" );
}
playerstart_mall_tunnel_start()
{
flag_wait( "jungle_plaza_enc_complete" );
plaza_exit_sequence();
// Wait until civ moment is resolved one way or another
waittill_aigroupcleared( "civ_moment_squad" );
// Possible duke VO line if Civilians are alive
thread mall_its_not_safe();
autosave_now();
flag_wait( "player_exited_restaurant" );
// Move into the open
issue_color_orders( "p11", "allies" );
issue_color_orders( "r11", "allies" );
issue_color_orders( "c10", "allies" );
issue_color_orders( "b10", "allies" );
level.squad[0] waittill( "goal" );
flag_set( "tunnel_enc_complete" );
objective_number = 23;
Objective_Add( objective_number, "current", "Regroup with the squad." );
Objective_OnEntity( objective_number, level.squad[0], ( 0, 0, 70 ) );
level._player waittill_entity_in_range( level.squad[0], 250 );
Objective_State( objective_number , "done" );
objective_number = 21;
Objective_State( objective_number, "current" );
objective_loc = GetEnt( "monorail_entrance_loc", "targetname" );
Objective_Position( objective_number, objective_loc.origin );
}
mall_its_not_safe()
{
if ( !isdefined( level.mall_civilians ))
{
return;
}
flag_wait( "player_exited_restaurant" );
foreach ( civilian in level.mall_civilians )
{
if ( isalive( civilian ) )
{
// Someone's alive! Play the line
level.squad[1].animname = "gypsy"; // Just in case
wait 2.5;
// Duke: It's not safe here, people - find cover!
level.squad[1] dialogue_queue( "hithard_gyp_mall_07" );
flag_set( "civilian_escape" );
// Baker: Duke, let<65>s GO!
level.squad[0] dialogue_queue( "hithard_bak_mall_11" );
return;
}
}
}
plaza_exit_sequence()
{
level thread plaza_exit_dialogue();
tunnel_enc();
}
plaza_exit_dialogue()
{
level thread plaza_door();
flag_wait( "tunnel_door_setup" );
// Baker: Duke, get the door
// radio_dialogue( "hithard_bak_mall_03" );
level.squad[0] dialogue_queue( "hithard_bak_mall_03" );
flag_set( "exit_plaza" );
wait 1.0;
flag_wait( "entered_store" );
}
plaza_door()
{
door_opener = level.squad[ 1 ]; // Gypsy
door_guard = level.squad[ 0 ]; // Baker
door_opener.goalradius = 8;
door_opener.animname = "gypsy"; //assign animname to AI so we can later call animation on.
ready_node = GetNode( "gypsy_plaza_exit", "targetname" );
door_opener SetGoalNode( ready_node );
door_guard SetGoalNode( GetNode( "baker_plaza_exit", "targetname" ) );
node_door = GetEnt( "gypsy_door_origin", "targetname" ); //called on script_origin node, grabs KVP, and assigns to variable.
node_door anim_reach_and_approach_solo( door_opener, "hunted_open_barndoor_stop" ); //blends into first frame of open door anim based off cover right anim pose. Also ends anim in cover right position.
node_door thread anim_loop_solo( door_opener, "hunted_open_barndoor_idle", "stop_idle" ); // Holds Opener in place until we're ready for them to open the door
// waiting for everyone to get into place
door_guard waittill( "goal" );
objective_number = 22;
Objective_Add( objective_number, "current", "Regroup with the squad." );
// Objective_OnEntity( objective_number, level.squad[0], ( 0, 0, 70 ) );
door_origin = GetEnt( "obj_regroup_plaza1", "targetname" );
Objective_Position( objective_number, door_origin.origin );
level._player waittill_entity_in_range( level.squad[0], 225 );
Objective_State( objective_number , "done" );
objective_number = 21;
Objective_State( objective_number, "current" );
// Baker: Hold here
// radio_dialogue( "hithard_bak_mall_02" );
level.squad[0] dialogue_queue( "hithard_bak_mall_02" );
level.squad[ 2 ] waittill( "goal" );
level.squad[ 3 ] waittill( "goal" );
level.squad[ 4 ] waittill( "goal" );
flag_set( "tunnel_door_setup" );
flag_wait( "exit_plaza" );
node_door notify( "stop_idle" ); // Notifies the idle animation called earlier to release its hold on the Opener (keeps them from going back into the idle anim)
level endon( "civilian_enc_start" );
node_door thread anim_single_solo( door_opener, "hunted_open_barndoor" ); //play anim to open door.
door = getent( "plaza_exit_origin", "targetname" );
attachments = GetEntArray( door.target, "targetname" ); //looks at the door entity "target" KVP, then finds every other entity that has the same KVP defined as a targetname. In this case "door_attachments".
//Cycle through entities with "door_attachment" KVP and links them to the door entity.
for ( i = 0; i < attachments.size; i++ )
{
attachments[ i ] LinkTo( door );
}
old_angles = door.angles;
door hunted_style_door_open( "metal_door_open" );
for ( i = 0; i < attachments.size; i++ )
{
if ( attachments[ i ].classname == "script_brushmodel" )
{
attachments[ i ] ConnectPaths();
}
}
// Gypsy cautions us all to be quiet
quiet_node = GetNode( "gypsy_door_be_quiet", "targetname" );
quiet_node anim_reach_and_approach_solo( door_opener, "CQB_stand_signal_stop" );
level.squad[1] thread mall_duke_callout();
level.squad[1] anim_single_solo( level.squad[1], "CQB_stand_signal_stop" );
self.grenadeAmmo = 3; // Gives the actor 3 grenades of whatever type they currently have
self.grenadeWeapon = "flash_grenade"; // Switches the actor's grenade type to flashbangs. Use "fraggrenade" for frags.
// Move gypsy out of the way
clear_node = GetNode( "gypsy_door_clear", "targetname" );
door_opener SetGoalNode( clear_node );
door_opener.goalradius = 8;
flag_set( "civilian_enc_start" ); // also ends script
}
mall_duke_callout()
{
wait 0.5;
// Duke: Two on the right...stay down
// radio_dialogue( "hithard_gyp_mall_02" );
level.squad[1] dialogue_queue( "hithard_gyp_mall_02" );
}
tunnel_enc()
{
civilian_enc();
}
civilian_enc()
{
flag_wait( "jungle_plaza_enc_complete" );
civ_moment_noteworthies = [ "hall_shooter", "hall_guard", "hall_check_a", "hall_check_b", "civ_a", "civ_b" ];
soldier_spawners = [];
civilian_spawners = [];
// Wait until Baker finishes his warning & player has entered store
flag_wait( "entered_store" );
thread slomo_handling();
// Set ignores
thread mall_set_player_ignores( "player_interruption" );
level.squad[0] thread mall_set_ai_ignores( "flag_mall_door_open" ); // Baker doesn't return to combat until he opens the door
level.squad[1] thread mall_set_ai_ignores( "player_interruption" ); // Duke will return to combat immediately on player interruption
// Spawn soldiers
soldiers = [];
soldiers[0] = mall_civ_moment_spawner( "hall_shooter", "hall_shooter", ::mall_civ_moment_shoot_civilians, ::mall_civ_moment_soldier_spawn_func );
soldiers[1] = mall_civ_moment_spawner( "hall_guard", "hall_guard", ::mall_civ_moment_guard, ::mall_civ_moment_soldier_spawn_func );
soldiers[2] = mall_civ_moment_spawner( "hall_check_a", "hall_check_a", ::soldier_survey_near, ::mall_civ_moment_soldier_spawn_func );
soldiers[3] = mall_civ_moment_spawner( "hall_check_b", "hall_check_b", ::soldier_survey_far, ::mall_civ_moment_soldier_spawn_func );
// PlayFXOnTag( level._effect[ "flashlight_spotlight" ], soldiers[2], "tag_flash" );
// PlayFXOnTag( level._effect[ "flashlight" ], soldiers[2], "tag_flash" );
// PlayFXOnTag( level._effect[ "flashlight" ], soldiers[3], "tag_flash" );
// level thread attach_flashlight( soldiers[2], soldiers[3] );
level.mall_civilians = [];
level.mall_civilians[0] = mall_civ_moment_spawner( "civ_a", "civ1", ::mall_civ_moment_civ_spawn_func );
level.mall_civilians[1] = mall_civ_moment_spawner( "civ_b", "civ2", ::mall_civ_moment_civ_spawn_func );
// Civilian & enemy dialogue and animations
level thread mall_civ_moment_soldiers( soldiers, level.mall_civilians );
// Wait until Duke finishes his warning or player walks too far into the room
flag_wait( "civilian_enc_start" );
// Civ dialogue begins
level thread mall_civ_dialogue( soldiers, level.mall_civilians );
// If player does something bad from this point on, interrupt moment
level thread set_flag_on_player_action( "player_interruption" );
// Allies will attempt to go into into the room, ally dialogue fires off when in position
level thread civ_moment_allies( soldiers[0], soldiers[2], soldiers[1] );
wait 3;
// Set color nodes for VP and SS to follow
issue_color_orders( "b8", "allies" );
wait 3; // Having VP hang back a moment
issue_color_orders( "p85", "allies" );
issue_color_orders( "r85", "allies" );
flag_wait( "player_interruption" );
// When interrupted, soldiers go into combat, civilians run
}
slomo_handling()
{
level endon( "player_exited_restaurant" );
flag_wait( "player_interruption" );
set_vision_set( "nx_hithard_b_outdoor_default", 0.1 );
SetSlowMotion( 1.0, 0.25, 0.5 );
// Pull player out of slowmo
wait 1.75;
slowmo_setlerptime_out( .05 );
slowmo_lerp_out();
slowmo_end();
set_vision_set( "nx_hithard_b_diner_entrance", 1 );
flag_set( "slowmotion_done" );
}
attach_flashlight( soldier_near, soldier_far )
{
PlayFXOnTag( level._effect[ "flashlight_spotlight" ], soldier_near, "tag_flash" );
PlayFXOnTag( level._effect[ "flashlight" ], soldier_near, "tag_flash" );
// PlayFXOnTag( level._effect[ "flashlight" ], soldier_far, "tag_flash" );
// self.have_flashlight = true;
flag_wait( "civ_moment_in_position" );
StopFXOnTag( level._effect[ "flashlight_spotlight" ], soldier_near, "tag_flash", true );
StopFXOnTag( level._effect[ "flashlight" ], soldier_near, "tag_flash", true );
}
mall_civ_moment_spawner( noteworthy, animname, spawn_func1, spawn_func2 )
{
spawner = GetEnt( noteworthy, "script_noteworthy" );
assert( isdefined( spawner ) );
spawner add_spawn_function( ::set_animname, animname );
if ( IsDefined( spawn_func1 ) )
{
spawner add_spawn_function( spawn_func1 );
}
if ( IsDefined( spawn_func2 ) )
{
spawner add_spawn_function( spawn_func2 );
}
actor = spawner spawn_ai();
return actor;
}
set_animname( animname )
{
self.animname = animname;
}
mall_civ_moment_soldier_spawn_func()
{
self endon( "death" );
self enable_cqbwalk();
self.ignoreall = true;
flag_wait( "player_interruption" );
self notify( "end_sequence" ); // If we are in a vignette when this happens, cut it short
self.goalradius = 512;
self.ignoreall = false;
self disable_cqbwalk();
}
mall_civ_moment_civ_spawn_func()
{
thread mall_tunnel_escape();
}
mall_civ_moment_soldiers( soldiers, civilians )
{
level endon( "player_interruption" );
level endon( "civ_moment_dialogue_complete" );
// Survey soldiers
//level thread soldier_survey_near( soldiers[ 2 ] );
//level thread soldier_survey_far( soldiers[ 3 ] );
hunted = [];
hunted["hall_shooter"] = soldiers[0];
hunted["hall_guard"] = soldiers[1];
//hunted["civ1"] = civilians[0];
hunted_origin = GetEnt( "hunted_cutscene", "script_noteworthy" );
//hunted_origin anim_reach( hunted, "mall_civ_moment" );
hunted_origin anim_single( hunted, "mall_civ_moment" );
//soldiers[0] mall_civ_moment_shoot_civilians( civilians );
//array_thread( soldiers, ::mall_tunnel_escape );
}
mall_civ_dialogue( soldiers, civilians )
{
level endon( "player_interruption" );
soldiers[0] endon( "death" );
soldiers[1] endon( "death" );
civilians[0] endon( "death" );
civilians[1] endon( "death" );
soldiers[0] dialogue_queue( "hithard_ecso_mall_01" );
civilians[0] dialogue_queue( "hithard_civ1_mall_02" );
wait 2;
soldiers[0] dialogue_queue( "hithard_ecso_mall_02" );
civilians[0] dialogue_queue( "hithard_civ1_mall_01" );
wait 2;
soldiers[0] dialogue_queue( "hithard_ecso_mall_03" );
civilians[1] dialogue_queue( "hithard_civ2_mall_01" );
wait 2;
soldiers[0] dialogue_queue( "hithard_ecso_mall_04" );
civilians[0] dialogue_queue( "hithard_civ1_mall_03" );
wait 2;
soldiers[0] dialogue_queue( "hithard_ecso_mall_05" );
civilians[0] dialogue_queue( "hithard_civ1_mall_04" );
flag_set( "civ_moment_interrogation_dialogue_complete" );
}
mall_civ_moment_shoot_civilians()
{
self endon( "death" );
level endon( "player_interruption" );
flag_wait( "civ_moment_dialogue_complete" );
flag_wait( "civ_moment_interrogation_dialogue_complete" );
self StopAnimScripted();
wait 2;
civilians = level.mall_civilians;
foreach( civilian in civilians )
{
if ( isalive( civilian ) )
{
cqb_aim( civilian );
wait 0.7;
magicbullet( self.weapon, self gettagorigin( "tag_flash" ), civilian getShootAtPos() );
civilian kill();
}
}
}
mall_civ_moment_guard()
{
//self endon( "death" );
//level endon( "player_interruption" );
//self.animname = "soldier_guard";
}
mall_tunnel_escape()
{
// Civilian attempts to escape
self endon( "death" );
waittill_aigroupcleared( "civ_moment_squad" );
flag_wait( "civilian_escape" );
wait( RandomFloatRange( 1.5, 2.25 ) );
self.goalradius = 32;
self SetGoalNode( GetNode( "mall_tunnel_escape", "script_noteworthy" ) );
self waittill( "goal" );
self delete();
}
mall_set_player_ignores( wait_flag )
{
level._player.ignoreme = true;
flag_wait( wait_flag );
level._player.ignoreme = false;
}
mall_set_ai_ignores( wait_flag )
{
self.ignoreme = true;
self.ignoreall = true;
self disable_ai_color();
self enable_cqbwalk();
flag_wait( wait_flag );
self.ignoreme = false;
self.ignoreall = false;
self enable_ai_color();
self set_force_color( "b" );
self disable_cqbwalk();
}
civ_moment_allies( leader, soldier, guard )
{
level endon( "player_interruption" );
// Post up Duke and Baker at their positions
level.squad[ 0 ].goalradius = 8;
level.squad[ 1 ].goalradius = 8;
level.squad[ 0 ].fixednode = true;
level.squad[ 1 ].fixednode = true;
level.squad[ 0 ] SetGoalNode( GetNode( "civ_moment_baker_watch", "script_noteworthy" ) );
level.squad[ 1 ] SetGoalNode( GetNode( "civ_moment_gypsy_watch", "script_noteworthy" ) );
level.squad[ 0 ] thread mall_baker_opens_door();
// Wait for them to get to their positions before continuing the dialgoue
level.squad[ 1 ] waittill( "goal" );
flag_set( "civ_moment_in_position" );
level thread mall_allies_dialogue();
level.squad[1] thread mall_duke_shoots_leader( leader, guard );
level.squad[0] thread mall_baker_shoots_soldier_far( soldier );
flag_wait( "civ_moment_dialogue_complete" );
wait 5;
// If player has not fired yet, duke does the deed
level.squad[1] thread dialogue_queue( "hithard_gyp_mall_06" );
level.squad[1].ignoreall = false;
wait 1;
flag_set( "player_interruption" );
}
mall_baker_opens_door()
{
self.animname = "baker";
level.squad[ 0 ] SetGoalNode( GetNode( "civ_moment_baker_watch", "script_noteworthy" ) );
level.squad[ 0 ] waittill( "goal" );
flag_wait( "player_interruption" );
flag_wait( "slowmotion_done" );
// Play door kick anim
wait 1.0;
node = GetEnt("node_door_kick", "targetname");
level.squad[ 0 ] SetGoalNode( GetNode( "mall_baker_door_open", "script_noteworthy" ) );
// Baker: We're moving!
level.squad[ 0 ] dialogue_queue( "hithard_bak_plaza_14" );
level.squad[ 0 ] waittill( "goal" );
wait 0.5; // Arrival
node thread anim_single_solo(self, "door_kick_in");
// Animate the door
door = getent( "mall_kick_door", "targetname" );
attachments = GetEntArray( door.target, "targetname" ); //looks at the door entity "target" KVP, then finds every other entity that has the same KVP defined as a targetname. In this case "door_attachments".
//Cycle through entities with "door_attachment" KVP and links them to the door entity.
for ( i = 0; i < attachments.size; i++ )
{
attachments[ i ] LinkTo( door );
}
door hithard_style_door_kick( "scn_hithard_ally_door_smash_hit" );
for ( i = 0; i < attachments.size; i++ )
{
if ( attachments[ i ].classname == "script_brushmodel" )
{
attachments[ i ] ConnectPaths();
}
}
clear_node = GetNode("mall_door_kick_finish", "targetname");
self SetGoalNode( clear_node );
self.goalradius = 8;
self waittill("goal");
flag_set("flag_mall_door_open");
flag_set( "fx_back_half_turn_on" );
// Set Duke up near the door
duke_clear_node = GetNode( "duke_post_civ_moment", "script_noteworthy" );
level.squad[1].goalradius = 8;
level.squad[1] SetGoalNode( duke_clear_node );
flag_wait( "player_exited_restaurant" );
}
hithard_style_door_kick( soundalias )
{
wait( 2.0 );
if ( IsDefined( soundalias ) )
self PlaySound( soundalias );
else
self PlaySound( "door_wood_slow_open" );
//self RotateTo( self.angles + ( 0, 70, 0 ), .4, .1, 0 );
self RotateTo( self.angles + ( 0, 100, 0 ), .4, .1, 0 );
self ConnectPaths();
self waittill( "rotatedone" );
//self RotateTo( self.angles + ( 0, 70, 0 ), .4, .1, 0 );
self RotateTo( self.angles + ( 0, -15, 0 ), 1, .1, .1 );
}
mall_duke_shoots_leader( leader, guard )
{
self endon( "death" );
cqb_aim( guard );
level waittill( "player_interruption" );
if ( isalive( guard ) )
{
magicbullet( self.weapon, self gettagorigin( "tag_flash" ), guard getShootAtPos() );
}
else
{
if ( isalive( leader ) )
{
magicbullet( self.weapon, self gettagorigin( "tag_flash" ), leader getShootAtPos() );
}
}
}
mall_baker_shoots_soldier_far( soldier )
{
self endon( "death" );
cqb_aim( soldier );
level waittill( "player_interruption" );
if ( isalive( soldier ) )
{
magicbullet( self.weapon, self gettagorigin( "tag_flash" ), soldier getShootAtPos() );
}
}
mall_allies_dialogue()
{
level endon( "player_interruption" );
flag_wait( "civ_moment_in_position" );
// Duke: Well what do we have here...
level.squad[1] dialogue_queue( "hithard_gyp_mall_03" );
// Baker: Must be about us
level.squad[0] dialogue_queue( "hithard_bak_mall_05" );
wait 2;
// Duke: They don't like what they're hearing
level.squad[1] dialogue_queue( "hithard_gyp_mall_04" );
wait 1;
// Baker: Their buddies are back
level.squad[0] dialogue_queue( "hithard_bak_mall_06" );
// Duke: I've got sights on the left one...
level.squad[1] dialogue_queue( "hithard_gyp_mall_05" );
// Baker: On you, Spectre
level.squad[0] dialogue_queue( "hithard_bak_mall_08" );
wait 3; // Give player time to shoot
flag_set( "civ_moment_dialogue_complete" );
}
soldier_survey_near()
{
level endon( "player_interruption" );
self.goalradius = 8;
self SetGoalNode( GetNode( "rubble_check_near", "targetname" ) );
setsaveddvar( "r_spotlightstartradius", "50" );
setsaveddvar( "r_spotlightendradius", "100" );
setsaveddvar( "r_spotlightfovinnerfraction", "0" );
setsaveddvar( "r_spotlightexponent", "0" );
setsaveddvar( "r_spotlightBrightness", "16" );
PlayFXOnTag( level._effect[ "flashlight_spotlight" ], self, "tag_flash" );
PlayFXOnTag( level._effect[ "flashlight" ], self, "tag_flash" );
self waittill( "goal" );
flag_wait( "civ_moment_in_position" );
wait 1;
self.goalradius = 16;
self SetGoalNode( GetNode( "survey_return_near", "targetname" ) );
self waittill( "goal" );
StopFXOnTag( level._effect[ "flashlight_spotlight" ], self, "tag_flash", true );
StopFXOnTag( level._effect[ "flashlight" ], self, "tag_flash", true );
}
soldier_survey_far()
{
level endon( "player_interruption" );
self.goalradius = 8;
self SetGoalNode( GetNode( "rubble_check_far", "targetname" ) );
PlayFXOnTag( level._effect[ "flashlight" ], self, "tag_flash" );
flag_wait( "civ_moment_in_position" );
wait 1;
self.goalradius = 24;
self SetGoalNode( GetNode( "survey_return_far", "targetname" ) );
self waittill( "goal" );
StopFXOnTag( level._effect[ "flashlight" ], self, "tag_flash", true );
}
//*******************************************************************
// Planter Plaza Encounter *
// *
//*******************************************************************
plaza_enc_main()
{
// STARTING UP THE MOVEMENT THREAD.
level thread plaza_2_ally_movement();
// TURNING ON FRIENDLY CHATTER DURING ENCOUNTER.
level.squad ignore_me_off();
level.squad ignore_all_off();
level._player.ignoreme = false;
battlechatter_on( "allies" );
battlechatter_off( "axis" );
// WAITING FOR TRIGGER AT THE END OF THE SECTION.
flag_wait( "plaza_enc_complete" );
// TURNING OFF FRIENDLY CHATTER AFTER ENCOUNTER.
battlechatter_off( "allies" );
battlechatter_off( "axis" );
// COMPLETING THE CURRENT OBJECTIVE.
Objective_State( 21, "done" );
// STOP VIGNETTE AND RE-ENABLING REGULAR COLOR CONTROL TO SS AND VP FOR NEXT SECTION.
ss_vignette_end( level.squad[2], level.squad[3] );
level.squad[2] enable_ai_color();
level.squad[3] enable_ai_color();
// HACK FOR ISSUES WITH ENABLING COLORS THEN SENDING COLOR COMMAND.
waittillframeend;
// MOVE EVERYONE FORWARD.
issue_color_orders( "b140 r14 p14", "allies" );
// STARTING UP MONORAIL ENCOUNTER.
flag_set( "monorail_station_start" );
autosave_now();
}
plaza_2_ally_movement()
{
// MAKING SURE THE ALLIES ARE SET TO MOVE ON COLORS.
foreach( squadmate in level.squad )
{
squadmate enable_ai_color();
}
// HACK FOR ISSUES WITH ENABLING COLORS THEN SENDING COLOR COMMAND.
waittillframeend;
// WAITING UNTIL ALLIES MOVE THRU THE FIRST SECTION OF THE PLAZA.
flag_wait( "vp_move_110" );
// MOVE SQUAD FIRST, THEN SS ALONG WITH THE VP TO THE FIRST SAFE SPOT.
plaza_2_issue_move("b110", "r110", "vp_vig_110", 0.5);
// CAPTAIN BAKER: "Tangos! Second level!"
radio_dialogue( "hithard_bak_plaza_12" );
// WAITING UNTIL ALLIES MOVE THRU THE SECOND SECTION OF THE PLAZA.
flag_wait( "vp_move_115" );
// MOVE SQUAD FIRST, THEN SS ALONG WITH THE VP TO THE SECOND SAFE SPOT.
plaza_2_issue_move("b115", "r115", "vp_vig_115", 0.5);
// DUKE: "Move forward!"
radio_dialogue( "hithard_gyp_move_03" );
// WAITING UNTIL ALLIES MOVE THRU THE THIRD SECTION OF THE PLAZA.
flag_wait( "vp_move_116" );
// MOVE SQUAD FIRST, THEN SS ALONG WITH THE VP TO THE THIRD SAFE SPOT.
plaza_2_issue_move("b116", "r116", "vp_vig_116", 0.5);
// DUKE: "Keep moving!"
radio_dialogue( "hithard_gyp_move_02" );
// WAITING UNTIL ALLIES MOVE THRU THE FOURTH SECTION OF THE PLAZA.
flag_wait( "vp_move_120" );
// MOVE SQUAD FIRST, THEN SS ALONG WITH THE VP TO THE FOURTH SAFE SPOT.
plaza_2_issue_move("b120", "r120", "vp_vig_120", 0.5);
}
plaza_2_issue_move(b_color_number, r_color_number, vp_node_number, wait_time)
{
issue_color_orders( b_color_number, "allies" );
wait wait_time;
issue_color_orders( r_color_number, "allies" );
ss_vignette_move( GetNode( vp_node_number, "script_noteworthy" ), level.squad[2], level.squad[3], false );
}
//*******************************************************************
// Monorail Station Encounter *
// *
//*******************************************************************
monorail_station_main()
{
flag_set( "plaza_enc_complete" );
objective_number = 24;
obj_position = GetEnt( "on_ramp_lapse", "targetname" );
Objective_Add( objective_number, "current", "Clear the monorail station." );
Objective_Position( objective_number, GetEnt( "on_ramp_lapse", "targetname" ).origin );
autosave_by_name( "plaza_enc_complete" );
playerstart_monorail_start();
}
playerstart_monorail_start()
{
level._start_point = "monorail";
monorail_station_enc();
flag_wait( "monorail_station_enc_complete" );
autosave_now();
}
monorail_station_enc()
{
level thread monorail_dialogue();
flag_wait( "magicgrenade_monorail_start" );
MagicGrenade( "smoke_grenade_american", GetStruct( "teargas_monorail_start_01_origin", "targetname" ).origin, GetStruct( "teargas_monorail_start_01_target", "targetname" ).origin, 1.0 );
MagicGrenade( "smoke_grenade_american", GetStruct( "teargas_monorail_start_02_origin", "targetname" ).origin, GetStruct( "teargas_monorail_start_02_target", "targetname" ).origin, 3.0 );
flag_wait( "monorail_station_enc_complete" );
post_monorail_regroup();
}
monorail_dialogue()
{
self endon( "monorail_station_enc_complete" );
flag_wait( "monorail_station_start" );
// Duke: Won't be safe here for long.
radio_dialogue( "hithard_gyp_plaza2_04" );
// Baker: That's why we're on the move. The LZ can't be far now.
radio_dialogue( "hithard_bak_plaza2_06" );
// Baker: Are you still good to go, sir?
radio_dialogue( "hithard_bak_plaza2_07" );
// VP: You bet
radio_dialogue( "hithard_vp_plaza2_01" );
// Baker: We're heading out up and out of the station. Sound good, Williams?
radio_dialogue( "hithard_bak_plaza2_08" );
// SS Lead: Sounds like a plan. Move it!
radio_dialogue( "hithard_sslead_plaza2_01" );
flag_wait( "monorail_dialogue_start" );
// Duke: Fuck me, there's a ton of them
radio_dialogue( "hithard_gyp_monorail_01" );
// Baker: More smoke, too. Use your threat ID if you can
radio_dialogue( "hithard_bak_mono_01" );
wait (5.0);
// Baker: Specter, get the angle on them!
radio_dialogue( "hithard_bak_mono_02" );
}
post_monorail_regroup()
{
Objective_State( 23, "done" );
gypsy_node = GetNode( "gypsy_survey_homestretch", "script_noteworthy" );
baker_node = GetNode( "baker_homestretch", "script_noteworthy" );
level.squad[0].goalradius = 8;
level.squad[1].goalradius = 8;
level.squad[0] SetGoalNode( baker_node );
level.squad[1] SetGoalNode( gypsy_node );
level.squad[1] waittill( "goal" );
level.squad[0] waittill( "goal" );
// Duke: Home stretch, fellas. I can see the highway...100 meters
radio_dialogue( "hithard_gyp_highway_01" );
// Baker: Let's punch it
radio_dialogue( "hithard_bak_highway_02" );
// SSLead: We're right behind you
radio_dialogue( "hithard_sslead_highway_01" );
level.squad[0] enable_ai_color();
level.squad[1] enable_ai_color();
}
//*******************************************************************
// *
// *
//*******************************************************************
//*******************************************************************
// *
// MAIN: The following "main()" is called from nx_hithard_b.gsc *
// *
//*******************************************************************
city_hall_escape_main()
{
level._start_point = "default";
level thread cityhall_swat_door();
playerstart_city_hall_escape_start();
}
city_hall_entrance()
{
flag_wait( "ch_events_start" );
city_hall_events();
}
// Handles ambient civilians that populate the inside of City Hall
city_hall_events()
{
static_civilians = GetEntArray( "ch_civilian_spawners", "script_noteworthy" );
foreach( guy in static_civilians )
{
guy spawn_ai();
}
clean_civilians( "ch_civilian_spawners", "city_hall_cleanup" );
crowd_01 = maps\nx_crowd_controller::new_crowd( "ch_hall_left_civilians",
2,
GetEntArray( "ch_hall_left_spawners", "script_noteworthy" ),
GetEntArray( "ch_left_hall_start_01", "script_noteworthy"),
GetEntArray( "ch_left_hall_end_01", "script_noteworthy") );
wait 4.0;
maps\nx_crowd_controller::spawn_crowd( "ch_hall_left_civilians" );
}
clean_civilians( spawner_name, flag_to_wait_for )
{
flag_wait( flag_to_wait_for );
array_civilians = GetEntArray( spawner_name, "script_noteworthy" );
foreach( guy in array_civilians )
{
guy Delete();
}
}
// Sequence of SWAT guys holding the door to City Hall open and guiding the player into the building
cityhall_swat_door()
{
cityhall_door = getent( "com_door_01_handleleft", "targetname" );
cityhall_door assign_animtree("cityhall_door");
swat_ally01 = getent("cityhall_swat_door_ally01", "script_noteworthy");
swat_ally01.animname = "swat_ally01";
swat_ally02 = getent("cityhall_swat_door_ally02", "script_noteworthy");
swat_ally02.animname = "swat_ally02";
node_cityhall_swat_door = getstruct("vinette_cityhall_swat_door", "script_noteworthy");
guys = [];
guys["cityhall_door"] = cityhall_door;
guys["swat_ally01"] = swat_ally01;
guys["swat_ally02"] = swat_ally02;
node_cityhall_swat_door anim_first_frame(guys, "cityhall_swat_door_start");
flag_wait("triggerplane");
node_cityhall_swat_door anim_single(guys, "cityhall_swat_door_start");
node_cityhall_swat_door thread anim_loop(guys, "cityhall_swat_door_idle");
flag_wait("triggerplane2");
foreach (swat in guys)
{
swat StopAnimScripted();
}
node_cityhall_swat_door thread anim_single(guys, "cityhall_swat_door_end");
}
//*******************************************************************
// *
// *
//*******************************************************************
//Beginning script for starting out the skybridge sequence
playerstart_city_hall_escape_start()
{
flag_wait( "city_hall_briefing_end" );
objective_number = 20;
obj_position = GetEnt( "city_hall_east_exit", "targetname" );
Objective_Add( objective_number, "current", "Make your way out of City Hall" );
Objective_Position( objective_number, GetStruct( "city_hall_east_exit", "targetname" ).origin );
thread skybridge_glass_break();
thread skybridge_crossing();
trigger_wait( "obj_city_hall_east_exit", "script_noteworthy" );
Objective_State( objective_number , "done" );
flag_set( "obj_east_done" );
playerstart_escort_start();
level._start_point = "escort";
}
//*******************************************************************
// Skybridge Sequence *
// *
//*******************************************************************
skybridge_crossing()
{
add_dialogue_line( "BAKER", "Stay down! Best if we aren't seen when crossing." );
foreach( guy in level.squad )
{
guy enable_cqbwalk();
}
flag_wait( "skybridge_seen" );
add_dialogue_line( "GYPSY", "Shit, they see us!", "green" );
add_dialogue_line( "BAKER", "They must have infrared...get outta here, gogogo!", "blue" );
foreach( guy in level.squad )
{
guy disable_cqbwalk();
}
}
skybridge_glass_break()
{
trigger_wait_targetname( "trig_skybridge_glass_01" );
level notify( "glass_break", level._player );
autosave_now();
thread city_hall_east_exit();
}
// Handles ambient civilians that populate the inside of City Hall East
city_hall_east_civilians()
{
crowd_01 = maps\nx_crowd_controller::new_crowd( "east_elevator_crowd",
3,
GetEntArray( "east_elevator_crowd_spawners", "script_noteworthy" ),
GetEntArray( "east_elevator_crowd_start", "script_noteworthy"),
GetEntArray( "east_elevator_crowd_end", "script_noteworthy") );
wait 4.0;
maps\nx_crowd_controller::spawn_crowd( "east_elevator_crowd" );
}
hallway_shake()
{
self endon( "intro_done" );
flag_wait( "hallway_shake" );
while( 1 )
{
level._player PlayRumbleOnEntity( "artillery_rumble" );
Exploder( "fx_ceiling_dust" );
pulselights( "opening_emergency_lights" );
wait RandomFloatRange( 0.8, 3.0 );
}
}
staircase_rumble()
{
flag_wait( "stairway_shake" );
level._player thread missile_hit_rumble();
pulselights( "staircase_pulse_lights" );
}
pulselights( a_lights )
{
lights = getentarray( a_lights, "targetname" );
for ( i = 0; i < lights.size; i++ )
{
lights[ i ] thread flicker(); //custom function
//lights[ i ] thread maps\_lights::flickerLightIntensity( 0.2, 0.6 ); //default flicker function
}
}
flicker()
{
fullIntensity = self getLightIntensity();
randomIntensity = [ 0.05, 0.1, 0.2, 0.25, 0.3, 0.35, 0.65, 0.8 ];
randomWait = [ 0.01, 0.015, 0.02, 0.03, 0.05, 0.075, 0.1, 0.125, 0.13, 0.14, 0.145, 0.15 ];
// duration = gettime() + 2000.0;
for ( i = 0; i < 20; i++ ) //tagTJ: should replace the time with a variable controlled by the rumble script
{
self setLightIntensity( random( randomIntensity ) );
wait random( randomWait );
self setLightIntensity( fullIntensity );
wait random( randomWait );
}
}