nx1-gsc-dump/maps/nx_rocket_section_base_delta.gsc

1770 lines
62 KiB
Plaintext

//****************************************************************************
// **
// Confidential - (C) Activision Publishing, Inc. 2010 **
// **
//****************************************************************************
// **
// Module: NX_ROCKET_SECTION_BASE_DELTA **
// **
// Created: 7/13/2011 - Justin Rote **
// **
//****************************************************************************
#include maps\_utility;
#include common_scripts\utility;
#include maps\_anim;
#include maps\_vehicle;
ROCKET_2_INITIAL_DEPTH = -6000; // How deep underground rocket 2 starts
ROCKET_2_RISE_DELAY = 10; // Delay before it starts rising
ROCKET_2_RISE_TIME = 75; // How long it takes for rocket 2 to emerge
ROCKET_2_LAUNCH_FX_DELAY = 2; // Delay untill prelaunch FX start
ROCKET_2_LAUNCH_DELAY = 27; // Initial delay before it launches
ROCKET_2_LAUNCH_HEIGHT = 16000; // How high it launches into the air
ROCKET_2_LAUNCH_TIME = 18; // How long it takes to launch ( effects upward speed )
ROCKET_3_INITIAL_DEPTH = -3000; // How deep underground rocket 3 starts
ROCKET_3_RISE_DELAY = 0; // How long it takes for rocket 3 to emerge
ROCKET_3_RISE_TIME = 30; // How it takes to rise ( effects rise speed )
ROCKET_3_LAUNCH_DELAY = 62; // Initial delay before it launches
ROCKET_3_LAUNCH_FX_DELAY = 2; // Delay untill prelaunch FX start
ROCKET_3_LAUNCH_HEIGHT = 16000; // How high it launches into the air
ROCKET_3_LAUNCH_TIME = 18; // How long it takes to launch ( effects upward speed )
ROCKET_4_INITIAL_DEPTH = -1660; // How deep underground rocket 4 starts
ROCKET_4_RISE_DELAY = 0; // How long it takes for rocket 4 to emerge
ROCKET_4_RISE_TIME = 20; // How it takes to rise ( effects rise speed )
ROCKET_4_FX_DELAY = 16; // Delay before FX start
ROCKET_4_LAUNCH_DELAY = 28; // Initial delay before it launches
ROCKET_4_LAUNCH_HEIGHT = 16000; // How high it launches into the air
ROCKET_4_LAUNCH_TIME = 18; // How long it takes to launch ( effects upward speed )
//*******************************************************************
// *
// BASE DELTA - Valley with 3 rockets *
// *
//*******************************************************************
start()
{
maps\nx_rocket_section_intro::start_railgun_ride( "heli_start_ride_p3", "gameplay" );
maps\nx_rocket_fx::fx_vision_fog_init();
maps\nx_rocket_fx::set_vision_and_fog("bridge", 0); // force it to bridge, as we haven't hit the trigger for delta yet
// Setup jump to start objectives
// "Destroy launch site Alpha"
Objective_Add( obj( "OBJ_DESTROY_BASE_ALPHA" ), "done", &"NX_ROCKET_OBJ_BASE_ALPHA" );
// "Destroy launch site Delta"
Objective_Add( obj( "OBJ_DESTROY_BASE_DELTA" ), "active", &"NX_ROCKET_OBJ_BASE_DELTA" );
// "Destroy launch site November"
Objective_Add( obj( "OBJ_DESTROY_LAUNCHING_ROCKETS" ), "active", &"NX_ROCKET_OBJ_LAUNCHING_ROCKETS" );
// Start some low power rumble to simulate chopper bumps
thread maps\nx_rocket_util::slightly_vibrate_camera();
// 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" );
// Actors shoot blanks
anim.shootEnemyWrapper_func = maps\nx_rocket_util::ShootEnemyWrapper_blanks;
level.playerHeli maps\nx_rocket_util::intro_chopper_allies_setup();
}
main()
{
thread maps\nx_rocket_fx::rocket_introfx_cleanup_delta();
thread maps\nx_rocket_fx::rocket02_gantrylights_fx();
thread maps\nx_rocket_fx::rocket03_gantrylights_fx();
thread maps\nx_rocket_fx::rocket04_gantrylights_fx();
thread setup_rocket_exploders();
level.playerHeli thread chopper_path_base_delta();
flag_wait( "flag_entered_base_delta" );
level.playerHeli thread base_delta_dialogue();
// Make sure player's chopper doesnt die
level.playerHeli godon();
//==========================
// SETUP RAILGUN TARGETS
//==========================
// Setup rocket targets
level.base_delta_rockets = GetEntArray( "railgun_rocket_delta_target", "targetname" );
level.base_delta_rocket_2 = GetEnt( "rocketexplode_02", "script_noteworthy" );
level.base_delta_rocket_3 = GetEnt( "rocketexplode_03", "script_noteworthy" );
level.base_delta_rocket_4 = GetEnt( "rocketexplode_04", "script_noteworthy" );
// Setup spawn funcs for enemy APCs that fire their turrets
ally_copters = [ level.delta_looping_chopper_1, level.delta_looping_chopper_2, level.delta_looping_chopper_3 ];
array_spawn_function_noteworthy( "delta_shooting_apc", maps\nx_rocket_util::apc_turret_logic, level.playerHeli, ally_copters );
//level.playerHeli thread maps\nx_rocket_util::delete_objects_on_notify( "chopper_path_left_delta", level.delta_shooting_apcs );
thread maps\nx_rocket_section_intro::allies_choose_targets( ally_copters );
wait 0.05;
// Spawn stationary ground vehicles
level.base_delta_vehicles_static = spawn_vehicles_from_targetname( "base_delta_vehicles_static" );
level.playerHeli thread maps\nx_rocket_util::delete_objects_on_notify( "chopper_path_left_delta", level.base_delta_vehicles_static );
wait 0.05;
// Turn off red boxes on parked BTRs
thread disable_threat_box_on_vehicles( level.base_delta_vehicles_static );
//==========================
//==========================
// Set the current area
level.current_area = "base_delta";
// Watch for rocket destruction
thread watch_for_rocket_destruction();
// Start rocket launch animations and FX
thread rocket_two_anim();
thread rocket_three_anim();
thread rocket_four_anim();
//play launch PA SFX
level thread maps\nx_rocket_audio::base_delta_countdown_sfx();
// Spawn looping chopper allies
level.delta_looping_chopper_1 = spawn_vehicle_from_targetname_and_drive( "base_delta_loop_ally_1" );
level.delta_looping_chopper_2 = spawn_vehicle_from_targetname_and_drive( "base_delta_loop_ally_2" );
level.delta_looping_chopper_3 = spawn_vehicle_from_targetname_and_drive( "base_delta_loop_ally_3" );
// Reduce ally chopper accuracy
level.delta_looping_chopper_1 thread maps\nx_rocket_util::set_ally_chopper_spread( 8 );
level.delta_looping_chopper_2 thread maps\nx_rocket_util::set_ally_chopper_spread( 8 );
level.delta_looping_chopper_3 thread maps\nx_rocket_util::set_ally_chopper_spread( 8 );
// Make allies more agile
level.delta_looping_chopper_1 SetMaxPitchRoll( 50, 50 );
level.delta_looping_chopper_2 SetMaxPitchRoll( 50, 50 );
level.delta_looping_chopper_3 SetMaxPitchRoll( 50, 50 );
flag_wait( "base_delta_destroyed" );
}
//*******************************************************************
// *
// *
//*******************************************************************
section_precache()
{
}
section_flag_inits()
{
flag_init( "rocket_2_destroyed" );
flag_init( "rocket_3_destroyed" );
flag_init( "rocket_4_destroyed" );
flag_init( "base_delta_destroyed" );
}
// Creates the damage detectors for each of the 4 rockets
setup_rocket_exploders()
{
// ALPHA 1
damage_detector = GetEnt( "damage_detector_r1", "script_noteworthy" );
damage_detector thread maps\nx_rocket_section_base_alpha::rocket_exploder_logic( 1 );
// DELTA 2
damage_detector = GetEnt( "damage_detector_r2", "script_noteworthy" );
damage_detector thread maps\nx_rocket_section_base_alpha::rocket_exploder_logic( 2 );
// DELTA 3
damage_detector = GetEnt( "damage_detector_r3", "script_noteworthy" );
damage_detector thread maps\nx_rocket_section_base_alpha::rocket_exploder_logic( 3 );
// DELTA 4
damage_detector = GetEnt( "damage_detector_r4", "script_noteworthy" );
damage_detector thread maps\nx_rocket_section_base_alpha::rocket_exploder_logic( 4 );
}
// Dialogue for this section
base_delta_dialogue()
{
baker = level.squad[ "ALLY_BAKER" ];
jenkins = level.squad[ "ALLY_JENKINS" ];
williams = level.squad[ "ALLY_WILLIAMS" ];
//Wilco, Dragon. Switchblade en route to target.
level thread play_dialogue( "roc_swi_bridge_eyeson3rockets", 0 );
//Copy Switchblade. Go for IR scan
level thread play_dialogue( "roc_dra_bridge_copyswbladeirscan", 3.2 );
//IR scan shows heat blooms in Stage 1 boosters. Candles are lit! Repeat, candles are lit!
level thread play_dialogue( "roc_swi_bridge_candlesarelit", 7.1 );
//Deadeye 1, proceed to target point Delta at maximum speed!
level thread play_dialogue( "roc_dra_bridge_ded1proceedtodelta", 13 );
//Copy that, Dragon. We're on it.
level thread play_dialogue( "roc_ded1_bridge_copywereonit", 17.1 );
// //Guns up, Zulu. They know we're coming!
// baker thread play_dialogue( "roc_bak_delta_gunsup", 18.9 );
// Before first rocket launch -
level thread play_dialogue( "roc_dra_delta_donotallowrockets", 34.0 );
flag_wait( "rocket_4_destroyed" );
//BDA is 1 for 1. Kill confirmed.
baker thread play_dialogue( "roc_bak_alpha_bda1for1", 3.0 );
// After destruction of Delta rocket 1
level thread play_dialogue( "roc_dra_delta_proceedtosecond", 5.8 );
// After VTOL is down, just before targeting Rocket 2
level thread play_dialogue( "roc_dra_delta_airbornin10sec", 9.2 );
level waittill( "chopper_dogfight_base_delta_01_anim_started" );
// When circling the Rocket and chasing the VTOL -
level thread play_dialogue( "roc_ded1_bridge_ded3breakleft", 2.0 );
level thread play_dialogue( "roc_ded1_bridge_countermeasures", 8.0 );
level waittill( "chopper_dogfight_base_delta_01_anim_done" );
level thread play_dialogue( "roc_ded4_alpha_goodkill", 0.5 );
flag_wait( "rocket_3_destroyed" );
// After confirm kill on Rocket 2
level thread play_dialogue( "roc_dra_delta_outoftime", 6.0 );
// As we're bringing it into view
level thread play_dialogue( "roc_dra_delta_targetcandlestick3", 12.0 );
flag_wait( "rocket_2_destroyed" );
baker thread play_dialogue( "roc_bak_delta_ontarget", 0.4 );
// As we're bringing it into view
baker thread play_dialogue( "roc_bak_delta_strkmissioncomplete", 4.0 );
level thread play_dialogue( "roc_dra_delta_outstandingstandby", 8.0 );
// self waittill( "chopper_path_approaching_1st_bunker" );
// // Baker: "Tangos in the open!"
//// maps\nx_rocket_util::wait_play_dialogue_wait( 1.5, "roc_bak_alpha_tangosopen" );
// level.squad[ "ALLY_BAKER" ] maps\nx_rocket_util::actor_dialogue_queue( "roc_bak_alpha_tangosopen", 1.5 );
//
// self waittill( "chopper_path_1st_bunker_1" );
// // Baker: "The North-East rocket is launching!"
//// maps\nx_rocket_util::wait_play_dialogue_wait( 1.5, "roc_bak_delta_nerocketlaunching" );
// level.squad[ "ALLY_BAKER" ] maps\nx_rocket_util::actor_dialogue_queue( "roc_bak_delta_nerocketlaunching", 1.5 );
//
// self waittill( "chopper_path_approach_2nd_bunker_2" );
// // Baker: "Tangos on the bunker!"
//// maps\nx_rocket_util::wait_play_dialogue_wait( 1.5, "roc_bak_alpha_tangosbunker" );
// level.squad[ "ALLY_BAKER" ] maps\nx_rocket_util::actor_dialogue_queue( "roc_bak_alpha_tangosbunker", 1.5 );
//
// //self waittill( "chopper_path_behind_rocket_4_2" );
// // Baker: "Paint the target now!"
// //maps\nx_rocket_util::wait_play_dialogue_wait( 3, "roc_bak_alpha_painttargetnow" );
//
// self waittill( "chopper_path_terrace_1" );
// // Baker: "Tangos on the terrace, waste em!"
//// maps\nx_rocket_util::wait_play_dialogue_wait( 1, "roc_bak_alpha_tangosopen" );
// level.squad[ "ALLY_BAKER" ] maps\nx_rocket_util::actor_dialogue_queue( "roc_bak_alpha_tangosopen", 1 );
//
// //self waittill( "chopper_path_terrace_3" );
// //wait 3.0;
// //thread add_dialogue_line( "Baker", "Enemy choppers incoming!!", "w" );
//
// //self waittill( "chopper_path_rocket_3_2" );
// // Baker: "We have a window, target the rocket!"
// //maps\nx_rocket_util::wait_play_dialogue_wait( 0, "roc_bak_delta_window" );
//
// // Baker: "Paint the rocket!"
// //maps\nx_rocket_util::wait_play_dialogue_wait( 0, "roc_bak_delta_paintrocket" );
//
// //self waittill( "chopper_path_leaving_rocket_3" );
// //wait 1.0;
// //thread add_dialogue_line( "Baker", "Be advised more targets spotted on the roofs", "w" );
//
// self waittill( "chopper_path_rocket_2_1" );
// // Baker: "The rocket is launching! Climb! Climb!"
//// maps\nx_rocket_util::wait_play_dialogue_wait( 1, "roc_bak_delta_climb" );
// level.squad[ "ALLY_BAKER" ] maps\nx_rocket_util::actor_dialogue_queue( "roc_bak_delta_climb", 1 );
//
// //self waittill( "chopper_path_rocket_2_3" );
// //thread add_dialogue_line( "Baker", "Enemy VTOL!", "w" );
//
// //self waittill( "chopper_path_rocket_2_3" );
// // Baker: "Get a laze on that rocket now!!"
// //maps\nx_rocket_util::wait_play_dialogue_wait( 0, "roc_bak_alpha_railshotnow" );
}
//*******************************************************************
// *
// MAIN CHOPPER LOGIC SCRIPT *
// *
//*******************************************************************
// Self = player chopper
chopper_path_base_delta()
{
//==========================
// Pre-Intro
//==========================
flag_wait( "flag_approach_base_delta" );
// Spawn a small convoy driving to first bunker
// level.base_delta_intro_path_vehicles = spawn_vehicles_from_targetname_and_drive( "delta_intro_path_vehicles" );
//maps\nx_rocket_util::protect_player_helicopter_rear_from_each_vehicle( level.base_delta_intro_path_vehicles );
//level thread maps\nx_rocket_util::handle_caravan_stopping( level.base_delta_intro_path_vehicles, "chopper_path_approach_2nd_bunker_2" );
// JR - Removed for better reveal
//level.base_delta_intro_path_vehicles = maps\nx_rocket_util::caravan_setup( "delta_intro_path_vehicles_" );
//self thread maps\nx_rocket_util::delete_objects_on_notify( "chopper_path_approach_2nd_bunker_2", level.base_delta_intro_path_vehicles );
//thread disable_threat_box_on_vehicles( level.base_delta_intro_path_vehicles );
// Spawn allied chopper to fly by
level.base_delta_intro_chopper_1 = spawn_vehicle_from_targetname_and_drive( "base_delta_intro_ally_1" );
level.base_delta_intro_chopper_1 thread maps\nx_rocket_util::set_ally_chopper_spread( 8 );
level.base_delta_intro_chopper_1 SetMaxPitchRoll( 25, 25 );
level.base_delta_intro_chopper_2 = spawn_vehicle_from_targetname_and_drive( "base_delta_intro_ally_2" );
level.base_delta_intro_chopper_2 thread maps\nx_rocket_util::set_ally_chopper_spread( 8 );
level.base_delta_intro_chopper_2 SetMaxPitchRoll( 25, 25 );
//==========================
// Intro
//==========================
flag_wait( "flag_entered_base_delta" );
self thread railgun_window_controller();
self SetMaxPitchRoll( 25, 25 );
//==========================
// First bunker
//==========================
wait 1.0;
// Spawn some guys on and around the first bunkers
array_spawn_function_targetname("base_delta_first_bunker_guys", maps\nx_rocket_util::protect_player_helicopter_rear );
level.base_delta_first_bunker_guys = maps\nx_rocket_util::spawn_guys_from_targetname( "base_delta_first_bunker_guys" );
self thread maps\nx_rocket_util::delete_objects_on_notify( "chopper_path_approach_2nd_bunker_2", level.base_delta_first_bunker_guys );
wait 1.0;
// Spawn runner drones
self thread start_drone_pack( "drones_delta_bunker_1", 5, 10, "chopper_path_approach_2nd_bunker_2" );
self thread start_drone_pack( "drones_delta_bunker_1_2", 6, 14, "chopper_path_approach_2nd_bunker_2" );
self thread start_drone_pack( "drones_delta_road_1", 20, 22, "chopper_path_approach_2nd_bunker_2" );
wait 1.0;
// SAM Turrets
//iprintln( "spawning SAMs" );
level.delta_sam_sites = [];
level.delta_sam_sites [ level.delta_sam_sites.size ] = thread sam_turret_init ("base_delta_sam_turret_2", "chopper_path_approaching_1st_bunker");
level.delta_sam_sites [ level.delta_sam_sites.size ] = thread sam_turret_init ("base_delta_sam_turret_4", "chopper_path_approach_2nd_bunker_2");
level.delta_sam_sites [ level.delta_sam_sites.size ] = thread sam_turret_init ("base_delta_sam_turret_3", "chopper_path_terrace_1");
self thread maps\nx_rocket_util::delete_objects_on_notify( "chopper_path_left_delta", level.delta_sam_sites );
self waittill( "chopper_path_1st_bunker_1" );
self SetMaxPitchRoll( 10, 10 );
self thread do_bunker_1_runners();
//==========================
// Road to Second bunker
//==========================
self waittill( "chopper_path_1st_bunker_2" );
self SetMaxPitchRoll( 25, 25 );
// Spawn a small moving convoy on the road
// These vehicles delete themselves at the end of their path
level.base_delta_road_to_2nd_bunker_vehicles = spawn_vehicles_from_targetname_and_drive( "delta_road_to_2nd_bunker_vehicles" );
level.blackhawk_targets = level.base_delta_road_to_2nd_bunker_vehicles;
//maps\nx_rocket_util::protect_player_helicopter_rear_from_each_vehicle( level.base_delta_road_to_2nd_bunker_vehicles );
// No delete needed, these have a self cleanup KVP set
//==========================
// Second bunker
//==========================
self waittill( "chopper_path_approach_2nd_bunker_1" );
// JR - Turning these off
//level.base_delta_second_buker_hummers = self thread spawn_vehicles_from_targetname_and_drive( "delta_4_path_vehicles" );
//self thread maps\nx_rocket_util::delete_objects_on_notify( "chopper_path_terrace_1", level.base_delta_second_buker_hummers );
// Spawn runner drones
self thread start_drone_pack( "drones_delta_bunker_2_1", 5, 10, "chopper_path_at_2nd_bunker_1" );
self thread start_drone_pack( "drones_delta_bunker_2_2", 6, 10, "chopper_path_behind_rocket_4_2" );
self thread start_drone_pack( "drones_delta_bunker_2_3", 6, 10, "chopper_path_behind_rocket_4_2" );
wait 1.0;
// Littlebird fodder flyby
level.base_delta_littlebird_fodder_1 = spawn_vehicles_from_targetname_and_drive( "delta_littlebird_fodder_1" );
level.base_delta_littlebird_fodder_1[0] thread maps\nx_rocket_audio::rocket_air_vehicle_flyby_sfx("rocket_heli_flyby_01", 2.22);
level.base_delta_littlebird_fodder_1[1] thread maps\nx_rocket_audio::rocket_air_vehicle_flyby_sfx("rocket_heli_flyby_02", 3.12);
level.base_delta_littlebird_fodder_1[0] thread littlebird_fodder_1_0_attack( level.playerHeli );
level.base_delta_littlebird_fodder_1[1] thread littlebird_fodder_1_0_attack( level.playerHeli );
//maps\nx_rocket_util::protect_player_helicopter_rear_from_each_vehicle( level.base_delta_littlebird_fodder_1 );
self thread maps\nx_rocket_util::delete_objects_on_notify( "chopper_path_at_2nd_bunker_1", level.base_delta_littlebird_fodder_1 );
self waittill( "chopper_path_approach_2nd_bunker_2" );
// Spawn some guys in the bunker 2 area
array_spawn_function_targetname("base_delta_second_bunker_guys", maps\nx_rocket_util::protect_player_helicopter_rear );
level.base_delta_second_bunker_guys = maps\nx_rocket_util::spawn_guys_from_targetname( "base_delta_second_bunker_guys" );
self thread maps\nx_rocket_util::delete_objects_on_notify( "chopper_path_behind_rocket_4_2", level.base_delta_second_bunker_guys );
self thread do_bunker_2_runners_1();
self thread do_bunker_2_runners_2();
//self thread do_bunker_2_runners_3();
self waittill( "chopper_path_at_2nd_bunker_1" );
self SetMaxPitchRoll( 10, 10 );
self waittill( "chopper_path_at_2nd_bunker_3" );
self SetMaxPitchRoll( 15, 15 );
// Start Ally 4 and 5
level.delta_looping_chopper_4 = spawn_vehicle_from_targetname_and_drive( "base_delta_loop_ally_4" );
level.delta_looping_chopper_4 thread maps\nx_rocket_util::set_ally_chopper_spread( 8 );
level.delta_looping_chopper_4 SetMaxPitchRoll( 50, 50 );
level.delta_looping_chopper_5 = spawn_vehicle_from_targetname_and_drive( "base_delta_loop_ally_5" );
level.delta_looping_chopper_5 thread maps\nx_rocket_util::set_ally_chopper_spread( 8 );
level.delta_looping_chopper_5 SetMaxPitchRoll( 50, 50 );
// Kick off some drones
self thread start_drone_pack( "drones_delta_bunker_3_1", 2, 8, "chopper_path_behind_rocket_4_3" );
//==========================
// Blow up the Rocket
//==========================
//self waittill( "chopper_path_delta_window_1_open" );
//self waittill( "chopper_path_behind_rocket_4_1" );
//==========================
// Littlebird flyby 2
//==========================
self waittill( "chopper_path_behind_rocket_4_3" );
level.base_delta_littlebird_fodder_2 = spawn_vehicles_from_targetname_and_drive( "delta_littlebird_fodder_2" );
//maps\nx_rocket_util::protect_player_helicopter_rear_from_each_vehicle( level.base_delta_littlebird_fodder_2 );
level.base_delta_chase_ally_1 = spawn_vehicle_from_targetname_and_drive( "base_delta_chase_ally_1" );
level.base_delta_chase_ally_1 SetMaxPitchRoll( 25, 25 );
level.base_delta_chase_ally_1 godon();
level.base_delta_littlebird_fodder_2[0] thread littlebird_fodder_2_0_attack( level.base_delta_chase_ally_1 );
level.base_delta_littlebird_fodder_2[0] thread maps\nx_rocket_audio::rocket_air_vehicle_flyby_sfx("rocket_heli_flyby_04", 0 );
level.base_delta_littlebird_fodder_2[1] thread littlebird_fodder_2_1_attack( level.base_delta_chase_ally_1 );
level.base_delta_littlebird_fodder_2[1] thread maps\nx_rocket_audio::rocket_air_vehicle_flyby_sfx("rocket_heli_flyby_05", 1.5 );
// Cleanup for the fodder choppers
self thread maps\nx_rocket_util::delete_objects_on_notify( "chopper_path_rocket_3_1", level.base_delta_littlebird_fodder_2 );
//==========================
// Terrace / Rocket Three
//==========================
self waittill( "chopper_path_approach_terrace" );
level.base_delta_terrace_path_vehicles = self thread spawn_vehicles_from_targetname_and_drive( "delta_terrace_path_vehicles" );
self thread maps\nx_rocket_util::delete_objects_on_notify( "chopper_path_rocket_2_3", level.base_delta_terrace_path_vehicles );
level.blackhawk_targets = array_combine( level.blackhawk_targets, level.base_delta_terrace_path_vehicles );
level.base_delta_r3_vehicles = spawn_vehicles_from_targetname_and_drive( "delta_r3_path_vehicles" );
self thread maps\nx_rocket_util::delete_objects_on_notify( "chopper_path_approaching_rocket_2", level.base_delta_r3_vehicles );
level.blackhawk_targets = array_combine( level.blackhawk_targets, level.base_delta_terrace_path_vehicles );
// Spawn some trucks going down the hill.
// Spawn some guys on the terrace
//array_spawn_function_targetname("base_delta_terrace_guys", maps\nx_rocket_util::protect_player_helicopter_rear );
//level.base_delta_terrace_guys = maps\nx_rocket_util::spawn_guys_from_targetname( "base_delta_terrace_guys" );
//self thread maps\nx_rocket_util::delete_objects_on_notify( "chopper_path_rocket_3_1", level.base_delta_terrace_guys );
// Spawn some pathing vehicles in the rocket 3 area
self waittill( "chopper_path_terrace_1" );
// Kick off some drones
self thread start_drone_pack( "drones_delta_bunker_4_1", 5, 10, "chopper_path_rocket_3_6" );
//==========================
// Rocket Three
//==========================
// Spawn some guys on the rocket 3 bunkers
array_spawn_function_targetname("base_delta_rocket_3_guys", maps\nx_rocket_util::protect_player_helicopter_rear );
level.base_delta_rocket_3_guys = maps\nx_rocket_util::spawn_guys_from_targetname( "base_delta_rocket_3_guys" );
self thread maps\nx_rocket_util::delete_objects_on_notify( "chopper_path_approaching_rocket_2", level.base_delta_rocket_3_guys );
// ****************
// ANIM GOES HERE
// ****************
level waittill( "chopper_dogfight_base_delta_01_anim_started" );
// Turn on new ground reference ent.
//iprintln( "Start ground ref ent" );
//level._player_ground_origin = spawn_tag_origin();
//level._player_ground_origin LinkTo( level.playerHeli, "tag_player" );
//level._player_ground_origin PlayerSetGroundReferenceEnt( level._player_ground_origin );
wait 12;
level.dogfight_01_vtol godoff();
level.dogfight_01_vtol.health = 25000;
level.dogfight_01_vtol thread maps\_nx_chinese_vtol_low::playDamageEffects( 24999, 2 );
level.dogfight_01_ally godoff();
level waittill( "chopper_dogfight_base_delta_01_anim_done" );
// Teleport player chopper to end of anim
level.playerHeli maps\nx_rocket_util::transition_chopper_to_new_path_noteworthy( "dogfight_01_resume_node" );
// Teleport VTOL to new path
level.dogfight_01_vtol maps\nx_rocket_util::transition_chopper_to_new_path_noteworthy( "dogfight_01_vtol_resume_node" );
level.dogfight_01_vtol vehicle_SetSpeedImmediate( 90 );
level.dogfight_01_vtol.health = 1000;
// Teleport ally chopper to new path
level.dogfight_01_ally maps\nx_rocket_util::transition_chopper_to_new_path_noteworthy( "dogfight_01_ally_resume_node" );
level.dogfight_01_ally vehicle_SetSpeedImmediate( 90 );
// Turn off special ground reference ent
//iprintln( "Delete ground ref ent" );
//level._player_ground_origin delete();
self waittill( "chopper_path_rocket_3_8" );
self thread do_rocket_3_runners();
//==========================
// Rocket Two
//==========================
// Spawn some guys on the rocket 2 bunkers
array_spawn_function_targetname("base_delta_rocket_2_guys", maps\nx_rocket_util::protect_player_helicopter_rear );
level.base_delta_rocket_2_guys = maps\nx_rocket_util::spawn_guys_from_targetname( "base_delta_rocket_2_guys" );
self thread maps\nx_rocket_util::delete_objects_on_notify( "chopper_path_rocket_2_3", level.base_delta_rocket_2_guys );
self thread do_rocket_2_runners();
// Kick off some drones
self thread start_drone_pack( "drones_delta_bunker_5_1", 5, 10, "chopper_path_rocket_2_3" );
self waittill( "chopper_path_leaving_rocket_3" );
// Clean up the vehicles from dogfight 01 anim
maps\nx_rocket_util::safe_delete( level.dogfight_01_vtol );
maps\nx_rocket_util::safe_delete( level.dogfight_01_ally );
//==========================
// Done
//==========================
self waittill( "chopper_path_leaving_delta_2" );
//temp music_chk flag
flag_set( "music_chk_delta_end" );
// Remove the chopper attractor
//missile_DeleteAttractor( level.playerHeli.attractor );
//missile_DeleteAttractor( level.playerHeli.repulsor );
}
// Controls when the player can fire the railgun at rockets
railgun_window_controller()
{
//==============================
// WINDOW ONE
self waittill( "chopper_path_delta_window_1_open" );
level.current_area = "base_delta_r4";
maps\nx_rocket_railgun::enable_railgun();
//thread add_dialogue_line( "Baker", "We have a window, paint a target on the rocket!", "w" );
// thread maps\nx_rocket_util::wait_play_dialogue_wait( 3, "roc_bak_alpha_painttargetnow" );
level.squad[ "ALLY_BAKER" ] thread maps\nx_rocket_util::actor_dialogue_queue( "roc_bak_alpha_painttargetnow", 3.0 );
thread disable_rail_after_event( "rocket_4_destroyed" );
self waittill( "chopper_path_behind_rocket_4_1" );
self waittill( "chopper_path_approach_terrace" );
maps\nx_rocket_railgun::disable_railgun();
thread check_delta_fail_window( "rocket_4_destroyed", &"NX_ROCKET_DELTA_FAIL" );
//==============================
// WINDOW TWO
//self waittill( "chopper_path_rocket_3_6" );
level waittill( "chopper_dogfight_base_delta_01_anim_started" );
wait 14;
level.current_area = "base_delta_r3";
maps\nx_rocket_railgun::enable_railgun();
thread disable_rail_after_event( "rocket_3_destroyed" );
// Baker: "We have a window, target the rocket!"
// thread maps\nx_rocket_util::wait_play_dialogue_wait( 0, "roc_bak_delta_window" );
level.squad[ "ALLY_BAKER" ] maps\nx_rocket_util::actor_dialogue_queue( "roc_bak_delta_window", 0 );
// Baker: "Paint the rocket!"
// thread maps\nx_rocket_util::wait_play_dialogue_wait( 0, "roc_bak_delta_paintrocket" );
level.squad[ "ALLY_BAKER" ] maps\nx_rocket_util::actor_dialogue_queue( "roc_bak_delta_paintrocket", 0 );
self waittill( "chopper_path_approaching_rocket_2" );
maps\nx_rocket_railgun::disable_railgun();
thread check_delta_fail_window( "rocket_3_destroyed", &"NX_ROCKET_DELTA_FAIL" );
//==============================
// WINDOW THREE
self waittill( "chopper_path_rocket_2_2" );
level.current_area = "base_delta_r2";
maps\nx_rocket_railgun::enable_railgun();
thread disable_rail_after_event( "rocket_2_destroyed" );
// Baker: "Get a laze on that rocket now!!"
// thread maps\nx_rocket_util::wait_play_dialogue_wait( 0, "roc_bak_alpha_railshotnow" );
level.squad[ "ALLY_BAKER" ] thread maps\nx_rocket_util::actor_dialogue_queue( "roc_bak_delta_climbclimbclimb", 0 );
wait 1.8;
level.squad[ "ALLY_BAKER" ] thread maps\nx_rocket_util::actor_dialogue_queue( "roc_bak_alpha_railshotnow", 0 );
self waittill( "chopper_path_rocket_2_4" );
self waittill( "chopper_path_leaving_delta_2" );
maps\nx_rocket_railgun::disable_railgun();
thread check_delta_fail_window( "rocket_2_destroyed", &"NX_ROCKET_DELTA_FAIL" );
}
//******************************************************************************************
//******************************************************************************************
sam_turret_init ( sam_turret_targetname, attack_notify )
{
// Spawn a turret from the indicated spawner
sam_turret = spawn_vehicle_from_targetname( sam_turret_targetname );
// Slap a bunch of missiles on that bad boy
sam_turret.missileTags = [];
sam_turret.missileTags[ 0 ] = "tag_missle1";
sam_turret.missileTags[ 1 ] = "tag_missle2";
sam_turret.missileTags[ 2 ] = "tag_missle3";
sam_turret.missileTags[ 3 ] = "tag_missle4";
sam_turret.missileTags[ 4 ] = "tag_missle5";
sam_turret.missileTags[ 5 ] = "tag_missle6";
sam_turret.missileTags[ 6 ] = "tag_missle7";
sam_turret.missileTags[ 7 ] = "tag_missle8";
foreach( tag in sam_turret.missileTags )
{
sam_turret Attach( "projectile_slamraam_missile", tag, true );
}
sam_turret thread sam_turret_targeting( attack_notify);
return sam_turret;
}
sam_turret_targeting( attack_notify )
{
self endon( "exploded" );
// Set the delay between missile firings
fire_delay = 1;
self thread sam_turret_damage_logic();
// Turret rotates to face player
self setturrettargetent( level._player );
// The notify that tells it it's time to start firing missiles
level.playerHeli waittill ( attack_notify );
eMissile = undefined;
tag = undefined;
targetOrg = level._player;
while ( ( isdefined( self ) ) && ( self.missileTags.size > 0 ) )
{
// Shoot the missiles with delay.
wait fire_delay;
// Pick a random remaining missile
tag = random( self.missileTags );
// delete the missile model and remove that tag from the array
self.missileTags = array_remove( self.missileTags, tag );
self detach( self.missileModel, tag );
// Spawn a real deal missile and send it towards the player
eMissile = magicBullet( "slamraam_missile_dcburning", self gettagorigin( tag ), targetOrg.origin );
if ( self.missileTags.size < 1 )
break;
}
self clearturrettarget();
}
sam_turret_damage_logic()
{
// This is how many hits it takes to destroy the turret (there's only one weapon being used here, so this simple method is fine)
self.hitsRemaining = 3;
self maps\_vehicle::godon();
while ( isdefined( self ) )
{
// Turret got shot
self waittill( "damage" );
// If it has more than 1 hit remaining, reduce hits remaining
if ( self.hitsRemaining > 0 )
{
self.hitsRemaining --;
}
// No hits remain, blow that sucker up.
else
{
// Big kablooey
self thread maps\nx_rocket_audio::rocket_sam_turret_explode_audio();
playfx( getfx( "helicopter_explosion" ), self.origin );
// Remove any remaining missiles
foreach (tag in self.missileTags )
{
self detach( self.missileModel, tag );
}
// Swap model for destroyed state
self setmodel( "vehicle_slamraam_destroyed" );
break;
}
}
self notify ("exploded");
target_remove ( self );
}
do_bunker_1_runners()
{
// Spawn some guys that run out and engage
array_spawn_function_targetname( "base_delta_first_bunker_runners_1", maps\nx_rocket_util::protect_player_helicopter_rear );
array_spawn_function_targetname( "base_delta_first_bunker_runners_1", maps\nx_rocket_util::run_to_goal_then_aggro );
level.base_delta_first_bunker_runners_1 = maps\nx_rocket_util::spawn_guys_from_targetname( "base_delta_first_bunker_runners_1" );
self thread maps\nx_rocket_util::delete_objects_on_notify( "chopper_path_approach_2nd_bunker_2", level.base_delta_first_bunker_runners_1 );
}
do_bunker_2_runners_1()
{
wait 2.0;
// Spawn some guys that run out and engage
array_spawn_function_targetname( "base_delta_second_bunker_runners_1", maps\nx_rocket_util::protect_player_helicopter_rear );
array_spawn_function_targetname( "base_delta_second_bunker_runners_1", maps\nx_rocket_util::run_to_goal_then_aggro );
level.base_delta_second_bunker_runners_1 = maps\nx_rocket_util::spawn_guys_from_targetname( "base_delta_second_bunker_runners_1" );
self thread maps\nx_rocket_util::delete_objects_on_notify( "chopper_path_behind_rocket_4_2", level.base_delta_second_bunker_runners_1 );
}
do_bunker_2_runners_2()
{
wait 4.0;
// Spawn some guys that run out and engage
//array_spawn_function_targetname( "base_delta_second_bunker_runners_2", maps\nx_rocket_util::run_to_goal_then_aggro );
array_spawn_function_targetname("base_delta_second_bunker_runners_2", maps\nx_rocket_util::protect_player_helicopter_rear );
level.base_delta_second_bunker_runners_2 = maps\nx_rocket_util::spawn_guys_from_targetname( "base_delta_second_bunker_runners_2" );
self thread maps\nx_rocket_util::delete_objects_on_notify( "chopper_path_behind_rocket_4_2", level.base_delta_second_bunker_runners_2 );
}
do_bunker_2_runners_3()
{
wait 2.0;
// Spawn some guys that run out and engage
array_spawn_function_targetname( "base_delta_second_bunker_runners_3", maps\nx_rocket_util::run_to_goal_then_aggro );
array_spawn_function_targetname( "base_delta_second_bunker_runners_3", maps\nx_rocket_util::protect_player_helicopter_rear );
level.base_delta_second_bunker_runners_3 = maps\nx_rocket_util::spawn_guys_from_targetname( "base_delta_second_bunker_runners_3" );
self thread maps\nx_rocket_util::delete_objects_on_notify( "chopper_path_behind_rocket_4_2", level.base_delta_second_bunker_runners_3 );
}
do_rocket_3_runners()
{
wait 3.0;
// Spawn some guys that run out and engage
array_spawn_function_targetname( "base_delta_rocket_3_runners", maps\nx_rocket_util::run_to_goal_then_aggro );
array_spawn_function_targetname( "base_delta_rocket_3_runners", maps\nx_rocket_util::protect_player_helicopter_rear );
level.base_delta_rocket_3_runners = maps\nx_rocket_util::spawn_guys_from_targetname( "base_delta_rocket_3_runners" );
self thread maps\nx_rocket_util::delete_objects_on_notify( "chopper_path_approaching_rocket_2", level.base_delta_rocket_3_runners );
}
do_rocket_2_runners()
{
// Spawn some guys that run out and engage
array_spawn_function_targetname( "base_delta_rocket_2_runners", maps\nx_rocket_util::run_to_goal_then_aggro );
array_spawn_function_targetname( "base_delta_rocket_2_runners", maps\nx_rocket_util::protect_player_helicopter_rear );
level.base_delta_rocket_2_runners = maps\nx_rocket_util::spawn_guys_from_targetname( "base_delta_rocket_2_runners" );
self thread maps\nx_rocket_util::delete_objects_on_notify( "chopper_path_rocket_2_3", level.base_delta_rocket_2_runners );
}
// Helper script to make drones more organized
start_drone_pack( group_name, low_int, high_int, end_event )
{
drones = getentarray( group_name, "targetname" );
thread maps\nx_rocket_util::drone_flood_start( drones, group_name, low_int, high_int, true );
self thread maps\nx_rocket_util::delayThreadNotify( end_event, maps\nx_rocket_util::drone_flood_stop, group_name );
}
//******************************************************************************************
//******************************************************************************************
// Fires a railgun shot at node, after delay
one_off_railgun_shot( delay, targetname )
{
wait delay;
//iprintln( "railgun shot" );
// This is where the railshot starts from
missile_origin = maps\nx_rocket_railgun::get_railgun_node();
// Get the target node
target_ent = GetEnt( targetname, "targetname" );
// Spawn the railgun shot
rail_shot = MagicBullet( "nx_rocket_railgun", missile_origin.origin + randomvectorrange( -100, 100 ), target_ent.origin );
}
// Make the littlebirds fire at the player for a while
littlebird_fodder_1_0_attack( target )
{
self endon( "death" );
turrets = self.turrets;
if ( !isdefined( turrets ) )
turrets = self.mgturret;
wait 3.0;
self thread littlebird_fire_untill_notify( target, turrets, "stop_fire" );
wait 6.0;
self notify( "stop_fire" );
}
// Makes a littlebird fire at a target for a while
littlebird_fodder_2_0_attack( target )
{
self endon( "death" );
turrets = self.turrets;
if ( !isdefined( turrets ) )
turrets = self.mgturret;
self thread littlebird_fire_untill_notify( target, turrets, "stop_fire" );
wait 4.0;
self notify( "stop_fire" );
}
// Makes a littlebird fire at a target for a while
littlebird_fodder_2_1_attack( target )
{
self endon( "death" );
turrets = self.turrets;
if ( !isdefined( turrets ) )
turrets = self.mgturret;
wait 2.0;
self thread littlebird_fire_untill_notify( target, turrets, "stop_fire" );
wait 3.0;
self notify( "stop_fire" );
}
// Fires this choppers turret untill the notify event is called
littlebird_fire_untill_notify( target, turrets, notify_event )
{
self endon( notify_event );
self endon( "death" );
// Force a target
foreach ( turret in turrets )
{
turret SetTargetEntity( target );
}
// Fire untill the script kills itself
for ( ;; )
{
foreach ( turret in turrets )
{
turret Show();
if ( !turret IsFiringTurret() )
turret ShootTurret();
}
wait 0.1;
}
}
// Turn off
disable_rail_after_event( event )
{
level waittill( event );
maps\nx_rocket_railgun::disable_railgun();
}
// Turns off the red target boxes on parked BTRs
disable_threat_box_on_vehicles( vehicles )
{
// Wait a frame
waittillframeend;
foreach( vehicle in vehicles )
{
if( !isDefined( vehicle.script_noteworthy ) && Target_IsTarget( vehicle ))
{
Target_Remove( vehicle );
}
}
}
//*******************************************************************
// *
// ROCKET TWO *
// *
//*******************************************************************
// Animates the rocket coming out of the ground, then launching shortly after
/*
// JR - This was used to get gantry pieces animating out of the ground
rocket_two_anim()
{
// Get gantry
gantry_pieces = getentarray( "rocket_2_gantry", "targetname" );
// Get rocket
rocket = GetEnt( "rocket_two", "targetname" );
array_thread( gantry_pieces, ::move_gantry_piece, (0,0,-3000), 0.01 );
rocket MoveTo( rocket.origin + (0,0,-3000), 0.01 );
}*/
rocket_two_anim()
{
// Get anim node
anim_node = getEnt( "vignette_nx_rocket_explosion_02", "targetname" );
//=============================================
// SETUP THE PIECES
//=============================================
rocket_two = spawn_anim_model("rocket_shuttle_exp1_010");
rocket_two.origin = anim_node.origin;
rocket_two.angles = anim_node.angles;
// Link rocket to node
rocket_two linkTo( anim_node );
// Link collision cylinder to anim node
damage_detector = GetEnt( "damage_detector_r2", "script_noteworthy" );
damage_detector linkTo( anim_node );
// Link target indicator node to the anim node
target_indicator = GetEnt( "rocketexplode_02", "script_noteworthy" );
target_indicator linkTo( anim_node );
// Start the rocket below ground
anim_node.origin = anim_node.origin + (0,0, ROCKET_2_INITIAL_DEPTH );
// Start the gantry below ground
// This gantry is already below ground in Radiant.
//thread gantry_setup_two();
script_models = [];
script_models["rocket_shuttle_exp1_010"] = rocket_two;
anim_node anim_first_frame( script_models, "rocket_shuttle_exp1");
// Handle rocket movement and FX
anim_node thread move_rocket_two();
anim_node thread launch_rocket_two();
rocket_two thread rocket_two_fx();
//========================================
// Wait for the rocket to be destroyed
//========================================
level waittill( "rocket_2_destroyed" );
// Determine which anim should play
explosion_anim = undefined;
explosion_models = [];
//==========================================================
//==========================================================
if( level.rocket_2_state == "rising" )
{
explosion_anim = "rocket_shuttle_exp1";
thread maps\nx_rocket_fx::rocket_02_hit_fx( rocket_two );
}
//==========================================================
//==========================================================
else if( level.rocket_2_state == "waiting" )
{
explosion_anim = "rocket_shuttle_exp1";
thread maps\nx_rocket_fx::rocket_02_hit_fx( rocket_two );
}
//==========================================================
//==========================================================
else if( level.rocket_2_state == "launching" )
{
explosion_anim = "rocket_shuttle_exp1";
thread maps\nx_rocket_fx::rocket_02_launch_hit_fx( rocket_two );
}
// Play Sounds
//rocket_two PlaySound( "scn_rocket_lrgrocketexplo" );
rocket_two StopLoopSound( "rocket_launch_loop" );
// Play the anim
anim_node anim_single( script_models, explosion_anim );
anim_node delete();
}
// Moves the rocket and gantry up out of the ground
move_rocket_two()
{
level endon( "rocket_2_destroyed" );
wait ROCKET_2_RISE_DELAY;
self thread move_gantry_inner_two();
self thread move_gantry_outer_two();
level.rocket_2_state = "rising";
//iprintln( "r2 rising" );
self moveto( self.origin + (0,0, ROCKET_2_INITIAL_DEPTH * -1 ), ROCKET_2_RISE_TIME );
self waittill( "movedone" );
level notify( "rocket_2_done_moving" );
level.rocket_2_state = "waiting";
//iprintln( "r2 done rising" );
wait 25;
thread maps\nx_rocket_section_base_alpha::animate_gantry_arms( "gantry_inner_2" );
}
gantry_setup_two()
{
// Get all Ents in the Outer Gantry prefab
gantry_parts = GetEntArray ("gantry_outer_2", "script_noteworthy");
// Teleport them under ground
foreach( part in gantry_parts )
{
if( part.classname == "script_brushmodel" || part.classname == "script_model")
{
part.origin = ( part.origin + (0, 0, (ROCKET_2_INITIAL_DEPTH + 600)));
}
}
// Get all Ents in the Inner Gantry prefab
gantry_parts = GetEntArray ("gantry_inner_2", "script_noteworthy");
// Teleport them under ground
foreach( part in gantry_parts )
{
if( part.classname == "script_brushmodel" || part.classname == "script_model")
{
part.origin = ( part.origin + (0, 0, ROCKET_2_INITIAL_DEPTH ));
}
}
}
move_gantry_outer_two()
{
// Get all Ents in the Gantry prefab
gantry_parts = GetEntArray ("gantry_outer_2", "script_noteworthy");
// Move them in sync with the rocket
// But stop 600 units short, 5 seconds sooner
foreach( part in gantry_parts )
{
if( part.classname == "script_brushmodel" || part.classname == "script_model")
{
part MoveTo( part.origin + (0, 0, ((ROCKET_2_INITIAL_DEPTH * -1) - 600)), (ROCKET_2_RISE_TIME - 5), 2, 2 );
}
}
}
move_gantry_inner_two()
{
// Get all Ents in the Gantry prefab
gantry_parts = GetEntArray ("gantry_inner_2", "script_noteworthy");
// Move them in sync with the rocket
foreach( part in gantry_parts )
{
if( part.classname == "script_brushmodel" || part.classname == "script_model")
{
part MoveTo( part.origin + (0, 0, (ROCKET_2_INITIAL_DEPTH * -1)), ROCKET_2_RISE_TIME, 2, 2 );
}
}
}
launch_rocket_two()
{
level waittill( "rocket_2_done_moving" );
level thread maps\nx_rocket_util::launch_coutdown_logic( ROCKET_2_LAUNCH_DELAY, 2, "rocket_2_destroyed" );
wait ROCKET_2_LAUNCH_DELAY;
// Check to see if the rocket was popped before launching
if( flag( "rocket_2_destroyed" ))
{
return;
}
level notify( "rocket_two_launching" );
level.rocket_2_state = "launching";
self moveto( self.origin + (0,0, ROCKET_2_LAUNCH_HEIGHT ), ROCKET_2_LAUNCH_TIME, ROCKET_2_LAUNCH_TIME/2 );
// When the rocket gets destroyed, cancel the launch with a small move
level waittill( "rocket_2_destroyed" );
self moveto( self.origin + (0,0,1), 1 );
}
// FX and sound for for rocket 2
rocket_two_fx()
{
level endon( "rocket_2_destroyed" );
self playsound("rocket_launch_close"); //plays the rocket launching sequence sound
level waittill( "rocket_2_done_moving" );
wait ROCKET_2_LAUNCH_FX_DELAY;
//iprintln( "rocket 2 fx" );
exploder("rocketlaunch_base_smoke_jets");
exploder("rocketlaunch_base_sparkjets");
wait 5;
exploder("rocketlaunch_jet_ignite");
//wait 2;
//exploder("rocketlaunch_exhaust_01");
wait 5;
// JR - Turning this off cause it causes a crash
PlayFXOnTag( level._effect[ "nx_smoke_rocket_afterburner_liftoff" ], self, "j_tag_booster" );
wait 1;
exploder("rocketlaunch_blast");
self playloopsound("rocket_launch_loop"); //looping rocket sound for when it goes in the air forever
// Stop FX with:
thread stop_rocket_two_prelaunch_fx_on_destroy( self );
thread stop_rocket_two_afterburn_fx_on_destroy( self );
thread stop_rocket_two_prelaunch_fx_on_wait();
}
stop_rocket_two_prelaunch_fx_on_destroy( rocket_two )
{
level endon( "rocket_two_launching" );
flag_Wait( "rocket_2_destroyed" );
stop_exploder_nx( "rocketlaunch_base_smoke_jets" );
stop_exploder_nx( "rocketlaunch_base_sparkjets" );
stop_exploder_nx( "rocketlaunch_jet_ignite" );
stop_exploder_nx( "rocketlaunch_blast" );
StopFXOnTag( level._effect[ "nx_smoke_rocket_afterburner_liftoff" ], rocket_two, "j_tag_booster" );
}
stop_rocket_two_prelaunch_fx_on_wait()
{
level waittill( "rocket_two_launching" );
stop_exploder_nx( "rocketlaunch_base_smoke_jets" );
stop_exploder_nx( "rocketlaunch_base_sparkjets" );
stop_exploder_nx( "rocketlaunch_jet_ignite" );
wait 18;
stop_exploder_nx( "rocketlaunch_blast" );
}
stop_rocket_two_afterburn_fx_on_destroy( rocket_two )
{
flag_Wait( "rocket_2_destroyed" );
StopFXOnTag( level._effect[ "nx_smoke_rocket_afterburner_liftoff" ], rocket_two, "j_tag_booster" );
}
//*******************************************************************
// *
// ROCKET THREE *
// *
//*******************************************************************
rocket_three_anim()
{
// Get anim node
anim_node = getEnt( "vignette_nx_rocket_explosion_03", "targetname" );
//=============================================
// SETUP THE PIECES
//=============================================
rocket_three = spawn_anim_model("rocket_shuttle_exp1_010");
rocket_three.origin = anim_node.origin;
rocket_three.angles = anim_node.angles;
// Link rocket to node
rocket_three linkTo( anim_node );
// Link collision cylinder to anim node
damage_detector = GetEnt( "damage_detector_r3", "script_noteworthy" );
damage_detector linkTo( anim_node );
// Link target indicator node to the anim node
target_indicator = GetEnt( "rocketexplode_03", "script_noteworthy" );
target_indicator linkTo( anim_node );
// Start the rocket below ground
anim_node.origin = anim_node.origin + (0,0, ROCKET_3_INITIAL_DEPTH );
// Start the gantry below ground
thread gantry_setup_three();
script_models = [];
script_models["rocket_shuttle_exp1_010"] = rocket_three;
anim_node anim_first_frame( script_models, "rocket_shuttle_exp1");
// Set the initial rocket state
level.rocket_3_state = "waiting";
// Handle rocket movement and FX
anim_node thread move_rocket_three();
anim_node thread launch_rocket_three();
rocket_three thread rocket_three_fx();
//========================================
// Wait for the rocket to be destroyed
//========================================
level waittill( "rocket_3_destroyed" );
// Determine which anim should play
explosion_anim = undefined;
explosion_models = [];
//==========================================================
//==========================================================
if( level.rocket_3_state == "waiting" )
{
explosion_anim = "rocket_shuttle_exp1";
thread maps\nx_rocket_fx::rocket_03_hit_fx( rocket_three );
}
//==========================================================
//==========================================================
else if( level.rocket_3_state == "launching" )
{
explosion_anim = "rocket_shuttle_exp1";
thread maps\nx_rocket_fx::rocket_03_launch_hit_fx( rocket_three );
}
//==========================================================
//==========================================================
// Play Sounds
//rocket_three PlaySound( "scn_rocket_lrgrocketexplo" );
rocket_three StopLoopSound( "rocket_launch_loop" );
// Play the anim
anim_node anim_single( script_models, explosion_anim );
anim_node delete();
}
// Moves the rocket up out of the ground
move_rocket_three()
{
level endon( "rocket_3_destroyed" );
wait ROCKET_3_RISE_DELAY;
self thread move_gantry_inner_three();
self thread move_gantry_outer_three();
level.rocket_3_state = "rising";
//iprintln( "r3 rising" );
self moveto( self.origin + (0,0, ROCKET_3_INITIAL_DEPTH * -1 ), ROCKET_3_RISE_TIME );
self waittill( "movedone" );
level notify( "rocket_3_done_moving" );
level.rocket_3_state = "waiting";
//iprintln( "r3 done rising" );
wait 20;
thread maps\nx_rocket_section_base_alpha::animate_gantry_arms( "gantry_inner_3" );
}
gantry_setup_three()
{
// Get all Ents in the Outer Gantry prefab
gantry_parts = GetEntArray ("gantry_outer_3", "script_noteworthy");
// Teleport them under ground
foreach( part in gantry_parts )
{
if( part.classname == "script_brushmodel" || part.classname == "script_model")
{
part.origin = ( part.origin + (0, 0, (ROCKET_3_INITIAL_DEPTH + 600)));
}
}
// Get all Ents in the Inner Gantry prefab
gantry_parts = GetEntArray ("gantry_inner_3", "script_noteworthy");
// Teleport them under ground
foreach( part in gantry_parts )
{
if( part.classname == "script_brushmodel" || part.classname == "script_model")
{
part.origin = ( part.origin + (0, 0, ROCKET_3_INITIAL_DEPTH ));
}
}
}
move_gantry_outer_three()
{
// Get all Ents in the Gantry prefab
gantry_parts = GetEntArray ("gantry_outer_3", "script_noteworthy");
// Move them in sync with the rocket
// But stop 600 units short, 5 seconds sooner
foreach( part in gantry_parts )
{
if( part.classname == "script_brushmodel" || part.classname == "script_model")
{
part MoveTo( part.origin + (0, 0, ((ROCKET_3_INITIAL_DEPTH * -1) - 600)), (ROCKET_3_RISE_TIME - 5), 2, 2 );
}
}
}
move_gantry_inner_three()
{
// Get all Ents in the Gantry prefab
gantry_parts = GetEntArray ("gantry_inner_3", "script_noteworthy");
// Move them in sync with the rocket
foreach( part in gantry_parts )
{
if( part.classname == "script_brushmodel" || part.classname == "script_model")
{
part MoveTo( part.origin + (0, 0, (ROCKET_3_INITIAL_DEPTH * -1)), ROCKET_3_RISE_TIME, 2, 2 );
}
}
}
launch_rocket_three()
{
// Wait for pre-launch FX to finish
level waittill( "rocket_3_done_moving" );
level thread maps\nx_rocket_util::launch_coutdown_logic( ROCKET_3_LAUNCH_DELAY, 3, "rocket_3_destroyed" );
wait ROCKET_3_LAUNCH_DELAY;
// Check to see if the rocket was popped before launching
if( flag( "rocket_3_destroyed" ))
{
return;
}
level notify( "rocket_three_launching" );
level.rocket_3_state = "launching";
self moveto( self.origin + (0,0, ROCKET_3_LAUNCH_HEIGHT ), ROCKET_3_LAUNCH_TIME, ROCKET_3_LAUNCH_TIME/2 );
// When the rocket gets destroyed, cancel the launch with a small move
level waittill( "rocket_3_destroyed" );
self moveto( self.origin + (0,0,1), 1 );
}
// FX and sound for for rocket 3
rocket_three_fx()
{
level endon( "rocket_3_destroyed" );
self playsound("rocket_launch_close"); //plays the rocket launching sequence sound
level waittill( "rocket_3_done_moving" );
wait ROCKET_3_LAUNCH_FX_DELAY;
//iprintln( "rocket 3 fx" );
exploder("rocketlaunch03_base_smoke_jets");
exploder("rocketlaunch03_base_sparkjets");
wait 7;
exploder("rocketlaunch03_jet_ignite");
//wait 2;
//exploder("rocketlaunch_exhaust_01");
wait 5;
// JR - Turning this off cause it causes a crash
PlayFXOnTag( level._effect[ "nx_smoke_rocket_afterburner_liftoff" ], self, "j_tag_booster" );
wait 1;
exploder("rocketlaunch03_exhaust_01");
self playloopsound("rocket_launch_loop"); //looping rocket sound for when it goes in the air forever
thread stop_rocket_three_prelaunch_fx_on_destroy( self );
thread stop_rocket_three_afterburn_fx_on_destroy( self );
thread stop_rocket_three_prelaunch_fx_on_wait();
}
stop_rocket_three_prelaunch_fx_on_destroy( rocket_three )
{
level endon( "rocket_three_launching" );
flag_Wait( "rocket_3_destroyed" );
stop_exploder_nx( "rocketlaunch03_base_smoke_jets" );
stop_exploder_nx( "rocketlaunch03_base_sparkjets" );
stop_exploder_nx( "rocketlaunch03_jet_ignite" );
stop_exploder_nx( "rocketlaunch03_exhaust_01" );
StopFXOnTag( level._effect[ "nx_smoke_rocket_afterburner_liftoff" ], rocket_three, "j_tag_booster" );
}
stop_rocket_three_prelaunch_fx_on_wait()
{
level waittill( "rocket_three_launching" );
stop_exploder_nx( "rocketlaunch03_base_smoke_jets" );
stop_exploder_nx( "rocketlaunch03_base_sparkjets" );
stop_exploder_nx( "rocketlaunch03_jet_ignite" );
wait 18;
stop_exploder_nx( "rocketlaunch03_exhaust_01" );
}
stop_rocket_three_afterburn_fx_on_destroy( rocket_three )
{
flag_Wait( "rocket_3_destroyed" );
StopFXOnTag( level._effect[ "nx_smoke_rocket_afterburner_liftoff" ], rocket_three, "j_tag_booster" );
}
//*******************************************************************
// *
// ROCKET FOUR *
// *
//*******************************************************************
rocket_four_anim()
{
// Get anim node
anim_node = getEnt( "vignette_nx_rocket_explosion_04", "targetname" );
//=============================================
// SETUP THE PIECES
//=============================================
rocket_four = spawn_anim_model("rocket_shuttle_exp1_010");
rocket_four.origin = anim_node.origin;
rocket_four.angles = anim_node.angles;
// Link rocket to node
rocket_four linkTo( anim_node );
// Link collision cylinder to anim node
damage_detector = GetEnt( "damage_detector_r4", "script_noteworthy" );
damage_detector linkTo( anim_node );
// Link target indicator node to the anim node
target_indicator = GetEnt( "rocketexplode_04", "script_noteworthy" );
target_indicator linkTo( anim_node );
// Start the rocket below ground
anim_node.origin = anim_node.origin + (0,0, ROCKET_4_INITIAL_DEPTH );
// Start the gantry below ground
thread gantry_setup_four();
script_models = [];
script_models["rocket_shuttle_exp1_010"] = rocket_four;
anim_node anim_first_frame( script_models, "rocket_shuttle_exp1");
// Handle rocket movement and FX
anim_node thread move_rocket_four();
anim_node thread launch_rocket_four();
rocket_four thread rocket_four_fx();
//========================================
// Wait for the rocket to be destroyed
//========================================
level waittill( "rocket_4_destroyed" );
// Determine which anim should play
explosion_anim = undefined;
explosion_models = [];
//==========================================================
//==========================================================
if( level.rocket_4_state == "rising" )
{
explosion_anim = "rocket_shuttle_exp1";
thread maps\nx_rocket_fx::rocket_04_hit_fx( rocket_four );
}
//==========================================================
//==========================================================
else if( level.rocket_4_state == "waiting" )
{
explosion_anim = "rocket_shuttle_exp1";
thread maps\nx_rocket_fx::rocket_04_hit_fx( rocket_four);
}
//==========================================================
//==========================================================
else if( level.rocket_4_state == "launching" )
{
explosion_anim = "rocket_shuttle_exp1";
thread maps\nx_rocket_fx::rocket_04_launch_hit_fx( rocket_four );
}
//==========================================================
//==========================================================
// Play Sounds
//rocket_four PlaySound( "scn_rocket_lrgrocketexplo" );
rocket_four StopLoopSound( "rocket_launch_loop" );
// Play the anim
anim_node anim_single( script_models, explosion_anim );
anim_node delete();
}
// Moves the rocket and gantry up out of the ground
move_rocket_four()
{
level endon( "rocket_4_destroyed" );
// JR - There should be a flag wait here triggered by a heli node
wait ROCKET_4_RISE_DELAY;
//flag_wait( "chopper_path_entering_base_alpha" );
self thread move_gantry_inner_four();
self thread move_gantry_outer_four();
level.rocket_4_state = "rising";
//iprintln( "r4 rising" );
self moveto( self.origin + (0,0, ROCKET_4_INITIAL_DEPTH * -1 ), ROCKET_4_RISE_TIME );
self waittill( "movedone" );
level notify( "rocket_4_done_moving" );
level.rocket_4_state = "waiting";
//iprintln( "r4 done rising" );
wait 20;
thread maps\nx_rocket_section_base_alpha::animate_gantry_arms( "gantry_inner_4" );
}
gantry_setup_four()
{
// Get all Ents in the Outer Gantry prefab
gantry_parts = GetEntArray ("gantry_outer_4", "script_noteworthy");
// Teleport them under ground
foreach( part in gantry_parts )
{
if( part.classname == "script_brushmodel" || part.classname == "script_model")
{
part.origin = ( part.origin + (0, 0, (ROCKET_4_INITIAL_DEPTH + 600)));
}
}
// Get all Ents in the Inner Gantry prefab
gantry_parts = GetEntArray ("gantry_inner_4", "script_noteworthy");
// Teleport them under ground
foreach( part in gantry_parts )
{
if( part.classname == "script_brushmodel" || part.classname == "script_model")
{
part.origin = ( part.origin + (0, 0, ROCKET_4_INITIAL_DEPTH ));
}
}
}
move_gantry_outer_four()
{
// Get all Ents in the Gantry prefab
gantry_parts = GetEntArray ("gantry_outer_4", "script_noteworthy");
// Move them in sync with the rocket
// But stop 600 units short, 5 seconds sooner
foreach( part in gantry_parts )
{
if( part.classname == "script_brushmodel" || part.classname == "script_model")
{
part MoveTo( part.origin + (0, 0, ((ROCKET_4_INITIAL_DEPTH * -1) - 600)), (ROCKET_4_RISE_TIME - 5), 2, 2 );
}
}
}
move_gantry_inner_four()
{
// Get all Ents in the Gantry prefab
gantry_parts = GetEntArray ("gantry_inner_4", "script_noteworthy");
// Move them in sync with the rocket
foreach( part in gantry_parts )
{
if( part.classname == "script_brushmodel" || part.classname == "script_model")
{
part MoveTo( part.origin + (0, 0, (ROCKET_4_INITIAL_DEPTH * -1)), ROCKET_4_RISE_TIME, 2, 2 );
}
}
}
launch_rocket_four()
{
// Wait for pre-launch FX to finish
level waittill( "rocket_4_done_moving" );
level thread maps\nx_rocket_util::launch_coutdown_logic( ROCKET_4_LAUNCH_DELAY, 4, "rocket_4_destroyed" );
wait ROCKET_4_LAUNCH_DELAY;
// Check to see if the rocket was popped before launching
if( flag( "rocket_4_destroyed" ))
{
return;
}
level notify( "rocket_four_launching" );
level.rocket_4_state = "launching";
self moveto( self.origin + (0,0, ROCKET_4_LAUNCH_HEIGHT ), ROCKET_4_LAUNCH_TIME, ROCKET_4_LAUNCH_TIME/4 );
// When the rocket gets destroyed, cancel the launch with a small move
level waittill( "rocket_4_destroyed" );
self moveto( self.origin + (0,0,1), 1 );
}
// FX and sound for for rocket 4
rocket_four_fx()
{
level endon( "rocket_4_destroyed" );
self playsound("rocket_launch_close"); //plays the rocket launching sequence sound
wait ROCKET_4_FX_DELAY;
//iprintln( "rocket 4 fx" );
exploder("rocketlaunch04_base_smoke_jets");
exploder("rocketlaunch04_base_sparkjets");
wait 8;
exploder("rocketlaunch04_jet_ignite");
wait 2;
//exploder("rocketlaunch_exhaust_01");
wait 9;
PlayFXOnTag( level._effect[ "nx_smoke_rocket_afterburner_liftoff" ], self, "j_tag_booster" );
wait 1;
exploder("rocketlaunch04_blast");
self playloopsound("rocket_launch_loop"); //looping rocket sound for when it goes in the air forever
// Stop FX with:
thread stop_rocket_four_prelaunch_fx_on_destroy( self );
thread stop_rocket_four_afterburn_fx_on_destroy( self );
thread stop_rocket_four_prelaunch_fx_on_wait();
}
stop_rocket_four_prelaunch_fx_on_destroy( rocket_four )
{
level endon( "rocket_four_launching" );
flag_Wait( "rocket_4_destroyed" );
stop_exploder_nx( "rocketlaunch04_base_smoke_jets" );
stop_exploder_nx( "rocketlaunch04_base_sparkjets" );
stop_exploder_nx( "rocketlaunch04_jet_ignite" );
stop_exploder_nx( "rocketlaunch04_blast" );
StopFXOnTag( level._effect[ "nx_smoke_rocket_afterburner_liftoff" ], rocket_four, "j_tag_booster" );
}
stop_rocket_four_prelaunch_fx_on_wait()
{
level waittill( "rocket_four_launching" );
stop_exploder_nx( "rocketlaunch04_base_smoke_jets" );
stop_exploder_nx( "rocketlaunch04_base_sparkjets" );
stop_exploder_nx( "rocketlaunch04_jet_ignite" );
wait 18;
stop_exploder_nx( "rocketlaunch04_blast" );
}
stop_rocket_four_afterburn_fx_on_destroy( rocket_four )
{
flag_Wait( "rocket_4_destroyed" );
StopFXOnTag( level._effect[ "nx_smoke_rocket_afterburner_liftoff" ], rocket_four, "j_tag_booster" );
}
//*******************************************************************
// *
// *
//*******************************************************************
// Deletes a rocket
// JR - May not be needed
cleanup_rocket( rocket_name )
{
rocket = GetEnt( rocket_name, "targetname" );
rocket delete();
}
// Fails the mission if rocket 4 isnt destroyed in the next 5 seconds
check_delta_fail_window( flag, fail_text )
{
level endon( flag );
// Check the rocket
if( !flag( flag ))
{
// If they got this far and the rockets havnt popped, they fail.
SetDvar( "ui_deadquote", fail_text );
maps\_utility::missionFailedWrapper();
}
}
//*******************************************************************
// *
// *
//*******************************************************************
// Flips a flag once all 3 rockets in this section are destroyed
watch_for_rocket_destruction()
{
flag_wait( "rocket_4_destroyed" );
flag_wait( "rocket_3_destroyed" );
flag_wait( "rocket_2_destroyed" );
flag_set( "base_delta_destroyed" );
}
// Quick and easy way to move the gantry, one piece at a time
move_gantry_piece( offset, time )
{
self MoveTo( self.origin + offset, time );
}