nx1-gsc-dump/maps/nx_lunar_get_to_the_armory.gsc

3204 lines
94 KiB
Plaintext

//****************************************************************************
// **
// 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<NOTE>: 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<NOTE>: 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<note>: 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<NOTE>: 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<NOTE>: 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<note> - 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<note> - 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<note>: 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");
}
//*******************************************************************
// *
// *
//*******************************************************************