mirror of
https://github.com/reaaLx/nx1-gsc-dump.git
synced 2025-04-22 09:05:45 +00:00
940 lines
32 KiB
Plaintext
940 lines
32 KiB
Plaintext
|
||
//****************************************************************************
|
||
// **
|
||
// 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 );
|
||
}
|