mirror of
https://github.com/reaaLx/nx1-gsc-dump.git
synced 2025-04-22 17:15:48 +00:00
616 lines
16 KiB
Plaintext
616 lines
16 KiB
Plaintext
//****************************************************************************
|
|
// **
|
|
// Confidential - (C) Activision Publishing, Inc. 2010 **
|
|
// **
|
|
//****************************************************************************
|
|
// **
|
|
// Module: Mission Utils **
|
|
// **
|
|
// Created: DATE - CREATOR **
|
|
// **
|
|
//****************************************************************************
|
|
|
|
#include maps\_utility;
|
|
#include common_scripts\utility;
|
|
#include maps\_vehicle;
|
|
#include maps\_anim;
|
|
|
|
|
|
// Move allies to start points
|
|
// Note: all elements are processed in order. (ex. element #0 of the array corresponds to squad member #0)
|
|
// ARGUMENTS:
|
|
// (MANDATORY) "array_of_start_noteworthies" the "script_noteworthy" values for your start points (recommended to use script_origins)
|
|
// (OPTIONAL) "array_of_goal_node_noteworthies" the "script_noteworthy" values for a node to send squadmate to
|
|
moveAlliesToStartPoint( array_of_start_noteworthies, array_of_goal_node_noteworthies )
|
|
{
|
|
if( self.size != array_of_start_noteworthies.size )
|
|
{
|
|
AssertMsg( "Number of allies ( " + self.size + ") does not equal number of start points (" + array_of_start_noteworthies.size + ")" );
|
|
}
|
|
else if( isdefined( array_of_goal_node_noteworthies ))
|
|
{
|
|
if( self.size != array_of_goal_node_noteworthies.size )
|
|
{
|
|
AssertMsg( "Number of allies ( " + self.size + ") does not equal number of goal nodes (" + array_of_start_noteworthies.size + ")" );
|
|
}
|
|
}
|
|
|
|
for( i = 0; i < self.size; i++ )
|
|
{
|
|
start_node = getEnt( array_of_start_noteworthies[i], "script_noteworthy" );
|
|
self[i] ForceTeleport( start_node.origin, start_node.angles );
|
|
|
|
if( isdefined( array_of_goal_node_noteworthies ))
|
|
{
|
|
node = getNode( array_of_goal_node_noteworthies[i], "script_noteworthy" );
|
|
self[i] SetGoalNode( node );
|
|
}
|
|
}
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
// Run an autosave on the notify message "notify_message" sent to self
|
|
autosave_on_notify( notify_message )
|
|
{
|
|
self waittill( notify_message );
|
|
thread autosave_now();
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
// Fade to black at the end of the level
|
|
fade_out_level()
|
|
{
|
|
fadeInTime = 1.0;
|
|
|
|
//setSavedDvar( "compass", 0 );
|
|
//setSavedDvar( "hud_showStance", 0 );
|
|
|
|
overlay = newHudElem();
|
|
overlay.x = 0;
|
|
overlay.y = 0;
|
|
overlay setshader( "black", 640, 480 );
|
|
overlay.alignX = "left";
|
|
overlay.alignY = "top";
|
|
overlay.horzAlign = "fullscreen";
|
|
overlay.vertAlign = "fullscreen";
|
|
|
|
overlay.alpha = 0;
|
|
overlay fadeOverTime( fadeInTime );
|
|
overlay.alpha = 1;
|
|
|
|
wait fadeInTime;
|
|
|
|
level._player freezeControls( true );
|
|
enablePlayerWeapons( false );
|
|
}
|
|
|
|
|
|
boundary_breach_kill_triggers()
|
|
{
|
|
// Wait for player to break boundary
|
|
flag_wait( "boundary_breach" );
|
|
|
|
// While in the smoke
|
|
while ( flag( "boundary_breach" ) )
|
|
{
|
|
// level._player display_hint( "hint_parachute_smoke" );
|
|
|
|
level._player PlayRumbleOnEntity( "grenade_rumble" );
|
|
level._player StunPlayer( 1.5 );
|
|
|
|
if ( level._player.health <= 65 )
|
|
{
|
|
SetDvar( "ui_deadquote", "The UGVs have these areas covered." );
|
|
maps\_utility::missionFailedWrapper();
|
|
}
|
|
else
|
|
{
|
|
level._player.health = level._player.health - 35;
|
|
}
|
|
|
|
wait 0.5;
|
|
}
|
|
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
// Turns on threat detect tech
|
|
set_threat_detect_on( type )
|
|
{
|
|
if( !isdefined( type ))
|
|
{
|
|
type = "auto";
|
|
}
|
|
|
|
foreach( guy in self )
|
|
{
|
|
if( isalive( guy ))
|
|
{
|
|
guy SetThreatIDOverlay( type );
|
|
}
|
|
}
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
// Detects player intervention against AIs through nearly all means
|
|
set_flag_on_player_action( flag_str, flash, grenade )
|
|
{
|
|
level notify( "kill_action_flag" );
|
|
level endon( "kill_action_flag" );
|
|
level endon( flag_str );
|
|
|
|
if ( flag( flag_str ) )
|
|
return;
|
|
|
|
while ( true )
|
|
{
|
|
msg = level._player waittill_any_return( "weapon_fired", "fraggrenade", "flash_grenade" );
|
|
if ( !isdefined( msg ) )
|
|
break;
|
|
if ( msg == "weapon_fired" )
|
|
break;
|
|
if ( msg == "fraggrenade" && isdefined( grenade ) )
|
|
break;
|
|
if ( msg == "flash_grenade" && isdefined( flash ) )
|
|
break;
|
|
}
|
|
|
|
flag_set( flag_str );
|
|
}
|
|
|
|
//*******************************************************************
|
|
// Secret Service and VP scripting *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
ss_vignette_move( target_node, vp, ss, pain )
|
|
{
|
|
vp endon( "death" );
|
|
vp notify( "stop_vignette" );
|
|
vp endon( "stop_vignette" );
|
|
|
|
actors = [];
|
|
actors[ "vp_price" ] = vp;
|
|
actors[ "ss_williams" ] = ss;
|
|
|
|
if ( !pain )
|
|
{
|
|
vp disable_pain();
|
|
ss disable_pain();
|
|
}
|
|
|
|
current_node = vp.current_vignette_node;
|
|
if ( isdefined( vp.current_vignette_node ) )
|
|
{
|
|
vp.current_vignette_node anim_single( actors, "vp_arrival_out" );
|
|
vp.current_vignette_node = undefined;
|
|
}
|
|
|
|
target_node anim_reach_together( actors, "vp_arrival_in" );
|
|
target_node anim_single( actors, "vp_arrival_in" );
|
|
vp.current_vignette_node = target_node;
|
|
|
|
vp thread ss_vignette_idle( target_node, actors );
|
|
}
|
|
|
|
ss_vignette_idle( target_node, guys )
|
|
{
|
|
self endon( "stop_vignette" );
|
|
while ( 1 )
|
|
{
|
|
target_node anim_single( guys, "vp_arrival_idle" );
|
|
}
|
|
}
|
|
|
|
ss_vignette_end( vp, ss )
|
|
{
|
|
vp endon( "death" );
|
|
vp notify( "stop_vignette" );
|
|
|
|
if ( isdefined( vp.current_vignette_node ) )
|
|
{
|
|
actors = [];
|
|
actors[ "vp_price" ] = vp;
|
|
actors[ "ss_williams" ] = ss;
|
|
vp.current_vignette_node anim_single( actors, "vp_arrival_out" );
|
|
vp.current_vignette_node = undefined;
|
|
}
|
|
|
|
level notify( "vp_vignette_finished" );
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
// Turns off threat detect tech
|
|
set_threat_detect_off()
|
|
{
|
|
foreach( guy in self )
|
|
{
|
|
if( isalive( guy ))
|
|
{
|
|
guy SetThreatIDOverlay( "off" );
|
|
}
|
|
}
|
|
}
|
|
|
|
SetThreatBiasGroup_array( groupname )
|
|
{
|
|
foreach( guy in self)
|
|
{
|
|
guy SetThreatBiasGroup( groupname);
|
|
}
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
// Sets "ignoreme" variable for all actors in an array
|
|
ignore_me_on()
|
|
{
|
|
foreach( guy in self)
|
|
{
|
|
if( isalive( guy ))
|
|
{
|
|
guy.ignoreme = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Clears "ignoreme" variable for all actors in an array
|
|
ignore_me_off()
|
|
{
|
|
foreach( guy in self)
|
|
{
|
|
if( isalive( guy ))
|
|
{
|
|
guy.ignoreme = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Sets "ignoreall" variable for all actors in an array
|
|
ignore_all_on()
|
|
{
|
|
foreach( guy in self)
|
|
{
|
|
if( isalive( guy ))
|
|
{
|
|
guy.ignoreall = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Clears "ignoreall" variable for all actors in an array
|
|
ignore_all_off()
|
|
{
|
|
foreach( guy in self)
|
|
{
|
|
if( isalive( guy ))
|
|
{
|
|
guy.ignoreall = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
cqb_handling( a_guys, setting )
|
|
{
|
|
if ( setting == "on" )
|
|
{
|
|
foreach( guy in a_guys )
|
|
{
|
|
guy enable_cqbwalk();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
foreach( guy in a_guys )
|
|
{
|
|
guy disable_cqbwalk();
|
|
}
|
|
}
|
|
}
|
|
|
|
//*******************************************************************
|
|
// RUMBLES and SHAKES *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
missile_hit_rumble()
|
|
{
|
|
level._player PlayRumbleOnEntity( "artillery_rumble" );
|
|
level thread screenshake( .2, 5, 1, 4 );
|
|
|
|
wait 1.5;
|
|
level._player thread blend_movespeedscale( 0.1, 1.5 );
|
|
|
|
loops = int( 0.75 * 20 );
|
|
up_target_angle = -8;
|
|
for ( i = 0; i < loops; i++ )
|
|
{
|
|
player_angles = level._player getplayerangles();
|
|
up_angle = player_angles[0];
|
|
|
|
angle_step = ( up_target_angle - up_angle ) / ( loops - (i) );
|
|
angle_step = cap_value( angle_step, -1.5, 1.5 );
|
|
|
|
level._player setplayerangles( player_angles + ( angle_step, 0, 0 ) );
|
|
wait 0.05;
|
|
}
|
|
|
|
level._player thread blend_movespeedscale( 1, 1 );
|
|
}
|
|
|
|
RUMBLE_FRAMES_PER_SEC = 10;
|
|
screenshake( scale, duration, fade_in, fade_out)
|
|
{
|
|
if ( !isdefined( fade_in ) )
|
|
fade_in = 0;
|
|
if ( !isdefined( fade_out ) )
|
|
fade_out = 0;
|
|
|
|
assert( ( fade_in + fade_out ) <= duration );
|
|
|
|
frame_count = duration * RUMBLE_FRAMES_PER_SEC;
|
|
fade_in_frame_count = fade_in * RUMBLE_FRAMES_PER_SEC;
|
|
if ( fade_in_frame_count > 0 )
|
|
fade_in_scale_step = scale / fade_in_frame_count;
|
|
else
|
|
fade_in_scale_step = scale;
|
|
|
|
fade_out_frame_count = fade_out * RUMBLE_FRAMES_PER_SEC;
|
|
fade_out_start_frame = frame_count - fade_out_frame_count;
|
|
if ( fade_out_frame_count > 0 )
|
|
fade_out_scale_step = scale / fade_out_frame_count;
|
|
else
|
|
fade_out_scale_step = scale;
|
|
|
|
delay = 1/RUMBLE_FRAMES_PER_SEC;
|
|
scale = 0;
|
|
for ( i = 0; i < frame_count; i++ )
|
|
{
|
|
if ( i <= fade_in_frame_count )
|
|
scale += fade_in_scale_step;
|
|
|
|
if ( i > fade_out_start_frame )
|
|
scale -= fade_out_scale_step;
|
|
|
|
earthquake( scale, delay, level._player.origin, 500 );
|
|
wait delay;
|
|
}
|
|
}
|
|
|
|
//*******************************************************************
|
|
// DOORS *
|
|
// via Justin's testmap utilities (possibly make these global) *
|
|
//*******************************************************************
|
|
|
|
|
|
// Makes a movable door object out of any prefab that has a script_origin
|
|
make_door_from_prefab( sTargetname, openangles, closeangles )
|
|
{
|
|
// Get all the entities inside sTargetname prefab object
|
|
ents = getentarray( sTargetname, "targetname" );
|
|
door_org = undefined; // Door origin, the hinge
|
|
door_models = [];
|
|
door_brushes = [];
|
|
foreach( ent in ents )
|
|
{
|
|
// If the entity is a brushmodel
|
|
if ( ent.code_classname == "script_brushmodel" )
|
|
{
|
|
door_brushes[ door_brushes.size ] = ent; // Add it to the list of brushes
|
|
continue;
|
|
}
|
|
// If the entity is a script_origin
|
|
if ( ent.code_classname == "script_origin" )
|
|
{
|
|
door_org = ent; // Save it as the hinge
|
|
continue;
|
|
}
|
|
// If the entity is a script_model
|
|
if ( ent.code_classname == "script_model" )
|
|
{
|
|
door_models[ door_models.size ] = ent; // Add it to the list of models
|
|
continue;
|
|
}
|
|
}
|
|
|
|
// Link everything to the origin so it moves (rotates) together as one object
|
|
foreach( model in door_models )
|
|
model linkto( door_org );
|
|
foreach( brush in door_brushes )
|
|
brush linkto( door_org );
|
|
|
|
door = door_org;
|
|
//door.brushes = door_brushes; // Not used
|
|
|
|
door.openangles = openangles;
|
|
door.closeangles = closeangles;
|
|
|
|
return door;
|
|
}
|
|
|
|
// Open a door opject that was made with make_door_from_prefab()
|
|
door_open( bFast )
|
|
{
|
|
// Wait untill current move command is finished before starting a new one
|
|
if ( isdefined( self.moving ) )
|
|
{
|
|
while( isdefined( self.moving ) )
|
|
wait( 0.05 );
|
|
}
|
|
|
|
self.moving = true;
|
|
angles = 90;
|
|
if ( isdefined( self.openangles ) )
|
|
angles = self.openangles;
|
|
|
|
iTime = 4;
|
|
if ( isdefined( bFast ) ) // Open swiftly
|
|
{
|
|
iTime = 1.5;
|
|
// self thread play_sound_on_entity( "nx_scn_training_fence_open_fast" );
|
|
self rotateto( self.angles + ( 0, angles, 0 ), 1.5, .25, .25 );
|
|
}
|
|
else
|
|
{
|
|
// self thread play_sound_on_entity( "nx_scn_training_fence_open" );
|
|
self rotateto( self.angles + ( 0, angles, 0 ), 4, 1.5, 1.5 );
|
|
}
|
|
|
|
//self thread play_sound_on_entity( "scn_training_fence_open" );
|
|
//array_call( self.brushes,::notsolid );
|
|
wait( iTime ); // Wait for the door to open
|
|
self.moving = undefined; // No longer moving
|
|
}
|
|
|
|
|
|
// Close a door object that was made with make_door_from_prefab()
|
|
door_close( bFast )
|
|
{
|
|
if ( isdefined( self.moving ) )
|
|
{
|
|
while( isdefined( self.moving ) )
|
|
wait( 0.05 );
|
|
}
|
|
|
|
self.moving = true;
|
|
angles = -90;
|
|
if ( isdefined( self.closeangles ) )
|
|
angles = self.closeangles;
|
|
|
|
iTime = 2;
|
|
if ( isdefined( bFast ) ) // Open swiftly
|
|
{
|
|
iTime = 1;
|
|
self rotateto( self.angles + ( 0, angles, 0 ), 1, .25, .25 );
|
|
}
|
|
else
|
|
{
|
|
self rotateto( self.angles + ( 0, angles, 0 ), 2, .5, .5 );
|
|
}
|
|
|
|
//self thread play_sound_on_entity( "scn_training_fence_close" );
|
|
//array_call( self.brushes,::solid );
|
|
|
|
wait( iTime ); // Wait for the door to open
|
|
self.moving = undefined; // No longer moving
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// VTOL Jazz *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
vtol_setup( vtol_name, vtol_noteworthy, vtol_enter_targetname, vtol_exit_targetname )
|
|
{
|
|
if( !IsDefined( level.vtols ) )
|
|
level.vtols = [];
|
|
|
|
level.vtols[ vtol_name ] = [];
|
|
level.vtols[ vtol_name ][ "spawner" ] = GetEnt( vtol_noteworthy, "script_noteworthy" );
|
|
level.vtols[ vtol_name ][ "enter" ] = GetEnt( vtol_enter_targetname, "targetname" );
|
|
level.vtols[ vtol_name ][ "exit" ] = GetEnt( vtol_exit_targetname, "targetname" );
|
|
}
|
|
|
|
vtol_spawn( vtol_name )
|
|
{
|
|
vtol = level.vtols[ vtol_name ][ "spawner" ] spawn_vehicle();
|
|
vtol.vtol_enter_path = level.vtols[ vtol_name ][ "enter" ];
|
|
vtol.vtol_exit_path = level.vtols[ vtol_name ][ "exit" ];
|
|
return vtol;
|
|
}
|
|
|
|
vtol_enter( do_unload )
|
|
{
|
|
if( !IsDefined( self.vtol_enter_path ) )
|
|
return;
|
|
|
|
self.currentnode = self.vtol_enter_path;
|
|
self Vehicle_Teleport( self.currentnode.origin, self.currentnode.angles );
|
|
self thread vehicle_resumepath();
|
|
self GoPath();
|
|
self waittill( "reached_dynamic_path_end" );
|
|
|
|
if( !IsDefined( do_unload ) )
|
|
do_unload = true;
|
|
|
|
if( do_unload )
|
|
{
|
|
self vehicle_unload();
|
|
self playsound("nx_npc_fastrope");
|
|
}
|
|
}
|
|
|
|
vtol_exit()
|
|
{
|
|
if( !IsDefined( self.vtol_exit_path ) )
|
|
return;
|
|
|
|
self vehicle_detachfrompath();
|
|
|
|
self.currentnode = self.vtol_exit_path;
|
|
self thread vehicle_resumepath();
|
|
self GoPath();
|
|
self waittill( "reached_dynamic_path_end" );
|
|
self Delete();
|
|
}
|
|
|
|
vtol_move( do_unload, exit_delay )
|
|
{
|
|
if( !IsDefined( exit_delay ) )
|
|
exit_delay = 15.0;
|
|
|
|
if( !IsDefined( do_unload ) )
|
|
do_unload = true;
|
|
|
|
self vtol_enter( do_unload );
|
|
wait exit_delay;
|
|
self notify ( "exiting" );
|
|
self vtol_exit();
|
|
}
|
|
|
|
|
|
// Turns a group of triggers off
|
|
all_triggers_off( trigger_name )
|
|
{
|
|
triggers = GetEntArray( trigger_name, "script_noteworthy" );
|
|
foreach( trigger in triggers )
|
|
{
|
|
trigger trigger_off();
|
|
}
|
|
}
|
|
|
|
// Turns a group of triggers on
|
|
all_triggers_on( trigger_name )
|
|
{
|
|
triggers = GetEntArray( trigger_name, "script_noteworthy" );
|
|
foreach( trigger in triggers )
|
|
{
|
|
trigger trigger_on();
|
|
}
|
|
}
|
|
|