nx1-gsc-dump/maps/nx_rocket_section_intro.gsc

940 lines
32 KiB
Plaintext
Raw Blame History

//****************************************************************************
// **
// Confidential - (C) Activision Publishing, Inc. 2010 **
// **
//****************************************************************************
// **
// Module: NX_ROCKET_SECTION_INTRO **
// **
// Created: 7/13/2011 - Justin Rote **
// **
//****************************************************************************
#include maps\_utility;
#include common_scripts\utility;
#include maps\_anim;
#include maps\_vehicle;
//*******************************************************************
// *
// INTRO - From the start of the mission to the first rocket *
// *
//*******************************************************************
start()
{
// Nothing yet
//start_railgun_ride( "heli_start_ride_intro_combat" );
//flag_set( "started_intro_from_start" );
// Black fade in with time param
thread maps\_introscreen::introscreen_generic_black_fade_in( 5.0 );
thread maps\nx_rocket_fx::intro_vision_sequencing();
}
main()
{
thread level_fadein_sfx();
// Make vignettes use the same FOV as the helicopter turret.
SetSavedDvar( "cg_fov", 55.0 );
// AI in this section shoot blanks
anim.shootEnemyWrapper_func = maps\nx_rocket_util::ShootEnemyWrapper_blanks;
// Wait for intro to finish
level waittill( "introscreen_complete" );
if( !flag( "started_intro_from_start" ))
{
start_railgun_ride( "heli_player", "cinematic" );
}
flag_set("intro_delete_ocean_b");
flag_set("intro_delete_ocean_c");
// Start the dialogue thread
thread intro_dialogue();
//AUDIO: Bombers flyover
thread play_sfx_intro();
// Connects to a new chopper path when entering base alpha
thread chopper_transition_to_base_alpha();
// Cleans up all the intro stuff later
thread cleanup_intro_ents();
// Main player chopper control script for this section
level.playerHeli thread chopper_path_intro();
// Start some low power rumble to simulate chopper bumps
thread maps\nx_rocket_util::slightly_vibrate_camera();
//thread maps\nx_rocket_fx::trigger_fog_intro();
// Prevent the player from being dmaged from behind
level._player thread maps\nx_rocket_util::player_prevent_damage_from_behind_until_flag( "base_delta_destroyed" );
flag_wait( "chopper_ride_intro_done" );
}
//*******************************************************************
// *
// *
//*******************************************************************
section_precache()
{
PreCacheModel( "vehicle_btr80_machine_gun" );
// new blackhawk stuff
PreCacheModel( "viewhands_player_us_army" );
PreCacheModel( "vehicle_hummer_seat_rb_obj" );
// targets on BTR, VTOLS, & little birds
PreCacheShader( "javelin_hud_target_red" );
precacheItem( "rpg_player" );
}
section_flag_inits()
{
flag_init( "chopper_transition_one" );
flag_init( "started_intro_from_start" );
// tagMJS<NOTE> new blackhawk stuff
flag_init( "player_gets_in" );
flag_init( "started_intro_anim" );
flag_init( "intro_anim_done" );
}
//*******************************************************************
// *
// *
//*******************************************************************
// Main script to get the vehicle and railgun set up
// JR TODO - This should be broken further. Seperate heli and railgun stuff
start_railgun_ride( sStartNode, sViewFraction )
{
// Make vignettes use the same FOV as the helicopter turret.
SetSavedDvar( "cg_fov", 55.0 );
// Cant use railgun untill later
maps\nx_rocket_railgun::disable_railgun();
level thread maps\nx_rocket_railgun::RailgunUsage( level._player );
// Setup the vehicle
level.playerHeli = maps\_vehicle::spawn_vehicle_from_targetname( sStartNode );
thread maps\_vehicle::gopath( level.playerHeli );
level.playerHeli maps\_nx_blackhawk_minigun::player_mount_blackhawk_turret();
level.playerHeli Vehicle_SetSpeed( 15 );
level.playerHeli setmaxpitchroll( 5, 10 );
level.playerHeli EnableLinkTo();
switch ( sViewFraction )
{
case "cinematic":
maps\nx_rocket_util::set_link_view_fraction_cinematic();
break;
case "gameplay":
maps\nx_rocket_util::set_link_view_fraction_gameplay();
break;
default:
assert( false );
break;
}
// Vehicle cannot die, but player can
level.playerHeli maps\_vehicle::godon();
// Debug - This prints out the chopper speed
//level.playerHeli thread maps\nx_rocket_util::chopper_debug_speed();
// Player damage shield
//level._player thread maps\nx_rocket_util::heli_god_mode( "stop_god_mode" );
//level._player enableinvulnerability();
}
// Watches for flags on the chopper path
chopper_path_intro()
{
thread do_intro_anim();
flag_wait( "started_intro_anim" );
/#
// Add names to choppers
//level.intro_ally_1 thread maps\nx_rocket_util::draw_chopper_name( "chopper_1" );
//level.intro_ally_2 thread maps\nx_rocket_util::draw_chopper_name( "chopper_2" );
//level.intro_ally_3 thread maps\nx_rocket_util::draw_chopper_name( "chopper_3" );
//level.intro_ally_4 thread maps\nx_rocket_util::draw_chopper_name( "chopper_4" );
//level.intro_ally_5 thread maps\nx_rocket_util::draw_chopper_name( "chopper_5" );
#/
// Dan: Track the velocity of the helicopter during the animation. Velocity placed in self.anim_speed.
level.intro_ally_1 thread maps\nx_rocket_util::track_anim_speed();
level.intro_ally_2 thread maps\nx_rocket_util::track_anim_speed();
level.intro_ally_3 thread maps\nx_rocket_util::track_anim_speed();
level.intro_ally_4 thread maps\nx_rocket_util::track_anim_speed();
//level.intro_ally_5 thread maps\nx_rocket_util::track_anim_speed();
// FLAG: Wait for cliffside encounter
flag_wait( "chopper_ride_approaching_cliffside" );
thread cliffside_encounter();
flag_wait( "intro_anim_done" );
thread maps\_utility::set_ambient( "nx_rocket_heli_intro" );
// Dan: Use the tracked velocity to set the helicopters to the velocity they shoudl have coming out of the animation.
IPS_TO_MPH = 0.0568181818;
level.intro_ally_1 Vehicle_SetSpeedImmediate( level.intro_ally_1.anim_speed * IPS_TO_MPH );
level.intro_ally_2 Vehicle_SetSpeedImmediate( level.intro_ally_2.anim_speed * IPS_TO_MPH );
level.intro_ally_3 Vehicle_SetSpeedImmediate( level.intro_ally_3.anim_speed * IPS_TO_MPH );
level.intro_ally_4 Vehicle_SetSpeedImmediate( level.intro_ally_4.anim_speed * IPS_TO_MPH );
//level.intro_ally_5 Vehicle_SetSpeedImmediate( level.intro_ally_5.anim_speed * IPS_TO_MPH );
level.intro_ally_1 notify( "end_track_anim_speed" );
level.intro_ally_2 notify( "end_track_anim_speed" );
level.intro_ally_3 notify( "end_track_anim_speed" );
level.intro_ally_4 notify( "end_track_anim_speed" );
//level.intro_ally_5 notify( "end_track_anim_speed" );
ally_1_offset = level.intro_ally_1 determine_heli_offset( level.playerHeli );
ally_2_offset = level.intro_ally_2 determine_heli_offset( level.playerHeli );
ally_3_offset = level.intro_ally_3 determine_heli_offset( level.playerHeli );
ally_4_offset = level.intro_ally_4 determine_heli_offset( level.playerHeli );
// Make allied choppers follow the pathed player
level.intro_ally_1 thread maps\ny_hind::follow_enemy_vehicle( level.playerHeli, ally_1_offset, 0, 2.5 );
level.intro_ally_2 thread maps\ny_hind::follow_enemy_vehicle( level.playerHeli, ally_2_offset, 0, 2.5 );
level.intro_ally_3 thread maps\ny_hind::follow_enemy_vehicle( level.playerHeli, ally_3_offset, 0, 2.5 );
level.intro_ally_4 thread maps\ny_hind::follow_enemy_vehicle( level.playerHeli, ally_4_offset, 0, 2.5 );
//level.intro_ally_5 thread maps\ny_hind::follow_enemy_vehicle( level.playerHeli, ( 2500, 100, 300 ), 0, 2.5 );
//retriggering amb just in case
thread maps\_utility::set_ambient( "nx_rocket_heli_intro" );
// FLAG: A chopper blows up during cliffside encounter
flag_wait( "chopper_ride_cliffside_chopper_crash" );
level.intro_ally_4 thread rpg_guy_fires_at_chopper();
// Move chopper 3 behind the player
level.intro_ally_3 maps\ny_hind::adjust_follow_offset_angoff( ( -1900, 0, 0 ), 0, 2.5 );
//retriggering amb just in case
thread maps\_utility::set_ambient( "nx_rocket_heli_intro" );
// FLAG: An allied chopper will drop down and shoot rockets at enemies
flag_wait( "chopper_ride_cliffside_chopper_shoot" );
level.intro_ally_2 thread maps\ny_hind::follow_enemy_vehicle( level.playerHeli, ( 1500, -100, 145 ), 0, 3.5 );
level.intro_ally_1 maps\ny_hind::adjust_follow_offset_angoff( ( 1200, -600, 150 ), 0, 1.5 );
level.intro_ally_1 thread chopper_fires_at_ground();
// Get chopper 3 out of view so it can despawn
flag_wait( "chopper_ride_cliffside_final_turn" );
wait 2.0;
level.intro_ally_3 maps\ny_hind::adjust_follow_offset_angoff( ( -2100, 300, 0 ), 0, 2.5 );
wait 2.5;
level.intro_ally_3 maps\ny_hind::adjust_follow_offset_angoff( ( -2500, 1100, 0 ), 0, 2.5 );
//retriggering amb just in case
thread maps\_utility::set_ambient( "nx_rocket_heli_intro" );
// Leaving this section
flag_wait( "chopper_transition_one" );
}
determine_heli_offset( target )
{
//reverse the logic from maps\ny_hind::follow_enemy_vehicle so that they don't have a starting error after the vignette.
// s = p + m1v1 + m2v2 + m3v3, where v1, v2, v3 are orthonormal, and m1, m2, m3 are components of offset vector m.
// m = ( (s-p).v1, (s-p).v2, (s-p).v3 )
v1 = VectorNormalize( target Vehicle_GetVelocity() ); //forward velocity direction of target
v2 = VectorNormalize( VectorCross((0, 0, 1), v1) ); // right vector of velocity direction
v3 = VectorNormalize( VectorCross( v1, v2 ) );
pos_diff = self.origin - target.origin;
m = ( VectorDot( pos_diff, v1 ), VectorDot( pos_diff, v2 ), VectorDot( pos_diff, v3 ) );
return m;
}
do_intro_anim()
{
wait 5.0;
flag_set( "started_intro_anim" );
level._player playsound("scn_rocket_mount_turret");
level thread maps\nx_rocket_anim::intro_allies_in_chopper_spawn();
level maps\nx_rocket_anim::intro_choppers_spawn();
flag_set( "intro_anim_done" );
transition_node = getstruct( "cliffside_resume_node", "targetname" );
level.playerHeli ClearAnimScripted();
level.playerHeli.currentnode = transition_node;
level.playerHeli thread vehicle_resumepath();
level.playerHeli GoPath();
level.playerHeli vehicle_SetSpeedImmediate(85,20,20);
}
// Guy on cliffside fires rpg at chopper, and shoots it down
rpg_guy_fires_at_chopper()
{
self endon( "death" );
attractor = missile_createAttractorEnt( self, 100000, 2000 );
// RPG origin
rpg_node = getent( "cliffside_rpg_attack_node", "targetname" );
forward = anglesToForward( self.angles );
up = anglesToUp( self.angles );
// Shoot the rpg
target = self.origin + ( 5500 * forward ) + ( 800 * up );
magicBullet( "rpg_player", rpg_node.origin, target );
//Line( rpg_node.origin, target, ( 0.3, 1.0, 0.3 ), 1, 1, 5000 );
self thread kill_after_time(3.2);
while( 1 )
{
self waittill( "damage", damage, attacker, direction_vec, point, damageType, modelName, tagName );
if( damagetype == "MOD_EXPLOSIVE" )
{
break;
}
else
{
}
}
self kill();
self notify( "newpath" );
self waittill( "death" );
missile_deleteAttractor( attractor );
}
// Kill the chopper after a bit
kill_after_time( time )
{
self endon( "death" );
wait time;
//iprintln( "timer kill" );
self kill();
}
// Allied chopper fires two missiles at ground enemies
chopper_fires_at_ground()
{
wait 2.0;
// Get the target
//target = getent( "cliffside_chopper_attack_node", "targetname" );
target = level.cliffside_target_btr;
// Make a missile magnet
attractor = missile_createattractorent( target, 100000, 60000 );
// Fire the missile
magicbullet( "sidewinder_straight", self.origin + (0,0,-120), target.origin + (0,0,24) );
wait 0.25;
magicbullet( "sidewinder_straight", self.origin + (0,0,-120), target.origin + (0,0,18));
level.cliffside_target_btr godoff();
wait 5;
missile_deleteAttractor( attractor );
}
// Plays some AA fire effects, then stops it
play_aa_fx_for_time( fx, min_time, max_time )
{
fxmodel = spawn_tag_origin();
fxmodel.origin = self.origin;
fxmodel.angles = self.angles;
PlayFxOnTag( getfx( fx ), fxmodel, "tag_origin" );
wait randomintrange( min_time, max_time );
StopFXOnTag( getfx( fx ), fxmodel, "tag_origin" );
}
// Randomly blows up the friendly bombers
randomly_kill_bombers()
{
if( randomintrange( 1, 10 ) == 1 )
{
return;
}
wait randomfloatrange( 4.5, 8.5 );
PlayFXOnTag( level._effect[ "nx_explosion_rocket_intro_bombers" ], self, "tag_origin");
wait 1;
self kill();
}
// Makes a chopper switch to a new path
switch_to_new_path( path_node )
{
self notify( "newpath" );
node = getstruct( path_node, "targetname" );
self.currentnode = node;
self thread vehicle_resumepath();
self GoPath();
}
// Handles enemy spawning and control for the cliffside encounter
cliffside_encounter()
{
flag_set("intro_delete_ocean_a");
// Make most of the allies invulnerable
level.intro_ally_1 godon();
level.intro_ally_2 godon();
level.intro_ally_3 godon();
//level.intro_ally_4 godon(); // Destined to die
// All allied actors here have very high vision dist
allies = GetAIArray( "allies" );
foreach ( ally in allies )
{
maxsightdistsqrd = 17000;
}
// Add a spawnfunc to the APC that will turn on their turrets
ally_copters[ 0 ] = level.intro_ally_1;
ally_copters[ 1 ] = level.intro_ally_2;
ally_copters[ 2 ] = level.intro_ally_3;
ally_copters[ 3 ] = level.intro_ally_4;
array_spawn_function_noteworthy( "intro_apc", maps\nx_rocket_util::apc_turret_logic, level.playerHeli, ally_copters );
// Spawn them a few at a time to avoid a huge lag spike
/*
vehicles = spawn_vehicles_from_targetname_and_drive( "cliffside_vehicles_group1" );
maps\nx_rocket_util::protect_player_helicopter_rear_from_each_vehicle( vehicles );
level thread maps\nx_rocket_util::handle_caravan_stopping( vehicles, "chopper_ride_intro_done" );
*/
vehicles = maps\nx_rocket_util::caravan_setup( "cliffside_vehicles_group1_", "chopper_ride_intro_done" );
level.blackhawk_targets = vehicles;
// Start the thread to let allied copter gunners choose targets
thread allies_choose_targets( ally_copters );
wait 0.1;
/*
vehicles = spawn_vehicles_from_targetname_and_drive( "cliffside_vehicles_group2" );
maps\nx_rocket_util::protect_player_helicopter_rear_from_each_vehicle( vehicles );
level thread maps\nx_rocket_util::handle_caravan_stopping( vehicles, "chopper_ride_intro_done" );
*/
vehicles = maps\nx_rocket_util::caravan_setup( "cliffside_vehicles_group2_", "chopper_ride_intro_done" );
level.blackhawk_targets = array_combine( level.blackhawk_targets, vehicles );
wait 0.1;
/*
vehicles = spawn_vehicles_from_targetname_and_drive( "cliffside_vehicles_group3" );
maps\nx_rocket_util::protect_player_helicopter_rear_from_each_vehicle( vehicles );
level thread maps\nx_rocket_util::handle_caravan_stopping( vehicles, "chopper_ride_intro_done" );
*/
vehicles = maps\nx_rocket_util::caravan_setup( "cliffside_vehicles_group3_", "chopper_ride_intro_done" );
level.blackhawk_targets = array_combine( level.blackhawk_targets, vehicles );
wait 0.1;
// NOT A CONVOY
vehicle = spawn_vehicle_from_targetname( "cliffside_vehicles_group4" );
level.blackhawk_targets = array_add( level.blackhawk_targets, vehicle );
// NOT A CONVOY
vehicle = spawn_vehicle_from_targetname( "cliffside_btr_missile_target" );
vehicle godon();
level.cliffside_target_btr = vehicle;
maps\nx_rocket_util::protect_player_helicopter_rear_from_each_vehicle( vehicles );
level.blackhawk_targets = array_add( level.blackhawk_targets, vehicle );
/*
vehicles = spawn_vehicles_from_targetname_and_drive( "cliffside_vehicles_group5" );
maps\nx_rocket_util::protect_player_helicopter_rear_from_each_vehicle( vehicles );
level thread maps\nx_rocket_util::handle_caravan_stopping( vehicles, "chopper_ride_intro_done" );
*/
vehicles = maps\nx_rocket_util::caravan_setup( "cliffside_vehicles_group5_", "chopper_ride_intro_done" );
level.intro_cliffside_final_btrs = vehicles;
}
// Chopper transition from intro path to rocket one loop path
chopper_transition_to_base_alpha()
{
// Wait untill it enters base alpha
flag_wait( "chopper_transition_one" );
flag_set("intro_delete_ocean_d");
//AssertEx( IsDefined( level.playerHeli ), "Tried to transition chopper when level.playerHeli does not exist" );
// Get rid of old path
//level.playerHeli thread vehicle_detachfrompath();
// Get the new path
//transition_node = getstruct( "chopper_transition_node_one", "targetname" );
// Use new patch
//level.playerHeli.currentnode = transition_node;
// Continue on new path
//level.playerHeli thread vehicle_resumepath();
//level.playerHeli GoPath();
// Transition friendly choppers onto looped paths in base alpha
level.intro_ally_1 thread maps\nx_rocket_util::transition_chopper_to_new_path( "alpha_chopper_loop_node_1" );
level.intro_ally_2 thread maps\nx_rocket_util::transition_chopper_to_new_path( "alpha_chopper_loop_node_2" );
}
//Play Intro Bombers sfx
play_sfx_intro()
{
wait(19.2);
//Bombers flyover SFX
//Iprintlnbold( "AUDIO: PLAYING BOMBERS" );
level._player PlaySound( "scn_roc_intro_bombers_lr" );
level._player PlaySound( "scn_roc_intro_bombers_lsrs" );
}
// Humvee AI talk about recent events
intro_dialogue()
{
baker = level.squad[ "ALLY_BAKER" ];
jenkins = level.squad[ "ALLY_JENKINS" ];
williams = level.squad[ "ALLY_WILLIAMS" ];
//Dragon to carrier group Lincoln. Clear for kinetic strike on Chosun spaceport. Commence operation Winter Anvil.
level thread play_dialogue( "roc_dra_intro_winteranvil", 0 );
//Keene! Walker! Weapons ready! <turns to pilot> "Guns coming up"
baker thread play_dialogue( "roc_bak_intro_mandoorguns", 6.5 );
//All Strike packages set angels twelve and turn to IP Alpha. Execute strike mission bravo-one-zero. Weapons free, over.
level thread play_dialogue( "roc_dra_intro_angels12ipalpha", 14.4 );
//Roger that. Let's wake 'em up.
level thread play_dialogue( "roc_con_intro_letswakethemup", 23.2 );
//Condor 1, approaching R-Max. 10 seconds.
level thread play_dialogue( "roc_con_intro_approachingrmax", 27.2 );
//Shit! My RF scope just lit up like a fucking Christmas tree!
level thread play_dialogue( "roc_ven_intro_rfscopelitup", 30.4 );
//Strobes at 350. Confirm FC lock.
level thread play_dialogue( "roc_con_intro_strobesat350", 33 );
//Taking heavy AAA fire. Condor 1, break right!
level thread play_dialogue( "roc_ven_intro_condor1breakright", 34.3 );
//Go evasive! Go evasive!!
level thread play_dialogue( "roc_con_intro_goevasive", 36 );
//Incoming, 3 o'clock. Pull up! <scream> <static>
level thread play_dialogue( "roc_con_intro_incomingpullup", 37.1 );
//DIVERT! DIVERT! Stay below the ridgeline!
baker thread play_dialogue( "roc_bak_intro_hugthedeck", 37.4 );
//Condor 1 report status.
level thread play_dialogue( "roc_dra_intro_condor1reportstatus", 41.2 );
//Condor 1 acknowledge!
level thread play_dialogue( "roc_dra_intro_condor1acknowledge", 44.1 );
//Transponder squawks on all flights. They're gone.
level thread play_dialogue( "roc_ven_intro_squawkstheyregone", 45.3 );
//Thunderhawk squadrons, this is fleet command. We cannot allow those rockets to reach orbit. Close to minimum range and designate targets for rail gun batteries on the Lincoln.
level thread play_dialogue( "roc_dra_intro_cannotallowrockets", 50 );
//Solid copy, Dragon. Deadeye proceeding to IP alpha
level thread play_dialogue( "roc_ded1_intro_proceeding2ipalpha", 58.1 );
//Clock in, Zulu. Time to go to work.
baker thread play_dialogue( "roc_bak_intro_clockinzulu", 61.2 );
//We're taking fire!
level thread play_dialogue( "roc_ded2_intro_takingfire", 70.3 );
//We're hit! Losing altitude..
level thread play_dialogue( "roc_ded2_intro_hitlosingaltitude", 72.1 );
//Circling back to check for survivors.
level thread play_dialogue( "roc_ded1_intro_checkforsurvivors", 74.4 );
//Negative, Deadeye. We don't have time for search and rescue. Proceed to target point Alpha immediately.
baker thread play_dialogue( "roc_bak_intro_nosearchandrescue", 76.3 );
//They could still be alive!
level thread play_dialogue( "roc_ded1_intro_theycouldbealive", 79.3 );
//That's an order.
baker thread play_dialogue( "roc_bak_intro_thatsanorder", 80.1 );
/*
wait 2;
// START SECTION 1 ///////////////////
// iprintlnbold( "START SECTION 1 DIALOG" );
// Baker: "The objectives a few mikes from landfall, and were going in hot.<2E>Be ready."
// maps\nx_rocket_util::wait_play_dialogue_wait( 0.0, "roc_bak_intro_objective", 0.25 );
level.squad[ "ALLY_BAKER" ] maps\nx_rocket_util::actor_dialogue_queue( "roc_bak_intro_objective", 0 );
wait 1.5;
// Squad: "Hooah"
// maps\nx_rocket_util::wait_play_dialogue_wait( 0.0, "roc_wil_intro_hooah", 0.25 );
level.squad[ "ALLY_WILLIAMS" ] maps\nx_rocket_util::actor_dialogue_queue( "roc_wil_intro_hooah", 0 );
// END SECTION 1 ///////////////////
wait 6;
// START SECTION 2 ///////////////////
// iprintlnbold( "START SECTION 2 DIALOG" );
// Bomber Squad: "Approaching objective point alpha"
maps\nx_rocket_util::wait_play_dialogue_wait( 0.0, "roc_bom_intro_approachingalpha", 0.25 );
wait 7;
//Bombers flyover SFX
Iprintlnbold( "AUDIO: PLAYING BOMBERS" );
level._player PlaySound( "scn_roc_intro_bombers_lr" );
level._player PlaySound( "scn_roc_intro_bombers_lsrs" );
wait 5;
// Bomber Squad: "Incoming AA!! Were taking fire!"
maps\nx_rocket_util::wait_play_dialogue_wait( 0.0, "roc_bom_intro_incomingaa", 0.25 );
// Williams: "Fuck theyre pulling back!"
// maps\nx_rocket_util::wait_play_dialogue_wait( 0.0, "roc_wil_intro_pullingback", 0.25 );
level.squad[ "ALLY_WILLIAMS" ] maps\nx_rocket_util::actor_dialogue_queue( "roc_wil_intro_pullingback", 0 );
// Baker: "Pilot drop below the ridgeline! Stay tight on the coast!"
// maps\nx_rocket_util::wait_play_dialogue_wait( 0.0, "roc_bak_intro_pilotdrop", 0.25 );
level.squad[ "ALLY_BAKER" ] maps\nx_rocket_util::actor_dialogue_queue( "roc_bak_intro_pilotdrop", 0 );
// Command: "Freebird actual do you copy? Freebird actual give me a sitrep. Over."
maps\nx_rocket_util::wait_play_dialogue_wait( 0.0, "roc_cmd_intro_freebirdcopy", 0.25 );
wait 1;
// Command: "We have 6 B-2s down, I repeat 6 B-2s showing KIA."
maps\nx_rocket_util::wait_play_dialogue_wait( 0.0, "roc_cmd_intro_6b2sdown" , 0.25 );
*/
/*
// Jenkins: "God damn, thats gonna be us."
maps\nx_rocket_util::wait_play_dialogue_wait( 0.0, "roc_jen_intro_goddamn", 0.25 );
// Baker: "Hold your shit Jenkins!"
maps\nx_rocket_util::wait_play_dialogue_wait( 0.0, "roc_bak_intro_holdshit", 0.25 );
// Baker: "Pilot drop below the ridgeline! Stay tight on the coast!"
maps\nx_rocket_util::wait_play_dialogue_wait( 0.0, "roc_bak_intro_pilotdrop", 0.25 );
// END SECTION 2 ///////////////////
wait 5;
// START SECTION 3 ///////////////////
// iprintlnbold( "START SECTION 3 DIALOG" );
// Baker: "Deadeye 2-1 checking in, flight of 5 MV-60s holding south 5 miles at angles 2-4-0"
maps\nx_rocket_util::wait_play_dialogue_wait( 0.0, "roc_bak_intro_checkingin", 0.25 );
// Command: "Dragon 1-5 copies all. Continue as planned. Push 4 klicks south west to contact."
maps\nx_rocket_util::wait_play_dialogue_wait( 0.0, "roc_cmd_intro_continuetocontact", 0.25 );
// END SECTION 3 ///////////////////
// flag_wait( "chopper_ride_approaching_cliffside" );
*/
/*
wait 5;
// START SECTION 4 ///////////////////
// iprintlnbold( "START SECTION 4 DIALOG" );
// Baker: "Dragon 1-5, we have eyes on multiple enemy vehicles on MSR grid pappa victor 2-5-9"
// maps\nx_rocket_util::wait_play_dialogue_wait( 0.0, "roc_bak_intro_eyesonenemy", 0.25 );
level.squad[ "ALLY_BAKER" ] maps\nx_rocket_util::actor_dialogue_queue( "roc_bak_intro_eyesonenemy", 0 );
*/
/*
// Baker: "Are we clear to engage? Over."
maps\nx_rocket_util::wait_play_dialogue_wait( 0.0, "roc_bak_intro_cleartoengage", 0.25 );
*/
/*
// Command: "Affirm, unrestricted ROE. Engage at will."
maps\nx_rocket_util::wait_play_dialogue_wait( 0.0, "roc_cmd_intro_engageatwill", 0.25 );
// END SECTION 4 ///////////////////
*/
}
// Delete cliffside enemies and objects when the player leaves the area
cleanup_intro_ents()
{
flag_wait( "chopper_ride_intro_done" );
maps\nx_rocket_util::safe_delete_array( level.blackhawk_targets );
maps\nx_rocket_util::safe_delete( level.intro_ally_3 );
maps\nx_rocket_util::safe_delete( level.intro_ally_5 );
flag_wait( "chopper_path_after_reveal" );
// These BTRs need to be cleaned up later than the rest
maps\nx_rocket_util::safe_delete_array( level.intro_cliffside_final_btrs );
}
// Allied chopper turrets
allies_choose_targets( ally_copters )
{
foreach( copter in ally_copters )
{
if( IsDefined(copter) && IsDefined(copter.mgturret) && IsDefined( copter.mgturret[0] ) )
copter.mgturret[0] thread allied_blackhawk_gunner_chooses_targets( ); // Right turret
if( IsDefined(copter) && IsDefined(copter.mgturret) && IsDefined( copter.mgturret[1] ) )
copter.mgturret[1] thread allied_blackhawk_gunner_chooses_targets( ); // Left turret
}
}
//*******************************************************************
// *
// *
//*******************************************************************
get_angle( normal0, normal1 )
{
adjacent = clamp( VectorDot( normal0, normal1 ), -1, 1 );
return acos( adjacent );
}
allied_chopper_spray_target( closest, target_origin )
{
self endon( "death" );
self endon( "crashing" );
closest endon( "death" );
closest endon( "crashing" );
// Get a script origin target to move around and set it as the target.
target = spawn( "script_origin", closest.origin );
self SetTargetEntity( target );
// Setup spray algorithm.
half_distance = 400;
distance = half_distance * 2;
offset = randomvectorrange( half_distance * -1, half_distance );
start = closest.origin + offset;
end = target.origin - offset;
dir = VectorNormalize( end - start );
// Break the spray into 10 iterations. Basically just move the target around.
count = 10;
for ( ii = 0; ii < count; ii++ )
{
// Update the target.
start = closest.origin + offset;
frac = ii / count;
target.origin = start + ( dir * frac * distance );
// Debug draw the spray pattern.
//line( self.origin, target.origin, ( frac, 1, 1 ), 1, 1, 1000 );
//line( target.origin, target.origin + ( 50, 0, 0 ), ( 1, 0, 0 ), 1, 1, 1000 );
// Check within target angle.
start_time = GetTime();
while( 1 )
{
angle = get_angle( VectorNormalize( target.origin - self GetTagOrigin( "tag_flash" )), AnglesToForward( self GetTagAngles( "tag_flash" )));
if ( angle < 10 )
{
break;
}
else if( GetTime() - start_time > 3000 )
{
break;
}
wait( 0.5 );
}
// If out of LOS, break.
tag_origin = self GetTagOrigin( "tag_flash" );
trace_passed = BulletTracePassed( tag_origin, closest.origin + ( 0, 0, 16 ), false, self );
if ( trace_passed )
{
continue;
}
// Trace failed
self ClearTargetEntity();
return;
}
// Final cleanup.
self ClearTargetEntity();
}
//*******************************************************************
// *
// *
//*******************************************************************
// Allied chopper turrets shoot at nearby vehicle targets in LOS
TARGET_FOV = 60;
allied_blackhawk_gunner_chooses_targets( )
{
max_angle_for_player_view = 10;
self endon( "death" );
level endon( "chopper_ride_intro_done" );
level endon( "base_delta_destroyed" );
level endon( "chopper_path_leaving_base_alpha" );
//self SetMode( "auto_nonai" );
cos_fov = Cos( TARGET_FOV );
while ( 1 )
{
// tagBK< NOTE > Don't shoot at the player.
angle_to_player = get_angle( VectorNormalize( level._player.origin - self.origin ), AnglesToForward( self.angles ));
if ( angle_to_player < max_angle_for_player_view )
{
wait RandomFloatRange( 3.0, 5.0 );
continue;
}
targets = level.blackhawk_targets;
closest = undefined;
closest_dist_sqr = 900000000;
forward = AnglesToForward( self.angles );
foreach ( target in targets )
{
if ( isAlive( target ) )
{
dist_sqr = DistanceSquared( self.origin, target.origin );
randomize = RandomFloat( 768 );
dist_sqr += randomize * randomize; // Add random amount
if ( dist_sqr < closest_dist_sqr )
{
//check if its behind and should be picked up by the other gunner.
valid = VectorDot( forward, target.origin - self.origin ) > cos_fov;
if ( valid )
{
// Bullet trace!
tag_origin = self GetTagOrigin( "tag_flash" );
if ( BulletTracePassed( tag_origin, target.origin + ( 0, 0, 16 ), false, self ) )
{
closest = target;
closest_dist_sqr = dist_sqr;
}
wait 0.05; // Only one bullettrace per frame
}
}
}
}
// Target chosen
if ( isAlive( closest ) )
{
self allied_chopper_spray_target( closest );
//self SetTargetEntity( closest );
//self allied_blackhawk_gunner_chose_target( closest );
//self ClearTargetEntity();
}
else
{
wait RandomFloatRange( 3.0, 5.0 );
}
}
}
allied_blackhawk_gunner_chose_target( target )
{
target endon( "death" );
target endon( "crashing" );
// Lose the target if two traces in a row fail
trace_passed = false;
while ( 1 )
{
/*healthbuffer = 0;
if ( isDefined( target.healthbuffer ) )
{
healthbuffer = target.healthbuffer;
}
if ( !isAlive( target ) || target.health - healthbuffer <= 1 )
{
return;
}*/
tag_origin = self GetTagOrigin( "tag_flash" );
//line( tag_origin, target.origin, ( 1, 1, 1 ), 1, 1, 40 );
new_trace_passed = BulletTracePassed( tag_origin, target.origin + ( 0, 0, 16 ), false, self );
if ( trace_passed || new_trace_passed )
{
trace_passed = new_trace_passed;
wait 0.5;
continue;
}
return;
}
wait RandomFloatRange( 3.0, 5.0 );
}
level_fadein_sfx()
{
//set sound volumes down for intro
/* iprintln( "setting sounds down!" ); */
//ambience for intro
thread maps\_utility::set_ambient( "nx_rocket_intro_new" );
level._player setchannelvolumes( "snd_channelvolprio_level", "nx_rocket_fadein", 0.1 );
wait 0.1;
level._player setchannelvolumes( "snd_channelvolprio_level", "nx_rocket_fadein", 0.1 );
wait 0.1;
level._player setchannelvolumes( "snd_channelvolprio_level", "nx_rocket_fadein", 0.1 );
wait 0.1;
level._player setchannelvolumes( "snd_channelvolprio_level", "nx_rocket_fadein", 0.1 );
wait 0.1;
level._player setchannelvolumes( "snd_channelvolprio_level", "nx_rocket_fadein", 0.1 );
wait 0.1;
level._player setchannelvolumes( "snd_channelvolprio_level", "nx_rocket_fadein", 0.1 );
wait 0.1;
level._player setchannelvolumes( "snd_channelvolprio_level", "nx_rocket_fadein", 0.1 );
wait 0.1;
level._player setchannelvolumes( "snd_channelvolprio_level", "nx_rocket_fadein", 0.1 );
wait 0.1;
level._player setchannelvolumes( "snd_channelvolprio_level", "nx_rocket_fadein", 0.1 );
wait 0.1;
level._player setchannelvolumes( "snd_channelvolprio_level", "nx_rocket_fadein", 0.1 );
wait 0.1;
level._player setchannelvolumes( "snd_channelvolprio_level", "nx_rocket_fadein", 0.1 );
wait 0.1;
level._player setchannelvolumes( "snd_channelvolprio_level", "nx_rocket_fadein", 0.1 );
wait 0.1;
level._player setchannelvolumes( "snd_channelvolprio_level", "nx_rocket_fadein", 0.1 );
wait 0.1;
level._player setchannelvolumes( "snd_channelvolprio_level", "nx_rocket_fadein", 0.1 );
wait 0.1;
level._player setchannelvolumes( "snd_channelvolprio_level", "nx_rocket_fadein", 0.1 );
wait 3.5;
//fade sound in
/* iprintln( "fading sounds in!" ); */
level._player deactivatechannelvolumes( "snd_channelvolprio_level", 4.0 );
}