2928 lines
80 KiB
Plaintext
2928 lines
80 KiB
Plaintext
#include maps\_utility;
|
||
#include maps\_riotshield;
|
||
#include maps\_vehicle;
|
||
#include maps\_vehicle_spline;
|
||
#include maps\_anim;
|
||
#include maps\_hud_util;
|
||
#include common_scripts\utility;
|
||
#include maps\gulag_code;
|
||
|
||
main()
|
||
{
|
||
SetSavedDvar( "com_cinematicEndInWhite", 1 );
|
||
|
||
// breakpoint;
|
||
gulag_destructible_volumes = GetEntArray( "gulag_destructible_volume", "targetname" );
|
||
mask_destructibles_in_volumes( gulag_destructible_volumes );
|
||
mask_interactives_in_volumes( gulag_destructible_volumes );
|
||
|
||
level.default_goalheight = 128;
|
||
create_dvar( "f15", 1 );
|
||
SetSavedDvar( "g_friendlyNameDist", 0 );
|
||
SetSavedDvar( "r_spotLightMaxLength", 900 );
|
||
|
||
maps\createfx\gulag_audio::main();
|
||
//VisionSetNight( "gulag_nvg", 1.5 );
|
||
|
||
precachestring( &"GULAG_HOLD_1_TO_SPIE" );
|
||
precachestring( &"GULAG_HOLD_1_TO_RAPPEL" );
|
||
precachestring( &"SCRIPT_LEARN_GRENADE_LAUNCHER" );
|
||
precachestring( &"SCRIPT_NIGHTVISION_USE" );
|
||
precachestring( &"SCRIPT_NIGHTVISION_STOP_USE" );
|
||
precachestring( &"GULAG_HINT_MELEE" );
|
||
precachestring( &"GULAG_INTROSCREEN_LINE_4" );// );
|
||
precachestring( &"GULAG_INTROSCREEN_LINE_3" );// );
|
||
precachestring( &"GULAG_INTROSCREEN_LINE_2" );// );
|
||
precachestring( &"GULAG_INTROSCREEN_LINE_1" );// );
|
||
precachestring( &"AUTOSAVE_AUTOSAVE" );
|
||
precachestring( &"GULAG_INTROSCREEN_1" );
|
||
precachestring( &"GULAG_INTROSCREEN_2" );
|
||
precachestring( &"GULAG_INTROSCREEN_3" );
|
||
precachestring( &"GULAG_INTROSCREEN_4" );
|
||
precachestring( &"GULAG_INTROSCREEN_5" );
|
||
precachestring( &"GULAG_FIND_POW" );
|
||
precachestring( &"GULAG_FOLLOW_SOAP" );
|
||
precachestring( &"GULAG_CONTROL_ROOM" );
|
||
precachestring( &"GULAG_CELL_DUTY" );
|
||
precachestring( &"GULAG_BREACH_THE_BATHROOM" );
|
||
precachestring( &"GULAG_ESCAPE" );
|
||
precachestring( &"GULAG_INTROSCREEN_LINE_1" );
|
||
|
||
// level.start_point = "unload";
|
||
add_start( "intro", ::start_empty, "Intro", ::gulag_flyin );
|
||
add_start( "approach", ::start_approach, "Approach", ::gulag_approach );
|
||
add_start( "f15", ::start_f15, "f15", ::gulag_perimeter );
|
||
add_start( "unload", ::start_f15, "Unload", ::gulag_perimeter );
|
||
add_start( "control_room", ::start_control_room, "Control Room", ::gulag_cellblocks );
|
||
add_start( "armory", ::start_armory, "Armory", ::gulag_armory );
|
||
add_start( "rappel", ::start_rappel, "Rappel", ::gulag_rappel );
|
||
add_start( "tunnel", ::start_tunnel, "tunnel", ::gulag_tunnel );
|
||
add_start( "bathroom", ::start_bathroom, "Bathroom", ::gulag_bathroom );
|
||
add_start( "rescue", ::start_rescue, "Rescue", ::gulag_rescue );
|
||
/*
|
||
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 );
|
||
*/
|
||
|
||
|
||
falling_rib_chunks = GetEntArray( "falling_rib_chunk", "targetname" );
|
||
array_thread( falling_rib_chunks, ::self_delete );
|
||
top_hall_exploders = GetEntArray( "top_hall_exploder", "targetname" );
|
||
array_thread( top_hall_exploders, ::self_delete );
|
||
top_hall_chunks = GetEntArray( "top_hall_chunk", "targetname" );
|
||
array_thread( top_hall_chunks, ::self_delete );
|
||
top_hall_chunks = GetEntArray( "top_hall_chunk", "targetname" );
|
||
array_thread( top_hall_chunks, ::self_delete );
|
||
|
||
|
||
level.disable_interactive_tv_use_triggers = true;
|
||
|
||
/*
|
||
start = create_start( "intro" );
|
||
start.main = ::gulag_flyin;
|
||
start.text = "Intro";
|
||
|
||
start = create_start( "approach" );
|
||
start.main = ::gulag_approach;
|
||
start.text = "Approach";
|
||
*/
|
||
|
||
level.custom_no_game_setupFunc = ::gulag_no_game_start_setupFunc;
|
||
level.slowmo_viewhands = "viewhands_player_udt";
|
||
|
||
maps\_drone_ai::init();
|
||
maps\gulag_precache::main();
|
||
maps\createart\gulag_fog::main();
|
||
maps\gulag_fx::main();
|
||
thread maps\gulag_ending::endlog_common();
|
||
|
||
//delaythread( 3, ::exploder, "hall_attack" );
|
||
|
||
maps\_load::main();
|
||
maps\_compass::setupMiniMap( "compass_map_gulag" );
|
||
|
||
thread pa_system();
|
||
|
||
maps\_slowmo_breach::slowmo_breach_init();
|
||
level._effect[ "breach_door" ] = LoadFX( "explosions/breach_wall_concrete" );
|
||
|
||
maps\gulag_anim::gulag_anim();
|
||
maps\_nightvision::main( level.players );
|
||
level.player SetActionSlot( 1, "" ); // nightvision turns this on
|
||
|
||
|
||
add_global_spawn_function( "allies", ::no_grenades );
|
||
|
||
run_thread_on_targetname( "helper_model", ::self_delete );
|
||
|
||
// Press^3 [{+actionslot 3}] ^7to use the M203 Grenade Launcher.
|
||
add_hint_string( "grenade_launcher", &"SCRIPT_LEARN_GRENADE_LAUNCHER", ::should_break_m203_hint );
|
||
|
||
// Press^3 [{+actionslot 1}] ^7to use Night Vision Goggles.
|
||
add_hint_string( "nvg", &"SCRIPT_NIGHTVISION_USE", maps\_nightvision::ShouldBreakNVGHintPrint );
|
||
|
||
// Press^3 [{+actionslot 1}] ^7to disable Night Vision Goggles.
|
||
add_hint_string( "disable_nvg", &"SCRIPT_NIGHTVISION_STOP_USE", maps\_nightvision::should_break_disable_nvg_print );
|
||
|
||
// "Press ^3[{+melee}]^7 to bash."
|
||
add_hint_string( "riot_bash", &"GULAG_HINT_MELEE", ::stop_bash_hint );
|
||
|
||
level.rioter_threat = 1000;
|
||
level._pipe_fx_time = 2.5;
|
||
|
||
flag_init( "intro_helis_go" );
|
||
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( "a_heli_landed" );
|
||
flag_init( "overlook_cleared_with_safe_time" );
|
||
flag_init( "start_armory_music" );
|
||
//flag_init( "cell_door1" );
|
||
flag_init( "spotlight_turns_on" );
|
||
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( "armory_attack_sounds" );
|
||
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( "soap_snipes_tower" );
|
||
flag_init( "slamraam_gets_players_attention" );
|
||
flag_init( "slamraam_killed_2" );
|
||
flag_init( "stop_rotating_around_gulag" );
|
||
flag_init( "player_goes_in_for_landing" );
|
||
flag_init( "enable_endlog_fx" );
|
||
flag_init( "escape_the_gulag" );
|
||
flag_init( "friendlies_use_riotshield" );
|
||
flag_init( "checking_to_sweep_cells" );
|
||
flag_init( "lets_sweep_the_nvg_cells" );
|
||
flag_init( "soap_finishes_talking_about_going_in" );
|
||
flag_init( "nvg_moveup2" );
|
||
flag_init( "nvg_moveup3" );
|
||
flag_init( "nvg_moveup4" );
|
||
// flag_set( "player_goes_in_for_landing" );
|
||
flag_init( "gulag_perimeter" );
|
||
flag_init( "pre_boats_attack" );
|
||
flag_init( "clear_dof" );
|
||
flag_init( "player_heli_backs_up" );
|
||
flag_init( "stop_shooting_right_side" );
|
||
flag_set( "player_can_rappel" );// didnt need
|
||
flag_init( "background_explosion" );
|
||
flag_init( "ghost_goes_to_laptop" );
|
||
flag_init( "ghost_uses_laptop" );
|
||
|
||
//thread setup_celldoor( "cell_door1" );
|
||
|
||
|
||
thread setup_celldoor( "cell_door2" );
|
||
thread setup_celldoor( "cell_door3" );
|
||
thread setup_celldoor( "cell_door4" );
|
||
thread setup_celldoor( "cell_door_weapons" );
|
||
|
||
PreCacheItem( "smoke_grenade_american" );
|
||
PreCacheItem( "armory_grenade" );
|
||
PreCacheItem( "m4m203_reflex_arctic" );
|
||
PreCacheItem( "f15_sam" );
|
||
PreCacheItem( "sam" );
|
||
PreCacheItem( "slamraam_missile" );
|
||
PreCacheItem( "slamraam_missile_guided" );
|
||
PreCacheItem( "stinger" );
|
||
PreCacheItem( "cobra_seeker" );
|
||
PreCacheItem( "rpg_straight" );
|
||
PreCacheItem( "cobra_Sidewinder" );
|
||
PreCacheItem( "m14_scoped_arctic" );
|
||
PreCacheItem( "claymore" );
|
||
PreCacheItem( "mp5_silencer_reflex" );
|
||
PreCacheTurret( "heli_spotlight" );
|
||
PreCacheTurret( "player_view_controller" );
|
||
|
||
|
||
PreCacheItem( "fraggrenade" );
|
||
PreCacheItem( "flash_grenade" );
|
||
PreCacheItem( "claymore" );
|
||
|
||
PreCacheModel( "viewhands_player_udt" );
|
||
PreCacheModel( "viewhands_udt" );
|
||
|
||
PreCacheModel( "com_emergencylightcase_blue" );
|
||
PreCacheModel( "gulag_price_ak47" );
|
||
PreCacheModel( "com_emergencylightcase" );
|
||
PreCacheModel( "com_emergencylightcase_blue_off" );
|
||
PreCacheModel( "com_drop_rope_obj" );
|
||
PreCacheModel( "com_blackhawk_spotlight_on_mg_setup" );
|
||
PreCacheModel( "com_blackhawk_spotlight_on_mg_setup_3x" );
|
||
PreCacheModel( "vehicle_slamraam_launcher_no_spike" );
|
||
PreCacheModel( "vehicle_slamraam_missiles" );
|
||
PreCacheModel( "projectile_slamraam_missile" );
|
||
PreCacheModel( "tag_turret" );
|
||
PreCacheModel( "me_lightfluohang_double_destroyed" );
|
||
PreCacheModel( "me_lightfluohang_single_destroyed" );
|
||
PreCacheModel( "ma_flatscreen_tv_wallmount_broken_01" );
|
||
PreCacheModel( "ma_flatscreen_tv_wallmount_broken_02" );
|
||
PreCacheModel( "com_tv2_d" );
|
||
PreCacheModel( "com_tv1" );
|
||
PreCacheModel( "com_tv2" );
|
||
PreCacheModel( "com_tv1_testpattern" );
|
||
PreCacheModel( "com_tv2_testpattern" );
|
||
PreCacheModel( "com_locker_double_destroyed" );
|
||
PreCacheModel( "ch_street_wall_light_01_off" );
|
||
PreCacheModel( "dt_mirror_dam" );
|
||
PreCacheModel( "dt_mirror_des" );
|
||
PreCacheModel( "tag_laser" );
|
||
|
||
|
||
|
||
LoadFX( "explosions/tv_flatscreen_explosion" );
|
||
LoadFX( "misc/light_fluorescent_single_blowout_runner" );
|
||
LoadFX( "misc/light_fluorescent_blowout_runner" );
|
||
LoadFX( "props/locker_double_des_01_left" );
|
||
LoadFX( "props/locker_double_des_02_right" );
|
||
LoadFX( "props/locker_double_des_03_both" );
|
||
LoadFX( "misc/no_effect" );
|
||
LoadFX( "misc/light_blowout_swinging_runner" );
|
||
LoadFX( "props/mirror_dt_panel_broken" );
|
||
LoadFX( "props/mirror_shatter" );
|
||
PreCacheShellShock( "gulag_attack" );
|
||
PreCacheShellShock( "nosound" );
|
||
|
||
//thread kill_slide_trigger();
|
||
//level.end_slide_delay = 0.15; // makes player slide longer after a slide trigger
|
||
|
||
level.breakables_fx[ "tv_explode" ] = LoadFX( "explosions/tv_explosion" );
|
||
|
||
// Removes the tarps near the shower for that is only used in Special Ops
|
||
thread so_remove_weapon_tarp();
|
||
|
||
thread handle_gulag_world_fx();
|
||
|
||
level thread maps\gulag_amb::main();
|
||
thread player_riotshield_threatbias();
|
||
|
||
level thread init_tv_movies();
|
||
|
||
thread modify_sm_samplesize_on_flyin();
|
||
|
||
level.tarp_guys = [];
|
||
tarp_pull_orgs = GetEntArray( "tarp_pull_org", "targetname" );
|
||
array_thread( tarp_pull_orgs, ::tarp_pull_org_think );
|
||
|
||
player_start = getstruct( "start_approach", "script_noteworthy" );
|
||
friendly_starts = getstructarray( "start_approach_friendly", "script_noteworthy" );
|
||
friendly_starts[ "p" ] = player_start;
|
||
|
||
thread blow_up_first_tower_soon();
|
||
|
||
|
||
|
||
thread remove_rpgs();
|
||
|
||
SetIgnoreMeGroup( "team3", "axis" );
|
||
SetIgnoreMeGroup( "axis", "team3" );
|
||
|
||
spawner = GetEnt( "endlog_soap_spawner", "targetname" );
|
||
spawner thread add_spawn_function( ::gulag_become_soap );
|
||
|
||
spawner = GetEnt( "ghost", "script_noteworthy" );
|
||
spawner thread add_spawn_function( ::gulag_become_ghost );
|
||
|
||
array_spawn_function_noteworthy( "overlook_spawner", ::overlook_spawner_think );
|
||
//array_spawn_function_noteworthy( "hallway_runner_spawner", ::hallway_runner_spawner_think );
|
||
array_spawn_function_targetname( "bhd_spawner", ::bhd_heli_think );
|
||
array_spawn_function_noteworthy( "breach_death_spawner", ::die_on_ragdoll );
|
||
array_spawn_function_noteworthy( "riot_shield_spawner", ::riot_shield_guy );
|
||
array_spawn_function_noteworthy( "flee_armory_spawner", ::flee_armory_think );
|
||
array_spawn_function_noteworthy( "tarp_spawner", ::tarp_spawner_think );
|
||
// array_spawn_function_noteworthy( "doomed_just_doomed", ::doomed_just_doomed_think );
|
||
array_spawn_function_noteworthy( "close_fighter_spawner", ::close_fighter_think );
|
||
array_spawn_function_noteworthy( "bathroom_balcony_spawner", ::bathroom_balcony_spawner );
|
||
array_spawn_function_noteworthy( "riot_escort_spawner", ::riot_escort_spawner );
|
||
array_spawn_function_noteworthy( "catwalk_spawner", ::catwalk_spawner );
|
||
array_spawn_function_noteworthy( "dies_fast_to_explosive", ::dies_fast_to_explosive );
|
||
array_spawn_function_noteworthy( "ignore_then_dies_fast_to_explosive", ::ignore_then_dies_fast_to_explosive );
|
||
|
||
|
||
run_thread_on_noteworthy( "low_health_destructible", ::low_health_destructible );
|
||
|
||
run_thread_on_targetname( "challenge_only", ::self_delete );
|
||
|
||
ally_gets_missed_triggers = GetEntArray( "ally_gets_missed_trigger", "targetname" );
|
||
array_thread( ally_gets_missed_triggers, ::ally_gets_missed_trigger_think );
|
||
|
||
ally_can_get_hit_triggers = GetEntArray( "ally_can_get_hit_trigger", "targetname" );
|
||
array_thread( ally_can_get_hit_triggers, ::ally_can_get_hit_trigger_think );
|
||
|
||
ally_in_armorys = GetEntArray( "ally_in_armory", "targetname" );
|
||
array_thread( ally_in_armorys, ::ally_in_armory_think );
|
||
|
||
damage_targ_triggers = GetEntArray( "damage_targ_trigger", "targetname" );
|
||
array_thread( damage_targ_triggers, ::damage_targ_trigger_think );
|
||
|
||
friendlies_ditch_riot_shields_triggers = GetEntArray( "friendlies_ditch_riot_shields_trigger", "targetname" );
|
||
array_thread( friendlies_ditch_riot_shields_triggers, ::friendlies_ditch_riot_shields_trigger_think );
|
||
|
||
|
||
add_wait( ::flag_wait, "player_moves_into_gulag" );
|
||
add_func( ::flag_set, "gulag_cell_doors_enabled" );
|
||
thread do_wait();
|
||
|
||
thread landing_blocker_think();
|
||
|
||
|
||
level.ending_flee_guys = 0;
|
||
level.ending_flee_max = 0;
|
||
//array_spawn_function_noteworthy( "ending_flee_spawner", ::ending_flee_spawner_think );
|
||
|
||
//price_spawner = GetEnt( "price_spawner", "script_noteworthy" );
|
||
//price_spawner thread add_spawn_function( ::price_spawn_think );
|
||
|
||
|
||
level.slamraam_missile = "slamraam_missile_guided";
|
||
//thread heli_strike();
|
||
//thread gulag_center_shifts_as_we_move_in();
|
||
|
||
thread gulag_objectives();
|
||
thread gulag_music();
|
||
thread gulag_startpoint_catchup_thread();
|
||
|
||
// makes the friendlies go the right way
|
||
ai_field_blocker = GetEnt( "ai_field_blocker", "targetname" );
|
||
ai_field_blocker ConnectPaths();
|
||
ai_field_blocker NotSolid();
|
||
|
||
deprecated_traverses = GetEntArray( "deprecated_traverse", "targetname" );
|
||
array_thread( deprecated_traverses, ::self_delete );
|
||
|
||
/*
|
||
|
||
wait( 2 );
|
||
vision_set_changes( "gulag_hallways", 1 );
|
||
fog_set_changes( "gulag_hallways", 1 );
|
||
wait( 2 );
|
||
exploder( "hallway_collapse" );
|
||
ent = getstruct( "hallway_cavein_damage", "targetname" );
|
||
time = 3;
|
||
frames = time * 20;
|
||
for ( i = 0; i < frames; i++ )
|
||
{
|
||
RadiusDamage( ent.origin, ent.radius, 10, 5 );
|
||
wait( 0.05 );
|
||
}
|
||
*/
|
||
|
||
//thread gulag_hallway_explodes();
|
||
|
||
|
||
|
||
// thread gulag_boats();
|
||
// player_view_controller = SpawnTurret( "misc_turret", (0,0,0), "heli_spotlight" );
|
||
|
||
/*
|
||
for ( ;; )
|
||
{
|
||
foreach ( start in friendly_starts )
|
||
{
|
||
// Print3d( start.origin, "x", (1,0,0), 1, 5 );
|
||
}
|
||
wait( 0.05 );
|
||
}
|
||
*/
|
||
// level.player SetActionSlot( 1, "nightvision" );
|
||
}
|
||
|
||
// Removes the tarps near the shower for that is only used in Special Ops
|
||
so_remove_weapon_tarp()
|
||
{
|
||
if ( !is_specialop() )
|
||
{
|
||
ent = GetEnt( "so_weapon_tarp", "targetname" );
|
||
ent Delete();
|
||
}
|
||
}
|
||
|
||
|
||
gulag_introscreen()
|
||
{
|
||
level.player FreezeControls( true );
|
||
|
||
introblack = create_client_overlay( "black", 1, level.player );
|
||
|
||
wait( 0.5 );
|
||
|
||
lines = [];
|
||
//
|
||
lines[ lines.size ] = &"GULAG_INTROSCREEN_LINE_4";// "SEAL Team Six, U.S.N."
|
||
//
|
||
lines[ lines.size ] = &"GULAG_INTROSCREEN_LINE_3";// "P03 'Roach' Silvers"
|
||
//
|
||
lines[ "date" ] = &"GULAG_INTROSCREEN_LINE_2";// "Northern Russia - 09:20:[{FAKE_INTRO_SECONDS:02}] hrs"
|
||
//
|
||
lines[ lines.size ] = &"GULAG_INTROSCREEN_LINE_1";// "The Gulag"
|
||
level thread maps\_introscreen::introscreen_feed_lines( lines );
|
||
|
||
wait( 2 );
|
||
|
||
introblack FadeOverTime( 4 );
|
||
introblack.alpha = 0;
|
||
|
||
wait( 1 );
|
||
|
||
level.player FreezeControls( false );
|
||
|
||
wait( 3 );
|
||
introblack Destroy();
|
||
}
|
||
|
||
|
||
|
||
// sets McCord up with stuff he needs to test the map
|
||
gulag_no_game_start_setupFunc()
|
||
{
|
||
maps\_loadout::init_loadout();
|
||
|
||
level.spawn_funcs = [];
|
||
level.spawn_funcs[ "allies" ] = [];
|
||
level.spawn_funcs[ "axis" ] = [];
|
||
level.spawn_funcs[ "neutral" ] = [];
|
||
|
||
maps\_nightvision::main( level.players );
|
||
level.player SetActionSlot( 1, "nightvision" );
|
||
}
|
||
|
||
start_empty()
|
||
{
|
||
}
|
||
|
||
gulag_flyin()
|
||
{
|
||
level.player DisableWeapons();
|
||
thread draw_waterfx();
|
||
level.treadfx_maxheight = 5000;
|
||
level.skip_treadfx = true;
|
||
|
||
|
||
// delayThread( 5.5, ::music_loop, "gulag_intro", 240 );
|
||
SetSavedDvar( "compass", "0" );
|
||
SetSavedDvar( "ammoCounterHide", 1 );
|
||
SetSavedDvar( "hud_showStance", 0 );
|
||
SetSavedDvar( "hud_drawhud", 1 );
|
||
|
||
array_spawn_function_noteworthy( "goal_delete_spawner", ::delete_on_player_land );
|
||
|
||
thread control_room_destructibles_turn_on();
|
||
|
||
// helis that hit this will create smoke as they fly through it
|
||
heli_smoke_triggers = GetEntArray( "heli_smoke_trigger", "targetname" );
|
||
array_thread( heli_smoke_triggers, ::heli_smoke_trigger_think );
|
||
|
||
thread gulag_top_drones();
|
||
thread spawn_f15s();
|
||
thread maps\_introscreen::introscreen_generic_white_fade_in( 0.5, 1 );
|
||
|
||
timer = GetTime();
|
||
level.good_tone_timer = GetTime();
|
||
going_in_hot = GetEnt( "going_in_hot", "script_noteworthy" );
|
||
going_in_hot add_spawn_function( ::going_in_hot );
|
||
|
||
thread spawn_player_heli();
|
||
|
||
spawners = GetEntArray( "intro_heli_1", "targetname" );
|
||
thread spawn_friendly_helis( spawners );
|
||
|
||
//level thread gulag_introscreen();
|
||
|
||
player_heli = level.player_heli;
|
||
|
||
|
||
|
||
wait( 1.2 );
|
||
|
||
// Thirty seconds.
|
||
level.soap thread dialogue_queue( "gulag_rpt_30sec" );
|
||
|
||
// Hornet Two-One, this is Jester One-One, flight of two F-15s, four HARMs for the section, standby for SEAD (pr. see-add) over.
|
||
delayThread( 2.7, ::radio_dialogue, "gulag_hrp1_angelsone" );
|
||
|
||
// Solid copy Jester. Go get 'em.
|
||
delayThread( 3, ::radio_dialogue, "gulag_lbp1_gogetem" );
|
||
|
||
// Good tone good tone - Fox three fox three.
|
||
delayThread( 12, ::radio_dialogue, "gulag_fp1_goodtone" );
|
||
|
||
wait( 21 );
|
||
|
||
// Good kill good kill!
|
||
thread radio_dialogue( "gulag_fp2_goodkill" );
|
||
|
||
// Hornet Two-One you're cleared all the way in. Have a nice day.
|
||
thread radio_dialogue( "gulag_fp1_niceday" );
|
||
|
||
// Hornet Two-One copies.
|
||
thread radio_dialogue( "gulag_lbp1_copies" );
|
||
|
||
// Two-two copies all.
|
||
thread radio_dialogue( "gulag_lbp2_copiesall" );
|
||
|
||
// Two-Three solid copy.
|
||
thread radio_dialogue( "gulag_lbp3_solidcopy" );
|
||
}
|
||
|
||
start_approach()
|
||
{
|
||
array_spawn_function_noteworthy( "goal_delete_spawner", ::delete_on_player_land );
|
||
thread gulag_top_drones();
|
||
flag_set( "display_introscreen_text" );
|
||
}
|
||
|
||
gulag_approach()
|
||
{
|
||
battlechatter_off( "allies" );
|
||
|
||
gulag_player_loadout();
|
||
level.player DisableWeapons();
|
||
|
||
/#
|
||
if ( level.start_point == "approach" )
|
||
{
|
||
// teleport the helis to closer in positions
|
||
heli_intro_player = GetEnt( "heli_intro_player", "targetname" );
|
||
player_start = getstruct( "start_approach", "script_noteworthy" );
|
||
heli_intro_player.origin = player_start.origin;
|
||
remap_targets( heli_intro_player.target, player_start.targetname );
|
||
heli_intro_player.target = player_start.targetname;
|
||
|
||
friendly_starts = getstructarray( "start_approach_friendly", "script_noteworthy" );
|
||
friendly_heli_spawners = GetEntArray( "intro_heli_1", "targetname" );
|
||
foreach ( index, spawner in friendly_heli_spawners )
|
||
{
|
||
remap_targets( spawner.target, friendly_starts[ index ].targetname );
|
||
spawner.origin = friendly_starts[ index ].origin;
|
||
spawner.target = friendly_starts[ index ].targetname;
|
||
}
|
||
|
||
going_in_hot = GetEnt( "going_in_hot", "script_noteworthy" );
|
||
going_in_hot add_spawn_function( ::going_in_hot );
|
||
thread spawn_player_heli();
|
||
|
||
spawners = GetEntArray( "intro_heli_1", "targetname" );
|
||
thread spawn_friendly_helis( spawners );
|
||
|
||
level.player SetPlayerAngles( ( 0, -163, 0 ) );
|
||
level.player_heli Vehicle_SetSpeedImmediate( 84, 84 / 4, 84 / 4 );
|
||
}
|
||
else
|
||
if ( level.start_point == "landing_test" )
|
||
{
|
||
// teleport the helis to closer in positions
|
||
heli_intro_player = GetEnt( "heli_intro_player", "targetname" );
|
||
player_start = getstruct( "start_approach", "script_noteworthy" );
|
||
heli_intro_player.origin = player_start.origin;
|
||
remap_targets( heli_intro_player.target, player_start.targetname );
|
||
heli_intro_player.target = player_start.targetname;
|
||
|
||
friendly_starts = getstructarray( "start_approach_friendly", "script_noteworthy" );
|
||
new_start = getstruct( "test_unload_node", "script_noteworthy" );
|
||
friendly_starts[ 2 ] = new_start;
|
||
friendly_heli_spawners = GetEntArray( "intro_heli_1", "targetname" );
|
||
foreach ( index, spawner in friendly_heli_spawners )
|
||
{
|
||
remap_targets( spawner.target, friendly_starts[ index ].targetname );
|
||
spawner.origin = friendly_starts[ index ].origin;
|
||
spawner.target = friendly_starts[ index ].targetname;
|
||
}
|
||
|
||
going_in_hot = GetEnt( "going_in_hot", "script_noteworthy" );
|
||
going_in_hot add_spawn_function( ::going_in_hot );
|
||
thread spawn_player_heli();
|
||
|
||
spawners = GetEntArray( "intro_heli_1", "targetname" );
|
||
thread spawn_friendly_helis( spawners );
|
||
|
||
level.player SetPlayerAngles( ( 0, -163, 0 ) );
|
||
level.player_heli Vehicle_SetSpeedImmediate( 84, 84 / 4, 84 / 4 );
|
||
|
||
level.player Unlink();
|
||
gulag_center = GetEnt( "gulag_center", "targetname" );
|
||
level.player SetOrigin( gulag_center.origin );
|
||
}
|
||
|
||
#/
|
||
|
||
// guys that ignore you at first then run over to fight
|
||
//array_spawn_function_noteworthy( "exploding_ignore_spawner", ::exploding_ignore_spawner_think );
|
||
|
||
|
||
flag_wait( "display_introscreen_text" );
|
||
|
||
wait( 2.2 );
|
||
// string not found for AUTOSAVE_AUTOSAVE
|
||
SaveGame( "approach", &"AUTOSAVE_AUTOSAVE", " ", true );
|
||
|
||
lines = [];
|
||
// The Gulag""
|
||
lines[ lines.size ] = &"GULAG_INTROSCREEN_1";
|
||
// Day 5 - 07:42:[{FAKE_INTRO_SECONDS:17}]
|
||
// Day 5 - 07:42:[{FAKE_INTRO_SECONDS:17}]
|
||
lines[ lines.size ] = &"GULAG_INTROSCREEN_2";
|
||
// Sgt. Gary 'Roach' Sanderson
|
||
lines[ lines.size ] = &"GULAG_INTROSCREEN_3";
|
||
// Task Force 141
|
||
lines[ lines.size ] = &"GULAG_INTROSCREEN_4";
|
||
// 40 miles east of Petropavlovsk, Russia
|
||
lines[ lines.size ] = &"GULAG_INTROSCREEN_5";
|
||
thread maps\_introscreen::introscreen_feed_lines( lines );
|
||
|
||
|
||
flag_wait( "approach_dialogue" );
|
||
|
||
|
||
|
||
wait( 1 );
|
||
|
||
|
||
radio_dialogue_stop();
|
||
|
||
// Two going in hot.
|
||
thread radio_dialogue( "gulag_lbp2_goinghot" );
|
||
flag_set( "going_in_hot" );
|
||
|
||
// Roger.
|
||
thread radio_dialogue( "gulag_lbp1_roger" );
|
||
wait( 3.65 );
|
||
|
||
delayThread( 7, ::blend_in_gulag_dof, 11 );
|
||
|
||
//flag_wait( "guns_guns_guns" );
|
||
|
||
//array_thread( level.deathFlags[ "first_tower" ][ "ai" ], ::glassy_pain );// temp thing to get some glass in the air
|
||
|
||
//thread armed_heli_fires_turrets();
|
||
|
||
wait( 0.5 );
|
||
// Gunsgunsguns. guns guns guns
|
||
thread radio_dialogue( "gulag_lbp2_guns" );
|
||
wait( 1.85 );
|
||
|
||
// level.heli_armed mgon();
|
||
wait( 1 );
|
||
|
||
// Gunsgunsguns.
|
||
thread radio_dialogue( "gulag_lbp2_guns2" );
|
||
wait( 1.9 );
|
||
|
||
delayThread( 4, ::kill_deathflag, "first_tower" );
|
||
|
||
// delayThread( 2, ::flag_set, "num2_moves_on" );
|
||
|
||
flag_set( "player_heli_uses_modified_yaw" );
|
||
|
||
wait( 1 );
|
||
// Two-two, two-one - good effect on target.
|
||
delayThread( 1, ::radio_dialogue_overlap, "gulag_lbp1_goodeffect" );
|
||
|
||
|
||
foreach ( heli in level.friendly_helis )
|
||
{
|
||
heli mgon();
|
||
foreach ( turret in heli.mgturret )
|
||
{
|
||
turret SetMode( "auto_nonai" );
|
||
}
|
||
}
|
||
|
||
// level.player_heli_tag RotateTo( ( 0, 90, 0 ), 2, 1, 1 );
|
||
// level.player PlayerLinkToBlend( level.player_heli_tag, "tag_origin", time, accel time, decel time);
|
||
|
||
|
||
|
||
// Peeling.
|
||
//radio_dialogue( "gulag_lbp2_peeling" );
|
||
|
||
|
||
// delayThread( 2, ::flag_set, "start_your_attack" );
|
||
|
||
/*
|
||
// Hornet Five-Three, go ahead and start your attack run.
|
||
radio_dialogue( "gulag_lbp1_startattack" );
|
||
|
||
// Roger that. Rolling in.
|
||
radio_dialogue( "gulag_lbp3_rollingin" );
|
||
*/
|
||
|
||
|
||
level.stabilize_offset = 3;// how much the player heli rotates relative to the gulag center
|
||
level.player_heli thread player_heli_rotates_properly_around_gulag();
|
||
|
||
|
||
wait( 3.2 );
|
||
|
||
// All snipers this is Raptor, standby to engage.
|
||
level.soap thread dialogue_queue( "gulag_rpt_stbyengage" );
|
||
delayThread( 2, ::gulag_player_snipes );
|
||
|
||
wait( 3 );
|
||
|
||
// player heli flies up to a shooting position
|
||
|
||
wait( 0.65 );
|
||
// Stabilize.
|
||
level.soap thread dialogue_queue( "gulag_rpt_stabilize" );
|
||
|
||
flag_wait( "stabilize" );
|
||
|
||
/*
|
||
|
||
// On target.
|
||
radio_dialogue( "gulag_tco_ontarget" );
|
||
*/
|
||
|
||
wait( 0.75 );
|
||
// All snipers - cleared to engage.
|
||
level.soap thread dialogue_queue( "gulag_rpt_clearedengage" );
|
||
delayThread( 2, ::flag_set, "soap_snipes_tower" );
|
||
|
||
// Roger.
|
||
thread radio_dialogue( "gulag_lbp1_roger2" );
|
||
|
||
delayThread( 8, ::kill_deathflag, "stab1_clear", 6 );
|
||
|
||
old_time = GetTime();
|
||
flag_wait( "stab1_clear" );
|
||
//wait_for_buffer_time_to_pass( old_time, 6 );
|
||
|
||
flag_clear( "stabilize" );
|
||
flag_clear( "soap_snipes_tower" );
|
||
wait( 0.75 );
|
||
|
||
// Shift right.
|
||
wait( 0.75 );
|
||
level.soap thread dialogue_queue( "gulag_rpt_shiftright" );
|
||
wait( 1.25 );
|
||
flag_set( "stab1_shift" );
|
||
|
||
// Shifting.
|
||
thread radio_dialogue( "gulag_lbp1_shifting" );
|
||
|
||
// timer = GetTime();
|
||
flag_wait( "stabilize" );
|
||
// Assert( timer != GetTime() );
|
||
|
||
delayThread( 2, ::flag_set, "soap_snipes_tower" );
|
||
|
||
// thread off so the dialogue can cut off if the tower is killed
|
||
thread second_tower_stabilize_dialogue();
|
||
// Stabilize.
|
||
// Ready.
|
||
// On target.
|
||
|
||
|
||
delayThread( 8, ::kill_deathflag, "second_tower_clear", 4 );
|
||
//flag_wait( "second_tower_clear" );
|
||
wait( 4 );
|
||
|
||
car_blows_up = GetEnt( "car_blows_up", "script_noteworthy" );
|
||
RadiusDamage( car_blows_up.origin, 1200, 5000, 5000 );
|
||
|
||
|
||
tarp_puller_spawners = GetEntArray( "tarp_puller_spawner", "targetname" );
|
||
array_thread( tarp_puller_spawners, ::spawn_ai );
|
||
|
||
|
||
|
||
/*
|
||
// the tarp ents are in a prefab so just find the nearest
|
||
tarp_ents = GetEntArray( "tarp_pull_org", "targetname" );
|
||
slamraam_center = GetEnt( "slamraam_center", "script_noteworthy" );
|
||
tarp = getClosest( slamraam_center.origin, tarp_ents );
|
||
tarp waittill( "tarp_activate" );
|
||
*/
|
||
level waittill( "tarp_activate" );
|
||
|
||
// flag_set( "slamraam_gets_players_attention" );
|
||
// wait( 0.7 );
|
||
// tarp thread slamraam_attacks( 1.5, 2.3 );
|
||
delayThread( 4, ::kill_deathflag, "sam_cleared", 2.5 );
|
||
|
||
//old_time = GetTime();
|
||
flag_wait( "sam_cleared" );
|
||
flag_clear( "soap_snipes_tower" );
|
||
//wait_for_buffer_time_to_pass( old_time, 6 );
|
||
|
||
wait( 0.5 );
|
||
|
||
|
||
|
||
|
||
|
||
// thread debug_heli_times();
|
||
|
||
// Shift right.
|
||
delayThread( 2.2, ::exploder, "main_building" );
|
||
level.soap thread dialogue_queue( "gulag_rpt_shiftright2" );
|
||
// wait( 1.25 );
|
||
|
||
|
||
wait( 1.5 );
|
||
flag_set( "stab2_clear" );
|
||
|
||
// delayThread( 8, ::kill_deathflag, "stab2_clear" );
|
||
// flag_wait( "stab2_clear" );
|
||
flag_clear( "stabilize" );
|
||
|
||
// Shifting.
|
||
radio_dialogue( "gulag_lbp1_shifting2" );
|
||
}
|
||
|
||
start_perimeter()
|
||
{
|
||
array_spawn_function_noteworthy( "goal_delete_spawner", ::delete_on_player_land );
|
||
thread gulag_top_drones();
|
||
|
||
// teleport the helis to closer in positions
|
||
heli_intro_player = GetEnt( "heli_intro_player", "targetname" );
|
||
player_start = getstruct( "start_player_perimeter", "script_noteworthy" );
|
||
heli_intro_player.origin = player_start.origin;
|
||
heli_intro_player.angles = player_start.angles;
|
||
remap_targets( heli_intro_player.target, player_start.targetname );
|
||
heli_intro_player.target = player_start.targetname;
|
||
|
||
thread spawn_player_heli();
|
||
|
||
level.player SetPlayerAngles( ( 0, -163, 0 ) );
|
||
speed = 24;
|
||
level.player_heli Vehicle_SetSpeedImmediate( speed, speed / 4, speed / 4 );
|
||
|
||
level.stabilize_offset = 3;// how much the player heli rotates relative to the gulag center
|
||
level.player_heli thread player_heli_rotates_properly_around_gulag();
|
||
blend_in_gulag_dof( 3 );
|
||
}
|
||
|
||
start_f15()
|
||
{
|
||
array_spawn_function_noteworthy( "goal_delete_spawner", ::delete_on_player_land );
|
||
|
||
// teleport the helis to closer in positions
|
||
heli_intro_player = GetEnt( "heli_intro_player", "targetname" );
|
||
player_start = getstruct( "f15_attack_start", "script_noteworthy" );
|
||
heli_intro_player.origin = player_start.origin;
|
||
heli_intro_player.angles = player_start.angles;
|
||
remap_targets( heli_intro_player.target, player_start.targetname );
|
||
heli_intro_player.target = player_start.targetname;
|
||
|
||
thread spawn_player_heli();
|
||
|
||
// level.player SetPlayerAngles( ( 0, -163, 0 ) );
|
||
speed = 40;
|
||
level.player_heli Vehicle_SetSpeedImmediate( speed, speed / 4, speed / 4 );
|
||
|
||
level.stabilize_offset = 3;// how much the player heli rotates relative to the gulag center
|
||
level.player_heli thread player_heli_rotates_properly_around_gulag();
|
||
blend_in_gulag_dof( 3 );
|
||
}
|
||
|
||
/*
|
||
}
|
||
|
||
start_unload()
|
||
{
|
||
// teleport the helis to closer in positions
|
||
heli_intro_player = GetEnt( "heli_intro_player", "targetname" );
|
||
player_start = getstruct( "start_unload", "script_noteworthy" );
|
||
heli_intro_player.origin = player_start.origin;
|
||
heli_intro_player.angles = player_start.angles;
|
||
remap_targets( heli_intro_player.target, player_start.targetname );
|
||
heli_intro_player.target = player_start.targetname;
|
||
|
||
friendly_starts = getstructarray( "start_unload_friendly", "script_noteworthy" );
|
||
friendly_heli_spawners = GetEntArray( "intro_heli_1", "targetname" );
|
||
foreach ( index, spawner in friendly_heli_spawners )
|
||
{
|
||
remap_targets( spawner.target, friendly_starts[ index ].targetname );
|
||
spawner.origin = friendly_starts[ index ].origin;
|
||
spawner.target = friendly_starts[ index ].targetname;
|
||
}
|
||
|
||
thread spawn_player_heli();
|
||
|
||
spawners = GetEntArray( "intro_heli_1", "targetname" );
|
||
thread spawn_friendly_helis( spawners );
|
||
|
||
|
||
level.player SetPlayerAngles( ( 0, -163, 0 ) );
|
||
level.player_heli Vehicle_SetSpeedImmediate( 84, 84 / 4, 84 / 4 );
|
||
|
||
level.stabilize_offset = 3;// how much the player heli rotates relative to the gulag center
|
||
level.player_heli thread player_heli_rotates_properly_around_gulag();
|
||
}
|
||
|
||
gulag_landing()
|
||
{
|
||
*/
|
||
|
||
gulag_perimeter()
|
||
{
|
||
level.treadfx_maxheight = undefined;
|
||
level.skip_treadfx = undefined;
|
||
level notify( "stop_special_treadfx" );
|
||
|
||
thread f15_gulag_attack();
|
||
|
||
// plane_sound_nodes = GetVehicleNodeArray( "plane_sound", "script_noteworthy" );
|
||
// array_thread( plane_sound_nodes, maps\_f15::plane_sound_node );
|
||
|
||
flag_set( "gulag_perimeter" );
|
||
// I see 4 hostiles on the next tower!
|
||
level.soap delayThread( 1.8, ::dialogue_queue, "gulag_cmt_seehostiles" );
|
||
|
||
flag_wait( "f15_gulag_explosion" );
|
||
battlechatter_off( "allies" );
|
||
|
||
wait( 2 );
|
||
// level.friendlyFireDisabled = 1;
|
||
autosave_by_name( "gulag_perimeter" );
|
||
// when you duck behind the main fortress, new helis spawn in so they are timed with you
|
||
//thread prepare_perimeter_slamraam_attack();
|
||
|
||
level.player GiveWeapon( "m4m203_reflex_arctic" );
|
||
|
||
level notify( "stop_gulag_drones" );
|
||
|
||
thread player_loses_ads_briefly();
|
||
|
||
|
||
/*
|
||
flag_wait( "slamraam_killed_2" );
|
||
|
||
exploding_tower_spawners = GetEntArray( "exploding_tower_spawner", "targetname" );
|
||
//delaythread( 2.5, ::array_spawn, exploding_tower_spawners );
|
||
|
||
wait( 3 );
|
||
flag_set( "move_to_boom_tower" );
|
||
|
||
level.player_heli waittill( "reached_dynamic_path_end" );
|
||
level.player_heli SetNearGoalNotifyDist( 8 );
|
||
level.player_heli waittill_any( "near_goal", "goal" );
|
||
|
||
|
||
flag_wait( "player_heli_backs_up" );
|
||
*/
|
||
|
||
// Hang on!
|
||
wait( 3.5 );
|
||
thread radio_dialogue( "gulag_lbp1_hangon" );
|
||
thread flyby_earthquake();
|
||
|
||
wait( 2.9 );
|
||
// Command, we need those Russian naval vessels to cease fire immediately! That was too close!
|
||
iprint( "Hargrove, get the navy to cease fire immediately! That was too close!" );
|
||
thread radio_dialogue( "gulag_rpt_tooclose" );
|
||
|
||
/*
|
||
level.friendlyFireDisabled = 0;
|
||
//level.stabilize_offset = 5; // how much the player heli rotates relative to the gulag center
|
||
flag_wait( "stabilize" );
|
||
|
||
// Stabilize.
|
||
thread radio_dialogue( "gulag_rpt_stabilize3" );
|
||
|
||
// Ready.
|
||
thread radio_dialogue( "gulag_lbp1_ready2" );
|
||
|
||
// On target.
|
||
//radio_dialogue( "gulag_wrm_ontarget2" );
|
||
|
||
// On target.
|
||
thread radio_dialogue( "gulag_tco_ontarget2" );
|
||
|
||
// Take 'em out.
|
||
thread radio_dialogue( "gulag_rpt_takeemout" );
|
||
|
||
// delayThread( 8, ::kill_deathflag, "stab3_clear" );
|
||
wait( 6.15 );
|
||
thread radio_dialogue( "gulag_rpt_shiftright" );
|
||
wait( 1.5 );
|
||
//flag_set( "stab3_clear" );
|
||
|
||
flag_clear( "stabilize" );
|
||
|
||
flag_wait( "stabilize" );
|
||
thread radio_dialogue( "gulag_rpt_stabilize" );
|
||
// First wave going in.
|
||
thread radio_dialogue( "gulag_lbp2_firstwave" );
|
||
|
||
wait( 4 );
|
||
exploder( 40 );
|
||
delayThread( 0.25, ::exploder, 93 );
|
||
wait( 0.5 );
|
||
flag_set( "stab4_clear" );
|
||
|
||
|
||
|
||
tower_4_radius_damage = GetEnt( "tower_4_radius_damage", "targetname" );
|
||
RadiusDamage( tower_4_radius_damage.origin, tower_4_radius_damage.radius, 2000, 2000 );
|
||
|
||
//wait( 0.8 );
|
||
level notify( "stop_gulag_drones" );
|
||
// Hang on!
|
||
thread radio_dialogue( "gulag_lbp1_hangon" );
|
||
|
||
// Command, we need those Russian naval vessels to cease fire immediately! That was too close!
|
||
thread radio_dialogue( "gulag_rpt_tooclose" );
|
||
|
||
*/
|
||
|
||
thread bhd_heli_attack_setup();
|
||
|
||
thread ai_field_blocker();
|
||
|
||
noself_delayCall( 11, ::SetSavedDvar, "g_friendlyNameDist", 15000 );
|
||
|
||
battlechatter_off( "allies" );
|
||
delayThread( 41, ::battlechatter_on, "allies" );
|
||
thread friendlies_traverse_gulag_exterior();
|
||
|
||
iprint( "The navy doesn't care about one man in a Gulag. I'll try to buy you some time but I can't promise much." );
|
||
// Roger, we are currently negotiating with the commander of Russian naval forces for more time. Out.
|
||
thread radio_dialogue( "gulag_hqr_moretime" );
|
||
|
||
// Crazy motherfu**ers. Are these the good Russians or the bad Russians!
|
||
thread radio_dialogue( "gulag_tco_goodorbad" );
|
||
|
||
// Taco cut the chatter. Stay frosty.
|
||
thread radio_dialogue( "gulag_rpt_cutchatter" );
|
||
|
||
/*
|
||
// Three-One, troops are on the deck.
|
||
thread radio_dialogue( "gulag_lbp2_ondeck";
|
||
|
||
// This is Three-One, troops are on the deck, going into holding pattern.
|
||
thread radio_dialogue( "gulag_lbp2_holdingpatt";
|
||
*/
|
||
|
||
// Second wave going in. Standby.
|
||
thread radio_dialogue( "gulag_lbp1_2ndwave" );
|
||
|
||
//// Fifty feet.
|
||
//thread radio_dialogue( "gulag_lbp1_50ft";
|
||
|
||
// Ten feet.
|
||
thread radio_dialogue( "gulag_lbp1_10ft" );
|
||
|
||
thread gulag_landing_update_entities();
|
||
|
||
|
||
ai = GetAIArray( "allies" );
|
||
foreach ( guy in ai )
|
||
{
|
||
guy pathrandompercent_set( 200 );
|
||
}
|
||
|
||
//wait( 4 );
|
||
level.player_heli waittill( "nearing_landing" );
|
||
|
||
//thread soap_paths_to_node_then_leads();
|
||
|
||
wait( 0.3 );
|
||
|
||
// Go! Go! Go!
|
||
level.soap delaythread( 3, ::generic_dialogue_queue, "gulag_rpt_gogogo" );
|
||
|
||
// Two-One touching down at target.
|
||
thread radio_dialogue( "gulag_lbp1_touchdown" );
|
||
|
||
// Team One is deployed. Going into holding pattern.
|
||
thread radio_dialogue( "gulag_lbp1_deployed" );
|
||
|
||
// Five-Three going into overhead pattern to provide sniper cover, over.
|
||
thread radio_dialogue( "gulag_lbp3_snipercover" );
|
||
|
||
// Five-Three, this is Two-One, solid copy on all.
|
||
thread radio_dialogue( "gulag_lbp1_solidcopy" );
|
||
|
||
level.soap set_force_color( "cyan" );
|
||
|
||
level.soap StopLookAt();
|
||
|
||
thread armory_roach_is_down();
|
||
|
||
// flag_wait( "player_lands" );
|
||
level.player_heli waittill( "stable_for_unlink" );
|
||
|
||
level.player SetActionSlot( 1, "nightvision" );
|
||
level.player GiveWeapon( "claymore" );
|
||
level.player SetActionSlot( 4, "weapon", "claymore" );
|
||
level.player GiveMaxAmmo( "claymore" );
|
||
|
||
level.player thread playerSnowFootsteps( "disable_exterior_fx" );
|
||
level.player PlayerSetGroundReferenceEnt( undefined );
|
||
|
||
Missile_DeleteAttractor( level.player_repulsor );
|
||
|
||
|
||
ai = GetAIArray( "allies" );
|
||
foreach ( guy in ai )
|
||
{
|
||
guy pathrandompercent_set( 200 );
|
||
}
|
||
|
||
|
||
// point the player off the heli at the right angle then unlink
|
||
angles = level.player_view_controller GetTagAngles( "tag_aim" );
|
||
angles = ( 0, angles[ 1 ], 0 );
|
||
forward = AnglesToForward( angles );
|
||
forward *= 32;
|
||
|
||
/*
|
||
ent = spawn_tag_origin();
|
||
ent.origin = level.player.origin;
|
||
|
||
level.player PlayerLinkToDelta( ent, "tag_origin", 1, 180, 180, 90, 90, true );
|
||
level.player_view_controller Delete();
|
||
movetime = 0.5;
|
||
ent MoveTo( ent.origin + forward + (0,0,8), movetime, 0.2, 0.2 );
|
||
wait( movetime );
|
||
*/
|
||
|
||
ent = spawn_tag_origin();
|
||
ent.origin = level.player_view_controller.origin;
|
||
ent.angles = level.player_view_controller.angles;
|
||
|
||
level.player_view_controller LinkTo( ent );
|
||
movetime = 0.2;
|
||
ent MoveTo( ent.origin + forward + ( 0, 0, 4 ), movetime, 0.1, 0.1 );
|
||
wait( movetime );
|
||
level.player_view_controller Delete();
|
||
ent Delete();
|
||
//level.player Unlink();
|
||
level.player AllowProne( true );
|
||
level.player AllowCrouch( true );
|
||
level.player AllowSprint( true );
|
||
level.player AllowJump( true );
|
||
|
||
|
||
autosave_by_name( "player_lands" );
|
||
|
||
level.soap forceUseWeapon( "m4m203_reflex_arctic", "primary" );
|
||
flag_set( "access_control_room" );
|
||
|
||
|
||
|
||
|
||
//activate_trigger_with_targetname( "friendly_gulag_top" );
|
||
|
||
/*
|
||
black_overlay = create_client_overlay( "black", 0, level.player );
|
||
black_overlay FadeOverTime( 1 );
|
||
black_overlay.alpha = 1;
|
||
wait( 2 );
|
||
nextmission();
|
||
*/
|
||
|
||
}
|
||
|
||
start_control_room()
|
||
{
|
||
struct = getstruct( "ghost_spawner_struct", "targetname" );
|
||
ghost_spawner = GetEnt( "ghost", "script_noteworthy" );
|
||
ghost_spawner.script_drone = undefined;
|
||
ghost_spawner.origin = struct.origin;
|
||
ghost_spawner.angles = struct.angles;
|
||
|
||
spawners = GetEntArray( "start_controlroom_spawner", "targetname" );
|
||
spawners = update_soap_spawner( spawners );
|
||
spawners[ spawners.size ] = ghost_spawner;
|
||
array_thread( spawners, ::spawn_ai );
|
||
|
||
|
||
player_org = GetEnt( "start_controlroom_player", "targetname" );
|
||
level.player SetOrigin( player_org.origin );
|
||
level.player SetPlayerAngles( player_org.angles );
|
||
}
|
||
|
||
soap_chats_outside_gulag()
|
||
{
|
||
// flag_init( "soap_chats_outside_gulag" );
|
||
flag_wait( "player_inside_gulag" );
|
||
|
||
// This is it! We go in, grab Prisoner 627, and get out! Ready?
|
||
level.soap dialogue_queue( "gulag_cmt_getout" );
|
||
|
||
flag_set( "start_armory_music" );
|
||
// Check your corners! Let's go!
|
||
level.soap thread dialogue_queue( "gulag_cmt_checkcorners" );
|
||
wait( 1.5 );
|
||
flag_set( "soap_finishes_talking_about_going_in" );
|
||
// flag_set( "soap_chats_outside_gulag" );
|
||
}
|
||
|
||
gulag_cellblocks()
|
||
{
|
||
flag_wait( "player_progresses_passed_ext_area" );
|
||
kill_deathflag( "upper_balcony_deathflag", 4 );
|
||
|
||
if ( !flag( "player_nears_cell_door1" ) )
|
||
{
|
||
activate_trigger_with_targetname( "ext_finished" );
|
||
thread push_friendlies_forward_on_flag();
|
||
}
|
||
|
||
flag_wait( "postup_outside_gulag" );
|
||
|
||
thread soap_chats_outside_gulag();
|
||
|
||
ai = GetAIArray( "allies" );
|
||
foreach ( guy in ai )
|
||
{
|
||
if ( IsDefined( guy.old_pathrandompercent ) )
|
||
guy pathrandompercent_reset();
|
||
}
|
||
|
||
add_global_spawn_function( "axis", ::ambush_behavior );
|
||
add_global_spawn_function( "allies", ::enable_cqbwalk );// for guys that spawn once we're inside
|
||
|
||
// This is it. We need to get in there, break him out of the cellblock, and get out.
|
||
// Ok, let's go! Check those corners.
|
||
|
||
// <Ghost> The control hub is up ahead. I can use it to find Prisoner #627.
|
||
|
||
ai = GetAIArray( "allies" );
|
||
foreach ( guy in ai )
|
||
{
|
||
guy.baseaccuracy = 1;
|
||
guy.attackeraccuracy = 1;
|
||
}
|
||
// array_thread( ai, ::set_force_color, "g" );
|
||
|
||
// wait for these 2 to die before moving in
|
||
flag_wait_either( "last_outside_guys", "player_moves_into_gulag" );
|
||
|
||
level.soap set_force_color( "cyan" );
|
||
|
||
if ( !flag( "player_nears_cell_door1" ) )
|
||
activate_trigger_with_targetname( "outside_gulag_postup" );
|
||
|
||
//flag_wait_either( "outside_gulag_dialogue", "enable_interior_fx" );
|
||
// flag_wait_either( "soap_chats_outside_gulag", "enable_interior_fx" );
|
||
flag_wait( "player_moves_into_gulag" );
|
||
|
||
|
||
friendly_respawn_trigger = GetEnt( "friendly_reinforcement_trigger", "targetname" );
|
||
friendly_respawn_trigger thread reinforcement_friendlies();
|
||
|
||
|
||
|
||
// In this section of script, the 2 guys standing in the volume get to be purple guys and stand in a certain spot.
|
||
// If we cant find two non heroes in the volume then other guys become purple. The rest of the non heroes become
|
||
// orange.
|
||
volume = GetEnt( "purple_friendlies_priority_volume", "targetname" );
|
||
ai = GetAIArray( "allies" );
|
||
ai = remove_heroes_from_array( ai );
|
||
|
||
purple_guys = 0;
|
||
foreach ( index, guy in ai )
|
||
{
|
||
if ( guy IsTouching( volume ) )
|
||
{
|
||
purple_guys++;
|
||
guy set_force_color( "p" );
|
||
ai[ index ] = undefined;
|
||
}
|
||
}
|
||
|
||
ai = remove_dead_from_array( ai );
|
||
for ( i = purple_guys; i < 2; i++ )
|
||
{
|
||
if ( !isalive( ai[ i ] ) )
|
||
continue;
|
||
|
||
ai[ i ] set_force_color( "p" );
|
||
ai[ i ] = undefined;
|
||
}
|
||
|
||
ai = remove_dead_from_array( ai );
|
||
foreach ( guy in ai )
|
||
{
|
||
guy set_force_color( "o" );
|
||
}
|
||
|
||
if ( !flag( "player_nears_cell_door1" ) )
|
||
activate_trigger_with_targetname( "pre_controlroom_postup" );
|
||
|
||
//thread gulag_cellblocks_friendlies_go_to_control_room();
|
||
|
||
// flag_wait( "enable_interior_fx" );
|
||
|
||
flag_wait( "soap_finishes_talking_about_going_in" );
|
||
|
||
volume = GetEnt( "control_room_hallway_volume", "targetname" );
|
||
volume waittill_volume_dead_or_dying();
|
||
|
||
|
||
if ( !flag( "player_nears_cell_door1" ) )
|
||
activate_trigger_with_targetname( "control_room_postup" );
|
||
|
||
|
||
flag_wait( "disable_exterior_fx" );
|
||
|
||
// That's the control room up ahead! I can use it to find our prisoner!
|
||
ghost_line( "gulag_gst_controlroom" );
|
||
|
||
|
||
thread ghost_uses_laptop();
|
||
|
||
|
||
// player enters the control room
|
||
flag_wait( "control_room" );
|
||
|
||
thread gulag_cellblocks_spotlight();
|
||
//flag_set( "open_cell_door1" );
|
||
|
||
if ( IsAlive( level.ghost ) )
|
||
{
|
||
level.ghost disable_ai_color();
|
||
}
|
||
else
|
||
{
|
||
AssertEx( !is_default_start(), "Ghost was dead on default start!" );
|
||
}
|
||
|
||
|
||
ai = GetAIArray( "allies" );
|
||
excluders = [];
|
||
excluders[ 0 ] = level.soap;
|
||
excluders[ 1 ] = level.ghost;
|
||
ai = get_array_of_closest( level.player.origin, ai, excluders );
|
||
|
||
extra_friendlies = 2;
|
||
// the 2 closest guys stay on the friendly chain
|
||
for ( i = 0; i < extra_friendlies; i++ )
|
||
{
|
||
guy = ai[ i ];
|
||
if ( !isalive( guy ) )
|
||
continue;
|
||
|
||
guy set_force_color( "g" );
|
||
guy allies_have_low_attacker_accuracy();
|
||
}
|
||
|
||
for ( i = extra_friendlies; i < ai.size; i++ )
|
||
{
|
||
ai[ i ] disable_ai_color();
|
||
}
|
||
|
||
add_global_spawn_function( "allies", ::allies_have_low_attacker_accuracy );
|
||
|
||
wait_while_enemy_near_player();
|
||
battlechatter_off( "allies" );
|
||
|
||
flag_set( "ghost_goes_to_laptop" );
|
||
|
||
if ( isalive( level.ghost ) )
|
||
level.ghost set_battlechatter( false );
|
||
|
||
// I'll tap into their system and look for the prisoner! It's gonna take some time!
|
||
ghost_line( "gulag_cmt_tapinto" );
|
||
|
||
flag_set( "cell_duty" );
|
||
|
||
thread friendly_cellblock_respawner();
|
||
|
||
if ( !flag( "player_nears_cell_door1" ) )
|
||
activate_trigger_with_targetname( "first_cell_postup" );
|
||
|
||
|
||
// Copy that! Roach, we're on cell duty! Follow me!
|
||
level.soap dialogue_queue( "gulag_cmt_cellduty" );
|
||
|
||
flag_wait( "player_nears_cell_door1" );
|
||
|
||
thread teleport_ghost_to_laptop_if_possible();
|
||
|
||
flag_wait( "cellblock_clear1" );
|
||
|
||
wait( 0.5 );
|
||
// Cell clear.
|
||
radio_dialogue( "gulag_tf1_cellclear" );
|
||
wait( 0.4 );
|
||
|
||
flag_wait( "ghost_uses_laptop" );
|
||
// All right, I'm patched in. I'm tracking your progress on the security cameras.
|
||
radio_dialogue( "gulag_gst_patchedin" );
|
||
|
||
// Copy that! Do you have the location of Prisoner 627?
|
||
level.soap dialogue_queue( "gulag_cmt_location" );
|
||
|
||
delayThread( 1.5, ::flag_set, "spotlight_turns_on" );
|
||
// Negative, but I've got a searchlight tracking hostiles on your floor. That should make your job easier.
|
||
radio_dialogue( "gulag_gst_jobeasier" );
|
||
|
||
|
||
// Roger that! Roach! Stay sharp! The prisoner may be in one of these cells!
|
||
level.soap dialogue_queue( "gulag_cmt_staysharp" );
|
||
|
||
|
||
battlechatter_on( "allies" );
|
||
|
||
// activate_trigger_with_targetname( "vol_blocked_by_celldoor2" );
|
||
|
||
flag_wait( "player_nears_cell_door2" );
|
||
|
||
thread insure_player_has_enemies_to_fight_for_door_sequence();
|
||
|
||
// Ghost, we've hit a security door, get it open!
|
||
level.soap dialogue_queue( "gulag_cmt_secdoor" );
|
||
|
||
// Workin' on it...this hardware is ancient!
|
||
thread radio_dialogue( "gulag_cmt_ancient" );
|
||
wait( 2.5 );
|
||
|
||
flag_set( "open_cell_door3" );
|
||
wait( 3 );
|
||
|
||
// Ghost, you opened the wrong door!
|
||
level.soap dialogue_queue( "gulag_cmt_wrongdoor" );
|
||
// Roger, standby
|
||
thread radio_dialogue( "gulag_gst_standby" );
|
||
|
||
wait( 3 );
|
||
|
||
flag_set( "open_cell_door2" );
|
||
|
||
// got it
|
||
radio_dialogue( "gulag_gst_gotit2" );
|
||
activate_trigger_with_targetname( "mid_door_opens" );
|
||
|
||
wait( 1 );
|
||
|
||
// That's better, let's go!
|
||
level.soap dialogue_queue( "gulag_cmt_thatsbetter" );
|
||
// activate_trigger_with_targetname( "vol_blocked_by_celldoor3" );
|
||
|
||
flag_wait( "cell_clear_1" );
|
||
// Cell 4d is clear.
|
||
radio_dialogue( "gulag_tf1_cell4dclear" );
|
||
|
||
flag_wait( "cell_clear_2" );
|
||
// This cell's clear. Move.
|
||
radio_dialogue( "gulag_tf1_cellsclear" );
|
||
|
||
|
||
flag_wait( "player_nears_cell_door4" );
|
||
|
||
|
||
delayThread( 3.5, ::flag_set, "open_cell_door4" );
|
||
|
||
// Talk to me Ghost...these cells are deserted!
|
||
level.soap dialogue_queue( "gulag_cmt_talktome" );
|
||
|
||
enemies_retreat_and_delete();
|
||
|
||
// Got it! Prisoner 627's been transferred to the east wing! Head through the armory in the center - that's the fastest way there.
|
||
radio_dialogue( "gulag_gst_eastwing" );
|
||
|
||
// Roger that! Roach, head for that armory down there! Move!
|
||
level.soap thread dialogue_queue( "gulag_cmt_armorydownthere" );
|
||
activate_trigger_with_targetname( "pre_armory" );// note targetname
|
||
wait( 2.3 );
|
||
|
||
|
||
// Ghost, the cells are deserted, what's going on?
|
||
// The prisoner has been moved. The fastest way out of the cellblocks is to cut through the armory in the center.
|
||
// Alright follow me, we'll stock up while Ghost finds our man.
|
||
|
||
// Ok - next door in three, two -
|
||
|
||
// level waittill( "opened_cell_door4" );
|
||
flag_set( "pre_armory_open" );
|
||
activate_trigger_with_noteworthy( "pre_armory" );// note, noteworthy
|
||
|
||
|
||
flag_wait( "player_approaches_armory" );
|
||
ai = GetAIArray( "axis" );
|
||
array_thread( ai, ::die_soon );
|
||
}
|
||
|
||
start_armory()
|
||
{
|
||
thread gulag_cellblocks_spotlight();
|
||
|
||
flag_set( "player_nears_cell_door1" );
|
||
flag_set( "pre_armory_open" );
|
||
|
||
activate_trigger_with_noteworthy( "pre_armory" );
|
||
|
||
spawners = GetEntArray( "start_armory_spawner", "targetname" );
|
||
spawners = update_soap_spawner( spawners );
|
||
array_thread( spawners, ::spawn_ai );
|
||
|
||
player_org = GetEnt( "start_armory_player", "targetname" );
|
||
level.player SetOrigin( player_org.origin );
|
||
level.player SetPlayerAngles( player_org.angles );
|
||
|
||
wait( 0.05 );
|
||
level.soap set_force_color( "cyan" );
|
||
}
|
||
|
||
gulag_armory()
|
||
{
|
||
level.soap forceUseWeapon( "mp5", "primary" );
|
||
|
||
ai = GetAIArray( "allies" );
|
||
foreach ( guy in ai )
|
||
{
|
||
guy disable_heat_behavior();
|
||
guy delayThread( 3, ::enable_dontevershoot );
|
||
}
|
||
thread battlechatter_off( "axis" );
|
||
thread battlechatter_off( "allies" );
|
||
|
||
flag_wait( "player_in_armory" );
|
||
|
||
cellblock_spawning_door = getent( "cellblock_spawning_door", "targetname" );
|
||
cellblock_spawning_door connectpaths();
|
||
cellblock_spawning_door notsolid();
|
||
cellblock_spawning_door hide();
|
||
|
||
|
||
|
||
// See anything you like?
|
||
level.soap thread dialogue_queue( "gulag_cmt_seeanything" );
|
||
wait( 1.5 );
|
||
|
||
level.armory_laser_index = 0;// used for good timing on lasers
|
||
add_global_spawn_function( "axis", ::armory_laser_ambush );
|
||
|
||
wait( 2.5 );
|
||
//run_thread_on_targetname( "laser_scan_struct", ::lasers_scan_armory );
|
||
|
||
// Bad news mate. I'm tracking three, no, four hostile squads converging on your position!
|
||
wait( 1 );
|
||
thread radio_dialogue( "gulag_gst_badnews" );
|
||
|
||
wait( 2.1 );
|
||
thread armory_attack_sounds( 4000 );
|
||
wait( 0.9 );
|
||
//delaythread( 3, ::armory_attack_sounds, 2800 );
|
||
wait( 1 );
|
||
// I can hear them coming...let's go! We're too exposed!
|
||
level.soap thread dialogue_queue( "gulag_cmt_hearcoming" );
|
||
delaythread( 0.9, ::activate_trigger_with_targetname, "stand_at_armory_door" );
|
||
//delaythread( 0.9, ::activate_trigger_with_targetname, "escape_armory" );
|
||
|
||
|
||
|
||
start_time = gettime();
|
||
wait( 3.0 );
|
||
//thread armory_attack_sounds( 1000 );
|
||
thread ghost_tries_to_open_door();
|
||
|
||
wait_for_buffer_time_to_pass( start_time, 5.85 );
|
||
|
||
|
||
// Ghost! Open the door!
|
||
level.soap thread dialogue_queue( "gulag_cmt_opendoor" );
|
||
wait( 2.0 );
|
||
|
||
allies = getaiarray( "allies" );
|
||
foreach ( guy in allies )
|
||
{
|
||
guy.baseaccuracy = 10;
|
||
guy disable_surprise();
|
||
}
|
||
|
||
wait( 1.8 );
|
||
delaythread( 2.5, ::enemies_attack_friendlies_in_armory_first_wave );
|
||
|
||
set_player_attacker_accuracy( 0.85 );
|
||
|
||
// Bloody hell, they've locked it from the hard line. I'll have to run a bypass.
|
||
thread radio_dialogue( "gulag_gst_runabypass" );
|
||
wait( 3.4 );
|
||
|
||
// Too late! They're already here!
|
||
level.soap thread dialogue_queue( "gulag_cmt_toolate" );
|
||
|
||
// friendlies run to the edges
|
||
activate_trigger_with_targetname( "armory_attacked_postup" );
|
||
|
||
// fight for awhile, wave style
|
||
wait_until_first_wave_ends();
|
||
start_time = gettime();
|
||
|
||
// enemies miss during the autosave so you don't come out of save in red
|
||
set_player_attacker_accuracy( 0 );
|
||
level.player.ignorerandombulletdamage = true;
|
||
|
||
autosave_by_name_thread( "armory_fight", 10 );
|
||
|
||
wait_for_buffer_time_to_pass( start_time, 3 );
|
||
wait( 0.5 );
|
||
|
||
// reset player to full attackeraccuracy
|
||
maps\_gameskill::updateAllDifficulty();
|
||
level.player.ignorerandombulletdamage = false;
|
||
|
||
|
||
// Be advised - you've got more tangos headed your way.
|
||
thread radio_dialogue( "gulag_gst_gotmoretangos" );
|
||
|
||
allies = getaiarray( "allies" );
|
||
foreach ( guy in allies )
|
||
{
|
||
// aw friendlies lost their accuracy
|
||
guy.baseaccuracy = 0;
|
||
}
|
||
|
||
wait( 2.35 );
|
||
|
||
second_wave_delay = [];
|
||
second_wave_delay[ 0 ] = 5;
|
||
second_wave_delay[ 1 ] = 4;
|
||
second_wave_delay[ 2 ] = 2.5;
|
||
second_wave_delay[ 3 ] = 1.5;
|
||
|
||
delay = second_wave_delay[ level.gameskill ];
|
||
|
||
delaythread( delay, ::enemies_attack_friendlies_in_armory_second_wave );
|
||
|
||
// We're going to need more cover - grab a riot shield!
|
||
level.soap thread dialogue_queue( "gulag_cmt_morecover" );
|
||
|
||
thread player_riotshield_bash_hint();
|
||
|
||
|
||
wait( 1.5 );
|
||
thread friendlies_grab_riotshields();
|
||
flag_set( "friendlies_use_riotshield" );
|
||
|
||
wait( 8 );
|
||
|
||
if ( !player_has_weapon( "riotshield" ) )
|
||
set_player_attacker_accuracy( 1.5 );
|
||
|
||
|
||
thread player_riotshield_nag();
|
||
wait( 5 );
|
||
|
||
|
||
|
||
wait( 1.5 );
|
||
// friendlies run to the door
|
||
activate_trigger_with_targetname( "take_cover_at_armory_door" );
|
||
// activate_trigger_with_targetname( "escape_armory" );
|
||
|
||
|
||
wait( 4.5 );
|
||
// Open the door!!
|
||
level.soap thread dialogue_queue( "gulag_cmt_openthedoor" );
|
||
wait( 2.0 );
|
||
|
||
// <Ghost> Working on it, the main circuit's dead.. Almost there. Standby.
|
||
// radio_dialogue( "gulag_gst_almostthere" );
|
||
|
||
// <Ghost> Almost there, routing through the auxilary circuit.. got it!"
|
||
thread radio_dialogue( "gulag_gst_gotit" );
|
||
|
||
wait( 2.5 );
|
||
level notify( "force_door_open" );
|
||
|
||
level waittill( "cell_door_opens" );
|
||
|
||
activate_trigger_with_targetname( "post_armory" );
|
||
|
||
flag_wait( "run_from_armory" );
|
||
kill_volume = GetEnt( "run_from_armory_kill_volume", "targetname" );
|
||
ai = kill_volume get_ai_touching_volume( "axis" );
|
||
foreach ( guy in ai )
|
||
{
|
||
guy thread die_soon();
|
||
}
|
||
|
||
remove_global_spawn_function( "axis", ::armory_laser_ambush );
|
||
ai = GetAIArray( "axis" );
|
||
array_thread( ai, ::disable_lasers );
|
||
|
||
// reset player to full attackeraccuracy
|
||
maps\_gameskill::updateAllDifficulty();
|
||
|
||
spawn_rappel_rope();
|
||
thread cellblock_rappel_player();
|
||
|
||
level notify( "stop_cellblock_respawn" );
|
||
|
||
|
||
thread friendlies_ignore_grenades_for_awhile();
|
||
|
||
allies = getaiarray( "allies" );
|
||
foreach ( guy in allies )
|
||
{
|
||
// aw friendlies lost their accuracy
|
||
guy.baseaccuracy = 1;
|
||
guy enable_surprise();
|
||
}
|
||
|
||
// Go go go!
|
||
level.soap thread dialogue_queue( "gulag_cmt_gogogo1" );
|
||
|
||
level.riotshield_friendlies = remove_dead_from_array( level.riotshield_friendlies );
|
||
foreach ( guy in level.riotshield_friendlies )
|
||
{
|
||
guy enable_dontevershoot();
|
||
guy riotshield_fastwalk_on();
|
||
}
|
||
|
||
/*
|
||
ai = GetAIArray( "allies" );
|
||
foreach ( guy in ai )
|
||
{
|
||
guy.grenadeawareness = 0.9;
|
||
}
|
||
*/
|
||
|
||
battlechatter_on( "axis" );
|
||
flag_wait( "use_your_riotshield" );
|
||
|
||
cellblock_spawning_door disconnectpaths();
|
||
cellblock_spawning_door solid();
|
||
cellblock_spawning_door show();
|
||
|
||
|
||
if ( level.player GetCurrentWeapon() == "riotshield" )
|
||
{
|
||
flag_clear( "friendlies_use_riotshield" );
|
||
// player is using his riot shield, friendlies draw fire
|
||
|
||
// Use your riot shield to draw their fire!
|
||
level.soap thread dialogue_queue( "gulag_cmt_usesheild" );
|
||
|
||
ai = GetAIArray( "allies" );
|
||
foreach ( guy in ai )
|
||
{
|
||
guy clear_rioter();
|
||
}
|
||
}
|
||
else
|
||
{
|
||
flag_set( "friendlies_use_riotshield" );
|
||
// player is firing, friendlies draw fire with riotshield
|
||
|
||
// I'll draw their fire with the riot shield, you take 'em out!
|
||
level.soap thread dialogue_queue( "gulag_cmt_illdrawfire" );
|
||
}
|
||
|
||
delayThread( 3.5, ::battlechatter_on, "allies" );
|
||
|
||
flag_wait( "last_cellblock_guys_flee" );
|
||
lower_cellblock_enemies_retreat_and_delete();
|
||
|
||
|
||
flag_wait( "rappel_time" );
|
||
allies = getaiarray( "allies" );
|
||
foreach ( guy in allies )
|
||
{
|
||
// aw friendlies lost their accuracy
|
||
guy enable_surprise();
|
||
}
|
||
|
||
thread rappel_time_dialogue();
|
||
}
|
||
|
||
rappel_time_dialogue()
|
||
{
|
||
// Ghost here. Recommend you bypass the lower floors by rappelling out that window.
|
||
radio_dialogue( "gulag_gst_bypassfloors" );
|
||
|
||
// Copy that! Roach, follow me!
|
||
level.soap dialogue_queue( "gulag_cmt_roachfollow" );
|
||
|
||
}
|
||
|
||
start_rappel()
|
||
{
|
||
spawn_rappel_rope();
|
||
|
||
spawners = GetEntArray( "start_rappel_spawner", "targetname" );
|
||
spawners = update_soap_spawner( spawners );
|
||
for ( i = 1; i < spawners.size; i++ )
|
||
{
|
||
spawners[ i ] add_spawn_function( ::replace_on_death );
|
||
}
|
||
|
||
array_thread( spawners, ::spawn_ai );
|
||
|
||
player_org = GetEnt( "start_rappel_player", "targetname" );
|
||
level.player SetOrigin( player_org.origin );
|
||
level.player SetPlayerAngles( player_org.angles );
|
||
cellblock_rappel_player();
|
||
}
|
||
|
||
gulag_solitary_dialogue()
|
||
{
|
||
wait( 1.8 );
|
||
// The camera feed in solitary confinement is dead. The power must be down in that section.
|
||
radio_dialogue( "gulag_gst_feedisdead" );
|
||
|
||
// Roger that. Roach, switch to night vision.
|
||
level.soap dialogue_queue( "gulag_cmt_switchnv" );
|
||
}
|
||
|
||
gulag_rappel()
|
||
{
|
||
flag_set( "access_control_room" );
|
||
flag_set( "control_room" );
|
||
|
||
ai = GetAIArray( "allies" );
|
||
foreach ( guy in ai )
|
||
{
|
||
guy.baseaccuracy = 1;
|
||
guy.attackeraccuracy = 1;
|
||
}
|
||
|
||
// kills the axis and waits if neccessary
|
||
kill_all_axis();
|
||
|
||
level.soap thread hero_rappels();
|
||
|
||
flag_wait( "cellblock_player_starts_rappel" );
|
||
|
||
// push the fog out a bit
|
||
fog_set_changes( "gulag_hallways" );
|
||
|
||
volume = GetEnt( "gulag_hallway_destructibles", "script_noteworthy" );
|
||
volume activate_destructibles_in_volume();
|
||
volume activate_interactives_in_volume();
|
||
|
||
wait( 5 );
|
||
|
||
//level.soap set_force_color( "green" );
|
||
activate_trigger_with_targetname( "cellblock_exit_postup" );
|
||
|
||
thread gulag_solitary_dialogue();
|
||
|
||
// delete the extraneous friendlies
|
||
ai = GetAIArray( "allies" );
|
||
foreach ( guy in ai )
|
||
{
|
||
if ( guy is_hero() )
|
||
continue;
|
||
|
||
if ( IsDefined( guy.magic_bullet_shield ) )
|
||
guy stop_magic_bullet_shield();
|
||
|
||
guy Delete();
|
||
}
|
||
|
||
// spawn some reinforcements
|
||
friendly_cellhall_spawners = GetEntArray( "friendly_cellhall_spawner", "targetname" );
|
||
array_spawn_function( friendly_cellhall_spawners, ::replace_on_death );
|
||
array_thread( friendly_cellhall_spawners, ::spawn_ai );
|
||
|
||
|
||
flag_wait( "leaving_cellblock" );
|
||
activate_trigger_with_targetname( "friendly_nvg_hallway_trigger" );
|
||
|
||
// Switch to night vision.
|
||
//level.soap delayThread( 1.8, ::dialogue_queue, "gulag_cmt_switchnv" );
|
||
level.player delayThread( 1.8, ::display_hint, "nvg" );
|
||
|
||
flag_wait( "nvg_zone" );
|
||
|
||
spawners = GetEntArray( "hallway_runner_spawner", "script_noteworthy" );
|
||
nodes = GetNodeArray( "nvg_ambush_node", "targetname" );
|
||
nodes = array_randomize( nodes );
|
||
array_thread( nodes, ::nodes_are_periodically_bad );
|
||
foreach ( index, spawner in spawners )
|
||
{
|
||
spawner.origin = nodes[ index ].origin;
|
||
}
|
||
|
||
activate_trigger_with_targetname( "friendly_nvg_cell_hall_postup" );
|
||
|
||
thread nvg_hallway_fight();
|
||
|
||
add_wait( ::flag_wait, "lets_sweep_the_nvg_cells" );
|
||
add_func( ::friendlies_move_up_through_cells );
|
||
thread do_wait();
|
||
|
||
|
||
flag_wait( "nvg_leave_cellarea" );
|
||
flag_wait_either( "nvg_fight_spawner", "player_sees_explosion" );
|
||
|
||
DisableForcedSunShadows();// bring back real sun
|
||
exploder( "hall_attack_explosion" );
|
||
level.player delayCall( 0.5, ::ShellShock, "gulag_attack", 5, false );
|
||
level.player delayCall( 0.6, ::setstance, "prone" );
|
||
Earthquake( 0.3, 3, level.player.origin, 5000 );
|
||
level.player PlayRumbleLoopOnEntity( "damage_heavy" );
|
||
level.player delayCall( 2, ::StopRumble, "damage_heavy" );
|
||
axis = GetAIArray( "axis" );
|
||
foreach ( guy in axis )
|
||
{
|
||
if ( Distance( level.player.origin, guy.origin ) < 350 )
|
||
guy delayCall( 0.5, ::Kill );
|
||
}
|
||
|
||
allies = GetAIArray( "allies" );
|
||
foreach ( guy in allies )
|
||
{
|
||
timer = randomfloatrange( 4.5, 6.5 );
|
||
guy thread flashBangStart( timer );
|
||
}
|
||
|
||
delayThread( 1.5, ::exploder, "hall_attack" );
|
||
thread drop_riotshield();
|
||
|
||
add_wait( ::flag_wait, "nvg_disable_night_vision" );
|
||
add_func( ::display_hint, "disable_nvg" );
|
||
thread do_wait();
|
||
|
||
vision_set_changes( "gulag_hallways", 4 );
|
||
|
||
wait( 5 );
|
||
thread soap_is_angry_about_attack();
|
||
|
||
//thread gulag_hallway_explodes();
|
||
|
||
flag_wait( "nvg_disable_night_vision" );
|
||
|
||
// flag_wait( "nvg_fight_spawner" );
|
||
//spawners = GetEntArray( "nvg_fight_spawner", "targetname" );
|
||
//array_thread( spawners, ::spawn_ai );
|
||
//spawners = GetEntArray( "post_nvg_fight_spawner", "targetname" );
|
||
//array_thread( spawners, ::spawn_ai );
|
||
|
||
|
||
// flag_wait( "nvg_advance_onward" );
|
||
// wait( 10.4 );
|
||
}
|
||
|
||
start_tunnel()
|
||
{
|
||
spawners = GetEntArray( "friendly_tunnel_spawner", "targetname" );
|
||
spawners = update_soap_spawner( spawners );
|
||
for ( i = 1; i < spawners.size; i++ )
|
||
{
|
||
spawners[ i ] add_spawn_function( ::replace_on_death );
|
||
}
|
||
|
||
array_thread( spawners, ::spawn_ai );
|
||
|
||
player_org = Getstruct( "start_tunnel_player", "targetname" );
|
||
level.player SetOrigin( player_org.origin );
|
||
level.player SetPlayerAngles( player_org.angles );
|
||
}
|
||
|
||
gulag_tunnel()
|
||
{
|
||
activate_trigger_with_targetname( "pipe_tunnel_fight_nodes" );
|
||
|
||
flag_wait( "go_to_pipearea_postup" );
|
||
thread throw_flash_trigger();
|
||
|
||
wait( 0.5 ); // give time for baddies to stackup
|
||
|
||
volume = GetEnt( "tunnel_pre_hallway_volume", "targetname" );
|
||
volume add_wait( ::waittill_volume_dead_or_dying );
|
||
add_wait( ::_wait, 15 );
|
||
level add_wait( ::waittill_msg, "flashed_room" );
|
||
do_wait_any();
|
||
|
||
// Go go go!
|
||
level.soap thread dialogue_queue( "gulag_cmt_gogogo1" );
|
||
wait( 0.15 );
|
||
|
||
activate_trigger_with_targetname( "pipe_tunnel_postup" );
|
||
ai = getaiarray( "allies" );
|
||
foreach ( guy in ai )
|
||
{
|
||
guy thread move_on_pipe();
|
||
}
|
||
|
||
//flag_wait( "cell_hallway_explodes" );
|
||
|
||
//activate_trigger_with_targetname( "pipe_tunnel_postup" );
|
||
battlechatter_on( "axis" );
|
||
battlechatter_on( "allies" );
|
||
|
||
flag_wait( "advance_through_pipearea" );
|
||
EnableForcedNoSunShadows();// gbye real sun
|
||
// SetSavedDvar( "compass", "0" );
|
||
|
||
// wait( 2 );
|
||
//iprint( "Its too narrow! Roach, sweep the corridor and we'll follow once its clear." );
|
||
|
||
level notify( "stop_music" );
|
||
|
||
// Its too narrow! Roach, sweep the corridor and we'll follow once its clear! Go!
|
||
//level.soap thread dialogue_queue( "gulag_cmt_toonarrow" );
|
||
|
||
fog_set_changes( "gulag" );
|
||
|
||
flag_wait( "friendlies_follow_pipe_area" );
|
||
|
||
// Go go go!
|
||
level.soap thread dialogue_queue( "gulag_cmt_gogogo1" );
|
||
|
||
activate_trigger_with_targetname( "breach_bathroom_postup" );
|
||
|
||
flag_wait( "nearing_bathroom_breach" );
|
||
|
||
ai = getaiarray( "allies" );
|
||
foreach ( guy in ai )
|
||
{
|
||
guy.fixednode = true;
|
||
}
|
||
|
||
// The old shower room's about thirty feet ahead on your left. You'll have to breach the wall to get in.
|
||
thread radio_dialogue( "gulag_gst_30ftonleft" );
|
||
}
|
||
|
||
|
||
start_bathroom()
|
||
{
|
||
// mbs on the one guy
|
||
spawners = GetEntArray( "friendly_bathroom_spawner", "targetname" );
|
||
spawners = update_soap_spawner( spawners );
|
||
|
||
if ( level.start_point == "bathroom" )
|
||
{
|
||
for ( i = 1; i < spawners.size; i++ )
|
||
{
|
||
spawners[ i ] add_spawn_function( ::replace_on_death );
|
||
}
|
||
}
|
||
|
||
array_thread( spawners, ::spawn_ai );
|
||
|
||
start_point = GetEnt( "start_bathroom_player", "targetname" );
|
||
level.player SetOrigin( start_point.origin );
|
||
level.player SetPlayerAngles( start_point.angles );
|
||
|
||
activate_trigger_with_targetname( "breach_bathroom_postup" );
|
||
}
|
||
|
||
|
||
|
||
enable_bathroom_complete_trigger()
|
||
{
|
||
trigger_ent = GetEnt( "player_rappels_from_bathroom", "script_noteworthy" );
|
||
trigger_ent waittill( "trigger" );
|
||
flag_set( "player_exited_bathroom" );
|
||
}
|
||
|
||
gulag_bathroom()
|
||
{
|
||
fog_set_changes( "gulag" );
|
||
|
||
flag_wait( "leaving_pipe_area" );
|
||
// bathroom_spawn_rappel_rope();
|
||
// flag_set( "breach_door_icon_" + 2 );
|
||
|
||
// bathroom_c4 glow();
|
||
// bathroom_c4 Show();
|
||
|
||
add_global_spawn_function( "axis", ::higher_max_facedist );
|
||
add_global_spawn_function( "axis", ::track_spawn_time );
|
||
|
||
level waittill( "breaching" );
|
||
|
||
delaythread( 0.05, ::remove_global_spawn_function, "axis", ::track_spawn_time );
|
||
|
||
axis = getaiarray( "axis" );
|
||
foreach ( guy in axis )
|
||
{
|
||
if ( !isdefined( guy.spawn_time ) || guy.spawn_time != gettime() )
|
||
guy thread die_soon();
|
||
}
|
||
|
||
volume = GetEnt( "gulag_shower_destructibles", "script_noteworthy" );
|
||
volume activate_destructibles_in_volume();
|
||
volume activate_interactives_in_volume();
|
||
|
||
level.player.attackeraccuracy = 0;
|
||
level.player delayThread( 6, maps\_gameskill::update_player_attacker_accuracy );
|
||
|
||
flag_wait( "player_enters_bathroom" );
|
||
|
||
|
||
// friendlies run in
|
||
activate_trigger_with_noteworthy( "first_friendly_bathroom_trigger" );
|
||
|
||
thread friendlies_traverse_bathroom();
|
||
|
||
thread maps\_ambient::activateAmbient( "gulag_shower_int0" );
|
||
thread enable_bathroom_complete_trigger();
|
||
|
||
|
||
// Spread out!
|
||
level.soap delayThread( 3.5, ::dialogue_queue, "gulag_cmt_spreadout" );
|
||
|
||
activate_trigger_with_targetname( "bathroom_initial_enemies" );
|
||
|
||
//thread friendlies_traverse_showers();
|
||
delay = 15;
|
||
|
||
delayThread( delay, ::activate_trigger_with_targetname, "bathroom_balcony_room1_trigger" );
|
||
|
||
// Hostiles on the second floor! Take them out!
|
||
level.soap delayThread( delay + 3, ::dialogue_queue, "gulag_cmt_hostiles2ndfloor" );
|
||
|
||
flag_wait( "bathroom_start_second_wave" );
|
||
|
||
// more baddies come in
|
||
bathroom_second_wave();
|
||
|
||
// Use the lockers for cover!
|
||
add_wait( ::flag_wait, "use_lockers_for_cover" );
|
||
level.soap add_func( ::dialogue_queue, "gulag_cmt_uselockers" );
|
||
thread do_wait();
|
||
|
||
riot_shield_detector = GetEnt( "riot_shield_detector", "targetname" );
|
||
riot_shield_detector thread riot_shield_detector_think();
|
||
|
||
add_wait( ::flag_wait, "bathroom_room2_enemies_dead" );
|
||
add_wait( ::flag_wait, "leaving_bathroom_vol2" );// fail safe
|
||
do_wait_any();
|
||
|
||
thread bathroom_periodic_autosave();
|
||
|
||
autosave_by_name( "bathroom_cleared" );
|
||
|
||
//activate_trigger_with_targetname( "bathroom_vol2" );
|
||
//flag_wait_or_timeout( "leaving_bathroom_vol2", 35 );
|
||
flag_wait( "leaving_bathroom_vol2" );
|
||
|
||
/*
|
||
shower_friendly_triggers = GetEntArray( "shower_friendly_trigger", "script_noteworthy" );
|
||
array_thread( shower_friendly_triggers, ::self_delete );
|
||
*/
|
||
|
||
// I<>m heading for that hole in the floor on the far side of the showers! Follow me! Let's go!
|
||
level.soap thread dialogue_queue( "gulag_cmt_holeinfloor" );
|
||
|
||
activate_trigger_with_targetname( "cistern_friendly_trigger" );
|
||
|
||
//activate_trigger_with_targetname( "bathroom_vol3" );
|
||
|
||
// Go go go!
|
||
level.soap delayThread( 2.5, ::dialogue_queue, "gulag_cmt_gogogo1" );
|
||
|
||
|
||
|
||
|
||
ai = GetAIArray( "allies" );
|
||
foreach ( guy in ai )
|
||
{
|
||
guy.attackeraccuracy = 0;
|
||
}
|
||
|
||
thread friendly_hole_rappel();
|
||
//thread bathroom_rappel_player();
|
||
|
||
//wait( 5 );
|
||
/*
|
||
activate_trigger_with_targetname( "bathroom_rappel" );
|
||
wait( 0.1 );
|
||
ai = GetAIArray( "allies" );
|
||
foreach ( guy in ai )
|
||
{
|
||
guy disable_ai_color();
|
||
}
|
||
|
||
*/
|
||
|
||
flag_wait( "player_exited_bathroom" );
|
||
add_global_spawn_function( "allies", ::waterfx, "rescue_begins" );
|
||
|
||
ai = GetAIArray( "allies" );
|
||
array_thread( ai, ::waterfx, "rescue_begins" );
|
||
level.player thread waterfx( "rescue_begins" );
|
||
|
||
|
||
remove_global_spawn_function( "axis", ::higher_max_facedist );
|
||
|
||
|
||
run_thread_on_targetname( "slide_trigger", ::sewer_slide_trigger );
|
||
|
||
ai = GetAIArray( "bad_guys" );
|
||
array_thread( ai, ::die_soon );
|
||
|
||
|
||
thread maps\_ambient::activateAmbient( "gulag_exit" );
|
||
|
||
autosave_by_name( "reached_sewers" );
|
||
|
||
thread gulag_cistern_dialogue();
|
||
|
||
|
||
add_wait( ::flag_wait, "friendly_rappels_from_bathroom" );
|
||
add_func( ::activate_trigger_with_targetname, "breach_rescue_trigger" );
|
||
thread do_wait();
|
||
}
|
||
|
||
gulag_cistern_dialogue()
|
||
{
|
||
if ( flag( "player_approaches_rescue_breach" ) )
|
||
return;
|
||
level endon( "player_approaches_rescue_breach" );
|
||
|
||
flag_wait( "friendly_rappels_from_bathroom" );
|
||
wait( 1.5 );
|
||
// Ghost, we<77>re in the old tunnel system <20> which way?
|
||
level.soap dialogue_queue( "gulag_cmt_whichway" );
|
||
|
||
// I'm checking the blueprints, standby. Ok. Head fifty meters along that tunnel to the west.
|
||
radio_dialogue( "gulag_gst_50meters" );
|
||
wait( 3 );
|
||
|
||
// Talk to me Ghost...I don<6F>t want to be down here when those ships start firing again.
|
||
level.soap dialogue_queue( "gulag_cmt_startfiring" );
|
||
|
||
// Keep going - you should see an old cistern in thirty meters.
|
||
radio_dialogue( "gulag_gst_cistern" );
|
||
}
|
||
|
||
start_rescue()
|
||
{
|
||
// mbs on the one guy
|
||
spawners = GetEntArray( "start_rescue_spawner", "targetname" );
|
||
spawners = update_soap_spawner( spawners );
|
||
for ( i = 1; i < spawners.size; i++ )
|
||
{
|
||
spawners[ i ] add_spawn_function( ::magic_bullet_shield );
|
||
}
|
||
|
||
array_thread( spawners, ::spawn_ai );
|
||
|
||
player_org = GetEnt( "start_rescue_player", "targetname" );
|
||
level.player SetOrigin( player_org.origin );
|
||
level.player SetPlayerAngles( player_org.angles );
|
||
activate_trigger_with_targetname( "breach_rescue_trigger" );
|
||
}
|
||
|
||
gulag_rescue()
|
||
{
|
||
level._effect[ "breach_door" ] = level._effect[ "breach_price" ];
|
||
|
||
flag_wait( "player_approaches_rescue_breach" );
|
||
// dont let slowmo breach change this stuff
|
||
level.slowmo_breach_disable_stancemod = true;
|
||
|
||
remove_global_spawn_function( "allies", ::enable_cqbwalk );
|
||
remove_global_spawn_function( "allies", ::waterfx );
|
||
|
||
|
||
ai = GetAIArray( "bad_guys" );
|
||
array_thread( ai, ::die_soon );
|
||
|
||
flag_set( "rescue_begins" );
|
||
level.player.dont_unlink_after_breach = true;
|
||
level.forced_slowmo_breach_slowdown = true;
|
||
|
||
autosave_by_name( "end_breach" );
|
||
|
||
// I'm detecting two heat signatures, one of them should be prisoner 627
|
||
thread radio_dialogue( "gulag_gst_8tangos" );
|
||
|
||
trigger_from = level.breach_groups[ 3 ].trigger;
|
||
trigger_to = level.breach_groups[ 4 ].trigger;
|
||
|
||
// stop this breach when it starts so we can teleport
|
||
level.skip_breach = [];
|
||
level.skip_breach[ 3 ] = true;
|
||
ent = spawn_tag_origin();
|
||
ent.origin = level.breach_groups[ 3 ].left_post.origin;
|
||
ent.angles = level.breach_groups[ 3 ].left_post.angles;
|
||
|
||
arm_ent = spawn_tag_origin();
|
||
|
||
from_org = trigger_from.origin;
|
||
from_angles = trigger_from.angles;
|
||
|
||
ai = GetAIArray( "allies" );
|
||
|
||
for ( ;; )
|
||
{
|
||
// make sure the breach started
|
||
trigger_from waittill( "trigger" );
|
||
if ( !level.player maps\_slowmo_breach::breach_failed_to_start() )
|
||
break;
|
||
}
|
||
|
||
|
||
SetSavedDvar( "g_friendlynamedist", 0 );
|
||
|
||
|
||
level.doPickyAutosaveChecks = false;// ammo doesn't matter anymore
|
||
ending_room_spawners = GetEntArray( "ending_room_spawner", "targetname" );
|
||
/*
|
||
foreach ( spawner in ending_room_spawners )
|
||
{
|
||
spawner delayThread( 2, ::spawn_ai );
|
||
}
|
||
*/
|
||
|
||
waittillframeend;// wait for trigger_to to start breach logic
|
||
|
||
|
||
level.player DontInterpolate();
|
||
arm_ent.origin = level.player.origin;
|
||
arm_ent.angles = level.player.angles;
|
||
arm_ent LinkTo( ent );
|
||
level.player PlayerLinkTo( arm_ent, "tag_origin", 1, 0, 0, 0, 0, 0 );
|
||
|
||
ent.origin = level.breach_groups[ 4 ].left_post.origin;
|
||
ent.angles = level.breach_groups[ 4 ].left_post.angles;
|
||
|
||
thread gulag_finish_rescue_thread( trigger_to, ai );
|
||
|
||
if ( level.start_point == "ending" )
|
||
{
|
||
wait( 0.05 );// if we're from a start point we need to let the sun get turned off before we turn it back on
|
||
}
|
||
|
||
DisableForcedSunShadows();// lets get some sunlight in here
|
||
SetSavedDvar( "ai_friendlysuppression", 0 );
|
||
SetSavedDvar( "ai_friendlyfireblockduration", 0 );
|
||
|
||
//thread player_cavein(); //kill player if he falls behind
|
||
|
||
delayThread( 0.05, ::exploder, "rock_glass" );
|
||
|
||
trash_sound = GetEnt( "trash_sound", "script_noteworthy" );
|
||
trash_sound thread maps\gulag_ending_code::trash_sound_think();
|
||
|
||
run_thread_on_targetname( "hallway_flicker_light", maps\gulag_ending_code::hallway_flicker_light );
|
||
thread maps\_utility::set_ambient( "gulag_exit" );
|
||
|
||
level waittill( "breaching" );
|
||
|
||
level.player SetStance( "stand" );
|
||
level.player EnableInvulnerability();
|
||
level.player DisableWeaponSwitch();
|
||
level.player DisableOffhandWeapons();
|
||
level.player AllowCrouch( false );
|
||
level.player AllowProne( false );
|
||
level.player AllowSprint( false );
|
||
level.player AllowJump( false );
|
||
|
||
|
||
delayThread( 4, ::vision_set_fog_changes, "gulag_ending", 4 );
|
||
|
||
level.player.attackeraccuracy = 0;
|
||
level.player.IgnoreRandomBulletDamage = true;
|
||
level.player delayThread( 15, maps\_gameskill::update_player_attacker_accuracy );
|
||
|
||
spawner = GetEnt( "price_spawner", "targetname" );
|
||
spawner spawn_ai();
|
||
|
||
// level.price forceUseWeapon( "mp5", "primary" );
|
||
|
||
spawner = GetEnt( "price_choke_spawner", "targetname" );
|
||
chokey = spawner spawn_ai();
|
||
chokey.animname = "chokey";
|
||
chokey gun_remove();
|
||
chokey.health = 5000;
|
||
|
||
chokey add_damage_function( ::bloody_pain );
|
||
|
||
struct = getstruct( "ending_breach_org", "targetname" );
|
||
level.price_breach_struct = struct;
|
||
//ent = Spawn( "script_origin", (0,0,0) );
|
||
ent = spawn_tag_origin();
|
||
//ent thread maps\_debug::drawTagForever( "tag_origin" );
|
||
ent.origin = struct.origin;
|
||
ent.angles = struct.angles;
|
||
|
||
// tweak the position of the scene model from script for iteration
|
||
localtrans = SpawnStruct();
|
||
localtrans.entity = ent;
|
||
localtrans.forward = -38;
|
||
localtrans.right = -24;
|
||
localtrans translate_local();
|
||
|
||
player_rig = spawn_anim_model( "player_rig" );
|
||
player_rig Hide();
|
||
|
||
strangle_chain = spawn_anim_model( "strangle_chain" );
|
||
|
||
guys = [];
|
||
guys[ guys.size ] = level.price;
|
||
guys[ guys.size ] = chokey;
|
||
guys[ guys.size ] = player_rig;
|
||
guys[ guys.size ] = strangle_chain;
|
||
|
||
|
||
foreach ( guy in guys )
|
||
{
|
||
guy LinkTo( ent );
|
||
}
|
||
level.price_breach_ent = ent;
|
||
|
||
time = GetAnimLength( level.price getanim( "price_breach" ) );
|
||
time -= 2;
|
||
delayThread( time, maps\gulag_ending_code::player_gets_knocked_out_by_price, player_rig );
|
||
|
||
ent anim_first_frame( guys, "price_breach" );
|
||
wait( 2.2 );
|
||
thread price_breach_dof();
|
||
|
||
level.price thread play_sound_on_entity( "scn_gulag_price_rescue_foley" );
|
||
delayThread( 3.95, ::play_sound_in_space, "scn_gulag_price_rescue_punch", level.player GetEye() );
|
||
delayThread( 4.35, ::play_sound_in_space, "scn_gulag_price_rescue_bodyfall", level.player GetEye() );
|
||
|
||
|
||
// launch his chair
|
||
chair = GetEnt( "price_chair", "targetname" );
|
||
targ = getstruct( chair.target, "targetname" );
|
||
angles = VectorToAngles( targ.origin - chair.origin );
|
||
forward = AnglesToForward( angles );
|
||
|
||
chair delayCall( 0.5, ::PhysicsLaunchClient, chair.origin + ( 0, 0, 20 ), forward * 2000 );
|
||
ent anim_single( guys, "price_breach" );
|
||
|
||
level.player SetMoveSpeedScale( 1 );
|
||
|
||
//ent.origin = struct.origin;
|
||
//ent.angles = struct.angles;
|
||
|
||
axis = GetAIArray( "axis" );
|
||
foreach ( guy in axis )
|
||
{
|
||
guy Delete();
|
||
}
|
||
|
||
spawner = GetEnt( "endlog_soap_spawner", "targetname" );
|
||
spawner.count = 1;
|
||
spawner spawn_ai();
|
||
|
||
spawner = GetEntArray( "endlog_redshirt_spawner", "targetname" )[ 0 ];
|
||
spawner.count = 1;
|
||
spawner spawn_ai();
|
||
|
||
strangle_chain delete();
|
||
|
||
level.soap gun_remove();
|
||
price_1911 = spawn_anim_model( "1911" );
|
||
|
||
guys = [];
|
||
guys[ guys.size ] = level.price;
|
||
|
||
animation = level.price getanim( "price_rescue_intro" );
|
||
time = getanimlength( animation );
|
||
ent delaythread( time, ::old_soap );
|
||
|
||
// ent delayThread( 0.6, ::anim_single_solo, player_rig, "price_rescue_intro" );
|
||
// ent anim_single( guys, "price_rescue_intro" );
|
||
|
||
guys[ "player" ] = player_rig;
|
||
// ent thread anim_loop( guys, "price_rescue_intro_loop" );
|
||
|
||
// wait( 2.7 );
|
||
// ent notify( "stop_loop" );
|
||
|
||
guys[ guys.size ] = level.redshirt;
|
||
guys[ guys.size ] = level.soap;
|
||
guys[ "gun" ] = price_1911;
|
||
|
||
level.price Unlink();
|
||
|
||
|
||
|
||
// // Drop it!
|
||
// level.soap delayThread( 0.8, ::generic_dialogue_queue, "gulag_cmt_heswithus" );
|
||
// // Soap?
|
||
// level.price delayThread( 3, ::generic_dialogue_queue, "gulag_pri_soap" );
|
||
// // Captain<69> This belongs to you sir.
|
||
// level.soap delayThread( 5.2, ::generic_dialogue_queue, "gulag_cmt_belongstoyou" );
|
||
// // Come on, we gotta get outta here! Move! Move!
|
||
// level.soap delayThread( 11.2, ::generic_dialogue_queue, "gulag_cmt_getouttaheremove" );
|
||
// // Who's Soap?
|
||
// level.redshirt delayThread( 14.15, ::generic_dialogue_queue, "gulag_wrm_whosoap" );
|
||
|
||
ent thread anim_single( guys, "price_rescue" );
|
||
|
||
delaythread( 8.15, ::play_sound_in_space, "gulag_pri_soap", level.price.origin );
|
||
delaythread( 10.75, ::play_sound_in_space, "gulag_cmt_price", level.price.origin );
|
||
delaythread( 12.7, ::play_sound_in_space, "gulag_cmt_thisbelongs", level.price.origin );
|
||
|
||
animation = level.soap getanim( "price_rescue" );
|
||
time = GetAnimLength( animation );
|
||
offset = 1.5;
|
||
wait( time - offset );
|
||
|
||
|
||
level.soap forceUseWeapon( "m4_grunt", "primary" );
|
||
level.price notify( "change_to_regular_weapon" );
|
||
flag_set( "escape_the_gulag" );
|
||
price_1911 Delete();
|
||
|
||
SetSavedDvar( "g_friendlynamedist", 196 );
|
||
|
||
thread finish_rescue_sequence( offset );
|
||
}
|
||
|
||
gulag_finish_rescue_thread( trigger_to, ai )
|
||
{
|
||
wait( 0.1 );
|
||
trigger_to notify( "trigger", level.player );
|
||
|
||
wait( 2.5 );
|
||
level notify( "kill_color_replacements" );
|
||
|
||
friendlies = GetAIArray( "allies" );
|
||
foreach ( guy in friendlies )
|
||
{
|
||
if ( guy is_hero() )
|
||
continue;
|
||
|
||
if ( IsDefined( guy.magic_bullet_shield ) )
|
||
guy stop_magic_bullet_shield();
|
||
|
||
guy Delete();
|
||
}
|
||
|
||
foreach ( guy in ai )
|
||
{
|
||
if ( !isalive( guy ) )
|
||
continue;
|
||
|
||
if ( IsDefined( guy.magic_bullet_shield ) )
|
||
guy stop_magic_bullet_shield();
|
||
|
||
guy Delete();
|
||
}
|
||
|
||
}
|
||
|
||
|
||
finish_rescue_sequence( offset )
|
||
{
|
||
wait( offset + 0.5 );
|
||
|
||
level.player EnableWeapons();
|
||
|
||
weapons = level.player GetWeaponsListPrimaries();
|
||
|
||
foreach ( weapon in weapons )
|
||
{
|
||
if ( IsSubStr( weapon, "riot" ) )
|
||
continue;
|
||
|
||
level.player SwitchToWeapon( weapon );
|
||
break;
|
||
}
|
||
|
||
//level.player PlayerSetGroundReferenceEnt( undefined );
|
||
level.player Unlink();
|
||
level.player DisableInvulnerability();
|
||
level.player EnableWeaponSwitch();
|
||
level.player EnableOffhandWeapons();
|
||
level.player AllowSprint( true );
|
||
level.player AllowJump( true );
|
||
level.player AllowCrouch( true );
|
||
level.player AllowProne( true );
|
||
|
||
time = 1.7;
|
||
dif = time / 20;
|
||
|
||
for ( i = 0; i <= 1; i += dif )
|
||
{
|
||
level.player SetMoveSpeedScale( i );
|
||
wait( 0.05 );
|
||
}
|
||
}
|
||
|
||
|
||
gulag_objectives()
|
||
{
|
||
waittillframeend;// wait for friendlies to spawn or whatever
|
||
|
||
if ( is_default_start() )
|
||
{
|
||
// wait for initial "30 seconds" dialogue
|
||
wait( 2 );
|
||
}
|
||
else
|
||
{
|
||
waittillframeend;// wait for friendlies to spawn or whatever
|
||
}
|
||
|
||
// Rescue Prisoner #627.
|
||
Objective_Add( 1, "current", &"GULAG_FIND_POW", pow_org() );
|
||
Objective_OnEntity( 1, level.soap );
|
||
Objective_Current( 1 );
|
||
|
||
switch ( level.start_point )
|
||
{
|
||
case "default":
|
||
case "intro":
|
||
case "approach":
|
||
case "unload":
|
||
case "f15":
|
||
setsaveddvar( "ui_hidemap", 1 );
|
||
flag_wait( "player_lands" );
|
||
setsaveddvar( "ui_hidemap", 0 );
|
||
// Follow Captain MacTavish into the Gulag.
|
||
Objective_Add( 2, "current", &"GULAG_FOLLOW_SOAP", ( 0, 0, 0 ) );
|
||
Objective_Current( 2 );
|
||
Objective_OnEntity( 2, level.soap );
|
||
flag_wait( "postup_outside_gulag" );
|
||
objective_complete( 2 );
|
||
|
||
case "control_room":
|
||
|
||
/*
|
||
// Seize the gulag command center.
|
||
Objective_Add( 2, "current", &"GULAG_CONTROL_ROOM", control_room_org() );
|
||
Objective_OnEntity( 2, level.soap, (0, 0, 70) );
|
||
Objective_Current( 2 );
|
||
|
||
flag_wait( "control_room_baddies_die" );
|
||
wait( 1 );
|
||
flag_wait( "control_room" );
|
||
|
||
Objective_State( 2, "done" );
|
||
*/
|
||
Objective_Current( 1 );
|
||
flag_wait( "cell_duty" );
|
||
remove_global_spawn_function( "allies", ::no_grenades );
|
||
|
||
case "armory":
|
||
// Sweep the cells for the Prisoner.
|
||
Objective_Add( 3, "current", &"GULAG_CELL_DUTY", cellblock_sweep_org() );
|
||
Objective_OnEntity( 3, level.soap );
|
||
Objective_Current( 3 );
|
||
flag_wait( "leaving_cellblock" );
|
||
objective_complete( 3 );
|
||
|
||
Objective_Current( 1 );
|
||
Objective_OnEntity( 1, level.soap );
|
||
|
||
case "rappel":
|
||
case "tunnel":
|
||
case "bathroom":
|
||
|
||
flag_wait( "advance_through_pipearea" );
|
||
struct = getstruct( "hallway_obj_struct", "targetname" );
|
||
Objective_Position( 1, struct.origin );
|
||
|
||
flag_wait( "nearing_bathroom_breach" );
|
||
SetSavedDvar( "compass", "0" );
|
||
battlechatter_off( "axis" );// otherwise guy inside gets pissed when he spawns
|
||
MusicStop( 3 );
|
||
wait( 4 );
|
||
level notify( "stop_objective_updating" );
|
||
// Plant the breaching charge.
|
||
Objective_Add( 4, "current", &"GULAG_BREACH_THE_BATHROOM", breach_org() );
|
||
Objective_Current( 4 );
|
||
SetSavedDvar( "compass", "1" );
|
||
maps\_slowmo_breach::objective_breach( 4, 2 );
|
||
|
||
//iprint( "Not on the door Roach, we're taking a shortcut through the wall." );
|
||
wait_until_player_breaches_bathroom();
|
||
battlechatter_on( "axis" );
|
||
objective_complete( 4 );
|
||
Objective_Current( 1 );
|
||
Objective_OnEntity( 1, level.soap );
|
||
|
||
flag_wait( "leaving_bathroom_vol2" );
|
||
wait( 2 );
|
||
|
||
case "rescue":
|
||
|
||
Objective_OnEntity( 1, level.soap );
|
||
// Objective_Position( 1, breach_rescue_org() );
|
||
flag_wait( "player_approaches_rescue_breach" );
|
||
// Plant the breaching charge.
|
||
Objective_State( 4, "active" );
|
||
maps\_slowmo_breach::objective_breach( 4, 3 );
|
||
Objective_OnEntity( 2, level.soap );
|
||
Objective_Current( 4 );
|
||
|
||
level waittill( "breaching" );
|
||
setsaveddvar( "compass", 0 );
|
||
|
||
flag_wait( "price_rescued" );
|
||
flag_wait( "escape_the_gulag" );
|
||
setsaveddvar( "compass", 1 );
|
||
|
||
objective_complete( 1 );
|
||
objective_complete( 4 );
|
||
|
||
case "ending":
|
||
case "run":
|
||
case "cafe":
|
||
case "evac":
|
||
// Escape the gulag.
|
||
Objective_Add( 6, "current", &"GULAG_ESCAPE", evac_obj_org() );
|
||
Objective_Current( 6 );
|
||
|
||
flag_wait( "exit_collapses" );
|
||
wait( 0.25 );
|
||
//wait( 1.5 );
|
||
SetSavedDvar( "compass", 0 );
|
||
// wait( 4 );
|
||
// Objective_Position( 6, evac_obj_org_end() );
|
||
|
||
break;
|
||
default:
|
||
AssertMsg( "No objectives set for this start point" );
|
||
}
|
||
}
|
||
|
||
gulag_startpoint_catchup_thread()
|
||
{
|
||
waittillframeend;// let the actual start functions run before this one
|
||
start = level.start_point;
|
||
|
||
if ( is_default_start() )
|
||
return;
|
||
|
||
thread control_room_destructibles_turn_on();
|
||
|
||
if ( start == "intro" )
|
||
return;
|
||
|
||
SetSavedDvar( "compass", "0" );
|
||
SetSavedDvar( "ammoCounterHide", 1 );
|
||
SetSavedDvar( "hud_showStance", 0 );
|
||
SetSavedDvar( "hud_drawhud", 1 );
|
||
|
||
if ( start == "approach" )
|
||
return;
|
||
|
||
flag_set( "player_heli_uses_modified_yaw" );
|
||
|
||
gulag_player_loadout(); // Moved to before the wait so prechaching can happen in give_default_loadout in coop
|
||
wait( 0.05 );
|
||
vision_set_fog_changes( "gulag_circle", 1 );
|
||
|
||
car_blows_up = GetEnt( "car_blows_up", "script_noteworthy" );
|
||
RadiusDamage( car_blows_up.origin, 1200, 5000, 5000 );
|
||
|
||
flag_set( "approach_dialogue" );
|
||
flag_set( "slamraam_gets_players_attention" );
|
||
|
||
flag_set( "stab2_clear" );
|
||
|
||
if ( start == "unload" )
|
||
return;
|
||
if ( start == "f15" )
|
||
return;
|
||
|
||
thread armory_roach_is_down();
|
||
|
||
SetSavedDvar( "g_friendlyNameDist", 15000 );
|
||
SetSavedDvar( "compass", "1" );
|
||
SetSavedDvar( "ammoCounterHide", 0 );
|
||
SetSavedDvar( "hud_showStance", 1 );
|
||
SetSavedDvar( "hud_drawhud", 1 );
|
||
|
||
flag_set( "stop_rotating_around_gulag" );
|
||
flag_set( "player_heli_uses_modified_yaw" );
|
||
|
||
wait( 0.05 );
|
||
vision_set_fog_changes( "gulag", 1 );
|
||
|
||
|
||
if ( start == "bhd" )
|
||
return;
|
||
|
||
flag_set( "access_control_room" );
|
||
flag_set( "player_progresses_passed_ext_area" );
|
||
if ( start == "control_room" )
|
||
return;
|
||
|
||
remove_global_spawn_function( "allies", ::no_grenades );
|
||
|
||
|
||
maps\_compass::setupMiniMap( "compass_map_gulag_2" );
|
||
|
||
add_global_spawn_function( "axis", ::ambush_behavior );
|
||
add_global_spawn_function( "allies", ::enable_cqbwalk );
|
||
|
||
flag_set( "gulag_cell_doors_enabled" );
|
||
flag_set( "enable_interior_fx" );
|
||
flag_set( "disable_exterior_fx" );
|
||
flag_set( "pre_armory_open" );
|
||
|
||
flag_set( "spotlight_turns_on" );
|
||
flag_set( "start_armory_music" );
|
||
if ( start == "armory" )
|
||
return;
|
||
|
||
thread player_riotshield_bash_hint();
|
||
|
||
flag_set( "access_control_room" );
|
||
flag_set( "run_from_armory" );
|
||
|
||
if ( start == "rappel" )
|
||
return;
|
||
|
||
fog_set_changes( "gulag_hallways" );
|
||
flag_set( "cell_duty" );
|
||
flag_set( "go_to_pipearea_postup" );
|
||
if ( start == "tunnel" )
|
||
return;
|
||
|
||
flag_set( "nearing_bathroom_breach" );
|
||
flag_set( "leaving_pipe_area" );
|
||
flag_set( "advance_through_pipearea" );
|
||
flag_set( "access_control_room" );
|
||
flag_set( "control_room" );
|
||
flag_set( "leaving_pipe_area" );
|
||
|
||
if ( start == "bathroom" )
|
||
return;
|
||
|
||
if ( start == "so_showers" )
|
||
return;
|
||
|
||
fog_set_changes( "gulag" );
|
||
flag_set( "player_enters_bathroom" );
|
||
|
||
maps\gulag_ending::gulag_ending_startpoint_catchup_thread();
|
||
}
|
||
|
||
|
||
gulag_music()
|
||
{
|
||
waittillframeend; // for start points, so flags are init'd properly
|
||
|
||
switch ( level.start_point )
|
||
{
|
||
case "default":
|
||
case "intro":
|
||
time = musicLength( "gulag_intro" );
|
||
MusicPlayWrapper( "gulag_intro", 0 );
|
||
wait time;
|
||
|
||
case "approach":
|
||
case "unload":
|
||
case "f15":
|
||
case "control_room":
|
||
|
||
thread MusicLoop( "gulag_intro_repeatable" );
|
||
|
||
flag_wait( "start_armory_music" );
|
||
level notify( "stop_music" );
|
||
MusicStop( 3 );
|
||
wait 3;
|
||
|
||
case "armory":
|
||
case "rappel":
|
||
case "tunnel":
|
||
|
||
thread MusicLoop( "gulag_armory" );
|
||
flag_wait( "nearing_bathroom_breach" );
|
||
level notify( "stop_music" );
|
||
MusicStop( 5 );
|
||
|
||
case "bathroom":
|
||
|
||
level waittill( "breaching" );
|
||
wait 0.15;
|
||
thread MusicLoop( "gulag_showers" );
|
||
flag_wait( "player_exited_bathroom" );
|
||
level notify( "stop_music" );
|
||
MusicStop( 3.1 );
|
||
wait 3.15;
|
||
thread MusicLoop( "gulag_sewer_loop" );
|
||
|
||
case "rescue":
|
||
flag_wait( "player_approaches_rescue_breach" );
|
||
level notify( "stop_music" );
|
||
MusicStop( 5.5 );
|
||
level waittill( "breaching" );
|
||
|
||
case "ending":
|
||
case "run":
|
||
case "cafe":
|
||
thread MusicPlaywrapper( "gulag_liftoff1of2", 0 );
|
||
|
||
case "evac":
|
||
flag_wait( "player_falls_down" );
|
||
MusicStop( 1 );
|
||
|
||
flag_wait( "evac_begins" );
|
||
thread MusicPlaywrapper( "gulag_liftoff2of2", 0 );
|
||
break;
|
||
|
||
default:
|
||
AssertMsg( "No objectives set for this start point" );
|
||
}
|
||
}
|