nx1-gsc-dump/maps/nx_hithard_b_util.gsc

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();
}
}