mirror of
https://github.com/reaaLx/nx1-gsc-dump.git
synced 2025-04-19 07:42:54 +00:00
1770 lines
62 KiB
Plaintext
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 );
|
|
}
|