//**************************************************************************** // ** // Confidential - (C) Activision Publishing, Inc. 2010 ** // ** //**************************************************************************** // ** // Module: nx_hithard_parachutee.gsc ** // NOTE: called from nx_hithard.gsc ** // ** // Created: 1/13/2011 - Brian Marvin ** // ** //**************************************************************************** #include maps\_utility; #include common_scripts\utility; #include maps\_anim; #include maps\_vehicle; #include maps\_nx_objective_util; #include maps\_hud_util; CONST_MPHCONVERSION = 17.6; //******************************************************************* // * // * //******************************************************************* // Objective-specific PreCache calls // NOTE: for any assets other than strings that require precaching, please place them in "nx_hithard::mission_precache()" precache_strings() { } // Objective specific flag_init() calls flag_inits() { // "Parachute" flag_init( "flag_vnode_parasecure_parachute_player_start" ); flag_init( "flag_parasecure_parachute_landed_player" ); flag_init( "flag_parasecure_parachute_oob" ); flag_init( "flag_hint_parachute_falling_behind" ); flag_init( "flag_node_hint_right" ); flag_init( "flag_node_hint_avoid_smoke" ); flag_init( "flag_node_hint_left" ); flag_init( "flag_parasecure_library_enemies_spawn" ); flag_init( "flag_origin_anim_parachute_land_ally_01" ); flag_init( "flag_origin_anim_parachute_land_ally_02" ); flag_init( "flag_parachute_landed_ally_01" ); flag_init( "flag_parachute_landed_ally_02" ); flag_init( "flag_parachute_hurt_smoke" ); flag_init( "flag_parachute_objective_failed" ); flag_init( "flag_building2_slow_fall" ); flag_init( "flag_creating_enemy_UGVs" ); // Parachute buffeting / explosion (building 3) flag_init( "flag_parachute_building3_explosion_left" ); flag_init( "flag_parachute_building3_explosion_right" ); // Allow rubber banding checks flag_init( "flag_parachute_player_rb_fail_allow" ); // LZ display Control flag_init( "flag_turn_on_lz" ); // Skybridge flag_init( "flag_skybridge_exp_1" ); flag_init( "flag_skybridge_exp_2" ); // Enemy VTOL plane for rooftop section flag_init( "flag_vtol_flyin_go" ); thread audionodesparachute(); } audionodesparachute() { siren4 = spawn( "sound_emitter", ( 11966, -10786, -76 ) ); siren3 = spawn( "sound_emitter", ( 6677, -17073, -76 ) ); siren2 = spawn( "sound_emitter", ( 17000, -19036, 113 ) ); siren2 PlaySound( "hithard_moving_siren2" ); //play sound on ent siren3 PlayloopSound( "hithard_moving_siren3" ); //play sound on ent siren4 PlayloopSound( "hithard_moving_siren4" ); //play sound on ent siren2 moveto( ( 16982, -10960, 113 ), 3.0, .5, .5 ); streetfight = spawn( "sound_emitter", ( 6764, -14800, -34 ) ); streetfight PlayloopSound( "hithard_street_battle" ); //play sound on ent wait 5; bomber = spawn( "sound_emitter", ( 17010, -19066, 66 ) ); //spawn ent bomber PlaySound( "hithard_moving_siren" ); //play sound on ent wait 15; siren2 stopsounds(); bomber stopsounds(); wait 0.1; siren2 delete(); bomber delete(); wait 15; streetfight stopsounds(); siren4 stopsounds(); siren3 stopsounds(); wait 0.1; streetfight delete(); siren3 delete(); siren4 delete(); } // Objective specific add_hint_string() calls hint_string_inits() { // Parachute hints add_hint_string( "hint_parachute_smoke", &"NX_HITHARD_PARACHUTE_HINT_SMOKE", ::hint_parachute_smoke ); if( level._ps3 || level._xenon ) { add_hint_string( "hint_parachute_left", &"NX_HITHARD_PARACHUTE_HINT_TURN_LEFT", ::hint_will_timeout ); add_hint_string( "hint_parachute_flare", &"NX_HITHARD_PARACHUTE_HINT_FLARE", ::hint_will_timeout ); } else { add_hint_string( "hint_parachute_left", &"NX_HITHARD_PARACHUTE_HINT_TURN_LEFT_PC", ::hint_will_timeout ); add_hint_string( "hint_parachute_flare", &"NX_HITHARD_PARACHUTE_HINT_FLARE_PC", ::hint_will_timeout ); } add_hint_string( "hint_parachute_right", &"NX_HITHARD_PARACHUTE_HINT_TURN_RIGHT", ::hint_will_timeout ); add_hint_string( "hint_parachute_falling_behind", &"NX_HITHARD_PARACHUTE_HINT_FALLING_BEHIND", ::hint_parachute_falling_behind ); } hint_will_timeout() { return false; } //******************************************************************* // * // HINT FUNCTIONS * // * //******************************************************************* // PARACHUTE: Turn left instruction --> LT hint_parachute_smoke() { return !flag( "flag_parachute_hurt_smoke" ); } // PARACHUTE: Turn left instruction --> LT hint_parachute_left() { return flag( "_chute.gsc_flag_LT_pressed" ) || flag( "_chute.gsc_flag_RT_pressed") || flag( "flag_parachute_objective_failed" ); } // PARACHUTE: Turn right instruction --> RT hint_parachute_right() { return flag( "_chute.gsc_flag_RT_pressed" ) || flag( "flag_parachute_objective_failed" ); } // PARACHUTE: Flare (slow down) instruction --> LT & RT hint_parachute_flare() { return (flag( "_chute.gsc_flag_LT_pressed" ) && flag( "_chute.gsc_flag_RT_pressed" )) || flag( "flag_parachute_objective_failed" ); } // PARACHUTE: Player is too far from squad hint_parachute_falling_behind() { return !flag( "flag_hint_parachute_falling_behind" ) || flag( "flag_parachute_objective_failed" ); } //*************************************************************************************************************************************************************** // * // MAINS * // * //*************************************************************************************************************************************************************** // Main parachute objective main_osprey() { //playing ambient level._player setchannelvolumes( "snd_channelvolprio_pain", "nx_hh_osprey_intro", 0.01 ); //music cue for intro - set a flag flag_set( "music_osprey_intro" ); // Intro Dialog level thread maps\nx_hithard_util::intro_dialog(); level waittill( "introscreen_complete" ); thread audio_play_osprey_intro(); hide_intro_ai_names(); // set vision and fog thread maps\nx_hithard_fx::apply_vision_and_fog_osprey(); // Disable all parachute section triggers // The osprey flys through them thread maps\nx_hithard_util::all_triggers_off( "parachute_trigger" ); // Create the initial AA UGVs that bring down the VTOL thread spawn_vtol_ride_enemy_UGVs(); //trigger ambient cloud fx exploder("osprey_clouds"); // Lock elements to osprey squad_osprey = GetEnt( "squad_osprey", "script_noteworthy" ); squad_osprey thread magic_bullet_shield(); player_jump_node = GetEnt( "vehicle_node_anim_player_jump", "script_noteworthy" ); player_jump_node LinkTo( squad_osprey ); thread parachute_hud_logic(); // Start the parachute ride billboard binks thread parachute_billboard_binks(); level Osprey_Intro(); //level._player SetOrigin( player_jump_node.origin ); //level._player SetPlayerAngles( player_jump_node.angles ); // Ambient UGV spawn and logic thread parachute_enemy_UGVs(); level notify( "notify_parachute_start" ); squad_osprey stop_magic_bullet_shield(); squad_osprey delete(); } audio_play_osprey_intro() { thread parachute_audio_settings(); wait 3; mynodeEntity4 = spawn( "sound_emitter", ( 4380, -283, -1566 ) ); mynodeEntity4 PlaySound( "scn_hh_osprey_intro", "scn_hh_osprey_intro", true ); mynodeEntity4 waittill( "scn_hh_osprey_intro" ); mynodeEntity4 delete(); } // Don't show the friendly name popups for the Osprey AI hide_intro_ai_names() { intro_ai_noteworthies = []; // List of all ai used in intro intro_ai_noteworthies = [ "hithard_intro_pilot1", "hithard_intro_pilot2", "hithard_intro_ally1", "hithard_intro_ally2", "hithard_intro_ally3", "hithard_intro_ally4", "hithard_intro_ally5" ]; foreach( ainoteworthy in intro_ai_noteworthies ) { ai = getent( ainoteworthy, "script_noteworthy"); ai.name = ""; } } parachute_hud_logic() { level._player waittill("intro_aa_start"); wait 1.75; maps\_chute::parachute_hud_bootup(); } //******************************************************************* // * // * //******************************************************************* main_parachute_jump() { // apply the vision set for being outside parachuting if ( level._start_point == "default" || level._start_point == "osprey" ) { // regular play through // thread maps\nx_hithard_fx::apply_vision_and_fog_parachute_jump(2.0); } else { // we're jumping to this point ("parachute") thread maps\nx_hithard_fx::apply_vision_and_fog_parachute_jump(0.0); level.squad[0] thread parachute_ally_start( level.parachute_landing_zone, 1 ); level.squad[1] thread parachute_ally_start( level.parachute_landing_zone, 1 ); } // Make sure allies dont die //level.squad[0] magic_bullet_shield(); //level.squad[1] magic_bullet_shield(); // blinking lights on your parachuting buddies PlayFXOnTag(level._effect[ "aircraft_light_white_blink" ], level.squad[0], "tag_effect"); PlayFXOnTag(level._effect[ "aircraft_light_white_blink" ], level.squad[1], "tag_effect"); // PlayFXOnTag(level.squad[0]) // Add objectives maps\nx_hithard_util::objective_start( "obj_parachute_follow_ally", &"NX_HITHARD_PARACHUTE_OBJ_FOLLOW" ); Objective_onentity( level.objective["obj_parachute_follow_ally"], level.squad[0] ); Objective_onadditionalentity( level.objective["obj_parachute_follow_ally"], 1, level.squad[1] ); // Re-enable all the triggers - They needed to be turned off // because the osprey flies through them thread para_clear_flags(); thread maps\nx_hithard_util::all_triggers_on( "parachute_trigger" ); // Start parachute sequence dialogue and helper tips thread parachute_dialogue(); // JR - Temp: Teleport player to correct position // This is temporary. The animation controls where the player // gets spawned, so the anim needs to be modified // Untill then, the player is teleported to the correct spot //level._player maps\_nx_utility::move_player_to_start_point( "playerstart_parachute_jump" ); thread maps\nx_hithard_anim::bomber_flyby_sfx(); //IPrintLnBold( "setting springy cam" ); //thread maps\_nx_utility::set_springy_cam_pitch_offset( 30, 4 ); // Trigger building 1 explosion thread maps\nx_hithard_anim::building01_missile_exp_fx(); /**** Parachute ride start ****/ //set the flag for music to start after the first line is said and the missle hits the building flag_set( "music_parachute_start" ); // Start parachute maps\_chute::chute_start(); level._player notify( "notify_player_jump_anim_complete" ); // We need to wait until the relink is complete before saving level waittill( "player_relink_complete" ); thread autosave_now(); // Changes the players fall speed depending on where he is thread player_descent_watcher(); //Spawn civilian panic thread parachute_civilian_panic(); // Spawns vtols that can be seen while parachuting thread parachute_periph_vtols(); // Sky bridge explosion thread parachute_bridge_explosion_01(); thread parachute_bridge_explosion_02(); thread skybridge_magic_bullets_01(); thread skybridge_magic_bullets_02(); //level thread skybridge_civies_panic(); //level thread skybridge2_civies_panic(); level thread maps\nx_hithard_rooftop::vtol_flyin_logic(); // Enable smoke kill planes level._player thread parachute_hurt_smoke(); //level._player thread parachute_deserter_killplanes(); level.squad maps\nx_hithard_util::ignore_all_on(); // Buffeting Explosion force level._explosion_force = 25; thread parachute_buffeting( "flag_parachute_building3_explosion_left", "origin_parachute_building3_explosion_left" ); thread parachute_buffeting( "flag_parachute_building3_explosion_right", "origin_parachute_building3_explosion_right" ); // Thread wait function for parachute landing objective / library rooftop preparation thread watcher_parachute_land_objective(); // Parachute landing bink thread maps\nx_hithard_rooftop::rooftop_landing_bink(); // Thread out of bounds watcher it until player hinds landing flag thread watcher_parachute_outofbounds(); flag_wait( "flag_parasecure_parachute_landed_player" ); level._player playsound( "scn_hithard_para_land" ); thread audio_jetpass(); /**** Parachute ride end ****/ flag_set( "music_parachute_ends" ); // tagBR< note >: This is just a failsafe, but for some reason it was not getting killed off sometimes maps\nx_hithard_fx::hide_lz(); // Kill the parachute maps\_chute::chute_end(); // Undo all the invulnerability that was applied during the ride thread squad_prepare_for_fire( 1 ); maps\nx_hithard_util::objective_end( "obj_parachute_land" ); thread maps\_utility::set_ambient( "nx_hithard_ext" ); level notify( "notify_parachute_objective_complete" ); // Give the player weapons level._player GiveWeapon( level._main_gun ); foreach( weapon in level.weapons ) { level._player giveWeapon( weapon ); } level._player SwitchToWeapon( level._main_gun ); // stop the blinking lights on your squadmates StopFXOnTag(level._effect[ "aircraft_light_white_blink" ], level.squad[0], "tag_effect"); StopFXOnTag(level._effect[ "aircraft_light_white_blink" ], level.squad[1], "tag_effect"); // This teleport should be removed when the parachute outro anims work ally_start_noteworthies = [ "origin_parachute_land_ally_01_start", "origin_parachute_land_ally_02_start" ]; level.squad maps\nx_hithard_util::moveAlliesToStartPoint( ally_start_noteworthies ); level.squad maps\nx_hithard_util::ignore_all_off(); maps\_threatid::threat_id_enable_toggling(); } audio_jetpass() { wait 2; level._player playsound( "elm_hh_jet_pass" ); } // Makes double extra certain all the flags are cleared // at the start of the rooftop section para_clear_flags() { flag_clear ( "flag_parachute_hurt_smoke" ); flag_clear ( "flag_parachute_section_02" ); flag_clear ( "flag_building2_slow_fall" ); flag_clear ( "hanging_guys_delete" ); flag_clear ( "flag_parachute_section_03" ); flag_clear ( "flag_building3_slow_fall" ); flag_clear ( "flag_parachute_section_04" ); flag_clear ( "flag_vtol_flyin_go" ); flag_clear ( "flag_parasecure_library_enemies_spawn" ); flag_clear ( "flag_prepare_for_landing" ); flag_clear ( "flag_parasecure_parachute_landed_player" ); } //******************************************************************* // * // * //******************************************************************* watcher_parachute_outofbounds() { level endon( "notify_parachute_objective_complete" ); while ( 1 ) { if (( level._player.origin[2] <= 156 ) && ( !flag( "flag_parachute_objective_failed" ))) { maps\nx_hithard_util::objective_failed( "parachute", &"NX_HITHARD_PARACHUTE_FAIL_LOW" ); } if( flag( "flag_parasecure_parachute_oob" ) && ( !flag( "flag_parachute_objective_failed" ))) { maps\nx_hithard_util::objective_failed( "parachute", &"NX_HITHARD_PARACHUTE_FAIL_LOW" ); } wait 0.01; } } //******************************************************************* // * // * //******************************************************************* // Controls player fall speed at certain points along the chute path player_descent_watcher() { default_descent_acceleration = 0.0; default_descent_velocity = 77; default_forward_brake_deceleration = 0.0; starting_target_height = 2900; building_2_target_height = 2200; building_3_target_height = 650; building_4_target_height = 600; // JR TODO - Swoop turned off for now //default_forward_velocity = 890; //swoop_forward_velocity = 950; // Fall faster at very start of sequence // to counter starting higher in the air level._descent_acceleration = 175.0; level._max_descent_velocity = 225; //level._player SetSpringyCamPitchOffset( 25 ); //wait( 1.5 ); //level._player SetSpringyCamPitchOffset( 0 ); // Until target height while( level._player.origin[2] > starting_target_height ) { wait( 1.0 ); } // Reset normal descent params level._descent_acceleration = default_descent_acceleration; level._max_descent_velocity = 55; level._min_descent_velocity = 55; // Building 2 // Force the player down a bit to see the moment flag_wait( "flag_building2_slow_fall" ); // Fall faster level._descent_acceleration = 90.0; level._max_descent_velocity = 150; level._forward_acceleration = 300.0; //level._max_forward_velocity = swoop_forward_velocity; // Until target height while( level._player.origin[2] > building_2_target_height ) { wait( 1.0 ); } // Reset normal descent params level._descent_acceleration = default_descent_acceleration; level._max_descent_velocity = default_descent_velocity; level._forward_acceleration = 200.0; //level._max_forward_velocity = default_forward_velocity; // Building 3 // Force the player down a bit to see the moment flag_wait( "flag_building3_slow_fall" ); level._descent_acceleration = 65.0; level._max_descent_velocity = 185; //level._max_forward_velocity = swoop_forward_velocity; // Until target height while( level._player.origin[2] > building_3_target_height && !flag( "flag_parasecure_library_enemies_spawn" )) { wait( 0.25 ); } // Building 4 // Force the player down a bit to see the moment flag_wait( "flag_parasecure_library_enemies_spawn" ); thread parachute_display_flare(); level._descent_acceleration = 90.0; level._max_descent_velocity = 400; //level._max_forward_velocity = swoop_forward_velocity; // Until target height while( level._player.origin[2] > building_4_target_height ) { wait( 0.25 ); } // Straight away towards landing zone // Dont let the player fall much anymore level._descent_acceleration = 0.0; level._min_descent_velocity = 0; level._max_descent_velocity = 25.0; //level._max_forward_velocity = default_forward_velocity; // Landing sequence // Increase the players braking power, // and make the player fall faster flag_wait( "flag_prepare_for_landing" ); level._descent_acceleration = 2.0; level._max_forward_velocity = 800.0; level._min_forward_velocity = 15.0; level._forward_acceleration = 12.0; //level._player display_hint_timeout( "hint_parachute_flare", 4.0 ); // self thread parachute_display_flare(); // This loop makes the players brake more powerful while the brake is pressed // Stops when the player lands while( !flag( "flag_parasecure_parachute_landed_player" )) { // While brake is on, slow down much faster if( flag( "_chute.gsc_flag_LT_pressed" ) && flag( "_chute.gsc_flag_RT_pressed" )) { level._forward_brake_deceleration = -150.0; level._descent_acceleration = 128.0; level._max_descent_velocity = 2100; level._min_descent_velocity = 200; } else { level._forward_brake_deceleration = -10.0; } wait 1.0; } // Reset just in case level._forward_brake_deceleration = 0.0; } //******************************************************************* // * // * //******************************************************************* // Player flies on side of building 3 (explosion causes buffeting to player) parachute_buffeting( flag_explosion, origin_explosion ) { level endon( "notify_parachute_objective_complete"); explosion_trigger = GetEnt( flag_explosion, "targetname" ); //flag_wait( flag_explosion ); while ( 1 ) { if ( level._player IsTouching( explosion_trigger ) ) { // Stop player from falling too much during buffet level._min_descent_velocity = 0; level._max_descent_velocity = 25.0; explosion_point = getent( origin_explosion, "script_noteworthy" ); thread maps\_chute::parachute_buffeting( explosion_point.origin, explosion_trigger.animation ); Earthquake( .7, 1.2, level._player.origin, 5000 ); quakeobj = spawn( "script_origin", level._player.origin ); quakeobj PlayRumbleOnEntity( "artillery_rumble" ); return; } wait 0.05; } } //******************************************************************* // * // * //******************************************************************* // Waits for player to hit a flag in order to prepare the library rooftops and change to parachute landing objective watcher_parachute_land_objective() { flag_wait( "flag_parasecure_library_enemies_spawn" ); // Prepare rooftop section //thread maps\nx_hithard_rooftop::prep_parachute_library_rooftop(); // Update Objective maps\nx_hithard_util::objective_end( "obj_parachute_follow_ally" ); maps\nx_hithard_util::objective_start( "obj_parachute_land", &"NX_HITHARD_PARACHUTE_OBJ_LAND" ); landing_node = GetEnt( "rooftop_landing_node", "script_noteworthy" ); Objective_Position( level.objective["obj_parachute_land"], landing_node.origin ); Objective_Icon( level.objective["obj_parachute_land"], "chute_landing_marker" ); waittillframeend; originalWidth = getdvarfloat( "waypointIconWidth" ); originalHeight = getdvarfloat( "waypointIconHeight" ); originalScaleSmallest = getdvarfloat( "waypointDistScaleSmallest" ); SetSavedDvar( "waypointIconWidth", 32.0 ); SetSavedDvar( "waypointIconHeight", 16.0 ); SetSavedDvar( "waypointDistScaleSmallest", 1.0 ); level waittill( "notify_parachute_objective_complete" ); SetSavedDvar( "waypointIconWidth", originalWidth ); SetSavedDvar( "waypointIconHeight", originalHeight ); SetSavedDvar( "waypointDistScaleSmallest", originalScaleSmallest ); } //******************************************************************* // * // * //******************************************************************* Osprey_Intro() { node = getstruct("hithard_intro_cinematic", "script_noteworthy"); hithard_osprey_01 = get_vehicle("hithard_osprey_01","targetname"); hithard_osprey_01.animname = "hithard_osprey_01"; hithard_osprey_01 StartUsingHeroOnlyLighting(); level.hithard_osprey_01 = hithard_osprey_01; hithard_osprey_02 = get_vehicle("hithard_osprey_02","targetname"); hithard_osprey_02.animname = "hithard_osprey_02"; level.hithard_osprey_02 = hithard_osprey_02; hithard_osprey_03 = get_vehicle("hithard_osprey_03","targetname"); hithard_osprey_03.animname = "hithard_osprey_03"; level.hithard_osprey_03 = hithard_osprey_03; hithard_osprey_04 = get_vehicle("hithard_osprey_04","targetname"); hithard_osprey_04.animname = "hithard_osprey_04"; level.hithard_osprey_04 = hithard_osprey_04; osprey_damaged = spawn_anim_model("osprey_damaged"); osprey_damaged StartUsingHeroOnlyLighting(); level.osprey_damaged = osprey_damaged; vehicle_osprey_door_intro = spawn_anim_model("vehicle_osprey_door_intro"); level.vehicle_osprey_door_intro = vehicle_osprey_door_intro; player_body = getent("hithard_intro_player_body", "script_noteworthy"); player_body vehicle_guy_attach( hithard_osprey_01, "tag_guy2" ); player_body.animname = "player_body"; level.player_body = player_body; ally01 = getent("hithard_intro_ally1", "script_noteworthy"); ally01 vehicle_guy_attach( hithard_osprey_01, "tag_guy2" ); ally01.animname = "ally01"; level.ally01 = ally01; ally02 = getent("hithard_intro_ally2", "script_noteworthy"); ally02 vehicle_guy_attach( hithard_osprey_01, "tag_guy3" ); ally02.animname = "ally02"; level.ally02 = ally02; ally03 = getent("hithard_intro_ally3", "script_noteworthy"); ally03 vehicle_guy_attach( hithard_osprey_01, "tag_guy4" ); ally03.animname = "ally03"; level.ally03 = ally03; ally04 = getent("hithard_intro_ally4", "script_noteworthy"); ally04 vehicle_guy_attach( hithard_osprey_01, "tag_guy5" ); ally04.animname = "ally04"; level.ally04 = ally04; ally05 = getent("hithard_intro_ally5", "script_noteworthy"); ally05 vehicle_guy_attach( hithard_osprey_01, "tag_guy6" ); ally05.animname = "ally05"; level.ally05 = ally05; pilot01 = getent("hithard_intro_pilot1", "script_noteworthy"); pilot01 vehicle_guy_attach( hithard_osprey_01, "tag_passenger" ); pilot01.animname = "pilot01"; level.pilot01 = pilot01; pilot02 = getent("hithard_intro_pilot2", "script_noteworthy"); pilot02 vehicle_guy_attach( hithard_osprey_01, "tag_driver" ); pilot02.animname = "pilot02"; level.pilot02 = pilot02; // set up the rig player_rig = spawn_anim_model( "player_rig" ); player_rig StartUsingHeroOnlyLighting(); player_rig LinkTo( hithard_osprey_01, "tag_guy5" ); //arc = 15; //level._player PlayerLinkToDelta( player_rig, "tag_player", 1, arc, arc, arc, arc, 1); // animate the rig player_rig Show(); hithard_osprey_01 suspend_drive_anims_for_vignette(); hithard_osprey_02 suspend_drive_anims_for_vignette(); hithard_osprey_03 suspend_drive_anims_for_vignette(); hithard_osprey_04 suspend_drive_anims_for_vignette(); passengers = [ ally01, ally02, ally03, ally04, ally05, pilot01, pilot02, player_rig, player_body, osprey_damaged, vehicle_osprey_door_intro ]; passengers_org = spawn_tag_origin(); osprey_rot = hithard_osprey_01.angles[ 1 ]; passengers_org.origin = hithard_osprey_01.origin + ( cos( osprey_rot ) * 112, sin( osprey_rot ) * 112, -120 ); passengers_org LinkTo( hithard_osprey_01 ); osprey_damaged LinkTo( hithard_osprey_01, "tag_origin", (0,0,0), (0,0,0) ); vehicle_osprey_door_intro LinkTo( hithard_osprey_01, "tag_origin", (0,0,0), (0,0,0) ); planes = []; planes["hithard_osprey_01"] = hithard_osprey_01; planes["hithard_osprey_02"] = hithard_osprey_02; planes["hithard_osprey_03"] = hithard_osprey_03; planes["hithard_osprey_04"] = hithard_osprey_04; osprey_damaged Hide(); // Wait for bink. //level waittill( "osprey_intro_bink_01_complete" ); //thread autosave_now(); //start osprey missile, AA, and flak FX thread osprey_missilehits_periph(); horizontal_arc = 0; vertical_arc = 0; level._player PlayerLinkToDelta( player_rig, "tag_player", 1, horizontal_arc, horizontal_arc, vertical_arc, vertical_arc, 1); // This starts the ally logic...they will spawn at the appropriate time level.squad[0] thread parachute_ally_start( level.parachute_landing_zone ); level.squad[1] thread parachute_ally_start( level.parachute_landing_zone ); // iPrintLnBold("--- windshield light on ---"); playFXOnTag(level._effect[ "nx_light_hhh_osprey_intro_windshield" ], hithard_osprey_01, "tag_osprey_windshield"); // light from the outside coming into the osprey level._player AllowCrouch( false ); passengers_org thread anim_single( passengers, "Osprey_Intro" ); player_rig thread player_rig_on_intro_end( passengers_org, "Osprey_Intro" ); // light blinking on the dudes thread maps\nx_hithard_fx::parachute_guys_blink_lights(ally01, ally05); // light on the back door opening in the osprey thread maps\nx_hithard_fx::fx_ospreyintro_backdoor_open_light_on(osprey_damaged); thread wait_and_cleanup_intro(); node anim_single( planes, "Osprey_Intro" ); // Remove intro entities level.osprey_damaged thread safe_delete(); level.ally01 thread safe_delete(); level.ally02 thread safe_delete(); level.ally03 thread safe_delete(); level.ally04 thread safe_delete(); level.ally05 thread safe_delete(); level.player_body thread safe_delete(); level.pilot01 thread safe_delete(); level.pilot02 thread safe_delete(); level._player AllowCrouch( true ); } osprey_damaged_unhide( osprey_damaged ) { osprey_damaged Show(); // playFXOnTag(level._effect[ "nx_light_hhh_osprey_intro_windshield" ], osprey_damaged, "tag_osprey_windshield"); // light from the outside coming into the osprey stop_exploder( "osprey_clouds" ); } intro_explosion_hide( hithard_osprey_01 ) { hithard_osprey_01 Hide(); } wait_and_cleanup_intro() { // Wait for the intro AA notetrack level._player waittill( "intro_aa_start" ); // Anim is done level.hithard_osprey_02 thread safe_delete(); level.hithard_osprey_03 thread safe_delete(); level.hithard_osprey_04 thread safe_delete(); } safe_delete() { if( isDefined( self )) { self delete(); } } //******************************************************************* // * // * //******************************************************************* osprey_missilehits_periph() { //iPrintLnBold("--- got fx osprey start ---"); wait 18.5; exploder("osprey_missiles"); } player_rig_on_intro_end( node, scene_name ) { node waittill( scene_name ); self Hide(); //self unlink(); level._player Unlink(); self delete(); } //******************************************************************* // * // * //******************************************************************* vehicle_guy_attach( vehicle, tag_name ) { tag_org = vehicle GetTagOrigin( tag_name ); tag_angles = vehicle GetTagAngles( tag_name ); self ForceTeleport( tag_org, tag_angles ); self LinkTo( vehicle, tag_name ); } //******************************************************************* // * // * //******************************************************************* // Removes the "brush" door on the osprey (debug / placeholder until we have a real osprey door and anims) osprey_door_remove() { // Wait for when allies are ready to jump //wait 12.5; wait 114; // different vision set when the door opens on the osprey thread maps\nx_hithard_fx::apply_vision_and_fog_osprey_door_open(); self delete(); } //******************************************************************* // * // * //******************************************************************* // Animations for player's squad jumping out of plane parachute_ally_jump_MAJOR_CHANGE( jump_anim_group, squad_osprey ) { level endon( "notify_parachute_start" ); // Variables jump_anim_node_name = "node_anim_parachute_jump_" + self.script_noteworthy; rubber_banding_object = ""; jump_anim_node = GetEnt( jump_anim_node_name, "script_noteworthy" ); // PJ: Plane setup jump_anim_node LinkTo( squad_osprey ); // Perform jump animation self.animname = "anim_parachute_jump_" + self.script_noteworthy; guys[0] = self; level waittill( "osprey_intro_bink_01_complete" ); } //******************************************************************* // * // * //******************************************************************* // Rubber-banding for squad mates parachuting in with player parachute_rubber_banding( guy_1, guy_2 ) { level endon( "notify_parachute_objective_complete" ); level endon( "parachute_path_complete" ); level endon( "parachute_approach_start" ); falling_behind_vo_timeout = false; // Distance between allies distance_between_allies = 0; if( self == level.squad[ 0 ] ) { self vehicle_SetSpeedImmediate( 30 ); } else { self vehicle_SetSpeedImmediate( 30 ); } while ( 1 ) { distance_between_allies = Distance( self.origin, guy_2.origin ); // Adjust speed of vehicle based on distance from rubber bander if ( distance_between_allies < 1200 ) // 1400 { self Vehicle_SetSpeed( 70, 60 ); } else if( distance_between_allies > 2750 ) // 3500 { self Vehicle_SetSpeed( 30, 29); } else { self Vehicle_SetSpeed( 50, 40 ); } // Check for player fail (too far from squad mates) if ( ( guy_2 == level._player ) && flag( "flag_parachute_player_rb_fail_allow" )) { // Maximum follow distance in units before "too far" message displayed warning_distance = undefined; // Distance at which player will fail fail_distance = undefined; //iprintlnbold( distance_between_allies ); // If the player is at the start, allow for a larger follow distance if( flag( "flag_parachute_section_01b" )) { warning_distance = 3000; fail_distance = 4000; } else { warning_distance = 3000; fail_distance = 4000; } if ( distance_between_allies < warning_distance ) { flag_clear( "flag_hint_parachute_falling_behind" ); } else if ( distance_between_allies >= fail_distance ) { // Failed maps\nx_hithard_util::objective_failed( "parachute", &"NX_HITHARD_PARACHUTE_FAIL_FOLLOW" ); break; } else { if ( !flag( "flag_hint_parachute_falling_behind" )) { // Captain Baker: "Spectre, you're falling behind!" thread radio_dialogue( "hithard_bak_para_01" ); //falling_behind_vo_timeout = true; //falling_behind_vo_timeout = thread falling_behind_vo_timeout(); } flag_set( "flag_hint_parachute_falling_behind" ); display_hint( "hint_parachute_falling_behind" ); } } wait 0.05; } } //******************************************************************* // * // * //******************************************************************* // Controls crowds of civilians // JR TODO - Add start/stop flag functionality parachute_civilian_panic() { thread parachute_civilian_panic_logic( "civies_01a", "flag_parachute_section_01b" ); thread parachute_civilian_panic_logic( "civies_01b", "flag_parachute_section_01b" ); thread parachute_civilian_panic_logic( "civies_03a", "flag_parachute_section_01b" ); thread parachute_civilian_panic_logic( "civies_03b", "flag_parachute_section_01b" ); flag_wait( "flag_parachute_section_01b" ); flag_wait( "flag_parachute_section_02" ); // Skybridge civilians skybridge_civilians = GetEntArray( "parachute_civies_04_spawner", "script_noteworthy" ); array_spawn_function( skybridge_civilians, ::skybridge_civilian_logic, "flag_skybridge_exp_1" ); thread parachute_civilian_panic_logic( "civies_04", "flag_skybridge_exp_1" ); skybridge_civilians = GetEntArray( "parachute_civies_04b_spawner", "script_noteworthy" ); array_spawn_function( skybridge_civilians, ::skybridge_civilian_logic, "flag_skybridge_exp_2" ); thread parachute_civilian_panic_logic( "civies_04b", "flag_skybridge_exp_2" ); // Office park civvies thread parachute_civilian_panic_logic( "civies_5", "flag_parachute_section_04" ); // Spawn final civilian panic thread parachute_civilian_panic_logic( "civies_10a", "flag_prepare_for_landing" ); thread parachute_civilian_panic_logic( "civies_10b", "flag_prepare_for_landing" ); thread parachute_civilian_panic_logic( "civies_10c", "flag_prepare_for_landing" ); flag_wait( "flag_parachute_section_03" ); //iprintln( "flag_parachute_section_03" ); // tagJW: Clean up animated wind turbines to free up animinfos wind_turbines = GetEntArray( "wind_turbine", "script_noteworthy" ); foreach ( wind_turbine in wind_turbines ) { wind_turbine delete(); } // Cleanup flag_wait( "flag_parachute_section_04" ); //iprintln( "flag_parachute_section_04" ); flag_wait( "flag_prepare_for_landing" ); //iprintln( "flag_prepare_for_landing" ); } // Wrapper to make infinite streaming civies // JR - The crowd system should have this functionality built-in parachute_civilian_panic_logic( group, kill_flag ) { spawner = "parachute_" + group + "_spawner"; solo_spawner = "parachute_" + group + "_solo_spawner"; start = "parachute_" + group + "_start"; end = "parachute_" + group + "_end"; // Create the crowd crowd = maps\nx_crowd_controller::new_crowd( group, 8, GetEntArray( spawner, "script_noteworthy"), GetEntArray( start, "script_noteworthy"), GetEntArray( end, "script_noteworthy"), 0.3, 0.7 ); // Spawn the solo guys solo_spawned_array = spawn_noteworthy_and_return_array( solo_spawner ); // Keep spawning untill player lands while( !flag( "flag_parasecure_parachute_landed_player" ) ) { if ( isdefined( kill_flag ) && flag( kill_flag ) ) { level notify( kill_flag ); break; } maps\nx_crowd_controller::spawn_crowd( group, kill_flag ); level waittill( group ); //wait( 4.0 ); } // Kill the solo guys foreach ( solo_drone in solo_spawned_array ) { solo_drone delete(); } // No need to kill crowd controller guys, they should expire at end of their path } // tagJW: Keeping this out of nx_utility since I don't want it to set count - using to spawn drones spawn_noteworthy_and_return_array( noteworthy ) { spawners = GetEntArray( noteworthy, "script_noteworthy" ); guys = []; foreach ( spawner in spawners ) { guy = spawner spawn_ai(); if ( IsDefined( guy ) && IsAlive( guy ) ) { guys[ guys.size ] = guy; } } return guys; } // JR - I think this might be run on level load // Should delay it to start with a trigger, // and make sure it cleans itself up skybridge_civies_panic() { crowd = maps\nx_crowd_controller::new_crowd( "skybridge_civies", 10, GetEntArray( "skybridge_civies_spawner", "script_noteworthy" ), GetEntArray( "skybridge_civies_start", "script_noteworthy"), GetEntArray( "skybridge_civies_end", "script_noteworthy")); wait 4.0; //while( 1 ) while( !flag( "flag_parasecure_parachute_landed_player" )) { maps\nx_crowd_controller::spawn_crowd( "skybridge_civies" ); wait 10.0; } } // JR - I think this might be run on level load // Should delay it to start with a trigger, // and make sure it cleans itself up skybridge2_civies_panic() { crowd = maps\nx_crowd_controller::new_crowd( "skybridge2_civies", 10, GetEntArray( "skybridge2_civies_spawner", "script_noteworthy" ), GetEntArray( "skybridge2_civies_start", "script_noteworthy"), GetEntArray( "skybridge2_civies_end", "script_noteworthy")); wait 4.0; //while( 1 ) while( !flag( "flag_parasecure_parachute_landed_player" )) { maps\nx_crowd_controller::spawn_crowd( "skybridge2_civies" ); wait 10.0; } } //******************************************************************* // * // * //******************************************************************* // Controls enemy UGV during parachute ride // JR TODO - Remove actual vehicles and use static models firing magic bullets // rocket = MagicBullet( "rpg_straight", rocket_source.origin, rocket_target.origin ); parachute_enemy_UGVs() { flag_set( "flag_creating_enemy_UGVs" ); wait( .10 ); // Prepare squad mates to be fired at squad_prepare_for_fire(); // These two die after building 1 thread parachute_enemy_UGV_logic( "parachute_ugv_01a", "flag_parachute_section_01b", level.squad[1] ); thread parachute_enemy_UGV_logic( "parachute_ugv_01b", "flag_parachute_section_01b", level.squad[0] ); waittillframeend; // JR - The target node GetEnt could be baked down into the parachute_enemy_ugv_logic() script target_node = GetEnt( "parachute_ugv_02a_target_node", "script_noteworthy" ); thread parachute_enemy_UGV_logic( "parachute_ugv_02a", "flag_building2_slow_fall", target_node ); // Old target: level.squad[0] //thread parachute_enemy_UGV_logic( "parachute_ugv_02b", "flag_building2_slow_fall", level.squad[1] ); waittillframeend; target_node = GetEnt( "parachute_ugv_03a_target_node", "script_noteworthy" ); thread parachute_enemy_UGV_logic( "parachute_ugv_03a", "flag_building2_slow_fall", target_node ); // Old target: level.squad[0] //thread parachute_enemy_UGV_logic( "parachute_ugv_03b", "flag_building2_slow_fall", level.squad[0] ); flag_wait( "flag_parachute_section_01b" ); target_node = GetEnt( "parachute_ugv_03c_target_node", "script_noteworthy" ); thread parachute_enemy_UGV_logic( "parachute_ugv_03c", "flag_parachute_section_03", target_node ); // Old target: level.squad[1] flag_wait( "flag_parachute_section_02" ); target_node = GetEnt( "parachute_ugv_04a_target_node", "script_noteworthy" ); thread parachute_enemy_UGV_logic( "parachute_ugv_04a", "flag_building3_slow_fall", target_node ); // Old target: level.squad[0] target_node = GetEnt( "parachute_ugv_04b_target_node", "script_noteworthy" ); thread parachute_enemy_UGV_logic( "parachute_ugv_04b", "flag_building3_slow_fall", target_node ); // Old target: level.squad[0] //flag_wait( "flag_parachute_drones_03" ); target_node = GetEnt( "parachute_ugv_05a_target_node", "script_noteworthy" ); thread parachute_enemy_UGV_logic( "parachute_ugv_05a", "flag_parachute_section_04", target_node ); // Old target: level.squad[0] target_node = GetEnt( "parachute_ugv_05b_target_node", "script_noteworthy" ); thread parachute_enemy_UGV_logic( "parachute_ugv_05b", "flag_parachute_section_04", target_node ); // Old target: level.squad[0] } //******************************************************************* // * // * //******************************************************************* // These should fire during the intro and deploy anims spawn_vtol_ride_enemy_UGVs() { level._player waittill( "intro_aa_start" ); // Get the target nodes to fire at node_00a = GetEnt( "vtol_aa_target_node_00a", "script_noteworthy" ); node_00b = GetEnt( "vtol_aa_target_node_00b", "script_noteworthy" ); node_00c = GetEnt( "vtol_aa_target_node_00c", "script_noteworthy" ); // Spawn the UGVs, and start firing thread parachute_enemy_UGV_logic( "parachute_ugv_00a", "flag_creating_enemy_UGVs", node_00a ); thread parachute_enemy_UGV_logic( "parachute_ugv_00b", "flag_creating_enemy_UGVs", node_00b ); thread parachute_enemy_UGV_logic( "parachute_ugv_00c", "flag_creating_enemy_UGVs", node_00c ); } // Spawn and control each UGV parachute_enemy_UGV_logic( targetname, delete_flag, fire_target, wide ) { ugv_spawner = GetEnt( targetname, "targetname" ); ugv = vehicle_spawn( ugv_spawner ); ugv set_cheap_turret(); ugv endon( "death" ); //ugv mgoff(); //ugv.mgturret[0] SetMode( "manual" ); ugv.mgturret[1] SetMode( "manual" ); ugv.mgturret[2] SetMode( "manual" ); thread gopath( ugv ); if( isDefined( fire_target )) { ugv thread vehicle_fire_around_entity( fire_target, RandomFloatRange( 1, 2 ), wide ); } ugv flag_wait( delete_flag ); ugv Delete(); //IPrintLnBold( "UGV deleted" ); } squad_prepare_for_fire( undo ) { if( !isDefined( undo )) { // Create the player_lead dummy object level._player EnableInvulnerability(); // Squad shouldnt get hit or take pain level.squad[0] godon(); level.squad[1] godon(); level.squad[0].disableBulletWhizByReactions = true; level.squad[1].disableBulletWhizByReactions = true; level.squad[0] disable_pain(); level.squad[1] disable_pain(); level.squad[0].ignoreall = true; level.squad[1].ignoreall = true; level.squad[0].ignoresuppresion = true; level.squad[1].ignoresuppresion = true; } else { level._player DisableInvulnerability(); level.squad[0].disableBulletWhizByReactions = false; level.squad[1].disableBulletWhizByReactions = false; level.squad[0] enable_pain(); level.squad[1] enable_pain(); level.squad[0].ignoreall = false; level.squad[1].ignoreall = false; level.squad[0].ignoresuppresion = false; level.squad[1].ignoresuppresion = false; } } // taken from hit hard b vehicle_fire_around_entity( e, interval, wide ) { self endon( "death" ); if( !IsDefined( self.mgturret ) ) return; turret = self.mgturret[0]; turret StartBarrelSpin(); while( 1 ) { r = RandomFloat( 360 ); s = RandomFloatRange( 120.0, 240.0 ); // Wider cone of fire if( isDefined( wide )) { s = RandomFloatRange( 210.0, 340.0 ); } targetPos = e.origin + ( cos(r)*s, sin(r)*s, 0); turret SetTurretTargetPosition( targetPos ); // Although technically the turret needs a frame to move, // it feels better if it fires before moving. // It makes the shots lag behind a bit and get in the players face //waittillframeend; turret ShootTurret(); wait interval; } } //******************************************************************* // * // * //******************************************************************* // Spawn ally parachute vehicles, start path, and rubber band parachute_lz_init() { // hidden to start with thread maps\nx_hithard_fx::hide_lz(); parachute_lz_sequence(); } parachute_lz_sequence() { // wait to hit the first trigger flag_wait( "flag_turn_on_lz" ); thread maps\nx_hithard_fx::lz_flicker_on(); // wait to land, then turn it off flag_wait("flag_parasecure_parachute_landed_player"); // wait 1.0; thread maps\nx_hithard_fx::lz_flicker_off(); thread disable_ride_effects(); } // JR TODO // Cleanup for effects, drones, and vehicles shown during the ride disable_ride_effects() { // kill smoke //delete_exploder(); // kill AA //delete_exploder(); // kill UGVs //GetEntArray( "parachute_scenary_ugvs", "script_noteworthy" ); // kill drones //GetEntArray( "parachute_scenary_drones", "script_noteworthy" ); // kill drone cars //GetEntArray( "parachute_scenary_cars", "script_noteworthy" ); } //******************************************************************* // * // * //******************************************************************* parachute_audio_settings() { wait 45; level._player deactivatechannelvolumes( "snd_channelvolprio_pain", 1 ); } // Spawn ally parachute vehicles, start path, and rubber band parachute_ally_start( node_landing_location, immediate ) { if ( !IsDefined( immediate ) ) { level._player waittill( "ally_parachute_spawn" ); } level._player PlaySound( "hithard_para_jump" ); level._player PlaySound( "hithard_para_ospfade" ); thread maps\_utility::set_ambient( "nx_hithard_chute" ); // Variables vehicle_targetname = "parachute_" + self.script_noteworthy; // Choose who to have the ally rubber band with if ( self.script_noteworthy == "ally_01" ) { rubber_banding_object = level.squad[1]; } else { rubber_banding_object = level._player; } self.ignoreall = true; self Hide(); parachute_vehicle = spawn_vehicle_from_targetname_and_drive( vehicle_targetname ); parachute_vehicle godon(); if ( !IsDefined( immediate ) ) { parachute_vehicle Vehicle_SetSpeedImmediate( 20, 1, 1 ); level._player waittill( "notify_player_jump_anim_complete" ); } parachute_vehicle Vehicle_SetSpeedImmediate( 70, 10000, 10000 );//really high accell and decell parachute_vehicle set_heli_move( "faster" ); parachute_vehicle SetTurningAbility( 1.0 ); self forceteleport( parachute_vehicle.origin, parachute_vehicle.angles ); if ( !isdefined( parachute_vehicle )) { AssertMsg( vehicle_targetname + " did not spawn correctly!" ); } //parachute_vehicle Vehicle_Teleport( self.origin, parachute_vehicle.angles ); wait 0.033; self linkto( parachute_vehicle, "tag_driver", (0,0,0), (0,0,0) ); self Show(); parachute_vehicle guy_enter_vehicle( self ); // Start rubber banding parachute_vehicle thread parachute_rubber_banding( self, rubber_banding_object ); // Run landing sequence self thread parachute_ally_landing( parachute_vehicle, node_landing_location ); } //******************************************************************* // * // * //******************************************************************* // Controls dialogue and tutorial hint text parachute_dialogue() { waittillframeend; //================================================================= // From start to building 2 //================================================================= flag_wait( "flag_parachute_section_01" ); // Captain Baker: "Plotted a route to Patriot. On me." wait_play_dialogue_wait( 0.1, "hithard_bak_para_05" ); //level._player display_hint( "hint_parachute_left" ); thread display_hint_timeout( "hint_parachute_left", 4 ); // Captain Baker: "Shit! Swinging left!" wait_play_dialogue_wait( 2.8, "hithard_bak_para_08", undefined, undefined, "flag_parachute_player_rb_fail_allow" ); // Captain Baker: "Follow me." //wait_play_dialogue_wait( 4.5, "hithard_bak_para_10" ); // Duke: "Fuck me!" wait_play_dialogue_wait( 4.5, "hithard_gyp_para_01" ); // Captain Baker: "Left! Left!" //wait_play_dialogue_wait( 1.0, "hithard_bak_para_03" ); // Captain Baker: "Steer clear of the smoke!" //wait_play_dialogue_wait( 3.0, "hithard_bak_para_02" ); //level._player display_hint( "hint_parachute_smoke" ); //display_hint_timeout( "hint_parachute_smoke", 3 ); //================================================================= // Building 2 //================================================================= flag_wait( "flag_building2_slow_fall" ); // Captain Baker: "Damn - going through!" wait_play_dialogue_wait( 0.5, "hithard_bak_para_03" ); // Duke: "Holy shit..." wait_play_dialogue_wait( 3.5, "hithard_gyp_para_02" ); //level._player display_hint( "hint_parachute_right" ); //================================================================= // Y intersection //================================================================= flag_wait( "flag_parachute_section_03" ); // Captain Baker: "They're everywhere!" wait_play_dialogue_wait( 5.2, "hithard_bak_para_11" ); // Captain Baker: "Go around!" //wait_play_dialogue_wait( 4.5, "hithard_bak_para_14" ); //================================================================= // Building 3 explosion //================================================================= flag_wait_any( "flag_parachute_building3_explosion_left", "flag_parachute_building3_explosion_right" ); // Captain Baker: "Watch out!" wait_play_dialogue_wait( 0.35, "hithard_bak_para_13" ); //================================================================= // From building 4 to landing //================================================================= flag_wait( "flag_parachute_section_04" ); // Captain Baker: "LZ. Eleven o'clock!" wait_play_dialogue_wait( 1.1, "hithard_bak_para_16" ); // Captain Baker: "Contacts, top of the parking structure." wait_play_dialogue_wait( 4.0, "hithard_bak_snipe_02" ); // Captain Baker: "Theres the LZ. Prep for hard landing." //wait_play_dialogue_wait( 4.0, "hithard_bak_para_16" ); // Captain Baker: "We have tangos at the LZ. Cut your chutes and engage." //wait_play_dialogue_wait( 4.0, "hithard_bak_para_20" ); } // Helper script for timing dialogue wait_play_dialogue_wait( wait_in, dialogue1, dialogue2, wait_out, flag ) { wait( wait_in ); if( cointoss() || !isDefined( dialogue2 )) { thread radio_dialogue( dialogue1 ); } else { thread radio_dialogue_flag_set( dialogue2, flag ); } if( isDefined( flag )) { flag_set( flag ); } if( isDefined( wait_out )) { wait( wait_out ); } } //******************************************************************* // * // * //******************************************************************* // plays a radio dialogue and then sets a flag radio_dialogue_flag_set( dialogue, flag ) { radio_dialogue( dialogue ); flag_set( flag ); } //******************************************************************* // * // * //******************************************************************* // Tell player to flare ( brake ) for landing parachute_display_flare() { level endon( "flag_parasecure_parachute_landed_player" ); level endon( "notify_parachute_objective_complete" ); //while( level._player.origin[2] > 350 ) //{ // level._player display_hint( "hint_parachute_flare" ); // wait 0.01; //} // Small delay so the tip doesnt come up too early. wait( 2.0 ); display_hint_timeout( "hint_parachute_flare", 3 ); } //******************************************************************* // * // * //******************************************************************* // Player gets hurt while in smoke parachute_hurt_smoke() { // Stop this script when the chute section is done level endon( "notify_parachute_objective_complete" ); // While in Parachute sequence while( !flag( "flag_parasecure_parachute_landed_player" )) { // Wait for player to be in smoke flag_wait( "flag_parachute_hurt_smoke" ); // While in the smoke while ( flag( "flag_parachute_hurt_smoke" ) ) { // Slow them down and prevent dropping // This gives the player some time to get out of the smoke level._forward_brake_deceleration = -150.0; level._descent_acceleration = 0.0; level._max_descent_velocity = 15; level._min_descent_velocity = 0; level._max_forward_velocity = 400; level._player display_hint( "hint_parachute_smoke" ); //if( cointoss()) //{ // radio_dialogue( "hithard_bak_para_02" ); // JR - Line was cut //} //else //{ //radio_dialogue( "hithard_bak_para_13" ); //} //PlayFX( LoadFX( "smoke/thick_dark_smoke_giant_dcburning" ), self.origin ); self PlayRumbleOnEntity( "grenade_rumble" ); self StunPlayer( 1.5 ); self thread play_sound_on_entity( "breathing_hurt" ); if ( self.health <= 45 ) { if ( !flag( "flag_parachute_objective_failed" )) { maps\nx_hithard_util::objective_failed( "parachute", &"NX_HITHARD_PARACHUTE_FAIL_SMOKE" ); } } else { self.health = self.health - 30; } wait 1.25; } level._forward_brake_deceleration = 0.0; level._descent_acceleration = 0.0; level._max_descent_velocity = 1200; level._min_descent_velocity = 77; level._max_forward_velocity = 890; // Not in smoke anymore } } //******************************************************************* // * // * //******************************************************************* // Ally landing sequence parachute_ally_landing( parachute_vehicle, node_landing_location ) { flag_wait( "flag_node_parachute_approach_" + self.script_noteworthy ); parachute_vehicle set_heli_move( "approach" );//make the pitch and roll less, also make the yaw tighter. needed to get things to line up. level notify ( "parachute_approach_start" ); flag_wait( "flag_origin_path_parachute_land_" + self.script_noteworthy ); level notify ( "parachute_path_complete" ); // Vars flag_node_anim_name = "origin_begin_land_" + self.script_noteworthy; // Get the node that will initiate the landing anim flag_node_ally_land = GetStruct( flag_node_anim_name, "script_noteworthy" ); // flag_wait( flag_node_anim_name ); // Squad leader only // if ( self.script_noteworthy == level.squad_noteworthies[0] ) // { // // Dialogue: "Snipers on the roof. Northwest corner. Take 'em out." // thread radio_dialogue( "hithard_bak_secure_01" ); // //objective_setpointertextoverride( 1, &"" ); //Clear the pointer text // //objective_onentity( 1, node_landing_location ); // } //now we need to move the parachute and the actor together to the node for animation lerping their angles //and position. level notify( "notify_ally_parachute_complete" ); //reached the end of the path sort of. Where we want to end is right before the last node so there is no speed drop. parachute_vehicle vehicle_stoppath(); parachute_vehicle suspend_drive_anims_for_vignette(); //... but that means were not gauranteed to be on the node, so instead lets use a mover to lerp our orientation // and position at the same speed as the vehicle was moving to the correct location. dist = Distance( flag_node_ally_land.origin, parachute_vehicle.origin ); time = dist / ( parachute_vehicle.veh_speed * CONST_MPHCONVERSION ); actor_anim_name = "anim_parachute_land_" + self.script_noteworthy; //anim_parachute_land_ally_02 vehicle_anim_name = "anim_parachute_" + self.script_noteworthy; //anim_parachute_ally_02 self unlink(); parachute_vehicle guy_exit_vehicle( self ); parachute_vehicle hide(); parachute = spawn( "script_model", parachute_vehicle.origin ); parachute.angles = parachute_vehicle.angles; parachute SetModel( level._scr_model[ vehicle_anim_name ] ); parachute UseAnimTree( level._scr_animtree[ vehicle_anim_name ] ); self LinkTo( parachute, "tag_driver" ); //also need to play the idle anim in the same spot as the vehicle. parachute_anim = level._vehicle_DriveIdle[ "vehicle_parachute" ]; idle_time = parachute_vehicle GetAnimTime( parachute_anim ); parachute SetAnim( parachute_anim, 1, 0 ); parachute SetAnimTime( parachute_anim, idle_time ); parachute MoveTo( flag_node_ally_land.origin, time, 0, 0 );//do not accelerate. parachute RotateTo( flag_node_ally_land.angles, time ); wait time; self unlink(); //now that we're at the right location, play the animation for the landing. land_group = []; land_group["parachute" + self.script_noteworthy] = parachute; land_group["ally" + self.script_noteworthy] = self; parachute.animname = vehicle_anim_name; self.animname = actor_anim_name; parachute UseAnimTree( level._scr_animtree[ vehicle_anim_name ] ); flag_node_ally_land anim_single( land_group, "anim_parachute_land" ); self.ignoreall = false; } // Loads and plays the animated billboard binks parachute_billboard_binks( from_playerstart ) { // Only wait for this flag when playing natural progression if( !isDefined( from_playerstart )) { level._player waittill("intro_aa_start"); } // preload the movie SetSavedDvar( "cg_cinematicFullScreen", "0" ); CinematicInGameLoopResident( "HHAH_Ads" ); level waittill( "flag_prepare_for_landing" ); StopCinematicInGame(); } //******************************************************************* // * // * //******************************************************************* // Triggers the 2 vtols that fly in after building 2 parachute_periph_vtols() { flag_wait( "flag_parachute_section_02" ); wait( 0.3 ); vtol = spawn_vehicles_from_targetname_and_drive ( "periph_vtols" ); } parachute_bridge_explo_sfx() { level._player setchannelvolumes( "snd_channelvolprio_pain", "nx_hithard_skybridge_explo", 1.7 ); wait( 1.71 ); skybridge_explo = getent("parachute_bridge_exp1_01", "targetname"); skybridge_explo playsound("hithard_skybridge_destroy"); wait 4.0; level._player deactivatechannelvolumes( "snd_channelvolprio_pain", 1 ); } // Triggers a series of explosions across skybridge 1 parachute_bridge_explosion_01() { flag_wait( "flag_parachute_section_03" ); thread parachute_bridge_explo_sfx(); wait( 2.25 ); // Stop spawning civilians flag_set( "flag_skybridge_exp_1" ); skybridge_single_explosion( getEnt( "parachute_bridge_exp1_01", "targetname" )); wait( 0.16 ); skybridge_single_explosion( getEnt( "parachute_bridge_exp1_02", "targetname" )); wait( 0.11 ); skybridge_single_explosion( getEnt( "parachute_bridge_exp1_03", "targetname" )); wait( 0.22 ); skybridge_single_explosion( getEnt( "parachute_bridge_exp1_04", "targetname" )); wait( 0.35 ); skybridge_single_explosion( getEnt( "parachute_bridge_exp1_05", "targetname" )); } // Triggers a series of explosions across skybridge 2 parachute_bridge_explosion_02() { flag_wait( "flag_parachute_section_03" ); wait( 2.8 ); // Stop spawning civilians flag_set( "flag_skybridge_exp_2" ); skybridge_single_explosion( getEnt( "parachute_bridge_exp2_01", "targetname" )); wait( 0.50 ); skybridge_single_explosion( getEnt( "parachute_bridge_exp2_02", "targetname" )); wait( 0.15 ); skybridge_single_explosion( getEnt( "parachute_bridge_exp2_03", "targetname" )); wait( 0.18 ); skybridge_single_explosion( getEnt( "parachute_bridge_exp2_04", "targetname" )); wait( 0.12 ); } // Causes 1 skybridge explosion with physics force skybridge_single_explosion( origin ) { forward = AnglesToForward( origin.angles ); up = AnglesToUp( origin.angles ); playFX( level._effect[ "nx_explosion_skybridge" ], origin.origin, forward, up ); //playFX( level._effect[ "osprey_missle_hit_explosion_l" ], origin.origin, forward, up ); radiusDamage( origin.origin, origin.radius, 9000, 9000 ); wait( 0.05 ); PhysicsExplosionSphere( origin.origin, origin.radius * 2, ( origin.radius * 2 ), 5 ); } // Skybridge civilians ragdoll when dead skybridge_civilian_logic( stop_flag ) { level endon( stop_flag ); self.skipDeathAnim = true; self waittill( "death" ); if( isDefined( self )) { self StartRagdoll(); } } // JR - Playerstart debug point for testing the skybridge explosion playerstart_skybridge_debug() { maps\nx_crowd_controller::main(); // teleport player level._player maps\_nx_utility::move_player_to_start_point( "playerstart_skybridge_debug" ); thread maps\nx_hithard_fx::apply_vision_and_fog_parachute_jump(0.0); // Start civilians skybridge_civilians = GetEntArray( "parachute_civies_04_spawner", "script_noteworthy" ); array_spawn_function( skybridge_civilians, ::skybridge_civilian_logic, "flag_skybridge_exp_1" ); thread parachute_civilian_panic_logic( "civies_04", "flag_skybridge_exp_1" ); skybridge_civilians = GetEntArray( "parachute_civies_04b_spawner", "script_noteworthy" ); array_spawn_function( skybridge_civilians, ::skybridge_civilian_logic, "flag_skybridge_exp_2" ); thread parachute_civilian_panic_logic( "civies_04b", "flag_skybridge_exp_2" ); thread parachute_bridge_explosion_01(); thread parachute_bridge_explosion_02(); thread skybridge_magic_bullets_01(); thread skybridge_magic_bullets_02(); // Wait here forever flag_wait( "flag_parachute_section_04" ); } // JR - This is only used with the skybridge debug start skybridge_debug() { // wait here forever flag_wait( "flag_parachute_section_04" ); } // JR - This needs to be timed up in synch with the bridge explosions skybridge_magic_bullets_01() { flag_wait( "flag_parachute_section_03" ); wait( 0.4 ); // Get the origin node magic_bullet_node = GetEnt( "skybridge_magic_bullet", "targetname" ); magicbullet( "rpgx_straight", magic_bullet_node.origin, getEnt( "parachute_bridge_exp1_01", "targetname" ).origin ); wait 0.4; magicbullet( "rpgx_straight", magic_bullet_node.origin, getEnt( "parachute_bridge_exp1_02", "targetname" ).origin ); wait 0.65; //magicbullet( "rpgx_straight", magic_bullet_node.origin, getEnt( "parachute_bridge_exp1_03", "targetname" ).origin ); //wait 0.5; //magicbullet( "rpgx_straight", magic_bullet_node.origin, getEnt( "parachute_bridge_exp1_04", "targetname" ).origin ); wait 0.45; magicbullet( "rpgx_straight", magic_bullet_node.origin, getEnt( "parachute_bridge_exp1_05", "targetname" ).origin ); } // Upper skybridge bullets skybridge_magic_bullets_02() { flag_wait( "flag_parachute_section_03" ); wait( 0.25 ); // Get the origin node magic_bullet_node = GetEnt( "skybridge_magic_bullet", "targetname" ); magicbullet( "rpgx_straight", magic_bullet_node.origin, getEnt( "parachute_bridge_exp2_02", "targetname" ).origin ); wait( 0.75 ); magicbullet( "rpgx_straight", magic_bullet_node.origin, getEnt( "parachute_bridge_exp2_03", "targetname" ).origin ); wait( 0.45 ); magicbullet( "rpgx_straight", magic_bullet_node.origin, getEnt( "parachute_bridge_exp2_04", "targetname" ).origin ); }