iw6-scripts/maps/mp/mp_alien_dlc3_escape.gsc
2024-02-13 13:20:49 +01:00

736 lines
22 KiB
Plaintext

// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
hide_escape_geo( var_0 )
{
var_1 = getent( var_0, "targetname" );
var_1 connectpaths();
var_1 notsolid();
var_1 hide();
var_2 = undefined;
switch ( var_0 )
{
case "escape_blocker_1_forcefield":
var_2 = "escape_blocker_1";
break;
case "escape_blocker_2_forcefield":
var_2 = "escape_blocker_2";
break;
case "escape_blocker_3_forcefield":
var_2 = "escape_blocker_3";
break;
}
var_3 = getent( var_2, "targetname" );
if ( isdefined( var_3 ) )
var_3 setscriptablepartstate( 0, "ff_down" );
}
show_escape_geo( var_0 )
{
var_1 = getent( var_0, "targetname" );
var_1 disconnectpaths();
var_1 solid();
var_1 show();
var_2 = undefined;
switch ( var_0 )
{
case "escape_blocker_1_forcefield":
var_2 = "escape_blocker_3";
break;
case "escape_blocker_2_forcefield":
var_2 = "escape_blocker_2";
break;
case "escape_blocker_3_forcefield":
var_2 = "escape_blocker_1";
break;
}
var_3 = getent( var_2, "targetname" );
if ( isdefined( var_3 ) )
var_3 setscriptablepartstate( 0, "open" );
}
escape_timer()
{
level endon( "game_ended" );
common_scripts\utility::exploder( 102 );
set_escape_earthquake_values( 0.12, 0.18, 3, 5 );
level thread escape_earthquakes();
foreach ( var_1 in level.players )
var_1 thread escape_timer_fx();
wait 300;
level.escape_timer_expired = 1;
if ( !maps\mp\alien\_utility::is_true( level.final_blocker_finished ) )
level thread maps\mp\gametypes\aliens::alienendgame( "axis", 3 );
}
aud_loop_starts()
{
wait 10.5;
level.aud_shake = spawn( "script_origin", ( 3877, 1877, 1108 ) );
level.aud_shake playloopsound( "scn_descent_end_shake_lp" );
for (;;)
{
wait( randomfloatrange( 4.0, 6.0 ) );
level.player playsound( "scn_descent_end_debris" );
}
}
run_out_music()
{
wait 12;
foreach ( var_1 in level.players )
{
if ( common_scripts\utility::flag( "alien_music_playing" ) )
{
var_1 stoplocalsound( "mp_suspense_01" );
var_1 stoplocalsound( "mp_suspense_02" );
var_1 stoplocalsound( "mp_suspense_03" );
var_1 stoplocalsound( "mp_suspense_04" );
var_1 stoplocalsound( "mp_suspense_05" );
var_1 stoplocalsound( "mp_suspense_06" );
var_1 stoplocalsound( "mus_alien_newwave" );
common_scripts\utility::flag_clear( "alien_music_playing" );
}
common_scripts\utility::flag_set( "alien_music_playing" );
if ( maps\mp\_utility::isreallyalive( var_1 ) )
var_1 playlocalsound( "mus_alien_dlc3_ark_runout" );
}
}
aud_end_logic()
{
level.aud_alarm = spawn( "script_origin", ( 3631, 1779, 2106 ) );
level.aud_alarm playloopsound( "scn_descent_end_steam" );
level.aud_gen = spawn( "script_origin", ( 3631, 1779, 2106 ) );
level.aud_gen playsound( "scn_descent_end_gener" );
level.aud_loop = spawn( "script_origin", ( 0, 0, 0 ) );
level.aud_loop playloopsound( "scn_descent_end_int_lp" );
thread aud_loop_starts();
level thread quake_and_rumble( 10 );
}
quake_and_rumble( var_0 )
{
wait( var_0 );
earthquake( 0.4, 3, level.archer.origin, 2000 );
level thread maps\mp\alien\mp_alien_dlc3_ark::rumble_players( "heavy_3s", 0 );
}
escape_global_logic()
{
level endon( "game_ended" );
maps\mp\alien\_utility::update_player_initial_spawn_info( ( 2692, 1863, 899 ), ( 0, 0, 0 ) );
common_scripts\utility::flag_wait( "ark_console_event_done" );
thread run_out_music();
thread aud_end_logic();
common_scripts\utility::flag_set( "cortex_carryable" );
level.cortex_use_trigger sethintstring( &"MP_ALIEN_DESCENT_PICKUP_CORTEX" );
var_0 = gettime();
setomnvar( "ui_alien_nuke_timer", gettime() + 300000 );
level thread escape_timer();
level thread nag_players_to_place_cortex();
level thread nag_players_who_leave_the_drill_behind();
level.should_use_custom_death_func = 1;
level notify( "dlc_vo_notify", "descent_vo", "escape_level" );
maps\mp\alien\_utility::update_player_initial_spawn_info( ( 2692, 1863, 899 ), ( 0, 180, 0 ) );
escape_blocker_gate( "escape_blocker_1_forcefield", 1, 18 );
maps\mp\alien\_utility::update_player_initial_spawn_info( ( -2167, 616, 1203 ), ( 0, -158, 0 ) );
escape_blocker_gate( "escape_blocker_2_forcefield", 2, 18 );
maps\mp\alien\_utility::update_player_initial_spawn_info( ( -1385, -2506, 918 ), ( 0, -57, 0 ) );
escape_blocker_gate( "escape_blocker_3_forcefield", 3, 18 );
level.should_use_custom_death_func = 0;
level.final_blocker_finished = 1;
level.current_cortex_spot = undefined;
common_scripts\utility::flag_set( "cortex_carryable" );
level.cortex_use_trigger makeusable();
level.cortex_use_trigger sethintstring( &"MP_ALIEN_DESCENT_PICKUP_CORTEX" );
maps\mp\alien\_outline_proto::enable_outline_for_players( level.cortex, level.players, 3, 0, "high" );
var_1 = playfx( level._effect["escape_area"], ( 2368, -7056, 1151.22 ) );
var_2 = wait_for_players_to_escape();
if ( var_2.size == 0 )
{
iprintlnbold( &"ALIEN_COLLECTIBLES_YOU_DIDNT_MAKE_IT" );
var_3 = maps\mp\alien\_hud::get_end_game_string_index( "fail_escape" );
level thread maps\mp\gametypes\aliens::alienendgame( "axis", var_3 );
return;
}
maps\mp\alien\_unlock::update_escape_item_unlock( var_2 );
foreach ( var_5 in level.players )
{
if ( common_scripts\utility::array_contains( var_2, var_5 ) )
{
var_5.dlc3_escaped = 1;
var_5 maps\mp\alien\_persistence::set_player_escaped();
continue;
}
var_5 iprintlnbold( &"ALIEN_COLLECTIBLES_YOU_DIDNT_MAKE_IT" );
var_5.dlc3_escaped = 0;
}
foreach ( var_5 in level.players )
{
if ( maps\mp\alien\_utility::is_true( var_5.dlc3_escaped ) )
var_5 maps\mp\alien\_persistence::award_completion_tokens();
}
thread descent_win_music();
maps\mp\alien\_achievement_dlc3::update_progression_achievements( "awakening_escape" );
var_9 = "all_escape";
if ( var_2.size != level.players.size )
var_9 = "some_escape";
var_10 = gettime() - var_0;
update_lb_aliensession_dlc3_escape( var_10 );
var_11 = maps\mp\alien\_hud::get_end_game_string_index( var_9 );
level thread maps\mp\gametypes\aliens::alienendgame( "allies", var_11 );
}
wait_for_players_to_escape()
{
var_0 = 22500;
var_1 = [];
var_2 = [];
while ( !maps\mp\alien\_utility::is_true( level.escape_timer_expired ) )
{
var_1 = [];
var_2 = [];
var_3 = 1;
foreach ( var_5 in level.players )
{
if ( isdefined( var_5.laststand ) && var_5.laststand )
{
var_1 = common_scripts\utility::add_to_array( var_1, var_5 );
continue;
}
if ( distancesquared( var_5.origin, ( 2368, -7056, 1151.22 ) ) <= var_0 && isalive( var_5 ) )
{
var_2 = common_scripts\utility::add_to_array( var_2, var_5 );
continue;
}
var_3 = 0;
}
if ( var_3 && player_has_cortex_or_cortex_in_position() )
break;
else if ( var_3 && !player_has_cortex_or_cortex_in_position() )
level thread display_cortex_warning();
wait 0.05;
}
return var_2;
}
display_cortex_warning()
{
level endon( "game_ended" );
if ( maps\mp\alien\_utility::is_true( level.cortex_warning_issued ) )
return;
level.cortex_warning_issued = 1;
iprintlnbold( &"MP_ALIEN_DESCENT_CORTEX_LEFT_BEHIND" );
var_0 = [ "descent_gdf_retrievethecortex", "descent_gdf_cortexbacktosurface" ];
maps\mp\_utility::playsoundinspace( common_scripts\utility::random( var_0 ), ( 0, 0, 0 ) );
wait 5;
level.cortex_warning_issued = 0;
}
player_has_cortex_or_cortex_in_position()
{
foreach ( var_1 in level.players )
{
if ( var_1 hasweapon( "aliencortex_mp" ) )
return 1;
}
if ( isdefined( level.cortex ) && distancesquared( level.cortex.origin, ( 2368, -7056, 1151.22 ) ) <= 10000 )
return 1;
return 0;
}
update_lb_aliensession_dlc3_escape( var_0 )
{
var_1 = get_lb_final_escape_rank( var_0 );
foreach ( var_3 in level.players )
{
if ( maps\mp\alien\_utility::is_true( var_3.dlc3_escaped ) )
{
var_3 maps\mp\alien\_persistence::lb_player_update_stat( "escapedRank" + var_1, 1, 1 );
var_3 maps\mp\alien\_persistence::lb_player_update_stat( "hits", 1, 1 );
}
}
}
get_lb_final_escape_rank( var_0 )
{
var_1 = 210000;
var_2 = 240000;
var_3 = 270000;
if ( var_0 <= var_1 )
return 0;
else if ( var_0 <= var_2 )
return 1;
else if ( var_0 <= var_3 )
return 2;
else
return 3;
}
descent_win_music()
{
foreach ( var_1 in level.players )
{
if ( common_scripts\utility::flag( "alien_music_playing" ) )
{
var_1 stoplocalsound( "mp_suspense_01" );
var_1 stoplocalsound( "mp_suspense_02" );
var_1 stoplocalsound( "mp_suspense_03" );
var_1 stoplocalsound( "mp_suspense_04" );
var_1 stoplocalsound( "mp_suspense_05" );
var_1 stoplocalsound( "mp_suspense_06" );
var_1 stoplocalsound( "mus_alien_newwave" );
common_scripts\utility::flag_clear( "alien_music_playing" );
}
common_scripts\utility::flag_set( "alien_music_playing" );
if ( maps\mp\_utility::isreallyalive( var_1 ) )
var_1 playlocalsound( "mus_alien_dlc3_win_screen" );
}
}
escape_blocker_gate( var_0, var_1, var_2 )
{
maps\mp\alien\_gamescore::reset_encounter_performance();
var_3 = gettime();
show_escape_geo( var_0 );
escape_blocker_logic( var_1, var_2, var_0 );
maps\mp\alien\_gamescore_dlc3::calculate_escape_blocker_score( gettime() - var_3 );
}
get_win_condition()
{
foreach ( var_1 in level.players )
{
if ( maps\mp\alien\_utility::is_true( var_1.inlaststand ) )
return "some_escape";
}
return "all_escape";
}
escape_blocker_logic( var_0, var_1, var_2 )
{
wait 1;
iprintlnbold( &"MP_ALIEN_DESCENT_CORTEX_NEXT_AREA" );
common_scripts\utility::flag_set( "cortex_carryable" );
level.cortex_use_trigger makeusable();
level.cortex_use_trigger sethintstring( &"MP_ALIEN_DESCENT_PICKUP_CORTEX" );
maps\mp\alien\_outline_proto::enable_outline_for_players( level.cortex, level.players, 3, 0, "high" );
wait_for_player_to_place_cortex( "escape_blocker_" + var_0 + "_cortex" );
common_scripts\utility::flag_clear( "cortex_carryable" );
maps\mp\alien\_spawn_director::start_cycle( var_1 );
clear_cortex_lowermessage();
setomnvar( "ui_alien_boss_status", 2 );
setomnvar( "ui_alien_boss_icon", 5 );
setomnvar( "ui_alien_boss_progression", 100 );
level.cortex_use_trigger.origin = level.cortex.origin + ( 0, 0, 30 );
level.cortex_use_trigger sethintstring( "" );
maps\mp\alien\_outline_proto::enable_outline_for_players( level.cortex, level.players, 1, 0, "high" );
level thread cortex_charge_monitor( var_0 );
level waittill( "escape_forcefield_destroyed" );
wait 1;
maps\mp\alien\_spawn_director::end_cycle();
getent( var_2, "targetname" ) delete();
var_3 = undefined;
switch ( var_0 )
{
case 1:
var_3 = "escape_blocker_3";
break;
case 2:
var_3 = "escape_blocker_2";
break;
case 3:
var_3 = "escape_blocker_1";
break;
}
var_4 = getent( var_3, "targetname" );
var_4 setscriptablepartstate( 0, "ff_down" );
level thread maps\mp\mp_alien_dlc3_vignettes::descent_vo_escape_barrier_down( var_0 );
iprintlnbold( &"MP_ALIEN_DESCENT_CORTEX_FF_DOWN" );
setomnvar( "ui_alien_boss_status", 0 );
setomnvar( "ui_alien_boss_icon", 5 );
setomnvar( "ui_alien_boss_progression", 0 );
}
cortex_charge_monitor( var_0 )
{
level endon( "escape_forcefield_destroyed" );
level endon( "game_ended" );
var_1 = 10;
var_2 = var_1 / 2;
var_3 = 100 / var_1;
for (;;)
{
level waittill( "alien_killed", var_4, var_5, var_6 );
if ( var_5 == "MOD_SUICIDE" )
continue;
var_1--;
if ( var_1 < var_2 )
{
level thread maps\mp\mp_alien_dlc3_vignettes::descent_vo_escape_cortex_charge_50( var_0 );
var_2 = -1;
}
if ( var_1 <= 0 )
{
setomnvar( "ui_alien_boss_progression", var_3 * var_1 );
iprintln( &"MP_ALIEN_DESCENT_USE_THE_CORTEX" );
level thread maps\mp\mp_alien_dlc3_vignettes::descent_vo_escape_cortex_ready( var_0 );
level.cortex_use_trigger makeusable();
level.cortex_use_trigger sethintstring( &"MP_ALIEN_DESCENT_CORTEX_USE" );
maps\mp\alien\_outline_proto::enable_outline_for_players( level.cortex, level.players, 3, 0, "high" );
level.cortex_use_trigger maps\mp\alien\mp_alien_dlc3_ark::wait_until_player_use_cortex();
playfx( level._effect["cortex_blast"], level.cortex_use_trigger.origin );
playsoundatpos( level.cortex_use_trigger.origin, "scn_cortex_activate" );
level thread maps\mp\alien\mp_alien_dlc3_ark::kill_aliens_with_cortex_pulse();
setomnvar( "ui_alien_boss_progression", 100 );
level notify( "escape_forcefield_destroyed" );
break;
}
setomnvar( "ui_alien_boss_progression", var_3 * var_1 );
}
}
escape_timer_fx()
{
self endon( "disconnect" );
level endon( "game_ended" );
level thread escape_falling_boulders_fx();
thread escape_falling_debris_fx( "escape_falling_debris_pa1", "end_falling_rocks_1" );
self notify( "end_falling_rocks_1" );
set_escape_earthquake_values( 0.18, 0.28, 2, 4 );
thread escape_falling_debris_fx( "escape_falling_debris_pa2", "end_falling_rocks_2" );
wait 120;
self notify( "end_falling_rocks_2" );
set_escape_earthquake_values( 0.32, 0.48, 1, 2 );
thread escape_falling_debris_fx( "escape_falling_debris_pa3", "end_falling_rocks_3" );
}
escape_falling_debris_fx( var_0, var_1 )
{
self endon( "disconnect" );
level endon( "game_ended" );
self endon( var_1 );
for (;;)
{
var_2 = spawnfxforclient( level._effect[var_0], self.origin + ( 0, 0, 750 ), self, anglestoup( self.angles ) );
triggerfx( var_2 );
var_2 thread escape_falling_debris_fx_delete();
wait( randomfloatrange( 2, 3 ) );
}
}
set_escape_earthquake_values( var_0, var_1, var_2, var_3 )
{
level.escape_earthquake_intensity_min = var_0;
level.escape_earthquake_intensity_max = var_1;
level.escape_earthquake_len_min = var_2;
level.escape_earthquake_len_max = var_3;
level.escape_earthquake_org = ( 28.4, 5.8, 3951.5 );
}
escape_earthquakes()
{
level endon( "game_ended" );
for (;;)
{
earthquake( randomfloatrange( level.escape_earthquake_intensity_min, level.escape_earthquake_intensity_max ), randomfloatrange( level.escape_earthquake_len_min, level.escape_earthquake_len_max ), level.escape_earthquake_org, 20000 );
wait( randomfloatrange( 2, 3 ) );
}
}
escape_falling_debris_fx_delete()
{
wait 10;
if ( isdefined( self ) )
self delete();
}
escape_falling_boulders_fx()
{
self endon( "disconnect" );
level endon( "game_ended" );
var_0 = getent( "fx_boulders_01", "targetname" );
var_1 = getent( "fx_boulders_02", "targetname" );
var_2 = [ "default", "rock1", "rock2", "rock3", "rock4", "rock5", "rock6", "rock7" ];
for (;;)
{
wait 0.01;
wait( randomfloatrange( 1.8, 3.3 ) );
var_0 setscriptablepartstate( "base", "default" );
var_1 setscriptablepartstate( "base", "default" );
wait 0.1;
var_3 = common_scripts\utility::random( var_2 );
var_0 setscriptablepartstate( "base", var_3 );
var_1 setscriptablepartstate( "base", var_3 );
}
}
wait_for_player_to_place_cortex( var_0 )
{
foreach ( var_2 in level.players )
var_2 thread check_for_player_near_spot_with_cortex( var_0 );
var_4 = common_scripts\utility::getstruct( var_0, "targetname" );
var_5 = "waypoint_alien_blocker";
var_6 = 14;
var_7 = 14;
var_8 = 0.75;
var_9 = var_4.origin + ( 0, 0, 50 );
var_10 = maps\mp\alien\_hud::make_waypoint( var_5, var_6, var_7, var_8, var_9 );
level thread wait_for_cortex_planted( var_0 );
level waittill( "cortex_planted" );
var_10 destroy();
}
alien_death_trail( var_0 )
{
playfx( level._effect["bio_trail"], var_0 + ( 0, 0, 32 ) );
wait 0.5;
var_1 = spawnstruct();
while ( !isdefined( level.drill ) && !isdefined( level.drill_carrier ) )
wait 0.1;
if ( isdefined( level.drill ) )
var_1.origin = level.drill.origin + ( 0, 0, 0 );
else if ( isdefined( level.drill_carrier ) )
var_1.origin = level.drill_carrier.origin + ( 0, 0, 0 );
playfx( level._effect["bio_trail_cap"], var_1.origin );
}
do_trail_death()
{
wait 0.1;
var_0 = common_scripts\utility::get_array_of_closest( self.origin, common_scripts\utility::getstructarray( "bio_path", "targetname" ) );
var_1 = distance( self.origin, var_0[0].origin );
playfxontag( level._effect["bio_trail"], self, "tag_origin" );
var_2 = 1500;
var_3 = var_0[0];
var_4 = 0;
if ( var_1 > 1000 )
{
var_3 = spawnstruct();
while ( !isdefined( level.drill ) && !isdefined( level.drill_carrier ) )
wait 0.1;
if ( isdefined( level.drill ) )
var_3.origin = level.drill.origin + ( 0, 0, 70 );
else if ( isdefined( level.drill_carrier ) )
var_3.origin = level.drill_carrier.origin + ( 0, 0, 70 );
var_4 = 1;
var_1 = distance( self.origin, var_3.origin );
}
var_5 = var_1 / var_2;
if ( var_5 < 0.05 )
var_5 = 0.05;
self moveto( var_3.origin, var_5 );
self waittill( "movedone" );
if ( var_4 )
{
playfx( level._effect["tesla_shock"], self.origin + ( 0, 0, -50 ) );
self delete();
return;
}
for (;;)
{
var_6 = common_scripts\utility::getstructarray( var_3.target, "targetname" );
var_7 = common_scripts\utility::random( var_6 );
var_1 = distance( var_3.origin, var_7.origin );
var_5 = var_1 / var_2;
self moveto( var_7.origin, var_5 );
self waittill( "movedone" );
if ( !isdefined( var_7.target ) )
break;
var_3 = var_7;
}
playfx( level._effect["tesla_shock"], self.origin + ( 0, 0, -50 ) );
self delete();
}
clear_cortex_lowermessage()
{
foreach ( var_1 in level.players )
var_1 maps\mp\_utility::clearlowermessage( "plant_cortex" );
}
wait_for_cortex_planted( var_0 )
{
var_1 = common_scripts\utility::getstruct( var_0, "targetname" );
for (;;)
{
level waittill( "cortex_plant" );
level.cortex.origin = var_1.origin;
level.cortex_use_trigger makeunusable();
level.cortex_use_trigger sethintstring( "" );
level notify( "cortex_planted" );
return;
}
}
check_for_player_near_spot_with_cortex( var_0 )
{
self endon( "disconnect" );
self endon( "death" );
level endon( "cortex_planted" );
var_1 = 6400;
var_2 = common_scripts\utility::getstruct( var_0, "targetname" );
level.current_cortex_spot = var_2;
for (;;)
{
if ( isdefined( self.inlaststand ) && self.inlaststand || common_scripts\utility::flag( "drill_drilling" ) || isdefined( self.usingremote ) || maps\mp\alien\_utility::is_true( self.iscarrying ) )
{
wait 0.05;
continue;
}
if ( distancesquared( var_2.origin, self.origin ) < var_1 )
{
if ( !isdefined( level.cortex_carrier ) || isdefined( level.cortex_carrier ) && level.cortex_carrier != self )
{
maps\mp\_utility::setlowermessage( "plant_cortex", &"MP_ALIEN_DESCENT_CORTEX_HINT", undefined, 10 );
while ( player_should_see_cortex_hint( var_2, var_1, 1 ) )
wait 0.05;
maps\mp\_utility::clearlowermessage( "plant_cortex" );
}
else
{
maps\mp\_utility::setlowermessage( "plant_cortex", &"MP_ALIEN_DESCENT_CORTEX_PLANT", undefined, 10 );
while ( player_should_see_cortex_hint( var_2, var_1, 0 ) )
wait 0.05;
maps\mp\_utility::clearlowermessage( "plant_cortex" );
}
}
wait 0.05;
}
}
player_should_see_cortex_hint( var_0, var_1, var_2 )
{
if ( distancesquared( var_0.origin, self.origin ) > var_1 )
return 0;
if ( self.inlaststand )
return 0;
if ( isdefined( self.usingremote ) )
return 0;
if ( maps\mp\alien\_utility::is_true( var_2 ) )
return 1;
else if ( maps\mp\alien\_utility::is_true( self.iscarrying ) )
return 0;
return 1;
}
nag_players_to_place_cortex()
{
level endon( "cortex_plant" );
wait 30;
var_0 = 20;
for (;;)
{
wait( var_0 );
level thread maps\mp\mp_alien_dlc3_vignettes::descent_vo_escape_cortex_nag();
var_0 = var_0 + 20;
}
}
nag_players_who_leave_the_drill_behind()
{
var_0 = 2000;
var_1 = var_0 * var_0;
var_2 = 0;
var_3 = 20;
for (;;)
{
if ( isdefined( level.cortex ) )
{
var_2 = 0;
foreach ( var_5 in level.players )
{
if ( distancesquared( var_5.origin, level.cortex.origin ) < var_1 )
var_2 = 1;
}
if ( !var_2 )
level thread maps\mp\mp_alien_dlc3_vignettes::descent_vo_escape_cortex_left_behind();
}
wait( var_3 );
var_3 = var_3 + 20;
}
}