nx1-gsc-dump/maps/nx_harbor_util.gsc

570 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;
TRAIN_FLOOR_BOTTOM = 0;
TRAIN_FLOOR_TOP = 1;
TRAIN_FRONT = 2;
TRAIN_BACK = 3;
TRAIN_BLACKHAWK_LOOKAT = 4;
//*******************************************************************
// Anim *
// *
//*******************************************************************
anim_create_paths()
{
// Bottom floor
anim_create_path( "anim_window_back_left", "anim_window_mid_left", "bottom_window_right" );
anim_create_path( "anim_window_back_left", "anim_window_back_right", "bottom_window_cross_left" );
anim_create_path( "anim_window_back_right", "anim_window_mid_right", "bottom_window_left" );
anim_create_path( "anim_window_back_right", "anim_window_back_left", "bottom_window_cross_left" );
anim_create_path( "anim_window_front_left", "anim_window_mid_left", "bottom_window_left" );
anim_create_path( "anim_window_front_left", "anim_window_front_right", "bottom_window_cross_left" );
anim_create_path( "anim_window_front_right", "anim_window_mid_right", "bottom_window_right" );
anim_create_path( "anim_window_front_right", "anim_window_front_left", "bottom_window_cross_left" );
anim_create_path( "anim_window_mid_left", "anim_window_mid_right", "bottom_window_cross_left" );
anim_create_path( "anim_window_mid_left", "anim_window_back_left", "bottom_window_left" );
anim_create_path( "anim_window_mid_left", "anim_window_front_left", "bottom_window_right" );
anim_create_path( "anim_window_mid_right", "anim_window_mid_left", "bottom_window_cross_left" );
anim_create_path( "anim_window_mid_right", "anim_window_back_right", "bottom_window_right" );
anim_create_path( "anim_window_mid_right", "anim_window_front_right", "bottom_window_left" );
// Top floor
anim_create_path( "anim_window_back_left_top", "anim_window_mid_left_top", "bottom_window_right" );
anim_create_path( "anim_window_back_left_top", "anim_window_back_right_top", "bottom_window_cross_left" );
anim_create_path( "anim_window_back_right_top", "anim_window_mid_right_top", "bottom_window_left" );
anim_create_path( "anim_window_back_right_top", "anim_window_back_left_top", "bottom_window_cross_left" );
anim_create_path( "anim_window_front_left_top", "anim_window_mid_left_top", "bottom_window_left" );
anim_create_path( "anim_window_front_left_top", "anim_window_front_right_top", "bottom_window_cross_left" );
anim_create_path( "anim_window_front_right_top", "anim_window_mid_right_top", "bottom_window_right" );
anim_create_path( "anim_window_front_right_top", "anim_window_front_left_top", "bottom_window_cross_left" );
anim_create_path( "anim_window_mid_left_top", "anim_window_mid_right_top", "bottom_window_cross_left" );
anim_create_path( "anim_window_mid_left_top", "anim_window_back_left_top", "bottom_window_left" );
anim_create_path( "anim_window_mid_left_top", "anim_window_front_left_top", "bottom_window_right" );
anim_create_path( "anim_window_mid_right_top", "anim_window_mid_left_top", "bottom_window_cross_left" );
anim_create_path( "anim_window_mid_right_top", "anim_window_back_right_top", "bottom_window_right" );
anim_create_path( "anim_window_mid_right_top", "anim_window_front_right_top", "bottom_window_left" );
}
anim_create_path( from_node_name, to_node_name, anim_scene )
{
from_node = GetEnt( from_node_name, "targetname" );
to_node = GetEnt( to_node_name, "targetname" );
if( !IsDefined( level.anim_paths ) )
level.anim_paths = [];
if( !IsDefined( from_node.connections ) )
from_node.connections = [];
from_node.connections[ to_node_name ] = anim_scene;
from_node.occupied = false;
to_node.occupied = false;
level.anim_paths[ from_node_name ] = from_node;
}
//*******************************************************************
// Ally *
// *
//*******************************************************************
ally_setup( ally_name, targetname, node_name )
{
if( !IsDefined( level.squad ) )
level.squad = [];
ally = GetEnt( targetname, "targetname" );
ally ally_set_node( node_name );
ally LinkTo( level.platform );
ally thread ally_update();
ally.animname = "ally";
ally magic_bullet_shield();
level.squad[ ally_name ] = ally;
}
ally_set_node( node_name )
{
node = level.anim_paths[ node_name ];
self Teleport( node.origin, node.angles );
self ally_occupy_node( node_name, true );
}
ally_occupy_node( node_name, occupied )
{
level.anim_paths[ node_name ].occupied = occupied;
if( occupied )
{
node = level.anim_paths[ node_name ];
self.current_anim_node = node;
if( IsDefined( node.script_stance ) )
{
self AllowedStances( node.script_stance );
}
}
else
self.current_anim_node = undefined;
}
ally_attack( target )
{
self thread ally_attack_target( target );
}
ally_attack_target( target )
{
self SetEntityTarget( target, 1.0 );
target waittill( "death" );
self ClearEntityTarget();
}
ally_update()
{
self endon( "death" );
while( 1 )
{
ally_update_position();
wait 0.05;
}
}
ally_update_position()
{
if( !IsDefined( self.current_anim_node ) )
return;
if( !IsDefined( self.shootent) )
return;
current_node = self.current_anim_node;
target = self.shootent;
connections = current_node.connections;
valid_nodes = [];
foreach( node_name, connection in connections )
{
node = GetEnt( node_name, "targetname" );
if( !node.occupied && Distance( node.origin, level._player.origin ) > 256 )
valid_nodes[ valid_nodes.size ] = node;
}
valid_nodes[ valid_nodes.size ] = current_node;
valid_nodes = get_array_of_closest( target.origin, valid_nodes );
dest_node = valid_nodes[ 0 ];
if( dest_node == current_node )
return;
anim_scene = connections[ dest_node.targetname ];
self ally_occupy_node( current_node.targetname, false );
dest_node Unlink();
dest_node.angles = VectorToAngles( current_node.origin - dest_node.origin );
dest_node LinkTo( level.platform );
dest_node anim_single_solo( self, anim_scene );
self ally_occupy_node( dest_node.targetname, true );
wait RandomFloatRange( 2.0, 3.0 );
}
draw_node_angles()
{
while( 1 )
{
r = 30;
Line( self.origin, self.origin + ( 0, 0, r ), (1,0,0),1, false, 1);
Line( self.origin, self.origin + ( cos (self.angles[1])*r, sin(self.angles[1])*r, 0 ), (0,0.7,1),1, false, 1);
wait 0.05;
}
}
//*******************************************************************
// Player *
// *
//*******************************************************************
player_setup()
{
level._player GiveWeapon( "xm108_asco" );
level._player SwitchToWeapon( "xm108_asco" );
}
on_player_floor_switch( action )
{
}
//*******************************************************************
// Train *
// *
//*******************************************************************
train_setup( train )
{
train_glass_setup( "nx_prototype_harbor_window01", "nx_prototype_harbor_window02" );
train_glass_setup( "nx_prototype_harbor_floor01", "nx_prototype_harbor_floor02" );
train_glass_setup( "nx_prototype_harbor_glass_botb01", "nx_prototype_harbor_glass_botb02" );
train_glass_setup( "nx_prototype_harbor_glass_botf01", "nx_prototype_harbor_glass_botf02" );
train_glass_setup( "nx_prototype_harbor_glass_topb01", "nx_prototype_harbor_glass_topb02" );
train_glass_setup( "nx_prototype_harbor_glass_topfc01", "nx_prototype_harbor_glass_topfc02" );
train_glass_setup( "nx_prototype_harbor_glass_tops01", "nx_prototype_harbor_glass_tops02" );
foreach( glass in GetEntArray( "train_glass", "script_noteworthy" ) )
{
glass thread train_glass_update();
}
}
train_glass_setup( normal_model_name, destroyed_model_name )
{
if( !IsDefined( level.train_glass ) )
level.train_glass = [];
level.train_glass[ normal_model_name ] = destroyed_model_name;
}
train_glass_update()
{
self endon( "delete" );
self SetCanDamage( true );
self.health = 450;
while( 1 )
{
self waittill( "damage" );
if( self.health <= 0 )
{
// Play FX / SFX
playFX( level._effect[ "train_glass_break" ], self.origin );
self SetModel( level.train_glass[ self.model ] );
break;
}
}
}
train_get_object( index )
{
return level.platform.script_objects[ index ];
}
train_get_speed()
{
return level.platform maps\_nx_moving_platform::get_speed();
}
train_set_speed( speed_mph )
{
level.platform maps\_nx_moving_platform::set_speed( speed_mph );
}
link_to_train( platform )
{
self maps\_nx_moving_platform::link_to_platform( platform );
}
train_delete()
{
foreach( ally in level.squad )
{
ally Unlink();
ally stop_magic_bullet_shield();
ally delete();
}
level.platform maps\_nx_moving_platform::platform_delete();
}
//*******************************************************************
// Chopper *
// *
//*******************************************************************
chopper_attack( attack, target )
{
self endon( "death" );
self endon( "delete" );
switch( attack )
{
case "gun":
self thread maps\_helicopter_globals::shootEnemyTarget_Bullets( target );
break;
case "missile":
self thread chopper_missiles( target );
break;
default:
break;
}
}
chopper_end_missiles()
{
self notify( "missile_end" );
}
chopper_missiles( target )
{
self endon( "death" );
self endon( "delete" );
self endon( "missile_end" );
while( 1 )
{
shots = randomintrange( 2, 4 );
delay = 0.5;
self thread maps\_helicopter_globals::fire_missile( "ffar_hind", shots, target, delay );
wait( shots * delay );
}
}
//*******************************************************************
// Vehicle *
// *
//*******************************************************************
vehicle_create( targetname, thread_func )
{
if( !IsDefined( level.vehicles ) )
level.vehicle = [];
vehicle = vehicle_spawn( GetEnt( targetname, "targetname" ) );
vehicle GoPath();
vehicle vehicle_update();
level.vehicle[ targetname ] = vehicle;
if( IsDefined( thread_func ) )
vehicle thread [[thread_func]]();
return vehicle;
}
vehicle_update()
{
self thread vehicle_update_health();
self thread vehicle_on_death();
}
vehicle_on_death()
{
}
vehicle_update_collision()
{
self endon( "death" );
self endon( "delete" );
while( 1 )
{
enemy_vehicles = GetEntArray( "enemy_car", "script_noteworthy" );
foreach( vehicle in enemy_vehicles )
{
if( Distance( self.origin, vehicle.origin ) <= 512 && !IsSpawner( vehicle ))
{
// mph = vehicle Vehicle_GetSpeed() * 3.0;
// velocity = ( mph * cos( vehicle.angles[ 1 ] ), mph * sin( vehicle.angles[ 1 ] ), 0 );
//// self VehPhys_Launch( velocity, 1.0, vehicle.origin );
wait RandomFloatRange( 3.0, 5.0 );
// self Kill();
}
}
wait 0.05;
}
}
vehicle_kill_on_rider_death( index )
{
self endon( "death" );
self endon( "delete" );
self.riders[ index ] waittill( "death" );
wait RandomFloatRange( 0.5, 0.75 );
self vehicle_crash( RandomFloatRange( 1.5, 2.0 ) );
}
vehicle_crash( delay_death )
{
self VehPhys_Crash( 1 );
if( IsDefined( delay_death ) )
wait delay_death;
self Kill();
}
vehicle_update_health()
{
self endon( "death" );
self endon( "delete" );
while( 1 )
{
self waittill ( "damage", amount, attacker, direction_vec, point, type );
if( IsAI( attacker ) )
self.health += amount;
}
}
vehicle_follow( target, min_speed, max_speed, look_at )
{
self endon( "death" );
self endon( "reached_dynamic_path_end" );
self endon( "reached_end_node" );
self endon( "end_follow" );
if( self isHelicopter() && IsDefined( look_at ) )
{
self SetLookAtEnt( look_at );
}
interval = 0.05;
while( 1 )
{
if( !within_fov( target.origin, target.angles, self.origin, cos( 90 ) ) )
{
if( self Vehicle_GetSpeed() <= max_speed )
self Vehicle_SetSpeed( self Vehicle_GetSpeed() + 1.0, 15 );
}
else if( self Vehicle_GetSpeed() > min_speed )
self Vehicle_SetSpeed( self Vehicle_GetSpeed() - 1.0, 10 );
wait interval;
}
}
vehicle_end_follow()
{
self notify( "end_follow" );
}
vehicle_jump_to_path( path_value, path_key )
{
node = undefined;
if( self IsHelicopter() )
node = GetEnt( path_value, path_key );
else
node = GetVehicleNode( path_value, path_key );
self Vehicle_Teleport( node.origin, node.angles );
self thread vehicle_detachfrompath();
self.currentnode = node;
self thread vehicle_resumepath();
}
//*******************************************************************
// *
// *
//*******************************************************************
lane_logic( lane_array_name, base_speed, base_time, delete_radius, endon_flag, headlights_on )
{
self endon( endon_flag );
COUNT_CAP = 50;
lane_array = GetEntArray( lane_array_name, "targetname" );
// Spawn the vehicle, unload and breach
for( ; ; )
{
// Random spawner
random_index = RandomInt( lane_array.size );
vehicle_spawner = lane_array[ random_index ];
if( GetNumVehicles() < COUNT_CAP )
{
// Spawn vehicle
vehicle = vehicle_spawn( vehicle_spawner );
vehicle GoPath();
vehicle thread vehicle_update_collision();
vehicle.health = 1000;
if( IsDefined( headlights_on ) && headlights_on )
vehicle lights_on( "all" );
// Speed
vehicle thread ambient_vehicle_thread( base_speed, delete_radius );
}
wait( RandomFloatRange( base_time, ( base_time + 0.5 ) ) );
}
}
ambient_vehicle_thread( base_speed, delete_radius )
{
self endon( "death" );
self endon( "reached_end_node" );
self thread ambient_vehicle_end_path();
self Vehicle_SetSpeed( 200, 100000 );
// Slow down if in player range
while( true )
{
dist = Distance2D( self.origin, level._player.origin );
if( dist < delete_radius )
{
break;
}
wait( 0.05 );
}
self Vehicle_SetSpeed( RandomIntRange( base_speed, ( base_speed + 5 ) ), 200, 100000 );
// Delete if left player range
while( true )
{
dist = Distance2D( self.origin, level._player.origin );
if( dist > delete_radius )
{
break;
}
wait( 0.05 );
}
self delete();
}
ambient_vehicle_end_path()
{
self endon( "death" );
self waittill( "reached_end_node" );
self delete();
}
//*******************************************************************
// *
// *
//*******************************************************************