nx1-gsc-dump/maps/nx_hithard_b_on_ramp.gsc

1225 lines
33 KiB
Plaintext
Raw Blame History

//****************************************************************************
// **
// Confidential - (C) Activision Publishing, Inc. 2010 **
// **
//****************************************************************************
// **
// Module: nx_hithard_b_on_ramp.gsc **
// NOTE: called from nx_hithard_b.gsc **
// **
// Created: 3/17/2011 - Pedram Javidpour **
// **
//****************************************************************************
#include maps\_utility;
#include common_scripts\utility;
#include maps\_anim;
#include maps\_vehicle;
#include maps\nx_hithard_b_util;
AI_BAKER = 0;
AI_DUKE = 1;
AI_VP = 2;
AI_SS1 = 3;
AI_SS2 = 4;
OBJ_PROTECT_PATRIOT = 24;
OBJ_ADVANCE = 25;
OBJ_PROVIDE_OVERWATCH = 26;
OBJ_MOVE_PATRIOT = 27;
OBJ_MEET_BRAVO = 28;
onramp_setup()
{
triggers_enable( "trigger_encounter_01", false );
triggers_enable( "trigger_encounter_02", false );
triggers_enable( "trigger_encounter_03", false );
triggers_enable( "trigger_moment_bravo", false );
player_zone_enable( "player_zone_street", false );
player_zone_enable( "player_zone_onramp", false );
// triggers_enable( "onramp_enc_02_begin", false );
maps\nx_hithard_b_util::vtol_setup( "vtol_onramp_enc_secure_troops", "vtol_onramp_enc_secure_troops", "onramp_vtol_enter_01", "onramp_vtol_exit_01" );
maps\nx_hithard_b_util::vtol_setup( "vtol_onramp_enc_final_01", "vtol_onramp_enc_final", "onramp_vtol_enter_02", "onramp_vtol_exit_02" );
maps\nx_hithard_b_util::vtol_setup( "vtol_onramp_enc_final_02", "vtol_onramp_enc_final", "onramp_vtol_enter_03", "onramp_vtol_exit_03" );
// maps\nx_hithard_b_util::vtol_setup( "vtol_onramp_enc_final_02", "vtol_onramp_enc_final", "onramp_vtol_enter_04", "onramp_vtol_exit_04" );
if( !IsDefined( level.onramp_enemies ) )
level.onramp_enemies = [];
enemy_group_init( "onramp_enc_final_freeway" );
enemy_group_init( "onramp_enc_final_street" );
enemy_group_init( "onramp_enc_final_bus" );
enemy_group_init( "onramp_enc_final_vtol" );
enemy_group_init( "onramp_enc_final_rpg" );
enemy_group_init( "onramp_enc_final_ugv" );
level thread maps\nx_hithard_b_anim::tank_lapes_setup( );
level.onramp_vp_rescued = false;
}
onramp_section_started()
{
trigger_off( "trigger_encounter_00", "script_noteworthy" );
}
onramp_main()
{
onramp_setup();
level thread onramp_enter_trigger();
onramp_encounter_street();
onramp_encounter_secure();
onramp_encounter_overwatch();
}
onramp_enter_trigger()
{
trigger_wait( "trigger_encounter_00", "script_noteworthy" );
onramp_section_started();
iPrintLnBold( "Head to the onramp" );
level.squad[ AI_BAKER ] SetGoalNode( GetNode( "node_onramp_ally_01", "script_noteworthy" ) );
level.squad[ AI_DUKE ] SetGoalNode( GetNode( "node_onramp_ally_02", "script_noteworthy" ) );
level.squad[ AI_VP ] SetGoalNode( GetNode( "node_onramp_ally_vp_price", "script_noteworthy" ) );
level.squad[ AI_SS1 ] SetGoalNode( GetNode( "node_onramp_ally_ss_walker", "script_noteworthy" ) );
level.squad[ AI_SS2 ] SetGoalNode( GetNode( "node_onramp_ally_ss_hayes", "script_noteworthy" ) );
}
onramp_encounter_street()
{
Objective_Add( OBJ_PROTECT_PATRIOT, "current", "Escort Patriot to the highway." );
Objective_OnEntity( OBJ_PROTECT_PATRIOT, level.squad[ AI_VP ], ( 0, 0, 70 ) );
Objective_SetPointerTextOverride( OBJ_PROTECT_PATRIOT, "Protect" );
// Enable triggers for this encounter
triggers_enable( "trigger_encounter_01", true );
player_zone_enable( "player_zone_street", true );
// Start dialogue for this encounter
level thread onramp_encounter_street_dialogue();
// Wait for first wave to spawn
trigger_wait( "onramp_enc_01_wave_01", "targetname" );
issue_color_orders( "c0", "axis" );
level.squad[ AI_SS1 ] thread ss1_kill();
vp_protect_node = GetNode( "onramp_enc_01_vp_protect", "targetname" );
vp_protect_node thread vp_protect_at_node( level.squad[ AI_VP ], level.squad[ AI_SS2 ] );
waittill_aigroupcount( "onramp_enc_01_wave_01", 3 );
enemy_wave_spawn( "onramp_enc_01_wave_02" );
issue_color_orders( "c1", "axis" );
issue_color_orders( "y0", "axis" );
waittill_aigroupcleared( "onramp_enc_01_wave_01" );
waittill_aigroupcleared( "onramp_enc_01_wave_02" );
autosave_now();
triggers_enable( "trigger_encounter_01", false );
vp_protect_node vp_protect_end( );
wait 0.1;
level.squad[ AI_VP ] set_force_color("p");
level.squad[ AI_SS2 ] set_force_color("r");
level.squad[ AI_BAKER ] SetGoalNode( GetNode( "onramp_advance_ally01", "targetname" ) );
level.squad[ AI_DUKE ] SetGoalNode( GetNode( "onramp_advance_ally02", "targetname" ) );
player_zone_enable( "player_zone_street", false );
}
onramp_encounter_secure()
{
Objective_Add( OBJ_ADVANCE, "current", "Advance to the onramp" );
Objective_Position( OBJ_ADVANCE, GetEnt( "onramp_objective_advance", "targetname" ).origin );
// autosave_now();
// Enable triggers for this encounter
triggers_enable( "trigger_encounter_02", true );
// Start dialogue for this encounter
level thread onramp_encounter_secure_dialogue();
// Wait for player to enter encounter space
activate_trigger( "onramp_enc_02_allies_trigger", "targetname" );
vp_protect_node = GetEnt( "onramp_enc_02_vp_protect", "targetname" );
vp_protect_node thread vp_protect_at_node( level.squad[ AI_VP ], level.squad[ AI_SS2 ] );
trigger_wait( "onramp_enc_secure_begin", "targetname" );
// waittill_aigroupcount( "onramp_enc_02_wave_02", 1 );
vtol_01 = maps\nx_hithard_b_util::vtol_spawn( "vtol_onramp_enc_secure_troops" );
vtol_01 thread maps\nx_hithard_b_util::vtol_move( false, 0.2 );
vtol_01.ignoreMe = true;
wait 8.0;
Objective_State( OBJ_ADVANCE , "done" );
autosave_now();
triggers_enable( "trigger_encounter_02", false );
level notify( "overwatch_command" );
}
onramp_encounter_overwatch()
{
Objective_Add( OBJ_PROVIDE_OVERWATCH, "current", "Provide overwatch." );
Objective_Position( OBJ_PROVIDE_OVERWATCH, GetEnt( "onramp_objective_overwatch", "targetname" ).origin );
// Enable triggers for this encounter
triggers_enable( "trigger_encounter_03", true );
// Start dialogue for this encounter
level thread onramp_encounter_overwatch_dialogue();
// Send Duke to his cover
level.squad[ AI_DUKE ] thread duke_provide_overwatch();
// Wait for player to enter encounter space
trigger_wait( "onramp_overwatch_begin", "targetname" );
level notify( "end_overwatch_reminder" );
autosave_now();
}
onramp_moment_vphit()
{
triggers_enable( "trigger_encounter_03", true );
player_zone_enable( "player_zone_onramp", true );
level thread onramp_cover_pieces();
// VP cross and hit
level notify( "overwatch_provided" );
vp_protect_node = GetEnt( "onramp_enc_02_vp_protect", "targetname" );
vp_protect_node vp_protect_end();
level thread vignette_vp_hit();
level waittill( "vp_hit_moment" );
level thread vp_rpg_attack();
wait 2.0;
level thread uav_spawn( "onramp_freeway_uav", "onramp_uav_circle_path" );
level thread smoke_spawn( "onramp_smoke_freeway" );
level thread smoke_spawn( "onramp_smoke_street" );
wait 0.5;
// MAIN WAVE
enemy_wave_spawn( "onramp_enc_final_freeway" );
wait 3.0;
enemy_wave_spawn( "onramp_enc_final_street" );
level thread enemy_group_watch( "onramp_enc_final_freeway", 3, 1, "onramp_battle_end" );
level thread enemy_group_watch( "onramp_enc_final_street", 3, 1, "onramp_battle_end" );
autosave_now();
// VTOL WAVE
wait 20.0;
level notify( "onramp_cover_destruct_01" );
autosave_now();
iPrintlnBold("Incoming VTOL!!!");
vtol_01 = vtol_deploy( "vtol_onramp_enc_final_02" );
vtol_01 waittill( "exiting" );
issue_color_orders( "o200", "axis" );
waittill_enemy_group_count( "onramp_enc_final_vtol", 2 );
// RPGer
wait 15.0;
level notify( "onramp_cover_destruct_02" );
autosave_now();
iPrintlnBold("RPG!");
enemy_wave_spawn( "onramp_enc_final_rpg" );
autosave_now();
// UAV Wave
wait 8.0;
level notify( "onramp_cover_destruct_03" );
autosave_now();
iPrintlnBold("UAVs!!!");
level thread uav_spawn( "onramp_swarm_uav", "onramp_uav_circle_path" );
level thread uav_spawn( "onramp_street_uav", "onramp_uav_circle_path" );
// UGV Enter
level thread ugv_encounter();
// VTOL WAVE
iPrintlnBold("Another VTOL!");
vtol_02 = vtol_deploy( "vtol_onramp_enc_final_01" );
vtol_02 waittill( "exiting" );
issue_color_orders( "o200", "axis" );
waittill_enemy_group_count( "onramp_enc_final_vtol", 2 );
smoke_end( "onramp_smoke_street" );
smoke_end( "onramp_smoke_freeway" );
// UGV IS CLOSING IN. WE NEED TO GET OUT
flag_wait( "onramp_ugv_critical" );
level notify( "onramp_cover_destruct_04" );
autosave_now();
Objective_State( OBJ_PROVIDE_OVERWATCH , "done" );
autosave_now();
level thread vp_drag_interactive();
bravo_vehicle_spawn();
level.onramp_bravo[ 0 ] godOn();
level.onramp_bravo[ 1 ] godOn();
level.onramp_bravo[ 0 ] GoPath();
level.onramp_bravo[ 1 ] GoPath();
level.onramp_bravo[ 0 ] waittill( "reached_end_node" );
level.onramp_bravo[ 1 ] waittill( "reached_end_node" );
level waittill( "bravo_rescue" );
player_zone_enable( "player_zone_onramp", false );
level notify( "onramp_battle_end" );
all_enemies = GetAIArray( "axis" );
bravo_hit_nodes = GetEntArray( "ugv_target", "targetname" );
foreach( enemy in all_enemies )
{
if( !IsDefined( enemy ) )
continue;
MagicBullet( "rpg_straight", enemy.origin, level.onramp_bravo[ 0 ].origin + (0, 0, 100) );
enemy Kill();
PlayFX( level._effect["vehicle_explosion_hummer"], random( bravo_hit_nodes ).origin );
wait 0.2;
}
autosave_now();
}
onramp_moment_bravo()
{
triggers_enable( "trigger_moment_bravo", true );
level thread bravo_meetup( );
}
onramp_moment_bravo_debug()
{
level.squad[ AI_SS1 ] thread ss1_kill();
level.squad[ AI_SS2 ] thread ss1_kill();
level thread maps\nx_hithard_b_anim::vpdrag_end_vp( level.squad[ AI_VP ] );
bravo_vehicle_spawn();
bravo_01_end = GetVehicleNode( "bravo_01_end", "targetname" );
bravo_02_end = GetVehicleNode( "bravo_02_end", "targetname" );
level.onramp_bravo[ 0 ] Vehicle_Teleport( bravo_01_end.origin, bravo_01_end.angles );
level.onramp_bravo[ 1 ] Vehicle_Teleport( bravo_02_end.origin, bravo_02_end.angles );
}
onramp_cover_pieces()
{
self thread onramp_cover_piece_force( "onramp_cover_destruct_00", false );
self thread onramp_cover_piece_force( "onramp_cover_destruct_01" );
self thread onramp_cover_piece_force( "onramp_cover_destruct_02" );
self thread onramp_cover_piece_force( "onramp_cover_destruct_03" );
self thread onramp_cover_piece_force( "onramp_cover_destruct_04" );
}
onramp_cover_piece_force( script_noteworthy, shot, force_entity )
{
level waittill( script_noteworthy );
if( !IsDefined( shot ) )
shot = true;
pieces = GetEntArray( script_noteworthy, "script_noteworthy" );
foreach( piece in pieces )
{
// mag = ( RandomFloatRange( 1000, 2000 ), RandomFloatRange( 1000, 2000 ), RandomFloatRange( 5000, 10000 ) );
mag = RandomFloatRange( 5000, 7000 );
if( shot )
MagicBullet( "xm108_asco", piece.origin, piece.origin );
if( IsDefined( force_entity ) )
force = VectorNormalize( force_entity.origin - piece.origin );
else
force = ( cos( piece.angles[1] ), sin( piece.angles[1] ), 1 );
force *= mag;//( mag[0] * cos( piece.angles[1] ), mag[1] * sin( piece.angles[1] ), mag[2] );
piece PhysicsLaunchClient( piece.origin, force );
if( shot )
wait RandomFloatRange( 0.5, 1.5 );
}
}
// BRAVO STUFF
bravo_vehicle_spawn()
{
if( !IsDefined( level.onramp_bravo ) )
{
level.onramp_bravo[ 0 ] = vehicle_spawn( GetEnt( "bravo_01", "script_noteworthy" ) );
level.onramp_bravo[ 1 ] = vehicle_spawn( GetEnt( "bravo_02", "script_noteworthy" ) );
}
}
bravo_meetup( )
{
// Send Bravo to meet
level.onramp_bravo[ 0 ] StartPath( GetVehicleNode( "bravo_01_end", "targetname" ) );
level.onramp_bravo[ 1 ] StartPath( GetVehicleNode( "bravo_02_end", "targetname" ) );
// Send Duke to meet
level thread maps\nx_hithard_b_anim::bravomeetgreet_duke_reach( level.squad[ AI_DUKE ] );
level.onramp_bravo[ 0 ] waittill( "reached_end_node" );
autosave_now();
bravo_co = GetEnt( "bravo_co", "targetname" ) spawn_ai( true );
unlatcher_01 = GetEnt( "onramp_lapes_unlatcher_01", "targetname" ) spawn_ai( true );
unlatcher_02 = GetEnt( "onramp_lapes_unlatcher_02", "targetname" ) spawn_ai( true );
level thread maps\nx_hithard_b_anim::bravomeetgreet( bravo_co, level.squad[ AI_DUKE ] );
// Wait for player to meet up
end_trigger = GetEnt( "level_end", "targetname" );
Objective_State( OBJ_PROTECT_PATRIOT , "done" );
Objective_Add( OBJ_MEET_BRAVO, "current", "Meet Bravo Company at the top of the on-ramp." );
Objective_Position( OBJ_MEET_BRAVO, GetEnt( "onramp_objective_bravo", "targetname" ).origin );
trigger_wait( "level_end", "targetname" );
Objective_State( OBJ_MEET_BRAVO , "done" );
triggers_enable( "trigger_encounter_03", false );
// level notify( "player_meet_bravo" );
// Drop the tank
wait 10.0;
bravo_tank = vehicle_spawn( GetEnt( "bravo_tank", "targetname" ) );
maps\nx_hithard_b_anim::new_tank_lapes( bravo_tank );
// tank_climb( bravo_tank );
maps\nx_hithard_b_anim::lapes_unlatch( unlatcher_01, unlatcher_02 );
wait 3.0;
nextmission();
}
ignore_all_triggers()
{
self endon( "death" );
self endon( "delete" );
while( 1 )
{
self ignore_triggers();
wait 0.05;
}
}
onramp_enc_02_begin()
{
// flag_wait( "onramp_enc_02_begin" );
// trigger_wait( "onramp_enc_02_begin", "script_noteworthy" );
// Wave 1
wait 4.0;
radio_dialogue( "hithard_bak_mall_09"); // Take <20>em down quick!
}
tank_climb( tank )
{
tank.animname = "bravo_tank";
level._player allowprone( false );
level._player allowcrouch( false );
level._player disableweapons();
level._player takeallweapons();
player_rig = spawn_anim_model( "player_rig" );
guys = [];
guys["bravo_tank"] = tank;
guys["player_rig"] = player_rig;
arc = 15;
level._player PlayerLinkToDelta( player_rig, "tag_player", 1, arc, arc, arc, arc, 1);
player_rig LinkTo( tank, "TAG_PLAYER_TANK_MOUNT" );
tank anim_single( guys, "tank_climb", "TAG_PLAYER_TANK_MOUNT" );
level._player unlink();
player_rig delete();
level._player FreezeControls( false );
level._player allowprone( true );
level._player allowcrouch( true );
}
onramp_encounter_street_dialogue()
{
trigger_wait( "onramp_enc_street_vo", "targetname" );
radio_dialogue( "hithard_gyp_highway_01" ); // Home stretch, fellas.<2E> I can see the highway<61>hundred meters
radio_dialogue( "hithard_sslead_highway_01" ); // We<57>re right behind you.
radio_dialogue( "hithard_gyp_highway_03" ); //Gotch<63>yer back!
trigger_wait( "onramp_enc_01_wave_01", "targetname" );
radio_dialogue( "hithard_bak_para_20" ); //Tangos ahead.
}
onramp_encounter_secure_dialogue()
{
radio_dialogue( "hithard_bak_move_07"); //Clear! Move forward!
// Provide overwatch
level waittill( "overwatch_command" );
//Duke and Specter - get to the onramp and cover us!
//Specter - get to the onramp and cover us!
overwatch_lines = [ "hithard_bak_highway_03", "hithard_bak_highway_04" ];
radio_dialogue( random( overwatch_lines ) );
radio_dialogue( "hithard_gyp_plaza2_02"); // On it
// overwatch_lines[ overwatch_lines.size ] = "hithard_gyp_mall_01";
// level dialogue_set_repeat( overwatch_lines, 3.0, 6.0, "end_overwatch_reminder" );
}
onramp_encounter_overwatch_dialogue()
{
level waittill( "onramp_uav_spawn" );
radio_dialogue( "hithard_bak_secure_37"); //UAVs incoming!
// Send out the VP
level waittill( "overwatch_provided" );
radio_dialogue( "hithard_bak_vphit_06"); //Move Patriot now!
radio_dialogue( "hithard_bak_vphit_07"); //Specter, cover us!
// RPG incoming
//Incoming! (RPG zipping towards VP)
//Get down! (RPG zipping towards VP)
//Look out! (RPG zipping towards VP)
wait 10.0; // Should be wait till RPG fired...
rpg_warning_lines = [ "hithard_bak_vphit_09", "hithard_bak_vphit_10" ];
radio_dialogue( random( rpg_warning_lines ) );
wait 6.0;
radio_dialogue( "hithard_gyp_monorail_01"); // Fuck, there<72>s a lot of <20>em.
// Help the VP
level waittill( "vp_critical_moment" );
radio_dialogue( "hithard_bak_vphit_12"); //Shit! UGVs! Specter, help me get him up!
wait 3.0;
//Specter! We've got to move him now! Get over here!
//Specter! Get over here!
//He's critical! Get over here!
vp_help_lines = [ "hithard_bak_vphit_08", "hithard_bak_vphit_13", "hithard_bak_vphit_14" ];
level dialogue_set_repeat( vp_help_lines, 3.0, 6.0, "vp_drag_moment" );
wait 2.0;
radio_dialogue( "hithard_bak_vphit_15"); //Get him up that ramp! We'll cover you!
wait 4.0;
radio_dialogue( "hithard_bak_vphit_16"); //Get your ass up Specter - keep moving!
radio_dialogue( "hithard_gyp_para_03"); //Bastards are everywhere!
radio_dialogue( "hithard_bak_vphit_01"); //Shit! Where's the cav?
// Bravo destroys the UGVs
level waittill( "bravo_rescue" );
radio_dialogue( "hithard_gyp_highway_02"); //About damn time!
radio_dialogue( "hithard_bravoradioop_highway_01"); //Convoy 2 Bravo Actual, we<77>ve got eyes on.<2E>Providing support.
radio_dialogue( "hithard_bak_bravo_01"); //Nice work Specter.
// radio_dialogue( "hithard_btl_bravo_01"); //You gotta be shittin me. Roger that. We're loading Patriot now. Bravo out.
radio_dialogue( "hithard_bak_bravo_02"); //I'll help them load the VP. Duke. Specter. Check in with Bravo's C.O.
// radio_dialogue( "hithard_btl_bravo_02"); //We're on the move!
// Tank LAPES
trigger_wait( "level_end", "targetname" );
// radio_dialogue( "hithard_gyp_bravo_01"); //we need more than APC's
// radio_dialogue( "hithard_btl_bravo_03"); //No shit. You'll get it.
radio_dialogue( "hithard_sis_bravoco_01"); //This is Grizzly. Taking heavy fire. Countermeasure's overloading. We've got one shot at this...
radio_dialogue( "hithard_sis_bravoco_02"); //This is Grizzly. Releasing package!
radio_dialogue( "hithard_btl_bravo_06"); //Patriot's loaded up and ready to move.
radio_dialogue( "hithard_btl_bravo_09"); //Get that armor ready!
radio_dialogue( "hithard_btl_bravo_07"); //Bravo team, mount up!
}
duke_provide_overwatch()
{
self thread duke_on_player_overwatch_provided();
self enable_cqbwalk();
level endon( "overwatch_provided" );
self SetGoalNode( GetNode( "onramp_enc_final_duke_01", "targetname" ) );
self waittill( "goal" );
wait 4.0;
// level.squad[ AI_DUKE ] SetGoalNode( GetNode( "onramp_enc_final_duke_02", "targetname" ) );
// self waittill( "goal" );
// wait 2.0;
self duke_goto_overwatch();
}
duke_on_player_overwatch_provided()
{
level waittill( "overwatch_provided" );
self duke_goto_overwatch();
}
duke_goto_overwatch()
{
self SetGoalNode( GetNode( "onramp_enc_final_duke", "targetname" ) );
self disable_cqbwalk();
}
smoke_spawn( smoke_noteworthy )
{
smoke_points = GetEntArray( smoke_noteworthy, "script_noteworthy" );
foreach( point in smoke_points )
{
// MagicGrenade( "smoke_grenade_miniuav", point.origin, point.origin + ( 0, 0, 1 ), 0.01 );
point thread smoke_loop();
wait RandomFloatRange( 0.25, 0.75 );
}
}
smoke_end( smoke_noteworthy )
{
smoke_points = GetEntArray( smoke_noteworthy, "script_noteworthy" );
foreach( point in smoke_points )
{
point notify( "smoke_end" );
}
}
smoke_loop()
{
self endon( "smoke_end" );
while( 1 )
{
PlayFx( level._effect[ "nx_grenade_smoke_5sec" ], self.origin );
wait 4.9;
}
}
uav_spawn( uav_noteworthy, circle_noteworthy )
{
level notify( "onramp_uav_spawn" );
spawners = GetEntArray( uav_noteworthy, "script_noteworthy" );
foreach( spawner in spawners )
{
miniuav = spawner maps\_attack_heli::SAV_setup( "pathing" );
miniuav thread uav_circle( circle_noteworthy );
// miniuav thread uav_smoke( );
miniuav.health = 100;
wait 0.05;
}
}
uav_circle( circle_noteworthy )
{
self waittill( "reached_dynamic_path_end" );
circles = GetNodeArray( circle_noteworthy, "script_noteworthy" );
self thread maps\_attack_heli::SAV_switch_to_circling( random(circles).targetname );
}
uav_smoke( )
{
self endon( "death" );
numGrenades = 3;
wait 2.0;
for( i = 0; i < numGrenades; i++ )
{
PlayFx( level._effect[ "nx_grenade_smoke_5sec" ], self.origin );
wait RandomFloatRange( 0.25, 0.75 );
}
}
// ENEMY WAVE FUNCTIONS //
enemy_group_watch( enemy_group, watch_count, spawn_count, watch_end_on )
{
self endon( watch_end_on );
while( 1 )
{
// waittill_aigroupcount( enemy_group, watch_count );
waittill_enemy_group_count( enemy_group, watch_count );
enemy_wave_spawn( enemy_group, spawn_count );
}
}
waittill_enemy_count( count )
{
if( !IsDefined( level.onramp_enemies ) )
return;
while( get_enemies_alive() > count )
{
wait 0.05;
}
}
waittill_enemy_group_count( group, count )
{
if( !IsDefined( level.onramp_enemies[ group ] ) )
return;
while( get_enemies_alive( group ) > count )
{
wait 0.05;
}
}
get_enemies_alive( group_name )
{
total = 0;
if( IsDefined( group_name ) )
{
return get_group_enemies_alive( group_name );
}
else
{
foreach( index, group in level.onramp_enemies )
{
total += get_group_enemies_alive( index );
}
}
return total;
}
get_group_enemies_alive( group_name )
{
total = 0;
foreach( enemy in level.onramp_enemies[ group_name ] )
{
if( IsAlive( enemy ) )
{
total++;
}
}
return total;
}
enemy_group_init( spawner_script_noteworthy )
{
spawners = GetEntArray( spawner_script_noteworthy, "script_noteworthy" );
foreach( spawner in spawners )
{
level.onramp_enemies[ spawner_script_noteworthy ] = [];
spawner add_spawn_function( ::enemy_on_spawn );
}
}
enemy_on_spawn()
{
group = level.onramp_enemies[ self.script_noteworthy ];
group[ group.size ] = self;
level.onramp_enemies[ self.script_noteworthy ] = group;
self thread enemy_on_death( self.script_noteworthy );
switch( self.script_noteworthy )
{
case "onramp_enc_final_rpg":
self.ignoreMe = true;
self thread rpg_attacker_target();
self thread rpg_attacker_falling_death();
break;
case "onramp_enc_final_ugv":
self.ignoreMe = true;
self thread ugv_soldier_logic();
break;
default:
break;
}
}
enemy_on_death( script_noteworthy )
{
self waittill( "death" );
level.onramp_enemies[ script_noteworthy ] = array_remove( level.onramp_enemies[ script_noteworthy ], self );
// iPrintln( script_noteworthy + " enemies: " + get_enemies_alive( script_noteworthy ) );
}
enemy_wave_spawn( enemy_noteworthy, count, delay_min, delay_max, debug )
{
// KVP script_noteworthy must == KVP script_aigroup for each spawner in Radiant
enemies_found = GetEntArray( enemy_noteworthy, "script_noteworthy" );
enemy_spawners = enemies_found;
enemies = [];
foreach( spawner in enemies_found )
{
if( !IsSpawner( spawner ) )
{
enemy_spawners = array_remove( enemy_spawners, spawner );
}
else
{
spawner.count = -1;
}
}
spawners_to_use = [];
if( IsDefined( count ) && count < enemy_spawners.size )
{
// for( i = 0; i < count; i++ )
// {
// enemy_spawners[ i ] spawn_ai( true );
// if( IsDefined( delay_min ) && IsDefined( delay_max ) )
// {
// if( delay_min < delay_max )
// wait RandomFloatRange( delay_min, delay_max );
// else
// wait delay_min;
// }
// else
// {
// wait 0.25;
// }
// }
enemy_spawners = array_randomize( enemy_spawners );
for( i = 0; i < count; i++ )
{
spawners_to_use[ i ] = enemy_spawners[ i ];
}
}
else
{
spawners_to_use = enemy_spawners;
}
enemies = array_spawn( spawners_to_use, true );
if( IsDefined( debug ) && debug )
iPrintLnBold( "Spawned group: " + enemy_noteworthy );
}
// UGV UTILITIES //
ugv_encounter()
{
iPrintLnBold( "UGV!!" );
enemy_wave_spawn( "onramp_enc_final_ugv" );
level.ugv = vehicle_spawn( GetEnt( "onramp_ugv_01", "script_noteworthy" ) );
level.ugv thread ugv_death_watch();
level.ugv thread ugv_critical_watch();
// level.ugv thread ugv_targets_fire();
level.ugv thread ugv_player_fire();
level.ugv thread ugv_explosions();
level.ugv GoPath();
level.ugv waittill( "reached_end_node" );
level notify ( "ugv_stopped" );
}
ugv_soldier_logic()
{
self endon( "death" );
self.ignoreAll = true;
// self enable_cqbwalk();
while( 1 )
{
self waittill( "goal" );
if( IsDefined( self ) )
{
curTarget = GetEnt( self.target, "targetname" );
if( IsAI( self ) && IsDefined( curTarget.target ) && IsDefined( GetEnt( curTarget.target, "targetname" ) ) )
self.target = curTarget.target;
else
break;
}
}
self.ignoreAll = false;
// self disable_cqbwalk();
issue_color_orders( "o200", "axis" );
}
ugv_destroy_object( script_noteworthy, magnitude )
{
objects = GetEntArray( script_noteworthy, "script_noteworthy" );
foreach( object in objects )
{
// if( IsDefined( object.target ) )
// {
// impulse = GetEnt( object.target, "targetname" );
// origin = impulse.origin;
// force = ( cos( impulse.angles[ 1 ] ), sin( impulse.angles[ 1 ] ), 1 );
// }
// else
// {
// origin = object.origin;
// force = ( cos( object.angles[1] ), sin( object.angles[1] ), 1 );
// }
origin = object.origin;
force = ( 0, 0, 1 );
force *= magnitude;
object PhysicsLaunchClient( origin, force );
}
}
ugv_critical_watch()
{
self vehicle_waittill_node( "ugv_onramp_critical", "script_noteworthy" );
flag_set( "onramp_ugv_critical" );
}
ugv_death_watch()
{
level waittill( "bravo_rescue" );
self ugv_kill();
wait 5.0;
}
ugv_kill()
{
explosion_dist = 50;
theta = self.angles[1] + 90;
explosion_center = self.origin + ( cos( theta ) * explosion_dist, sin( theta ) * explosion_dist, 0 );
// PhysicsExplosionSphere( explosion_center, 100, 80, 100 );
PlayFX( level._effect["vehicle_explosion_hummer"], explosion_center );
self Kill();
}
ugv_player_fire()
{
self.mgturret[0] SetMode( "manual" );
self.mgturret[1] SetMode( "manual" );
self.mgturret[2] SetMode( "manual" );
flag_wait( "onramp_ugv_critical" );
self thread ugv_targets_fire();
wait 15.0;
if( !level.onramp_vp_rescued )
{
MagicBullet( "rpgx_straight", self.mgturret[ 0 ].origin, level._player.origin + (0, 0, 52 ) );
wait 0.1;
level._player Kill();
}
}
ugv_targets_fire()
{
self endon( "death" );
turret = self.mgturret[ 0 ];
turret StartBarrelSpin();
while( 1 )
{
valid_targets = [];
targets = GetEntArray( "ugv_target", "targetname" );
targets = get_within_range( self.origin, targets, 2000 );
foreach( target in targets )
{
if( within_fov( self.origin, self.angles, target.origin, cos( 90 ) ) )
{
valid_targets[ valid_targets.size ] = target;
}
}
if( valid_targets.size > 0 )
{
new_target = random( valid_targets );
self.mgturret[ 0 ] SetTurretTargetPosition( new_target.origin );
self.mgturret[ 1 ] SetTurretTargetPosition( new_target.origin );
self.mgturret[ 0 ] ShootTurret();
self.mgturret[ 1 ] ShootTurret();
}
wait RandomFloatRange( 0.5, 1.0 );
}
}
ugv_explosions()
{
onramp_ugv_explosion( "ugv_explosion_01" );
onramp_ugv_explosion( "ugv_explosion_02" );
onramp_ugv_explosion( "ugv_explosion_03" );
onramp_ugv_explosion( "ugv_explosion_04" );
onramp_ugv_explosion( "ugv_explosion_05" );
}
onramp_ugv_explosion( explosion_name )
{
trigger_wait( explosion_name + "_trigger", "targetname" );
explosion_nodes = GetEntArray( explosion_name, "targetname" );
foreach( node in explosion_nodes )
{
force = RandomFloatRange( 7.5, 9.0 );
PhysicsJolt( node.origin, node.radius, node.radius, ( RandomFloatRange( force*-1.0, force ), 0, 7.5 ) );
PlayFX( level._effect["vehicle_explosion_hummer"], node.origin );
// PhysicsExplosionSphere( node.origin, node.radius, node.radius, 3 );
// RadiusDamage( node.origin, 500, 10000, 10000 );
}
}
player_zone_enable( zone_script_noteworthy, enable )
{
if( enable )
{
level thread player_zone_watch( zone_script_noteworthy );
}
else
{
level notify( "player_zone_watch_end" );
}
}
player_zone_watch( zone_script_noteworthy )
{
self endon( "player_zone_watch_end" );
interval = 0.5;
wait_time = 0.0;
max_wait = 3.5;
zones = GetEntArray( zone_script_noteworthy, "script_noteworthy" );
while( 1 )
{
foreach( zone in zones )
{
if( !( level._player IsTouching( zone ) ) )
{
if( wait_time >= max_wait )
{
SetDvar( "ui_deadquote", "@NX_HITHARD_B_FAILED_ABANDON" );
level notify( "mission_failed" );
maps\_utility::missionFailedWrapper();
}
else if( wait_time >= 0.25 * max_wait )
{
// iPrintlnBold( "Turn around! You can not abandon Patriot!" );
}
}
else
{
wait_time = 0.0;
}
}
wait_time += interval;
wait interval;
}
}
ss1_kill()
{
wait 7.0;
self stop_magic_bullet_shield();
for( i = 0; i < 4; i++ )
{
wait RandomFloatRange( 0.1, 0.2 );
theta = self.angles[ 1 ];
org_bullet_source = self.origin + ( cos( theta ) * 512, sin( theta ) * 512, 10 );
org_bullet_dest = self.origin + ( RandomFloatRange( 4, 8 ), RandomFloatRange( 4, 8 ), 40 );
MagicBullet( "xm108_asco", org_bullet_source, org_bullet_dest );
}
self Kill();
}
vp_rpg_attack()
{
wait 2.0;
rpg_spawner = GetEnt( "onramp_rpg_spawner", "targetname" );
rpg_attacker = rpg_spawner spawn_ai( );
rpg_fire = GetEnt( "onramp_vp_rpg_fire", "targetname" );
rpg_target = GetEnt( rpg_fire.target, "targetname" );
//explosion slomo
magicbullet( "rpg_straight_no_impact", rpg_fire.origin, rpg_target.origin );
wait 0.5;
exploder( "vphit_explosion" );
thread maps\nx_hithard_b_fx::vphit_slomo();
Earthquake( .4, 1.2, level._player.origin, 5000 );
level._player thread maps\_gameskill::grenade_dirt_on_screen( "left" );
wait 0.1;
level._player thread maps\_gameskill::grenade_dirt_on_screen( "right" );
// Player damage
level._player DoDamage( 10, rpg_attacker.origin, rpg_attacker );
level notify( "onramp_cover_destruct_00" );
}
#using_animtree( "generic_human" );
rpg_attacker_falling_death()
{
self waittill( "goal" );
death_anims = [ %death_rooftop_B, %death_rooftop_C, %death_rooftop_D ];
self.deathanim = random( death_anims );
}
rpg_attacker_target()
{
self endon( "death" );
// self.favoriteenemy = level._player;
while( 1 )
{
self.a.rockets = 3;
self SetEntityTarget( random( GetEntArray( "ugv_target", "targetname" ) ) );
// self waittill( "firing" );
self ClearEntityTarget( );
wait 1.0;
}
}
vignette_vp_drag()
{
// VP Drag Scene
Objective_State( OBJ_MOVE_PATRIOT , "done" );
level thread maps\nx_hithard_b_anim::vpdrag( level.squad[ AI_BAKER ], level.squad[ AI_VP ] );
wait 15.0;
level notify( "bravo_rescue" );
}
vignette_vp_hit()
{
// VP Hit Scene
maps\nx_hithard_b_anim::vphit_ssrunup(
level.squad[ AI_SS2 ],
level.squad[ AI_VP ],
level.squad[ AI_BAKER ] );
maps\nx_hithard_b_anim::vphit_start(
level.squad[ AI_BAKER ],
level.squad[ AI_VP ],
level.squad[ AI_SS2 ]
);
node = level thread maps\nx_hithard_b_anim::vphit_hurt_loop(
level.squad[ AI_BAKER ],
level.squad[ AI_VP ]
);
autosave_now();
level waittill( "vp_critical_moment" );
node notify( "vp_critical_moment" );
}
vp_drag_interactive()
{
Objective_Add( OBJ_MOVE_PATRIOT, "current", "Move injured Patriot to the freeway." );
Objective_Position( OBJ_MOVE_PATRIOT, level.squad[ AI_VP ].origin + ( 0, 0, 48 ) );
use_trigger = GetEnt( "vp_drag_trigger", "targetname" );
use_trigger trigger_off();
// Begin Assist Loop
level notify( "vp_critical_moment" );
node = level thread maps\nx_hithard_b_anim::vphit_assist_loop(
level.squad[ AI_BAKER ],
level.squad[ AI_VP ]
);
// Enable Use Trigger
use_trigger trigger_on();
use_trigger SetHintString( &"NX_HITHARD_B_HINT_MOVE_PATRIOT" );
use_trigger waittill( "trigger" );
use_trigger trigger_off();
level.onramp_vp_rescued = true;
level notify( "vp_drag_moment" );
node notify( "vp_drag_moment" );
// level.squad[ AI_BAKER ] stop_anim();
// level.squad[ AI_VP ] stop_anim();
level thread vignette_vp_drag();
}
//*******************************************************************
// Utilities *
// *
//*******************************************************************
vp_protect_at_node( actor_vp, actor_ss )
{
self.vp_protect = true;
//actor_vp.animname = "vp";
//actor_ss.animname = "ss";
guys = [ actor_vp, actor_ss ];
self anim_reach( guys, "vp_arrival_in" );
self anim_single( guys, "vp_arrival_in" );
self vp_protect_idle( guys );
self anim_single( guys, "vp_arrival_out" );
}
vp_protect_idle( guys )
{
self endon( "vp_protect_end" );
while( 1 )
{
self anim_single( guys, "vp_arrival_idle" );
}
}
vp_protect_end()
{
if( !IsDefined( self.vp_protect ) || !self.vp_protect )
return;
self.vp_protect = false;
self notify ( "vp_protect_end" );
self waittill( "vp_arrival_out" );
}
vtol_deploy( vtol_name )
{
vtol = maps\nx_hithard_b_util::vtol_spawn( vtol_name );
vtol.ignoreMe = true;
vtol thread ignore_all_triggers();
vtol thread maps\nx_hithard_b_util::vtol_move( );
return vtol;
}
triggers_enable( trigger_noteworthy, enable )
{
if( !IsDefined( enable ) )
enable = true;
triggers = GetEntArray( trigger_noteworthy, "script_noteworthy" );
foreach( trigger in triggers )
{
if( enable )
trigger trigger_on();
else
trigger trigger_off();
}
}
flag_inits()
{
flag_init( "onramp_enc_01_wave_01" );
flag_init( "onramp_enc_02_begin" );
flag_init( "onramp_ugv_critical" );
flag_init( "player_meet_bravo" );
}