nx1-gsc-dump/maps/nx_skyscraper_hangar.gsc

535 lines
15 KiB
Plaintext

//****************************************************************************
// **
// Confidential - (C) Activision Publishing, Inc. 2010 **
// **
//****************************************************************************
// **
// Module: MISSION DESCRIPTION **
// **
// Created: 7/15/2011 - Ken Moodie **
// **
//****************************************************************************
#include maps\_utility;
#include maps\_utility_code;
#include maps\_nx_objective_util;
#include common_scripts\utility;
#include maps\_anim;
#include maps\_vehicle;
#include maps\_nx_utility;
#include maps\nx_skyscraper_util;
#include common_scripts\_nx_fx;
//*******************************************************************
// WINDOW TO HANGAR *
// *
//*******************************************************************
window_start()
{
level._player maps\_nx_utility::move_player_to_start_point( "playerstart_window" );
thread maps\nx_skyscraper_fx::set_vision_and_fog("interior", 0); // set appropriate vision and fog
maps\nx_skyscraper_util::player_weapon_init( false );
thread maps\_utility::set_ambient( "amb_skyscraper_office_int" );
maps\nx_skyscraper_util::spawn_baker();
thread fx_explosive_circle_setup();
// Show cloud ring.
thread fx_show_cloud_ring();
}
window_sequence()
{
baker_teleport = GetEnt ("baker_window_teleport", "targetname");
level.baker ForceTeleport( baker_teleport.origin, baker_teleport.angles);
level.baker enable_cqbwalk();
issue_color_orders ("r20", "allies");
// Take out enemies in room through wall
hallway_encounter();
thread window_dialog();
// Baker opens door
door = GetEnt( "model_window_room_door", "targetname" ); //hinge brush model object for door.
node_door = getent( "node_window_room_door", "targetname" ); //called on script_origin node, grabs KVP, and assigns to variable.
attachments = GetEntArray( door.target, "targetname" );
Assert( IsDefined( door ));
Assert( IsDefined( node_door ));
Assert( IsDefined( attachments ));
for ( i = 0; i < attachments.size; i++ )
{
attachments[ i ] LinkTo( door );
}
node_door anim_reach_solo( level.baker, "hunted_open_barndoor" ); //blends into first frame of open door anim based off cover right anim pose. Also ends anim in cover right position.
door thread hunted_style_door_open(); //function to open door that is based off door open anim. Not sure where this is defined.
maps\nx_skyscraper_anim::xray_kill_thru_door();
// Fix paths on other side of door and send baker into room
door ConnectPaths();
level.baker enable_ai_color();
issue_color_orders ("r21", "allies");
thread autosave_now();
level waittill ("grid_displayed");
thread window_cut();
flag_wait ("landing_pad_window_open");
thread landing_pad_kill();
//thread maps\nx_skyscraper_fx::set_vision_and_fog("exterior_up_high", 2); // set appropriate vision and fog
issue_color_orders ("r30", "allies");
level waittill ("player_out_window");
thread fx_delete_window_debris();
thread hangar_fall_watcher();
thread autosave_now();
level.baker waittill ("goal");
flag_wait ("flag_landing_pad_climbjump_ally");
level waittill ("landing_pad_vignettes_done");
}
window_dialog()
{
// add_dialogue_line( "Team A", "The office ahead should be just below the lab's landing pad.", "purple", 2 );
radio_dialogue ("sky_teama_halltowindow_officebelow");
// add_dialogue_line( "Team A", "Go through the window to access the landing pad's substructure.", "purple", 2 );
radio_dialogue ("sky_teama_halltwowindow_thruwindow");
// add_dialogue_line( "Baker", "Copy that. We're nearly there now.", "green", 2 );
level.baker dialogue_queue( "sky_bak_halltowindow_nearlythere" );
// add_dialogue_line( "Team A", "I'm passing you the security frequency.", "purple", 2 );
radio_dialogue ("sky_teama_halltowindow_securityfreq");
// add_dialogue_line( "Team A", "The grid should be visible in your HUD.", "purple", 2 );
radio_dialogue ("sky_teama_halltowindow_gridinhud");
level notify ("grid_displayed");
// add_dialogue_line( "Baker", "Roger, I see it. Making an exit now.", "green", 2 );
level.baker dialogue_queue( "sky_bak_halltowindow_makingexit" );
flag_set ("flag_landing_pad_window");
flag_wait ("landing_pad_window_open");
// add_dialogue_line( "Baker", "And there we go.", "green", 2 );
level.baker dialogue_queue( "sky_bak_halltowindow_therewego" );
// flag_set ("flag_landing_pad_window_player");
}
hangar_fall_watcher()
{
trigger = GetEnt ("trig_lab_to_vault_player_in_room", "targetname");
trigger endon ("trigger");
trigger = GetEnt ("hangar_fall", "targetname");
trigger waittill ("trigger");
SetSlowMotion( 1.0, 0.5, 0.25 );
SetDvar( "ui_deadquote", &"NX_SKYSCRAPER_FAIL_FALL" );
missionFailedWrapper();
}
//*******************************************************************
// *
// *
//*******************************************************************
window_cut()
{
/*
// Make the cuts
cut_origins =
[
"origin_window_cut1",
"origin_window_cut2",
"origin_window_cut3",
"origin_window_cut4"
];
cuts = [];
for( i = 0; i < cut_origins.size; i++ )
{
cuts[ i ] = GetEnt( cut_origins[ i ], "targetname" );
Assert( IsDefined( cuts[ i ] ));
}
cutter = spawn_tag_origin();
cutter.origin = cuts[ 0 ].origin;
cutter thread window_cut_fx();
foreach( cut in cuts )
{
cutter MoveTo( cut.origin, 1 );
wait 1;
}
cutter notify( "notify_stop_cut" );
StopFXOnTag( GetFX( "spark_fountain" ), cutter, "tag_origin" );
wait 5;
*/
// Explosive circle.
fx_explosive_circle_animate();
// Break the glass
window = GetGlass ("hangar_access_window");
if ( !IsGlassDestroyed ( window ))
{
DestroyGlass ( window );
}
// Play wind
Exploder( "fx_window_wind" );
}
/*
window_cut_fx()
{
self endon( "notify_stop_cut" );
while( 1 )
{
PlayFXOnTag( GetFX( "spark_fountain" ), self, "tag_origin" );
wait 0.5;
}
}
*/
//*******************************************************************
// *
// *
//*******************************************************************
hallway_encounter()
{
level.baker.goalradius = 8;
thread hallway_encounter_enemies();
level.baker thread baker_scan();
//wait 3;
// add_dialogue_line( "Baker", "Scan the walls and look for threats.", "green", 2 );
level.baker dialogue_queue ("sky_bak_halltowindow_stayalert");
level.baker waittill( "goal" );
trigger = GetEnt ("trigger_hallway_kill", "targetname");
trigger waittill ("trigger");
// Start scanning the room
level.baker notify( "notify_room_scan" );
flag_wait( "guys_in_room_dead" );
}
baker_scan()
{
self endon( "notify_room_scan" );
baker_look = spawn_tag_origin();
wait 1;
while( 1 )
{
baker_look.origin = self.origin + vector_multiply( AnglesToForward( self.angles ), 1024 ) + vector_multiply( AnglesToRight( self.angles ), 800 );
self cqb_aim( baker_look );
wait_random( 2, 3 );
// Look left
baker_look.origin = self.origin + vector_multiply( AnglesToForward( self.angles ), 1024 ) + vector_multiply( (-1) * AnglesToRight( self.angles ), 800 );
self cqb_aim( baker_look );
wait_random( 2, 3 );
}
}
hallway_encounter_enemies()
{
sitter_spawners = GetEntArray( "actor_sitting", "script_noteworthy" );
Assert( IsDefined( sitter_spawners ));
timeout = 0.05;
level.enemies[ "sitters" ] = [];
origins = [];
sitter_anime =
[
"civilian_sitting_talking_B_1",
"civilian_sitting_talking_A_1",
"civilian_sitting_talking_A_2"
];
sitter_origin =
[
"origin_sitting_1",
"origin_sitting_2",
"origin_sitting_3"
];
for( i = 0; i < sitter_origin.size; i++ )
{
origins[ i ] = GetEnt( sitter_origin[ i ], "targetname" );
sitter_spawners[ i ] add_spawn_function( ::spawnfunc_hallway_enemy, origins[ i ] );
Assert( IsDefined( origins ));
level.enemies[ "sitters" ][ i ] = sitter_spawners[ i ] spawn_ai();
level.enemies[ "sitters" ][ i ].animname = "sitter";
origins[ i ] thread anim_loop_solo( level.enemies[ "sitters" ][ i ], sitter_anime[ i ] );
wait 0.05;
}
thread hallway_encounter_enemies_watcher( sitter_origin );
level.baker waittill( "notify_room_scan" );
thread maps\nx_skyscraper_anim::xray_kill_intro();
// Player has killed none of the enemies yet
if ( level.enemies[ "sitters" ].size == sitter_origin.size )
{
// thread add_dialogue_line( "Baker", "We've got 3 tangos in this room. Take 'em out.", "g" );
level.baker dialogue_queue ("sky_bak_halltowindow_3tangos");
timeout = 10;
}
// Player has killed some but not all enemies
if ( level.enemies[ "sitters" ].size < sitter_origin.size && level.enemies[ "sitters" ].size >= 1 )
{
// thread add_dialogue_line( "Baker", "Good start. I'll take care of the leftovers.", "g" );
level.baker dialogue_queue ("sky_bak_halltowindow_goodstart");
timeout = 0.05;
}
// Player asked to kill enemies with X-Ray. Baker will kill all if player takes too long.
while( ( timeout > 0 ) )
{
// level.enemies[ "sitters" ] = remove_dead_from_array( level.enemies[ "sitters" ] );
wait 0.05;
timeout = timeout - 0.05;
}
level.baker.ignoreall = false;
level.baker.baseaccuracy = 1000;
enemies_alerted = false;
// Baker kills
while( level.enemies[ "sitters" ].size > 0 )
{
level.enemies[ "sitters" ] = remove_dead_from_array( level.enemies[ "sitters" ] );
if( level.enemies[ "sitters" ].size > 0 )
{
unlucky_guy = random( level.enemies[ "sitters" ] );
if( isalive( unlucky_guy ))
{
level.baker cqb_aim( unlucky_guy );
wait .2;
level.baker shoot();
unlucky_guy kill();
wait .8;
}
}
wait 0.05;
}
level.baker.ignoreall = true;
level.baker.baseaccuracy = 1;
flag_set ( "guys_in_room_dead" );
level notify ("guys_in_room_dead");
}
hallway_encounter_enemies_watcher( sitter_origin )
{
level endon ("guys_in_room_dead");
while( level.enemies[ "sitters" ].size >= 1 )
{
level.enemies[ "sitters" ] = remove_dead_from_array( level.enemies[ "sitters" ] );
wait 0.05;
}
}
//*******************************************************************
// *
// *
//*******************************************************************
spawnfunc_hallway_enemy( origin )
{
thread death_watch( origin );
thread breakloop( origin );
}
death_watch( origin )
{
self waittill( "damage" );
origin notify( "stop_loop" );
self StopAnimScripted();
self kill();
level notify( "notify_hallway_enemy_dead" );
}
breakloop( origin )
{
self endon( "death" );
level waittill( "notify_hallway_enemy_dead" );
origin notify( "stop_loop" );
self StopAnimScripted();
}
//*******************************************************************
// HANGAR *
// *
//*******************************************************************
hangar_start()
{
level._player maps\_nx_utility::move_player_to_start_point( "playerstart_hangar" );
thread maps\nx_skyscraper_fx::set_vision_and_fog("ext_up_high", 0); // set appropriate vision and fog
maps\nx_skyscraper_util::player_weapon_init( false );
thread hangar_fall_watcher();
maps\nx_skyscraper_util::spawn_baker();
level.baker enable_cqbwalk();
thread landing_pad_kill();
waittillframeend;
level notify ("landing_pad_vignettes_done");
}
hangar_sequence()
{
thread maps\_utility::set_ambient( "amb_skyscraper_windy_ext" );
thread fx_show_cloud_ring();
// Temp Baker traversal
// baker_teleport = GetEnt ("baker_substructure_teleport", "targetname");
// level.baker ForceTeleport( baker_teleport.origin, baker_teleport.angles);
// trigger = GetEnt ("hangar_transition", "targetname");
// trigger waittill ("trigger");
baker_teleport = GetEnt ("baker_hangar_teleport", "targetname");
level.baker ForceTeleport( baker_teleport.origin, baker_teleport.angles);
level._player maps\_nx_utility::move_player_to_start_point( "playerstart_hangar" );
thread autosave_now();
issue_color_orders ("r33", "allies");
//level.baker waittill ("goal");
// maps\nx_skyscraper_lab_enter::sequence_lab_enter();
//issue_color_orders ("r35", "allies");
}
landing_pad_kill()
{
landing_pad_guard_1 = spawn_targetname ("landing_pad_enemy_spawner_1");
landing_pad_guard_2 = spawn_targetname ("landing_pad_enemy_spawner_2");
landing_pad_guard_1.animname = "target";
landing_pad_guard_2.fixednode = true;
landing_pad_guard_1.fixednode = true;
landing_pad_guard_1.allow_death = true;
level.baker.ignoreall = true;
level waittill ("landing_pad_vignettes_done");
landing_pad_guard_2 thread landing_pad_enemy_behavior_hack();
landing_pad_guard_1 thread landing_pad_enemy_behavior_hack();
landing_pad_guard_2 thread landing_pad_enemy_behavior_hack_part_2();
landing_pad_guard_1 thread landing_pad_enemy_behavior_hack_part_2();
guys = [];
guys["ally_01"] = level.baker;
guys["target"] = landing_pad_guard_1;
node = GetNode ("landing_pad_kill_node", "targetname");
node anim_reach_solo( level.baker, "landing_pad_melee_kill" );
if ( isAlive (landing_pad_guard_1))
{
node anim_single(guys, "landing_pad_melee_kill");
landing_pad_guard_1 maps\_nx_vignette_util::vignette_actor_kill();
}
level.baker enable_ai_color();
level.baker.ignoreall = false;
}
landing_pad_enemy_behavior_hack()
{
self endon ("death");
self waittill_any ("damage", "bulletwhizby", "enemy_visible");
self.pacifist = false;
}
landing_pad_enemy_behavior_hack_part_2()
{
self endon ("death");
while ( isAlive (self))
{
if ( (level._player AttackButtonPressed() && level._player GetCurrentWeapon() != "lancer_silencer_xray") || level._player ButtonPressed( "BUTTON_LSTICK") || level._player ButtonPressed( "BUTTON_A" ))
{
self.pacifist = false;
break;
}
wait .1;
}
}
fx_explosive_circle_setup()
{
circ01 = getEnt( "fx_explosive_circle", "script_noteworthy" );
if ( isDefined( circ01 ) )
{
circ01 hide();
}
circ02 = getEnt( "fx_explosive_circle_2", "script_noteworthy" );
if ( isDefined( circ02 ) )
{
circ02 hide();
}
}
fx_explosive_circle_animate()
{
circ01 = getEnt( "fx_explosive_circle", "script_noteworthy" );
if ( !isDefined( circ01 ) )
{
return;
}
circ01 show();
circ01 setAnimParamValue( 0, 999 );
circ01 setAnimParamValue( 1, -0.2 );
wait 2.65;
wait 1.8;
circ01 hide();
}
fx_delete_window_debris()
{
// Delete lingering fx from window breach sequence.
fx_delete_createFXEnt_by_fxID( "nx_ss_window_debris", true);
fx_delete_createFXEnt_by_fxID( "nx_ss_window_debris_swirl", true);
}