mirror of
https://github.com/reaaLx/nx1-gsc-dump.git
synced 2025-04-22 17:15:48 +00:00
1084 lines
33 KiB
Plaintext
1084 lines
33 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;
|
|
|
|
//*******************************************************************
|
|
// LAB ENTER *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
start_lab_enter()
|
|
{
|
|
level._player maps\_nx_utility::move_player_to_start_point( "playerstart_lab_enter" );
|
|
thread maps\nx_skyscraper_fx::set_vision_and_fog("infiltration", 0); // set appropriate vision and fog
|
|
|
|
thread maps\_utility::set_ambient( "amb_skyscraper_robotics_int" );
|
|
|
|
maps\nx_skyscraper_util::spawn_baker();
|
|
baker_teleport = GetEnt ("baker_lab_enter_teleport", "targetname");
|
|
|
|
Assert( IsDefined( baker_teleport ));
|
|
|
|
level.baker ForceTeleport( baker_teleport.origin, baker_teleport.angles);
|
|
|
|
// Player weapons
|
|
maps\nx_skyscraper_util::player_weapon_init( false );
|
|
level._player SwitchToWeapon( "lancer_silencer_xray" );
|
|
|
|
issue_color_orders( "r35", "allies" );
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
sequence_lab_enter()
|
|
{
|
|
// Globals
|
|
level.enemies[ "melee_enemies" ] = [];
|
|
level.enemies[ "search_uavs" ] = [];
|
|
|
|
// Make hallway dangerous
|
|
thread hallway_dangerous();
|
|
|
|
trigger_wait_targetname( "entering_lab" );
|
|
|
|
thread autosave_now();
|
|
|
|
thread lab_vision_transition();
|
|
|
|
// Setup xray on models
|
|
xray_models();
|
|
|
|
// Doors
|
|
|
|
left_door_trigger = GetEnt( "trig_dooropen_left", "targetname" );
|
|
right_door_trigger = GetEnt( "trig_dooropen_right", "targetname" );
|
|
Assert( IsDefined( left_door_trigger ));
|
|
Assert( IsDefined( right_door_trigger ));
|
|
left_door_trigger sethintstring( "Press [{+usereload}] to open door" );
|
|
right_door_trigger sethintstring( "Press [{+usereload}] to open door" );
|
|
thread player_dooropen( "model_dooropen_left", "model_dooropen_right", "trig_left_doorway", "trig_dooropen_left", "trig_dooropen_right", "flag_dooropen_left", "melee_2", "melee_1", "trig_melee_kill_1", "flag_melee_kill_2" );
|
|
thread player_dooropen( "model_dooropen_right", "model_dooropen_left", "trig_right_doorway", "trig_dooropen_right", "trig_dooropen_left", "flag_dooropen_right", "melee_1", "melee_2", "trig_melee_kill_2", "flag_melee_kill_1" );
|
|
|
|
// Stealth stuff
|
|
stealth_settings();
|
|
|
|
// UAVs
|
|
level.enemies[ "search_uavs" ][ 0 ] = spawn_uav_searching( "vehicle_miniuav_1", "node_attack_1", "origin_search_1" );
|
|
level.enemies[ "search_uavs" ][ 1 ] = spawn_uav_searching( "vehicle_miniuav_2", "node_attack_1", "origin_search_2" );
|
|
|
|
// Turn on spotlights
|
|
level.enemies[ "search_uavs" ] thread uav_spotlight_sequence( "trig_lab_door_left", "trig_lab_door_right" );
|
|
|
|
// Set up pathing for UAVs one for left path one for right path
|
|
level.enemies[ "search_uavs" ] thread uav_search_path( "trig_lab_door_left", "origin_search_window_left", "origin_search_door_right", "origin_search_door_right", "model_cock_left" );
|
|
level.enemies[ "search_uavs" ] thread uav_search_path( "trig_lab_door_right", "origin_search_window_right", "origin_search_door_left", "origin_search_door_left", "model_cock_right" );
|
|
|
|
level.enemies[ "search_uavs" ][ 1 ] thread uav_hall_scan_remove();
|
|
|
|
// Melee Guys for left path and right path
|
|
level.enemies[ "melee_enemies" ][ "melee_1" ] = spawn_melee_enemy( "actor_melee_1", "origin_melee_1", "melee_1", "melee_guy_idle" );
|
|
level.enemies[ "melee_enemies" ][ "melee_2" ] = spawn_melee_enemy( "actor_melee_2", "origin_melee_2", "melee_1", "melee_guy_idle" );
|
|
|
|
// Doin business
|
|
level.enemies[ "doinbusiness" ] = spawn_doinbusiness_enemy( "actor_doinbusiness", "origin_doinbusiness", "doinbusiness", "doinbusiness_idle" );
|
|
|
|
// Baker
|
|
level.baker thread baker_movement_lab_enter();
|
|
|
|
// Events
|
|
thread event_stealth_blown();
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
player_dooropen( model, other_model, tDoorChooseTrigger, tEnterTrigger, tEnterTrigger_other, flag_to_set, baker_guy, player_guy, melee_trigger, melee_flag )
|
|
{
|
|
level._player endon( "notify_player_through_door" );
|
|
|
|
flashing_door = GetEntArray( model + "_flashing", "script_noteworthy" );
|
|
flashing_door_other = GetEntArray( other_model + "_flashing", "script_noteworthy" );
|
|
door = GetEnt( model, "targetname" );
|
|
trigger_enter = GetEnt( tEnterTrigger, "targetname" );
|
|
trigger_enter_other = GetEnt( tEnterTrigger_other, "targetname" );
|
|
|
|
baker_door_trigger_left = GetEnt( "trig_left_doorway", "targetname" );
|
|
baker_door_trigger_right = GetEnt( "trig_right_doorway", "targetname" );
|
|
|
|
Assert( IsDefined( flashing_door ));
|
|
Assert( IsDefined( flashing_door_other ));
|
|
Assert( IsDefined( door ));
|
|
Assert( IsDefined( trigger_enter ));
|
|
Assert( IsDefined( baker_door_trigger_left ));
|
|
Assert( IsDefined( baker_door_trigger_right ));
|
|
Assert( IsDefined( trigger_enter_other ));
|
|
|
|
trigger_enter trigger_off();
|
|
|
|
foreach( thing in flashing_door )
|
|
{
|
|
thing hide();
|
|
}
|
|
|
|
level waittill( "notify_dooropen_enable" );
|
|
trigger_enter trigger_on();
|
|
|
|
door hide();
|
|
|
|
foreach( thing in flashing_door )
|
|
{
|
|
thing show();
|
|
}
|
|
|
|
trigger_wait_targetname( tDoorChooseTrigger );
|
|
|
|
// Turn off "other" door and send baker through
|
|
foreach( thing in flashing_door_other )
|
|
{
|
|
thing hide();
|
|
}
|
|
|
|
trigger_enter_other trigger_off();
|
|
|
|
baker_door_trigger_left trigger_off();
|
|
baker_door_trigger_right trigger_off();
|
|
|
|
level.baker thread baker_goes_through_door( "origin_" + other_model );
|
|
|
|
trigger_enter waittill( "trigger" );
|
|
|
|
door show();
|
|
|
|
foreach( thing in flashing_door )
|
|
{
|
|
thing hide();
|
|
}
|
|
|
|
iprintln( "[Player moves through door, sees UAV approach through crack in door, closes door]" );
|
|
|
|
warp = undefined;
|
|
|
|
if( model == "model_dooropen_left" )
|
|
{
|
|
warp = GetEnt( "origin_lab_enter_baker_warp_left", "targetname" );
|
|
flag_set( "flag_lab_enter_dooropen_left" );
|
|
}
|
|
else
|
|
{
|
|
warp = GetEnt( "origin_lab_enter_baker_warp_right", "targetname" );
|
|
flag_set( "flag_lab_enter_dooropen_right" );
|
|
}
|
|
|
|
objective = GetEnt( "obj_player_" + model, "targetname" );
|
|
Assert( IsDefined( warp ));
|
|
Assert( IsDefined( objective ));
|
|
|
|
teleport_player( warp );
|
|
|
|
// Add player position goal
|
|
Objective_Position( obj( "obj_lab_enter" ), objective.origin );
|
|
|
|
//door.origin = door_pos;
|
|
|
|
flag_set( flag_to_set );
|
|
|
|
thread event_synced_melee( baker_guy, player_guy, melee_trigger, melee_flag );
|
|
|
|
flag_set( "flag_lab_enter_player_through_door" );
|
|
|
|
// This will kill second instance of uav_search_path and player_dooropen
|
|
level._player notify( "notify_player_through_door" );
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
baker_goes_through_door( tOrigin )
|
|
{
|
|
origin = GetEnt( tOrigin, "targetname" );
|
|
Assert( IsDefined( origin ));
|
|
|
|
origin anim_reach_solo( self, "hunted_open_barndoor" );
|
|
origin anim_single_solo( self, "hunted_open_barndoor" );
|
|
|
|
color_nodes = GetNodeArray( "node_baker_lab", "script_noteworthy" );
|
|
Assert( IsDefined( color_nodes ));
|
|
|
|
if( Distance( color_nodes[0].origin, level.baker.origin ) < Distance( color_nodes[1].origin, level.baker.origin ))
|
|
{
|
|
level.baker SetGoalNode( color_nodes[0] );
|
|
}
|
|
else
|
|
{
|
|
level.baker SetGoalNode( color_nodes[1] );
|
|
}
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
uav_spotlight_sequence( tTriggerLeft, tTriggerRight )
|
|
{
|
|
// Initialize real spotlight on uav1 (fake spot on uav2)
|
|
uav_fx = 1;
|
|
PlayFXOnTag( level._effect[ "spotlight_white" ], self[ 0 ], "tag_origin" );
|
|
PlayFXOnTag( level._effect[ "spotlight_dynamic" ], self[ 1 ], "tag_barrel" );
|
|
|
|
level._player waittill( "notify_player_through_door" );
|
|
wait 0.05;
|
|
StopFXOnTag( level._effect[ "spotlight_white" ], self[ 0 ], "tag_origin" );
|
|
PlayFXOnTag( level._effect[ "spotlight_dynamic" ], self[ 0 ], "tag_origin" );
|
|
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
lab_vision_transition()
|
|
{
|
|
trigger_wait_targetname( "obj_enter_vault" );
|
|
thread maps\nx_skyscraper_fx::set_vision_and_fog("interior", 2); // set appropriate vision and fog
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
lab_enter_dialog()
|
|
{
|
|
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
baker_movement_lab_enter()
|
|
{
|
|
level endon( "notify_synced_melee_complete" );
|
|
|
|
//self.ignoreme = true;
|
|
self.ignoreall = true;
|
|
self enable_cqbwalk();
|
|
|
|
// Dialogue - Baker: "<whispers> I've got two tangos on X-Ray blocking the hallway."
|
|
level.baker dialogue_queue( "sky_bak_labent_2tangosxray" );
|
|
//thread add_dialogue_line( "Baker", "<whispers> I've got two tangos on X-Ray blocking the hallway.", "g" );
|
|
|
|
// Dialogue - Baker: "<whispers> Let's split up and take them out at the same time."
|
|
level.baker dialogue_queue( "sky_bak_labent_splitup" );
|
|
//thread add_dialogue_line( "Baker", "<whispers> Let's split up and take them out at the same time.", "g" );
|
|
|
|
level notify( "notify_dooropen_enable" );
|
|
|
|
wait 2;
|
|
|
|
level notify( "notify_send_hallway_uav" );
|
|
|
|
if( !flag( "flag_lab_enter_player_through_door" ))
|
|
{
|
|
// Dialogue: Baker - "UAV coming, get out of the hallway!"
|
|
level.baker dialogue_queue( "sky_bak_labent_uavcoming" );
|
|
//thread add_dialogue_line( "Baker", "<whispers> UAV coming, get out of the hallway!", "g" );
|
|
}
|
|
|
|
// Wait for player to get through door
|
|
//level._player waittill( "notify_player_through_door" );
|
|
|
|
/*
|
|
left_warp = GetEnt( "origin_lab_enter_baker_warp_left", "targetname" );
|
|
right_warp = GetEnt( "origin_lab_enter_baker_warp_right", "targetname" );
|
|
|
|
Assert( IsDefined( left_warp ));
|
|
Assert( IsDefined( right_warp ));
|
|
*/
|
|
|
|
flag_wait( "flag_lab_enter_player_through_door" );
|
|
|
|
// Dialogue: Baker - "Keep behind cover and move close to the ground!"
|
|
//radio_dialogue( "sky_bak_labent_cover" );
|
|
//thread add_dialogue_line( "Baker", "<whispers> Keep behind cover and move close to the ground!", "g" );
|
|
|
|
//level waittill( "notify_uav_1_middle_hall" );
|
|
|
|
//level._player waittill( "notify_player_through_door" );
|
|
|
|
// Dialogue: Baker - "Another UAV. Stay low."
|
|
level.baker dialogue_queue( "sky_bak_labent_anotheruav" );
|
|
//thread add_dialogue_line( "Baker", "<whispers> Another UAV. Get down.", "g" );
|
|
|
|
thread player_uav_dodge();
|
|
|
|
level waittill( "notify_uav_1_passed" );
|
|
|
|
// Dialogue: Baker - "Ok, you're clear to move."
|
|
level.baker dialogue_queue( "sky_bak_labent_cleartomove" );
|
|
//thread add_dialogue_line( "Baker", "<whispers> Ok, you're clear to move.", "g" );
|
|
|
|
self waittill( "goal" );
|
|
flag_wait_any( "flag_melee_kill_1", "flag_melee_kill_2" );
|
|
|
|
// Dialogue: Baker - "Let's take out these guards at the same time. Do it quietly. I'll wait for your move."
|
|
// radio_dialogue( "sky_bak_labent_takeoutguards" );
|
|
// thread add_dialogue_line( "Baker", "<whispers> Let's take out these guards at the same time. Do it quietly. I'll wait for your move.", "g" );
|
|
|
|
baker_countdown();
|
|
|
|
level notify( "notify_baker_melee" );
|
|
|
|
level waittill( "notify_synced_melee_complete" );
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
baker_countdown()
|
|
{
|
|
level endon( "notify_stealth_off" );
|
|
level endon( "notify_player_melee_complete" );
|
|
|
|
// Dialogue - Baker:
|
|
//radio_dialogue( "sky_bak_labent_takeoutguards" );
|
|
|
|
flag_set( "flag_baker_melee_in_progress" );
|
|
|
|
level.baker dialogue_queue( "sky_bak_labent_takeoutguards" );
|
|
//thread add_dialogue_line( "Baker", "<whispers> Let's take out these guards at the same time. Do it quietly.", "g" );
|
|
level.baker dialogue_queue( "sky_bak_labent_mark321" );
|
|
//thread add_dialogue_line( "Baker", "<whispers> On my mark.", "g" );
|
|
/*
|
|
wait 1;
|
|
thread add_dialogue_line( "Baker", "<whispers> 3...", "g" );
|
|
wait 1;
|
|
thread add_dialogue_line( "Baker", "<whispers> 2...", "g" );
|
|
wait 1;
|
|
thread add_dialogue_line( "Baker", "<whispers> 1...", "g" );
|
|
wait 1;
|
|
thread add_dialogue_line( "Baker", "<whispers> Mark", "g" );
|
|
*/
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
// Checks if anyone is alive in an array
|
|
isalive_array( entities )
|
|
{
|
|
something_lives = 0;
|
|
|
|
foreach( thing in entities )
|
|
{
|
|
if( isalive( thing ))
|
|
{
|
|
something_lives++;
|
|
}
|
|
}
|
|
|
|
return something_lives;
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
xray_models()
|
|
{
|
|
models = GetEntArray( "model_xray", "script_noteworthy" );
|
|
foreach( model in models )
|
|
{
|
|
model SetIsVisibleInXray( true );
|
|
}
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
uav_search_path( tDoorwayTrigger, tOrigin1_1, tOrigin1_2, tOrigin2, tScience )
|
|
{
|
|
level._player endon( "notify_player_through_door" );
|
|
level endon( "notify_stealth_off" );
|
|
|
|
// individual UAV search paths
|
|
self[ 0 ] thread uav_search_path_solo_room_scan( tDoorwayTrigger, tOrigin1_1, tOrigin1_2, tScience );
|
|
self[ 1 ] thread uav_search_path_solo_hall_scan( tOrigin2 );
|
|
}
|
|
|
|
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
hallway_dangerous()
|
|
{
|
|
trig_flag_stealth_off = GetEntArray( "flag_door_kill_stealth", "script_noteworthy" );
|
|
|
|
Assert( IsDefined( trig_flag_stealth_off ));
|
|
|
|
foreach( flag in trig_flag_stealth_off )
|
|
{
|
|
flag trigger_off();
|
|
}
|
|
|
|
level._player waittill( "notify_player_through_door" );
|
|
|
|
thread low_cover_on( 128, false );
|
|
thread watcher_cover_off();
|
|
|
|
wait 2;
|
|
|
|
// Make hallway dangerous
|
|
foreach( flag in trig_flag_stealth_off )
|
|
{
|
|
flag trigger_on();
|
|
}
|
|
|
|
level waittill( "notify_synced_melee_complete" );
|
|
|
|
// Make it safe again
|
|
foreach( flag in trig_flag_stealth_off )
|
|
{
|
|
flag trigger_off();
|
|
}
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
// UAV #1's path (second UAV seen)
|
|
uav_search_path_solo_room_scan( tDoorwayTrigger, tOrigin1, tOrigin2, tScience )
|
|
{
|
|
self endon( "death" );
|
|
level endon( "notify_stealth_off" );
|
|
|
|
uav1_origin = GetEnt( "origin_search_1", "targetname" );
|
|
uav1_goal1 = GetEnt( tOrigin1, "targetname" );
|
|
uav1_goal2 = GetEnt( tOrigin2, "targetname" );
|
|
science_experiment = GetEnt( tScience, "targetname" );
|
|
end_node = GetEnt( "origin_search_end", "targetname" );
|
|
|
|
Assert( IsDefined( uav1_origin ));
|
|
Assert( IsDefined( uav1_goal1 ));
|
|
Assert( IsDefined( uav1_goal2 ));
|
|
Assert( IsDefined( science_experiment ));
|
|
Assert( IsDefined( end_node ));
|
|
|
|
self Vehicle_SetSpeed( 5, 5, 1 );
|
|
//self SetLookAtEnt( science_experiment );
|
|
|
|
// Player enters lab doorway
|
|
trigger_wait_targetname( tDoorwayTrigger );
|
|
level notify( "notify_uav_1_approaching" );
|
|
|
|
self thread uav_look( tDoorwayTrigger );
|
|
|
|
wait 1;
|
|
|
|
// Fly to middle, look at experiment
|
|
self SetVehGoalPos( uav1_goal1.origin );
|
|
|
|
self waittill( "goal" );
|
|
level notify( "notify_uav_1_middle_hall" );
|
|
|
|
// Send UAV 1 to end of hallway
|
|
self SetVehGoalPos( uav1_goal2.origin );
|
|
|
|
self waittill( "goal" );
|
|
self notify( "notify_end_uav_look" );
|
|
|
|
self SetVehGoalPos( end_node.origin );
|
|
|
|
self waittill( "goal" );
|
|
self delete();
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
player_uav_dodge()
|
|
{
|
|
display_hint_timeout( "hint_prone_for_cover", 4 );
|
|
|
|
// Wait for UAV to pass player
|
|
while( 1 )
|
|
{
|
|
if( level.uav_lookat_origin.origin[ 1 ] < level._player.origin[ 1 ] )
|
|
break;
|
|
wait 0.05;
|
|
}
|
|
|
|
// For baker to speak
|
|
level notify( "notify_uav_1_passed" );
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
hint_prone_for_cover()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
uav_look( tDoorwayTrigger )
|
|
{
|
|
self endon( "notify_end_uav_look" );
|
|
self endon( "death" );
|
|
|
|
last_pos = undefined;
|
|
|
|
level.uav_lookat_origin = spawn_tag_origin();
|
|
|
|
right = GetEnt( "origin_search_window_right", "targetname" );
|
|
left = GetEnt( "origin_search_window_left", "targetname" );
|
|
|
|
Assert( IsDefined( right ));
|
|
Assert( IsDefined( left ));
|
|
|
|
while( 1 )
|
|
{
|
|
if( isdefined( last_pos ))
|
|
{
|
|
if( tDoorwayTrigger == "trig_lab_door_right" )
|
|
{
|
|
look_vector = AnglestoForward( right.angles);
|
|
}
|
|
else
|
|
{
|
|
look_vector = AnglestoForward( left.angles);
|
|
}
|
|
|
|
level.uav_lookat_origin.origin = self GroundPos( self.origin ) + vector_multiply( look_vector, 256 );
|
|
self SetLookAtEnt( level.uav_lookat_origin );
|
|
}
|
|
|
|
last_pos = self.origin;
|
|
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
// UAV #2's path (first UAV seen)
|
|
uav_search_path_solo_hall_scan( tOrigin1 )
|
|
{
|
|
self endon( "notify_hall_uav_warp" );
|
|
self endon( "death" );
|
|
level endon( "notify_stealth_off" );
|
|
|
|
uav2_goal = GetEnt( tOrigin1, "targetname" );
|
|
hallway_center = GetEnt( "origin_search_center", "targetname" );
|
|
end_node = GetEnt( "origin_search_end", "targetname" );
|
|
|
|
Assert( IsDefined( uav2_goal ));
|
|
Assert( IsDefined( hallway_center ));
|
|
Assert( IsDefined( end_node ));
|
|
|
|
level waittill( "notify_send_hallway_uav" );
|
|
|
|
self Vehicle_SetSpeed( 5, 5, 1 );
|
|
|
|
// UAV approaches player in hallway
|
|
self SetVehGoalPos( hallway_center.origin );
|
|
self SetLookAtEnt( hallway_center );
|
|
|
|
self waittill( "goal" );
|
|
|
|
// UAV 2 goes to door positions
|
|
self SetVehGoalPos( uav2_goal.origin );
|
|
self SetLookAtEnt( uav2_goal );
|
|
|
|
self waittill( "goal" );
|
|
self ClearLookAtEnt();
|
|
|
|
self SetVehGoalPos( end_node.origin );
|
|
|
|
self waittill( "goal" );
|
|
self delete();
|
|
}
|
|
|
|
uav_hall_scan_remove()
|
|
{
|
|
self endon( "death" );
|
|
level endon( "notify_stealth_off" );
|
|
|
|
level._player waittill( "notify_player_through_door" );
|
|
self delete();
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
spawn_uav_searching( tSpawner, tAttack, tSearch )
|
|
{
|
|
uav_spawner = GetEnt( tSpawner, "targetname" );
|
|
Assert( IsDefined( uav_spawner ));
|
|
|
|
uav = uav_spawner maps\_attack_heli::SAV_setup( "searching", tAttack, tSearch, 400, maps\_stealth_utility::miniuav_stealth_default );
|
|
|
|
uav thread spawn_uav_searching_player_spotted();
|
|
uav thread spawn_uav_searching_aggressive_mode();
|
|
uav thread spawn_uav_searching_damage();
|
|
uav.goalradius = 8;
|
|
|
|
return uav;
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
spawn_uav_searching_damage()
|
|
{
|
|
self endon( "death" );
|
|
|
|
self waittill( "damage" );
|
|
flag_set( "flag_stealth_off" );
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
spawn_uav_searching_player_spotted()
|
|
{
|
|
self endon( "death" );
|
|
|
|
self waittill( "player_spotted" );
|
|
flag_set( "flag_stealth_off" );
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
event_stealth_blown()
|
|
{
|
|
level endon( "macguffin_obtained" );
|
|
|
|
//thread event_stealth_blown_player_shoots();
|
|
|
|
while( !flag( "flag_stealth_off" ))
|
|
{
|
|
wait 0.05;
|
|
}
|
|
|
|
// Make sure stealth flag is off so ents attack
|
|
flag_set( "flag_stealth_off" );
|
|
level notify( "notify_stealth_off" );
|
|
|
|
SetDvar( "ui_deadquote", "You broke stealth (placeholder)" );
|
|
maps\_utility::missionFailedWrapper();
|
|
|
|
/*
|
|
foreach( uav in level.enemies[ "search_uavs" ] )
|
|
{
|
|
if( isalive( uav ))
|
|
{
|
|
StopFXonTag( level._effect[ "spotlight_white" ], uav, "tag_origin");
|
|
uav thread maps\_attack_heli::heli_spotlight_off();
|
|
|
|
PlayFXOnTag( level._effect[ "spotlight_red" ], uav, "tag_origin" );
|
|
|
|
uav ClearLookAtEnt();
|
|
level.enemies[ "lab_enter_reinforcements" ] = add_to_array( level.enemies[ "lab_enter_reinforcements" ], uav );
|
|
}
|
|
}
|
|
|
|
foreach( guy in level.enemies[ "melee_enemies" ] )
|
|
{
|
|
if( isalive( guy ))
|
|
{
|
|
level.enemies[ "lab_enter_reinforcements" ] = add_to_array( level.enemies[ "lab_enter_reinforcements" ], guy );
|
|
}
|
|
}
|
|
|
|
people_reinforcements_spawner = GetEntArray( "actor_melee_reinforcements", "script_noteworthy" );
|
|
uav_reinforcements_spawner = GetEntArray( "vehicle_melee_reinforcements", "script_noteworthy" );
|
|
Assert( IsDefined( people_reinforcements_spawner ));
|
|
Assert( IsDefined( uav_reinforcements_spawner ));
|
|
|
|
thread add_dialogue_line( "Baker", "Shit! We've been spotted!", "g" );
|
|
|
|
level.baker.ignoreall = false;
|
|
level.baker.ignoreme = false;
|
|
|
|
level.enemies[ "lab_enter_reinforcements" ] = [];
|
|
|
|
foreach( spawner in people_reinforcements_spawner )
|
|
{
|
|
guy = spawner spawn_ai();
|
|
level.enemies[ "lab_enter_reinforcements" ] = add_to_array( level.enemies[ "lab_enter_reinforcements" ], guy );
|
|
}
|
|
|
|
foreach( spawner in uav_reinforcements_spawner )
|
|
{
|
|
uav = spawner maps\_attack_heli::SAV_setup( "circling", "node_attack_1" );
|
|
PlayFXOnTag( level._effect[ "spotlight_red" ], uav, "tag_origin" );
|
|
level.enemies[ "lab_enter_reinforcements" ] = add_to_array( level.enemies[ "lab_enter_reinforcements" ], uav );
|
|
}
|
|
|
|
while( level.enemies[ "lab_enter_reinforcements" ].size > 0 )
|
|
{
|
|
level.enemies[ "lab_enter_reinforcements" ] = remove_dead_from_array( level.enemies[ "lab_enter_reinforcements" ] );
|
|
wait 0.05;
|
|
}
|
|
level notify( "notify_synced_melee_complete" );
|
|
*/
|
|
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
// Turn off cover
|
|
watcher_cover_off()
|
|
{
|
|
level waittill_any( "notify_stealth_off", "notify_synced_melee_complete" );
|
|
low_cover_off();
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
event_stealth_blown_player_shoots()
|
|
{
|
|
level endon( "notify_synced_melee_complete" );
|
|
level endon( "notify_stealth_off" );
|
|
|
|
while( !level._player ButtonPressed( "BUTTON_RTRIG" ))
|
|
{
|
|
wait 0.05;
|
|
}
|
|
|
|
flag_set( "flag_stealth_off" );
|
|
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
event_synced_melee( baker_guy_name, player_guy_name, tTrigger, melee_flag )
|
|
{
|
|
level endon( "notify_stealth_off" );
|
|
level endon( "notify_synced_melee_complete" );
|
|
|
|
trigger = GetEnt( tTrigger, "targetname" );
|
|
|
|
Assert( IsDefined( trigger ));
|
|
|
|
trigger sethintstring( "Press [{+melee}] to perform melee kill (PLACEHOLDER)" );
|
|
|
|
trigger trigger_off();
|
|
|
|
flag_wait( "flag_baker_melee_in_progress" );
|
|
|
|
trigger trigger_on();
|
|
|
|
// Setup baker to attack the other guy
|
|
level.baker thread event_synced_melee_solo_baker( baker_guy_name, level.enemies[ "melee_enemies" ][ baker_guy_name ], level.enemies[ "melee_enemies" ][ player_guy_name ], "target", "baker", "melee_kill" );
|
|
|
|
// Player melees
|
|
level._player event_synced_melee_solo_player( player_guy_name, melee_flag );
|
|
|
|
trigger trigger_off();
|
|
|
|
// Get Rid of UAVs
|
|
foreach( uav in level.enemies[ "search_uavs" ] )
|
|
{
|
|
if( isalive( uav ))
|
|
{
|
|
uav delete();
|
|
}
|
|
}
|
|
|
|
level.enemies[ "melee_enemies" ] = remove_dead_from_array( level.enemies[ "melee_enemies" ] );
|
|
waittill_dead( level.enemies[ "melee_enemies" ] );
|
|
|
|
// <BM Note: This will end this function (since there are two threaded), so don't put anything after it!>
|
|
level notify( "notify_synced_melee_complete" );
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
event_synced_melee_solo_player( player_guy_name, melee_flag )
|
|
{
|
|
level endon( "notify_player_melee_complete" );
|
|
|
|
// Wait for player to melee guy
|
|
while( 1 )
|
|
{
|
|
if( self MeleeButtonPressed() && flag( melee_flag ))
|
|
break;
|
|
|
|
wait 0.05;
|
|
}
|
|
|
|
origin = GetEnt( "origin_" + player_guy_name, "targetname" );
|
|
Assert( IsDefined( origin ));
|
|
|
|
// Player kills guard (temp until we get actual anims
|
|
origin notify( "stop_loop" );
|
|
level.enemies[ "melee_enemies" ][ player_guy_name ] anim_stopanimscripted();
|
|
level.enemies[ "melee_enemies" ][ player_guy_name ] kill();
|
|
|
|
level notify( "notify_player_melee_complete" );
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
// Melee kill anim event
|
|
event_synced_melee_solo_baker( guy_name, guy, player_guy, guy_animname, baker_animname, scene )
|
|
{
|
|
level endon( "notify_stealth_off" );
|
|
|
|
level waittill_any( "notify_player_melee_complete" , "notify_baker_melee" );
|
|
|
|
if( IsAlive( guy ))
|
|
{
|
|
origin = GetEnt( "origin_" + guy_name, "targetname" );
|
|
// self.animname = baker_animname;
|
|
guy.animname = guy_animname;
|
|
guys = [ self, guy ];
|
|
|
|
origin notify( "stop_loop" );
|
|
guy StopAnimScripted();
|
|
|
|
guy_array[ 0 ] = guy;
|
|
|
|
//origin thread anim_single( guy_array, "melee_react" );
|
|
|
|
//wait 1;
|
|
|
|
level notify( "notify_baker_melee_in_progress" );
|
|
|
|
origin thread anim_single( guys, scene );
|
|
|
|
wait 0.05;
|
|
guy.a.nodeath = true;
|
|
guy.allowdeath = true;
|
|
guy.diequietly = true;
|
|
guy kill();
|
|
}
|
|
else if( IsAlive( player_guy ))
|
|
{
|
|
self.ignoreall = false;
|
|
self.favoriteenemy = player_guy;
|
|
self.baseaccuracy = 1000;
|
|
guys[0] = player_guy;
|
|
waittill_dead( guys );
|
|
self.baseaccuracy = 1;
|
|
self.ignoreall = true;
|
|
}
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
spawn_uav_searching_aggressive_mode()
|
|
{
|
|
self endon( "death" );
|
|
|
|
flag_wait( "flag_stealth_off" );
|
|
self maps\_nx_miniuav::miniuav_player_spotted();
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
spawn_melee_enemy( tSpawn, tOrigin, animname1, anim1 )
|
|
{
|
|
spawner = GetEnt( tSpawn, "targetname" );
|
|
origin = GetEnt( tOrigin, "targetname" );
|
|
spawner add_spawn_function( ::spawnfunc_melee_enemy, origin );
|
|
|
|
Assert( IsDefined( spawner ));
|
|
Assert( IsDefined( origin ));
|
|
|
|
enemy = spawner spawn_ai();
|
|
|
|
Assert( IsDefined( enemy ));
|
|
|
|
enemy.animname = animname1;
|
|
origin thread anim_loop_solo( enemy, anim1 );
|
|
|
|
return enemy;
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
spawn_doinbusiness_enemy( tSpawn, tOrigin, animname1, anim1 )
|
|
{
|
|
spawner = GetEnt( tSpawn, "targetname" );
|
|
origin = GetEnt( tOrigin, "targetname" );
|
|
spawner add_spawn_function( ::spawnfunc_melee_enemy, origin );
|
|
|
|
Assert( IsDefined( spawner ));
|
|
Assert( IsDefined( origin ));
|
|
|
|
enemy = spawner spawn_ai();
|
|
|
|
Assert( IsDefined( enemy ));
|
|
|
|
enemy.animname = animname1;
|
|
origin thread anim_loop_solo( enemy, anim1 );
|
|
|
|
return enemy;
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
spawnfunc_melee_enemy( origin )
|
|
{
|
|
self endon( "death" );
|
|
|
|
self.ignoreall = true;
|
|
self thread spawnfunc_melee_enemy_end_loop_flag( origin );
|
|
self thread spawnfunc_melee_enemy_damage( origin );
|
|
|
|
self.aggressivemode = 1;
|
|
|
|
level waittill( "notify_baker_melee_in_progress" );
|
|
|
|
wait 3;
|
|
|
|
level.enemies[ "melee_enemies" ] = remove_dead_from_array( level.enemies[ "melee_enemies" ] );
|
|
|
|
if( level.enemies[ "melee_enemies" ].size > 0 )
|
|
flag_set( "flag_stealth_off" );
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
spawnfunc_melee_enemy_damage( origin )
|
|
{
|
|
level endon( "notify_synced_melee_complete" );
|
|
|
|
while( 1 )
|
|
{
|
|
self waittill( "damage", dmg, attacker );
|
|
if( attacker == level._player )
|
|
{
|
|
// If during dual melee, kill guy, if not, break stealth
|
|
if( flag( "flag_baker_melee_in_progress" ))
|
|
{
|
|
origin notify( "stop_loop" );
|
|
self anim_stopanimscripted();
|
|
self.ignoreall = false;
|
|
self kill();
|
|
|
|
level notify( "notify_player_melee_complete" );
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
flag_set( "flag_stealth_off" );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Baker kills
|
|
origin notify( "stop_loop" );
|
|
self anim_stopanimscripted();
|
|
self.ignoreall = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
spawnfunc_melee_enemy_end_loop_flag( origin )
|
|
{
|
|
self endon( "death" );
|
|
|
|
flag_wait( "flag_stealth_off" );
|
|
origin notify( "stop_loop" );
|
|
self anim_stopanimscripted();
|
|
self.ignoreall = false;
|
|
}
|