1015 lines
26 KiB
Plaintext
1015 lines
26 KiB
Plaintext
#include maps\_utility;
|
||
#include maps\_vehicle;
|
||
#include maps\_vehicle_spline;
|
||
#include maps\_anim;
|
||
#include maps\_hud_util;
|
||
#include maps\gulag_ending_code;
|
||
#include common_scripts\utility;
|
||
|
||
/*QUAKED script_origin_pillar1 (1 0.7 0.1) (-32 -32 0) (32 32 94)*/
|
||
/*QUAKED script_origin_pillar2 (0.9 0.75 0.1) (-32 -32 0) (32 32 96)*/
|
||
|
||
endlog_common()
|
||
{
|
||
level.default_sprint = GetDvar( "player_sprintSpeedScale" );
|
||
add_start( "run", ::start_run, "run", ::gulag_run_for_it );
|
||
add_start( "cafe", ::start_cafeteria, "cafe", ::gulag_cafeteria );
|
||
add_start( "evac", ::start_evac, "evac", ::gulag_evac );
|
||
|
||
waittillframeend;// for _load
|
||
|
||
/#
|
||
if ( IsDefined( level.stop_load ) )
|
||
{
|
||
if ( GetDvar( "createfx" ) == "" )
|
||
maps\_global_fx::main();
|
||
return;
|
||
}
|
||
#/
|
||
|
||
|
||
cafe_ceiling_chunks = GetEntArray( "cafe_ceiling_chunk", "targetname" );
|
||
array_thread( cafe_ceiling_chunks, ::self_delete );
|
||
|
||
cafe_ceiling_chunk_smalls = GetEntArray( "cafe_ceiling_chunk_small", "targetname" );
|
||
array_thread( cafe_ceiling_chunk_smalls, ::self_delete );
|
||
|
||
cafe_ceiling_pristines = GetEntArray( "cafe_ceiling_pristine", "targetname" );
|
||
array_thread( cafe_ceiling_pristines, ::self_delete );
|
||
|
||
rubble = GetEnt( "cafeteria_hallway_rubble", "targetname" );
|
||
rubble thread rubble_think();
|
||
|
||
|
||
|
||
maps\gulag_ending_anim::gulag_ending_anim_main();
|
||
|
||
level._effect[ "breach_door" ] = LoadFX( "explosions/breach_wall_concrete" );
|
||
level._effect[ "flashlight" ] = LoadFX( "misc/flashlight" );
|
||
level._pipe_fx_time = 2.5;
|
||
|
||
hookup_rope_ent = GetEnt( "hookup_rope_ent", "targetname" );
|
||
if ( IsDefined( hookup_rope_ent ) )
|
||
hookup_rope_ent Delete();
|
||
|
||
|
||
flag_init( "player_approaches_rescue_breach" );
|
||
flag_init( "intro_helis_go" );
|
||
flag_init( "player_near_tv" );
|
||
flag_init( "stop_tv_loop" );
|
||
flag_init( "f15s_spawn" );
|
||
flag_init( "anti_air_missiles_fire" );
|
||
flag_init( "aa_hit" );
|
||
flag_init( "f15s_attack" );
|
||
flag_init( "player_heli_uses_modified_yaw" );
|
||
flag_init( "intro_helis_spawned" );
|
||
flag_init( "player_lands" );
|
||
flag_init( "cell_door1" );
|
||
flag_init( "cell_door2" );
|
||
flag_init( "cell_door3" );
|
||
flag_init( "cell_door4" );
|
||
flag_init( "cell_door_weapons" );
|
||
flag_init( "access_control_room" );
|
||
flag_init( "going_in_hot" );
|
||
flag_init( "gulag_cell_doors_enabled" );
|
||
flag_init( "player_exited_bathroom" );
|
||
flag_init( "player_rappels_from_bathroom" );
|
||
flag_init( "rope_drops_now" );
|
||
flag_init( "cell_duty" );
|
||
flag_init( "cellblock_player_starts_rappel" );
|
||
flag_init( "bathroom_second_wave_trigger" );
|
||
flag_init( "player_died_to_cave_in" );
|
||
flag_init( "match_up_for_final_room" );
|
||
flag_init( "rescue_begins" );
|
||
flag_init( "time_to_evac" );
|
||
flag_init( "enable_interior_fx" );
|
||
flag_init( "enable_endlog_fx" );
|
||
flag_init( "player_falls_down" );
|
||
flag_init( "player_evac" );
|
||
flag_init( "controlled_player_rumble" );
|
||
flag_init( "evac_begins" );
|
||
//flag_init( "exit_collapses" );
|
||
|
||
PreCacheItem( "smoke_grenade_american" );
|
||
PreCacheItem( "armory_grenade" );
|
||
PreCacheItem( "m4m203_reflex_arctic" );
|
||
PreCacheItem( "f15_sam" );
|
||
PreCacheItem( "sam" );
|
||
PreCacheItem( "stinger" );
|
||
PreCacheItem( "cobra_seeker" );
|
||
PreCacheItem( "rpg_straight" );
|
||
PreCacheItem( "cobra_Sidewinder" );
|
||
PreCacheItem( "claymore" );
|
||
PreCacheItem( "mp5_silencer_reflex" );
|
||
PreCacheTurret( "heli_spotlight" );
|
||
PreCacheTurret( "player_view_controller" );
|
||
|
||
PreCacheRumble( "heavy_1s" );
|
||
PreCacheRumble( "heavy_2s" );
|
||
PreCacheRumble( "heavy_3s" );
|
||
|
||
PreCacheRumble( "light_1s" );
|
||
PreCacheRumble( "light_2s" );
|
||
PreCacheRumble( "light_3s" );
|
||
|
||
PreCacheItem( "m14_scoped_arctic" );
|
||
PreCacheItem( "fraggrenade" );
|
||
PreCacheItem( "flash_grenade" );
|
||
PreCacheItem( "claymore" );
|
||
|
||
PreCacheModel( "com_emergencylightcase_blue" );
|
||
PreCacheModel( "com_emergencylightcase" );
|
||
// PreCacheModel( "rappelrope100_le_obj" );
|
||
PreCacheModel( "com_drop_rope_obj" );
|
||
PreCacheModel( "com_blackhawk_spotlight_on_mg_setup" );
|
||
PreCacheModel( "com_floodlight" );
|
||
PreCacheModel( "ch_street_wall_light_01_on" );
|
||
PreCacheModel( "ch_street_wall_light_01_off" );
|
||
PreCacheItem( "m4m203_acog" );
|
||
|
||
// thread handle_gulag_world_fx();
|
||
// level thread init_tv_movies();
|
||
// thread gulag_music();
|
||
|
||
thread calculate_cafe_run_distances();
|
||
|
||
turnaround_triggers = GetEntArray( "turnaround_trigger", "targetname" );
|
||
array_thread( turnaround_triggers, ::turnaround_trigger_think );
|
||
|
||
ceiling_collapses = GetEntArray( "ceiling_collapse", "targetname" );
|
||
array_thread( ceiling_collapses, ::ceiling_collapse_think );
|
||
|
||
|
||
chase_brush = GetEnt( "chase_brush", "targetname" );
|
||
chase_brush Hide();
|
||
chase_brush ConnectPaths();
|
||
|
||
spawner = GetEnt( "price_spawner", "targetname" );
|
||
spawner thread add_spawn_function( ::become_price );
|
||
|
||
set_friendly_endpoint = getstruct( "set_friendly_endpoint", "targetname" );
|
||
set_friendly_endpoint thread set_friendly_endpoint_think();
|
||
|
||
array_spawn_function_targetname( "endlog_redshirt_spawner", ::become_redshirt );
|
||
|
||
ending_window_littlebird = GetEnt( "ending_window_littlebird", "script_noteworthy" );
|
||
ending_window_littlebird add_spawn_function( ::ending_window_littlebird );
|
||
|
||
delete_trees = GetEntArray( "delete_tree", "targetname" );
|
||
array_thread( delete_trees, ::delete_tree_think );
|
||
|
||
thread file_cabinet_show();
|
||
//thread pillar_anim_show();
|
||
|
||
|
||
flag_wait( "rescue_begins" );
|
||
|
||
evac_rock = GetEnt( "evac_rock", "targetname" );
|
||
evac_rock NotSolid();
|
||
|
||
swing_light_orgs = getstructarray( "swing_light_org", "targetname" );
|
||
array_thread( swing_light_orgs, ::swing_light_org_think );
|
||
|
||
swing_light_orgs = getstructarray( "swing_light_org_off", "targetname" );
|
||
array_thread( swing_light_orgs, ::swing_light_org_off_think );
|
||
|
||
run_thread_on_noteworthy( "hunted_hanging_light", ::hunted_hanging_light );
|
||
|
||
|
||
flag_clear( "enable_interior_fx" );
|
||
flag_set( "enable_endlog_fx" );
|
||
remove_global_spawn_function( "allies", ::enable_cqbwalk );
|
||
|
||
thread player_pushes_slab();
|
||
|
||
ambient_flicker_lights = GetEntArray( "ambient_flicker_light", "targetname" );
|
||
array_thread( ambient_flicker_lights, ::ambient_flicker_light_think );
|
||
|
||
friendly_car_slide_trigger = GetEnt( "friendly_car_slide_trigger", "targetname" );
|
||
friendly_car_slide_trigger thread friendly_car_slide_trigger();
|
||
|
||
trigger_damages = GetEntArray( "trigger_damage", "targetname" );
|
||
array_thread( trigger_damages, ::trigger_damage_think );
|
||
|
||
battlechatter_off( "allies" );
|
||
battlechatter_off( "axis" );
|
||
|
||
flag_wait( "escape_the_gulag" );
|
||
stumble_triggers = GetEntArray( "stumble_trigger", "targetname" );
|
||
array_thread( stumble_triggers, ::stumble_trigger_think );
|
||
|
||
}
|
||
|
||
|
||
start_run()
|
||
{
|
||
flag_set( "rescue_begins" );
|
||
|
||
spawners = [];
|
||
spawner = GetEnt( "price_spawner", "targetname" );
|
||
spawners[ spawners.size ] = spawner;
|
||
|
||
spawner = GetEnt( "endlog_soap_spawner", "targetname" );
|
||
spawners[ spawners.size ] = spawner;
|
||
|
||
spawner = GetEntArray( "endlog_redshirt_spawner", "targetname" )[ 0 ];
|
||
spawners[ spawners.size ] = spawner;
|
||
|
||
guys = array_spawn( spawners );
|
||
player_org = getstruct( "ending_breach_org", "targetname" );
|
||
|
||
level.player SetOrigin( player_org.origin );
|
||
level.player SetPlayerAngles( player_org.angles );
|
||
gulag_player_loadout();
|
||
|
||
player_org thread anim_single( guys, "price_rescue" );
|
||
wait( 0.05 );
|
||
foreach ( guy in guys )
|
||
{
|
||
animation = guy getanim( "price_rescue" );
|
||
guy SetAnimTime( animation, 0.75 );
|
||
}
|
||
|
||
}
|
||
|
||
gulag_run_for_it()
|
||
{
|
||
if ( level.script == "endlog" || level.start_point == "run" )
|
||
wait( 0.05 );
|
||
|
||
set_cafeteria_spotlight_dvars();
|
||
|
||
// make the AI keep going if you try to stop them with ADS
|
||
SetSavedDvar( "ai_friendlyFireBlockDuration", 0 );
|
||
|
||
thread minor_earthquakes();
|
||
|
||
hillside_brushmodels = GetEntArray( "hillside_brushmodel", "targetname" );
|
||
foreach ( ent in hillside_brushmodels )
|
||
{
|
||
ent Hide();
|
||
}
|
||
|
||
hillside_models = GetEntArray( "hillside_model", "targetname" );
|
||
foreach ( ent in hillside_models )
|
||
{
|
||
ent Hide();
|
||
}
|
||
|
||
// level.player FreezeControls( true );
|
||
// Task Force be advised, they've started the bombardment early <20> get the hell out of there now!
|
||
|
||
// level.player FreezeControls( false );
|
||
|
||
orgs = getstructarray( "friendly_escape_org", "targetname" );
|
||
orgs = array_index_by_parameters( orgs );
|
||
|
||
//level.player AllowSprint( false );
|
||
ai = GetAIArray( "allies" );
|
||
colors = [];
|
||
colors[ "soap" ] = ( 0, 1, 1 );
|
||
colors[ "price" ] = ( 1.000000, 0.501961, 0.000000 );
|
||
colors[ "redshirt" ] = ( 1.000000, 0.000000, 0.501961 );
|
||
|
||
foreach ( guy in ai )
|
||
{
|
||
guy thread endlog_friendly_runout_settings();
|
||
guy thread maps\_spawner::go_to_node( orgs[ guy.animname ], "struct" );
|
||
//guy thread my_color_trail( colors[ guy.animname ] );
|
||
}
|
||
|
||
//thread chase_train(); // the cave in chases you
|
||
|
||
thread ending_run_fx();
|
||
thread cafe_fx();
|
||
|
||
flag_init( "modify_ai_moveplaybackrate" );
|
||
delayThread( 11.5, ::flag_set, "modify_ai_moveplaybackrate" );
|
||
thread moderate_ai_moveplaybackrate();
|
||
|
||
|
||
activate_trigger_with_targetname( "friendly_escape_trigger" );
|
||
|
||
// Go go go!
|
||
level.soap delayThread( 5, ::dialogue_queue, "gulag_cmt_gogogo1" );
|
||
|
||
|
||
autosave_by_name( "run_autosave" );
|
||
|
||
wait( 1 );
|
||
|
||
ending_window_littlebird = GetEnt( "ending_window_littlebird", "script_noteworthy" );
|
||
targ = getstruct( ending_window_littlebird.target, "targetname" );
|
||
ending_window_littlebird.origin = targ.origin;
|
||
|
||
|
||
flag_wait( "there_is_chopper" );
|
||
|
||
// There<72>s the chopper!!! Get ready to jump!!!
|
||
level.soap thread dialogue_queue( "gulag_cmt_ready2jump" );
|
||
|
||
flag_wait( "exit_collapses" );
|
||
|
||
// Ahh, bollocks!!! Go back go back!!! We'll find another way out!!!
|
||
level.soap delayThread( 1.5, ::dialogue_queue, "gulag_cmt_anotherway" );
|
||
|
||
noself_delayCall( 1.5, ::setsaveddvar, "player_sprintSpeedScale", level.default_sprint );
|
||
SetSavedDvar( "player_sprintUnlimited", 1 );
|
||
|
||
flag_set( "soap_speed_boost" );
|
||
level.max_rocks = 1;
|
||
quake( 0.25, 4, level.price.origin, 5000 );
|
||
|
||
thread chase_train();// the cave in chases you
|
||
wait( 0.2 );
|
||
|
||
orgs = getstructarray( "friendly_changedirection_org", "targetname" );
|
||
orgs = array_index_by_parameters( orgs );
|
||
|
||
ducks = [];
|
||
ducks[ "soap" ] = "reaction_180";
|
||
ducks[ "redshirt" ] = "reaction_180";
|
||
//ducks[ ducks.size ] = "run_180";
|
||
index = 0;
|
||
|
||
waits = [];
|
||
waits[ "soap" ] = 0.0;
|
||
waits[ "redshirt" ] = 0.45;
|
||
waits[ "price" ] = 0.4;
|
||
|
||
guys = [];
|
||
guys[ "soap" ] = level.soap;
|
||
guys[ "redshirt" ] = level.redshirt;
|
||
guys[ "price" ] = level.price;
|
||
|
||
foreach ( animname, guy in guys )
|
||
{
|
||
wait_time = waits[ animname ];
|
||
duck = ducks[ animname ];
|
||
guy delayThread( wait_time, maps\_spawner::go_to_node, orgs[ animname ], "struct" );
|
||
if ( IsDefined( duck ) )
|
||
{
|
||
guy delayThread( wait_time, ::anim_generic_run, guy, duck );
|
||
}
|
||
}
|
||
|
||
/*
|
||
for ( i = 0; i < guys.size; i++ )
|
||
{
|
||
guy = guys[ i ];
|
||
guy thread maps\_spawner::go_to_node( orgs[ guy.animname ], "struct" );
|
||
|
||
if ( IsDefined( ducks[ index ] ) )
|
||
{
|
||
guy thread anim_generic_run( guy, ducks[ index ] );
|
||
}
|
||
|
||
time = waits[ index ];
|
||
if ( IsDefined( time ) )
|
||
wait( time );
|
||
index++;
|
||
}
|
||
*/
|
||
|
||
wait( 1 );
|
||
level.max_rocks = 4;
|
||
|
||
/*
|
||
foreach ( guy in ai )
|
||
{
|
||
guy.sprint = true;
|
||
}
|
||
*/
|
||
|
||
|
||
set_cafeteria_spotlight_dvars();
|
||
flag_wait( "enter_final_room" );// ai trigger this
|
||
|
||
thread cafe_lights_explode();
|
||
}
|
||
|
||
start_endshow()
|
||
{
|
||
soap_spawner = GetEnt( "endlog_soap_spawner", "targetname" );
|
||
soap = soap_spawner spawn_ai();
|
||
|
||
price_spawner = GetEnt( "price_spawner", "targetname" );
|
||
price = price_spawner spawn_ai();
|
||
|
||
redshirt_spawner = GetEntArray( "endlog_redshirt_spawner", "targetname" );
|
||
soldier = redshirt_spawner[ 0 ] spawn_ai();
|
||
|
||
player = spawn_anim_model( "player_rig" );
|
||
|
||
guys = [];
|
||
guys[ guys.size ] = soap;
|
||
guys[ guys.size ] = price;
|
||
guys[ guys.size ] = soldier;
|
||
guys[ guys.size ] = player;
|
||
|
||
soap.animname = "gulag_end_animatic_soap";
|
||
price.animname = "gulag_end_animatic_price";
|
||
soldier.animname = "gulag_end_animatic_soldier";
|
||
player.animname = "player_rig";
|
||
|
||
create_dvar( "altview", 0 );
|
||
|
||
if ( GetDvarInt( "altview" ) )
|
||
{
|
||
level.player SetOrigin( ( -4594, -765, 240 - 60 ) );
|
||
level.player SetPlayerAngles( ( -21, -88, 0 ) );
|
||
}
|
||
else
|
||
{
|
||
level.player PlayerLinkToBlend( player, "tag_player", 0, 0, 0 );
|
||
}
|
||
|
||
level.player TakeAllWeapons();
|
||
|
||
|
||
ent = GetEnt( "mound_scene_export", "targetname" );
|
||
for ( ;; )
|
||
{
|
||
ent anim_single( guys, "ending" );
|
||
}
|
||
|
||
/*
|
||
gulag_end_animatic_player"
|
||
gulag_end_animatic_soldier"
|
||
gulag_end_animatic_price" ]
|
||
gulag_end_animatic_soap" ][
|
||
*/
|
||
}
|
||
|
||
start_cafeteria()
|
||
{
|
||
|
||
friendly_escape_orgs = getstructarray( "start_cafe_friendly", "targetname" );
|
||
orgs = array_index_by_parameters( friendly_escape_orgs );
|
||
|
||
map_spawners_to_starts( orgs );
|
||
|
||
ai = GetAIArray( "allies" );
|
||
foreach ( guy in ai )
|
||
{
|
||
guy thread endlog_friendly_runout_settings();
|
||
}
|
||
|
||
|
||
player_org = getstruct( "start_cafe_player", "targetname" );
|
||
level.player SetOrigin( player_org.origin );
|
||
level.player SetPlayerAngles( player_org.angles );
|
||
gulag_player_loadout();
|
||
|
||
SetSavedDvar( "r_spotlightbrightness", "0.9" );
|
||
SetSavedDvar( "r_spotlightendradius", "1200" );
|
||
SetSavedDvar( "r_spotlightstartradius", "50" );
|
||
//setsaveddvar( "r_spotlightfovinnerfraction", "0.7" );
|
||
|
||
level.cafe_tables = GetEntArray( "cafe_table", "targetname" );
|
||
array_thread( level.cafe_tables, ::cafe_table_think );
|
||
cafe_table_orgs = getstructarray( "cafe_table_org", "targetname" );
|
||
array_thread( cafe_table_orgs, ::cafe_table_org_think );
|
||
|
||
cafe_table_eq_orgs = getstructarray( "cafe_table_eq_org", "targetname" );
|
||
array_thread( cafe_table_eq_orgs, ::cafe_table_eq_org_think );
|
||
|
||
|
||
thread cafe_lights_explode();
|
||
|
||
|
||
hunted_swing_light = GetEnt( "hunted_swing_light", "targetname" );
|
||
// thread hunted_swing_light_think( hunted_swing_light );
|
||
|
||
//swing_lights = GetEntArray( "swing_light", "targetname" );
|
||
//array_thread( swing_lights, ::swing_light_think );
|
||
|
||
/*
|
||
ending_window_littlebird = GetEnt( "ending_window_littlebird", "script_noteworthy" );
|
||
heli = ending_window_littlebird spawn_vehicle();
|
||
path = heli vehicle_get_path_array();
|
||
|
||
heli Delete();
|
||
wait( 0.05 );
|
||
heli = ending_window_littlebird spawn_vehicle();
|
||
path = heli vehicle_get_path_array();
|
||
*/
|
||
|
||
//thread gulag_glass_shatter();
|
||
}
|
||
|
||
gulag_cafeteria()
|
||
{
|
||
/*
|
||
level.soap ent_flag_wait( "run_into_room" );
|
||
level.price ent_flag_wait( "run_into_room" );
|
||
level.redshirt ent_flag_wait( "run_into_room" );
|
||
*/
|
||
|
||
set_cafeteria_spotlight_dvars();
|
||
|
||
level.soap notify( "stop_going_to_node" );
|
||
level.price notify( "stop_going_to_node" );
|
||
level.redshirt notify( "stop_going_to_node" );
|
||
|
||
guys = [];
|
||
guys[ "soap" ] = level.soap;
|
||
guys[ "price" ] = level.price;
|
||
guys[ "redshirt" ] = level.redshirt;
|
||
|
||
foreach ( ai in guys )
|
||
{
|
||
ai.grenadeawareness = 0;
|
||
|
||
if ( !isdefined( ai.magic_bullet_shield ) )
|
||
ai thread magic_bullet_shield();
|
||
|
||
ai.IgnoreRandomBulletDamage = true;
|
||
ai.attackeraccuracy = 0;
|
||
}
|
||
|
||
priceRed = [];
|
||
priceRed[ priceRed.size ] = level.price;
|
||
priceRed[ priceRed.size ] = level.redshirt;
|
||
|
||
ent = GetEnt( "mound_scene_export", "targetname" );
|
||
ent thread anim_reach( guys, "cafe_entrance" );
|
||
|
||
|
||
anim_post = spawn_anim_model( "post" );
|
||
anim_post Hide();
|
||
ent anim_first_frame_solo( anim_post, "gate" );
|
||
|
||
evac_post = GetEnt( "gulag_post_slab", "targetname" );
|
||
evac_post NotSolid();
|
||
evac_post add_target_pivot();
|
||
evac_post CastShadows();
|
||
evac_post.pivot LinkTo( anim_post, "body_animate", ( 0, 0, 0 ), ( 0, 0, 0 ) );
|
||
|
||
flag_wait( "match_up_for_final_room" );
|
||
|
||
if ( level.start_point != "cafe" )
|
||
ent anim_reach_together( guys, "cafe_entrance" );
|
||
|
||
level notify( "cafeteria_sequence_begins" );
|
||
|
||
foreach ( ai in guys )
|
||
{
|
||
ai.moveplaybackrate = 1;
|
||
}
|
||
|
||
player_gets_hit_by_rock();
|
||
|
||
// It's a dead end!!!
|
||
level.redshirt thread dialogue_queue( "gulag_wrm_deadend" );
|
||
|
||
// We can't go back that way!!! Let's try to get these doors open!!!
|
||
// level.price delayThread( 2.2, ::anim_single_solo, level.price, "gulag_pri_doorsopen" );
|
||
|
||
delayThread( 1.5, ::soap_talks_to_heli );
|
||
|
||
level.timer = GetTime();
|
||
for ( i = 0; i < 3; i++ )
|
||
{
|
||
delayThread( 4.7, ::exploder, "end_scene_rock" );
|
||
}
|
||
delayThread( 4.75, ::exploder, "end_scene_rock" );
|
||
delayThread( 4.85, ::exploder, "end_scene_rock" );
|
||
|
||
ent thread anim_single( guys, "cafe_entrance" );
|
||
wait( 4.2 );
|
||
|
||
|
||
quake( 0.25, 4, level.player.origin, 5000 );
|
||
|
||
|
||
wait( 0.05 );
|
||
|
||
wait( 2 );
|
||
|
||
delayThread( 1, ::flag_set, "player_falls_down" );
|
||
|
||
// roach is down!
|
||
level.soap delaythread( 2, ::dialogue_queue, "gulag_cmt_roachisdown" );
|
||
// roach!!
|
||
level.soap delaythread( 3.1, ::dialogue_queue, "gulag_cmt_roach" );
|
||
|
||
wait( 2 );
|
||
|
||
flag_waitopen( "player_falls_down" );// during cafeteria ending
|
||
}
|
||
|
||
|
||
|
||
start_evac()
|
||
{
|
||
spawner = GetEnt( "price_spawner", "targetname" );
|
||
spawner spawn_ai();
|
||
|
||
spawner = GetEnt( "endlog_soap_spawner", "targetname" );
|
||
spawner spawn_ai();
|
||
|
||
spawner = GetEntArray( "endlog_redshirt_spawner", "targetname" )[ 0 ];
|
||
spawner spawn_ai();
|
||
|
||
}
|
||
|
||
drawAnimTimes( guys, anime )
|
||
{
|
||
for ( ;; )
|
||
{
|
||
PrintLn( " " );
|
||
foreach ( guy in guys )
|
||
{
|
||
animation = guy getanim( anime );
|
||
time = guy GetAnimTime( animation );
|
||
PrintLn( guy.animname + " " + time );
|
||
}
|
||
wait( 0.05 );
|
||
}
|
||
}
|
||
|
||
gulag_evac()
|
||
{
|
||
// delayThread( 2.0, ::play_sound_in_space, "scn_gulag_wall_explosion_short_a", level.soap.origin );
|
||
|
||
level.player SetMoveSpeedScale( 1 );
|
||
// clear the gate sequence from cafe
|
||
ai = GetAIArray( "allies" );
|
||
foreach ( guy in ai )
|
||
{
|
||
guy anim_stopanimscripted();
|
||
}
|
||
|
||
flag_set( "time_to_evac" );
|
||
level.player SetBlurForPlayer( 0, 1 );
|
||
|
||
level.player PlayerSetGroundReferenceEnt( undefined );
|
||
|
||
level notify( "stop_cavein" );
|
||
SetSavedDvar( "r_spotlightbrightness", 0.6 );
|
||
SetSavedDvar( "g_friendlyNameDist", 0 );
|
||
if ( level.start_point == "evac" )
|
||
wait( 0.05 );// for bug in doing animscripted on first frame of ai
|
||
|
||
level.fx_fall_time = 0.1;
|
||
black_overlay = create_client_overlay( "black", 0, level.player );
|
||
black_overlay.alpha = 1;
|
||
|
||
if ( isdefined( level.black_overlay ) )
|
||
level.black_overlay.alpha = 0;
|
||
|
||
level.player AllowCrouch( false );
|
||
level.player AllowProne( false );
|
||
wait( 5.2 );// should be 2 seconds but the fx take forever to clear
|
||
|
||
thread evac_slowmo();
|
||
thread evac_dof();
|
||
|
||
|
||
black_overlay FadeOverTime( 2 );
|
||
black_overlay.alpha = 0;
|
||
|
||
SetSavedDvar( "compass", "0" );
|
||
SetSavedDvar( "ammoCounterHide", 1 );
|
||
SetSavedDvar( "hud_showStance", 0 );
|
||
SetSavedDvar( "hud_drawhud", 0 );
|
||
|
||
player_rig = spawn_anim_model( "player_rig" );
|
||
//player_rig thread maps\_debug::drawTagForever( "tag_player" );
|
||
//player_rig Hide();
|
||
extra_player_rig = spawn_anim_model( "player_rig" );
|
||
extra_player_rig Hide();
|
||
|
||
|
||
level.player_rig = player_rig;
|
||
player_carabiner = spawn_anim_model( "player_carabiner" );
|
||
ent = GetEnt( "mound_scene_export", "targetname" );
|
||
|
||
|
||
level.soap forceUseWeapon( "m4m203_acog", "primary" );
|
||
|
||
guys = [];
|
||
// guys[ guys.size ] = level.soap;
|
||
guys[ "price" ] = level.price;
|
||
guys[ "redshirt" ] = level.redshirt;
|
||
guys[ "player_rig" ] = player_rig;
|
||
|
||
anim_rock = spawn_anim_model( "rock" );
|
||
anim_rock Hide();
|
||
guys[ "anim_rock" ] = anim_rock;
|
||
|
||
|
||
thread maps\_ambient::use_eq_settings( "gulag_exit", level.eq_main_track );
|
||
delayThread( 0, maps\_ambient::blend_to_eq_track, level.eq_main_track, 2 );
|
||
|
||
|
||
pavelow = spawn_anim_model( "pavelow" );
|
||
guys[ "pavelow" ] = pavelow;
|
||
|
||
ending_rope = spawn_anim_model( "ending_rope" );
|
||
level.rope = ending_rope;
|
||
|
||
guys[ "ending_rope" ] = ending_rope;
|
||
|
||
guys[ "ending_rope" ] MakeUsable();
|
||
|
||
// script brushmodel rock
|
||
evac_rock = GetEnt( "evac_rock", "targetname" );
|
||
evac_rock add_target_pivot();
|
||
evac_rock CastShadows();
|
||
//evac_rock Hide();
|
||
evac_rock.pivot LinkTo( anim_rock, "body_animate", ( 0, 0, 0 ), ( 0, 0, 0 ) );
|
||
|
||
arcRight = 15;
|
||
arcLeft = 15;
|
||
arcTop = 15;
|
||
arcBottom = 15;
|
||
|
||
thread maps\_autosave::_autosave_game_now_nochecks();
|
||
|
||
level.player PlayerLinkToDelta( player_rig, "tag_player", 1, 0, 0, 0, 0, true );
|
||
|
||
level.player TakeAllWeapons();
|
||
|
||
exploder( "bomb_exploder" );
|
||
delayThread( 20, ::exploder, "evac_exploder" );
|
||
|
||
SoundSetTimeScaleFactor( "mission", 0 );
|
||
SoundSetTimeScaleFactor( "announcer", 0 );
|
||
|
||
|
||
ent anim_first_frame_solo( extra_player_rig, "fly_away" );
|
||
ent delayThread( 20.16, ::anim_single_solo, extra_player_rig, "fly_away" );
|
||
|
||
evac_time = GetTime();
|
||
ent thread anim_single( guys, "evac" );
|
||
|
||
//wait( 0.6 );
|
||
|
||
ent thread anim_single_solo( level.soap, "evac" );
|
||
flag_set( "evac_begins" );
|
||
|
||
// Two-One, I see your flare. SPIE rig coming down.
|
||
delayThread( 5.7, ::radio_dialogue, "gulag_plp_seeflare" );
|
||
|
||
|
||
//thread drawAnimTimes( guys, "evac" );
|
||
|
||
level.soap thread soap_sets_played_pulled_flag();
|
||
|
||
//setsaveddvar( "cg_fov", 50 );
|
||
|
||
player_rig waittillmatch( "single anim", "end" );
|
||
level.player Unlink();
|
||
level.player AllowCrouch( true );
|
||
level.player AllowProne( true );
|
||
SetSavedDvar( "g_friendlyNameDist", 175 );
|
||
thread blend_in_player_movespeed();
|
||
|
||
|
||
//thread lerp_fov_overtime( 3, 65 );
|
||
|
||
player_rigs = [];
|
||
player_rigs[ "carabiner" ] = player_carabiner;
|
||
player_rigs[ "rig" ] = player_rig;
|
||
|
||
|
||
ent anim_first_frame( player_rigs, "hookup" );
|
||
//player_Rig thread maps\_debug::drawTagForever( "tag_player" );
|
||
player_rig Hide();
|
||
player_carabiner Hide();
|
||
|
||
tag_origin = spawn_tag_origin();
|
||
tag_origin LinkTo( extra_player_rig, "tag_player", ( 0, 0, 0 ), ( 0, 0, 0 ) );
|
||
//tag_origin thread maps\_debug::drawTagForever( "tag_origin" );
|
||
|
||
trigger = getEntWithFlag( "player_uses_rig" );
|
||
|
||
// Press and hold^3 &&1 ^7to clip on.
|
||
trigger SetHintString( &"GULAG_HOLD_1_TO_SPIE" );
|
||
|
||
SetSavedDvar( "hud_drawhud", 1 );
|
||
|
||
flag_wait( "player_uses_rig" );
|
||
|
||
trigger trigger_off();
|
||
SetSavedDvar( "r_spotlightbrightness", 0 );
|
||
/*
|
||
// player gets close enough
|
||
for ( ;; )
|
||
{
|
||
if ( Distance( level.player.origin, level.soap.origin ) < 64 )
|
||
break;
|
||
wait( 0.05 );
|
||
}
|
||
*/
|
||
|
||
level.player AllowCrouch( false );
|
||
level.player AllowProne( false );
|
||
|
||
|
||
if ( IsDefined( level.soap.got_player_notetrack ) )
|
||
{
|
||
// too late to hookup
|
||
return;
|
||
}
|
||
|
||
|
||
|
||
|
||
time_passed = GetTime() - evac_time;
|
||
time_passed *= 0.001;
|
||
player_linked = false;
|
||
if ( time_passed < 18 )
|
||
{
|
||
player_linked = true;
|
||
time = 0.5;
|
||
level.player PlayerLinkToBlend( player_rig, "tag_player", time, time * 0.4, time * 0.4 );
|
||
delayThread( time, ::player_gets_groundref_and_opens_fov, tag_origin, player_rig );
|
||
|
||
// level.player PlayerLinkToDelta( player_rig, "tag_player", 1, 45, 45, 90, 45 );
|
||
//level.player PlayerLinkToDelta( player_rig, "tag_player", 1, 0,0,0,0 );
|
||
//time = 1;
|
||
//level.player PlayerLinkToBlend( player_rig, "tag_player", time, time * 0.4, time * 0.4 );
|
||
|
||
|
||
thread player_hooks_up( ent, player_rigs );
|
||
}
|
||
|
||
|
||
flag_wait( "player_gets_pulled" );
|
||
|
||
player_rig Hide();
|
||
|
||
SetSavedDvar( "g_friendlyNameDist", 0 );
|
||
|
||
ent notify( "stop_loop" );
|
||
level.player notify( "stop_opening_fov" );
|
||
|
||
if ( !player_linked )
|
||
{
|
||
time = 0.5;
|
||
level.player PlayerLinkToBlend( extra_player_rig, "tag_player", time, time * 0.4, time * 0.4 );
|
||
//thread player_view_goes_to_zero_then_opens( extra_player_rig, "tag_player", time );
|
||
delayThread( time, ::player_gets_groundref, tag_origin, extra_player_rig );
|
||
}
|
||
else
|
||
{
|
||
thread wait_then_player_view_goes_to_zero_then_opens( extra_player_rig, 1.5 );
|
||
}
|
||
|
||
/*
|
||
// in case we didn't finish lerping
|
||
level.player PlayerLinkToDelta( player_rig, "tag_player", 1, 45, 45, 90, 45, true );
|
||
level.player LerpViewAngleClamp( 2, 0.5, 0.5, 0, 0, 0, 0 );
|
||
*/
|
||
|
||
level.price delaycall( 5.05, ::playsound, "gulag_pri_yes" );
|
||
|
||
ent thread anim_single_solo( player_rig, "fly_away" );
|
||
thread fly_away_rumble();
|
||
|
||
thread swap_world_fx();
|
||
delayThread( 3.0, maps\_utility::vision_set_fog_changes, "gulag_circle", 2.2 );
|
||
|
||
animation = player_rig getanim( "fly_away" );
|
||
level.player SetEqLerp( 1, level.eq_main_track );
|
||
thread maps\_ambient::use_eq_settings( "gulag_ending_fadeout", level.eq_mix_track );
|
||
wait( 7.85 );
|
||
|
||
// wait( 1.5 );
|
||
|
||
// set up the mix track we're going to blend to
|
||
// level.player SetEqLerp( 1, level.eq_main_track );
|
||
level.player thread maps\_ambient::blend_to_eq_track( 1, 0.5 );
|
||
//level.player SetEqLerp( 1, level.eq_mix_track );
|
||
|
||
|
||
|
||
black_overlay = create_client_overlay( "black", 0, level.player );
|
||
black_overlay.alpha = 1;
|
||
|
||
|
||
nextmission();
|
||
}
|
||
|
||
fly_away_rumble()
|
||
{
|
||
wait( 1 );
|
||
PlayRumbleOnPosition( "heavy_3s", level.player.origin );
|
||
level.player PlayRumbleOnEntity( "damage_heavy" );
|
||
level.player PlayRumbleLoopOnEntity( "light_1s" );
|
||
}
|
||
|
||
wait_then_player_view_goes_to_zero_then_opens( extra_player_rig, time )
|
||
{
|
||
flag_wait( "player_evac" );
|
||
player_view_goes_to_zero_then_opens( extra_player_rig, time );
|
||
}
|
||
|
||
player_view_goes_to_zero_then_opens( extra_player_rig, time )
|
||
{
|
||
level.player PlayerLinkToBlend( extra_player_rig, "tag_player", time, time * 0.4, time * 0.4 );
|
||
wait( time );
|
||
arc = 18;
|
||
level.player PlayerLinkToDelta( extra_player_rig, "tag_player", arc, arc, arc, arc, true );
|
||
}
|
||
|
||
player_gets_groundref_and_opens_fov( tag_origin, player_rig )
|
||
{
|
||
level.player PlayerSetGroundReferenceEnt( tag_origin );
|
||
wait( 1 );
|
||
open_up_fov( 0.5, player_rig, "tag_player", 45, 45, 90, 15 );
|
||
}
|
||
|
||
player_gets_groundref( tag_origin, player_rig )
|
||
{
|
||
level.player PlayerSetGroundReferenceEnt( tag_origin );
|
||
}
|
||
|
||
|
||
player_hooks_up( ent, player_rigs )
|
||
{
|
||
if ( flag( "player_gets_pulled" ) )
|
||
return;
|
||
|
||
level endon( "player_gets_pulled" );
|
||
wait( 0.3 );
|
||
// wait( 1 );
|
||
// thread orient_player_to_rig( player_rig );
|
||
|
||
player_rigs[ "carabiner" ] Show();
|
||
player_rigs[ "rig" ] Show();
|
||
ent anim_single( player_rigs, "hookup" );
|
||
ent anim_loop_solo( player_rigs[ "rig" ], "idle" );
|
||
}
|
||
|
||
soap_sets_played_pulled_flag()
|
||
{
|
||
flag_init( "player_gets_pulled" );
|
||
self waittillmatch( "single anim", "player" );
|
||
flag_set( "player_gets_pulled" );
|
||
}
|
||
|
||
|
||
gulag_ending_startpoint_catchup_thread()
|
||
{
|
||
waittillframeend;// let the actual start functions run before this one
|
||
start = level.start_point;
|
||
|
||
if ( is_default_start() )
|
||
return;
|
||
|
||
remove_global_spawn_function( "allies", ::enable_cqbwalk );
|
||
|
||
if ( start == "rescue" )
|
||
return;
|
||
|
||
flag_clear( "enable_interior_fx" );
|
||
flag_set( "rescue_begins" );
|
||
flag_set( "escape_the_gulag" );
|
||
|
||
wait( 0.05 );
|
||
DisableForcedSunShadows();// lets get some sunlight in here
|
||
|
||
delayThread( 0.1, ::vision_set_fog_changes, "gulag_ending", 0 );
|
||
|
||
if ( level.script != "endlog" )
|
||
{
|
||
volume = GetEnt( "gulag_endlog_destructibles", "script_noteworthy" );
|
||
volume activate_destructibles_in_volume();
|
||
volume activate_interactives_in_volume();
|
||
}
|
||
|
||
if ( start == "run" )
|
||
return;
|
||
|
||
thread minor_earthquakes();
|
||
thread cafe_fx();
|
||
|
||
set_new_ending_fx_dists();
|
||
flag_set( "enter_final_room" );
|
||
flag_set( "exit_collapses" );
|
||
flag_set( "match_up_for_final_room" );
|
||
flag_set( "big_earthquake_hits" );
|
||
|
||
wait( 0.05 );
|
||
level.price forceUseWeapon( "ak47", "primary" );
|
||
|
||
level notify( "skip_stumble_trigger_think" );
|
||
|
||
if ( start == "cafe" )
|
||
return;
|
||
|
||
level notify( "stop_minor_earthquakes" );
|
||
|
||
level.player TakeAllWeapons();
|
||
flag_set( "player_falls_down" );
|
||
if ( start == "evac" )
|
||
return;
|
||
|
||
|
||
AssertMsg( "Didn't handle start point " + start );
|
||
}
|