//**************************************************************************** // ** // Confidential - (C) Activision Publishing, Inc. 2010 ** // ** //**************************************************************************** // ** // Module: NX_ROCKET_SECTION_BASE_ALPHA ** // ** // Created: 7/13/2011 - Justin Rote ** // ** //**************************************************************************** #include maps\_utility; #include common_scripts\utility; #include maps\_anim; #include maps\_vehicle; ROCKET_1_INITIAL_DEPTH = -2750; // How deep underground rocket 2 starts ROCKET_1_RISE_DELAY = 10; // Delay before it starts rising ROCKET_1_RISE_TIME = 35; // How long it takes for rocket 2 to emerge ROCKET_1_LAUNCH_FX_DELAY = 25; // Delay untill prelaunch FX start ROCKET_1_LAUNCH_DELAY = 42; // Initial delay before it launches ROCKET_1_LAUNCH_HEIGHT = 16000; // How high it launches into the air ROCKET_1_LAUNCH_TIME = 18; // How long it takes to launch ( effects upward speed ) //******************************************************************* // * // BASE ALPHA - First rocket valley * // * //******************************************************************* start() { maps\nx_rocket_section_intro::start_railgun_ride( "heli_start_ride_p1", "gameplay" ); // "Destroy launch site Alpha" Objective_Add( obj( "OBJ_DESTROY_BASE_ALPHA" ), "active", &"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" ); // Spawn looping chopper allies level.intro_ally_1 = spawn_vehicle_from_targetname_and_drive( "base_alpha_loop_ally_1" ); level.intro_ally_2 = spawn_vehicle_from_targetname_and_drive( "base_alpha_loop_ally_2" ); // 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() { // FX for Rocket01 Prelaunch and Intro FX cleanup //thread maps\nx_rocket_fx::rocket_01_prelaunch_fx(); thread maps\nx_rocket_fx::rocket_introfx_cleanup(); thread maps\nx_rocket_fx::rocket01_gantrylights_fx(); // Enemy spawnfuncs array_spawn_function_targetname( "base_alpha_roof_runners_1", maps\nx_rocket_util::run_to_goal_then_aggro ); array_spawn_function_targetname( "base_alpha_roof_runners_2", maps\nx_rocket_util::run_to_goal_then_aggro ); array_spawn_function_targetname( "base_alpha_garage_guys", maps\nx_rocket_util::run_to_goal_then_aggro ); // Sets up and waits for rocket one destruction thread rocket_one_anim(); thread mission_fail_logic(); thread chopper_transition_to_bridge(); // Main player chopper control script for this section level.playerHeli thread chopper_path_base_alpha(); //rocket launch VO announcements for section level thread maps\nx_rocket_audio::base_alpha_countdown_sfx(); // Watch for railgun impacts on various secondary targets thread railgun_damage_watcher(); } //******************************************************************* // * // * //******************************************************************* section_precache() { // Temp weapon FX used for railgun PrecacheItem( "nx_rocket_railgun" ); PrecacheItem( "nx_rocket_railgun_secondary" ); PrecacheItem( "rpg_straight" ); // tagMJS 10/18/2011 - 3D reticule no longer being used // Precache the reticule pieces //PreCacheModel("nx_reticule_outer_ring"); //PreCacheModel("nx_reticule_middle_ring"); //PreCacheModel("nx_reticule_inner_ring"); //PreCacheModel("nx_reticule_triangle"); //PreCacheModel("nx_reticule_ticks"); // DPad Icon precacheShader( "dpad_laser_designator" ); // railgun target icons preCacheShader( "railgun_target_base" ); preCacheShader( "railgun_target_offscreen" ); preCacheShader( "railgun_trajectory_dot_white" ); preCacheShader( "railgun_trajectory_dot_red" ); // Setup hint strings add_hint_string( "hint_railgun_activate", &"NX_ROCKET_HINT_RAILGUN_ACTIVATE", ::hint_railgun_activate ); add_hint_string( "hint_railgun_lock", &"NX_ROCKET_HINT_RAILGUN_LOCK", ::hint_railgun_lock ); preCacheShader( "ac130_overlay_grain" ); // SLAMRAAM PreCacheItem( "slamraam_missile_dcburning" ); precacheModel( "vehicle_slamraam_destroyed" ); } section_flag_inits() { flag_init( "player_on_minigun" ); flag_init( "player_off_minigun" ); // Whether the player can use the railgun or not flag_init( "railgun_available" ); flag_init( "player_activated_railgun" ); flag_init( "player_used_railgun" ); flag_init( "rocket_1_destroyed" ); flag_init( "chopper_path_entering_base_alpha" ); flag_init( "chopper_path_after_reveal" ); flag_init( "chopper_ride_starting_rocket_one_loop" ); flag_init( "chopper_path_leaving_base_alpha" ); } //******************************************************************* // * // * //******************************************************************* // Main chopper control script for this section chopper_path_base_alpha() { // FLAG: chopper_ride_approaching_base_alpha flag_wait( "chopper_ride_approaching_base_alpha" ); // SAM Turrets level.alpha_sam_turrets= []; level.alpha_sam_turrets[level.alpha_sam_turrets.size] = thread maps\nx_rocket_section_base_delta::sam_turret_init ("base_alpha_sam_turret_1", "chopper_path_alpha_bunker_roof"); level.alpha_sam_turrets[level.alpha_sam_turrets.size] = thread maps\nx_rocket_section_base_delta::sam_turret_init ("base_alpha_sam_turret_2", "chopper_ride_starting_rocket_one_loop"); level.alpha_sam_turrets[level.alpha_sam_turrets.size] = thread maps\nx_rocket_section_base_delta::sam_turret_init ("base_alpha_sam_turret_3", "chopper_path_after_reveal"); // Dialogue for first base thread base_alpha_dialogue(); thread base_alpha_dialogue_launch(); // FLAG: chopper_path_entering_base_alpha flag_wait( "chopper_path_entering_base_alpha" ); // Add an attractor to the chopper //level.playerHeli.attractor = missile_createAttractorEnt( level.playerHeli, 25000, 40000 ); //level.playerHeli.repulsor = missile_createRepulsorEnt( level.playerHeli, 15000, 5000 ); // Add weak attractors to the allied choppers level.intro_ally_1.attractor = missile_createAttractorEnt( level.intro_ally_1, 15000, 20000 ); level.intro_ally_2.attractor = missile_createAttractorEnt( level.intro_ally_2, 15000, 20000 ); //========================== // SETUP RAILGUN TARGETS //========================== // Spawn TEMP ground troops // TagCC: Also give these guys a spawn function to decrease their accuracy when the player's helicopter is facing away. array_spawn_function_targetname("base_alpha_guys_1", maps\nx_rocket_util::protect_player_helicopter_rear ); array_spawn_function_targetname("base_alpha_guys_2", maps\nx_rocket_util::protect_player_helicopter_rear ); level.base_alpha_guys_1 = maps\nx_rocket_util::spawn_guys_from_targetname( "base_alpha_guys_1" ); level.base_alpha_guys_2 = maps\nx_rocket_util::spawn_guys_from_targetname( "base_alpha_guys_2" ); level.base_alpha_guys_3 = maps\nx_rocket_util::spawn_guys_from_targetname( "base_alpha_guys_3" ); // Spawn stationary ground vehicles // JR - These were replaced with destructibles //level.base_alpha_vehicles_static = spawn_vehicles_from_targetname( "base_alpha_vehicles_static" ); // Spawn pathing ground vehicles level.base_alpha_vehicles_pathing = spawn_vehicles_from_targetname_and_drive( "base_alpha_vehicles_pathing" ); maps\nx_rocket_util::protect_player_helicopter_rear_from_each_vehicle( level.base_alpha_vehicles_pathing ); level.blackhawk_targets = level.base_alpha_vehicles_pathing; // Setup rocket targets level.base_alpha_rocket = getent( "railgun_rocket_alpha_target", "targetname" ); // Setup building targets //level.base_alpha_buildings = []; //level.base_alpha_buildings = GetEntArray( "base_alpha_buildings", "targetname" ); //========================== //========================== // Set the current area // This is used to determine what railgun targets to use level.current_area = "base_alpha"; // DEBUG // JR - Uncomment this if you want the railgun usable immediatly //maps\nx_rocket_railgun::enable_railgun(); // DEBUG // Turn down accuracy on allied choppers level.intro_ally_1 thread maps\nx_rocket_util::set_ally_chopper_spread( 8 ); level.intro_ally_2 thread maps\nx_rocket_util::set_ally_chopper_spread( 8 ); level.intro_ally_1.health *= 2; level.intro_ally_2.health *= 2; level.alpha_littlebird_01 = spawn_vehicle_from_targetname_and_drive( "alpha_littlebird_01" ); level.alpha_littlebird_01 maps\nx_rocket_util::set_ally_chopper_spread( 4 ); level.alpha_littlebird_01 thread maps\nx_rocket_util::vehicle_follow( level.playerHeli, 500, 5, 140, level.playerHeli ); level.alpha_littlebird_02 = vehicle_spawn( GetEnt( "alpha_littlebird_02", "targetname" ) ); Target_Remove( level.alpha_littlebird_02 ); level.alpha_littlebird_02 godon(); level.alpha_littlebird_02.perferred_crash_location = GetEnt ("helipad_rooftop_crash_location", "targetname"); level.alpha_littlebird_02 maps\nx_rocket_util::set_ally_chopper_spread( 4 ); level.alpha_littlebird_02 thread littlebird_liftoff( "alpha_littlebird_02", 550 ); level.tunnel_humvee_02 = spawn_vehicle_from_targetname_and_drive( "tunnel_humvee_02" ); maps\nx_rocket_util::protect_player_helicopter_rear_from_each_vehicle( level.tunnel_humvee_02 ); level.blackhawk_targets = array_add( level.blackhawk_targets, level.tunnel_humvee_02 ); // Spawn heli that will crash crash_chopper = spawn_vehicle_from_targetname_and_drive( "base_alpha_crash_ally" ); crash_chopper thread wait_and_crash(); // FLAG: chopper_path_alpha_bunkers flag_wait( "chopper_path_alpha_bunkers" ); thread do_roof_guys_2(); level.garage_apc = spawn_vehicle_from_targetname_and_drive( "garage_apc" ); level.garage_apc.kill_player_time = 5; maps\nx_rocket_util::protect_player_helicopter_rear_from_each_vehicle( level.garage_apc ); level.garage_apc mgon(); ally_copters = [ level.intro_ally_1, level.intro_ally_2 ]; thread maps\nx_rocket_section_intro::allies_choose_targets( ally_copters ); level.garage_apc thread maps\nx_rocket_util::apc_turret_logic( level.playerHeli, ally_copters ); // FLAG: chopper_path_alpha_roof flag_wait( "chopper_path_alpha_bunker_roof" ); thread do_roof_guys_1(); thread do_garage_guys(); // FLAG: chopper_ride_bunkers_done flag_wait( "chopper_ride_tunnel_humvee_go" ); level.tunnel_humvee_01 = spawn_vehicle_from_targetname_and_drive( "tunnel_humvee_01" ); maps\nx_rocket_util::protect_player_helicopter_rear_from_each_vehicle( level.tunnel_humvee_01 ); level.blackhawk_targets = array_add( level.blackhawk_targets, level.tunnel_humvee_01 ); level.base_alpha_guys_4 = maps\nx_rocket_util::spawn_guys_from_targetname( "base_alpha_guys_4" ); // Allow railgun usage flag_wait( "chopper_ride_starting_rocket_one_loop" ); wait 8.0; maps\nx_rocket_railgun::enable_railgun(); // Display tooltip "Press D-Pad Right to activate Railgun targeter" level._player display_hint( "hint_railgun_activate" ); // JR - Probably need a nag loop here telling the player to fire the railgun thread maps\nx_rocket_util::nag_for_fire_railgun( "railgun_fired" ); flag_wait( "player_activated_railgun" ); wait 0.5; // Display tooltip "Press RT to lock and fire Railgun" level._player display_hint( "hint_railgun_lock" ); // FLAG: chopper_path_leaving_base_alpha // Leaving the area flag_wait( "chopper_path_leaving_base_alpha" ); thread cleanup_base_alpha_ents(); // Remove the chopper attractor //missile_DeleteAttractor( level.playerHeli.attractor ); //missile_DeleteAttractor( level.playerHeli.repulsor ); // Disable railgun usage maps\nx_rocket_railgun::disable_railgun(); } // Spawns some guys on the roof, and makes them run do_roof_guys_1() { array_spawn_function_targetname("base_alpha_roof_runners_1", maps\nx_rocket_util::protect_player_helicopter_rear ); level.base_alpha_roof_guys_1 = maps\nx_rocket_util::spawn_guys_from_targetname( "base_alpha_roof_runners_1" ); } // Spawns some guys on the roof, and makes them run do_roof_guys_2() { array_spawn_function_targetname("base_alpha_roof_runners_2", maps\nx_rocket_util::protect_player_helicopter_rear ); level.base_alpha_roof_guys_2 = maps\nx_rocket_util::spawn_guys_from_targetname( "base_alpha_roof_runners_2" ); } // Spawns guys in the garage, who run out do_garage_guys() { array_spawn_function_targetname("base_alpha_garage_guys", maps\nx_rocket_util::protect_player_helicopter_rear ); level.base_alpha_garage_guys = maps\nx_rocket_util::spawn_guys_from_targetname( "base_alpha_garage_guys" ); } littlebird_liftoff( liftoff_flag, liftoff_height ) { // self endon( "death" ); self maps\nx_rocket_util::vehicle_enable_fire( false ); flag_wait( liftoff_flag ); if ( !Target_IsTarget ( self )) { Target_Set ( self, ( 0, 0, -55 ) ); target_setshader( self, "javelin_hud_target_red" ); } self vehicle_liftoff( liftoff_height ); self maps\nx_rocket_util::vehicle_enable_fire( true ); self GoPath(); self thread maps\nx_rocket_util::vehicle_follow( level.playerHeli, 500, 5, 140, level.playerHeli ); // Make it destroyable once it's airborne self godoff(); // if it crashes, kill anyone nearby the crash site self waittill ("crash_done"); foreach ( guy in level.base_alpha_roof_guys_2) { if ( isAlive ( guy )) guy kill(); } } // Allied chopper gets shot down wait_and_crash() { //attractor = missile_createAttractorEnt( self, 100000, 60000 ); //wait 1.0; //missile_origin = getent( "heli_crash_missile_origin", "targetname" ); //MagicBullet( "rpg_player", missile_origin.origin, self.origin ); flag_wait( "alpha_chopper_blow_up" ); num_rounds = RandomIntRange( 2, 4 ); self.missile_attractor = Missile_CreateAttractorEnt( self, 50000, 8000 ); for( i = 0; i < num_rounds; i++ ) { start_offset = AnglesToForward( self.angles ) * 1000 + random_vector( RandomFloatRange( 750, 1200 ) ); start_offset = ( start_offset[0], start_offset[1], -1400 ); end_offset = AnglesToForward( self.angles ) * 100; bullet_start = self.origin + start_offset; bullet_end = self.origin + end_offset; rpg = MagicBullet( "rpg_straight", bullet_start, bullet_end ); wait 0.2; } wait 3.0; if( IsAlive( self ) ) self kill(); self notify( "newpath" ); //missile_deleteAttractor( attractor ); } // Fails the player if rocket 1 launches mission_fail_logic() { level endon( "rocket_1_destroyed" ); level waittill( "rocket_one_done_launching" ); SetDvar( "ui_deadquote", &"NX_ROCKET_ALPHA_FAIL" ); maps\_utility::missionFailedWrapper(); } //******************************************************************* // * // * //******************************************************************* // Setup and animation for the first rocket rocket_one_anim() { // Get anim node anim_node = getEnt( "vignette_nx_rocket_explosion_test_01", "targetname" ); //============================================= // SETUP THE PIECES //============================================= rocket_one = spawn_anim_model("rocket_shuttle_exp1_010"); rocket_one.origin = anim_node.origin; rocket_one.angles = anim_node.angles; // Link pieces to node rocket_one linkTo( anim_node ); // Link collision cylinder to anim node damage_detector = GetEnt( "damage_detector_r1", "script_noteworthy" ); damage_detector linkTo( anim_node ); // Link target indicator node to the anim node target_indicator = GetEnt( "railgun_rocket_alpha_target", "targetname" ); target_indicator linkTo( anim_node ); // Start the rocket below ground anim_node.origin = anim_node.origin + (0,0, ROCKET_1_INITIAL_DEPTH ); // Start the gantry below ground thread gantry_setup_one(); script_models = []; script_models["rocket_shuttle_exp1_010"] = rocket_one; anim_node anim_first_frame( script_models, "rocket_shuttle_exp1"); // Move the rocket up anim_node thread move_rocket_one(); anim_node thread launch_rocket_one(); rocket_one thread rocket_one_fx(); //======================================= // Wait for the rocket to be destroyed //======================================= level waittill( "rocket_1_destroyed" ); // Determine which anim should play explosion_anim = undefined; explosion_models = []; //========================================================== //========================================================== if( level.rocket_1_state == "rising" ) { explosion_anim = "rocket_shuttle_exp1"; thread maps\nx_rocket_fx::rocket_01_hit_fx( rocket_one ); } //========================================================== //========================================================== else if( level.rocket_1_state == "waiting" ) { explosion_anim = "rocket_shuttle_exp1"; thread maps\nx_rocket_fx::rocket_01_hit_fx( rocket_one ); } //========================================================== //========================================================== else if( level.rocket_1_state == "launching" ) { explosion_anim = "rocket_shuttle_exp1"; thread maps\nx_rocket_fx::rocket_01_launch_hit_fx( rocket_one ); } //========================================================== //========================================================== // Play the anim anim_node thread anim_single( script_models, explosion_anim ); // Play Sounds //rocket_one PlaySound( "scn_rocket_lrgrocketexplo" ); rocket_one StopLoopSound( "rocket_launch_loop" ); } // FX and sound for for rocket 4 rocket_one_fx() { level endon( "rocket_1_destroyed" ); self playsound("rocket_launch_close"); //plays the rocket launching sequence sound //need to change once global waits are in wait ROCKET_1_LAUNCH_FX_DELAY; exploder("rocketlaunch01_base_smoke_jets"); exploder("rocketlaunch01_base_sparkjets"); wait 8; exploder("rocketlaunch01_jet_ignite"); exploder("rocketlaunch01_prelaunch_light"); wait 6; //exploder("rocketlaunch_exhaust_01"); wait 5; PlayFXOnTag( level._effect[ "nx_smoke_rocket_afterburner_liftoff" ], self, "j_tag_booster" ); wait 1; exploder("rocketlaunch01_blast"); self playloopsound("rocket_launch_loop"); //looping rocket sound for when it goes in the air forever // Stop FX with: thread stop_rocket_one_prelaunch_fx_on_destroy( self ); thread stop_rocket_one_afterburn_fx_on_destroy( self ); thread stop_rocket_one_prelaunch_fx_on_wait(); } stop_rocket_one_prelaunch_fx_on_destroy( rocket_one ) { level endon( "rocket_one_launching" ); flag_Wait( "rocket_1_destroyed" ); stop_exploder_nx( "rocketlaunch01_base_smoke_jets" ); stop_exploder_nx( "rocketlaunch01_base_sparkjets" ); stop_exploder_nx( "rocketlaunch01_jet_ignite" ); stop_exploder_nx( "rocketlaunch01_prelaunch_light" ); stop_exploder_nx( "rocketlaunch01_blast" ); StopFXOnTag( level._effect[ "nx_smoke_rocket_afterburner_liftoff" ], rocket_one, "j_tag_booster" ); } stop_rocket_one_prelaunch_fx_on_wait() { level waittill( "rocket_one_launching" ); stop_exploder_nx( "rocketlaunch01_base_smoke_jets" ); stop_exploder_nx( "rocketlaunch01_base_sparkjets" ); stop_exploder_nx( "rocketlaunch01_jet_ignite" ); stop_exploder_nx( "rocketlaunch01_prelaunch_light" ); wait 18; stop_exploder_nx( "rocketlaunch01_blast" ); } stop_rocket_one_afterburn_fx_on_destroy( rocket_one ) { flag_Wait( "rocket_1_destroyed" ); StopFXOnTag( level._effect[ "nx_smoke_rocket_afterburner_liftoff" ], rocket_one, "j_tag_booster" ); } // Moves rocket 1 up out of its silo move_rocket_one() { flag_wait( "chopper_path_entering_base_alpha" ); self thread move_gantry_inner_one(); self thread move_gantry_outer_one(); level.rocket_1_state = "rising"; self moveto( self.origin + (0,0,(ROCKET_1_INITIAL_DEPTH * -1)), ROCKET_1_RISE_TIME ); self waittill( "movedone" ); //level notify( "rocket_1_done_moving" ); level.rocket_1_state = "waiting"; wait 1; thread animate_gantry_arms( "gantry_inner_1" ); } gantry_setup_one() { // Get all Ents in the Outer Gantry prefab gantry_parts = GetEntArray ("gantry_outer_1", "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_1_INITIAL_DEPTH + 600))); } } // Get all Ents in the Inner Gantry prefab gantry_parts = GetEntArray ("gantry_inner_1", "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_1_INITIAL_DEPTH )); } } } move_gantry_outer_one() { // Get all Ents in the Gantry prefab gantry_parts = GetEntArray ("gantry_outer_1", "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_1_INITIAL_DEPTH * -1) - 600)), (ROCKET_1_RISE_TIME - 5), 2, 2 ); } } } move_gantry_inner_one() { // Get all Ents in the Gantry prefab gantry_parts = GetEntArray ("gantry_inner_1", "script_noteworthy"); // Move them in sync with the rocket // But stop them at a lower point foreach( part in gantry_parts ) { if( part.classname == "script_brushmodel" || part.classname == "script_model") { part MoveTo( part.origin + (0, 0, (ROCKET_1_INITIAL_DEPTH * -1)), ROCKET_1_RISE_TIME, 2, 2 ); } } } animate_gantry_arms( gantry_script_noteworthy ) { gantry_arms_01 = undefined; gantry_arms_02 = undefined; gantry_hose_01 = undefined; anim_node = undefined; gantry_parts = GetEntArray ( gantry_script_noteworthy, "script_noteworthy"); // Get the anim node foreach ( part in gantry_parts ) { if( isDefined (part.targetname) && part.targetname == "vignette_gantry_arms_01" ) { anim_node = part; } } // Get all the gantry arms foreach( part in gantry_parts ) { if( isDefined (part.targetname) ) { // Assign them their roles in the animation switch( part.targetname ) { case "gantry_arms_01": gantry_arms_01 = part; gantry_arms_01 UseAnimTree( level._scr_animtree[ "gantry_arms_01" ] ); gantry_arms_01.animname = "gantry_arms_01"; break; case "gantry_arms_02": gantry_arms_02 = part; gantry_arms_02 UseAnimTree( level._scr_animtree[ "gantry_arms_02" ] ); gantry_arms_02.animname = "gantry_arms_02"; break; case "gantry_hose_01": gantry_hose_01 = part; gantry_hose_01 UseAnimTree( level._scr_animtree[ "gantry_hose_01" ] ); gantry_hose_01.animname = "gantry_hose_01"; break; } } } guys = []; guys["gantry_arms_01"] = gantry_arms_01; guys["gantry_arms_02"] = gantry_arms_02; guys["gantry_hose_01"] = gantry_hose_01; anim_node anim_single(guys, "gantry_arms_hose_01"); } // Waits for a long time, then launches rocket 1 launch_rocket_one() { flag_wait( "chopper_ride_starting_rocket_one_loop" ); level thread maps\nx_rocket_util::launch_coutdown_logic( ROCKET_1_LAUNCH_DELAY, 1, "rocket_1_destroyed" ); wait ROCKET_1_LAUNCH_DELAY; // Check to see if the rocket was popped before launching if( flag( "rocket_1_destroyed" )) { return; } level notify( "rocket_one_launching" ); level.rocket_1_state = "launching"; self moveto( self.origin + (0,0,ROCKET_1_LAUNCH_HEIGHT), ROCKET_1_LAUNCH_TIME, ROCKET_1_LAUNCH_TIME/2 ); self thread notify_on_launch(); // When the rocket gets destroyed, cancel the launch with a small move level waittill( "rocket_1_destroyed" ); self moveto( self.origin + (0,0,1), 1 ); } notify_on_launch() { self waittill( "movedone" ); level notify( "rocket_one_done_launching" ); } //******************************************************************* // * // * //******************************************************************* // Dialogue for this section base_alpha_dialogue() { baker = level.squad[ "ALLY_BAKER" ]; jenkins = level.squad[ "ALLY_JENKINS" ]; williams = level.squad[ "ALLY_WILLIAMS" ]; //Approaching target point Alpha. level thread play_dialogue( "roc_ded1_alpha_approachingalpha", 0.1 ); //Deadeye, do you have a visual on the target? level thread play_dialogue( "roc_dra_alpha_doyouhaveavisual", 2.4 ); //That's affirmative. We have eyes on candlestick 1. level thread play_dialogue( "roc_ded1_alpha_eyesoncandlestick1", 6.4 ); //Engage all ground targets! baker thread play_dialogue( "roc_bak_alpha_engagegroundtargets", 11.2 ); //Glassing multiple AV's inbound, north side of the gantry. level thread play_dialogue( "roc_ded3_alpha_glassingmultavs", 16.1 ); //EC Gunship, lifting off at 2 o'clock. baker thread play_dialogue( "roc_bak_alpha_gunshipat2oclock", 19.1 ); //Alpha, to be played at a lull, when player sees gantry rising up, after little bird crashes into bunker but before railgun vo: baker thread play_dialogue( "roc_bak_alpha_gantrymovingtolaunch", 30.1 ); //Crossbow, you are clear to engage. level thread play_dialogue( "roc_dra_alpha_xbowcleartoengage", 45.1 ); //Copy, Dragon. This is Lincoln fire control, standing by for fire mission. level thread play_dialogue( "roc_cro_alpha_lincolnfirecontrol", 48.2 ); flag_wait( "rocket_1_destroyed" ); //Ordnance On target. baker thread play_dialogue( "roc_bak_alpha_niceshot", 3.8 ); // //BDA is 1 for 1. Kill confirmed. // baker thread play_dialogue( "roc_bak_alpha_bda1for1", 2.3 ); //Deadeye, engage EC column oscar mike in grid square 3-6 Actual. level thread play_dialogue( "roc_dra_alpha_engagein36actual", 21.2 ); //Copy that, Dragon. Bugging out. level thread play_dialogue( "roc_ded1_alpha_copybuggingout", 27.0 ); /* // ALL RAILGUN VO IS DONE IN NX_ROCKET_RAILGUN. NOT SURE WHAT TO DO HERE //Target link active. level thread play_dialogue( "roc_cro_alpha_linkactive", 53.3 ); level waittill( "railgun_fired" ); //Target is lit. level thread play_dialogue( "roc_cro_delta_targetislit", 56 ); //Fire mission confirmed. Firing for effect. level thread play_dialogue( "roc_cro_alpha_firemissionconfirmed", 57.4 ); //TTI 3 seconds level thread play_dialogue( "roc_cro_alpha_tti3sec", 61.2 ); //2, 1… Splash. level thread play_dialogue( "roc_cro_alpha_21splash", 64.1 ); */ // //thread add_dialogue_line( "Baker", "Dragon 1-5, this is Deadeye 2-1.  We are in objective grid Uniform.", "w" ); //// maps\nx_rocket_util::wait_play_dialogue_wait( 0, "roc_bak_alpha_objgriduniform" ); // level.squad[ "ALLY_BAKER" ] maps\nx_rocket_util::actor_dialogue_queue( "roc_bak_alpha_objgriduniform" ); // // //thread add_dialogue_line( "Baker", "Objective Alpha-two in sight.", "w" ); //// maps\nx_rocket_util::wait_play_dialogue_wait( 0, "roc_bak_alpha_alpha2insight" ); // level.squad[ "ALLY_BAKER" ] maps\nx_rocket_util::actor_dialogue_queue( "roc_bak_alpha_alpha2insight" ); // // /* // //thread add_dialogue_line( "Command", "Roger that. Copy all.", "w" ); // maps\nx_rocket_util::wait_play_dialogue_wait( 0.5, "roc_cmd_alpha_rogercopyall" ); // */ // // //thread add_dialogue_line( "Baker", "Deadeye 2-4 is hit! I repeat Deadeye 2-4 is going down!", "w" ); //// maps\nx_rocket_util::wait_play_dialogue_wait( 0.5, "roc_bak_alpha_deadeyehit" ); // level.squad[ "ALLY_BAKER" ] maps\nx_rocket_util::actor_dialogue_queue( "roc_bak_alpha_deadeyehit", 0.5 ); // // //thread add_dialogue_line( "Baker", "Engage all ground targets!!", "w" ); //// maps\nx_rocket_util::wait_play_dialogue_wait( 1, "roc_bak_alpha_engageground" ); // level.squad[ "ALLY_BAKER" ] maps\nx_rocket_util::actor_dialogue_queue( "roc_bak_alpha_engageground", 1 ); // // // Bunker encounter // flag_wait( "chopper_path_alpha_bunkers" ); // //thread add_dialogue_line( "Baker", "Foot mobiles on the bunkers!", "w" ); //// maps\nx_rocket_util::wait_play_dialogue_wait( 1, "roc_bak_alpha_mobilesonbunkers" ); // level.squad[ "ALLY_BAKER" ] maps\nx_rocket_util::actor_dialogue_queue( "roc_bak_alpha_mobilesonbunkers", 1 ); // // flag_wait( "chopper_ride_tunnel_humvee_go" ); // //thread add_dialogue_line( "Baker", "Targets in the open!", "w" ); //// 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 ); // // // Starting the rocket loop // flag_wait( "chopper_ride_starting_rocket_one_loop" ); // //thread add_dialogue_line( "Command", "Deadeye 2-1, this is Dragon 1-5, railguns are online.", "w" ); // maps\nx_rocket_util::wait_play_dialogue_wait( 0, "roc_cmd_alpha_railgunsonline" ); // // //thread add_dialogue_line( "Command", "Continue to circle the objective until it is destroyed. Over.", "w" ); // maps\nx_rocket_util::wait_play_dialogue_wait( 0.4, "roc_cmd_alpha_circleobjective" ); // // //thread add_dialogue_line( "Baker", "Paint a target on that rocket!", "w" ); // //maps\nx_rocket_util::wait_play_dialogue_wait( 2.0, "roc_bak_alpha_paintrocket" ); // // // // On Fire // //level waittill( "railgun_fired" ); // //thread add_dialogue_line( "Baker", "This is deadeye 2-1, fire for effect. MOE rails, 1 round. On my lase. Authenticate Over.", "w" ); // //wait 3.0; // //thread add_dialogue_line( "Command", "This is dragon 1-5, copy all, I authenticate. Rail out, TOT one zero seconds.", "w" ); // // // // On Hit // flag_wait( "rocket_1_destroyed" ); // wait 2.5; // //// maps\nx_rocket_util::wait_play_dialogue_wait( 0.5, "roc_bak_alpha_niceshot" ); // level.squad[ "ALLY_BAKER" ] maps\nx_rocket_util::actor_dialogue_queue( "roc_bak_alpha_niceshot", 0.5 ); // // //thread add_dialogue_line( "Baker", "Let's keep moving.", "w" ); //// maps\nx_rocket_util::wait_play_dialogue_wait( 1.0, "roc_bak_alpha_keepmoving" ); // level.squad[ "ALLY_BAKER" ] maps\nx_rocket_util::actor_dialogue_queue( "roc_bak_alpha_keepmoving", 1 ); // // //thread add_dialogue_line( "Baker", "Roger that, en route to target site Bravo. Hang on.", "w" ); //// maps\nx_rocket_util::wait_play_dialogue_wait( 1.2, "roc_bak_alpha_enroutebravo" ); // level.squad[ "ALLY_BAKER" ] maps\nx_rocket_util::actor_dialogue_queue( "roc_bak_alpha_enroutebravo", 1.2 ); } /* railgun_fire_nag_loop() { level endon(); while( true ) { } } */ // Warn the player that the rocket is taking off base_alpha_dialogue_launch() { level endon( "rocket_1_destroyed" ); level waittill( "rocket_one_launching" ); // Baker: "It's taking off! Get a rail shot on it NOW!" // maps\nx_rocket_util::wait_play_dialogue_wait( 2.2, "roc_bak_alpha_railshotnow" ); level.squad[ "ALLY_BAKER" ] maps\nx_rocket_util::actor_dialogue_queue( "roc_bak_alpha_railshotnow", 2.2 ); } //******************************************************************* // * // * //******************************************************************* // Chopper finishes rocket one section and continues to bridge section // JR - Needs to be updated with infinite loop and smart exit chopper_transition_to_bridge() { //iprintln( "waiting for transition to bridge" ); // Wait untill it enters bridge area //flag_wait( "chopper_transition_two" ); level waittill( "rocket_1_destroyed" ); // Disable railgun usage maps\nx_rocket_railgun::disable_railgun(); // Dont exit the area unless we hit the exit_ok node. // This ensures the player has plenty of time to see the rocket // explosion before leaving the area while( 1 ) { if( flag( "chopper_ride_exit_ok" )) { break; } wait 1; } // After the player hits the exit_ok node, wait for the actual exit_node. while( 1 ) { if( flag( "chopper_ride_exit_node" )) { break; } wait 1; } AssertEx( IsDefined( level.playerHeli ), "Tried to transition chopper when level.playerHeli does not exist" ); // Get rid of old path level.playerHeli thread vehicle_detachfrompath(); // Get the new path transition_node = getstruct( "chopper_transition_node_two", "targetname" ); // Use new patch level.playerHeli.currentnode = transition_node; // Continue on new path level.playerHeli thread vehicle_resumepath(); level.playerHeli GoPath(); // Reset chopper agility settings level.playerHeli SetMaxPitchRoll( 15, 15 ); level.playerHeli SetYawSpeed( 140, 55, 30, 0 ); //temp music_chk flag flag_set( "music_chk_bridge" ); // Set the current area level.current_area = "bridge"; } // Delete all the base alpha objects after the player leaves the area cleanup_base_alpha_ents() { //iprintln( "base alpha cleanup" ); // actor cleanup should be done by the cleanup volumes maps\nx_rocket_util::safe_delete_array( level.base_alpha_guys_1 ); maps\nx_rocket_util::safe_delete_array( level.base_alpha_guys_2 ); maps\nx_rocket_util::safe_delete_array( level.base_alpha_guys_3 ); maps\nx_rocket_util::safe_delete_array( level.base_alpha_guys_4 ); //maps\nx_rocket_util::safe_delete_array( level.base_alpha_vehicles_static ); maps\nx_rocket_util::safe_delete_array( level.base_alpha_vehicles_pathing ); // Ground vehicles maps\nx_rocket_util::safe_delete( level.garage_apc ); maps\nx_rocket_util::safe_delete( level.tunnel_humvee ); // Allied choppers maps\nx_rocket_util::safe_delete( level.intro_ally_1 ); maps\nx_rocket_util::safe_delete( level.intro_ally_2 ); // SAM Turrets maps\nx_rocket_util::safe_delete_array( level.alpha_sam_turrets ); maps\nx_rocket_util::safe_delete( level.alpha_littlebird_01 ); maps\nx_rocket_util::safe_delete( level.alpha_littlebird_02 ); } //******************************************************************* // * // * //******************************************************************* // Checks for damage on self ( a rocket ), and triggers an exploder rocket_exploder_logic( rocket_number ) { self setCanDamage( true ); while( true ) { self waittill( "damage", damage, attacker, direction_vec, point, damageType, modelName, tagName ); if( damage >= 4000 && damagetype == "MOD_GRENADE" ) { // Create a notify message for this rocket event_string = "rocket_" + rocket_number + "_destroyed"; // Notify level notify( event_string ); flag_set( event_string ); // Trigger this rockets exploder // JR - This is a hack to turn off the exploder on rocket 1 // since it has its own unique explosion anim now //if( rocket_number != 1 ) //{ //Exploder( self.script_parameters ); //} self PlaySound( "nx_rocket_explosion" ); // TEMP WAY OF GETTING VO TO PLAY DURING/AFTER LOCK-ON. // thread maps\nx_rocket_railgun::sound_railgun_hit_vo(); // Spawn a new rocket with the same trajectory // JR FIX ME - This is a hack, find a better solution - FIX ME if( isDefined( level.active_rail_shot )) { missile_angles = level.active_rail_shot.angles; forward = anglestoforward( missile_angles ); //MagicBullet( "nx_rocket_railgun_secondary", self.origin, self.origin + forward ); if (rocket_number == 2) { MagicBullet( "nx_rocket_railgun_secondary", level.active_rail_shot.origin + ( 2000 * forward ), level.active_rail_shot.origin + ( 2100 * forward ) ); } else { MagicBullet( "nx_rocket_railgun_secondary", level.active_rail_shot.origin + ( 600 * forward ), level.active_rail_shot.origin + ( 700 * forward ) ); } } } } } railgun_damage_watcher() { // Bunker 1 //thread railgun_damage_bunker_1(); // Bunker 2 //thread railgun_damage_bunker_2(); } // Bunker 1 - The C shaped bunker railgun_damage_bunker_1() { flag_wait( "base_alpha_bunker_1_exploder_triggered" ); //iprintlnbold( "Bunker 1 destroyed" ); } // Bunker 2 - the small square bunker railgun_damage_bunker_2() { flag_wait( "base_alpha_bunker_2_exploder_triggered" ); //iprintlnbold( "Bunker 2 destroyed" ); } // Used for hint strings // Returns false untill player turns on railgun for the first time hint_railgun_activate() { return flag( "player_activated_railgun" ); } // Used for hint strings // Returns false untill player uses railgun for the first time hint_railgun_lock() { return flag( "player_used_railgun" ); }