nx1-gsc-dump/maps/nx_hospital_exit_corridor.gsc

733 lines
21 KiB
Plaintext

//****************************************************************************
// **
// Confidential - (C) Activision Publishing, Inc. 2011 **
// **
//****************************************************************************
// **
// Module: Nx_Hospital - Exit Corridor **
// **
// Created: 11/15/11 - Ken Moodie **
// **
//****************************************************************************
#include maps\_utility;
#include common_scripts\utility;
#include maps\_anim;
#include maps\_vehicle;
//*******************************************************************
// *
// EXIT CORRIDOR - Summary goes here *
// *
//*******************************************************************
start()
{
maps\nx_hospital_util::actor_teleport( level.squad[ "ALLY_ALPHA" ], "exit_corridor_start_alpha" );
maps\nx_hospital_util::actor_teleport( level.squad[ "ALLY_BRAVO" ], "exit_corridor_start_bravo" );
level._player maps\_nx_utility::move_player_to_start_point( "exit_corridor_start_player" );
}
main()
{
thread exit_corridor_wave_logic();
autosave_tactical();
// level._player setOffhandPrimaryClass( "frag" );
// level._player giveWeapon( "offensive_grenade" );
// level._player setWeaponAmmoStock( "offensive_grenade", 20 );
thread corridor_grenade_throw();
thread generator_destruction( "dest_generator", "generator_light", "lamp_on");
thread generator_destruction( "dest_generator_hallway", "generator_light_hallway", "lamp_on_hallway");
thread lightbulb_destruction ( "light_hitbox_hallway", "generator_light_hallway", "lamp_on_hallway");
thread lightbulb_destruction ( "light_hitbox_lobby", "generator_light", "lamp_on");
thread final_corridor_events();
thread lobby_badplace_setup();
exit_corridor_dialog();
}
section_flag_inits()
{
flag_init ("all_defenders_dead");
flag_init ("kill_orders_received");
flag_init ("hallway_light_destroyed");
flag_init ("lobby_light_destroyed");
flag_init ("mission_complete");
}
section_precache()
{
PreCacheItem ("offensive_grenade");
precacheString( &"NX_HOSPITAL_FAIL_OFFENSIVE_GRENADE" );
precacheString( &"NX_HOSPITAL_HINT_USE_CAMERA" );
PreCacheModel ("ch_industrial_lamp_off");
}
lobby_badplace_setup()
{
volume = GetEnt ("enemy_badplace", "targetname");
BadPlace_Brush( "enemy_badplace", -1, volume, "axis" );
}
mg_hallway_badplace_setup()
{
volume = GetEnt ("mg_hallway_volume", "targetname");
BadPlace_Brush( "mg_hallway_volume", -1, volume, "axis" );
}
exit_corridor_dialog()
{
thread grenade_vo_hint();
thread machine_gunner_vo();
wait_for_targetname_trigger( "corridor_grenade_trigger");
wait .3;
level.squad[ "ALLY_BRAVO" ] dialogue_queue( "hos_kee_corr_grenaderun" );
level waittill ("lobby_clear");
// Keene - Lobby clear!
wait .8;
level.squad[ "ALLY_ALPHA" ] dialogue_queue( "hos_bak_corr_lobbyclear" );
// Baker - Move up!
level.squad[ "ALLY_ALPHA" ] dialogue_queue( "hos_bak_corr_moveup" );
turret = GetEnt ("hallway_mg", "targetname");
flag_wait ( "machine_gunner_detected");
// If MG user is still alive
wait 5;
user = turret GetTurretOwner();
if (isalive ( user ))
{
// If vending machine is still upright
while ( maps\_dynamic_cover::dynamic_cover_activated( "hallway_vending_machine" ) != true)
{
// Keene - We need cover!
level.squad[ "ALLY_BRAVO" ] dialogue_queue( "hos_kee_corr_needcover" );
// Baker - Push over that vending machine!
level.squad[ "ALLY_ALPHA" ] thread dialogue_queue( "hos_bak_corr_pushvendmach" );
thread vending_machine_dynamic_cover( user );
break;
}
}
// Wait until the vending machine is tipped (by anyone)
while ( isalive ( user ) && maps\_dynamic_cover::dynamic_cover_activated( "hallway_vending_machine" ) != true)
{
wait .1;
}
thread spotlight_hint_vo( turret );
// level waittill ("turret_users_all_dead");
flag_wait ("vignette_outro");
// add_dialogue_line( "Baker", "Think that's the last of them.", "blue", 2 );
wait 1.5;
level.squad[ "ALLY_BRAVO" ] dialogue_queue( "hos_jenk_const_clear" );
level.squad[ "ALLY_ALPHA" ] dialogue_queue( "hos_bak_corr_watchforstragglers" );
// flag_wait("squad_at_recovery_room");
trigger = GetEnt ("squad_at_recovery_room", "targetname");
while ( !level.squad[ "ALLY_BRAVO" ] isTouching ( trigger ))
{
wait .1;
}
// add_dialogue_line( "Baker", "Alright. Breaching, weapons tight.", "green", 2 );
level.squad[ "ALLY_ALPHA" ] dialogue_queue( "hos_bak_corr_breaching" );
}
spotlight_hint_vo( turret )
{
level endon ("turret_users_all_dead");
wait 4;
// If light is still unbroken
if ( IsTurretActive( turret ) && !flag ("hallway_light_destroyed") )
{
// add_dialogue_line( "Baker", "I can't see anything past that spotlight!", "green", 2 );
level.squad[ "ALLY_ALPHA" ] dialogue_queue( "hos_bak_corr_cantseeanything" );
}
wait 10;
// If light is still unbroken
if ( IsTurretActive( turret ) && !flag ("hallway_light_destroyed") )
{
// add_dialogue_line( "Baker", "The light's powered by that generator. Take it out!", "green", 2 );
level.squad[ "ALLY_ALPHA" ] dialogue_queue( "hos_bak_corr_takeoutgenerator" );
}
}
machine_gunner_vo()
{
level endon ("turret_users_all_dead");
flag_wait ("machine_gunner_detected");
// add_dialogue_line( "Keene", "Machine gunner! Get back! ", "blue", 2 );
level.squad[ "ALLY_ALPHA" ] dialogue_queue( "hos_bak_corr_machinegunner" );
}
vending_machine_cover_logic()
{
level endon ("turret_users_all_dead");
while ( maps\_dynamic_cover::dynamic_cover_activated( "hallway_vending_machine" ) != true)
{
wait .1;
}
issue_color_orders ("g346 b346", "allies");
}
vending_machine_weapon_clear()
{
}
machine_gunner_logic( final_defenders )
{
// wait for guys to spawn
waittillframeend;
foreach( actor in level.squad )
{
actor disable_pain();
actor disable_bulletwhizbyreaction();
actor.fixednode = true;
}
turret = GetEnt ("hallway_mg", "targetname");
turret MakeTurretSolid();
while ( !IsTurretActive( turret ) )
{
wait .2;
}
user = turret GetTurretOwner();
user disable_pain();
user.animname = "generic";
user thread dialogue_queue( "est_ru4_attack" );
thread vending_machine_cover_logic();
if ( flag ( "machine_gunner_detected"))
{
issue_color_orders ( "b345 g345", "allies");
}
user waittill ("death");
wait 2;
replacement = get_closest_living( turret.origin, final_defenders );
if ( isDefined ( replacement ))
{
node = GetNode ("mg_node", "targetname");
replacement setGoalNode( node );
replacement.goalradius = 16;
replacement.fixednode = true;
replacement waittill( "goal" );
//node = GetNode ("mg_node", "targetname");
//replacement setGoalNode( node );
//replacement waittill( "goal" );
replacement maps\_spawner::use_a_turret( turret );
replacement disable_pain();
level.squad[ "ALLY_ALPHA" ] dialogue_queue( "hos_bak_corr_anotherguyonturret" );
while ( isalive ( replacement ) )
{
wait .2;
}
}
level notify ("turret_users_all_dead");
foreach( actor in level.squad )
{
actor.ignoreSuppression = true;
}
wait .2;
if ( !flag ("vignette_outro"))
{
issue_color_orders( "g350 b350", "allies" );
}
// thread mg_hallway_badplace_setup();
}
grenade_vo_hint()
{
level endon ( "lobby_clear");
wait_for_script_noteworthy_trigger( "player_entered_lobby");
wait 6;
right_office = GetEnt ("right_office", "targetname");
left_office = GetEnt ("left_office", "targetname");
while ( 1 )
{
right_guys = right_office get_ai_touching_volume( "axis" );
left_guys = left_office get_ai_touching_volume( "axis" );
if ( right_guys.size >= 3 && ( level._player GetWeaponAmmoStock( "offensive_grenade" ) >= 1) )
{
if(cointoss())
{
level.squad[ "ALLY_ALPHA" ] dialogue_queue( "hos_bak_corr_grenaderoffice" );
}
else
{
level.squad[ "ALLY_ALPHA" ] dialogue_queue( "hos_bak_corr_duginroomonright" );
level.squad[ "ALLY_ALPHA" ] dialogue_queue( "hos_bak_corr_putgrenadeinthere" );
}
break;
}
if ( left_guys.size >= 3 && ( level._player GetWeaponAmmoStock( "offensive_grenade" ) >= 1))
{
if(cointoss())
{
level.squad[ "ALLY_ALPHA" ] dialogue_queue( "hos_bak_corr_grenadeloffice" );
}
else
{
level.squad[ "ALLY_ALPHA" ] dialogue_queue( "hos_bak_corr_bunchedupinleftroom" );
level.squad[ "ALLY_ALPHA" ] dialogue_queue( "hos_bak_corr_putgrenadeinthere" );
}
break;
}
wait .2;
}
}
corridor_grenade_throw()
{
wait_for_targetname_trigger( "corridor_grenade_trigger");
guy = spawn_targetname( "corridor_grenade_thrower" );
maps\nx_hospital_util::squad_cqb( false );
guy.animname = "generic";
guy.allowdeath = true;
guy thread anim_single_solo ( guy, "grenade_throw");
level.squad[ "ALLY_ALPHA" ].noGrenadeReturnThrow = true;
level.squad[ "ALLY_BRAVO" ].noGrenadeReturnThrow = true;
battlechatter_off( "allies" );
wait 0.05;
guy SetAnimTime( getanim_generic( "grenade_throw" ), 0.4 );
guy thread dialogue_queue( "est_ru2_attack" );
wait .4;
end = GetEnt ("corridor_grenade_end", "targetname");
if ( isAlive ( guy ))
{
guy MagicGrenade( guy gettagorigin( "TAG_INHAND" ), end.origin, 4.0 );
}
wait 4.1;
level.squad[ "ALLY_ALPHA" ].noGrenadeReturnThrow = false;
level.squad[ "ALLY_BRAVO" ].noGrenadeReturnThrow = false;
issue_color_orders( "g310 b310", "allies" );
battlechatter_on( "allies" );
}
exit_corridor_wave_logic()
{
level.lobby_guys = [];
wave_counters = getentarray( "exit_corridor_wave_counter", "script_noteworthy" );
array_thread( wave_counters, ::add_spawn_function, ::exit_corridor_wave_counter );
level.exit_corridor_wave_count = 0;
}
exit_corridor_wave_counter()
{
level.lobby_guys[level.lobby_guys.size] = self;
self waittill( "death" );
level.lobby_guys = array_remove( level.lobby_guys, self );
level.exit_corridor_wave_count++;
// iprintln ( "Guys Killed: " + level.exit_corridor_wave_count );
if ( level.exit_corridor_wave_count == 4 )
{
wait 2;
trigger = getent( "corridor_wave_2_trigger", "targetname" );
if ( isdefined( trigger ) )
{
trigger notify( "trigger" );
}
issue_color_orders( "g330 b330", "allies" );
}
if ( level.exit_corridor_wave_count == 11 )
{
thread spawn_final_defenders();
triggers = GetEntArray ( "lobby_color_trigger", "targetname");
foreach ( trigger in triggers)
{
trigger trigger_off();
}
level notify ("lobby_clear");
waittillframeend;
thread lobby_enemy_cleanup();
thread machine_gunner_ally_reactions();
issue_color_orders( "b340", "allies" );
wait .7;
issue_color_orders( "g340", "allies" );
}
}
machine_gunner_ally_reactions()
{
level.squad[ "ALLY_ALPHA" ] enable_sprint();
level endon ("turret_users_all_dead");
turret = GetEnt ("hallway_mg", "targetname");
flag_wait ( "machine_gunner_detected");
// Allies tend to end the encounter too quickly with grenades by blowing up the generator.
foreach( actor in level.squad )
{
actor.grenadeAmmo = 0;
}
// Baker does his best to look at the MG
level.squad[ "ALLY_ALPHA" ] SetLookAtEntity ( turret );
issue_color_orders ( "b345 g345", "allies");
wait 2;
level.squad[ "ALLY_ALPHA" ] SetLookAtEntity ( );
level.squad[ "ALLY_ALPHA" ] disable_sprint();
wait 30;
// If we're still pinned down at this point, allies should start using nades again
foreach( actor in level.squad )
{
actor.grenadeAmmo = 1;
}
}
lightbulb_destruction( light_hitbox_targetname, light_script_noteworthy, model_script_noteworthy)
{
lamp_on = getent( model_script_noteworthy, "script_noteworthy");
hitbox = GetEnt (light_hitbox_targetname, "targetname");
hitbox setcandamage ( true );
while ( 1 )
{
hitbox waittill ( "damage", damage, attacker, direction_vec, point, type );
// iprintln (" type: " + type);
if ( (type == "MOD_RIFLE_BULLET") || (type == "MOD_PISTOL_BULLET") )
{
break;
}
}
lamp_on SetModel ("ch_industrial_lamp_off");
playfxontag( level._effect[ "light_blowout" ], lamp_on, "tag_origin" );
// Turn off the actual lights, too
lights = getentarray( light_script_noteworthy, "script_noteworthy");
foreach ( light in lights )
{
light SetLightIntensity( 0 );
light notify ( "light_off" );
}
if ( light_script_noteworthy == "generator_light_hallway" && !flag ("vignette_outro") )
{
hallway_spotlight_destroyed();
}
if ( light_script_noteworthy == "generator_light" )
{
flag_set ("lobby_light_destroyed");
}
}
generator_destruction( generator_script_noteworthy, light_script_noteworthy, model_script_noteworthy )
{
generator = getent( generator_script_noteworthy, "script_noteworthy");
playfxontag( level._effect[ "generator_blink" ], generator, "tag_fx" );
// Wait until the generator is no longer destructible, i.e. destroyed
while (generator isDestructible())
wait .1;
//iPrintln ("Generator blew up");
// Change into the "off" floodlight
lamp_on = getent( model_script_noteworthy, "script_noteworthy");
lamp_on SetModel ("ch_industrial_lamp_off");
// Turn off the actual lights, too
lights = getentarray( light_script_noteworthy, "script_noteworthy");
foreach ( light in lights )
{
light SetLightIntensity( 0 );
stopfxontag( level._effect[ "generator_blink" ], generator, "tag_fx" );
light notify ( "light_off" );
}
// If it's the generator in the last hallway, find the turret gunner and nerf his accuracy
if ( light_script_noteworthy == "generator_light_hallway" && !flag ("vignette_outro") )
{
hallway_spotlight_destroyed();
}
if ( light_script_noteworthy == "generator_light" )
{
flag_set ("lobby_light_destroyed");
}
}
hallway_spotlight_destroyed()
{
level endon ("turret_users_all_dead");
disable_trigger_with_targetname( "hallway_kill_zone" );
flag_clear ("player_in_kill_zone");
turret = GetEnt ("hallway_mg", "targetname");
turret ClearTargetEntity();
turret SetAISpread( 3 );
turret TurretFireDisable();
turret SetConvergenceTime( 2.5, "yaw" );
level._player set_player_attacker_accuracy( 0.3 );
level._player.ignoreme = true;
if ( IsTurretActive( turret ) )
{
user = turret GetTurretOwner();
// user custom_battlechatter( "response_ack_callout_generic_neg" );
if ( flag ("machine_gunner_detected") && !flag ("hallway_light_destroyed") )
{
level.squad[ "ALLY_ALPHA" ] thread dialogue_queue( "hos_bak_corr_theycantsee" );
foreach( actor in level.squad )
{
actor.ignoreSuppression = true;
}
issue_color_orders( "g350 b350", "allies" );
// thread mg_hallway_badplace_setup();
}
}
flag_set ("hallway_light_destroyed");
wait 7;
turret TurretFireEnable();
level._player.ignoreme = false;
}
lobby_enemy_cleanup()
{
foreach ( guy in level.lobby_guys)
{
maps\nx_hospital_hall_first_floor::encounter_cleanup_kill( guy );
wait .2;
}
}
/*
corridor_enemy_table_flip()
{
wait_for_targetname_trigger( "table_flip_trigger");
if (isalive (self))
{
self maps\_dynamic_cover::actor_table_flip("corridor_entrace_dynamic_cover");
self.animname = "generic";
self dialogue_queue ("est_ru_3_steady");
}
}
corridor_enemy_door_kick()
{
wait_for_targetname_trigger( "spray_and_pray_trigger");
node = GetEnt ("door_kicker_node", "targetname");
door_kicker = spawn_targetname ("door_kicker_spawner");
door_kicker.animname = "generic";
door_kicker.ignoreme = true;
door_kicker thread dialogue_queue ("est_ru1_attack");
node thread anim_single_solo ( door_kicker, "door_kick_in");
wait .5;
door = GetEnt ("lmg_guy_door", "targetname");
door RotateTo ( (door.angles + (90, 0, 0)), .3, 0, 0.1 );
door MoveTo ( (door.origin + (0, 12, 3)), .3, 0, 0.1 );
door_kicker.ignoreme = false;
door_kicker startcontinuousfire();
}
*/
//*******************************************************************
// *
// Assassination *
//*******************************************************************
assassination_start()
{
maps\nx_hospital_util::actor_teleport( level.squad[ "ALLY_ALPHA" ], "assassination_start_alpha" );
maps\nx_hospital_util::actor_teleport( level.squad[ "ALLY_BRAVO" ], "assassination_start_bravo" );
level._player maps\_nx_utility::move_player_to_start_point( "assassination_start_player" );
thread maps\nx_hospital_anim::outro_spawn();
flag_set ("vignette_outro");
}
assassination_main()
{
level thread assassination_bink();
level thread assassination_flatline_bink();
// thread hand_cam_control();
flag_wait ("mission_complete");
// Uncomment this line and comment the line above to make the mission end before the outro vignette
// flag_wait ("squad_at_recovery_room");
nextmission();
}
assassination_catchup_nag()
{
delay = 6;
trigger = GetEnt ("player_near_outro", "targetname");
trigger endon ("trigger");
while ( 1 )
{
wait delay;
// Over Here
level.squad[ "ALLY_ALPHA" ] dialogue_queue( "hos_bak_corr_overhere" );
wait delay;
// Walker, what's the holdup?
level.squad[ "ALLY_ALPHA" ] dialogue_queue( "hos_bak_corr_whatsholdup" );
wait delay;
// Walker, now!
level.squad[ "ALLY_ALPHA" ] dialogue_queue( "hos_bak_const_walkernow" );
delay++;
}
}
assassination_bink()
{
level endon( "target_dead" );
// preload the movie
SetSavedDvar( "cg_cinematicFullScreen", "0" );
CinematicInGameLoopResident( "nx_hospital_ekg" );
level waittill( "heart_beat_monitor_start" ); //delay so that this doesn't execute during level load.
while( !IsCinematicLoaded() )
{
wait 0.05;
}
//ok it's loaded now, so lets start it over so it's timed up.
SetSavedDvar( "cg_cinematicFullScreen", "0" );
CinematicInGameLoopResident( "nx_hospital_ekg" );
}
assassination_flatline_bink()
{
level waittill( "target_dead" );
// preload the movie
SetSavedDvar( "cg_cinematicFullScreen", "0" );
flag_set ("hvt_killed");
CinematicInGameLoopResident( "nx_hospital_ekg_flatline" );
}
spawn_final_defenders()
{
trigger = GetEnt ( "corridor_final_defense_trigger", "targetname");
if ( isdefined( trigger ) )
{
trigger notify( "trigger" );
}
turret = GetEnt ("hallway_mg", "targetname");
turret SetAISpread( 0.3 );
thread hallway_kill_zone();
}
vending_machine_dynamic_cover( user )
{
wait 5;
if (isalive ( user ) && ( maps\_dynamic_cover::dynamic_cover_activated( "hallway_vending_machine" ) != true) && !flag ("hallway_light_destroyed"))
{
level.squad[ "ALLY_BRAVO" ] maps\_dynamic_cover::actor_vending_machine_tip("hallway_vending_machine");
}
}
final_corridor_events()
{
wait_for_targetname_trigger( "corridor_final_defense_trigger");
thread lobby_enemy_cleanup();
autosave_tactical();
thread hallway_kill_zone();
final_spawners = getentarray( "corridor_final_defense_spawners", "targetname" );
array_thread( final_spawners, ::add_spawn_function, ::final_defender_setup );
final_defenders = spawn_targetname ("corridor_final_defense_spawners");
table_flipper = spawn_targetname ("table_flip_spawner");
thread machine_gunner_logic ( final_defenders );
thread maps\nx_hospital_anim::outro_spawn();
waittill_dead( final_defenders );
flag_set ("vignette_outro");
// maps\nx_hospital_util::squad_cqb( true );
}
final_defender_setup()
{
self endon ("death");
self.disableLongDeath = true;
level waittill ("turret_users_all_dead");
// in case the light shootout logic bailed with the turret disabled, so the player can use it.
turret = GetEnt ("hallway_mg", "targetname");
turret TurretFireEnable();
self.fixednode = false;
self.aggressivemode = true;
self maps\nx_hospital_atrium::ai_playerseek();
self.goalradius = 128;
self.ignoresuppression = true;
}
hallway_kill_zone()
{
createThreatBiasGroup( "player" );
level._player setThreatBiasGroup( "player" );
flag_wait ("player_in_kill_zone");
level._player set_player_attacker_accuracy( 100 );
SetThreatBias( "axis", "player", 999999 );
flag_waitopen("player_in_kill_zone");
SetThreatBias( "axis", "player", 1 );
level._player set_player_attacker_accuracy( 1 );
if ( !flag ("hallway_light_destroyed"))
{
thread hallway_kill_zone();
}
}
/*
hand_cam_control()
{
turret = getent( "handheld_camera", "targetname" );
turret hide();
trigger = GetEnt ("camera_trigger", "targetname");
trigger SetHintString( &"NX_HOSPITAL_HINT_USE_CAMERA" );
trigger waittill ("trigger");
level._player setplayerangles( ( turret.angles[ 0 ], turret.angles[ 1 ], level._player.angles[ 2 ] ) );
turret useby( level._player );
turret TurretFireDisable();
level._player allowFire( false );
setsaveddvar( "ui_hideMap", "1" );
setsaveddvar( "compass", 0 );
SetSavedDvar( "ammoCounterHide", "1" );
SetSavedDvar( "hud_showStance", 0 );
}
*/
check_for_premature_assassination()
{
level endon ("kill_orders_received");
while ( 1 )
{
self waittill ( "damage", damage, attacker );
if ( attacker == level._player )
{
set_hvt_dead( undefined );
SetDvar( "ui_deadquote", &"NX_HOSPITAL_FAIL_KILLED_LEADER" );
flag_set( "hvt_killed" );
missionFailedWrapper();
}
}
}
set_hvt_dead( guy )
{
level notify( "target_dead" );
}