//**************************************************************************** // ** // Confidential - (C) Activision Publishing, Inc. 2010 ** // ** //**************************************************************************** // ** // Module: NX_LUNAR, Get to the Armory Mission Script ** // ** // Created: 11/25/2010 - Travis Chen ** // ** //**************************************************************************** #include maps\_utility; #include maps\_hud_util; #include maps\_utility_code; #include maps\_nx_objective_util; #include common_scripts\utility; #include maps\_anim; #include maps\_vehicle; //******************************************************************* // * // * //******************************************************************* DEBUG_DISPLAY_INTENSITY = false; //******************************************************************* // * // * //******************************************************************* mission_precache() { //PreCacheShellShock( "nx_lunar_get_to_armory" ); } mission_flag_inits() { flag_init( "vehicle_airlock_open" ); flag_init( "start_stumble_walk" ); flag_init( "stumble_walk_allies_dead" ); flag_init( "hallway_taser_hit" ); flag_init( "falcon_taser_vignette"); flag_init( "falcon_taser_handoff"); flag_init( "vehicle_airlock_breached" ); flag_init( "ready_for_armory_breach"); flag_init( "vignette_armory_breach"); flag_init( "vo_base_compromise_bc"); flag_init ("airlock_animation_done"); flag_init ("disable_random_distant_breach"); } //******************************************************************* // * // * //******************************************************************* get_to_the_armory_door_status_init() { level thread maps\nx_lunar_util::lunar_door_status( "vehicle_airlock_door_01", "status_green" ); level thread maps\nx_lunar_util::lunar_door_status( "vehicle_airlock_door_02", "status_red" ); level thread maps\nx_lunar_util::lunar_door_status( "vehicle_hatch_breach", "status_green" ); level thread maps\nx_lunar_util::lunar_door_status( "vehicle_door_01", "status_green" ); level thread maps\nx_lunar_util::lunar_door_status( "vehicle_door_02", "status_green" ); level thread maps\nx_lunar_util::lunar_door_status( "vehicle_door_03", "status_green" ); level thread maps\nx_lunar_util::lunar_door_status( "vehicle_door_04", "status_green" ); level thread maps\nx_lunar_util::lunar_door_status( "vehicle_airlock_breach_01", "status_green" ); level thread maps\nx_lunar_util::lunar_door_status( "hub_01_door_01", "status_red" ); } open_all_vehicle_bay_doors() { level thread maps\nx_lunar_util::open_lunar_door( "vehicle_airlock_breach_01", 0.2 ); level thread maps\nx_lunar_util::open_lunar_door( "vehicle_airlock_door_02", 0.2 ); level thread maps\nx_lunar_util::open_lunar_door( "vehicle_door_01", 0.2 ); level thread maps\nx_lunar_util::open_lunar_door( "vehicle_door_02", 0.2 ); level thread maps\nx_lunar_util::open_lunar_door( "vehicle_door_03", 0.2 ); level thread maps\nx_lunar_util::open_lunar_door( "vehicle_door_04", 0.2 ); } //******************************************************************* // * // * //******************************************************************* get_to_the_armory_start() { thread maps\_introscreen::nx_lunar_intro(); level thread maps\nx_lunar_util::open_lunar_door( "vehicle_door_03", 0.2 ); level._player takeallweapons(); level._player GiveWeapon( "freerunner_lunar" ); level._player SwitchToWeapon( "freerunner_lunar" ); setSavedDvar( "player_sprintUnlimited", "1" ); setSavedDvar( "player_sprintSpeedScale", 1 ); // Start the player and allies maps\nx_lunar_util::lunar_start( "get_to_the_armory_player_start" ); // Player is invulnerable level._player EnableInvulnerability(); // Give the player the broken helmet overlay level thread maps\nx_lunar_intro::rover_broken_visor_overlay(); level notify( "break_visor" ); // Start dialog chain level thread get_to_the_armory_dialog(); // Play lunar screen binks thread maps\nx_lunar_util::lunar_screen_binks(); } get_to_the_armory() { // Room status logic, kills player if in depressurized room level thread room_status_init(); //set the sfx helmet state to semi-depressurized flag_set( "sfx_ext_surface_engsuit_semipress" ); //(walking from rover to airlock in a semi-busted engineering suit) // Airlock sequence, moves into breach through base logic level thread airlock_and_breach(); // Wakeup the player wakeup_after_rover_crash(); // Open the armory door level thread maps\nx_lunar_util::open_lunar_door( "armory_door", 1.0 ); // Create props for armory level thread maps\nx_lunar_anim::armory_breach_create_props(); // Breach explosion clip level thread maps\nx_lunar_escape_interior::breach_explosion_clip_before(); // Spawn allies if( ( !isDefined( level.eagle ) ) && ( !isDefined ( level.falcon ) ) ) { level thread maps\nx_lunar_util::lunar_ally_spawn(); } // We can't have Falcon already be at the armory when Falcon leads you there. Sorry, real Falcon. level.falcon stop_magic_bullet_shield(); level.falcon delete(); // Prevent Eagle from trying to path to Take Back Control nodes. His color is re-enabled after entering the armory. level.eagle disable_ai_color(); // Armory enter vignette armory_enter_vignette(); // Play lunar screen binks thread maps\nx_lunar_util::lunar_screen_binks(); } //******************************************************************* // * // * //******************************************************************* DEBUG_GET_TO_THE_ARMORY = false; wakeup_after_rover_crash() { thread breach_group_01_spawn(); thread vehicle_bay_upstairs_civilians(); level thread maps\nx_lunar_util::lunar_door_keypad_cycle ( "vehicle_airlock_breach_01" ); level._player FreezeControls( true ); // KenM - This is a workaround for the time being. FreezeControls should also disable crouching, but is not presently. level._player AllowCrouch( false ); // Thread stumble walk level thread player_wakeup(); level._player setchannelvolumes( "snd_channelvolprio_level", "nx_lunar_get_to_armory_vol", 0.1 ); //level._player ShellShock( "nx_lunar_get_to_armory", 10000 ); thread fade_in_from_crash(); thread sound_intro_sfx(); SetBlur( 20, 0 ); SetBlur( 0, 8 ); //scene = "wakeup"; scene = "vehiclebay_wakeup"; //anim_node = GetEnt( "player_wakeup", "targetname" ); anim_node = GetEnt("vignette_player_wakeup_vh_bay", "targetname"); player_rig = spawn_anim_model( "player_rig" ); ally_01 = maps\_nx_vignette_util::vignette_actor_spawn("vignette_wakeup_vh_bay_ally01", "ally_01"); //"value" (kvp), "anim_name" ally_02 = maps\_nx_vignette_util::vignette_actor_spawn("vignette_wakeup_vh_bay_ally02", "ally_02"); //"value" (kvp), "anim_name" guys = []; guys["ally_01"] = ally_01; guys["ally_02"] = ally_02; //guys["player_rig"] = player_rig; thread start_opening_battle(); thread fx_helmet_sequencing(); // thread fx_dust_hands(player_rig); thread fx_hhh_intro_vision_fade_to_lunar_view(); ally_02 thread rover_shoots_wakeup_ally(); waittillframeend; // KenM Moving this here so it overwrites the full health granted by a restart level._player SetSuitShieldHealth( 5 ); SetSavedDvar( "lunar_hud_suit_shield_fake_health", 1 ); //fake the UI so that if the player actually dies it will still show low health. SetSavedDvar( "lunar_hud_suit_shield_fake_health_level", 0.5 ); level._player maps\_moon::set_suit_hud_type( "civilian" ); level._player PutOnHelmet( true ); // When DEBUG_GET_TO_THE_ARMORY is true, skip the intro wakeup animation if( !DEBUG_GET_TO_THE_ARMORY ) { anim_node anim_first_frame( guys, scene ); anim_node anim_first_frame_solo( player_rig, scene ); level._player PlayerLinkToDelta( player_rig, "tag_player", 1, 0, 0, 0, 0, true ); // have to place this so we can see the vignette temp. - Rob wait 6; thread fx_wakeup_after_rover_crash(player_rig, ally_01, ally_02); anim_node thread anim_single( guys, scene ); anim_node anim_single_solo( player_rig, scene ); player_rig Delete(); flag_set( "start_stumble_walk" ); level._player FreezeControls( false ); wait 3.0; // iPrintLnBold( "FX - Start Killing dudes" ); ally_01 maps\_nx_vignette_util::vignette_actor_kill(); //wait 5.0; //StopFXOnTag( level._effect[ "nx_lunar_intro_blood_squirt" ], ally_02, "tag_eye" ); ally_02 maps\_nx_vignette_util::vignette_actor_kill(); } battlechatter_off( "allies" ); } rover_shoots_wakeup_ally() { level waittill ("wakeup_ally_shot"); magicBullet( "lunarrifle", level.breach_rover.mgturret[0] getTagOrigin( "tag_flash" ), self getTagOrigin( "tag_eye" ) ); } // NoteTrack calls fx_lunar_vehiclebay_wakeup_ally_01_hit_ground(ally_01) { wait 2.5; // iPrintLnBold( "FX - Ally 01 Hit Ground" ); tagPos = ally_01 getTagOrigin( "J_Shoulder_LE" ); playFX( level._effect[ "nx_regolith_bodyfall" ], tagPos, ( 0, 0, 1 ) ); //tagPos = ally_01 getTagOrigin( "J_Mouth_LE" ); //playFX( level._effect[ "nx_regolith_bodyfall" ], tagPos, ( 0, 0, 1 ) ); } fx_lunar_vehiclebay_wakeup_ally_02_shot(ally_02) { //iPrintLnBold( "FX - Ally 02 SHOT" ); playfxontag( level._effect[ "nx_lunar_intro_blood_squirt" ], ally_02, "tag_eye" ); playfxontag( level._effect[ "nx_lunar_falcon_death_blood_hit" ], ally_02, "tag_eye" ); playfxontag( level._effect[ "nx_lunar_intro_glass_hit" ], ally_02, "tag_eye" ); new_head = "nx_us_space_assault_head_crack"; ally_02 Detach( ally_02.headmodel ); // remove the head model ally_02.headmodel = new_head; // record the name of the new head ally_02 Attach( new_head ); // attach a new head on the guy wait 0.35; thread fx_lunar_vehiclebay_wakeup_ally_02_hit_ground(ally_02); // foot sliding across the ground for (i=0; i<5; i++) { tagPos = ally_02 getTagOrigin( "J_Ball_RI" ); playFX( level._effect[ "nx_regolith_footfall" ], tagPos, (0, 0, 1) ); wait 0.2; } } /* crew_module_airlock_death_vignette_fx() { // Footsteps. wait 5.5; tagPos = self getTagOrigin( "J_Ball_RI" ); playFX( level._effect[ "footdust_small" ], tagPos + ( 4, 10, 0 ), ( 0, 0, 1 ) ); wait 0.9; tagPos = self getTagOrigin( "J_Ball_LE" ); playFX( level._effect[ "footdust_small" ], tagPos + ( 4, 10, 0 ), ( 0, 0, 1 ) ); wait 0.9; tagPos = self getTagOrigin( "J_Ball_RI" ); playFX( level._effect[ "footdust_small" ], tagPos + ( 4, 10, 0 ), ( 0, 0, 1 ) ); // Hit. wait 0.9; tagPos = self getTagOrigin( "tag_eye" ); playFX( level._effect[ "nx_lunar_falcon_death_blood_hit" ], tagPos, ( -1, 0, 0) ); playFXOnTag( level._effect[ "nx_lunar_crew_airlock_blood_squirt"], self, "tag_eye" ); // Collapse dust. wait 2.1; tagPos = self getTagOrigin( "J_SpineUpper" ); playFX( level._effect[ "nx_lunar_crew_airlock_impact_large" ], tagPos + ( 0, 14, -10) ); stopFXOnTag( level._effect[ "nx_lunar_crew_airlock_blood_squirt"], self, "tag_eye" ); } */ fx_lunar_vehiclebay_wakeup_ally_02_hit_ground( ally_02 ) { // wait 1.633; wait 1.0; // iPrintLnBold( "FX - Ally 02 Hit Ground" ); tagPos = ally_02 getTagOrigin( "TAG_STOWED_HIP_REAR" ); playFX( level._effect[ "nx_regolith_bodyfall" ], tagPos, ( 0, 0, 1 ) ); wait 0.5; tagPos = ally_02 getTagOrigin( "TAG_SHIELD_BACK" ); playFX( level._effect[ "nx_regolith_bodyfall" ], tagPos, ( 0, 0, 1 ) ); } fx_wakeup_after_rover_crash(player_rig, ally_01, ally_02) { // iPrintLnBold( "FX - Start_Sequence ..." ); thread fx_lunar_vehiclebay_wakeup_ally_01_hit_ground(ally_01); wait 9.46; handfall_offset = (0,0,1); footfall_offset = (0,0,1); // Hands ---------------------------------- tagPos = player_rig getTagOrigin( "J_Mid_LE_1" ); playFX( level._effect[ "nx_regolith_footfall" ], (tagPos + handfall_offset), ( 0, 0, 1 ) ); wait 1.1; tagPos = player_rig getTagOrigin( "J_Mid_RI_1" ); playFX( level._effect[ "nx_regolith_footfall" ], (tagPos + handfall_offset), ( 0, 0, 1 ) ); wait 0.5; tagPos = player_rig getTagOrigin( "J_Mid_LE_1" ); playFX( level._effect[ "nx_regolith_footfall" ], (tagPos + footfall_offset), ( 0, 0, 1 ) ); // playfxontag( level._effect[ "nx_lunar_regolith_haze" ], player_rig, "tag_player"); // Feet ---------------------------------- wait 2.56; tagPos = ally_02 getTagOrigin( "J_Ball_RI" ); playFX( level._effect[ "nx_regolith_footfall" ], (tagPos + footfall_offset), ( 0, 0, 1 ) ); wait 0.66; tagPos = ally_02 getTagOrigin( "J_Ball_LE" ); playFX( level._effect[ "nx_regolith_footfall" ], (tagPos + footfall_offset), ( 0, 0, 1 ) ); wait 0.60; tagPos = ally_02 getTagOrigin( "J_Ball_RI" ); playFX( level._effect[ "nx_regolith_footfall" ], (tagPos + footfall_offset), ( 0, 0, 1 ) ); } opening_battle_enemy_spawn() { ob_enemy = self spawn_ai( true ); ob_enemy thread magic_bullet_shield(); ob_enemy.goalradius = 16; ob_enemy.baseAccuracy = .5; ob_enemy enable_cqbwalk(); //move to the destination node described in the script_noteworthy //wait a little bit since the screen is black - randomizing also helps break up the unity wait( randomfloatrange( 3.0, 5.0 ) ); println( self.script_noteworthy ); ob_enemy_dest = getnode( self.script_noteworthy, "targetname" ); ob_enemy SetGoalNode( ob_enemy_dest ); flag_wait( "stumble_walk_allies_dead" ); //switch from completely ignoring the player to just one or two guys up front ignoring the player level._player.ignoreme = false; if( ob_enemy.script_noteworthy == "intro_battle_enemy3_destination" ) { ob_enemy.baseAccuracy = 0; } else if( ob_enemy.script_noteworthy == "intro_battle_enemy4_destination" ) { ob_enemy.baseAccuracy = 0; } else { ob_enemy.ignoreall = true; } //flag_wait( "player_in_vehicle_airlock" ); flag_wait( "vignette_vh_bay_breach" ); //flag_wait( "stumble_walk_allies_dead" ); //wait ( 8 ); //move some ai guys towards the door if ( isdefined ( ob_enemy_dest.script_noteworthy ) ) { //println( "moving" ); //println ( ob_enemy.script_noteworthy ); //println ( ob_enemy_dest.script_noteworthy ); //stop firing at the player ob_enemy.ignoreall = true; ob_enemy disable_cqbwalk(); ob_enemy_dest2 = getnode( ob_enemy_dest.script_noteworthy, "targetname" ); ob_enemy SetGoalNode( ob_enemy_dest2 ); } flag_wait( "vehicle_airlock_breached" ); ob_enemy forceUseWeapon( "lunarrifle_silent", "primary" ); ob_enemy stop_magic_bullet_shield(); ob_enemy kill(); } start_opening_battle() { //an ai battle to enhance the mood level._player.ignoreme = true; ob_ally01_actor = getent( "opening_battle_ally_01", "script_noteworthy" ); ob_ally02_actor = getent( "opening_battle_ally_02", "script_noteworthy" ); ob_ally03_actor = getent( "opening_battle_ally_03", "script_noteworthy" ); //Spawn the enemies and run through their actions array_thread( getentarray( "intro_battle_enemy", "targetname" ), ::opening_battle_enemy_spawn ); ob_ally01 = ob_ally01_actor spawn_ai( true ); ob_ally01 thread magic_bullet_shield(); ob_ally01.baseAccuracy = 0; ob_ally02 = ob_ally02_actor spawn_ai( true ); ob_ally02 thread magic_bullet_shield(); ob_ally02.baseAccuracy = 0; ob_ally03 = ob_ally03_actor spawn_ai( true ); ob_ally03 thread magic_bullet_shield(); ob_ally03.baseAccuracy = 0; //make the ally's move towards the door wait( 27 ); ob_ally01_dest = getnode( "intro_battle_ally1_destination", "targetname" ); ob_ally01 SetGoalNode( ob_ally01_dest ); wait( 1 ); ob_ally02_dest = getnode( "intro_battle_ally2_destination", "targetname" ); ob_ally02 SetGoalNode( ob_ally02_dest ); wait( .5 ); ob_ally03_dest = getnode( "intro_battle_ally3_destination", "targetname" ); ob_ally03 SetGoalNode( ob_ally03_dest ); //allow allies to be killed wait( 2.5 ); ob_ally01 stop_magic_bullet_shield(); ob_ally02 stop_magic_bullet_shield(); ob_ally03 stop_magic_bullet_shield(); //Force allies to be killed by enemy bullets bad_guys = GetAIArray( "axis" ); //magicBullet( "lunarrifle", bad_guys[1] getTagOrigin( "tag_flash" ), ob_ally01 getTagOrigin( "tag_eye" ) ); ob_special_1 = get_ai_group_ai( "ob_special_1" )[0]; magicBullet( "lunarrifle", ob_special_1 getTagOrigin( "tag_flash" ), ob_ally01 getTagOrigin( "J_head" ) ); ob_ally01 kill(); wait ( 2.1 ); ob_special_2 = get_ai_group_ai( "ob_special_2" )[0]; magicBullet( "lunarrifle", ob_special_2.origin + (0,0,48), ob_ally03 getTagOrigin( "TAG_STOWED_BACK" ) ); ob_ally03 kill(); wait ( 1.55 ); magicBullet( "lunarrifle", ob_special_1 getTagOrigin( "tag_flash" ), ob_ally02 getTagOrigin( "J_spine4" ) ); ob_ally02 kill(); flag_set( "stumble_walk_allies_dead" ); } fx_hhh_intro_vision_fade_to_lunar_view() { //iPrintLnBold("--- fx_hhh_intro_vision_fade_to_lunar_view ---"); wait 5.0; //iPrintLnBold("--- starting vision set change ---"); set_vision_set("nx_lunar_surface_intro", 6.0); } sound_intro_sfx() { wait 2.9; mynodeEntity = spawn( "sound_emitter", ( 4391, -283, -1566 ) ); mynodeEntity PlaySound( "scn_get_to_armory_1_lr" ); mynodeEntity3 = spawn( "sound_emitter", ( 4390, -283, -1566 ) ); mynodeEntity3 PlaySound( "scn_get_to_armory_1_lsrs" ); wait 3.1; //mynodeEntity4 = spawn( "sound_emitter", ( 4380, -283, -1566 ) ); //mynodeEntity4 PlaySound( "scn_intro_hand_mvmt", "scn_intro_hand_mvmt", true ); //mynodeEntity4 waittill( "scn_intro_hand_mvmt" ); //mynodeEntity4 delete(); //org waittill( "scn_get_to_armory_1_lr" ); //org delete(); mynode8 = spawn( "sound_emitter", ( 5728, -192, -1488 ) ); mynode8 PlayloopSound( "emt_red_alert_vo" ); mynode9 = spawn( "sound_emitter", ( 6832, -112, -1488 ) ); mynode9 PlayloopSound( "emt_red_alert_vo" ); flag_wait ( "player_in_vehicle_airlock" ); wait 4.5; //mynodeEntity2 = spawn( "sound_emitter", ( 4391, -283, -1566 ) ); //mynodeEntity2 PlaySound( "scn_get_to_armory_2", "scn_get_to_armory_2", true ); wait 3; SetSavedDvar( "cg_minBreathingLevel", "4" ); mynode10 = spawn( "sound_emitter", ( 4548, 196, -1480 ) ); mynode10 PlaySound( "emt_red_alert_intro" ); mynodeEntity stopsounds(); wait 0.1; mynodeEntity delete(); mynodeEntity3 stopsounds(); wait 0.1; mynodeEntity3 delete(); //mynodeEntity2 waittill( "scn_get_to_armory_2" ); //mynodeEntity2 delete(); flag_wait( "vignette_armory_enter" ); mynode8 stopsounds(); mynode9 stopsounds(); wait 0.1; mynode8 delete(); mynode9 delete(); mynode10 delete(); flag_wait( "player_has_helmet" ); SetSavedDvar( "cg_minBreathingLevel", "0" ); } fade_in_from_crash() { black_overlay = get_black_overlay(); black_overlay.alpha = 1; fade_in_time = 15; wait( 3 ); black_overlay FadeOverTime( fade_in_time ); black_overlay.alpha = 0; } get_black_overlay() { if ( !isdefined( level._black_overlay ) ) level._black_overlay = create_client_overlay( "black", 0, level._player ); level._black_overlay.sort = -1; return level._black_overlay; } fx_dust_hands(player_rig) { // J_Mid_RI_1 // J_Mid_LE_1 playfxontag( level._effect[ "nx_lunar_regolith_haze" ], player_rig, "tag_player", true ); for (i=0; i<20; i++) { playfxontag( level._effect[ "nx_regolith_hands" ], player_rig, "J_Mid_RI_1", true ); playfxontag( level._effect[ "nx_regolith_hands" ], player_rig, "J_Mid_LE_1", true ); wait 0.5; } } fx_helmet_sequencing() { self endon( "stop_player_visor_glass_cracking" ); // need the hook to the viewmodel hands rig wait 6.0; // wait until we can see while (1) { if (randomfloat(1.0) > 0.5) { playfxontag( level._effect[ "nx_lunar_helmet_leak_vapor_left" ], level._player, "tag_vfx_left", true ); } else { playfxontag( level._effect[ "nx_lunar_helmet_leak_vapor_right" ], level._player, "tag_vfx_right", true ); } wait ( 0.5 + randomfloat( 1.5 ) ); } } player_wakeup() { thread maps\nx_lunar_anim::dead_crew_wakeup(); level._player_heartrate = 1.4; level thread player_heartbeat(); set_vision_set ("nx_lunar_get_to_the_armory", 0.0); flag_wait( "start_stumble_walk" ); level thread player_wakeup_movement_speed( 0.6 ); waittillframeend; flag_clear ("start_stumble_walk"); //level._player FadeOutShellShock(); thread stumble_walk( 0, 20.0, true, true, 0.0, true, 6.0 ); //DR: hack: currently this is not in a good place. I need a script call where //the player has stood up and is now moving forward. Right now I have a big long wait //since this flag is being set too early. flag_set( "music_player_wakes_up" ); } player_wakeup_movement_speed( speed ) { level._player AllowCrouch( false ); level._player AllowProne( false ); level._player AllowJump( false ); level._player AllowSprint( false ); // Turn off the stance HUD indicator while the player cannot crouch SetSavedDvar( "ammoCounterHide", "1" ); level._player blend_movespeedscale( 0.25, 0.1 ); level._player delayThread( 1, ::blend_movespeedscale, speed, 5 ); } stop_stumble_walk( stop_wait ) { level notify( "stop_stumble_walk" ); level._player blend_movespeedscale( 1.0, stop_wait ); // Wait a bit to stop wait( stop_wait ); level._player AllowCrouch( true ); level._player AllowProne( true ); level._player AllowJump( true ); level._player AllowSprint( true ); // Turn the stance HUD indicator back on SetSavedDvar( "ammoCounterHide", "0" ); SetBlur( 0, stop_wait ); } player_stumble_walk_intensity_update( starting_walk_intensity, ramp_time ) { level endon( "stop_stumble_walk" ); Assert( ramp_time > 0 ); Assert( starting_walk_intensity <= 1.0 && starting_walk_intensity >= 0 ); // Starting intensity. self.walk_intensity = starting_walk_intensity; // Update intensity. start_time = GetTime() - (( ramp_time * starting_walk_intensity ) * 1000.0 ); last_display_time = start_time; while ( 1 ) { // Update. current_time = GetTime() - start_time; self.walk_intensity = ( current_time / 1000.0 ) / ramp_time; if ( self.walk_intensity > 1.0 ) { self.walk_intensity = 1.0; } // Debug draw intensity. if ( DEBUG_DISPLAY_INTENSITY ) { if ( GetTime() - last_display_time > 1.0 ) { last_display_time = GetTime(); iprintlndebug( self.walk_intensity ); } } wait( 0.001 ); } } player_visor_glass_cracking() { level endon( "stop_player_visor_glass_cracking" ); SetSavedDvar( "lunar_hud_suit_shield_fake_health_level", 0.5 ); wait 5.5; level.broken_visor setshader( "nx_lunar_helm_crack_002", 640, 480 ); level._player player_fake_health_level_lerp( 0.3, 0.05 ); wait 4.3; level.broken_visor setshader( "nx_lunar_helm_crack_003", 640, 480 ); level._player player_fake_health_level_lerp( 0.2, 0.05 ); wait 3; level notify( "stop_helmet_light_anim" ); thread maps\nx_lunar_intro::animate_helmet_lights_critical(); level.broken_visor setshader( "nx_lunar_helm_crack_004", 640, 480 ); level._player player_fake_health_level_lerp( 0.075, 0.05 ); wait 1.9; level.broken_visor setshader( "nx_lunar_helm_crack_005", 640, 480 ); level._player player_fake_health_level_lerp( 0.03, 0.05 ); } player_fake_health_level_lerp( end, time ) { self thread player_fake_health_level_lerp_worker( end, time ); } //kindof stolen from suit_shield_smooth_give_health player_fake_health_level_lerp_worker( end, time ) { self endon("death"); self endon("remove_nx_suitshield"); num_steps = time / 0.05; health = GetDvarFloat( "lunar_hud_suit_shield_fake_health_level" ); health_increments = (end - health ) / Float(num_steps); for( i = 0; i < num_steps; i++ ) { health += health_increments; if ( health > Int(GetDvar("player_suitshield_max_health")) || health <= 0 ) { break; } SetSavedDvar( "lunar_hud_suit_shield_fake_health_level", health ); self FlashSuitShieldHealthMeter(); wait 0.05; } } player_stumble_walk_intensity( starting_walk_intensity, ramp_time ) { self player_stumble_walk_intensity_update( starting_walk_intensity, ramp_time ); // Exit logic. self.walk_intensity = 0; } player_random_blackout_next_time() { max_time_between_blackouts = 10.0; random_chance_time = self.walk_intensity * 0.5 + randomfloat( 0.5 ); return max_time_between_blackouts * ( 1.0 - random_chance_time ); } player_random_blackout_update( black_overlay, delay ) { level endon ( "stop_stumble_walk" ); self.stop_blackout = false; next_time = delay; while ( 1 ) { wait( next_time ); fade_in_time = 1.5; black_overlay FadeOverTime( fade_in_time ); black_overlay.alpha = 0.3 + ( 0.7 * self.walk_intensity ); wait( fade_in_time + 0.2 ); fade_out_time = 1.0; black_overlay FadeOverTime( fade_out_time ); black_overlay.alpha = 0; wait( fade_out_time ); next_time = player_random_blackout_next_time(); if ( self.stop_blackout ) { break; } } } player_random_blackout( delay ) { black_overlay = get_black_overlay(); self player_random_blackout_update( black_overlay, delay ); // Make sure blackout turned off. black_overlay FadeOverTime( 1.0 ); black_overlay.alpha = 0; } player_random_blur( ramp ) { level endon ( "stop_stumble_walk" ); if( !IsDefined( ramp ) ) { ramp = 0; } curr_ramp = 0.0; while ( true ) { wait 0.05; if ( randomint( 100 ) > 10 ) continue; blur = randomint( 3 ) + 2; blur_time = randomfloatrange( 0.3, 0.7 ); blur_time = ( blur_time + curr_ramp ); recovery_time = randomfloatrange( 0.3, 1 ); setblur( blur * 1.2, blur_time ); wait blur_time; setblur( 0, recovery_time ); blur_wait_time = randomfloatrange( 2.0, 3.0 ); wait blur_wait_time; curr_ramp = ( curr_ramp + ramp ); } } //******************************************************************* // * // * //******************************************************************* add_heartbeat_pattern_sound( type, beat_time, delay_time ) { next_key = SpawnStruct(); if ( type == "slow" ) { next_key.sound01 = "lunar_slow_heartbeat_01"; next_key.sound02 = "lunar_slow_heartbeat_02"; } else if ( type == "med" ) { next_key.sound01 = "lunar_med_heartbeat_01"; next_key.sound02 = "lunar_med_heartbeat_02"; } else { next_key.sound01 = "lunar_fast_heartbeat_01"; next_key.sound02 = "lunar_fast_heartbeat_02"; } next_key.beat_time = beat_time; next_key.delay_time = delay_time; return next_key; } //******************************************************************* // * // * //******************************************************************* player_heartbeat( ramp ) { level endon ( "stop_stumble_walk" ); level._player endon ( "death" ); wait 2.9; // Build pattern. pattern = []; // Speed, Beat time, Delay until next heartbeat. pattern[ pattern.size ] = add_heartbeat_pattern_sound( "slow", .4, 2 ); pattern[ pattern.size ] = add_heartbeat_pattern_sound( "slow", .4, 2 ); pattern[ pattern.size ] = add_heartbeat_pattern_sound( "slow", .27, 1 ); pattern[ pattern.size ] = add_heartbeat_pattern_sound( "slow", .27, 1 ); pattern[ pattern.size ] = add_heartbeat_pattern_sound( "slow", .22, .67 ); pattern[ pattern.size ] = add_heartbeat_pattern_sound( "slow", .22, .67 ); pattern[ pattern.size ] = add_heartbeat_pattern_sound( "slow", .22, .67 ); pattern[ pattern.size ] = add_heartbeat_pattern_sound( "slow", .22, .67 ); pattern[ pattern.size ] = add_heartbeat_pattern_sound( "slow", .22, .67 ); pattern[ pattern.size ] = add_heartbeat_pattern_sound( "slow", .22, .67 ); pattern[ pattern.size ] = add_heartbeat_pattern_sound( "slow", .22, .67 ); pattern[ pattern.size ] = add_heartbeat_pattern_sound( "slow", .22, .67 ); pattern[ pattern.size ] = add_heartbeat_pattern_sound( "slow", .22, .67 ); pattern[ pattern.size ] = add_heartbeat_pattern_sound( "med", .15, .49 ); pattern[ pattern.size ] = add_heartbeat_pattern_sound( "med", .15, .49 ); pattern[ pattern.size ] = add_heartbeat_pattern_sound( "med", .12, .39 ); pattern[ pattern.size ] = add_heartbeat_pattern_sound( "med", .12, .39 ); pattern[ pattern.size ] = add_heartbeat_pattern_sound( "fast", 0.08, 0.25 ); // Play the pattern. index = 0; while ( 1 ) { next = pattern[ index ]; level._player playsound( next.sound01 ); level._player PlayRumbleOnEntity( "damage_light" ); wait( next.beat_time ); level._player playsound( next.sound02 ); level._player PlayRumbleOnEntity( "damage_light" ); wait( next.delay_time ); // Next. index++; // Keep looping the last item. if ( index >= pattern.size ) { index = pattern.size - 1; } } } //******************************************************************* // * // * //******************************************************************* stumble_walk_ends() { level._player endon( "death" ); level waittill( "stop_stumble_walk" ); time = 0.8; if( IsDefined( level._ground_ref_ent ) ) { level._ground_ref_ent rotateto( (0,0,0), time, time * 0.5, time * 0.5 ); wait time; level._ground_ref_ent delete(); } level._player playerSetGroundReferenceEnt( undefined ); SetSlowMotion( 0.95, 1, 0.5 ); } stumble_walk( starting_walk_intensity, ramp_time, cracking, blur, blur_ramp, blackout, blackout_delay ) { level._ground_ref_ent = spawn( "script_model", ( 0, 0, 0 ) ); level._player playerSetGroundReferenceEnt( level._ground_ref_ent ); thread stumble_walk_ends(); level._player thread player_stumble_walk_intensity( starting_walk_intensity, ramp_time ); if ( IsDefined( cracking ) && cracking ) { level._player thread player_visor_glass_cracking(); } if ( IsDefined( blur ) && blur ) { if ( IsDefined( blur_ramp ) ) { level._player thread player_random_blur( blur_ramp ); } else { level._player thread player_random_blur(); } } if ( IsDefined( blackout ) && blackout ) { if ( IsDefined( blackout_delay ) ) { level._player thread player_random_blackout( blackout_delay ); } else { level._player thread player_random_blackout( 0.0 ); } } // Stop stumble if it's already going, so no double stumle (like dying of vacuum in the intro). // level notify( "stop_stumble_walk" ); // waittillframeend; level endon( "stop_stumble_walk" ); level._unsteady_scale = 2.5; thread SetSlowMotion_overtime(); ent = spawn_tag_origin(); roll_ent = spawn_tag_origin(); thread adjust_swivel_over_time( ent ); pitch_sin = 0; time = 0.1; last_angles = level._player getplayerangles()[1]; for ( ;; ) { new_angles = level._player getplayerangles()[1]; dif = new_angles - last_angles; yaw = dif;//ent.origin[0] + dif; last_angles = new_angles; player_speed = distance( (0,0,0), level._player getvelocity() ); if ( player_speed <= 30) { player_speed = 30; } pitch_sin += player_speed * 0.06; if ( player_speed > 80 ) { new_sin = sin( gettime() * -0.1 ); pitch_sin += new_sin * 10; } pitch = sin( pitch_sin ) * 4 * level._unsteady_scale; wait 0.05; level._ground_ref_ent rotateto( ( pitch * 0.15, yaw * -1, pitch * 0.85 ), time, time * 0.5, time * 0.5 ); } } adjust_swivel_over_time( ent ) { level endon( "stop_stumble_walk" ); next_switch = 1; original_range = 7; for ( ;; ) { range = original_range * level._unsteady_scale; yaw = randomfloatrange( range * 0.5, range ); next_switch--; if ( next_switch <= 0 ) { next_switch = randomint( 3 ); yaw *= -1; } dif = yaw - ent.origin[0]; dif = abs( dif ); time = dif * 0.05; if ( time < 0.05 ) time = 0.05; start_time = gettime(); ent moveto( ( yaw, 0, 0 ), time, time * 0.5, time * 0.5 ); wait time; wait_for_buffer_time_to_pass( start_time, 0.6 ); for ( ;; ) { player_speed = distance( (0,0,0), level._player getvelocity() ); if ( player_speed >= 80 ) break; wait 0.05; } } } SetSlowMotion_overtime() { level endon( "stop_stumble_walk" ); timescale = 1; range = 0.15; time = 4; wait 3; for ( ;; ) { SetSlowMotion( timescale, 0.89, time ); wait time; SetSlowMotion( timescale, 1.06, time ); wait time; } } vehicle_bay_upstairs_civilians() { // top floor civilians civ_topfloor_01 = maps\_nx_vignette_util::vignette_actor_spawn("vehiclebay_breach_top_floor_civ01", "civ_01"); civ_topfloor_02 = maps\_nx_vignette_util::vignette_actor_spawn("vehiclebay_breach_top_floor_civ02", "civ_02"); civ_topfloor_03 = maps\_nx_vignette_util::vignette_actor_spawn("vehiclebay_breach_top_floor_civ03", "civ_01"); // civ_topfloor_04 = maps\_nx_vignette_util::vignette_actor_spawn("vehiclebay_breach_top_floor_civ04", "civ_02"); // node information node_topfloor_01 = getent("vignette_vh_bay_topfloor_civs", "script_noteworthy"); node_topfloor_02 = getent("vignette_vh_bay_topfloor_civs_02", "script_noteworthy"); guys_topfloor_01 = []; guys_topfloor_01["civ_01"] = civ_topfloor_01; guys_topfloor_01["civ_02"] = civ_topfloor_02; guys_topfloor_02 = []; guys_topfloor_02["civ_01"] = civ_topfloor_03; //guys_topfloor_02["civ_02"] = civ_topfloor_04; wait 1.5; node_topfloor_01 thread anim_loop ( guys_topfloor_01, "vehiclebay_breach_loop", "stop_loop"); node_topfloor_02 thread anim_loop ( guys_topfloor_02, "vehiclebay_breach_loop", "stop_loop"); flag_wait ( "player_in_vehicle_airlock" ); node_topfloor_01 notify ("stop_loop"); node_topfloor_02 notify ("stop_loop"); civ_topfloor_01 maps\_nx_vignette_util::vignette_actor_delete(); civ_topfloor_02 maps\_nx_vignette_util::vignette_actor_delete(); civ_topfloor_03 maps\_nx_vignette_util::vignette_actor_delete(); // civ_topfloor_04 delete(); } //******************************************************************* // * // * //******************************************************************* airlock_and_breach() { // Spawn the vehicle, unload and breach breach_rover = spawn_vehicle_from_targetname( "breach_rover" ); level.breach_rover = breach_rover; level.breach_rover.dontunloadonend = true; level.breach_rover vehicle_lights_on( "running" ); waittillframeend; level.breach_rover StartPath (); level._player thread fake_turret_fire(); //JEG - Make riders invicible - the allies in the opening battle were killing them riders = level.breach_rover.riders; foreach( rider in riders ) { if( IsDefined( rider ) ) { rider enable_cqbwalk(); rider thread magic_bullet_shield(); } } // Start driving when the player is mobile flag_wait( "start_stumble_walk" ); exploder( "fx_allies_breach_dust_exterior" ); exploder( "fx_allies_breach_dust_interior" ); exploder( "fx_allies_breach_dust_mote_interior" ); path_start = getVehicleNode( "breach_rover_start", "targetname" ); level.breach_rover AttachPath( path_start ); level.breach_rover StartPath(); level.breach_rover thread enemy_unload_and_breach(); riders = level.breach_rover.riders; level.breach_rover.mgturret[0] SetAISpread ( 1 ); level.breach_rover.mgturret[0].fireInterval = 1.0; // one shot per second level.breach_rover thread breach_rover_distance_check(); // Player not directly targeted level._player.ignoreme = true; level.breach_rover.mgturret[0] TurretFireEnable(); // Eventually kill player if they dawdle level.breach_rover thread kill_player_before_airlock( 22.0 ); // Wait for player to enter airlock flag_wait( "player_in_vehicle_airlock" ); exploder( "fx_allies_breach_dust_bomb" ); thread airlock_dust_fx(); // Turn off the blackout. level._player.stop_blackout = true; // Close first airlock door // wait( 3.0 ); //level._player playsound( "lunar_door_open" ); // Stop rover from firing randomly // level.breach_rover notify( "stop_random_turret_fire" ); level.breach_rover.mgturret[0] TurretFireDisable(); // Wait a bit for door to close wait 2.0; level thread maps\nx_lunar_util::airlock_fx( "vehicle_airlock_breach_01" ); //soundent2 = spawn( "sound_emitter", level._player.origin ); //soundent2 linkto( level._player ); //soundent2 playsound ( "nx_lunar_pressurize" ); // change helmet sfx state //thread maps\_utility::set_ambient( "nx_lunar_get_to_armory" ); flag_set( "sfx_int_base_engsuit_helmet_press" ); //(repressurized in the airlock with engineering suit - helmet visor still down). // Terminal prints //level thread vehicle_airlock_terminal(); maps\nx_lunar_util::airlock_cycle(); // Airlock FX thread airlock_vapor_effects(); thread airlock_vision_effects(); flag_set( "music_player_in_vehicle_airlock" ); // Wait for airlock ready open flag_wait( "vehicle_airlock_open" ); thread maps\_utility::set_ambient( "nx_lunar_get_to_armory" ); //thread maps\_ambient::play_ambience( "nx_lunar_get_to_armory" ); //thread maps\_ambient::start_ambient_event( "nx_lunar_get_to_armory" ); // Checkpoint! level thread autosave_now(); // change the helmet sfx state to having no visor (tbd) flag_set( "sfx_int_base_engsuit_nohelmet_press" ); //(running with helmet up from airlock to armory through pressurized base) // Open the door level thread maps\nx_lunar_util::open_lunar_door( "vehicle_airlock_door_02", 1.0 ); level thread maps\nx_lunar_util::lunar_door_status( "vehicle_airlock_door_02", "status_green" ); level thread maps\nx_lunar_util::lunar_door_status( "vehicle_airlock_breach_01", "status_red" ); // Player leaves airlock, thread breach player logic thread vehicle_bay_civilians_flee(); level thread player_thread(); level thread falcon_thread(); // Randomly played unseen breaches thread distant_breach_randomizer(); // Wait until the player has entered the storage room flag_wait( "vignette_armory_enter" ); // Move Eagle to his start position for the helmet handoff node = getent("vignette_armory_breach", "script_noteworthy"); node anim_teleport_solo( level.eagle, "armory_entrance_player"); level.eagle SetLookAtEntity( level._player ); // Reduce the player's suit's "health" to reflect damage and necessitate patching level._player SetSuitShieldHealth ( 20 ); SetSavedDvar( "lunar_hud_suit_shield_fake_health", 0 ); //no longer fake the UI. level thread maps\nx_lunar_util::open_lunar_door( "vehicle_door_02", 1.0 ); foreach( rider in riders ) { if( IsDefined( rider ) ) { rider stop_magic_bullet_shield(); rider Delete(); } } level.breach_rover vehicle_lights_off( "running", true ); breach_rover Delete(); } //self = the breach rover breach_rover_distance_check() { self endon ("death"); while ( !flag ("player_in_vehicle_airlock") ) { // If the player is ridiculously near the rover, remove invulnerability (so getting run over kills). dist = Distance( self.origin, level._player.origin); wait .1; if ( dist <= 300) { level._player DisableInvulnerability(); SetDvar( "ui_deadquote", "NX_LUNAR_FAIL_RUN_OVER" ); } } } airlock_vapor_effects() { // Pressurization vapor FX exploder( "fx_armory_pressurize" ); wait 10; // Stop pressurization vapor FX stop_exploder( "fx_armory_pressurize" ); } airlock_vision_effects() { // vision set fx set_vision_set("nx_lunar_in_the_breach", 3.0); wait 7.0; set_vision_set("nx_lunar_alert", 8.0); // turn on the exterior vehicle bay light now that we're inside vehicle_bay_key_light = GetEnt( "vehiclebay_key", "targetname" ); vehicle_bay_key_light SetLightIntensity(3.25); } airlock_dust_fx() { stop_exploder( "fx_allies_breach_dust_mote_interior" ); exploder( "fx_allies_breach_dust_mote_crazy_interior" ); wait 4.5; stop_exploder( "fx_allies_breach_dust_interior" ); stop_exploder( "fx_allies_breach_dust_mote_crazy_interior" ); wait 4.0; stop_exploder( "fx_allies_breach_dust_exterior" ); } // self = enemy lgv enemy_unload_and_breach() { thread fake_breachers(); self endon ( "death" ); // Wait till end of path, trigger unload riders = self.riders; self waittill( "reached_end_node" ); self vehicle_unload( "all_but_gunner_and_driver" ); self waittill( "unloaded" ); // Give riders low goal radius foreach( rider in riders ) { rider.goalradius = 0; } // Start breach threads // level thread breach_group_01_thread( riders[ 2 ], riders[ 3 ] ); level thread breach_group_02_thread( riders[ 4 ], riders[ 5 ] ); level thread breach_group_03_thread(); } vehicle_bay_civilians_flee() { flag_wait ("vehicle_bay_civ_flee"); // Spawn the two civs and send them on their way. civ_01 = spawn_anim_model ("model_civ_03" ); civ_02 = spawn_anim_model ("model_civ_04" ); guys = []; guys["civ_01"] = civ_01; guys["civ_02"] = civ_02; // Placeholder until facial goes in. // They're breaching the base! // Get out of the way! civ_01 playsound( "scn_lunar_scientist_run01" ); node = getstruct ( "vignette_civs_up_stairs", "script_noteworthy"); node anim_single ( guys , "civ_up_stairs"); civ_01 delete(); civ_02 delete(); } hub_civilians_flee_spawn( ) { civ_01 = spawn_anim_model("model_civ_01"); civ_02 = spawn_anim_model("model_civ_02"); civ_03 = spawn_anim_model("model_civ_03"); civ_04 = spawn_anim_model("model_civ_04"); civ_05 = spawn_anim_model("model_civ_05"); civ_06 = spawn_anim_model("model_civ_06"); civ_07 = spawn_anim_model("model_civ_07"); guys = []; guys["civ_01"] = civ_01; guys["civ_02"] = civ_02; guys["civ_03"] = civ_03; guys["civ_04"] = civ_04; guys["civ_05"] = civ_05; guys["civ_06"] = civ_06; guys["civ_07"] = civ_07; node = getstruct( "vignette_hub_room_civilians", "script_noteworthy" ); node thread anim_first_frame ( guys, "civ_hub_room"); flag_wait ( "bottom_hub_civ_flee" ); civ_01 playsound( "scn_lunar_scientist_run02" ); node anim_single ( guys, "civ_hub_room"); foreach ( guy in guys ) { guy delete(); } } // self = a civilian civilian_deleter( ) { self endon ("death"); // When the civ gets to where he's going, delete him. Make sure goal entities are out of sight of the player. self waittill ( "goal" ); self delete(); } // This deletes the crates in the vehicle bay bottom floor, so they're gone when the player's squad returns there remove_vehicle_bay_blockers() { blockers = GetEntArray ("vehicle_bay_blocker", "targetname"); foreach (thing in blockers) { thing delete(); } } //******************************************************************* // * // * //******************************************************************* player_thread() { // Player is in vehicle bay airlock prep room close_lunar_door_behind_player( "room_status_vehicle_airlock_prep", "vehicle_airlock_door_02" ); level thread maps\nx_lunar_util::open_lunar_door( "vehicle_door_01", 1.0 ); close_lunar_door_behind_player( "room_status_vehicle_main_lower", "vehicle_door_01" ); // Player is upstairs flag_wait( "player_vehicle_upstairs" ); // level thread maps\nx_lunar_util::open_lunar_door( "vehicle_door_03", 1.0 ); level thread vehicle_upstairs_glass_check(); level thread maps\nx_lunar_util::open_lunar_door( "control_door_1", 1.0 ); level thread maps\nx_lunar_util::open_lunar_door( "control_door_2", 1.0 ); thread hub_civilians_flee_spawn( ); thread command_center_civilian_slaughter(); // Player is in upstairs hallway close_lunar_door_behind_player( "room_status_vehicle_back_upstairs", "vehicle_door_03" ); level thread maps\nx_lunar_util::open_lunar_door( "vehicle_door_04", 1.0 ); // Player is in hub room close_lunar_door_behind_player( "room_status_hub_01", "vehicle_door_04" ); level thread maps\nx_lunar_util::open_lunar_door( "hub_01_door_02", 1.0 ); // Player is in control room upstairs close_lunar_door_behind_player( "room_status_control", "hub_01_door_02" ); level thread maps\nx_lunar_util::open_lunar_door( "control_hall_door_01", 1.0 ); level thread maps\nx_lunar_util::open_lunar_door( "control_hall_door_02", 1.0 ); // Player is in Taser hallway close_lunar_door_behind_player( "room_status_control_hall", "control_hall_door_01" ); // Player and Falcon are in hub room close_lunar_door_behind_player_and_falcon( "room_status_hub_02", "control_hall_door_02", "falcon_in_hub_02" ); level thread maps\nx_lunar_util::open_lunar_door( "hub_02_door_01", 1.0 ); //TagDK: Removed to smooth out transition into the lab // give the door time to open. // wait 1; // issue_color_orders( "b3", "allies" ); get_to_armory_lab_wait(); // give the door time to open. wait 1; issue_color_orders( "b4", "allies" ); // Player and Falcon are in the "lab" (second taser hallway) close_lunar_door_behind_player_and_falcon( "room_status_lab", "hub_02_door_01", "falcon_in_lab" ); thread close_lunar_door_behind_player_and_falcon( "room_status_storage", "storage_door_01", "falcon_in_storage" ); // Player and Falcon are in the storage room maps\nx_lunar_util::open_lunar_door( "storage_door_01", 1.0 ); issue_color_orders( "b5", "allies" ); // Allow the player to fail by killing allies again. maps\_friendlyfire::TurnBackOn(); } get_to_armory_lab_wait() { level.taser_enemy endon( "death" ); flag_wait( "vignette_armory_enter" ); } vehicle_upstairs_glass_check() { // Random turret fire on upstairs of vehicle bay level.breach_rover thread vehicle_upstairs_turret_fire(); // Get glass references vehicle_bay_glass = GetGlassArray( "vehicle_bay_glass" ); foreach( glass in vehicle_bay_glass ) { level thread vehicle_upstairs_glass_thread( glass ); } // Wait for glass destroyed and set room status // level waittill( "vehicle_upstairs_glass_destroyed" ); level.breach_rover notify( "stop_random_turret_fire" ); level.breach_rover.mgturret[0] TurretFireDisable(); thread upstairs_glass_gravity(); foreach( glass in vehicle_bay_glass ) { DestroyGlass( glass, (0,1,0) ); } } upstairs_glass_gravity() { SetPhysicsGravityDir( (-10000000,0, 0) ); wait 4; SetPhysicsGravityDir( (0,0,-1) ); } vehicle_upstairs_glass_thread( glass ) { level endon( "vehicle_upstairs_glass_destroyed" ); while( true ) { if( IsGlassDestroyed( glass ) ) { level notify( "vehicle_upstairs_glass_destroyed" ); return; } wait( 0.05 ); } } // self = a breacher breacher_deleter() { flag_wait ("vignette_armory_breach"); if (isdefined ( self )) { self delete(); } } fake_breachers() { flag_wait ( "vignette_vh_bay_breach" ); wait .3; // New first group of breachers to accomodate new vignette opfor_01 = spawn_targetname ("fake_breach_group_01", true ); opfor_02 = spawn_targetname ("fake_breach_group_02", true ); opfor_01.ignoreall = true; opfor_02.ignoreall = true; opfor_01.curr_breach_door = "fake"; level thread enemy_door_breach( "vehicle_airlock_breach_01", opfor_01, opfor_02, "room_status_vehicle_airlock" ); wait 14; opfor_01 delete(); opfor_02 delete(); } breach_group_01_spawn() { // Spawn vbay airlock civilians civ_01 = maps\_nx_vignette_util::vignette_actor_spawn("vehiclebay_breach_civ01", "civ_01"); civ_02 = maps\_nx_vignette_util::vignette_actor_spawn("vehiclebay_breach_civ02", "civ_02"); node = getent("vignette_vh_bay_breach", "script_noteworthy"); node thread anim_loop_solo( civ_01, "vehiclebay_breach_loop", "stop_loop" ); node thread anim_loop_solo( civ_02, "vehiclebay_breach_loop", "stop_loop"); flag_wait ( "player_in_vehicle_airlock" ); // New first group of breachers to accomodate new vignette opfor_01 = spawn_targetname ("breach_group_01_opfor_01", true ); opfor_02 = spawn_targetname ("breach_group_01_opfor_02", true ); opfor_01 thread breacher_deleter(); opfor_02 thread breacher_deleter(); level thread breach_group_01_thread( civ_01, civ_02, opfor_01, opfor_02 ); node notify("stop_loop"); } breach_group_01_thread( civ_01, civ_02, opfor_01, opfor_02 ) { opfor_01 endon ("death"); opfor_02 endon ("death"); opfor_01.fixednode = true; opfor_02.fixednode = true; level waittill ("start_vh_bay_breach"); opfor_01 forceUseWeapon( "breacher", "primary" ); opfor_01.ignoreall = true; opfor_02.ignoreall = true; // First breach opfor_01.curr_breach_door = "vehicle_hatch_breach"; breach_group_teleport( opfor_01, opfor_02, "teleport_vehicle_lower_breach_01", "teleport_vehicle_lower_breach_02" ); level thread maps\nx_lunar_anim::vignette_vehiclebay_breach( civ_01, civ_02, opfor_01, opfor_02 ); // Wait until anim is completed before giving next order opfor_01 ent_flag_wait( "at_breach_door" ); opfor_02 ent_flag_wait( "at_breach_door" ); while( opfor_01._animActive > 0 ) { wait( 0.05 ); } opfor_01_goal = GetNode ( "opfor_1_after_breach_destination", "targetname" ); opfor_01 SetGoalNode ( opfor_01_goal ); opfor_01.goalradius = 10; opfor_02_goal = GetNode ( "opfor_2_after_breach_destination", "targetname" ); opfor_02 SetGoalNode ( opfor_02_goal ); opfor_02.goalradius = 10; flag_wait ( "vehicle_bay_breach_skip_to_charge" ); // Wait for player in lower room, force breach on lower door // Note the anim script has a special wait in this case to jump them to the first charge so the player sees it opfor_01 ent_flag_set( "door_breached" ); level thread enemy_door_breach( "vehicle_door_02", opfor_01, opfor_02, "room_status_vehicle_main_lower" ); opfor_01 waittill("charged"); /* // Don't breach this door // If player is still in this room after this time, blow the charge wait 10; if ( flag ( "room_status_vehicle_main_lower")) { opfor_01 notify("detonate"); } */ // KenM - Stop the breach when the player starts experiencing the top floor breach sequence. // Post-MS, we should put a door at the top or bottom of the staircase to gate the player flag_wait ("top_floor_breach"); flag_set ("disable_random_distant_breach"); // Checkpoint after the top_floor breach vignette level waittill ("top_floor_breach_done"); flag_clear ("disable_random_distant_breach"); level thread autosave_now(); // Teleport the enemies wait_for_player_in_room( "room_status_vehicle_back_upstairs" ); stop_enemy_door_breach( opfor_01, opfor_02 ); opfor_01 notify("detonate"); wait 4; breach_group_teleport( opfor_01, opfor_02, "teleport_vehicle_breach_01", "teleport_vehicle_breach_02" ); breach_group_hidden_speed( opfor_01, opfor_02 ); // Breach upper floor vehicle bay door 01 level thread enemy_door_breach( "vehicle_door_03", opfor_01, opfor_02, "room_status_vehicle_back_upstairs" ); opfor_01 waittill("charged"); // KenM - Increase in time between final charge and detonation for GL. wait 4; opfor_01 notify("detonate"); wait_for_enemies_door_breached( opfor_01, opfor_02 ); // Breach upper floor vehicle bay door 01 level thread enemy_door_breach( "vehicle_door_04", opfor_01, opfor_02, "room_status_hub_01" ); opfor_01 waittill("charged"); // KenM - Increase in time between final charge and detonation for GL. wait 4; opfor_01 notify("detonate"); } breach_group_02_thread( opfor_01, opfor_02 ) { opfor_01 endon ("death"); opfor_02 endon ("death"); thread breach_rover_pulls_up(); // Start second breach group breach_group_teleport( opfor_01, opfor_02, "teleport_airlock_breach_01", "teleport_airlock_breach_02" ); opfor_01 forceUseWeapon( "breacher", "primary" ); opfor_01.ignoreall = true; // Breach airlock entrance level thread enemy_door_breach( "vehicle_airlock_breach_01", opfor_01, opfor_02, "room_status_vehicle_airlock" ); // wait_for_enemies_at_breach_door( opfor_01, undefined ); flag_wait ("airlock_animation_done"); // opfor_01 waittill ("charge_inserted"); // Open airlock flag_set( "vehicle_airlock_open" ); opfor_01 waittill("charged"); // KenM - Increase in time between final charge and detonation for GL. wait 4; opfor_01 notify("detonate"); wait .5; // level thread maps\nx_lunar_util::lunar_door_status( "vehicle_airlock_breach_01", "status_green" ); level thread maps\nx_lunar_util::lunar_door_status( "vehicle_airlock_door_02", "status_red" ); // wait_for_enemies_door_breached( opfor_01, undefined ); flag_set ("vehicle_airlock_breached"); // Breach second airlock entrance opfor_01 waittill ("breach_done"); level thread enemy_door_breach( "vehicle_airlock_door_02", opfor_01, undefined, "room_status_vehicle_airlock_prep" ); opfor_01 waittill("charged"); // KenM - Increase in time between final charge and detonation for GL. wait 4; opfor_01 notify("detonate"); wait .5; level thread maps\nx_lunar_util::lunar_door_status( "vehicle_airlock_door_02", "status_green" ); level thread maps\nx_lunar_util::lunar_door_status( "vehicle_door_01", "status_red" ); wait_for_enemies_door_breached( opfor_01 ); // Breach main room entrance level thread enemy_door_breach( "vehicle_door_01", opfor_01, opfor_02, "room_status_vehicle_main_lower" ); opfor_01 waittill("charged"); // KenM - Increase in time between final charge and detonation for GL. wait 4; opfor_01 notify("detonate"); } breach_rover_pulls_up() { // wait 2; // Pull the rover into the vehicle bay. path_start = getVehicleNode( "breach_rover_into_bay_start", "targetname" ); level.breach_rover AttachPath( path_start ); level.breach_rover StartPath(); level.breach_rover waittill ( "reached_end_node" ); driver = level.breach_rover.riders[0]; driver.ignoreall = true; // Pacing Pause wait( 1.0 ); level.breach_rover vehicle_unload( "all" ); level.breach_rover ent_flag_wait( "unloaded" ); driver waittill( "goal" ); goal = GetNode ( "driver_goal_node_1", "targetname" ); driver SetGoalNode ( goal ); driver.goalradius = 10; driver waittill( "goal" ); wait( 3.0 ); goal = GetNode ( "driver_goal_node_2", "targetname" ); driver SetGoalNode ( goal ); driver.goalradius = 10; } breach_group_03_thread() { // Wait for player to enter HUB flag_wait( "room_status_hub_01" ); // Spawn the AI actors opfor_01_spawner = GetEnt( "hub_01_breach_opfor_01", "targetname" ); opfor_01 = opfor_01_spawner spawn_ai(); opfor_01.animname = "opfor_01"; opfor_01 forceUseWeapon( "breacher", "primary" ); opfor_01.ignoreall = true; opfor_02_spawner = GetEnt( "hub_01_breach_opfor_02", "targetname" ); opfor_02 = opfor_02_spawner spawn_ai(); opfor_02.animname = "opfor_02"; opfor_02.ignoreall = true; opfor_01 thread breacher_deleter(); opfor_02 thread breacher_deleter(); opfor_01 endon ("death"); opfor_02 endon ("death"); // Breach hub side door level thread enemy_door_breach( "hub_01_door_01", opfor_01, opfor_02, "room_status_hub_01" ); opfor_01 waittill("charged"); // KenM - Increase in time between final charge and detonation for GL. wait 4; opfor_01 notify("detonate"); level thread maps\nx_lunar_util::lunar_door_status( "hub_01", "status_red" ); level thread maps\nx_lunar_util::lunar_door_status( "hub_01_b", "status_green" ); // Breach door into control room wait_for_player_in_room( "room_status_control" ); stop_enemy_door_breach( opfor_01, opfor_02 ); breach_group_teleport( opfor_01, opfor_02, "teleport_hub_01_breach_01", "teleport_hub_01_breach_02" ); breach_group_hidden_speed( opfor_01, opfor_02 ); // opfor_01.curr_breach_door = "hub_01_door_02"; level thread enemy_door_breach( "hub_01_door_02", opfor_01, opfor_02, "room_status_control" ); opfor_01 waittill("charged"); // KenM - Increase in time between final charge and detonation for GL. wait 4; opfor_01 notify("detonate"); level thread maps\nx_lunar_util::lunar_door_status( "control_hall_door_01", "status_red" ); // Wait for falcon to hand off taser, begin breach on hallway flag_wait( "falcon_taser_handoff" ); stop_enemy_door_breach( opfor_01, opfor_02 ); breach_group_teleport( opfor_01, opfor_02, "teleport_control_breach_01", "teleport_control_breach_02" ); breach_group_hidden_speed( opfor_01, opfor_02 ); // opfor_01.curr_breach_door = "control_hall_door_01"; level thread enemy_door_breach( "control_hall_door_01", opfor_01, opfor_02, "room_status_control_hall" ); wait_for_enemies_at_breach_door( opfor_01, opfor_02 ); // Falcon tells you to get out if you're still in that almost-breached room. if ( flag ("room_status_control_hall")) { // Breach from behind, get out of there! radio_dialogue ( "moon_fal_toarm_04" ); } opfor_01 waittill("charged"); // KenM - Increase in time between final charge and detonation for GL. wait 4; opfor_01 notify("detonate"); level thread maps\nx_lunar_util::lunar_door_status( "control_hall_door_02", "status_red" ); wait_for_enemies_door_breached( opfor_01, opfor_02 ); // Breach door hub 02 breach_group_hidden_speed( opfor_01, opfor_02 ); // opfor_01.curr_breach_door = "control_hall_door_02"; level thread enemy_door_breach( "control_hall_door_02", opfor_01, opfor_02, "room_status_hub_02" ); wait_for_enemies_at_breach_door( opfor_01, opfor_02 ); // Falcon tells you to get out if you're still in that almost-breached room. if ( flag ("room_status_hub_02")) { // They're breaching, keep moving forward! radio_dialogue ( "moon_fal_toarm_breachmove" ); } opfor_01 waittill("charged"); // KenM - Increase in time between final charge and detonation for GL. wait 4; opfor_01 notify("detonate"); level thread maps\nx_lunar_util::lunar_door_status( "hub_02_door_01", "status_red" ); wait_for_enemies_door_breached( opfor_01, opfor_02 ); // Breach door into lab wait_for_player_in_room( "room_status_lab" ); // Player can hang out and watch them, so let's let them progress more naturally. breach_group_hidden_speed( opfor_01, opfor_02 ); // opfor_01.curr_breach_door = "hub_02_door_01"; level thread enemy_door_breach( "hub_02_door_01", opfor_01, opfor_02, "room_status_lab" ); wait_for_enemies_at_breach_door( opfor_01, opfor_02 ); // Falcon tells you to get out if you're still in that almost-breached room. if ( flag ("room_status_lab")) { // They're about to pop the room! Keep moving! radio_dialogue ( "moon_fal_toarm_poproom" ); } opfor_01 waittill("charged"); // KenM - Increase in time between final charge and detonation for GL. wait 4; opfor_01 notify("detonate"); level thread maps\nx_lunar_util::lunar_door_status( "storage_door_01", "status_red" ); } breach_group_teleport( opfor_01, opfor_02, tele_01_name, tele_02_name ) { tele_01 = GetEnt( tele_01_name, "targetname" ); tele_02 = GetEnt( tele_02_name, "targetname" ); opfor_01 ForceTeleport( tele_01.origin, tele_01.angles ); opfor_02 ForceTeleport( tele_02.origin, tele_02.angles ); } distant_breach_randomizer() { level endon ("player_in_armory"); while (1) { if ( !flag ("disable_random_distant_breach")) { thread distant_breach_effects( (RandomFloatRange( 0.2, 0.3 )), (RandomFloatRange( 1.5, 3 ))); } wait (RandomIntRange( 8, 17 )); } } distant_breach_effects( intensity, time) { level._player playsound("lunar_explosions_dist_breach"); Earthquake( intensity, time , level._player.origin, 5000 ); level._player PlayRumbleOnEntity( "damage_light" ); } //******************************************************************* // * // * //******************************************************************* command_center_civilian_slaughter() { blood_splats = GetEntArray ("control_civ_blood_splat", "script_noteworthy"); foreach ( splat in blood_splats) { splat hide(); } flag_wait ("command_center_civ_flee"); civ_01 = spawn_anim_model("model_civ_06"); civ_02 = spawn_anim_model("model_civ_05"); civ_03 = spawn_anim_model("model_civ_04"); civ_04 = spawn_anim_model("model_civ_03"); civ_05 = spawn_anim_model("model_civ_02"); civ_06 = spawn_anim_model("model_civ_01"); chair_01 = spawn_anim_model("chair_01"); chair_02 = spawn_anim_model("chair_02"); guys = []; guys["civ_01"] = civ_01; guys["civ_02"] = civ_02; guys["civ_03"] = civ_03; guys["civ_04"] = civ_04; guys["civ_05"] = civ_05; guys["civ_06"] = civ_06; guys["chair_01"] = chair_01; guys["chair_02"] = chair_02; thread command_center_civilian_slaughter_enemy( civ_01, civ_02); node = GetStruct ("vignette_control_room_civilians", "script_noteworthy"); node anim_single ( guys , "cnc_civ_shot"); } command_center_civilian_slaughter_enemy( target_1, target_2) { killer = spawn_script_noteworthy( "command_center_killer_spawner" ); fake_target_1 = GetEnt ("control_center_slaughter_target_1", "targetname"); fake_target_2 = GetEnt ("control_center_slaughter_target_2", "targetname"); fake_target_3 = GetEnt ("control_center_slaughter_target_3", "targetname"); fake_target_4 = GetEnt ("control_center_slaughter_target_4", "targetname"); fake_target_5 = GetEnt ("control_center_slaughter_target_5", "targetname"); fake_target_6 = GetEnt ("control_center_slaughter_target_6", "targetname"); killer enable_cqbwalk(); killer.pacifist = true; killer.fixednode = true; killer thread command_center_civilian_slaughter_shoot( fake_target_1, "first_shot", "control_civ_blood_splat_01"); killer thread command_center_civilian_slaughter_shoot( fake_target_2, "second_shot", "control_civ_blood_splat_02"); killer thread command_center_civilian_slaughter_shoot( fake_target_3, "third_shot" ); killer thread command_center_civilian_slaughter_shoot( fake_target_4, "fourth_shot" ); killer thread command_center_civilian_slaughter_shoot( fake_target_5, "fifth_shot" ); killer command_center_civilian_slaughter_shoot( fake_target_6, "sixth_shot" ); flag_wait ("enemy_dies"); killer.dontevershoot = true; killer SetLookAtEntity( level._player ); killer cqb_aim ( level._player ); // killer.fixednode = false; /* The enemy on the player's side of the glass dies flag_wait ("enemy_dies"); killer SetLookAtEntity( level.falcon_taser ); killer cqb_aim ( level.falcon_taser ); wait 1; */ killer disable_cqbwalk(); goal = GetEnt ("command_center_killer_flee_goal", "targetname"); killer SetGoalEntity( goal ); waittillframeend; killer waittill ("goal"); flag_wait ("room_status_hub_02"); killer delete(); } command_center_civilian_slaughter_shoot( fake_target, notification, blood ) { self SetLookAtEntity( fake_target ); self cqb_aim ( fake_target ); level waittill ( notification ); // self Shoot( 1, fake_target.origin); self startcontinuousfire(); MagicBullet( "lunarrifle", self gettagorigin( "tag_flash"), fake_target.origin ); PlayFX( level._effect[ "charlie_impact" ], fake_target.origin ); if (isdefined ( blood )) { blood_splats = GetEntArray ( blood , "targetname"); foreach ( splat in blood_splats) { splat show(); } } } falcon_thread() { // Wait for player to enter the control hall // flag_wait( "falcon_spawn" ); flag_wait ("vignette_taser"); level._player.ignoreme = false; // Excising this portion for new taser scene. // Spawn enemy enemy_spawner = GetEnt( "enemy_control_room_taser", "targetname" ); enemy = enemy_spawner spawn_ai( true ); enemy SetLookAtEntity( level._player ); enemy.dontevershoot = true; //enemy.dontattackme = true; enemy.favoriteenemy = level._player; enemy.health = 1; flag_wait ("enemy_dies"); // Spawn falcon falcon_spawner = GetEnt( "falcon_taser_spawner", "targetname" ); falcon_spawner thread add_spawn_function( ::falcon_spawn_func ); level.falcon_taser = falcon_spawner spawn_ai( true ); level.falcon_taser.animname = "falcon"; // Fake-shoot the enemy MagicBullet( "lunarrifle", level.falcon_taser gettagorigin( "tag_flash"), (enemy.origin + (0,0,40)) ); badguy = spawn( "sound_emitter", enemy.origin ); badguy playsound("scn_lunar_meet_greet_enemy_shot"); wait .1 ; MagicBullet( "lunarrifle", level.falcon_taser gettagorigin( "tag_flash"), (enemy.origin + (0,0,40)) ); wait .1; MagicBullet( "lunarrifle", level.falcon_taser gettagorigin( "tag_flash"), (enemy.origin + (0,0,42)) ); level thread maps\nx_lunar_anim::taser_spawn(); // level.falcon_taser.ignoreall = true; level.falcon_taser SetLookAtEntity( level._player ); wait_for_player_in_room( "room_status_control_hall" ); level thread maps\nx_lunar_util::close_lunar_door( "control_hall_door_02", 1.0 ); // wait 1; // Checkpoint! if ( flag ("room_status_control_hall")) { level thread autosave_now(); } badguy delete(); // Riggs: Walker! You're still alive! Let's get to the Armory. radio_dialogue ( "moon_fal_toarm_taser" ); // Riggs: Take This. thread radio_dialogue ( "moon_fal_toarm_takethis" ); flag_set( "falcon_taser_handoff" ); level waittill ("taser_catch"); level._player playsound("scn_lunar_meet_greet_plr_catch"); thread player_gets_taser(); issue_color_orders( "b1", "allies" ); // Riggs: You look like shit. Where's your helmet? thread radio_dialogue ( "moon_fal_toarm_wherehelmet" ); // Falcon moves level.falcon_taser StopLookAt( ); level.falcon_taser enable_ai_color(); // *** TASER ENEMY 01 *** level thread taser_enemy_01_thread(); // Remove blocker taser_player_blocker = GetEnt ("taser_player_blocker", "targetname"); taser_player_blocker delete(); // Player no longer ignored level._player.ignoreme = false; // Wait for player to hit enemy with taser, weapons free on Falcon flag_wait( "hallway_taser_hit" ); flag_set ("falcon_taser_vignette"); flag_clear( "hallway_taser_hit" ); // falcon_weapons_halt(); // Wait for next taser encounter // *** TASER ENEMY 02 *** level thread taser_enemy_02_thread(); flag_wait( "falcon_in_lab" ); // Behind the console! if ( isAlive (level.taser_enemy)) { radio_dialogue ( "moon_fal_toarm_06" ); } // Wait for player to hit enemy with taser, weapons free on Falcon flag_wait( "hallway_taser_hit" ); waittillframeend; flag_clear( "hallway_taser_hit" ); // falcon_weapons_free(); //thread maps\_utility::set_ambient( "nx_lunar_cargo_bay" ); thread maps\_ambient::play_ambience( "nx_lunar_cargo_bay" ); thread maps\_ambient::start_ambient_event( "nx_lunar_cargo_bay" ); flag_wait ( "vignette_armory_enter" ); // Riggs: This way! radio_dialogue ( "moon_fal_toarm_thisway" ); thread falcon_guide_vo(); // Wait for armory scene falcon_weapons_halt(); } player_gets_taser() { // Give weapon level._player TakeAllWeapons(); level._player GiveWeapon( "lunarabg" ); level._player SwitchToWeapon( "lunarabg" ); } taser_enemy_01_thread() { wait 2; // level.falcon_taser waittill ("goal"); // Spawn enemies taser_enemy_01_spawner = GetEnt( "enemy_hub_02_taser_01", "targetname" ); taser_enemy_02_spawner = GetEnt( "enemy_hub_02_taser_02", "targetname" ); taser_enemy_01_spawner thread add_spawn_function( maps\nx_lunar_util::lunar_enemy_interior_common ); taser_enemy_02_spawner thread add_spawn_function( maps\nx_lunar_util::lunar_enemy_interior_common ); level.taser_enemy = taser_enemy_01_spawner spawn_ai( true ); level.taser_enemy_2 = taser_enemy_02_spawner spawn_ai( true ); level.taser_enemy maps\nx_lunar_util::ignore_everything(); level.taser_enemy_2 maps\nx_lunar_util::ignore_everything(); level.taser_enemy waittill ( "goal" ); level.falcon_taser SetLookAtEntity( level._player ); // Riggs: Tangos ahead. radio_dialogue ( "moon_fal_toarm_tangosahead" ); // Riggs: I got these guys. radio_dialogue ( "moon_fal_toarm_gotthese" ); level.falcon_taser StopLookAt( 1.0 ); wait( 1.0 ); level thread maps\nx_lunar_util::open_lunar_door( "control_hall_door_02", 1.0 ); if( IsAlive( level.taser_enemy_2 ) ) { taser_enemy_2_movement_node = GetNode( "taser_enemy_01_stand", "targetname" ); level.taser_enemy_2 SetGoalNode( taser_enemy_2_movement_node ); level.taser_enemy_2.radius = 10; } level.falcon_taser.ignoreall = false; level.taser_enemy.ignoreall = false; level.taser_enemy.ignoreme = true; level.falcon_taser.baseaccuracy = 1000.0; level.falcon_taser.favoriteenemy = level.taser_enemy_2; level.taser_enemy maps\nx_lunar_util::clear_ignore_everything(); level.taser_enemy_2 maps\nx_lunar_util::clear_ignore_everything(); level.taser_enemy_2.health = 10; level.taser_enemy thread taser_enemy_01_kill_player(); thread taser_enemy_01_kill_player_timer(); level.taser_enemy.favoriteenemy = level._player; level._player DisableInvulnerability(); if( IsAlive( level.taser_enemy ) ) { level.taser_enemy.health = 10; taser_enemy_1_movement_node = GetNode( "taser_enemy_02_stand", "targetname" ); level.taser_enemy SetGoalNode( taser_enemy_1_movement_node ); level.taser_enemy.radius = 10; } level.taser_enemy_2 waittill( "death" ); //TagDK: Knock enemy back over railing testing // enemy_2_eye_origin = level.taser_enemy_2 getTagOrigin( "tag_eye" ); // angles = level.taser_enemy_2.angles; // forward = AnglesToForward( angles ); // forward *= 1000; // level.taser_enemy_2 StartRagdollFromImpact( enemy_2_eye_origin, forward ); // level.taser_enemy_2 StartRagdoll(); if( IsAlive( level.taser_enemy ) ) { level.taser_enemy.ignoreme = false; level.falcon_taser.favoriteenemy = level.taser_enemy; level.taser_enemy.script_threatbias = 100000; level.taser_enemy waittill( "death" ); } flag_set( "hallway_taser_hit" ); issue_color_orders( "b2", "allies" ); level.falcon_taser.baseaccuracy = 50.0; } // self = the taser enemy taser_enemy_01_kill_player() { self endon ( "death" ); self.baseaccuracy = 0.0; flag_wait ( "taser_enemy_kills_player" ); self.baseaccuracy = 5000.0; } taser_enemy_01_kill_player_timer() { wait 5; flag_set ( "taser_enemy_kills_player" ); } taser_enemy_02_thread() { // Spawn enemy taser_enemy_spawner = GetEnt( "enemy_lab_taser", "targetname" ); taser_enemy_spawner thread add_spawn_function( maps\nx_lunar_util::lunar_enemy_interior_common ); level.taser_enemy = taser_enemy_spawner spawn_ai(); level.taser_enemy waittill ( "death" ); level.falcon_taser.baseaccuracy = 10.0; flag_set( "hallway_taser_hit" ); } // self = Falcon_taser falcon_spawn_func() { self.baseaccuracy = 100; self.moveplaybackrate = 1.15; // self.fixednode = false; self.disableBulletWhizbyReaction = true; self disable_surprise(); self.dontavoidplayer = true; self.disablepain = true; // To prevent the player blowing him up with the grenade launcher. This turns back on after the storage room is entered. maps\_friendlyfire::TurnOff(); self thread maps\nx_lunar_util::lunar_ally_interior_common(); flag_wait ("vignette_armory_breach"); self.moveplaybackrate = 1; self.baseaccuracy = 1; // self.fixednode = true; self.disableBulletWhizbyReaction = false; self.dontavoidplayer = false; self enable_surprise(); self.disablepain = false; } falcon_weapons_free() { level.falcon_taser.ignoreall = false; } falcon_weapons_halt() { level.falcon_taser.ignoreall = true; } falcon_guide_vo() { level endon ("player_in_armory"); wait 4; if ( flag ("room_status_lab")) // Riggs: Come on! Move it! radio_dialogue ( "moon_fal_toarm_moveit" ); wait 3; if ( flag ("room_status_lab")) // Riggs: Where are you going? Come on! radio_dialogue ( "moon_fal_toarm_wheregoing" ); wait 5; if ( flag ("room_status_lab")) // Riggs: Move, damn it! radio_dialogue ( "moon_fal_toarm_movedamn" ); } //******************************************************************* // * // * //******************************************************************* wait_for_enemies_at_breach_door( opfor_01, opfor_02 ) { if( IsDefined( opfor_01 ) ) { opfor_01 ent_flag_wait( "at_breach_door" ); } if( IsDefined( opfor_02 ) ) { opfor_02 ent_flag_wait( "at_breach_door" ); } } wait_for_enemies_door_breached( opfor_01, opfor_02 ) { if( IsDefined( opfor_01 ) ) { opfor_01 waittill ( "breach_done" ); } if( IsDefined( opfor_02 ) ) { opfor_02 waittill ( "breach_done" ); } } breach_group_hidden_speed( opfor_01, opfor_02 ) { opfor_01 thread maps\nx_lunar_util::hidden_dynamic_run_speed(); opfor_02 thread maps\nx_lunar_util::hidden_dynamic_run_speed(); } stop_enemy_door_breach( opfor_01, opfor_02 ) { opfor_01 StopAnimScripted(); opfor_02 StopAnimScripted(); opfor_01 notify( "detonate"); opfor_01 waittill ("breach_done"); opfor_01 notify( "stop_breach" ); } enemy_door_breach( door_name, opfor_01, opfor_02, room ) { opfor_01 endon ( "stop_breach"); if( !IsDefined( opfor_01.curr_breach_door ) ) { opfor_01.curr_breach_door = door_name; opfor_01.curr_breach_room = room; } lunar_door_parts = GetEntArray( door_name, "script_noteworthy" ); // Get the specific parts from the door breach prefab breach_origin = undefined; foreach ( door_part in lunar_door_parts ) { if( door_part.code_classname == "script_origin" ) { if( door_part.targetname == "breach_origin" ) { breach_origin = door_part; } } // Reconnect the pathmesh that runs through the door if( door_part.code_classname == "script_brushmodel" ) { if( door_part.targetname == "right" || door_part.targetname == "left") { door_part ConnectPaths(); } } } level thread maps\nx_lunar_anim::opfor_door_breach( breach_origin, opfor_01, opfor_02, "opfor_door_breach" ); // Wait for both to be at the breach door if( IsDefined( opfor_01 ) ) { opfor_01 ent_flag_wait( "at_breach_door" ); } if( IsDefined( opfor_02 ) ) { opfor_02 ent_flag_wait( "at_breach_door" ); } } //******************************************************************* // * // * //******************************************************************* room_status_init() { room_status_triggers = GetEntArray( "room_status", "script_noteworthy" ); foreach( room_status_trigger in room_status_triggers ) { // Logic script for each status trigger room_status_trigger thread room_status_logic(); } } room_status_logic() { level endon( "stop_depressurization" ); level endon( "depressurization_death" ); self ent_flag_init( "depressurize" ); self ent_flag_wait( "depressurize" ); flag_wait( self.script_flag ); // Start to kill the player level._player thread player_depressurization_kill(); // Player has left the room. flag_waitopen ( self.script_flag ); // And the door has closed. level waittill ("door_closed"); // The player gets to live, hooray! Their sinuses must feel terrible, though. level notify ("player_escaped_breached_room"); // Reset everything the kill routine starts level thread stop_stumble_walk( 1.0 ); black_overlay = get_black_overlay(); black_overlay FadeOverTime( 1.0 ); black_overlay.alpha = 0; level._player EnableWeapons(); set_vision_set("nx_lunar_alert", 1.0); bad_guys = GetAIArray( "axis" ); foreach ( guy in bad_guys) { guy.ignoreall = true; } level._player.ignoreme = true; // tagTC: code for if we want to allow player to live through // the depressurization // Wait for player to touch depressurization /*while( true ) { flag_wait( self.script_flag ); // Kill the player level._player thread player_depressurization_kill(); // Cleck for leaving pressurized while( true ) { if( !flag( self.script_flag ) ) { level._player notify( "pressurized" ); break; } wait( 0.05 ); } }*/ } close_lunar_door_behind_player( room_name, door_name ) { room_status_trigger = GetEnt( room_name, "targetname" ); // Waits for player to enter room flag_wait( room_status_trigger.script_flag ); level maps\nx_lunar_util::close_lunar_door( door_name, 1.0 ); level notify ("door_closed"); } close_lunar_door_behind_player_and_falcon( room_name, door_name, falcon_flag ) { room_status_trigger = GetEnt( room_name, "targetname" ); // Waits for player to enter room flag_wait( room_status_trigger.script_flag ); // Waits for Falcon flag_wait( falcon_flag ); level maps\nx_lunar_util::close_lunar_door( door_name, 1.0 ); level notify ("door_closed"); } wait_for_player_in_room( room_name ) { room_status_trigger = GetEnt( room_name, "targetname" ); // Waits for player to enter room flag_wait( room_status_trigger.script_flag ); } room_status_depressurize( room_name ) { room_status_trigger = GetEnt( room_name, "targetname" ); // Depressurize the room room_status_trigger ent_flag_set( "depressurize" ); } player_depressurization_kill_exterior() { level endon ("player_in_vehicle_airlock_notify"); //TagCC: Travis, you can use set_suit_fade( "moon", blend_time ); to blend this over a period of time if that helps the effect. level._player set_suit( "moon" ); //level._player ShellShock( "nx_lunar_get_to_armory", 10000 ); level._player_heartrate = 1.4; level thread player_heartbeat( 0.2 ); wait( 1.0 ); bad_guys = GetAIArray( "axis" ); foreach ( guy in bad_guys) { if ( guy.weapon != "breacher") guy.ignoreall = false; } // Make player a target level._player.ignoreme = false; level._player DisableInvulnerability(); wait( 4.0 ); level notify ( "depressurization_death" ); level._player ShellShock( "default", 3 ); level._player SetStance ("prone"); level._player FreezeControls( true ); SetDvar( "ui_deadquote", "NX_LUNAR_FAIL_DEPRESSURIZED_EXTERIOR" ); missionFailedWrapper(); } player_depressurization_kill() { level._player playsound( "scn_lunar_breach_detonate_air" ); level endon ("player_escaped_breached_room"); level._player DisableWeapons(); set_vision_set("nx_lunar_breached", 0.1); //TagCC: Travis, you can use set_suit_fade( "moon", blend_time ); to blend this over a period of time if that helps the effect. level._player set_suit( "moon" ); //level._player ShellShock( "nx_lunar_get_to_armory", 10000 ); level._player_heartrate = 1.4; level thread player_heartbeat( 0.2 ); wait( 1.0 ); bad_guys = GetAIArray( "axis" ); foreach ( guy in bad_guys) { if ( guy.weapon != "breacher") guy.ignoreall = false; } // Make player a target level._player.ignoreme = false; player_wakeup_movement_speed( 0.4 ); //level._player FadeOutShellShock(); if ( !flag ("start_stumble_walk")) { thread stumble_walk( 0.9, 3.0, false, true, 0.2, true, 0.0 ); flag_set( "start_stumble_walk" ); } level._player DisableInvulnerability(); wait( 4.0 ); level notify ( "depressurization_death" ); level._player ShellShock( "default", 0.9 ); level._player SetStance ("prone"); level._player FreezeControls( true ); SetDvar( "ui_deadquote", "NX_LUNAR_FAIL_DEPRESSURIZED" ); missionFailedWrapper(); } //******************************************************************* // * // * //******************************************************************* // self = the breach rover kill_player_before_airlock( kill_time ) { self endon ( "death" ); level._player endon ("death"); level endon ("player_in_vehicle_airlock_notify"); wait( kill_time ); // Player has waited too long, kill the player with turret // if( !flag( "player_in_vehicle_airlock" ) ) // { self notify( "stop_random_turret_fire" ); level._player.ignoreme = false; level._player DisableInvulnerability(); self.mgturret[0] SetTurretWeapon( "nx_chinese_lgv_turret" ); self.mgturret[0] SetAISpread( 1 ); self.mgturret[0] SetTargetEntity( level._player ); self.mgturret[0] TurretFireEnable(); // self thread vehicle_random_turret_fire( "airlock_turret_target" ); thread player_depressurization_kill_exterior(); // Wait for player to be hit level._player waittill( "damage" ); level._player waittill( "damage" ); missionFailedWrapper(); level._player kill(); // } } vehicle_upstairs_turret_fire() { self endon ( "death" ); self notify ( "stop_random_turret_fire" ); // target = GetEnt ("airlock_turret_target_top_floor", "targetname"); // level.breach_rover.mgturret[0] SetTargetEntity( target ); // Pull the rover out of the vehicle bay. // Can't even see this. Teleporting instead. // path_start = getVehicleNode ("breach_rover_exit_bay_start", "targetname"); // level.breach_rover AttachPath ( path_start ); // level.breach_rover StartPath ( path_start ); breach_rover_exit_bay_end = getVehicleNode("breach_rover_into_bay_start", "targetname"); // teleport them trucks level.breach_rover Vehicle_Teleport (breach_rover_exit_bay_end.origin, breach_rover_exit_bay_end.angles); level.breach_rover Vehicle_SetSpeedImmediate( 0, 10000, 10000 ); // level waittill ("rover_fires_notify"); /* level.breach_rover.mgturret[0] TurretFireEnable(); level.breach_rover.mgturret[0] ShootTurret(); wait .1; level.breach_rover.mgturret[0] TurretFireDisable(); */ } airlock_random_turret_fire_restart() { self endon ( "death" ); self notify ( "stop_random_turret_fire" ); // Has player made it to the airlock flag_wait( "player_in_vehicle_airlock" ); self thread vehicle_random_turret_fire( "airlock_turret_target" ); } vehicle_random_turret_fire( targets ) { self endon ( "death" ); self endon ( "stop_random_turret_fire" ); turret_target_array = GetEntArray( targets, "targetname" ); while( true ) { target = turret_target_array[ randomInt( turret_target_array.size ) ]; self.mgturret[0] SetAISpread( 1 ); self.mgturret[0] SetTargetEntity( target ); self.mgturret[0] TurretFireEnable(); // Turret explosion wait .2; //PlayFX( level._effect[ "turret_explosion" ], target.origin ); wait( 2.0 ); } } fake_turret_fire() { fake_turret_fire_targeting(); level.breach_rover.mgturret[0] SetMode( "manual" ); level.breach_rover.mgturret[0] TurretFireDisable(); fake_player_turret_target = GetEnt( "fake_player_turret_target", "targetname" ); if( IsDefined( fake_player_turret_target ) ) { fake_player_turret_target delete(); } } fake_turret_fire_targeting() { level endon( "player_in_vehicle_airlock_notify" ); // level.breach_rover endon ( "stop_random_turret_fire" ); // Min/Max offsets. // Min should be far enough away to not actually hit player. // Max should be close enough so that it looks like they're kinda trying. offsetMinX = 32; offsetMaxX = 256; offsetMinY = 32; offsetMaxY = 256; offsetMinZ = 32; offsetMaxZ = 128; level.breach_rover.mgturret[0] SetTurretWeapon( "nx_chinese_lgv_turret_fake" ); fake_player_turret_target = GetEnt( "fake_player_turret_target", "targetname" ); level.breach_rover.mgturret[0] SetTargetEntity( fake_player_turret_target); level.breach_rover.mgturret[0].fireInterval = 1.0; // one shot per second while ( !flag( "player_in_vehicle_airlock" ) ) { // Re-roll the randoms randX_offset = RandomIntRange( offsetMinX, offsetMaxX ); randY_offset = RandomIntRange( offsetMinY, offsetMaxY ); randZ_offset = RandomIntRange( offsetMinZ, offsetMaxZ ); // Randomize left/right Y offset if( cointoss() ) { randY_offset *= -1; } // Move the target entity to the random position fake_player_turret_target.origin = (self.origin + (randX_offset,randY_offset,randZ_offset)); wait 1; } level.breach_rover.mgturret[0] SetMode( "manual" ); level.breach_rover.mgturret[0] TurretFireDisable(); fake_player_turret_target delete(); } //******************************************************************* // * // * //******************************************************************* armory_enter_vignette() { spider_spawner = GetEnt( "spider_spawner", "targetname" ); level.spider = spider_spawner spawn_ai(); level.spider.animname = "spider"; level.spider SetLookAtEntity( level._player ); enter_ally_01 = GetEnt( "armory_enter_ally_01", "targetname" ); enter_ally_02 = GetEnt( "armory_enter_ally_02", "targetname" ); helmet_ally_01 = GetEnt( "armory_helmet_ally_01", "targetname" ); //enter_ally_01 anim_first_frame_solo( level.eagle , "armory_enter" ); //enter_ally_02 anim_first_frame_solo( level.spider , "armory_enter" ); flag_wait( "vignette_armory_enter" ); thread maps\_ambient::start_ambient_event( "nx_lunar_armory" ); // flag_wait ("vignette_armory_entrance_player"); // Have spider move to breach position armory_ready_breach_spider(); // Wait for player to pick up helmet armory_give_helmet(); // Have falcon teleport to breach position // enter_ally_02 notify( "stop_enter" ); // level thread armory_ready_breach_falcon(); // Stop any running depressurization room status scripts level notify( "stop_depressurization" ); flag_wait ("ready_for_armory_breach"); thread armory_kill_zone_warning_vo(); // Enemy breach thread enemy_armory_breach(); //DR: start music flag_set( "music_breach_starting" ); // tagTC - Manual wait to better time the transition to the explosion // KenM - Adjusting timing, eventually the animation should start at the moment the explosion occurs. // flag_wait( "vignette_armory_breach" ); wait( 14.0 ); armory_breach = GetEnt( "vignette_armory_breach", "script_noteworthy" ); armory_breach notify ("stop_idle"); level._player AllowSprint( true ); //DR: start music flag_set( "music_start_battle_out_of_armory" ); } armory_kill_zone_warning_vo() { armory_breach = GetEnt( "vignette_armory_breach", "script_noteworthy" ); armory_breach endon ("stop_idle"); flag_wait ("armory_breach_kill_zone"); // Crow: Stay away from the door! radio_dialogue ( "moon_eag_int_stayawaydoor" ); } armory_ready_breach_spider() { level waittill ("player_in_armory"); node = getent("vignette_armory_breach_entrance", "script_noteworthy"); node notify ("stop_idle"); level.spider notify ("stop_idle"); level.spider StopAnimScripted(); armory_breach = GetEnt( "vignette_armory_breach", "script_noteworthy" ); armory_breach anim_reach_and_approach_solo ( level.spider, "armory_breach_explosion" ); armory_breach thread anim_loop_solo ( level.spider, "armory_breach_loop", "stop_idle" ); } armory_ready_breach_falcon() { // level waittill ("armory_helmet_on"); // So the player's view is out of the way // wait 2; // From this point on, falcon_taser is the real Falcon. If the player starts from armory_module, real Falcon is the real Falcon. level.falcon = level.falcon_taser; // Make sure he doesn't try to play his backing-up to the armory animation // level.falcon StopAnimScripted(); // level.falcon ClearAnim( level._scr_anim[ "falcon" ][ "armory_entrance_falcon" ], 0); // Get him to his breach ready position and loop him armory_breach = GetEnt( "vignette_armory_breach", "script_noteworthy" ); armory_breach anim_teleport_solo( level.falcon, "armory_breach_explosion" ); armory_breach anim_loop_solo ( level.falcon, "armory_breach_loop", "stop_idle" ); // Turn his color behavior on level.falcon enable_ai_color(); level.falcon set_force_color( "r" ); } armory_ready_breach_eagle() { armory_breach = GetEnt( "vignette_armory_breach", "script_noteworthy" ); // tagTC - temp removing breach, currently he's not reaching for some reason //armory_breach anim_reach_and_approach_solo ( level.eagle, "armory_breach_explosion" ); armory_breach anim_loop_solo ( level.eagle, "armory_breach_loop", "stop_idle" ); level.eagle enable_ai_color(); } armory_give_helmet() { // Return regular player abilities level._player EnableUsability(); setSavedDvar( "player_sprintSpeedScale", 1.5 ); // triggered via anim script level waittill ("armory_helmet_on"); maps\nx_lunar_util::lunar_combat_init( false ); // false means do not give the helmet. The vignette will take care of that with the correct timing. level._player store_players_weapons( "armory_weapons" ); level._player TakeAllWeapons(); level thread armory_helmet_loop_sfx(); //set the sfx helmet state to the correct state flag_set( "sfx_int_base_milsuit_press" ); //(after putting on military suit - this one has the laser mic) thread maps\nx_lunar_util::lunar_helmet_bootup_sequence(); // If Falcon isn't at his spot already, put him there. level thread armory_ready_breach_falcon(); wait( 1.0 ); // Clear objective flag_set( "player_has_helmet" ); // Close the armory door level thread maps\nx_lunar_util::close_lunar_door( "armory_door", 1.0 ); wait 2; // Distant breach effects level._player playsound("lunar_explosions_storage_room"); Earthquake( 0.3, 1, level._player.origin, 100 ); level._player PlayRumbleOnEntity( "damage_light" ); // Allow player to get the assault rifle thread armory_give_weapon(); // Move eagle to breach position thread armory_ready_breach_eagle(); wait 1; // Shit. They've breached the storage room. radio_dialogue( "moon_fal_toarm_storeroom" ); level thread maps\nx_lunar_util::lunar_door_status( "armory_door", "status_red" ); } armory_helmet_loop_sfx() { soundent = spawn( "sound_emitter", level._player.origin ); soundent linkto( level._player ); soundent playloopsound("scn_lunar_armory_plr_helmet_loop"); flag_wait( "vignette_armory_breach" ); soundent StopLoopSound( "scn_lunar_armory_plr_helmet_loop" ); soundent delete(); } armory_alert_vo_01_sfx() { soundent1 = spawn("sound_emitter", (8662, -273, -1623)); soundent1 playsound("scn_lunar_armory_alert_vo_01"); flag_wait( "ready_for_armory_breach" ); soundent1 delete(); } armory_alert_vo_02_sfx() { soundent2 = spawn("sound_emitter", (8662, -273, -1624)); soundent2 playsound("scn_lunar_armory_alert_vo_02"); wait 65.0; soundent2 delete(); } armory_give_weapon() { // Wait for player to pick up a rifle lunar_rifle = GetEnt ("lunar_rifle", "targetname"); lunar_rifle MakeUsable(); // Press and hold X to take Retrofitted Lunar Assault Rifle lunar_rifle SetHintString( &"NX_LUNAR_ARMORY_GIVE_WEAPON_HINT" ); lunar_rifle waittill( "trigger" ); level._player playsound("suit_inject_patchkit_pickup_press"); thread armory_alert_vo_01_sfx(); //Play vignette maps\nx_lunar_anim::armory_entrance_grabrifle( lunar_rifle ); // tagTC: give the player's their loadout in _loadout // give the player their suit shield level._player restore_players_weapons( "armory_weapons" ); level._player switchToWeapon( level._main_gun ); wait .5; level._player EnableWeapons(); // Clear objective flag_set( "player_has_weapon" ); thread armory_patch_check(); level._player waittill ("suit_repaired"); flag_set ("ready_for_armory_breach"); } armory_door_breach_metal_stress_sfx() { wait 0.4; level._player setchannelvolumes( "snd_channelvolprio_pain", "nx_lunar_armory_breach", 0.4 ); thread armory_alert_vo_02_sfx(); level._player playsound("scn_lunar_breach_mtl_stress_1"); wait 5.3; level._player playsound("scn_lunar_breach_mtl_stress_2"); wait 3.0; level._player deactivatechannelvolumes( "snd_channelvolprio_pain", 1.0 ); } enemy_armory_breach() { // OPFOR_01 Spawn opfor_01 = enemy_armory_breach_spawn( "enemy_breach_opfor_01", "opfor_01" ); opfor_01 forceUseWeapon( "breacher", "primary" ); // OPFOR_02 Spawn opfor_02 = enemy_armory_breach_spawn( "enemy_breach_opfor_02", "opfor_02" ); // Do breach level thread enemy_door_breach( "armory_door_breach", opfor_01, opfor_02 ); // Wait for detonate opfor_01 waittill ("charge_inserted"); level thread armory_door_breach_metal_stress_sfx(); level thread maps\nx_lunar_util::lunar_door_status( "armory_door", "status_yellow" ); opfor_01 waittill("charged"); opfor_01 notify("detonate"); opfor_01 forceUseWeapon( "lunarrifle", "primary" ); opfor_01.ignoreall = false; opfor_02.ignoreall = false; wait .5; level thread maps\nx_lunar_util::lunar_door_status( "armory_door", "status_green" ); level thread maps\nx_lunar_util::lunar_door_keypad_error( "armory_door" ); } enemy_armory_breach_spawn( spawner_name, animname ) { spawner = GetEnt( spawner_name, "targetname" ); spawner thread add_spawn_function( ::enemy_armory_breach_spawn_func ); enemy = spawner spawn_ai(); enemy.animname = animname; enemy.ignoreall = true; enemy.allowdeath = true; enemy thread maps\nx_lunar_util::check_retreat_triggers(); return enemy; } enemy_armory_breach_spawn_func() { self thread maps\nx_lunar_util::lunar_enemy_interior_common(); } //******************************************************************* // * // * //******************************************************************* get_to_the_armory_dialog() { wait 5; // Base: All personnel fall back to the base! // Base: Repeat, fall back to the base! Secure the LSP control center! //radio_dialogue ( "moon_bc_rov_11" ); flag_wait( "start_stumble_walk" ); // Open first airlock door level thread maps\nx_lunar_util::open_lunar_door( "vehicle_airlock_breach_01", 1 ); // Base: We see you! We're cycling the nearest airlock. Get in here now! // radio_dialogue ( "moon_bc_rov_12" ); flag_wait( "vo_base_compromise_bc" ); // Base Commander: Security alert. We have been compromised. Perimeter has been breached. Seal and secure all airlocks. radio_dialogue( "moon_bc_arm_01" ); wait 3; //muting channels before big vignette on second floor level._player setchannelvolumes( "snd_channelvolprio_pain", "nx_lunar_2nd_floor_first_stop", 0.4 ); // Crow: Walker, this is Crow. We're at the armory. Get your ass over here, now! radio_dialogue( "moon_eag_arm_01" ); // Message repeats // Base Commander: Security alert. We have been compromised. Perimeter has been breached. Seal and secure all airlocks. radio_dialogue( "moon_bc_arm_01" ); // flag_wait ("top_floor_breach"); // Base Commander: Security alert. We have been compromised. Perimeter has been argh! //JL: Removing this for now. We'll put it back in when audio does a pass on the vignette audio. DT4383 //radio_dialogue( "moon_bc_arm_02" ); flag_wait( "command_center_civ_flee" ); // Crow: Walker, Riggs is on his way to meet up with you. radio_dialogue( "moon_eag_arm_02" ); flag_wait ("falcon_in_storage"); // Riggs: Armory's just ahead. radio_dialogue( "moon_fal_toarm_07" ); wait 2; flag_wait ( "vo_armory_down_here" ); // Spider: Down here! radio_dialogue( "moon_spid_int_downhere" ); flag_wait( "vo_armory_enter" ); //DR: stop the chase music flag_set( "music_player_at_the_armory" ); // Spider: Welcome to what's left of the Combat Group, go grab a helmet. radio_dialogue( "moon_spid_int_welcome" ); flag_wait ("ready_for_armory_breach"); wait 2; // Crow: Ok, they're breaching! Hold on to something and be ready to engage. radio_dialogue( "moon_eag_int_08" ); // Crow: Once the door's open, get out as fast as you can. We're sitting ducks in here. //JL: Removing for DT5065 //radio_dialogue( "moon_eag_int_sittingducks" ); } armory_patch_check() { level._player endon ("suit_repaired"); // Ensure they have no patch kits to begin with level._player SetWeaponAmmoClip( "nx_suitshield", 0); flag_wait( "player_has_weapon" ); // Wait until they retrieve the rifle and patch kit level._player GiveStartAmmo( "nx_suitshield" ); self thread maps\_utility::display_hint( "patch" ); // Crow: Patch your suit, Walker, we need you 100%... Riggs, load up. radio_dialogue( "moon_eag_int_03" ); // Remind them if they haven't patched after this time wait 10; // Player waited too long, off we go flag_set ("ready_for_armory_breach"); } //******************************************************************* // * // * //*******************************************************************