2889 lines
65 KiB
Plaintext
2889 lines
65 KiB
Plaintext
|
#include maps\_utility;
|
||
|
#include maps\_vehicle;
|
||
|
#include maps\_vehicle_spline;
|
||
|
#include maps\_anim;
|
||
|
#include maps\_hud_util;
|
||
|
#include common_scripts\utility;
|
||
|
|
||
|
|
||
|
|
||
|
become_soap()
|
||
|
{
|
||
|
AssertEx( !isdefined( level.soap ), "Too much soap!" );
|
||
|
level.soap = self;
|
||
|
self.animname = "soap";
|
||
|
//self thread magic_bullet_shield();
|
||
|
self make_hero();
|
||
|
}
|
||
|
|
||
|
|
||
|
become_price()
|
||
|
{
|
||
|
level.price = self;
|
||
|
self.health = 5000;
|
||
|
self.animname = "price";
|
||
|
self magic_bullet_shield();
|
||
|
self make_hero();
|
||
|
|
||
|
self.attackeraccuracy = 0;
|
||
|
self.IgnoreRandomBulletDamage = true;
|
||
|
//self forceUseWeapon( "ak47", "primary" );
|
||
|
self gun_remove();
|
||
|
//self Attach( "gulag_price_ak47", "tag_weapon_chest" );
|
||
|
|
||
|
/*
|
||
|
self waittill_any_timeout( 5, "death" );
|
||
|
|
||
|
if ( !isalive( self ) )
|
||
|
{
|
||
|
// the pow was killed
|
||
|
SetDvar( "ui_deadquote", "@GULAG_PRICE_KILLED" );
|
||
|
//maps\_utility::missionFailedWrapper();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
*/
|
||
|
self notify( "saved" );
|
||
|
|
||
|
self waittill( "change_to_regular_weapon" );
|
||
|
//self detach( "gulag_price_ak47", "tag_weapon_chest" );
|
||
|
self forceUseWeapon( "ak47", "primary" );
|
||
|
//self magic_bullet_shield();
|
||
|
}
|
||
|
|
||
|
become_redshirt()
|
||
|
{
|
||
|
self.animname = "redshirt";
|
||
|
level.redshirt = self;
|
||
|
self magic_bullet_shield();
|
||
|
self make_hero();
|
||
|
}
|
||
|
|
||
|
moderate_ai_moveplaybackrate()
|
||
|
{
|
||
|
level endon( "cafeteria_sequence_begins" );
|
||
|
ai = getaiarray( "allies" );
|
||
|
|
||
|
min_playback = 1.00;
|
||
|
min_dist = 50;
|
||
|
max_playback = 1.00;
|
||
|
max_dist = 200;
|
||
|
|
||
|
// how much can the player sprint?
|
||
|
min_sprint = 1;
|
||
|
max_sprint = 1.5;
|
||
|
min_sprint_dist = 100;
|
||
|
max_sprint_dist = 200;
|
||
|
|
||
|
range_dist = max_dist - min_dist;
|
||
|
range_playback = max_playback - min_playback;
|
||
|
range_sprint = max_sprint - min_sprint;
|
||
|
range_sprint_dist = max_sprint_dist - min_sprint_dist;
|
||
|
|
||
|
if ( flag( "match_up_for_final_room" ) )
|
||
|
return;
|
||
|
|
||
|
level endon( "match_up_for_final_room" );
|
||
|
|
||
|
|
||
|
max_speed_dif = 0.45; // the maximum difference in speed adjustment between the lead and last ai
|
||
|
max_dist_dif = 200; // the distance at which to differ by max speed dif
|
||
|
|
||
|
// the distance mods make the AI get a speed boost/slowdown to get them to the right place
|
||
|
distance_mods = [];
|
||
|
distance_mods[ "soap" ] = 20;
|
||
|
distance_mods[ "redshirt" ] = -40;
|
||
|
distance_mods[ "price" ] = -10;
|
||
|
|
||
|
for ( ;; )
|
||
|
{
|
||
|
ai = [];
|
||
|
ai[ "soap" ] = level.soap;
|
||
|
ai[ "price" ] = level.price;
|
||
|
ai[ "redshirt" ] = level.redshirt;
|
||
|
|
||
|
if ( flag( "exit_collapses" ) )
|
||
|
{
|
||
|
distance_mods[ "soap" ] = 75;
|
||
|
distance_mods[ "redshirt" ] = -25;
|
||
|
distance_mods[ "price" ] = -40;
|
||
|
}
|
||
|
|
||
|
center = (0,0,0);
|
||
|
ai_dist = [];
|
||
|
foreach ( index, guy in ai )
|
||
|
{
|
||
|
center += guy.origin;
|
||
|
|
||
|
// for adjusting the speed of the individual AI
|
||
|
dist = distance( guy.origin, level.friendly_endpoint );
|
||
|
ai_dist[ index ] = dist + distance_mods[ index ];
|
||
|
}
|
||
|
center /= ai.size;
|
||
|
|
||
|
// ==========================================================================================
|
||
|
// for adjusting the speed of the individual AI
|
||
|
// ==========================================================================================
|
||
|
lowest = 99999999;
|
||
|
foreach ( dist in ai_dist )
|
||
|
{
|
||
|
if ( dist < lowest )
|
||
|
lowest = dist;
|
||
|
}
|
||
|
|
||
|
ai_speedmod = [];
|
||
|
foreach ( index, dist in ai_dist )
|
||
|
{
|
||
|
ai_dist[ index ] -= lowest;
|
||
|
}
|
||
|
|
||
|
highest = 0;
|
||
|
foreach ( dist in ai_dist )
|
||
|
{
|
||
|
if ( dist > highest )
|
||
|
highest = dist;
|
||
|
}
|
||
|
|
||
|
// 0.4
|
||
|
// 200 ourdist
|
||
|
|
||
|
current_speed_dif = highest * max_speed_dif / max_dist_dif;
|
||
|
|
||
|
current_speed_dif *= 0.5; // lower the speed dif a bit
|
||
|
|
||
|
//current_speed_dif *= 0.5; // you actually want it to be half cause we adjust it by the range from -1 to 1
|
||
|
|
||
|
if ( current_speed_dif > max_speed_dif )
|
||
|
current_speed_dif = max_speed_dif;
|
||
|
|
||
|
// 0 of 200
|
||
|
// - half the range =
|
||
|
// -100
|
||
|
//
|
||
|
half_range = highest * 0.5;
|
||
|
|
||
|
ai_speedmod = [];
|
||
|
foreach ( index, dist in ai_dist )
|
||
|
{
|
||
|
dist -= half_range;
|
||
|
dist /= abs( half_range );
|
||
|
ai_speedmod[ index ] = dist * current_speed_dif;
|
||
|
}
|
||
|
|
||
|
|
||
|
// ==========================================================================================
|
||
|
|
||
|
|
||
|
dist1 = distance( center, level.friendly_endpoint );
|
||
|
dist2 = distance( level.player.origin, level.friendly_endpoint );
|
||
|
dist = dist2 - dist1;
|
||
|
|
||
|
level notify( "player_dist_from_squad", dist );
|
||
|
// if ( dist > 1000 )
|
||
|
// thread player_dies_to_cavein( 2 );
|
||
|
|
||
|
old_dist = dist;
|
||
|
|
||
|
|
||
|
dist -= min_dist;
|
||
|
scale = dist / range_dist;
|
||
|
|
||
|
if ( scale < 0 )
|
||
|
scale = 0;
|
||
|
else
|
||
|
if ( scale > 1 )
|
||
|
scale = 1;
|
||
|
scale = 1 - scale;
|
||
|
ai_playback = min_playback + range_playback * scale;
|
||
|
|
||
|
|
||
|
//println( "dist " + old_dist + " ai_playback " + ai_playback );
|
||
|
|
||
|
|
||
|
dist = old_dist - min_sprint_dist;
|
||
|
scale = dist / range_sprint_dist;
|
||
|
|
||
|
if ( scale < 0 )
|
||
|
scale = 0;
|
||
|
else
|
||
|
if ( scale > 1 )
|
||
|
scale = 1;
|
||
|
|
||
|
sprint_speed = min_sprint + range_sprint * scale;
|
||
|
|
||
|
if ( !flag( "exit_collapses" ) )
|
||
|
setsaveddvar( "player_sprintSpeedScale", sprint_speed );
|
||
|
|
||
|
|
||
|
if ( flag( "modify_ai_moveplaybackrate" ) )
|
||
|
{
|
||
|
foreach ( index, guy in ai )
|
||
|
{
|
||
|
guy.moveplaybackrate = ai_playback + ai_speedmod[ index ];
|
||
|
if ( guy.moveplaybackrate > 1.15 )
|
||
|
guy.moveplaybackrate = 1.15;
|
||
|
|
||
|
//Print3d( guy.origin + (0,0,64), ai_speedmod[ index ], (1,1,0), 1, 1, 1 );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
foreach ( guy in ai )
|
||
|
{
|
||
|
guy.moveplaybackrate = ai_playback;
|
||
|
}
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
foreach ( guy in ai )
|
||
|
{
|
||
|
if ( guy == level.price && flag( "price_speed_boost" ) )
|
||
|
guy.moveplaybackrate += 0.15;
|
||
|
}
|
||
|
*/
|
||
|
|
||
|
wait( 0.05 );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//println( "dist " + int( dist ) + " playback " + int ( ai_playback * 100 ) );
|
||
|
|
||
|
// myrange
|
||
|
//range_dist range_playback
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
adjust_be_behind( guy )
|
||
|
{
|
||
|
desired_dist = level.cafe_run_distances[ self.animname ][ guy.animname ];
|
||
|
dist = distance( self.origin, guy.origin );
|
||
|
|
||
|
speed_change = undefined;
|
||
|
|
||
|
dot = get_dot( self.origin, self.angles, guy.origin );
|
||
|
if ( dot < 0.8 )
|
||
|
{
|
||
|
// he should be in front of me, slow down
|
||
|
speed_change = -0.15;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
|
||
|
dist_dif = desired_dist - dist;
|
||
|
dist_offset = 50;
|
||
|
speed_offset = 0.15;
|
||
|
|
||
|
/*
|
||
|
dist_dif
|
||
|
dist_offset speed_offset
|
||
|
35
|
||
|
50 0.15
|
||
|
*/
|
||
|
|
||
|
speed_change = dist_dif * speed_offset / dist_offset;
|
||
|
if ( speed_change > speed_offset )
|
||
|
{
|
||
|
speed_change = speed_offset;
|
||
|
}
|
||
|
else
|
||
|
if ( speed_change < speed_offset * -1 )
|
||
|
{
|
||
|
speed_change = speed_offset * -1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
self.moveplaybackrate = 1 + speed_change;
|
||
|
num1 = self.moveplaybackrate;
|
||
|
num2 = speed_change;
|
||
|
|
||
|
num1 = int( num1 * 100 ) * 0.01;
|
||
|
num2 = int( num2 * 100 ) * 0.01;
|
||
|
|
||
|
Print3d( self geteye(), num1 + " (" + num2 + ")", (1,1,1), 1, 0.7 );
|
||
|
}
|
||
|
|
||
|
adjust_be_ahead_of( guy )
|
||
|
{
|
||
|
desired_dist = level.cafe_run_distances[ self.animname ][ guy.animname ];
|
||
|
dist = distance( self.origin, guy.origin );
|
||
|
|
||
|
dot = get_dot( self.origin, self.angles, guy.origin );
|
||
|
if ( dot > 0 )
|
||
|
{
|
||
|
// if he's ahead of us then we're negative distance relative to where we want to be
|
||
|
dist *= -1;
|
||
|
}
|
||
|
|
||
|
dist_dif = desired_dist - dist;
|
||
|
dist_offset = 50;
|
||
|
speed_offset = 0.15;
|
||
|
|
||
|
/*
|
||
|
dist_dif
|
||
|
dist_offset speed_offset
|
||
|
35
|
||
|
50 0.15
|
||
|
*/
|
||
|
|
||
|
speed_change = dist_dif * speed_offset / dist_offset;
|
||
|
if ( speed_change > speed_offset )
|
||
|
{
|
||
|
speed_change = speed_offset;
|
||
|
}
|
||
|
else
|
||
|
if ( speed_change < speed_offset * -1 )
|
||
|
{
|
||
|
speed_change = speed_offset * -1;
|
||
|
}
|
||
|
|
||
|
self.moveplaybackrate = 1 + speed_change;
|
||
|
num1 = self.moveplaybackrate;
|
||
|
num2 = speed_change;
|
||
|
|
||
|
num1 = int( num1 * 100 ) * 0.01;
|
||
|
num2 = int( num2 * 100 ) * 0.01;
|
||
|
|
||
|
Print3d( self geteye(), num1 + " (" + num2 + ")", (1,1,1), 1, 1 );
|
||
|
}
|
||
|
|
||
|
my_color_trail( color )
|
||
|
{
|
||
|
self endon( "death" );
|
||
|
org = self.origin;
|
||
|
for ( ;; )
|
||
|
{
|
||
|
Line( self.origin, org, color, 1, 1, 50 );
|
||
|
org = self.origin;
|
||
|
wait( 0.05 );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
minor_earthquakes()
|
||
|
{
|
||
|
level endon( "stop_minor_earthquakes" );
|
||
|
|
||
|
min_eq = 0.15;
|
||
|
max_eq = 0.25;
|
||
|
|
||
|
dif_eq = max_eq - min_eq;
|
||
|
|
||
|
min_phys = 0.20;
|
||
|
max_phys = 0.30;
|
||
|
|
||
|
dif_phys = max_phys - min_phys;
|
||
|
first = true;
|
||
|
|
||
|
for ( ;; )
|
||
|
{
|
||
|
scale = randomfloat( 1 );
|
||
|
if ( first )
|
||
|
{
|
||
|
first = false;
|
||
|
scale = 1;
|
||
|
}
|
||
|
eq = min_eq + scale * dif_eq;
|
||
|
phys = min_phys + scale * dif_phys;
|
||
|
|
||
|
|
||
|
if ( randomint( 100 ) < 35 )
|
||
|
player_gets_hit_by_rock();
|
||
|
|
||
|
quake( eq, 3 + scale * 2, level.player.origin + randomvector( 1000 ), 5000 );
|
||
|
angles = level.player getplayerangles();
|
||
|
forward = anglestoforward( angles );
|
||
|
org = level.player.origin + forward * 180;
|
||
|
org = set_z( org, level.player.origin[2] + 64 );
|
||
|
//PhysicsJitter( org, 350, 250, 0.05, 0.2 );
|
||
|
vec = randomvector( phys );
|
||
|
if ( vec[2] < 0 )
|
||
|
{
|
||
|
vec = set_z( vec, vec[2] * -1 );
|
||
|
}
|
||
|
PhysicsJolt( org, 350, 250, vec );
|
||
|
//PhysicsExplosionSphere( org, 350, 250, 0.5 );
|
||
|
// Print3d( org, ".", (1,0,0), 1, 1, 5 );
|
||
|
|
||
|
wait( RandomFloatRange( 1, 5 ) );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
gulag_player_loadout()
|
||
|
{
|
||
|
level.player takeallweapons();
|
||
|
//level.player GiveWeapon( "m14_scoped" );
|
||
|
level.player GiveWeapon( "m4m203_reflex_arctic" );
|
||
|
//level.player GiveWeapon( "fraggrenade" );
|
||
|
//level.player GiveWeapon( "flash_grenade" );
|
||
|
//level.player SetOffhandSecondaryClass( "flash" );
|
||
|
level.player SetViewModel( "viewhands_udt" );
|
||
|
level.player SwitchToWeapon( "m4m203_reflex_arctic" );
|
||
|
//level.player GiveWeapon( "claymore" );
|
||
|
//level.player SetActionSlot( 4, "weapon", "claymore" );
|
||
|
//level.player GiveMaxAmmo( "claymore" );
|
||
|
|
||
|
level.player SwitchToWeapon( "m14_scoped_arctic" );
|
||
|
|
||
|
}
|
||
|
|
||
|
stumble_trigger_think()
|
||
|
{
|
||
|
level endon( "skip_stumble_trigger_think" );
|
||
|
wait( 3 ); // for start points
|
||
|
// the roller does the actual rotation
|
||
|
eq_view_roller = getent( "eq_view_roller", "targetname" );
|
||
|
|
||
|
player_ent = spawn_tag_origin();
|
||
|
|
||
|
// move the roller to the ent that the player refers to for ground
|
||
|
eq_view_roller.origin = player_ent.origin;
|
||
|
player_ent linkto( eq_view_roller );
|
||
|
|
||
|
level.player PlayerSetGroundReferenceEnt( player_ent );
|
||
|
ent = spawn_tag_origin();
|
||
|
|
||
|
if ( !flag( "exit_collapses" ) )
|
||
|
{
|
||
|
self waittill( "trigger", other );
|
||
|
thread ceiling_collapse_begins();
|
||
|
|
||
|
ducks = [];
|
||
|
ducks[ ducks.size ] = "run_duck";
|
||
|
ducks[ ducks.size ] = "run_flinch";
|
||
|
ducks[ ducks.size ] = "run_stumble";
|
||
|
|
||
|
ai = getaiarray( "allies" );
|
||
|
assertex( ai.size == 3, "Huh, wasnt 3!" );
|
||
|
|
||
|
foreach ( index, guy in ai )
|
||
|
{
|
||
|
guy thread stumble_anim( ducks[ index ] );
|
||
|
}
|
||
|
|
||
|
quake( 0.25, 4, self.origin, 5000 );
|
||
|
|
||
|
vec = randomvector( 0.6 );
|
||
|
jolt_origin = level.player.origin;
|
||
|
PhysicsJolt( jolt_origin, 350, 250, vec );
|
||
|
|
||
|
/*
|
||
|
angles = level.player getplayerangles();
|
||
|
angles = ( 0, angles[ 1 ], 0 );
|
||
|
ent.angles = angles;
|
||
|
*/
|
||
|
start_angles = eq_view_roller.angles;
|
||
|
|
||
|
// spawn a reference ent to do the rotation on, because this rotation is at server framerate
|
||
|
ent.angles = eq_view_roller.angles;
|
||
|
ent addpitch( 30 );
|
||
|
ent addroll( 5 );
|
||
|
|
||
|
eq_view_roller RotateTo( ent.angles, 1, 0.5, 0.5 );
|
||
|
wait( 1 );
|
||
|
|
||
|
ent addpitch( -35 );
|
||
|
ent addroll( -15 );
|
||
|
eq_view_roller RotateTo( ent.angles, 1, 0.5, 0.5 );
|
||
|
wait( 1 );
|
||
|
|
||
|
eq_view_roller RotateTo( start_angles, 1, 0.5, 0.5 );
|
||
|
|
||
|
|
||
|
flag_wait( "exit_collapses" );
|
||
|
flag_set( "controlled_player_rumble" );
|
||
|
level.player PlayRumbleOnEntity( "heavy_3s" );
|
||
|
delaythread( 3.0, ::flag_clear, "controlled_player_rumble" );
|
||
|
|
||
|
thread stumble_baddie();
|
||
|
}
|
||
|
|
||
|
if ( !flag( "big_earthquake_hits" ) )
|
||
|
{
|
||
|
|
||
|
flag_wait( "big_earthquake_hits" ); // this is actually the second big earthquake
|
||
|
trigger = getentwithflag( "big_earthquake_hits" );
|
||
|
eq_view_roller = getent( trigger.target, "targetname" );
|
||
|
jolt_origin = eq_view_roller.origin;
|
||
|
start_angles = eq_view_roller.angles;
|
||
|
|
||
|
// move the roller to the ent that the player refers to for ground
|
||
|
eq_view_roller.origin = player_ent.origin;
|
||
|
|
||
|
player_ent linkto( eq_view_roller );
|
||
|
|
||
|
quake( 0.25, 4, self.origin, 5000 );
|
||
|
|
||
|
vec = randomvector( 0.6 );
|
||
|
PhysicsJolt( jolt_origin, 350, 250, vec );
|
||
|
}
|
||
|
|
||
|
flag_wait( "player_falls_down" ); // during cafeteria ending
|
||
|
|
||
|
quake( 0.35, 4, self.origin, 5000 );
|
||
|
vec = randomvector( 0.6 );
|
||
|
jolt_origin = level.player.origin;
|
||
|
PhysicsJolt( jolt_origin, 350, 250, vec );
|
||
|
|
||
|
flag_set( "controlled_player_rumble" );
|
||
|
|
||
|
level.player PlayRumbleOnEntity( "light_3s" );
|
||
|
level.player delaycall( 1.5, ::PlayRumbleOnEntity, "heavy_2s" );
|
||
|
delaythread( 3.5, ::flag_clear, "controlled_player_rumble" );
|
||
|
|
||
|
start_angles = eq_view_roller.angles;
|
||
|
|
||
|
// move the roller to the ent that the player refers to for ground
|
||
|
eq_view_roller.origin = player_ent.origin;
|
||
|
|
||
|
// angle the ents with the player so its relative to the player's current view
|
||
|
player_angles = level.player getplayerAngles();
|
||
|
eq_view_roller.angles = ( 0, player_angles[ 1 ], 0 );
|
||
|
ent.angles = eq_view_roller.angles;
|
||
|
|
||
|
player_ent linkto( eq_view_roller );
|
||
|
|
||
|
forward = anglestoforward( eq_view_roller.angles );
|
||
|
right = anglestoright( eq_view_roller.angles );
|
||
|
above_player = level.player.origin + (0,0,100 ) + forward * 50;
|
||
|
|
||
|
level.player enabledeathshield( true );
|
||
|
level.player setmovespeedscale( 0.25 );
|
||
|
level.player DoDamage( ( level.player.health - 5 ) / level.player.damageMultiplier, above_player );
|
||
|
level.player thread player_blur_manager();
|
||
|
level.player disableweapons();
|
||
|
|
||
|
time_until_buried = 1.9;
|
||
|
// set up the mix track we're going to blend to
|
||
|
thread maps\_ambient::use_eq_settings( "gulag_cavein", level.eq_mix_track );
|
||
|
|
||
|
level.player SetEqLerp( 1, level.eq_main_track );
|
||
|
// blend out the ambient and blend in to the mix track
|
||
|
noself_delaycall( time_until_buried, ::AmbientStop, 2 );
|
||
|
delaythread( time_until_buried, maps\_ambient::blend_to_eq_track, level.eq_mix_track, 2 );
|
||
|
|
||
|
/*
|
||
|
|
||
|
for ( i = 0; i < 3; i++ )
|
||
|
{
|
||
|
ent addyaw( 250 );
|
||
|
ent addpitch( 18 );
|
||
|
ent addroll( 18 );
|
||
|
|
||
|
// player gets knocked sideways
|
||
|
timer = 0.5;
|
||
|
eq_view_roller RotateTo( ent.angles, timer, 0, 0 );
|
||
|
wait( timer );
|
||
|
}
|
||
|
*/
|
||
|
|
||
|
// Line( fx_org, fx_org + (0,0,-32), (1,0,0), 1, 0, 500 );
|
||
|
// Line( fx_org, level.player.origin, (1,0,1), 1, 0, 500 );
|
||
|
|
||
|
|
||
|
|
||
|
/*
|
||
|
level.player delaycall( 0.05, ::setstance, "prone" );
|
||
|
level.player delaycall( 0.5, ::allowcrouch, false );
|
||
|
level.player delaycall( 0.5, ::allowstand, false );
|
||
|
level.player delaycall( 0.5, ::ShellShock, "gulag_attack", 5, false );
|
||
|
*/
|
||
|
|
||
|
|
||
|
|
||
|
ent addyaw( 20 );
|
||
|
ent addpitch( 35 );
|
||
|
ent addroll( 25 );
|
||
|
// player gets knocked sideways
|
||
|
timer = 0.2;
|
||
|
eq_view_roller RotateTo( ent.angles, timer, timer * 0.5, timer * 0.5 );
|
||
|
wait( timer );
|
||
|
|
||
|
thread fx_fall_around_player( eq_view_roller.angles );
|
||
|
// Line( fx_org, fx_org + (0,0,-32), (1,0,0), 1, 0, 500 );
|
||
|
// Line( fx_org, level.player.origin, (1,0,1), 1, 0, 500 );
|
||
|
|
||
|
wait( 0.75 );
|
||
|
|
||
|
|
||
|
// player wobbles left
|
||
|
timer = 0.5;
|
||
|
// ent addyaw( 20 );
|
||
|
ent addpitch( -35 );
|
||
|
ent addroll( -25 );
|
||
|
eq_view_roller RotateTo( ent.angles, timer, timer * 0.5, timer * 0.5 );
|
||
|
wait( timer );
|
||
|
|
||
|
timer = 0.5;
|
||
|
// ent addyaw( 20 );
|
||
|
ent addpitch( 5 );
|
||
|
ent addroll( -15 );
|
||
|
eq_view_roller RotateTo( ent.angles, timer, 0, timer );
|
||
|
wait( timer );
|
||
|
timer = 0.55;
|
||
|
ent addpitch( 15 );
|
||
|
ent addroll( -60 );
|
||
|
eq_view_roller RotateTo( ent.angles, timer, 0, 0 );
|
||
|
|
||
|
level.player setstance( "prone" );
|
||
|
wait( 0.65 );
|
||
|
|
||
|
|
||
|
black_overlay = create_client_overlay( "black", 0, level.player );
|
||
|
black_overlay.alpha = 1;
|
||
|
|
||
|
// level.player Shellshock( "nosound", 1, false );
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/*
|
||
|
level.player delaycall( 0.05, ::setstance, "prone" );
|
||
|
level.player delaycall( 0.05, ::allowcrouch, false );
|
||
|
level.player delaycall( 0.05, ::allowstand, false );
|
||
|
level.player delaycall( 0.05, ::ShellShock, "gulag_attack", 5, false );
|
||
|
*/
|
||
|
|
||
|
level.player allowcrouch( true );
|
||
|
level.player allowstand( true );
|
||
|
flag_clear( "player_falls_down" ); // during cafeteria ending
|
||
|
wait( 1 );
|
||
|
black_overlay destroy();
|
||
|
|
||
|
|
||
|
// timer = 0.3;
|
||
|
// eq_view_roller RotateTo( start_angles, timer, timer * 0.5, timer * 0.5 );
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
player_blur_manager()
|
||
|
{
|
||
|
level endon( "time_to_evac" );
|
||
|
level.player ent_flag_set( "player_no_auto_blur" );
|
||
|
level.player SetBlurForPlayer( 12, 0.05 );
|
||
|
clear_time = 0.8;
|
||
|
clear_blur = 0.4;
|
||
|
very_blur = 7;
|
||
|
blur_time = 1;
|
||
|
|
||
|
for ( ;; )
|
||
|
{
|
||
|
level.player SetBlurForPlayer( clear_blur, clear_time );
|
||
|
wait( clear_time );
|
||
|
level.player SetBlurForPlayer( very_blur, blur_time );
|
||
|
wait( blur_time );
|
||
|
very_blur *= 1.5;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
fx_fall_around_player( angles )
|
||
|
{
|
||
|
forward = anglestoforward( angles );
|
||
|
right = anglestoright( angles );
|
||
|
above_player = level.player.origin + (0,0,100 ) + forward * 50;
|
||
|
|
||
|
|
||
|
|
||
|
fx_org = level.player.origin + forward * 35 + right * -10 + ( 0, 0, 32 );
|
||
|
/*
|
||
|
fx = getfx( "0_ceiling_rock_explosion" );
|
||
|
// thread player_ending_cavein();
|
||
|
//thread player_dies_to_cavein( 2 );
|
||
|
noself_delaycall( 0.05, ::PlayFX, fx, fx_org );
|
||
|
noself_delaycall( 0.05, ::PlayFX, fx, fx_org );
|
||
|
noself_delaycall( 0.05, ::PlayFX, fx, fx_org );
|
||
|
noself_delaycall( 0.05, ::PlayFX, fx, fx_org );
|
||
|
*/
|
||
|
|
||
|
// fx = getfx( "0_ceiling_rock" );
|
||
|
fx = getfx( "hallway_collapsing_huge" );
|
||
|
for ( i = 0; i < 10; i++ )
|
||
|
{
|
||
|
fx_org = level.player.origin + forward * 35 + right * -10 + ( 0, 0, 180 );
|
||
|
noself_delaycall( 0.05, ::PlayFX, fx, fx_org );
|
||
|
wait( randomfloatrange( 0.1, 0.25 ) );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
fx = [];
|
||
|
fx[ fx.size ] = "0_ceiling_collapse";
|
||
|
fx[ fx.size ] = "0_ceiling_collapse_big";
|
||
|
fx[ fx.size ] = "0_ceiling_collapse_huge";
|
||
|
fx[ fx.size ] = "0_ceiling_collapse_huge";
|
||
|
|
||
|
index = start_index;
|
||
|
if ( !isdefined( index ) )
|
||
|
index = 0;
|
||
|
|
||
|
counts = [];
|
||
|
counts[ 0 ] = 12;
|
||
|
counts[ 1 ] = 15;
|
||
|
counts[ 2 ] = 10;
|
||
|
counts[ 3 ] = 20;
|
||
|
|
||
|
thread black_death();
|
||
|
|
||
|
last_org = level.player.origin;
|
||
|
for ( ;; )
|
||
|
{
|
||
|
for ( i = 0; i < counts[ index ]; i++ )
|
||
|
{
|
||
|
angles = level.player getplayerangles();
|
||
|
forward = anglestoforward( angles );
|
||
|
vec = level.player.origin - last_org;
|
||
|
|
||
|
|
||
|
org = level.player.origin + forward * 100 + vec * 10;
|
||
|
org = set_z( org, level.player.origin[2] );
|
||
|
|
||
|
trace = BulletTrace( org, org + (0,0,3000), false, undefined );
|
||
|
current_fx = getfx( fx[ index ] );
|
||
|
PlayFX( current_fx, trace[ "position" ] );
|
||
|
last_org = level.player.origin;
|
||
|
|
||
|
if ( randomint( 100 ) > 40 )
|
||
|
{
|
||
|
if ( index == 1 )
|
||
|
level.player DoDamage( 5, randomvector( 500 ) );
|
||
|
if ( index > 1 )
|
||
|
level.player DoDamage( 15, randomvector( 500 ) );
|
||
|
}
|
||
|
wait( 0.05 );
|
||
|
}
|
||
|
|
||
|
if ( index == 2 )
|
||
|
{
|
||
|
level.player kill();
|
||
|
}
|
||
|
|
||
|
index++;
|
||
|
if ( index >= fx.size )
|
||
|
break;
|
||
|
}
|
||
|
*/
|
||
|
|
||
|
|
||
|
/*
|
||
|
|
||
|
ent.angles = eq_view_roller.angles;
|
||
|
ent addpitch( 10 );
|
||
|
ent addroll( 12 );
|
||
|
|
||
|
timer = 0.3;
|
||
|
eq_view_roller RotateTo( ent.angles, timer, timer * 0.5, timer * 0.5 );
|
||
|
wait( timer );
|
||
|
|
||
|
ent addpitch( -15 );
|
||
|
ent addroll( -18 );
|
||
|
|
||
|
|
||
|
timer = 0.4;
|
||
|
eq_view_roller RotateTo( ent.angles, timer, timer * 0.5, timer * 0.5 );
|
||
|
wait( timer );
|
||
|
|
||
|
timer = 0.3;
|
||
|
eq_view_roller RotateTo( start_angles, timer, timer * 0.5, timer * 0.5 );
|
||
|
|
||
|
*/
|
||
|
|
||
|
|
||
|
/*
|
||
|
eq_view_roller RotateRoll( -10, 1, 0.5, 0.5 );
|
||
|
wait( 1 );
|
||
|
eq_view_roller RotateRoll( 20, 1, 0.5, 0.5 );
|
||
|
wait( 1 );
|
||
|
eq_view_roller RotateRoll( -10, 1, 0.5, 0.5 );
|
||
|
*/
|
||
|
|
||
|
|
||
|
|
||
|
/*
|
||
|
|
||
|
// each guy that hits the trigger does a unique stumble
|
||
|
doing_anim = [];
|
||
|
|
||
|
ducks = [];
|
||
|
ducks[ ducks.size ] = "run_duck";
|
||
|
ducks[ ducks.size ] = "run_flinch";
|
||
|
ducks[ ducks.size ] = "run_stumble";
|
||
|
|
||
|
index = 0;
|
||
|
ent = spawnstruct();
|
||
|
ent.eq = false;
|
||
|
|
||
|
for ( ;; )
|
||
|
{
|
||
|
self waittill( "trigger", guy );
|
||
|
if ( !isalive( guy ) )
|
||
|
return;
|
||
|
if ( isdefined( doing_anim[ guy.unique_id ] ) )
|
||
|
continue;
|
||
|
|
||
|
doing_anim[ guy.unique_id ] = true;
|
||
|
animation = ducks[ index ];
|
||
|
index++;
|
||
|
if ( index >= ducks.size )
|
||
|
index = 0;
|
||
|
|
||
|
guy thread guy_ducks( animation, ent );
|
||
|
}
|
||
|
*/
|
||
|
|
||
|
|
||
|
stumble_anim( animation )
|
||
|
{
|
||
|
animation = getgenericanim( animation );
|
||
|
self.run_overrideanim = animation;
|
||
|
self SetFlaggedAnimKnob( "stumble_run", animation, 1, 0.2, 1, true );
|
||
|
wait( 1.5 );
|
||
|
|
||
|
run_root = getgenericanim( "run_root" );
|
||
|
old_time = 0;
|
||
|
for ( ;; )
|
||
|
{
|
||
|
if ( self getAnimTime( run_root ) < old_time )
|
||
|
break;
|
||
|
old_time = self getAnimTime( run_root );
|
||
|
|
||
|
wait( 0.05 );
|
||
|
}
|
||
|
self.run_overrideanim = undefined;
|
||
|
self notify( "movemode" );
|
||
|
}
|
||
|
|
||
|
turnaround_trigger_think()
|
||
|
{
|
||
|
// each guy that hits the trigger does a unique stumble
|
||
|
doing_anim = [];
|
||
|
|
||
|
ducks = [];
|
||
|
ducks[ ducks.size ] = "reaction_180";
|
||
|
ducks[ ducks.size ] = "reaction_180";
|
||
|
ducks[ ducks.size ] = "run_180";
|
||
|
|
||
|
index = 0;
|
||
|
eq = false;
|
||
|
|
||
|
for ( ;; )
|
||
|
{
|
||
|
self waittill( "trigger", guy );
|
||
|
if ( !isalive( guy ) )
|
||
|
return;
|
||
|
if ( isdefined( doing_anim[ guy.unique_id ] ) )
|
||
|
continue;
|
||
|
|
||
|
doing_anim[ guy.unique_id ] = true;
|
||
|
animation = ducks[ index ];
|
||
|
index++;
|
||
|
if ( index >= ducks.size )
|
||
|
index = 0;
|
||
|
|
||
|
guy thread guy_animates( animation );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
guy_animates( animation )
|
||
|
{
|
||
|
orgs = getentarray( "friendly_changedirection_org", "targetname" );
|
||
|
orgs = array_index_by_parameters( orgs );
|
||
|
self thread maps\_spawner::go_to_node( orgs[ self.animname ], "struct" );
|
||
|
self anim_generic( self, animation );
|
||
|
}
|
||
|
|
||
|
eq_happens()
|
||
|
{
|
||
|
wait( 0.3 );
|
||
|
quake( 0.25, 4, self.origin, 5000 );
|
||
|
}
|
||
|
|
||
|
guy_ducks( animation, ent )
|
||
|
{
|
||
|
self endon( "death" );
|
||
|
|
||
|
run_root = getgenericanim( "run_root" );
|
||
|
|
||
|
old_time = self getAnimTime( run_root );
|
||
|
for ( ;; )
|
||
|
{
|
||
|
if ( self getAnimTime( run_root ) < old_time )
|
||
|
break;
|
||
|
old_time = self getAnimTime( run_root );
|
||
|
|
||
|
wait( 0.05 );
|
||
|
}
|
||
|
|
||
|
if ( isdefined( ent ) && !ent.eq )
|
||
|
{
|
||
|
ent.eq = true;
|
||
|
quake( 0.25, 4, self.origin, 5000 );
|
||
|
}
|
||
|
|
||
|
|
||
|
self.run_overrideanim = getgenericanim( animation );
|
||
|
|
||
|
old_time = self getAnimTime( run_root );
|
||
|
for ( ;; )
|
||
|
{
|
||
|
if ( self getAnimTime( run_root ) < old_time )
|
||
|
break;
|
||
|
old_time = self getAnimTime( run_root );
|
||
|
|
||
|
wait( 0.05 );
|
||
|
}
|
||
|
|
||
|
self.run_overrideanim = undefined;
|
||
|
self notify( "movemode" );
|
||
|
// runAnim = animscripts\run::GetRunAnim();
|
||
|
// self setFlaggedAnimKnobLimited( "runanim", runAnim, 1, 0.1, 1, true );
|
||
|
}
|
||
|
|
||
|
hallway_flicker_light()
|
||
|
{
|
||
|
off = "com_floodlight";
|
||
|
on = "com_floodlight_on";
|
||
|
|
||
|
model = self;
|
||
|
light = getent( model.target, "targetname" );
|
||
|
intensity = light getLightIntensity();
|
||
|
|
||
|
/*
|
||
|
for ( ;; )
|
||
|
{
|
||
|
off_count = randomint( 3 ) + 1;
|
||
|
for ( p = 0; p < off_count; p++ )
|
||
|
{
|
||
|
count = randomint( 4 ) + 2;
|
||
|
for ( i = 0; i < count; i++ )
|
||
|
{
|
||
|
light setLightIntensity( 0 );
|
||
|
model setmodel( off );
|
||
|
wait( 0.05 );
|
||
|
light setLightIntensity( intensity );
|
||
|
model setmodel( on );
|
||
|
wait( 0.05 );
|
||
|
}
|
||
|
light setLightIntensity( 0 );
|
||
|
model setmodel( off );
|
||
|
wait( randomfloatrange( 0.2, 0.3 ) );
|
||
|
}
|
||
|
|
||
|
count = randomint( 4 ) + 2;
|
||
|
for ( i = 0; i < count; i++ )
|
||
|
{
|
||
|
light setLightIntensity( 0 );
|
||
|
model setmodel( off );
|
||
|
wait( 0.05 );
|
||
|
light setLightIntensity( intensity );
|
||
|
model setmodel( on );
|
||
|
wait( 0.05 );
|
||
|
}
|
||
|
|
||
|
light setLightIntensity( intensity );
|
||
|
model setmodel( on );
|
||
|
wait( randomfloatrange( 0.35, 0.45 ) );
|
||
|
if ( flag( "exit_collapses" ) )
|
||
|
break;
|
||
|
}
|
||
|
*/
|
||
|
|
||
|
for ( ;; )
|
||
|
{
|
||
|
count = randomint( 3 ) + 2;
|
||
|
for ( i = 0; i < count; i++ )
|
||
|
{
|
||
|
light setLightIntensity( 0 );
|
||
|
model setmodel( off );
|
||
|
wait( randomfloatrange( 0.05, 0.1 ) );
|
||
|
light setLightIntensity( intensity );
|
||
|
model setmodel( on );
|
||
|
wait( 0.05 );
|
||
|
}
|
||
|
|
||
|
light setLightIntensity( intensity );
|
||
|
model setmodel( on );
|
||
|
wait( randomfloatrange( 1.2, 2 ) );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
ending_window_littlebird()
|
||
|
{
|
||
|
self godon();
|
||
|
hover = 50;
|
||
|
self SetYawSpeed( 140, 80, 80 ); //, 60, overshoot percent );
|
||
|
self SetHoverParams( 5, 5, hover );
|
||
|
}
|
||
|
|
||
|
ptest()
|
||
|
{
|
||
|
for ( ;; )
|
||
|
{
|
||
|
angles = level.player getplayerangles();
|
||
|
forward = anglestoforward( angles );
|
||
|
org = level.player.origin + forward * 180;
|
||
|
org = set_z( org, level.player.origin[2] + 64 );
|
||
|
//PhysicsJitter( org, 350, 250, 0.05, 0.2 );
|
||
|
vec = randomvector( 0.3 );
|
||
|
PhysicsJolt( org, 350, 250, vec );
|
||
|
//PhysicsExplosionSphere( org, 350, 250, 0.5 );
|
||
|
Print3d( org, ".", (1,0,0), 1, 1, 5 );
|
||
|
wait( 0.5 );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
first_hallway_collapse( pos )
|
||
|
{
|
||
|
// 11.6
|
||
|
wait( 10.3 );
|
||
|
if ( distance( level.player.origin, pos ) > 700 )
|
||
|
exploder( "first_hallway_collapse" );
|
||
|
}
|
||
|
|
||
|
stumble_baddie()
|
||
|
{
|
||
|
spawner = getent( "stumble_baddie_spawner", "targetname" );
|
||
|
|
||
|
// don't do it if the player is looking this way
|
||
|
if ( within_fov_of_players( spawner.origin, 0.7 ) )
|
||
|
return;
|
||
|
|
||
|
if ( distance( spawner.origin, level.player.origin ) < 500 )
|
||
|
return;
|
||
|
|
||
|
thread first_hallway_collapse( spawner.origin );
|
||
|
guy = spawner stalingradspawn();
|
||
|
guy.animname = "stumble_baddie";
|
||
|
|
||
|
ent = getstruct( guy.target, "targetname" );
|
||
|
guy gun_remove();
|
||
|
guy.allowDeath = true;
|
||
|
guy endon( "death" );
|
||
|
guy.health = 1;
|
||
|
guy.ignoreme = true;
|
||
|
guy.diequietly = true;
|
||
|
setsaveddvar( "ragdoll_explode_force", 0 );
|
||
|
ent anim_first_frame_solo( guy, "stumble" );
|
||
|
wait( 8.4 );
|
||
|
ent anim_single_solo( guy, "stumble" );
|
||
|
guy kill();
|
||
|
}
|
||
|
|
||
|
trash_sound_think()
|
||
|
{
|
||
|
self waittill( "trigger" );
|
||
|
self play_sound_in_space( "scn_gulag_exp_trashcan_debris", self.org );
|
||
|
}
|
||
|
|
||
|
file_cabinet_show()
|
||
|
{
|
||
|
models = getentarray( "file_cabinet_anim", "targetname" );
|
||
|
array_thread( models, ::path_anim_setup );
|
||
|
|
||
|
models = array_index_by_parameters( models );
|
||
|
flag_wait( "enter_final_room" );
|
||
|
//flag_wait( "reach_mound" );
|
||
|
wait( 3 );
|
||
|
|
||
|
models[ "1" ] path_anim( 0.2 );
|
||
|
wait( 0.1 );
|
||
|
models[ "1" ] path_anim( 0.1 );
|
||
|
models[ "2" ] path_anim( 0.1 );
|
||
|
wait( 0.1 );
|
||
|
models[ "1" ] path_anim( 0.3 );
|
||
|
models[ "2" ] path_anim( 0.3 );
|
||
|
models[ "3" ] path_anim( 0.3 );
|
||
|
}
|
||
|
|
||
|
path_anim_setup()
|
||
|
{
|
||
|
self.paths = self get_anim_paths();
|
||
|
self.path_index = 0;
|
||
|
}
|
||
|
|
||
|
path_anim( time, time_in, time_out )
|
||
|
{
|
||
|
path = self.paths[ self.path_index ];
|
||
|
if ( !isdefined( path ) )
|
||
|
return;
|
||
|
|
||
|
self.path_index++;
|
||
|
|
||
|
if ( isdefined( time_in ) )
|
||
|
{
|
||
|
self moveto( path[ "origin" ], time, time_in, time_out );
|
||
|
self rotateto( path[ "angles" ], time, time_in, time_out );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
self moveto( path[ "origin" ], time );
|
||
|
self rotateto( path[ "angles" ], time );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
pillar_anim_show()
|
||
|
{
|
||
|
models = getentarray( "pillar_anim", "targetname" );
|
||
|
models = array_index_by_parameters( models );
|
||
|
|
||
|
model1targ = getent( models["1"].target, "targetname" );
|
||
|
model2targ = getent( models["2"].target, "targetname" );
|
||
|
|
||
|
//model1targ thread maps\_debug::drawOriginForever();
|
||
|
//model2targ thread maps\_debug::drawOriginForever();
|
||
|
|
||
|
models["1"] linkto( model1targ );
|
||
|
models["2"] linkto( models["1"] );
|
||
|
model2targ linkto( model1targ );
|
||
|
|
||
|
flag_wait( "enter_final_room" );
|
||
|
//flag_wait( "reach_mound" );
|
||
|
wait( 1 );
|
||
|
|
||
|
targ2 = getent( model1targ.target, "targetname" );
|
||
|
|
||
|
model1targ moveto( targ2.origin, 5, 1, 2 );
|
||
|
model1targ rotateto( targ2.angles, 5, 1, 2 );
|
||
|
wait( 5 );
|
||
|
|
||
|
pillar_rotater = getent( "pillar_rotater", "targetname" );
|
||
|
model1targ linkto( pillar_rotater );
|
||
|
|
||
|
pillar_targ = getent( pillar_rotater.target, "targetname" );
|
||
|
pillar_rotater rotateto( pillar_targ.angles, 2, 2, 0 );
|
||
|
pillar_rotater moveto( pillar_targ.origin, 2, 2, 0 );
|
||
|
wait( 2 );
|
||
|
|
||
|
pillar_rotater = getent( pillar_rotater.target, "targetname" );
|
||
|
model1targ linkto( pillar_rotater );
|
||
|
|
||
|
timer = 0.75;
|
||
|
pillar_targ = getent( pillar_rotater.target, "targetname" );
|
||
|
pillar_rotater rotateto( pillar_targ.angles, timer );
|
||
|
pillar_rotater moveto( pillar_targ.origin, timer );
|
||
|
wait( timer );
|
||
|
|
||
|
|
||
|
|
||
|
targets = getentarray( pillar_targ.target, "targetname" );
|
||
|
targets = array_index_by_classname( targets );
|
||
|
|
||
|
models["2"] linkto( model2targ );
|
||
|
model2targ linkto( targets[ "script_origin_pillar2" ] );
|
||
|
|
||
|
models["1"] linkto( model1targ );
|
||
|
model1targ linkto( targets[ "script_origin_pillar1" ] );
|
||
|
|
||
|
timer = 0.4;
|
||
|
model1targ unlink();
|
||
|
model1targ rotateto( targets[ "script_origin_pillar1" ].angles, timer );
|
||
|
model1targ moveto( targets[ "script_origin_pillar1" ].origin, timer );
|
||
|
|
||
|
timer = 1.5;
|
||
|
model2targ unlink();
|
||
|
model2targ rotateto( targets[ "script_origin_pillar2" ].angles, timer, 0, timer );
|
||
|
model2targ moveto( targets[ "script_origin_pillar2" ].origin, timer, 0, timer );
|
||
|
|
||
|
|
||
|
/*
|
||
|
models = getentarray( "pillar_anim", "targetname" );
|
||
|
array_thread( models, ::path_anim_setup );
|
||
|
|
||
|
models = array_index_by_parameters( models );
|
||
|
//flag_wait( "reach_mound" );
|
||
|
wait( 1 );
|
||
|
|
||
|
ents = [];
|
||
|
foreach ( model in models )
|
||
|
{
|
||
|
ent = spawn( "script_origin", (0,0,0) );
|
||
|
path = model.paths[ 0 ];
|
||
|
ent.paths = model.paths;
|
||
|
ent.origin = path[ "origin" ];
|
||
|
ent.angles = path[ "angles" ];
|
||
|
|
||
|
ent.path_index = 0;
|
||
|
|
||
|
model linkto( ent );
|
||
|
ents[ model.script_parameters ] = ent;
|
||
|
}
|
||
|
|
||
|
//fakeseys on the first one
|
||
|
ents[ "1" ] path_anim( 0.1 );
|
||
|
ents[ "2" ] path_anim( 0.1 );
|
||
|
|
||
|
// first grind in
|
||
|
ents[ "1" ] path_anim( 2, 0.2, 0.2 );
|
||
|
ents[ "2" ] path_anim( 2, 0.2, 0.2 );
|
||
|
wait( 2.5 );
|
||
|
|
||
|
// now start to fall
|
||
|
ents[ "1" ] path_anim( 2, 2, 0 );
|
||
|
ents[ "2" ] path_anim( 2, 2, 0 );
|
||
|
wait( 2 );
|
||
|
|
||
|
// falling
|
||
|
ents[ "1" ] path_anim( 0.25 );
|
||
|
ents[ "2" ] path_anim( 0.25 );
|
||
|
wait( 0.25 );
|
||
|
|
||
|
// falling
|
||
|
ents[ "1" ] path_anim( 0.25 );
|
||
|
ents[ "2" ] path_anim( 0.25 );
|
||
|
wait( 0.25 );
|
||
|
|
||
|
// BAM, slide apart
|
||
|
ents[ "1" ] path_anim( 2, 0, 2 );
|
||
|
ents[ "2" ] path_anim( 2, 0, 2 );
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
delete_tree_think()
|
||
|
{
|
||
|
// this ent is just for ref, delete all links
|
||
|
ent = self;
|
||
|
for ( ;; )
|
||
|
{
|
||
|
if ( !isdefined( ent.target ) )
|
||
|
break;
|
||
|
newent = getent( ent.target, "targetname" );
|
||
|
ent delete();
|
||
|
ent = newent;
|
||
|
}
|
||
|
|
||
|
ent delete();
|
||
|
}
|
||
|
|
||
|
eqtest()
|
||
|
{
|
||
|
/*
|
||
|
channels = [];
|
||
|
channels[ "item" ] = true;
|
||
|
channels[ "menu" ] = true;
|
||
|
channels[ "weapon" ] = true;
|
||
|
channels[ "voice" ] = true;
|
||
|
channels[ "body" ] = true;
|
||
|
channels[ "physics" ] = true;
|
||
|
channels[ "local" ] = true;
|
||
|
channels[ "music" ] = true;
|
||
|
channels[ "announcer" ] = true;
|
||
|
channels[ "auto" ] = true;
|
||
|
channels[ "physics" ] = true;
|
||
|
channels[ "ambdist1" ] = true;
|
||
|
channels[ "ambdist2" ] = true;
|
||
|
channels[ "auto" ] = true;
|
||
|
channels[ "auto2" ] = true;
|
||
|
channels[ "auto2d" ] = true;
|
||
|
channels[ "autodog" ] = true;
|
||
|
channels[ "explosiveimpact" ] = true;
|
||
|
channels[ "element" ] = true;
|
||
|
channels[ "vehicle" ] = true;
|
||
|
channels[ "vehiclelimited" ] = true;
|
||
|
channels[ "body" ] = true;
|
||
|
channels[ "reload" ] = true;
|
||
|
channels[ "effects1" ] = true;
|
||
|
channels[ "effects2" ] = true;
|
||
|
channels[ "voice" ] = true;
|
||
|
channels[ "mission" ] = true;
|
||
|
|
||
|
*/
|
||
|
/*
|
||
|
main_track = level.eq_main_track;
|
||
|
mix_track = level.eq_mix_track;
|
||
|
|
||
|
// put the player on the mixtrack first
|
||
|
level.player SetEqLerp( 1, main_track );
|
||
|
|
||
|
filter = "highshelf";
|
||
|
db = -25;
|
||
|
freq = 1100;
|
||
|
a = 5;
|
||
|
|
||
|
foreach ( channel, _ in channels )
|
||
|
{
|
||
|
level.player seteqbands( channel, mix_track, "highshelf", db, freq, 1, "lowshelf", 2, freq, 1 );
|
||
|
}
|
||
|
|
||
|
*/
|
||
|
|
||
|
AmbientStop( 0.5 );
|
||
|
|
||
|
thread maps\_ambient::use_eq_settings( "gulag_cavein", level.eq_mix_track );
|
||
|
|
||
|
// now blend to the mix track, which is our filter
|
||
|
maps\_ambient::blend_to_eq_track( level.eq_mix_track, 2 );
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
player_dies_to_cavein( start_index )
|
||
|
{
|
||
|
// buried
|
||
|
if ( flag( "player_died_to_cave_in" ) )
|
||
|
return;
|
||
|
|
||
|
level.player PlayRumbleLoopOnEntity( "damage_light" );
|
||
|
flag_set( "player_died_to_cave_in" );
|
||
|
level.player enabledeathshield( false );
|
||
|
|
||
|
fx = [];
|
||
|
fx[ fx.size ] = "hallway_collapsing";
|
||
|
fx[ fx.size ] = "hallway_collapsing_big";
|
||
|
fx[ fx.size ] = "hallway_collapsing_huge";
|
||
|
fx[ fx.size ] = "hallway_collapsing_huge";
|
||
|
|
||
|
index = start_index;
|
||
|
if ( !isdefined( index ) )
|
||
|
index = 0;
|
||
|
|
||
|
counts = [];
|
||
|
counts[ 0 ] = 12;
|
||
|
counts[ 1 ] = 15;
|
||
|
counts[ 2 ] = 10;
|
||
|
counts[ 3 ] = 20;
|
||
|
|
||
|
AmbientStop( 0.5 );
|
||
|
thread maps\_ambient::use_eq_settings( "gulag_cavein", level.eq_mix_track );
|
||
|
thread maps\_ambient::blend_to_eq_track( level.eq_mix_track, 2 );
|
||
|
thread black_death();
|
||
|
|
||
|
last_org = level.player.origin;
|
||
|
for ( ;; )
|
||
|
{
|
||
|
for ( i = 0; i < counts[ index ]; i++ )
|
||
|
{
|
||
|
angles = level.player getplayerangles();
|
||
|
forward = anglestoforward( angles );
|
||
|
vec = level.player.origin - last_org;
|
||
|
|
||
|
|
||
|
org = level.player.origin + forward * 100 + vec * 10;
|
||
|
org = set_z( org, level.player.origin[2] );
|
||
|
|
||
|
trace = BulletTrace( org, org + (0,0,3000), false, undefined );
|
||
|
current_fx = getfx( fx[ index ] );
|
||
|
PlayFX( current_fx, trace[ "position" ] );
|
||
|
last_org = level.player.origin;
|
||
|
|
||
|
if ( randomint( 100 ) > 40 )
|
||
|
{
|
||
|
if ( index == 1 )
|
||
|
level.player DoDamage( 5 / level.player.damageMultiplier, randomvector( 500 ) );
|
||
|
if ( index > 1 )
|
||
|
level.player DoDamage( 15 / level.player.damageMultiplier, randomvector( 500 ) );
|
||
|
|
||
|
level.player PlayRumbleOnEntity( "damage_heavy" );
|
||
|
}
|
||
|
wait( 0.05 );
|
||
|
}
|
||
|
|
||
|
if ( index == 2 )
|
||
|
{
|
||
|
level.player kill();
|
||
|
}
|
||
|
|
||
|
index++;
|
||
|
if ( index >= fx.size )
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
player_ending_cavein()
|
||
|
{
|
||
|
level endon( "stop_cavein" );
|
||
|
|
||
|
fx = getfx( "player_cavein" );
|
||
|
/*
|
||
|
tag_origin = spawn_tag_origin();
|
||
|
tag_origin.origin = level.player.origin + (0,0,60);
|
||
|
tag_origin linkto( level.player );
|
||
|
PlayFXOnTag( fx, tag_origin, "tag_origin" );
|
||
|
*/
|
||
|
|
||
|
// thread black_death();
|
||
|
|
||
|
// wait( 1.2 );
|
||
|
delay = 1.5;
|
||
|
for ( ;; )
|
||
|
{
|
||
|
wait( delay );
|
||
|
PlayFX( fx, level.player.origin + (0,0,60 ) );
|
||
|
delay -= 0.75;
|
||
|
if ( delay <= 0.2 )
|
||
|
delay = 0.2;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
fx = [];
|
||
|
fx[ fx.size ] = "hallway_collapsing";
|
||
|
fx[ fx.size ] = "hallway_collapsing_big";
|
||
|
fx[ fx.size ] = "hallway_collapsing_huge";
|
||
|
|
||
|
index = 0;
|
||
|
|
||
|
counts = [];
|
||
|
counts[ 0 ] = 4;
|
||
|
counts[ 1 ] = 80;
|
||
|
counts[ 2 ] = 80;
|
||
|
|
||
|
thread black_death();
|
||
|
|
||
|
last_org = level.player.origin;
|
||
|
for ( ;; )
|
||
|
{
|
||
|
for ( i = 0; i < counts[ index ]; i++ )
|
||
|
{
|
||
|
angles = level.player getplayerangles();
|
||
|
forward = anglestoforward( angles );
|
||
|
vec = level.player.origin - last_org;
|
||
|
|
||
|
|
||
|
org = level.player.origin + forward * 100 + vec * 10;
|
||
|
org = set_z( org, level.player.origin[2] );
|
||
|
|
||
|
trace = BulletTrace( org, org + (0,0,3000), false, undefined );
|
||
|
current_fx = getfx( fx[ index ] );
|
||
|
PlayFX( current_fx, trace[ "position" ] );
|
||
|
last_org = level.player.origin;
|
||
|
|
||
|
wait( 0.1 );
|
||
|
}
|
||
|
|
||
|
index++;
|
||
|
if ( index >= fx.size )
|
||
|
break;
|
||
|
}
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
black_death()
|
||
|
{
|
||
|
wait( 4.5 );
|
||
|
black_overlay = create_client_overlay( "black", 0, level.player );
|
||
|
black_overlay fadeOverTime( 2.5 );
|
||
|
black_overlay.alpha = 1;
|
||
|
black_overlay.foreground = false;
|
||
|
level waittill( "stop_cavein" );
|
||
|
wait( 0.05 );
|
||
|
black_overlay destroy();
|
||
|
}
|
||
|
|
||
|
trigger_damage_think()
|
||
|
{
|
||
|
self waittill( "trigger" );
|
||
|
ent = getstruct( self.target, "targetname" );
|
||
|
RadiusDamage( ent.origin + (0,0,16), 32, 500, 500, level.player );
|
||
|
wait( 0.2 );
|
||
|
RadiusDamage( ent.origin - (0,0,16), 32, 500, 500, level.player );
|
||
|
// Print3d( ent.origin, "x", (1,0,0), 1, 1, 50 );
|
||
|
}
|
||
|
|
||
|
chase_player_dies_if_goes_wrong_way()
|
||
|
{
|
||
|
level.player endon( "death" );
|
||
|
flag_wait( "chase_brush_kill_volume_activates" );
|
||
|
wait( 2.5 ); // 2.3
|
||
|
|
||
|
volume = getent( "player_cavein_kill_volume", "targetname" );
|
||
|
time = 5;
|
||
|
frames = time * 20;
|
||
|
|
||
|
for ( i = 0; i < frames; i++ )
|
||
|
{
|
||
|
if ( level.player istouching( volume ) )
|
||
|
{
|
||
|
thread player_dies_to_cavein( 2 );
|
||
|
return;
|
||
|
}
|
||
|
wait( 0.05 );
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
chase_train_chases( dist, starter )
|
||
|
{
|
||
|
level endon( "stop_chase_fx" );
|
||
|
min_speed = 6.0; // 8.0;
|
||
|
max_speed = 16; // 20;
|
||
|
min_dist = dist;
|
||
|
max_dist = dist + 75;
|
||
|
|
||
|
range_speed = max_speed - min_speed;
|
||
|
range_dist = max_dist - min_dist;
|
||
|
|
||
|
level.chasers[ starter ] = [];
|
||
|
|
||
|
for ( ;; )
|
||
|
{
|
||
|
ai = getaiarray( "allies" );
|
||
|
guy = getClosest( self.origin, ai );
|
||
|
dist = distance( self.origin, guy.origin );
|
||
|
|
||
|
level.chasers[ starter ][ "dist" ] = dist;
|
||
|
|
||
|
dist -= min_dist;
|
||
|
scale = dist / range_dist;
|
||
|
|
||
|
if ( scale < 0 )
|
||
|
scale = 0;
|
||
|
else
|
||
|
if ( scale > 1 )
|
||
|
scale = 1;
|
||
|
|
||
|
speed = min_speed + range_speed * scale;
|
||
|
|
||
|
|
||
|
level.chasers[ starter ][ "speed" ] = speed;
|
||
|
|
||
|
self Vehicle_SetSpeed( speed, 5, 5 );
|
||
|
wait( 0.05 );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
chase_brush_accellerates_to_max_speed( chase_vehicle, time, max_speed )
|
||
|
{
|
||
|
frames = time * 20;
|
||
|
|
||
|
for ( i = 0; i <= frames; i++ )
|
||
|
{
|
||
|
scale = i / frames;
|
||
|
speed = max_speed * scale;
|
||
|
if ( speed <= 0 )
|
||
|
speed = 0.1;
|
||
|
chase_vehicle Vehicle_SetSpeedImmediate( speed, speed, speed );
|
||
|
wait( 0.05 );
|
||
|
}
|
||
|
|
||
|
wait( time );
|
||
|
}
|
||
|
|
||
|
chase_train()
|
||
|
{
|
||
|
level notify( "collapse_fx_stop" );
|
||
|
speed = 190; //186;
|
||
|
speed = 270; //186;
|
||
|
speed /= 19.76;
|
||
|
speed = 6;
|
||
|
|
||
|
chase_vehicle_spawner = getent( "chase_brush_vehicle", "targetname" );
|
||
|
fx_vehicle = chase_vehicle_spawner vehicle_dospawn();
|
||
|
level.fx_vehicle = fx_vehicle;
|
||
|
fx_vehicle thread chase_train_fx();
|
||
|
|
||
|
path = getvehiclenode( fx_vehicle.target, "targetname" );
|
||
|
fx_vehicle attachpath( path );
|
||
|
fx_vehicle startpath();
|
||
|
|
||
|
|
||
|
time = 4;
|
||
|
thread chase_brush_accellerates_to_max_speed( fx_vehicle, time, speed );
|
||
|
thread chase_player_dies_if_goes_wrong_way();
|
||
|
level.chasers = [];
|
||
|
fx_vehicle thread chase_train_chases( 400, true );
|
||
|
|
||
|
wait( 3.5 );
|
||
|
// wait( 1.25 + 3.25 );
|
||
|
chase_brush = getent( "chase_brush", "targetname" );
|
||
|
chase_brush show();
|
||
|
|
||
|
chase_vehicle_spawner = getent( "chase_brush_vehicle", "targetname" );
|
||
|
chase_vehicle = chase_vehicle_spawner vehicle_dospawn();
|
||
|
chase_vehicle thread chase_train_kills_player_if_it_gets_close();
|
||
|
level.chase_vehicle = chase_vehicle;
|
||
|
chase_vehicle attachpath( path );
|
||
|
chase_vehicle startpath();
|
||
|
chase_brush linkto( chase_vehicle );
|
||
|
chase_vehicle thread chase_train_chases( 900, false );
|
||
|
|
||
|
//chase_vehicle Vehicle_SetSpeedImmediate( speed, speed, speed );
|
||
|
//fx_vehicle Vehicle_SetSpeedImmediate( speed, speed, speed );
|
||
|
|
||
|
level waittill( "stop_chase_fx" );
|
||
|
|
||
|
chase_vehicle delete();
|
||
|
}
|
||
|
|
||
|
chase_train_fx()
|
||
|
{
|
||
|
level endon( "stop_chase_fx" );
|
||
|
|
||
|
ent = spawn_tag_origin();
|
||
|
|
||
|
fx = getfx( "hallway_collapsing_chase" );
|
||
|
ent linkto( self, "tag_origin", (0,0,0), (0,0,-90) );
|
||
|
//ent thread maps\_debug::drawtagforever( "tag_origin" );
|
||
|
count = 5;
|
||
|
for ( ;; )
|
||
|
{
|
||
|
angles = self.angles;
|
||
|
forward = anglestoforward( angles );
|
||
|
count--;
|
||
|
if ( count <= 0 )
|
||
|
{
|
||
|
vec = randomvector( 0.125 );
|
||
|
PhysicsJolt( level.player.origin + forward * 250, 250, 250, vec );
|
||
|
count = randomint( 10 );
|
||
|
}
|
||
|
PlayFXOnTag( fx, ent, "tag_origin" );
|
||
|
wait( 0.1 );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
chase_train_kills_player_if_it_gets_close()
|
||
|
{
|
||
|
level endon( "stop_chase_fx" );
|
||
|
|
||
|
black_screen();
|
||
|
|
||
|
max_black = 400;
|
||
|
min_black = 700;
|
||
|
black_range = abs( max_black - min_black );
|
||
|
|
||
|
for ( ;; )
|
||
|
{
|
||
|
org1 = level.player.origin;
|
||
|
org1 = set_z( org1, 0 );
|
||
|
|
||
|
org2 = self.origin;
|
||
|
org2 = set_z( org2, 0 );
|
||
|
|
||
|
level.chase_distance = distance( org1, org2 );
|
||
|
chase_dist = level.chase_distance;
|
||
|
|
||
|
// algebra!
|
||
|
//1 - ( ( min_black - max_black ) / black_range ) = 1 - ( ( chase_dist - max_black ) / black_range );
|
||
|
alpha = 1 - ( ( chase_dist - max_black ) / black_range );
|
||
|
alpha = clamp( alpha, 0, 1 );
|
||
|
|
||
|
level.black_overlay.alpha = alpha;
|
||
|
level.black_overlay fadeOverTime( 0.2 );
|
||
|
|
||
|
//Line( level.player.origin, self.origin, (1,0,1), 1, 0, 2 );
|
||
|
|
||
|
//println( "distance " + distance( org1, org2 ) );
|
||
|
if ( chase_dist < 260 )
|
||
|
{
|
||
|
// this function automatically early outs on second call
|
||
|
thread player_dies_to_cavein( 2 );
|
||
|
}
|
||
|
|
||
|
wait( 0.1 );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
black_screen( _ )
|
||
|
{
|
||
|
if ( isdefined( level.black_overlay ) )
|
||
|
{
|
||
|
level.black_overlay destroy();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
hud = create_client_overlay( "black", 0, level.player );
|
||
|
hud.alpha = 1;
|
||
|
hud.foreground = false;
|
||
|
|
||
|
level.black_overlay = hud;
|
||
|
}
|
||
|
|
||
|
|
||
|
ceiling_collapse_think()
|
||
|
{
|
||
|
flag_wait( "rescue_begins" );
|
||
|
org = self.origin;
|
||
|
self.origin += (0,0,300);
|
||
|
flag_wait( "exit_collapses" );
|
||
|
|
||
|
self CastShadows();
|
||
|
script_delay();
|
||
|
|
||
|
self moveto( org, 1, 0.2, 0 );
|
||
|
Earthquake( 1.0, 4, org, 1000 );
|
||
|
}
|
||
|
|
||
|
set_friendly_endpoint_think()
|
||
|
{
|
||
|
level.friendly_endpoint = self.origin;
|
||
|
flag_wait( "exit_collapses" );
|
||
|
|
||
|
|
||
|
new_org = getstruct( self.target, "targetname" );
|
||
|
level.friendly_endpoint = new_org.origin;
|
||
|
flag_clear( "friendlies_turn_corner" );
|
||
|
flag_wait( "friendlies_turn_corner" );
|
||
|
|
||
|
// This way this way!!!
|
||
|
level.redshirt thread dialogue_queue( "gulag_wrm_thisway" );
|
||
|
|
||
|
hall_org = getstruct( new_org.target, "targetname" );
|
||
|
level.friendly_endpoint = hall_org.origin;
|
||
|
|
||
|
flag_wait( "friendlies_turn_to_cafeteria" );
|
||
|
level.friendly_endpoint = self.origin;
|
||
|
}
|
||
|
|
||
|
ending_run_fx()
|
||
|
{
|
||
|
if ( flag( "enter_final_room" ) )
|
||
|
return;
|
||
|
level endon( "enter_final_room" );
|
||
|
|
||
|
level endon( "stop_ending_run_fx" );
|
||
|
rocks = get_exploder_array( "wall_rock" );
|
||
|
level.max_rocks = 3;
|
||
|
|
||
|
level.ending_fx_min_dist = 280;
|
||
|
level.ending_fx_max_dist = 700;
|
||
|
level.ending_fx_dot = 0.8;
|
||
|
|
||
|
foreach ( ent in rocks )
|
||
|
{
|
||
|
ent.flat_origin = flat_origin( ent.v[ "origin" ] );
|
||
|
ent.last_occurred_time = 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
for ( ;; )
|
||
|
{
|
||
|
exit_flag = flag( "exit_collapses" );
|
||
|
|
||
|
rocks = array_randomize( rocks );
|
||
|
origin = flat_origin( level.player.origin );
|
||
|
angles = level.player.angles;
|
||
|
forward = anglestoforward( angles );
|
||
|
origin += forward * -350;
|
||
|
|
||
|
array = [];
|
||
|
foreach ( ent in rocks )
|
||
|
{
|
||
|
if ( !exit_flag && ent.v[ "fxid" ] == "ceiling_collapse_dirt1" )
|
||
|
continue;
|
||
|
|
||
|
if ( ent.last_occurred_time > gettime() - 1000 )
|
||
|
continue;
|
||
|
dist = distance( ent.flat_origin, origin );
|
||
|
if ( dist < level.ending_fx_min_dist )
|
||
|
continue;
|
||
|
if ( dist < level.ending_fx_max_dist )
|
||
|
continue;
|
||
|
|
||
|
normal = vectorNormalize( ent.flat_origin - origin );
|
||
|
dot = vectorDot( forward, normal );
|
||
|
if ( dot < level.ending_fx_dot )
|
||
|
continue;
|
||
|
|
||
|
array[ array.size ] = ent;
|
||
|
if ( array.size >= level.max_rocks )
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
foreach ( ent in array )
|
||
|
{
|
||
|
ent activate_individual_exploder();
|
||
|
ent.last_occurred_time = gettime();
|
||
|
wait( 0.1 );
|
||
|
}
|
||
|
wait( 0.1 );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
cafe_fx()
|
||
|
{
|
||
|
flag_wait( "enter_final_room" );
|
||
|
|
||
|
level endon( "stop_ending_run_fx" );
|
||
|
rocks = get_exploder_array( "cafe_rock" );
|
||
|
level.fx_fall_time = 0.07;
|
||
|
|
||
|
for ( ;; )
|
||
|
{
|
||
|
rocks = array_randomize( rocks );
|
||
|
foreach ( ent in rocks )
|
||
|
{
|
||
|
ent activate_individual_exploder();
|
||
|
//ent.last_occurred_time = gettime();
|
||
|
wait( level.fx_fall_time );
|
||
|
}
|
||
|
wait( 0.1 );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
ceiling_collapse_begins()
|
||
|
{
|
||
|
level endon( "collapse_fx_stop" );
|
||
|
org = getstruct( "ceiling_collapse_org", "targetname" );
|
||
|
target = getstruct( org.target, "targetname" );
|
||
|
angles = vectortoangles( target.origin - org.origin );
|
||
|
dist = distance( org.origin, target.origin );
|
||
|
forward = anglestoforward( angles );
|
||
|
|
||
|
fx = [];
|
||
|
fx[ fx.size ] = "hallway_collapsing";
|
||
|
fx[ fx.size ] = "hallway_collapsing_big";
|
||
|
fx[ fx.size ] = "hallway_collapsing_huge";
|
||
|
|
||
|
thread playfx_collapse( org.origin, forward, dist, fx[0], 6 );
|
||
|
wait( 3.5 );
|
||
|
thread playfx_collapse( org.origin, forward, dist, fx[1], 3 );
|
||
|
wait( 2.5 );
|
||
|
thread playfx_collapse( org.origin, forward, 0, fx[2], 8 );
|
||
|
}
|
||
|
|
||
|
playfx_collapse( origin, forward, dist, fx_msg, time )
|
||
|
{
|
||
|
level endon( "collapse_fx_stop" );
|
||
|
ent = spawnstruct();
|
||
|
ent endon( "stop" );
|
||
|
ent delaythread( time, ::send_notify, "stop" );
|
||
|
|
||
|
fx = getfx( fx_msg );
|
||
|
wait_time = 0.5;
|
||
|
for ( ;; )
|
||
|
{
|
||
|
org = origin + forward * randomfloat( dist );
|
||
|
PlayFX( fx, org );
|
||
|
wait( wait_time );
|
||
|
wait_time -= 0.35;
|
||
|
if ( wait_time < 0.5 )
|
||
|
wait_time = 0.5;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
get_anim_paths()
|
||
|
{
|
||
|
path = self;
|
||
|
|
||
|
paths = [];
|
||
|
for ( ;; )
|
||
|
{
|
||
|
if ( !isdefined( path.target ) )
|
||
|
break;
|
||
|
|
||
|
path = getent( path.target, "targetname" );
|
||
|
|
||
|
array = [];
|
||
|
array[ "angles" ] = path.angles;
|
||
|
array[ "origin" ] = path.origin;
|
||
|
array[ "model" ] = path;
|
||
|
paths[ paths.size ] = array;
|
||
|
}
|
||
|
|
||
|
foreach ( path in paths )
|
||
|
{
|
||
|
path[ "model" ] delete();
|
||
|
}
|
||
|
|
||
|
return paths;
|
||
|
}
|
||
|
|
||
|
friendly_car_slide_trigger()
|
||
|
{
|
||
|
targ = getent( self.target, "targetname" );
|
||
|
targ thread price_slide_box_topples();
|
||
|
flag_wait( "exit_collapses" );
|
||
|
|
||
|
for ( ;; )
|
||
|
{
|
||
|
self waittill( "trigger", other );
|
||
|
|
||
|
if ( !isalive( other ) )
|
||
|
continue;
|
||
|
|
||
|
if ( other == level.redshirt )
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if ( flag( "do_not_flip_box" ) )
|
||
|
{
|
||
|
wait( 0.35 );
|
||
|
wait( 1.7 );
|
||
|
flag_set( "match_up_for_final_room" );
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
targ notify( "topple" );
|
||
|
|
||
|
targ waittill( "trigger" );
|
||
|
thread price_hurdles();
|
||
|
}
|
||
|
|
||
|
price_slide_box_topples()
|
||
|
{
|
||
|
targets = getentarray( self.target, "targetname" );
|
||
|
models = [];
|
||
|
|
||
|
foreach ( target in targets )
|
||
|
{
|
||
|
models[ target.classname ] = target;
|
||
|
}
|
||
|
|
||
|
crate = models[ "script_model" ];
|
||
|
models[ "script_brushmodel" ] linkto( crate );
|
||
|
|
||
|
paths = crate get_anim_paths();
|
||
|
|
||
|
self waittill( "topple" );
|
||
|
crate delaythread( 0.25, ::play_sound_on_entity, "door_cargo_container_burst_open" );
|
||
|
models[ "script_brushmodel" ] thread kill_player_on_touch();
|
||
|
|
||
|
foreach ( path in paths )
|
||
|
{
|
||
|
crate moveto( path[ "origin" ], 0.1 );
|
||
|
crate rotateto( path[ "angles" ], 0.1 );
|
||
|
wait( 0.1 );
|
||
|
}
|
||
|
models[ "script_brushmodel" ] notify( "stop_killing" );
|
||
|
}
|
||
|
|
||
|
kill_player_on_touch()
|
||
|
{
|
||
|
level.touchkill = self; // for debugging
|
||
|
self endon( "stop_killing" );
|
||
|
for ( ;; )
|
||
|
{
|
||
|
if ( level.player istouching( self ) )
|
||
|
{
|
||
|
level.player kill();
|
||
|
return;
|
||
|
}
|
||
|
wait( 0.05 );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
price_hurdles()
|
||
|
{
|
||
|
car_slide_org = getstruct( "car_slide_org", "targetname" );
|
||
|
|
||
|
wait( 0.35 );
|
||
|
car_slide_org thread anim_generic( level.redshirt, "slide_across_car" );
|
||
|
wait( 1.7 );
|
||
|
level.redshirt anim_stopanimscripted();
|
||
|
flag_set( "match_up_for_final_room" );
|
||
|
setsaveddvar( "player_sprintSpeedScale", level.default_sprint );
|
||
|
}
|
||
|
|
||
|
ambient_flicker_light_think()
|
||
|
{
|
||
|
ent = spawnstruct();
|
||
|
light = getent( self.target, "targetname" );
|
||
|
|
||
|
turn_on[ "ch_street_wall_light_01_on" ] = "ch_street_wall_light_01_on";
|
||
|
turn_on[ "ch_street_wall_light_01_off" ] = "ch_street_wall_light_01_on";
|
||
|
|
||
|
turn_off[ "ch_street_wall_light_01_off" ] = "ch_street_wall_light_01_off";
|
||
|
turn_off[ "ch_street_wall_light_01_on" ] = "ch_street_wall_light_01_off";
|
||
|
|
||
|
turn_on[ "com_floodlight_on" ] = "com_floodlight_on";
|
||
|
turn_on[ "com_floodlight" ] = "com_floodlight_on";
|
||
|
|
||
|
turn_off[ "com_floodlight" ] = "com_floodlight";
|
||
|
turn_off[ "com_floodlight_on" ] = "com_floodlight";
|
||
|
|
||
|
ent.turn_on = turn_on;
|
||
|
ent.turn_off = turn_off;
|
||
|
ent.light = light;
|
||
|
|
||
|
flicker_funcs = [];
|
||
|
flicker_funcs[ "slow_flicker" ] = ::flicker_slow;
|
||
|
|
||
|
ent.intensity = light getLightIntensity();
|
||
|
|
||
|
if ( !isdefined( self.script_parameters ) )
|
||
|
thread flicker_default( ent );
|
||
|
else
|
||
|
thread [[ flicker_funcs[ self.script_parameters ] ]]( ent );
|
||
|
}
|
||
|
|
||
|
flicker_default( ent )
|
||
|
{
|
||
|
for ( ;; )
|
||
|
{
|
||
|
count = randomint( 5 ) + 2;
|
||
|
for ( i = 0; i < count; i++ )
|
||
|
{
|
||
|
ent.light setLightIntensity( 0 );
|
||
|
self setModel( ent.turn_off[ self.model ] );
|
||
|
wait( 0.05 );
|
||
|
ent.light setLightIntensity( ent.intensity );
|
||
|
self setModel( ent.turn_on[ self.model ] );
|
||
|
wait( 0.05 );
|
||
|
}
|
||
|
|
||
|
ent.light setLightIntensity( 0 );
|
||
|
self setModel( ent.turn_off[ self.model ] );
|
||
|
wait( randomfloatrange( 0.2, 0.3 ) );
|
||
|
|
||
|
count = randomint( 5 ) + 2;
|
||
|
for ( i = 0; i < count; i++ )
|
||
|
{
|
||
|
ent.light setLightIntensity( 0 );
|
||
|
self setModel( ent.turn_off[ self.model ] );
|
||
|
wait( 0.05 );
|
||
|
ent.light setLightIntensity( ent.intensity );
|
||
|
self setModel( ent.turn_on[ self.model ] );
|
||
|
wait( 0.05 );
|
||
|
}
|
||
|
|
||
|
ent.light setLightIntensity( ent.intensity );
|
||
|
self setModel( ent.turn_on[ self.model ] );
|
||
|
wait( randomfloatrange( 0.2, 0.3 ) );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
flicker_slow( ent )
|
||
|
{
|
||
|
for ( ;; )
|
||
|
{
|
||
|
count = randomint( 5 ) + 2;
|
||
|
for ( i = 0; i < count; i++ )
|
||
|
{
|
||
|
ent.light setLightIntensity( 0 );
|
||
|
self setModel( ent.turn_off[ self.model ] );
|
||
|
wait( 0.1 );
|
||
|
ent.light setLightIntensity( ent.intensity );
|
||
|
self setModel( ent.turn_on[ self.model ] );
|
||
|
wait( 0.1 );
|
||
|
}
|
||
|
|
||
|
ent.light setLightIntensity( ent.intensity );
|
||
|
self setModel( ent.turn_on[ self.model ] );
|
||
|
wait( randomfloatrange( 0.2, 0.3 ) );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
cafe_table_org_think()
|
||
|
{
|
||
|
// these ents are associated by distance because a set of ents are in a prefab
|
||
|
index = get_closest_index( self.origin, level.cafe_tables, 32 );
|
||
|
if ( !isdefined( index ) )
|
||
|
return;
|
||
|
|
||
|
table = level.cafe_tables[ index ];
|
||
|
level.cafe_tables[ index ] = undefined;
|
||
|
|
||
|
ent = spawn( "script_origin", (0,0,0) );
|
||
|
ent.origin = self.origin;
|
||
|
ent.angles = self.angles;
|
||
|
table linkto( ent );
|
||
|
|
||
|
//ent thread maps\_debug::drawOriginForever();
|
||
|
wait( 1 );
|
||
|
|
||
|
|
||
|
target = getstruct( self.target, "targetname" );
|
||
|
|
||
|
timer = 5;
|
||
|
ent moveto( target.origin, timer, timer * 0.1, timer * 0.1 );
|
||
|
ent rotateto( target.angles, timer, timer * 0.1, timer * 0.1 );
|
||
|
|
||
|
frames = timer * 20;
|
||
|
org = ent.origin + (0,0,32);
|
||
|
for ( i = 0; i < frames; i++ )
|
||
|
{
|
||
|
PhysicsJolt( org, 350, 250, randomvector( 0.05 ) );
|
||
|
wait( 0.05 );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
cafe_table_think()
|
||
|
{
|
||
|
model = getent( self.target, "targetname" );
|
||
|
model linkto( self );
|
||
|
}
|
||
|
|
||
|
cafe_table_eq_org_think()
|
||
|
{
|
||
|
for ( ;; )
|
||
|
{
|
||
|
wait( randomfloatrange( 3, 17 ) );
|
||
|
count = randomintrange( 4, 8 );
|
||
|
for ( i = 0; i < count; i++ )
|
||
|
{
|
||
|
vec = randomvector( 0.18 );
|
||
|
if ( vec[2] < 0 )
|
||
|
{
|
||
|
vec = set_z( vec, vec[2] * -1 );
|
||
|
}
|
||
|
|
||
|
PhysicsJolt( self.origin, 120, 80, vec );
|
||
|
wait( 0.05 );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
light_destructible_think()
|
||
|
{
|
||
|
wait( randomfloatrange( 7, 20 ) );
|
||
|
RadiusDamage( self.origin, 32, 500, 500 );
|
||
|
}
|
||
|
|
||
|
swing_light_think()
|
||
|
{
|
||
|
ref_ent = spawn_tag_origin();
|
||
|
|
||
|
old_angles = self.angles;
|
||
|
range = 25;
|
||
|
self SetLightFovRange( 50, 25 );
|
||
|
|
||
|
for ( ;; )
|
||
|
{
|
||
|
ref_ent.angles = old_angles;
|
||
|
pitch = randomfloatrange( range * -1, range );
|
||
|
ref_ent addpitch( pitch );
|
||
|
|
||
|
yaw = randomfloatrange( range * -1, range );
|
||
|
ref_ent addyaw( yaw );
|
||
|
|
||
|
self rotateto( ref_ent.angles, 1, 0.3, 0.3 );
|
||
|
forward = anglestoforward( ref_ent.angles );
|
||
|
// Line( self.origin, self.origin + forward * 100, (1,1,1), 1, 0, 20 );
|
||
|
|
||
|
wait( 1 );
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
evil_hidden_spawner()
|
||
|
{
|
||
|
self hide();
|
||
|
self setcontents( 0 );
|
||
|
self.health = 50000;
|
||
|
ent = getstruct( "weapon_drop_org", "targetname" );
|
||
|
org = spawn_taG_origin();
|
||
|
org.origin = ent.origin;
|
||
|
org.angles = ent.angles;
|
||
|
self linkto( org, "tag_origin", (0,0,0),(0,0,0) );
|
||
|
self.team = "neutral";
|
||
|
self.ignoreme = true;
|
||
|
self.ignoreall = true;
|
||
|
animation = getgenericanim( "gundrop_death" );
|
||
|
org anim_generic_first_frame( self, "gundrop_death" );
|
||
|
|
||
|
weapon = level.player getcurrentweapon();
|
||
|
self forceUseWeapon( weapon, "primary" );
|
||
|
wait( 0.05 );
|
||
|
self unlink();
|
||
|
|
||
|
// self Detach( "weapon_m4", "tag_weapon_right" );
|
||
|
|
||
|
|
||
|
level waittill( "dropit" );
|
||
|
wait( 0.30 );
|
||
|
self SetAnim( animation, 1, 0, 0.55 );
|
||
|
wait( 0.05 );
|
||
|
self DropWeapon( weapon, "right", 50000 );
|
||
|
wait( 0.3 );
|
||
|
|
||
|
org delete();
|
||
|
self delete();
|
||
|
|
||
|
weapon_impact_org = getstruct( "weapon_impact_org", "targetname" );
|
||
|
|
||
|
delaythread( 0.20, ::play_sound_in_space, "physics_brick_default", weapon_impact_org.origin );
|
||
|
delaythread( 0.20, ::play_sound_in_space, "physics_brick_default", weapon_impact_org.origin );
|
||
|
delaythread( 0.20, ::play_sound_in_space, "physics_brick_default", weapon_impact_org.origin );
|
||
|
delaythread( 0.20, ::play_sound_in_space, "physics_brick_default", weapon_impact_org.origin );
|
||
|
delaythread( 0.20, ::play_sound_in_space, "physics_brick_default", weapon_impact_org.origin );
|
||
|
|
||
|
/*
|
||
|
wait( 0.30 );
|
||
|
self SetAnim( animation, 1, 0, 0.95 );
|
||
|
wait( 0.05 );
|
||
|
self DropWeapon( weapon, "right", 0 );
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
players_view_opens( player_rig )
|
||
|
{
|
||
|
wait( 0.5 );
|
||
|
//( linkto entity, tag, viewpercentag fraction, right arc, left arc, top arc, bottom arc, use tag angles );
|
||
|
level.player PlayerLinkToDelta( player_rig, "tag_player", 1, 0, 0, 0, 0, true );
|
||
|
wait( 3.2 - 0.5 );
|
||
|
// wait( 0.05 );
|
||
|
//LerpViewAngleClamp( time, accel time, decel time, right arc, left arc, top arc, bottom arc );
|
||
|
level.player LerpViewAngleClamp( 1, 0.5, 0.5, 17, 17, 12, 8 );
|
||
|
}
|
||
|
|
||
|
unslowmo()
|
||
|
{
|
||
|
level.forced_slowmo_breach_slowdown = false;
|
||
|
}
|
||
|
|
||
|
white_punch_screen()
|
||
|
{
|
||
|
white = create_client_overlay( "white", 0, level.player );
|
||
|
white.alpha = 1;
|
||
|
white fadeovertime( 1 );
|
||
|
white.alpha = 0;
|
||
|
wait 1;
|
||
|
white destroy();
|
||
|
}
|
||
|
|
||
|
player_gets_knocked_out_by_price( player_rig )
|
||
|
{
|
||
|
tag_origin = spawn_tag_origin();
|
||
|
tag_origin LinkTo( player_rig, "tag_player", (0,0,0), (0,0,0) );
|
||
|
|
||
|
//evil_hidden_spawner = getent( "evil_hidden_spawner", "targetname" );
|
||
|
//evil_hidden_spawner thread add_spawn_function( ::evil_hidden_spawner );
|
||
|
//evil_hidden_spawner spawn_ai();
|
||
|
|
||
|
|
||
|
thread spawn_ak47();
|
||
|
queue = gettime();
|
||
|
level.queue_time = queue;
|
||
|
level.q = level.queue_time;
|
||
|
wait( 0.5 );
|
||
|
delaythread( 0.5, ::unslowmo );
|
||
|
|
||
|
level.forced_slowmo_breach_lerpout = 2;
|
||
|
wait_for_buffer_time_to_pass( queue, 2.8 );
|
||
|
|
||
|
|
||
|
level notify( "dropit" );
|
||
|
level.player delaycall( 0.05, ::disableweapons );
|
||
|
time = 0.25;
|
||
|
level.price_breach_ent unlink();
|
||
|
level.price_breach_ent moveto( level.price_breach_struct.origin, 0.5, 0.2, 0.2 );
|
||
|
level.price_breach_ent rotateto( level.price_breach_struct.angles, 0.5, 0.2, 0.2 );
|
||
|
level.price_breach_ent notify( "stop_following_player" );
|
||
|
|
||
|
//noself_delayCall( 0.0, ::Earthquake, 0.2, 0.5, level.player.origin, 128 );
|
||
|
// Earthquake( scale, duration, source, radius );
|
||
|
noself_delayCall( 0.1, ::Earthquake, 1.0, 0.6, level.player.origin, 128 );
|
||
|
delaythread( 0.0, ::white_punch_screen );
|
||
|
// level.player delaycall( 0.1, ::SetBlurForPlayer, 20, 0 );
|
||
|
// level.player delaycall( 0.3, ::SetBlurForPlayer, 0, 1.5 );
|
||
|
// level.player delaycall( 0.5, ::SetBlurForPlayer, 0, 0.5 );
|
||
|
|
||
|
// noself_delayCall( 0.1, ::SetBlur, 2.5, 0.1 );
|
||
|
// noself_delayCall( 0.21, ::SetBlur, 0, 1 );
|
||
|
|
||
|
// level.player PlayerSetGroundReferenceEnt( tag_origin );
|
||
|
|
||
|
level.player PlayerLinkToBlend( player_rig, "tag_player", time, time * 0.4, time * 0.4 );
|
||
|
delaythread( time, ::players_view_opens, player_rig );
|
||
|
|
||
|
level notify( "breach_concludes" );
|
||
|
level.player DoDamage( 50 / level.player.damageMultiplier, level.price.origin );
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
// slow mo for a bit
|
||
|
wait_for_buffer_time_to_pass( queue, 6.7 );
|
||
|
|
||
|
//slowmo_start();
|
||
|
//slowmo_setspeed_slow( 0.1 );
|
||
|
//slowmo_setlerptime_in( 0.2 );
|
||
|
//slowmo_lerp_in();
|
||
|
|
||
|
|
||
|
// soap enters scene
|
||
|
wait_for_buffer_time_to_pass( queue, 7.3 );
|
||
|
|
||
|
//slowmo_setlerptime_out( 0.2 );
|
||
|
//slowmo_lerp_out();
|
||
|
//slowmo_end();
|
||
|
|
||
|
wait_for_buffer_time_to_pass( queue, 24.6 );
|
||
|
thread radio_dialogue( "gulag_hqr_getout" );
|
||
|
}
|
||
|
|
||
|
spawn_ak47()
|
||
|
{
|
||
|
queue = gettime();
|
||
|
wait( 4.2 );
|
||
|
ak47 = spawn( "script_model", (0,0,0) );
|
||
|
ak47.origin = (-4245.72, 1688.15, 167.671);
|
||
|
ak47.angles = (63.0343, 48.6473, -14.4095);
|
||
|
|
||
|
hide_parts = [];
|
||
|
hide_parts[ "tag_acog_2" ] = true;
|
||
|
hide_parts[ "tag_heartbeat" ] = true;
|
||
|
hide_parts[ "tag_m203" ] = true;
|
||
|
hide_parts[ "tag_red_dot_mars" ] = true;
|
||
|
hide_parts[ "tag_shotgun" ] = true;
|
||
|
hide_parts[ "tag_silencer" ] = true;
|
||
|
hide_parts[ "tag_flash_silenced" ] = true;
|
||
|
hide_parts[ "tag_motion_tracker" ] = true;
|
||
|
// hide_parts[ "tag_heartbeat" ] = true;
|
||
|
// hide_parts[ "tag_heartbeat" ] = true;
|
||
|
|
||
|
ak47 setmodel( "gulag_price_ak47" );
|
||
|
foreach ( part, _ in hide_parts )
|
||
|
{
|
||
|
//ak47 hidepart( part );
|
||
|
}
|
||
|
|
||
|
// ak47.origin = level.price gettagorigin( "tag_weapon_chest" );
|
||
|
// ak47.angles = level.price gettagangles( "tag_weapon_chest" );
|
||
|
ak47 linkto( level.price, "tag_weapon_chest", (0,0,0), (0,0,0) );
|
||
|
wait( 1.4 );
|
||
|
// ak47 unlink();
|
||
|
println( "ak update info:" );
|
||
|
println( " ak47.origin = " + ak47.origin + ";" );
|
||
|
println( " ak47.angles = " + ak47.angles + ";" );
|
||
|
|
||
|
wait_for_buffer_time_to_pass( queue, 11.3 );
|
||
|
ak47 linkto( level.price, "tag_weapon_chest", (0,0,0), (0,0,0) );
|
||
|
level.price waittill( "change_to_regular_weapon" );
|
||
|
ak47 delete();
|
||
|
}
|
||
|
|
||
|
calculate_cafe_run_distances()
|
||
|
{
|
||
|
// grab the required distances from placed ents
|
||
|
cafe_distance_trackersA = getentarray( "cafe_distance_tracker", "targetname" );
|
||
|
cafe_distance_trackersB = cafe_distance_trackersA;
|
||
|
dists = [];
|
||
|
|
||
|
foreach ( dist1 in cafe_distance_trackersA )
|
||
|
{
|
||
|
foreach ( dist2 in cafe_distance_trackersB )
|
||
|
{
|
||
|
if ( dist1 == dist2 )
|
||
|
continue;
|
||
|
|
||
|
name1 = dist1.script_parameters;
|
||
|
name2 = dist2.script_parameters;
|
||
|
dist = distance( dist1.origin, dist2.origin );
|
||
|
dists[ name1 ][ name2 ] = dist;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
level.cafe_run_distances = dists;
|
||
|
|
||
|
foreach ( ent in cafe_distance_trackersA )
|
||
|
{
|
||
|
ent delete();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
cavein_spawner_think()
|
||
|
{
|
||
|
self endon( "death" );
|
||
|
flag_wait( "enemy_cavein" ); // exploder
|
||
|
wait( 0.5 );
|
||
|
for ( ;; )
|
||
|
{
|
||
|
RadiusDamage( self.origin, 35, 10, 10 );
|
||
|
wait( 0.05 );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
new_interval()
|
||
|
{
|
||
|
wait( 10 );
|
||
|
self.interval = 64;
|
||
|
}
|
||
|
|
||
|
endlog_friendly_runout_settings()
|
||
|
{
|
||
|
self.interval = 16;
|
||
|
//self.noDodgeMove = true;
|
||
|
thread new_interval();
|
||
|
//self delaythread( 5.5, ::ramp_interval, 64, 4 );
|
||
|
// self.run_overrideanim = getgenericanim( "panic_run" );
|
||
|
self ent_flag_init( "run_into_room" );
|
||
|
self.ignoresuppression = true;
|
||
|
self.animplaybackrate = 1;
|
||
|
self.moveTransitionRate = 1;
|
||
|
self.moveplaybackrate = 1;
|
||
|
self.sideStepRate = 1.35;
|
||
|
self pushplayer( true );
|
||
|
self.dontavoidplayer = true;
|
||
|
self disable_ai_color();
|
||
|
self.disablearrivals = true;
|
||
|
self.goalradius = 45;
|
||
|
self.pathrandompercent = 0;
|
||
|
self.walkdist = 16;
|
||
|
self.walkdistFacingMotion = 16;
|
||
|
|
||
|
if ( self.animname == "redshirt" )
|
||
|
{
|
||
|
self waittillmatch( "single anim", "end" );
|
||
|
self.moveplaybackrate = 1.1;
|
||
|
wait( 1 );
|
||
|
self.moveplaybackrate = 1.0;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
if ( self.animname == "soap" )
|
||
|
{
|
||
|
self waittillmatch( "single anim", "end" );
|
||
|
wait( 8 );
|
||
|
self.moveplaybackrate = 0.96;
|
||
|
wait( 12 );
|
||
|
self.moveplaybackrate = 1.0;
|
||
|
}
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
ramp_interval( num, time )
|
||
|
{
|
||
|
frames = time * 20;
|
||
|
for ( i = 0; i < frames; i++ )
|
||
|
{
|
||
|
dif = i / frames;
|
||
|
self.interval = num * dif;
|
||
|
wait( 0.05 );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
gulag_glass_shatter()
|
||
|
{
|
||
|
default_delay = 0.3;
|
||
|
delays = [];
|
||
|
delays[ 0 ] = default_delay;
|
||
|
delays[ 1 ] = default_delay;
|
||
|
delays[ 2 ] = default_delay;
|
||
|
delays[ 3 ] = default_delay;
|
||
|
delays[ 4 ] = default_delay;
|
||
|
|
||
|
index = 0;
|
||
|
|
||
|
struct = getstruct( "glass_shatter_struct", "targetname" );
|
||
|
for ( ;; )
|
||
|
{
|
||
|
RadiusDamage( struct.origin, 64, 350, 250 );
|
||
|
delay = delays[ index ];
|
||
|
index++;
|
||
|
|
||
|
if ( !isdefined( delay ) )
|
||
|
{
|
||
|
delay = randomfloatrange( 0.3, 1.5 );
|
||
|
}
|
||
|
|
||
|
wait( delay );
|
||
|
|
||
|
if ( !isdefined( struct.target ) )
|
||
|
return;
|
||
|
struct = getstruct( struct.target, "targetname" );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
evac_slowmo()
|
||
|
{
|
||
|
wait( 3.5 );
|
||
|
slowmo_start();
|
||
|
|
||
|
slowmo_setspeed_slow( 0.4 );
|
||
|
slowmo_setlerptime_in( 0.05 );
|
||
|
slowmo_lerp_in();
|
||
|
|
||
|
/*
|
||
|
//wait( 8 );
|
||
|
|
||
|
//wait( 1.75 );
|
||
|
wait( 1.1 );
|
||
|
|
||
|
slowmo_setspeed_slow( 0.8 );
|
||
|
slowmo_setlerptime_in( 0.05 );
|
||
|
slowmo_lerp_in();
|
||
|
|
||
|
wait( 0.5 );
|
||
|
//wait( 3 );
|
||
|
|
||
|
slowmo_setspeed_slow( 0.4 );
|
||
|
slowmo_setlerptime_in( 0.05 );
|
||
|
slowmo_lerp_in();
|
||
|
|
||
|
wait ( 3 - 1.6 );
|
||
|
*/
|
||
|
wait( 3 );
|
||
|
|
||
|
|
||
|
outblend = 0.5;
|
||
|
level notify( "blend_out_dof", outblend );
|
||
|
slowmo_setlerptime_in( outblend );
|
||
|
|
||
|
slowmo_lerp_out();
|
||
|
|
||
|
slowmo_end();
|
||
|
}
|
||
|
|
||
|
evac_dof()
|
||
|
{
|
||
|
start = level.dofDefault;
|
||
|
dof_all_blur = [];
|
||
|
dof_all_blur[ "nearStart" ] = 50;
|
||
|
dof_all_blur[ "nearEnd" ] = 100;
|
||
|
dof_all_blur[ "nearBlur" ] = 10;
|
||
|
dof_all_blur[ "farStart" ] = 100;
|
||
|
dof_all_blur[ "farEnd" ] = 200;
|
||
|
dof_all_blur[ "farBlur" ] = 4;
|
||
|
level.dofDefault = dof_all_blur;
|
||
|
|
||
|
wait( 1.25 );
|
||
|
|
||
|
dof_see_price = [];
|
||
|
dof_see_price[ "nearStart" ] = 1;
|
||
|
dof_see_price[ "nearEnd" ] = 1;
|
||
|
dof_see_price[ "nearBlur" ] = 4;
|
||
|
dof_see_price[ "farStart" ] = 100;
|
||
|
dof_see_price[ "farEnd" ] = 200;
|
||
|
dof_see_price[ "farBlur" ] = 4;
|
||
|
thread blend_dof( dof_all_blur, dof_see_price, 0.9 );
|
||
|
|
||
|
wait( 1.5 );
|
||
|
|
||
|
dof_see_soap = [];
|
||
|
dof_see_soap[ "nearStart" ] = 0;
|
||
|
dof_see_soap[ "nearEnd" ] = 150;
|
||
|
dof_see_soap[ "nearBlur" ] = 10;
|
||
|
dof_see_soap[ "farStart" ] = 300;
|
||
|
dof_see_soap[ "farEnd" ] = 800;
|
||
|
dof_see_soap[ "farBlur" ] = 4;
|
||
|
thread blend_dof( dof_see_price, dof_see_soap, 0.3 );
|
||
|
|
||
|
level waittill( "blend_out_dof", outblend );
|
||
|
thread blend_dof( dof_see_soap, start, outblend );
|
||
|
|
||
|
}
|
||
|
|
||
|
die_soon()
|
||
|
{
|
||
|
self endon( "death" );
|
||
|
wait( RandomFloat( 3 ) );
|
||
|
self.dieQuietly = true;
|
||
|
self Kill();
|
||
|
}
|
||
|
|
||
|
soap_talks_to_heli()
|
||
|
{
|
||
|
/*
|
||
|
// Viper Six-Four, this is Bravo Six Actual! We're trapped in the mess hall at the northeast corner of the gulag, depth 100 meters!!! I need a four-point SPIE rig for emergency extraction over!
|
||
|
level.soap anim_single_solo( level.soap, "gulag_cmt_depth100" );
|
||
|
|
||
|
// Roger on the SPIE rig - we're on the way, give us fifteen seconds.
|
||
|
radio_dialogue( "gulag_plp_15secs" );
|
||
|
|
||
|
// We'll be dead in five!!! Move your arse man!!!
|
||
|
level.soap dialogue_queue( "gulag_cmt_deadinfive" );
|
||
|
|
||
|
level waittill( "more_soap_dialogue" );
|
||
|
*/
|
||
|
wait( 0.5 );
|
||
|
|
||
|
// Six-Four, where the hell are you, over?!!!!
|
||
|
// level.soap dialogue_queue( "gulag_cmt_whereareyou" );
|
||
|
wait( 2.8 );
|
||
|
// wait( 3.2 );
|
||
|
// Bravo Six, there's too much smoke, I can't see you I can't see you -
|
||
|
radio_dialogue( "gulag_plp_cantsee" );
|
||
|
}
|
||
|
|
||
|
set_new_ending_fx_dists()
|
||
|
{
|
||
|
level.ending_fx_min_dist = 0;
|
||
|
level.ending_fx_max_dist = 800;
|
||
|
level.ending_fx_dot = 0.3;
|
||
|
}
|
||
|
|
||
|
cafe_falls_apart()
|
||
|
{
|
||
|
thread fx_become_more_intense();
|
||
|
thread earthquake_buildup();
|
||
|
|
||
|
maps\_utility::fog_set_changes( "gulag_cafe_falls_apart", 5 );
|
||
|
/*
|
||
|
wait( 8 );
|
||
|
black_overlay = create_client_overlay( "black", 0, level.player );
|
||
|
black_overlay.alpha = 0;
|
||
|
black_overlay fadeOverTime( 3 );
|
||
|
black_overlay.alpha = 1;
|
||
|
level waittill( "stop_cavein" );
|
||
|
wait( 0.05 );
|
||
|
black_overlay destroy();
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
earthquake_buildup()
|
||
|
{
|
||
|
level notify( "stop_minor_earthquakes" );
|
||
|
time = gettime();
|
||
|
|
||
|
wait_for_buffer_time_to_pass( time, 2.9 );
|
||
|
quake( 0.3, 1.4, level.soap.origin, 5000 );
|
||
|
|
||
|
wait_for_buffer_time_to_pass( time, 4.2 );
|
||
|
thread player_ending_cavein();
|
||
|
|
||
|
wait_for_buffer_time_to_pass( time, 6.45 );
|
||
|
|
||
|
quake( 0.45, 4, level.soap.origin, 5000 );
|
||
|
wait( 1 );
|
||
|
quake( 0.45, 3, level.player.origin, 5000 );
|
||
|
}
|
||
|
|
||
|
quake_rumble()
|
||
|
{
|
||
|
if ( flag( "controlled_player_rumble" ) )
|
||
|
return;
|
||
|
|
||
|
level.player endon( "death" );
|
||
|
|
||
|
rumbles = [];
|
||
|
rumbles[ rumbles.size ] = "heavy_1s";
|
||
|
rumbles[ rumbles.size ] = "heavy_2s";
|
||
|
rumbles[ rumbles.size ] = "heavy_1s";
|
||
|
rumbles[ rumbles.size ] = "heavy_2s";
|
||
|
rumbles[ rumbles.size ] = "heavy_3s";
|
||
|
rumbles[ rumbles.size ] = "light_1s";
|
||
|
rumbles[ rumbles.size ] = "light_2s";
|
||
|
rumbles[ rumbles.size ] = "light_1s";
|
||
|
rumbles[ rumbles.size ] = "light_2s";
|
||
|
rumbles[ rumbles.size ] = "light_1s";
|
||
|
rumbles[ rumbles.size ] = "light_2s";
|
||
|
rumbles[ rumbles.size ] = "light_1s";
|
||
|
rumbles[ rumbles.size ] = "light_2s";
|
||
|
rumbles[ rumbles.size ] = "light_3s";
|
||
|
rumbles[ rumbles.size ] = "light_3s";
|
||
|
|
||
|
rumble = random( rumbles );
|
||
|
vec = randomvector( 1700 );
|
||
|
PlayRumbleOnPosition( rumble, level.player.origin + vec );
|
||
|
}
|
||
|
|
||
|
quake( mag, duration, org, range )
|
||
|
{
|
||
|
//vec = randomvector( 5 );
|
||
|
//PlayRumbleOnPosition( "heavy_3s", level.player.origin + vec );
|
||
|
thread quake_rumble();
|
||
|
|
||
|
|
||
|
Earthquake( mag, duration, org, range );
|
||
|
level notify( "swing", mag );
|
||
|
|
||
|
// artillery sound
|
||
|
angles = ( randomint( 360 ), randomint( 360 ), randomint( 360 ) );
|
||
|
forward = anglestoforward( angles );
|
||
|
range = randomfloatrange( 500, 1000 );
|
||
|
location = level.player.origin + forward * range;
|
||
|
thread play_sound_in_space( "exp_artillery_underground", location );
|
||
|
}
|
||
|
|
||
|
fx_become_more_intense()
|
||
|
{
|
||
|
time = 7;
|
||
|
min = 0.01;
|
||
|
max = level.fx_fall_time;
|
||
|
range = max - min;
|
||
|
|
||
|
frames = time * 20;
|
||
|
|
||
|
for ( i = 0; i < frames; i++ )
|
||
|
{
|
||
|
dif = i / frames;
|
||
|
dif = 1 - dif;
|
||
|
level.fx_fall_time = min + range * dif;
|
||
|
wait( 0.05 );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
cafe_lights_explode()
|
||
|
{
|
||
|
wait( 3 );
|
||
|
light_destructibles = getentarray( "light_destructible", "script_noteworthy" );
|
||
|
array_thread( light_destructibles, ::light_destructible_think );
|
||
|
}
|
||
|
|
||
|
player_pushes_slab()
|
||
|
{
|
||
|
if ( flag( "time_to_evac" ) )
|
||
|
return;
|
||
|
level endon( "time_to_evac" );
|
||
|
|
||
|
for ( ;; )
|
||
|
{
|
||
|
flag_wait( "player_pushes_slab" );
|
||
|
level.player disableweapons();
|
||
|
flag_waitopen( "player_pushes_slab" );
|
||
|
level.player enableweapons();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
rubble_think()
|
||
|
{
|
||
|
if ( level.start_point == "evac" )
|
||
|
return;
|
||
|
|
||
|
offset = 240;
|
||
|
self connectpaths();
|
||
|
self.origin += ( 0, 0, offset * -1 );
|
||
|
|
||
|
self hide();
|
||
|
self notsolid();
|
||
|
|
||
|
flag_wait( "enter_final_room" );
|
||
|
wait( 4 );
|
||
|
exploder( "cafeteria_collapse" );
|
||
|
chase_brush = getent( "chase_brush", "targetname" );
|
||
|
chase_brush unlink();
|
||
|
thread player_touch_kill();
|
||
|
self show();
|
||
|
self solid();
|
||
|
self moveto( self.origin + (0,0,offset), 4, 1, 3 );
|
||
|
chase_brush moveto( chase_brush.origin + (0,0,-300), 4, 2 );
|
||
|
wait( 4 );
|
||
|
level notify( "stop_chase_fx" );
|
||
|
chase_brush delete();
|
||
|
self disconnectpaths();
|
||
|
|
||
|
}
|
||
|
|
||
|
player_touch_kill()
|
||
|
{
|
||
|
level endon( "stop_chase_fx" );
|
||
|
for ( ;; )
|
||
|
{
|
||
|
if ( level.player istouching( self ) )
|
||
|
RadiusDamage( level.player.origin, 35, 10, 5 );
|
||
|
wait( 0.05 );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
hunted_hanging_light()
|
||
|
{
|
||
|
fx = getfx( "gulag_cafe_spotlight" );
|
||
|
tag_origin = spawn_tag_origin();
|
||
|
|
||
|
tag_origin LinkTo( self.lamp, "j_hanging_light_04", (0,0,-32), (0,0,0) );
|
||
|
PlayFXOnTag( fx, tag_origin, "tag_origin" );
|
||
|
|
||
|
flag_wait( "time_to_evac" );
|
||
|
stopFXOnTag( fx, tag_origin, "tag_origin" );
|
||
|
}
|
||
|
|
||
|
swing_light_org_think()
|
||
|
{
|
||
|
lamp = spawn_anim_model( "lamp" );
|
||
|
lamp thread lamp_animates( self );
|
||
|
}
|
||
|
|
||
|
swing_light_org_off_think()
|
||
|
{
|
||
|
lamp = spawn_anim_model( "lamp_off" );
|
||
|
lamp thread lamp_animates( self );
|
||
|
}
|
||
|
|
||
|
lamp_animates( root )
|
||
|
{
|
||
|
root.lamp = self;
|
||
|
self.animname = "lamp"; // uses one set of anims
|
||
|
self.origin = root.origin;
|
||
|
self dontcastshadows();
|
||
|
|
||
|
// cant blend to the same anim
|
||
|
odd = true;
|
||
|
anims = [];
|
||
|
anims[ 0 ] = self getanim( "swing" );
|
||
|
anims[ 1 ] = self getanim( "swing_dup" );
|
||
|
|
||
|
thread lamp_rotates_yaw();
|
||
|
|
||
|
for ( ;; )
|
||
|
{
|
||
|
level waittill( "swing", mag );
|
||
|
animation = anims[ odd ];
|
||
|
off = !odd;
|
||
|
self SetAnimRestart( animation, 1, 0.3, 1 );
|
||
|
wait( 2.5 );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
lamp_rotates_yaw()
|
||
|
{
|
||
|
ent = spawn_tag_origin();
|
||
|
|
||
|
for ( ;; )
|
||
|
{
|
||
|
yaw = randomfloatrange( -30, 30 );
|
||
|
ent addyaw( yaw );
|
||
|
time = randomfloatrange( 0.5, 1.5 );
|
||
|
self rotateto( ent.angles, time, time * 0.4, time * 0.4 );
|
||
|
wait( time );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
swap_world_fx()
|
||
|
{
|
||
|
wait( 3 );
|
||
|
flag_clear( "enable_endlog_fx" );
|
||
|
flag_clear( "disable_exterior_fx" );
|
||
|
}
|
||
|
|
||
|
orient_player_to_rig( player_rig )
|
||
|
{
|
||
|
tag_origin = spawn_tag_origin();
|
||
|
// angles = player_rig gettagangles( "tag_player" );
|
||
|
// origin = player_rig gettagorigin( "tag_player" );
|
||
|
tag_origin.origin = level.player.origin;
|
||
|
tag_origin.angles = level.player.angles;
|
||
|
wait( 0.05 );
|
||
|
level.player PlayerSetGroundReferenceEnt( tag_origin );
|
||
|
wait( 5 );
|
||
|
wait( 0.05 );
|
||
|
tag_origin LinkToBlendToTag( player_rig, "tag_player", false );
|
||
|
// tag_origin linkto( player_rig, "tag_player", (0,0,0),(0,0,0) );
|
||
|
// tag_origin thread maps\_debug::drawtagforever( "tag_origin" );
|
||
|
}
|
||
|
|
||
|
map_spawners_to_starts( orgs )
|
||
|
{
|
||
|
|
||
|
spawner = GetEnt( "price_spawner", "targetname" );
|
||
|
spawner.origin = orgs[ "price" ].origin;
|
||
|
spawner.angles = orgs[ "price" ].angles;
|
||
|
spawner spawn_ai();
|
||
|
|
||
|
spawner = GetEnt( "endlog_soap_spawner", "targetname" );
|
||
|
spawner.origin = orgs[ "soap" ].origin;
|
||
|
spawner.angles = orgs[ "soap" ].angles;
|
||
|
spawner spawn_ai();
|
||
|
|
||
|
spawner = getentarray( "endlog_redshirt_spawner", "targetname" )[ 0 ];
|
||
|
spawner.origin = orgs[ "redshirt" ].origin;
|
||
|
spawner.angles = orgs[ "redshirt" ].angles;
|
||
|
spawner spawn_ai();
|
||
|
}
|
||
|
|
||
|
set_cafeteria_spotlight_dvars()
|
||
|
{
|
||
|
|
||
|
setsaveddvar( "r_spotlightbrightness", "1.2" );
|
||
|
setsaveddvar( "r_spotlightendradius", "1200" );
|
||
|
setsaveddvar( "r_spotlightstartradius", "50" );
|
||
|
setsaveddvar( "r_spotlightfovinnerfraction", "0.8" );
|
||
|
setsaveddvar( "r_spotlightexponent", "2" );
|
||
|
|
||
|
}
|
||
|
|
||
|
player_gets_hit_by_rock()
|
||
|
{
|
||
|
if ( flag( "time_to_evac" ) )
|
||
|
return;
|
||
|
|
||
|
vec = randomvector( 16 );
|
||
|
vec = set_z( vec, 80 );
|
||
|
if ( level.player.health > 80 )
|
||
|
level.player DoDamage( 15 / level.player.damagemultiplier, level.player.origin + vec );
|
||
|
}
|
||
|
|
||
|
blend_in_player_movespeed()
|
||
|
{
|
||
|
time = 2.5;
|
||
|
dif = time / 20;
|
||
|
|
||
|
for ( i = 0; i <= 1; i+= dif )
|
||
|
{
|
||
|
level.player SetMoveSpeedScale( i );
|
||
|
wait( 0.05 );
|
||
|
}
|
||
|
}
|