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

1887 lines
59 KiB
Plaintext

// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init_final_battle()
{
common_scripts\utility::flag_init( "outpost_gas_station_done" );
common_scripts\utility::flag_init( "outpost_garage_done" );
common_scripts\utility::flag_init( "outpost_rooftops_done" );
common_scripts\utility::flag_init( "all_outposts_completed" );
common_scripts\utility::flag_init( "start_cross_vignette" );
common_scripts\utility::flag_init( "cross_vignette_complete" );
common_scripts\utility::flag_init( "cortex_started" );
common_scripts\utility::flag_init( "cortex_detonated" );
common_scripts\utility::flag_init( "start_last_stand" );
common_scripts\utility::flag_init( "disable_all_traps" );
common_scripts\utility::flag_init( "final_battle_start_vo_over" );
common_scripts\utility::flag_init( "outpost_encounter_running" );
level.cortex_charge = 0;
level.cortex_charge_per_player_scalar = [];
level.cortex_charge_per_player_scalar[1] = 0.7;
level.cortex_charge_per_player_scalar[2] = 1.0;
level.cortex_charge_per_player_scalar[3] = 1.5;
level.cortex_charge_per_player_scalar[4] = 1.75;
level.final_battle_stage = 1;
level.num_cortex_players = 1;
level.left_gate_destroyed = 0;
level.middle_gate_destroyed = 0;
level.right_gate_destroyed = 0;
level.left_generator_destroyed = 0;
level.add_cortex_charge_func = ::add_cortex_charge;
level.ancestor_music_played = 0;
thread maps\mp\alien\_nuke::init();
}
setup_final_battle()
{
init_final_battle();
level waittill( "enable_encounters" );
level thread initial_entity_setup();
common_scripts\utility::flag_wait_all( "outpost_gas_station_done", "outpost_garage_done", "outpost_rooftops_done" );
level do_return_to_base();
common_scripts\utility::flag_wait( "start_cross_vignette" );
level thread do_cross_vignette();
level common_scripts\utility::flag_wait( "cross_vignette_complete" );
level thread run_cortex_logic();
level thread final_battle_vo();
common_scripts\utility::flag_wait( "cortex_started" );
thread medusa_on_state_fx();
level thread start_final_battle();
level.should_use_custom_death_func = 1;
common_scripts\utility::flag_wait( "start_last_stand" );
level thread start_last_stand();
common_scripts\utility::flag_wait( "cortex_detonated" );
level do_ending();
}
do_return_to_base()
{
if ( common_scripts\utility::flag( "start_cross_vignette" ) )
return;
common_scripts\utility::flag_set( "all_outposts_completed" );
var_0 = common_scripts\utility::getstruct( "ancestor_dr_cross", "targetname" );
level.dr_cross = spawn( "script_model", var_0.origin );
level.dr_cross setmodel( "body_cross_a" );
level.dr_cross.angles = ( 0, 0, 0 );
level.dr_cross.crosshead = spawn_model( "head_cross_a", level.dr_cross, "J_spine4", ( 0, 0, 0 ) );
level.dr_cross.shield = spawn( "script_model", level.dr_cross.origin + ( 0, 0, 100 ) );
level.dr_cross.shield setmodel( "alien_shield_bubble_ancestor_col" );
level.dr_cross.shield linkto( level.dr_cross, "tag_origin", ( 0, 0, 100 ), ( 0, 0, 0 ) );
thread sfx_cross_shield_lp();
level.canister = getent( "cortex_canister", "targetname" );
level.canister.origin = ( 390, -542, 17 );
level.canister.angles = ( 0, 180, 0 );
level.core = getent( "cortex_core", "targetname" );
level.core.origin = ( 400, -664, 16 );
level.core.angles = ( 0, 0, 0 );
level.dr_cross scriptmodelplayanimdeltamotion( "alien_last_cross_vignette_idle" );
level.dr_cross.crosshead scriptmodelplayanim( "alien_last_cross_vignette_idle" );
level.canister scriptmodelplayanimdeltamotion( "alien_last_cross_vignette_cannister_idle" );
level.core scriptmodelplayanim( "alien_last_cross_vignette_core_idle" );
level.dr_cross thread cross_loop_delay();
level thread handle_cross_vignette_aliens();
level thread wait_for_very_close_player();
level thread wait_for_all_close_players();
level.dr_cross thread show_return_to_base_objective();
wait 0.1;
playfxontag( level._effect["cross_ff_1"], level.dr_cross.shield, "tag_origin" );
playfxontag( level._effect["cross_teleport"], level.dr_cross, "j_spine4" );
playfxontag( level._effect["cortex_glow_1"], level.canister, "tag_origin" );
}
cross_loop_delay()
{
self endon( "death" );
for (;;)
{
wait 3.0;
self notify( "ok_to_start_anim" );
}
}
do_cross_vignette()
{
if ( common_scripts\utility::flag( "cortex_started" ) )
return;
wait 3.0;
level.dr_cross waittill( "ok_to_start_anim" );
level notify( "shield_down" );
foreach ( var_1 in level.players )
var_1 thread cross_vignette_unstuck();
level.dr_cross scriptmodelplayanimdeltamotion( "alien_last_cross_vignette_scene" );
level.dr_cross.crosshead scriptmodelplayanim( "alien_last_cross_vignette_scene" );
level.canister scriptmodelplayanimdeltamotion( "alien_last_cross_vignette_cannister_scene" );
level.core scriptmodelplayanim( "alien_last_cross_vignette_core_scene" );
thread cross_vignette_vo();
thread turn_off_cortex_fx();
thread sfx_cross_cortex();
thread sfx_cross_land();
wait 0.5;
level notify( "cross_landing" );
playfx( level._effect["cross_blast"], level.dr_cross.origin );
stopfxontag( level._effect["cross_ff_1"], level.dr_cross.shield, "tag_origin" );
level.dr_cross.shield delete();
thread sfx_cross_teleport();
wait 33.8;
playfxontag( level._effect["cross_teleport"], level.dr_cross, "j_spine4" );
wait 0.76;
level.dr_cross scriptmodelplayanimdeltamotion( "alien_last_cross_vignette_scene_pt2" );
level.dr_cross.crosshead scriptmodelplayanim( "alien_last_cross_vignette_scene_pt2" );
wait 0.2;
playfxontag( level._effect["cross_teleport"], level.dr_cross, "j_spine4" );
wait 19.2;
playfxontag( level._effect["cross_teleport"], level.dr_cross, "j_spine4" );
common_scripts\utility::flag_set( "cross_vignette_complete" );
wait 0.1;
level.dr_cross.crosshead delete();
level.dr_cross delete();
}
cross_vignette_unstuck()
{
level endon( "game_ended" );
self endon( "disconnect" );
self endon( "death" );
level endon( "cross_vignette_complete" );
var_0 = ( 532, -516, 16 );
self waittill( "unresolved_collision" );
self setorigin( var_0 );
}
turn_off_cortex_fx()
{
wait 12.66;
stopfxontag( level._effect["cortex_glow_1"], level.canister, "tag_origin" );
}
handle_cross_vignette_aliens()
{
var_0 = common_scripts\utility::getstructarray( "cross_vignette_spawners", "targetname" );
level.cross_aliens = [];
foreach ( var_2 in var_0 )
thread spawn_single_vignette_alien( var_2 );
level waittill( "cross_landing" );
foreach ( var_5 in level.cross_aliens )
{
if ( isdefined( var_5 ) && isalive( var_5 ) )
{
var_5.fauxdead = undefined;
var_5.ignoreall = 0;
var_5 dodamage( 1000, level.dr_cross.origin, level.dr_cross );
}
}
wait 0.2;
physicsexplosionsphere( level.dr_cross.origin, 768, 512, 5 );
}
spawn_single_vignette_alien( var_0 )
{
var_1 = "wave goon";
var_2 = var_0.angles;
if ( !isdefined( var_2 ) )
var_2 = ( 0, 270, 0 );
wait( randomfloatrange( 0.2, 1.0 ) );
var_3 = maps\mp\alien\_spawnlogic::spawnalien( var_0.origin, var_2, var_1 );
var_3.spawner = var_0;
var_3 maps\mp\alien\_utility::enable_alien_scripted();
var_3 scragentsetscripted( 1 );
var_3.ignoreall = 1;
var_3.pet = 1;
var_3.fauxdead = 1;
wait 0.1;
var_3 thread maps\mp\agents\alien\_alien_idle::main();
var_3 maps\mp\alien\_utility::set_alien_emissive( 0.5, 0.0 );
maps\mp\alien\_outline_proto::enable_outline( var_3, 3, 1 );
playfxontag( level._effect["alien_uncloaking"], var_3, "j_neck" );
if ( isdefined( var_3.enemy ) )
var_3.enemy.current_attackers = [];
level.cross_aliens[level.cross_aliens.size] = var_3;
return var_3;
}
spawn_model( var_0, var_1, var_2, var_3 )
{
var_4 = spawn( "script_model", ( 0, 0, 0 ) );
var_4 setmodel( var_0 );
var_4.origin = var_1 gettagorigin( var_2 );
var_4.angles = var_1 gettagangles( var_2 ) + var_3;
var_4 linkto( var_1, var_2 );
return var_4;
}
wait_for_very_close_player()
{
level endon( "start_cross_vignette" );
var_0 = 16384;
for (;;)
{
foreach ( var_2 in level.players )
{
if ( distancesquared( var_2.origin, level.dr_cross.origin ) < var_0 )
{
common_scripts\utility::flag_set( "start_cross_vignette" );
return;
}
wait 1.0;
}
wait 0.1;
}
}
wait_for_all_close_players()
{
level endon( "start_cross_vignette" );
var_0 = getent( "main_base", "targetname" );
for (;;)
{
var_1 = 0;
foreach ( var_3 in level.players )
{
if ( var_3 istouching( var_0 ) )
var_1++;
}
if ( var_1 >= level.players.size )
{
common_scripts\utility::flag_set( "start_cross_vignette" );
return;
}
wait 1.0;
}
}
start_final_battle()
{
level endon( "cortex_detonated" );
if ( common_scripts\utility::flag( "start_last_stand" ) )
return;
level.current_area_name = "main_base";
level.final_battle_start_time = gettime();
if ( !maps\mp\alien\_utility::is_true( level.jump_to_final_battle ) )
{
thread shut_base_gates();
wait 2.0;
}
wait 3.0;
if ( !isdefined( level.final_battle_lane_order ) )
{
level.final_battle_lane_order = [ ::final_battle_left_ancestor, ::final_battle_middle_ancestor, ::final_battle_right_ancestor ];
level.final_battle_lane_order = common_scripts\utility::array_randomize( level.final_battle_lane_order );
}
else
wait 5.0;
level thread play_vo_on_final_ancestors_death();
level.current_encounter_info = spawnstruct();
thread play_end_ancestor_music();
level thread check_for_room_exploit();
foreach ( var_1 in level.final_battle_lane_order )
{
maps\mp\alien\_gamescore::reset_encounter_performance();
level.current_encounter_info.force_end_func = ::debug_beat_ancestor_encounter;
[[ var_1 ]]();
level.final_battle_stage = level.final_battle_stage + 1;
wait 8;
}
common_scripts\utility::flag_set( "start_last_stand" );
}
final_battle_left_ancestor()
{
level.current_area_name = "ancestor_lane_left";
wait 5.0;
setup_final_battle_encounter( "main_base", "ancestor_left", 24 );
var_0 = common_scripts\utility::getstruct( "ancestor_left_lane", "targetname" );
level.left_ancestor = maps\mp\agents\alien\alien_ancestor\_alien_ancestor::addancestoragent( "axis", var_0.origin, level.players[0].angles );
if ( level.left_ancestor maps\mp\alien\_utility::ent_flag_exist( "activate_shield_health_check" ) )
level.left_ancestor maps\mp\alien\_utility::ent_flag_set( "activate_shield_health_check" );
level thread left_ancestor_event();
level thread start_trap_gen_sfx();
if ( !common_scripts\utility::flag( "final_battle_start_vo_over" ) )
level thread play_godfather_vo( "last_gdf_inc_westgate", 5 );
else
level thread play_godfather_vo( "last_gdf_inc_westgate" );
common_scripts\utility::waittill_any_timeout( 240, "debug_beat_current_encounter" );
end_final_battle_encounter();
}
left_ancestor_event()
{
level.left_ancestor endon( "death" );
wait 5;
level.left_ancestor maps\mp\agents\alien\alien_ancestor\_alien_ancestor_think::ancestor_enter_scripted();
if ( !level.left_generator_destroyed )
{
level.left_ancestor maps\mp\agents\alien\alien_ancestor\_alien_ancestor_think::ancestor_path_to_node( "ancestor_left_attack_generator" );
var_0 = getent( "ancestor_left_generator_pos", "targetname" );
level.left_ancestor maps\mp\agents\alien\alien_ancestor\_alien_ancestor_think::ancestor_align_to_angles( var_0.angles );
level.left_ancestor thread maps\mp\agents\alien\alien_ancestor\_alien_ancestor_think::force_blast_attack( var_0.origin );
level.left_ancestor maps\mp\alien\_utility::disable_alien_scripted();
wait 0.5;
level.left_ancestor maps\mp\agents\alien\alien_ancestor\_alien_ancestor_think::ancestor_enter_scripted();
wait 2.7;
thread maps\mp\mp_alien_last_fx::conduit_fx_destroyed();
common_scripts\utility::flag_set( "disable_all_traps" );
level thread dmg_trap_gen_sfx();
level.left_generator_destroyed = 1;
level thread play_godfather_vo( "last_gdf_lostpowerwest", 5 );
level thread left_ancestor_restore_traps();
}
var_1 = getent( "ancestor_left_gate_grab_pos", "targetname" );
level.left_ancestor maps\mp\agents\alien\alien_ancestor\_alien_ancestor_think::ancestor_path_to_node( "ancestor_left_traverse_1" );
var_2 = getnode( "ancestor_left_resume_path_1", "targetname" );
level.left_ancestor maps\mp\agents\alien\alien_ancestor\_alien_ancestor_think::assign_path_node( var_2 );
level.left_ancestor maps\mp\agents\alien\alien_ancestor\_alien_ancestor_think::ancestor_play_traversal( var_1.angles, "traverse_down" );
wait 0.2;
level.left_ancestor maps\mp\alien\_utility::disable_alien_scripted();
level.left_ancestor maps\mp\agents\alien\alien_ancestor\_alien_ancestor_think::assign_path_node( var_2 );
wait 0.1;
level.left_ancestor maps\mp\agents\alien\alien_ancestor\_alien_ancestor_think::ancestor_enter_scripted();
wait 3.0;
level.left_ancestor maps\mp\agents\alien\alien_ancestor\_alien_ancestor_think::ancestor_path_to_node( "ancestor_left_traverse_2" );
var_3 = getnode( "ancestor_left_resume_path_2", "targetname" );
level.left_ancestor maps\mp\agents\alien\alien_ancestor\_alien_ancestor_think::assign_path_node( var_3 );
level.left_ancestor maps\mp\agents\alien\alien_ancestor\_alien_ancestor_think::ancestor_play_traversal( var_1.angles, "traverse_down" );
wait 0.5;
level.left_ancestor maps\mp\agents\alien\alien_ancestor\_alien_ancestor_think::assign_path_node( var_3 );
level.left_ancestor maps\mp\alien\_utility::disable_alien_scripted();
wait 5;
level.left_ancestor maps\mp\agents\alien\alien_ancestor\_alien_ancestor_think::ancestor_enter_scripted();
level.left_ancestor maps\mp\agents\alien\alien_ancestor\_alien_ancestor_think::ancestor_path_to_node( "ancestor_left_gate_traverse" );
level thread play_godfather_vo( "last_gdf_westgate" );
if ( !level.left_gate_destroyed )
{
level.left_ancestor thread maps\mp\agents\alien\alien_ancestor\_alien_ancestor_think::ancestor_do_forced_grab( "ancestor_left_gate_grab_pos" );
thread sfx_gate_left_bend();
level.left_ancestor waittill( "forced_grab_damage_start" );
left_destruction();
}
level.left_ancestor maps\mp\agents\alien\alien_ancestor\_alien_ancestor_think::ancestor_enter_scripted();
level.left_ancestor maps\mp\agents\alien\alien_ancestor\_alien_ancestor_think::ancestor_play_traversal( var_1.angles, "traverse_gate" );
wait 4.0;
level.left_ancestor maps\mp\alien\_utility::disable_alien_scripted();
var_4 = getnode( "ancestor_left_gate_inside", "targetname" );
level.left_ancestor maps\mp\agents\alien\alien_ancestor\_alien_ancestor_think::assign_path_node( var_4 );
}
left_ancestor_restore_traps()
{
var_0 = level.cycle_data.cycle_drill_layers[level.cycle_count - 1];
wait( var_0[0] - 5 );
common_scripts\utility::flag_clear( "disable_all_traps" );
level thread stop_trap_gen_sfx();
}
left_destruction()
{
thread sfx_gate_left_expl();
var_0 = getentarray( "main_base_left_gate", "targetname" );
foreach ( var_2 in var_0 )
{
if ( isdefined( var_2.script_parameters ) && var_2.script_parameters == "exploder" )
{
var_2 show();
var_2 solid();
continue;
}
var_2 notsolid();
var_2 delete();
}
common_scripts\utility::exploder( 101 );
level.left_gate_destroyed = 1;
wait 0.2;
var_4 = getent( "left_connector", "targetname" );
var_4 connectpaths();
var_4 delete();
}
start_trap_gen_sfx()
{
var_0 = getent( "ancestor_left_generator_scriptable", "targetname" );
level.trap_gen_sfx_lp = spawn( "script_origin", var_0.origin );
level.trap_gen_sfx_lp linkto( var_0 );
wait 0.1;
if ( isdefined( level.trap_gen_sfx_lp ) )
level.trap_gen_sfx_lp playloopsound( "alien_conduit_on_lp" );
}
dmg_trap_gen_sfx()
{
level.trap_gen_sfx_lp stoploopsound( "alien_conduit_on_lp" );
var_0 = getent( "ancestor_left_generator_scriptable", "targetname" );
level.trap_gen_dmg_sfx_lp = spawn( "script_origin", var_0.origin );
level.trap_gen_dmg_sfx_lp linkto( var_0 );
wait 0.1;
if ( isdefined( level.trap_gen_dmg_sfx_lp ) )
level.trap_gen_dmg_sfx_lp playloopsound( "alien_conduit_damaged_lp" );
}
repair_trap_gen_sfx()
{
if ( isdefined( level.trap_gen_dmg_sfx_lp ) )
{
level.trap_gen_dmg_sfx_lp stoploopsound( "alien_conduit_damaged_lp" );
level.trap_gen_dmg_sfx_lp delete();
}
if ( isdefined( level.trap_gen_sfx_lp ) )
level.trap_gen_sfx_lp playloopsound( "alien_conduit_on_lp" );
}
stop_trap_gen_sfx()
{
if ( isdefined( level.trap_gen_sfx_lp ) )
{
level.trap_gen_sfx_lp stoploopsound( "alien_conduit_on_lp" );
level.trap_gen_sfx_lp playloopsound( "alien_conduit_powered_lp" );
}
if ( isdefined( level.trap_gen_dmg_sfx_lp ) )
{
level.trap_gen_dmg_sfx_lp stoploopsound( "alien_conduit_damaged_lp" );
level.trap_gen_dmg_sfx_lp delete();
}
}
final_battle_middle_ancestor()
{
level.current_area_name = "ancestor_lane_middle";
wait 5.0;
setup_final_battle_encounter( "main_base", "ancestor_middle", 25 );
var_0 = common_scripts\utility::getstruct( "ancestor_middle_lane", "targetname" );
level.middle_ancestor = maps\mp\agents\alien\alien_ancestor\_alien_ancestor::addancestoragent( "axis", var_0.origin, level.players[0].angles );
if ( level.middle_ancestor maps\mp\alien\_utility::ent_flag_exist( "activate_shield_health_check" ) )
level.middle_ancestor maps\mp\alien\_utility::ent_flag_set( "activate_shield_health_check" );
level thread middle_ancestor_event();
if ( !common_scripts\utility::flag( "final_battle_start_vo_over" ) )
level thread play_godfather_vo( "last_gdf_inc_northgate", 5 );
else
level thread play_godfather_vo( "last_gdf_inc_northgate" );
common_scripts\utility::waittill_any_timeout( 240, "debug_beat_current_encounter" );
end_final_battle_encounter();
}
middle_ancestor_event()
{
level.middle_ancestor endon( "death" );
if ( !isdefined( level.middle_ancestor ) )
return;
level.middle_ancestor maps\mp\agents\alien\alien_ancestor\_alien_ancestor_think::ancestor_enter_scripted();
level.middle_ancestor maps\mp\agents\alien\alien_ancestor\_alien_ancestor_think::ancestor_path_to_node( "ancestor_front_gate_teleport" );
if ( !level.middle_gate_destroyed )
{
level thread play_godfather_vo( "last_gdf_northgate" );
level.middle_ancestor thread maps\mp\agents\alien\alien_ancestor\_alien_ancestor_think::ancestor_do_forced_grab( "ancestor_front_gate_grab_pos" );
thread sfx_gate_middle_bend();
level.middle_ancestor waittill( "forced_grab_damage_start" );
middle_destruction();
wait 2.0;
level.middle_ancestor maps\mp\alien\_utility::disable_alien_scripted();
level thread play_godfather_vo( "last_gdf_br_northgate", 5 );
var_0 = getnode( "ancestor_front_gate_return", "targetname" );
level.middle_ancestor maps\mp\agents\alien\alien_ancestor\_alien_ancestor_think::assign_path_node( var_0 );
level.middle_ancestor waittill( "at_attack_node" );
}
level.middle_ancestor maps\mp\agents\alien\alien_ancestor\_alien_ancestor_think::ancestor_enter_scripted();
level.middle_ancestor maps\mp\agents\alien\alien_ancestor\_alien_ancestor_think::ancestor_path_to_node( "ancestor_front_gate_traverse" );
var_1 = getent( "ancestor_front_gate_grab_pos", "targetname" );
level.middle_ancestor maps\mp\agents\alien\alien_ancestor\_alien_ancestor_think::ancestor_play_traversal( var_1.angles, "traverse_gate" );
level.middle_ancestor maps\mp\agents\alien\alien_ancestor\_alien_ancestor_think::ancestor_enter_scripted();
wait 0.5;
var_2 = getnode( "ancestor_front_gate_inside", "targetname" );
level.middle_ancestor maps\mp\agents\alien\alien_ancestor\_alien_ancestor_think::assign_path_node( var_2 );
level.middle_ancestor maps\mp\alien\_utility::disable_alien_scripted();
}
middle_destruction()
{
var_0 = level.outposts["main_base"].outpost_encounters["transition_middle"];
thread sfx_gate_middle_expl();
common_scripts\utility::exploder( "main_base_front_gate" );
common_scripts\utility::exploder( 102 );
level.middle_gate_destroyed = 1;
var_0.gate_models[0] delete();
level notify( "main_base_front_gate" );
wait 0.2;
var_0.gate_clip delete();
var_1 = getent( "front_gate_mantle", "targetname" );
var_1 movez( 200, 0.1 );
}
final_battle_right_ancestor()
{
level.current_area_name = "ancestor_lane_right";
wait 5.0;
setup_final_battle_encounter( "main_base", "ancestor_right", 26 );
var_0 = common_scripts\utility::getstruct( "ancestor_right_lane", "targetname" );
level.right_ancestor = maps\mp\agents\alien\alien_ancestor\_alien_ancestor::addancestoragent( "axis", var_0.origin, level.players[0].angles );
if ( level.right_ancestor maps\mp\alien\_utility::ent_flag_exist( "activate_shield_health_check" ) )
level.right_ancestor maps\mp\alien\_utility::ent_flag_set( "activate_shield_health_check" );
level thread right_ancestor_event();
if ( !common_scripts\utility::flag( "final_battle_start_vo_over" ) )
level thread play_godfather_vo( "last_gdf_inc_eastgate", 4 );
else
level thread play_godfather_vo( "last_gdf_inc_eastgate" );
common_scripts\utility::waittill_any_timeout( 240, "debug_beat_current_encounter" );
end_final_battle_encounter();
}
right_ancestor_event()
{
level.right_ancestor endon( "death" );
wait 5;
level thread play_godfather_vo( "last_gdf_airbornecryptids", 5 );
level.right_ancestor maps\mp\agents\alien\alien_ancestor\_alien_ancestor_think::ancestor_enter_scripted();
level thread play_godfather_vo( "last_gdf_eastgate" );
if ( !level.right_gate_destroyed )
{
level.right_ancestor maps\mp\agents\alien\alien_ancestor\_alien_ancestor_think::ancestor_path_to_node( "ancestor_right_gate_freedom" );
level.right_ancestor maps\mp\alien\_utility::disable_alien_scripted();
wait 20.0;
level.right_ancestor maps\mp\agents\alien\alien_ancestor\_alien_ancestor_think::ancestor_enter_scripted();
level.right_ancestor maps\mp\agents\alien\alien_ancestor\_alien_ancestor_think::ancestor_path_to_node( "ancestor_right_gate_traverse" );
level.right_ancestor thread maps\mp\agents\alien\alien_ancestor\_alien_ancestor_think::ancestor_do_forced_grab( "ancestor_right_gate_grab_pos" );
thread sfx_gate_right_bend();
level.right_ancestor waittill( "forced_grab_damage_start" );
right_destruction();
wait 0.5;
}
else
level.right_ancestor maps\mp\agents\alien\alien_ancestor\_alien_ancestor_think::ancestor_path_to_node( "ancestor_right_gate_traverse" );
level.right_ancestor maps\mp\agents\alien\alien_ancestor\_alien_ancestor_think::ancestor_enter_scripted();
level.right_ancestor maps\mp\agents\alien\alien_ancestor\_alien_ancestor_think::ancestor_play_traversal( level.right_ancestor.angles, "traverse_gate" );
level.right_ancestor maps\mp\agents\alien\alien_ancestor\_alien_ancestor_think::ancestor_enter_scripted();
wait 0.5;
var_0 = getnode( "ancestor_right_gate_inside", "targetname" );
level.right_ancestor maps\mp\agents\alien\alien_ancestor\_alien_ancestor_think::assign_path_node( var_0 );
level.right_ancestor maps\mp\alien\_utility::disable_alien_scripted();
}
right_destruction()
{
thread sfx_gate_right_expl();
var_0 = getentarray( "main_base_right_gate", "targetname" );
foreach ( var_2 in var_0 )
{
if ( isdefined( var_2.script_parameters ) && var_2.script_parameters == "exploder" )
{
var_2 show();
var_2 solid();
continue;
}
var_2 notsolid();
var_2 delete();
}
common_scripts\utility::exploder( 100 );
level.right_gate_destroyed = 1;
wait 0.2;
var_4 = getent( "right_connector", "targetname" );
var_4 connectpaths();
var_4 delete();
}
start_last_stand()
{
if ( common_scripts\utility::flag( "cortex_detonated" ) )
return;
if ( isdefined( level.jump_to_final_battle ) && level.jump_to_final_battle )
wait 8;
maps\mp\alien\_gamescore::reset_encounter_performance();
wait 2.0;
thread left_ancestor_respawn();
wait 0.2;
thread middle_ancestor_respawn();
wait 0.2;
thread right_ancestor_respawn();
wait 0.2;
setup_final_battle_encounter( "main_base", "final_battle", 27 );
common_scripts\utility::flag_wait( "cortex_detonated" );
end_final_battle_encounter();
}
setup_final_battle_encounter( var_0, var_1, var_2 )
{
level thread maps\mp\mp_alien_last_progression::set_area_index_for_encounter( var_0 );
maps\mp\_utility::delaythread( 2, maps\mp\alien\_challenge::spawn_challenge );
maps\mp\alien\_gamescore::reset_encounter_performance();
level.encounter_name = var_1;
level.current_hive_name = var_1;
level.current_area_name = var_0;
level.cycle_count = var_2;
maps\mp\alien\_spawn_director::start_cycle( var_2 );
level.cycle_count = level.cycle_count + 1;
var_3 = 0.4;
var_4 = 1.75;
thread maps\mp\alien\_hive::warn_all_players( var_4, var_3 );
}
end_final_battle_encounter()
{
maps\mp\alien\_spawn_director::end_cycle();
maps\mp\alien\_challenge::end_current_challenge();
maps\mp\alien\_challenge::remove_all_challenge_cases();
maps\mp\alien\_gamescore_last::update_cortex_charge_bonus( level.final_battle_stage );
maps\mp\alien\_gamescore::calculate_encounter_scores( level.players, [ "cortex" ] );
maps\mp\mp_alien_last_progression::give_players_rewards( undefined, 1, 0 );
}
left_ancestor_respawn()
{
var_0 = 0;
while ( isdefined( level.left_ancestor ) && isalive( level.left_ancestor ) && !isdefined( level.jump_to_final_battle ) )
{
wait 20;
var_0++;
if ( var_0 >= 2 )
return;
}
var_1 = common_scripts\utility::getstruct( "ancestor_left_lane", "targetname" );
level.left_ancestor = maps\mp\agents\alien\alien_ancestor\_alien_ancestor::addancestoragent( "axis", var_1.origin, ( 0, 0, 0 ) );
level thread left_ancestor_event();
}
middle_ancestor_respawn()
{
var_0 = 0;
while ( isdefined( level.middle_ancestor ) && isalive( level.middle_ancestor ) && !isdefined( level.jump_to_final_battle ) )
{
wait 20;
var_0++;
if ( var_0 >= 2 )
return;
}
var_1 = common_scripts\utility::getstruct( "ancestor_middle_lane", "targetname" );
level.middle_ancestor = maps\mp\agents\alien\alien_ancestor\_alien_ancestor::addancestoragent( "axis", var_1.origin, ( 0, 0, 0 ) );
level thread middle_ancestor_event();
}
right_ancestor_respawn()
{
var_0 = 0;
while ( isdefined( level.right_ancestor ) && isalive( level.right_ancestor ) && !isdefined( level.jump_to_final_battle ) )
{
wait 20;
var_0++;
if ( var_0 >= 2 )
return;
}
var_1 = common_scripts\utility::getstruct( "ancestor_right_lane", "targetname" );
level.right_ancestor = maps\mp\agents\alien\alien_ancestor\_alien_ancestor::addancestoragent( "axis", var_1.origin, ( 0, 0, 0 ) );
level thread right_ancestor_event();
}
do_ending()
{
thread last_end_music_sfx();
foreach ( var_1 in level.players )
{
var_1.ignoreme = 1;
var_1 thread mp_alien_last_camera_fly();
}
foreach ( var_4 in level.agentarray )
{
if ( isdefined( var_4 ) && isalive( var_4 ) )
var_4 dodamage( 100000, level.cortex_base_origin );
}
level.nuketimer = 3.35;
level.players[0] thread maps\mp\alien\_nuke::donukesimple();
thread medusa_100_state_fx();
foreach ( var_1 in level.players )
var_1 playrumbleonentity( "heavy_3s" );
var_8 = gettime() - level.final_battle_start_time;
level waittill( "nuke_death" );
update_lb_aliensession_last_escape( var_8 );
set_players_escaped();
give_players_completion_awards();
maps\mp\alien\_unlock::update_escape_item_unlock( level.players );
var_9 = maps\mp\alien\_hud::get_end_game_string_index( "all_escape" );
level maps\mp\_utility::delaythread( 3, maps\mp\gametypes\aliens::alienendgame, "allies", var_9 );
}
update_lb_aliensession_last_escape( var_0 )
{
var_1 = get_lb_final_battle_rank( var_0 );
foreach ( var_3 in level.players )
{
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_battle_rank( var_0 )
{
if ( maps\mp\alien\_utility::isplayingsolo() )
return solo_final_battle_rank( var_0 );
else
return coop_final_battle_rank( var_0 );
}
solo_final_battle_rank( var_0 )
{
var_1 = 840000;
var_2 = 960000;
var_3 = 1080000;
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;
}
coop_final_battle_rank( var_0 )
{
var_1 = 750000;
var_2 = 810000;
var_3 = 870000;
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;
}
mp_alien_last_camera_fly()
{
self endon( "disconnect" );
level endon( "game_ended" );
self playerhide();
maps\mp\_utility::freezecontrolswrapper( 1 );
maps\mp\_utility::clearkillcamstate();
self.friendlydamage = undefined;
self setdepthoffield( 0, 128, 512, 4000, 6, 1.8 );
self.anchor = spawn( "script_model", self geteye() );
self.anchor.angles = self.angles;
self.anchor setmodel( "tag_origin" );
self cameralinkto( self.anchor, "tag_origin" );
var_0 = getent( "cortex_base", "targetname" );
var_1 = 1;
if ( self geteye()[0] > var_0.origin[0] )
var_1 = -1;
var_2 = common_scripts\utility::getstruct( "fly_cam_init", "targetname" );
var_2.angles = ( angleclamp180( var_2.angles[0] ), angleclamp180( var_2.angles[1] ), angleclamp180( var_2.angles[2] ) );
self playerlinkweaponviewtodelta( self.anchor, "tag_player", 1.0, 10, 10, 10, 10, 1 );
var_3 = spawnstruct();
var_3.origin = var_2.origin + ( 500 * var_1, 800, 500 );
var_3.angles = vectortoangles( var_0.origin + ( 0, 0, 300 ) - var_3.origin );
var_3.angles = ( angleclamp180( var_3.angles[0] ), angleclamp180( var_3.angles[1] ), angleclamp180( var_3.angles[2] ) );
var_4 = spawnstruct();
var_4.origin = var_2.origin + ( 800 * var_1, -300, 800 );
var_4.angles = vectortoangles( var_0.origin + ( 0, 0, 500 ) - var_4.origin );
var_4.angles = ( angleclamp180( var_4.angles[0] ), angleclamp180( var_4.angles[1] ), angleclamp180( var_4.angles[2] ) );
var_5 = 120;
var_6 = 0.05;
var_7 = cubic_bezier_curve( self geteye(), var_2.origin, var_3.origin, var_4.origin, var_5 );
var_8 = cubic_bezier_curve( self.angles, var_2.angles, var_3.angles, var_4.angles, var_5 );
for ( var_9 = 0; var_9 < var_5; var_9++ )
{
self.anchor.origin = var_7[var_9];
self.anchor.angles = var_8[var_9];
wait( var_6 );
}
}
cubic_bezier_curve( var_0, var_1, var_2, var_3, var_4 )
{
var_5 = [];
var_6 = 0;
var_7 = 1 / var_4;
for ( var_8 = 0; var_8 < var_4; var_8++ )
{
var_9 = pow( 1 - var_6, 3 ) * var_0[0] + 3 * pow( 1 - var_6, 2 ) * var_6 * var_1[0] + 3 * ( 1 - var_6 ) * pow( var_6, 2 ) * var_2[0] + pow( var_6, 3 ) * var_3[0];
var_10 = pow( 1 - var_6, 3 ) * var_0[1] + 3 * pow( 1 - var_6, 2 ) * var_6 * var_1[1] + 3 * ( 1 - var_6 ) * pow( var_6, 2 ) * var_2[1] + pow( var_6, 3 ) * var_3[1];
var_11 = pow( 1 - var_6, 3 ) * var_0[2] + 3 * pow( 1 - var_6, 2 ) * var_6 * var_1[2] + 3 * ( 1 - var_6 ) * pow( var_6, 2 ) * var_2[2] + pow( var_6, 3 ) * var_3[2];
var_5[var_8] = ( var_9, var_10, var_11 );
var_6 = var_6 + var_7;
}
return var_5;
}
set_players_escaped()
{
foreach ( var_1 in level.players )
{
if ( !maps\mp\alien\_utility::is_casual_mode() )
var_1 maps\mp\alien\_persistence::set_player_escaped();
var_1.dlc4_escaped = 1;
}
maps\mp\alien\_achievement_dlc4::update_progression_achievements( "last_completed" );
}
give_players_completion_awards()
{
foreach ( var_1 in level.players )
var_1 maps\mp\alien\_persistence::award_completion_tokens();
}
run_cortex_logic()
{
level.cortex_sfx1 = spawn( "script_origin", ( 398, -622, 77 ) );
level.cortex_sfx2 = spawn( "script_origin", ( 398, -622, 77 ) );
level.cortex_sfx3 = spawn( "script_origin", ( 398, -622, 77 ) );
level endon( "game_ended" );
while ( common_scripts\utility::flag( "outpost_encounter_running" ) )
wait 1.0;
var_0 = getent( "cortex_use_trigger", "targetname" );
if ( !isdefined( var_0 ) )
return;
if ( !isdefined( level.jump_to_final_battle ) || !level.jump_to_final_battle )
{
var_0 thread maps\mp\alien\_hive::set_hive_icon( "waypoint_alien_cortex_activate", 1300 );
var_1 = getent( "cortex_canister", "targetname" );
if ( isdefined( var_1 ) )
maps\mp\alien\_outline_proto::add_to_outline_hive_watch_list( var_1 );
level thread players_use_cortex_monitor( var_0, "cortex_start_hint" );
wait_for_all_player_use();
foreach ( var_3 in level.players )
var_3 forceusehintoff( &"MP_ALIEN_LAST_CORTEX_START_HINT" );
common_scripts\utility::flag_set( "cortex_started" );
thread cortex_sfx_on();
var_0 maps\mp\alien\_hive::destroy_hive_icon();
if ( isdefined( var_1 ) )
maps\mp\alien\_outline_proto::remove_from_outline_hive_watch_list( var_1 );
wait 0.1;
var_0 thread maps\mp\alien\_hive::set_hive_icon( "waypoint_alien_defend", 1300 );
}
setomnvar( "ui_alien_boss_status", 2 );
setomnvar( "ui_alien_boss_icon", 5 );
setomnvar( "ui_alien_boss_progression", 100 );
var_5 = getent( "cortex_base", "targetname" );
var_5 cortex_attack_point_logic();
level.cortex_base_origin = var_5.origin;
level.num_cortex_players = level.players.size;
var_6 = 0;
while ( get_cortex_charge_percent() < 100 )
{
var_7 = get_cortex_charge_percent();
if ( var_7 > 25 && var_6 < 25 )
{
level notify( "cortex_25_percent" );
thread medusa_25_state_fx();
}
else if ( var_7 > 40 && var_6 < 40 )
level notify( "dlc_vo_notify", "last_vo", "cortex_damaged" );
else if ( var_7 > 50 && var_6 < 50 )
{
level notify( "cortex_50_percent" );
thread medusa_50_state_fx();
level notify( "dlc_vo_notify", "last_vo", "cortex_halfway" );
}
else if ( var_7 > 60 && var_6 < 60 )
level notify( "dlc_vo_notify", "last_vo", "cortex_damaged" );
else if ( var_7 > 75 && var_6 < 75 )
{
thread medusa_75_state_fx();
level notify( "dlc_vo_notify", "last_vo", "cortex_almost" );
level thread medusa_shock_behavior();
}
var_6 = var_7;
setomnvar( "ui_alien_boss_progression", 100 - var_7 );
wait 0.2;
}
level notify( "cortex_100_percent" );
setomnvar( "ui_alien_boss_progression", 0 );
var_5.ignoreme = 1;
level notify( "dlc_vo_notify", "last_vo", "cortex_full" );
var_0 maps\mp\alien\_hive::destroy_hive_icon();
var_0 thread maps\mp\alien\_hive::set_hive_icon( "waypoint_alien_cortex_detonate", 1300 );
var_1 = getent( "cortex_canister", "targetname" );
if ( isdefined( var_1 ) )
maps\mp\alien\_outline_proto::add_to_outline_hive_watch_list( var_1 );
level thread play_godfather_vo( "last_gdf_detonatethecortex" );
var_8 = [ "last_gdf_detonatethecortex" ];
level thread maps\mp\mp_alien_last::last_nag_vo_until_flag( var_8, "cortex_detonated" );
level thread players_use_cortex_monitor( var_0, "cortex_detonate_hint" );
wait_for_all_player_use();
foreach ( var_3 in level.players )
var_3 forceusehintoff( &"MP_ALIEN_LAST_CORTEX_DETONATE_HINT" );
setomnvar( "ui_alien_boss_status", 0 );
setomnvar( "ui_alien_boss_progression", 0 );
if ( isdefined( level.current_encounter_info ) && isdefined( level.current_encounter_info.force_end_func ) )
[[ level.current_encounter_info.force_end_func ]]();
if ( !common_scripts\utility::flag( "start_last_stand" ) )
common_scripts\utility::flag_set( "start_last_stand" );
common_scripts\utility::flag_set( "cortex_detonated" );
var_0 maps\mp\alien\_hive::destroy_hive_icon();
var_0 sethintstring( "" );
if ( isdefined( var_1 ) )
maps\mp\alien\_outline_proto::remove_from_outline_hive_watch_list( var_1 );
}
add_cortex_charge( var_0, var_1 )
{
if ( isdefined( var_1 ) )
{
var_2 = get_cortex_charge_max( level.players.size );
var_0 = int( var_1 / 100.0 * var_2 );
}
level.cortex_charge = level.cortex_charge + var_0;
}
subtract_cortex_charge( var_0 )
{
add_cortex_charge( var_0 * -1 );
}
get_cortex_charge_max( var_0 )
{
if ( !isdefined( var_0 ) )
var_0 = level.players.size;
if ( var_0 == 0 )
var_0 = 1;
var_1 = 55000;
if ( var_0 == 1 )
var_1 = 38000;
else if ( var_0 == 2 )
var_1 = 55000;
else if ( var_0 == 3 )
var_1 = 88000;
else if ( var_0 == 4 )
var_1 = 115000;
if ( maps\mp\alien\_utility::is_hardcore_mode() )
return var_1 * 1.15;
else
return var_1;
}
get_cortex_charge_percent()
{
cortex_scale_current_charge();
return level.cortex_charge / get_cortex_charge_max() * 100.0;
}
cortex_scale_current_charge()
{
if ( level.num_cortex_players != level.players.size )
{
var_0 = get_cortex_charge_max( level.players.size ) / get_cortex_charge_max( level.num_cortex_players );
level.cortex_charge = level.cortex_charge * var_0;
level.num_cortex_players = level.players.size;
}
}
cortex_attack_point_logic()
{
self makeentitysentient( "allies" );
self.maxhealth = 100000;
self.health = 99999;
thread cortex_threat_think( self );
self setcandamage( 1 );
thread cortex_monitor_health();
}
cortex_threat_think( var_0 )
{
level endon( "game_ended" );
level endon( "cortex_100_percent" );
var_1 = 1;
for (;;)
{
if ( level.final_battle_stage == 1 && get_cortex_charge_percent() < 10 || level.final_battle_stage == 2 && get_cortex_charge_percent() < 22 || level.final_battle_stage == 3 && get_cortex_charge_percent() < 50 || level.final_battle_stage == 4 && get_cortex_charge_percent() < 78 )
{
var_0.ignoreme = 1;
var_0.threatbias = -5000;
wait( var_1 );
continue;
}
var_0.ignoreme = 0;
var_2 = 0;
var_3 = 0;
foreach ( var_5 in level.players )
{
if ( isdefined( var_5 ) && isalive( var_5 ) )
{
var_3++;
var_2 = var_2 + distance2d( var_5.origin, var_0.origin );
}
}
if ( var_3 == 0 )
{
var_0.threatbias = int( -3000 );
wait( var_1 );
continue;
}
var_7 = var_2 / max( 1, var_3 );
if ( maps\mp\alien\_utility::is_true( level.room_exploit_threat_active ) )
var_0.threatbias = int( -8000 );
else if ( var_7 < 2500 )
var_0.threatbias = int( -3000 );
else if ( var_7 > 5000 )
var_0.threatbias = int( -1200 );
else
{
var_8 = 2500;
var_9 = 1800;
var_10 = ( var_7 - 2500 ) / var_8;
var_11 = var_10 * var_9;
var_0.threatbias = int( -3000 + var_11 );
}
wait( var_1 );
}
}
cortex_monitor_health()
{
level endon( "game_ended" );
level endon( "cortex_100_percent" );
for (;;)
{
var_0 = 0;
self waittill( "damage", var_1, var_2, var_3, var_4, var_5 );
if ( isdefined( var_2.team ) && var_2.team == "allies" )
var_0 = 1;
if ( !var_0 && level.cortex_charge > 0 )
{
level notify( "dlc_vo_notify", "cortex_attack" );
self playsound( "scn_dscnt_alien_pod_hit" );
var_6 = int( var_1 * 3.5 );
maps\mp\alien\_gamescore::update_team_encounter_performance( "cortex", "damage_done_on_cortex", var_6 );
subtract_cortex_charge( var_6 );
}
}
}
players_use_cortex_monitor( var_0, var_1 )
{
level endon( "all_players_using_cortex" );
foreach ( var_3 in level.players )
var_3 thread watch_for_use_cortex_trigger( var_0, var_1 );
for (;;)
{
level waittill( "connected", var_3 );
var_3 thread watch_for_use_cortex_trigger( var_0, var_1 );
}
}
wait_for_all_player_use()
{
level endon( "game_ended" );
while ( !are_all_players_using_cortex() )
wait 0.05;
level notify( "all_players_using_cortex" );
}
are_all_players_using_cortex()
{
var_0 = 1;
foreach ( var_2 in level.players )
{
if ( !isdefined( var_2.player_using_cortex ) || !var_2.player_using_cortex )
var_0 = 0;
}
return var_0;
}
watch_for_use_cortex_trigger( var_0, var_1 )
{
level endon( "game_ended" );
level endon( "all_players_using_cortex" );
self endon( "disconnect" );
self notify( "watch_for_use_cortex" );
self endon( "watch_for_use_cortex" );
self.player_using_cortex = 0;
var_2 = &"MP_ALIEN_LAST_CORTEX_START_HINT";
if ( var_1 == "cortex_detonate_hint" )
var_2 = &"MP_ALIEN_LAST_CORTEX_DETONATE_HINT";
var_3 = 16900;
for (;;)
{
if ( self ismeleeing() || self isthrowinggrenade() || !self isonground() || self getstance() == "prone" )
self forceusehintoff( var_2 );
else if ( player_looking_at( var_0.origin, 0.7 ) && player_in_front_of( var_0.origin ) )
{
if ( distancesquared( self geteye(), var_0.origin ) < var_3 )
{
self forceusehinton( var_2 );
if ( self usebuttonpressed() )
{
self.player_using_cortex = 1;
self notify( "using_cortex" );
thread reset_cortex_usage();
}
}
else
self forceusehintoff( var_2 );
}
else
self forceusehintoff( var_2 );
wait 0.05;
}
}
reset_cortex_usage()
{
level endon( "game_ended" );
level endon( "all_players_using_cortex" );
self endon( "death" );
self endon( "disconnect" );
self endon( "using_cortex" );
wait 0.5;
self.player_using_cortex = 0;
}
player_looking_at( var_0, var_1 )
{
if ( !isdefined( var_1 ) )
var_1 = 0.8;
var_2 = self geteye();
var_3 = vectortoangles( var_0 - var_2 );
var_4 = anglestoforward( var_3 );
var_5 = self getplayerangles();
var_6 = anglestoforward( var_5 );
var_7 = vectordot( var_4, var_6 );
if ( var_7 < var_1 )
return 0;
var_8 = bullettrace( var_0, var_2, 0 );
return var_8["fraction"] == 1;
}
player_in_front_of( var_0 )
{
return self.origin[1] > var_0[1];
}
jump_to_return_to_base()
{
}
jump_to_final_left()
{
}
jump_to_final_middle()
{
}
jump_to_final_right()
{
wait 2.0;
}
jump_to_final_battle()
{
}
jump_to_ending()
{
}
shut_base_gates()
{
var_0 = level.outposts["main_base"].outpost_encounters["transition_left"];
if ( maps\mp\alien\_utility::is_true( var_0.completed ) )
thread maps\mp\mp_alien_last_progression::opener_slide( var_0, 1 );
var_1 = level.outposts["main_base"].outpost_encounters["transition_middle"];
if ( maps\mp\alien\_utility::is_true( var_1.completed ) )
thread maps\mp\mp_alien_last_progression::opener_slide( var_1, 1, 1 );
var_2 = level.outposts["main_base"].outpost_encounters["transition_right"];
if ( maps\mp\alien\_utility::is_true( var_2.completed ) )
thread maps\mp\mp_alien_last_progression::opener_slide( var_2, 1 );
destroy_equipment_near_base_gates();
var_3 = getentarray( "garage_front_gate_model", "targetname" );
var_4 = getent( "garage_front_gate_clip", "targetname" );
foreach ( var_6 in var_3 )
var_6 movez( -101, 2.0, 0.3, 0.1 );
var_4 movez( -101, 2.0, 0.3, 0.1 );
wait 2.2;
var_4 disconnectpaths();
}
show_return_to_base_objective()
{
var_0 = "waypoint_alien_blocker";
var_1 = 14;
var_2 = 14;
var_3 = 0.75;
var_4 = self.origin + ( 0, 0, 75 );
var_5 = maps\mp\alien\_hud::make_waypoint( var_0, var_1, var_2, var_3, var_4 );
level waittill( "start_cross_vignette" );
var_5 destroy();
}
debug_beat_ancestor_encounter()
{
level notify( "debug_beat_current_encounter" );
wait 1.0;
}
cross_vignette_vo()
{
maps\mp\alien\_music_and_dialog::unpause_vo_system( level.players );
wait 3.6;
thread maps\mp\mp_alien_last::play_cross_vo( "last_crs_efforts1" );
wait 3.5;
thread maps\mp\mp_alien_last::play_cross_vignette_vo( "last_crs_sugarcoatit" );
wait 4.733;
thread maps\mp\mp_alien_last::play_cross_vignette_vo( "last_crs_efforts2" );
wait 2.933;
thread maps\mp\mp_alien_last::play_cross_vignette_vo( "last_crs_sugarcoatit2" );
wait 6.334;
thread maps\mp\mp_alien_last::play_cross_vignette_vo( "last_crs_cametothis" );
wait 8.233;
var_0 = [ "last_gdf_pickedaside" ];
thread maps\mp\mp_alien_last::play_last_vignette_vo( var_0 );
wait 3;
thread maps\mp\mp_alien_last::play_cross_vignette_vo( "last_crs_dontbother" );
wait 10.86;
var_0 = [ "last_crs_thefate_r" ];
thread maps\mp\mp_alien_last::play_last_vignette_vo( var_0 );
thread cross_gate_sfx();
wait 6.93;
var_0 = [ "last_crs_thefate2_r" ];
thread maps\mp\mp_alien_last::play_last_vignette_vo( var_0 );
}
final_battle_vo()
{
wait 5;
var_0 = [ "last_gdf_righttoyou" ];
maps\mp\mp_alien_last::play_last_vignette_vo( var_0 );
var_0 = [ "last_gdf_powerupthecortex" ];
level thread maps\mp\mp_alien_last::last_nag_vo_until_flag( var_0, "cortex_started" );
common_scripts\utility::flag_wait( "cortex_started" );
wait 2;
var_0 = [ "last_gdf_gametime" ];
maps\mp\mp_alien_last::play_last_vignette_vo( var_0 );
common_scripts\utility::flag_set( "final_battle_start_vo_over" );
while ( get_cortex_charge_percent() < 25 )
wait 0.1;
var_0 = [ "last_gdf_powercellcharged" ];
maps\mp\mp_alien_last::play_last_vignette_vo( var_0 );
while ( get_cortex_charge_percent() < 50 )
wait 0.1;
var_0 = [ "last_gdf_onyourgo" ];
maps\mp\mp_alien_last::play_last_vignette_vo( var_0 );
while ( get_cortex_charge_percent() < 75 )
wait 0.1;
var_0 = [ "last_gdf_autosequence" ];
maps\mp\mp_alien_last::play_last_vignette_vo( var_0 );
while ( get_cortex_charge_percent() < 95 )
wait 0.1;
var_0 = [ "last_gdf_medusadetonation" ];
maps\mp\mp_alien_last::play_last_vignette_vo( var_0 );
common_scripts\utility::flag_wait( "cortex_detonated" );
var_0 = [ "last_spa_stage1ignition" ];
maps\mp\mp_alien_last::play_last_vignette_vo( var_0 );
}
play_vo_on_final_ancestors_death()
{
level.dead_ancestors = 0;
for (;;)
{
level waittill( "ancestor_died" );
if ( level.dead_ancestors == 1 )
{
thread play_godfather_vo( "last_gdf_still2more" );
continue;
}
if ( level.dead_ancestors == 2 )
{
thread play_godfather_vo( "last_gdf_2down" );
continue;
}
if ( level.dead_ancestors == 3 )
thread play_godfather_vo( "last_gdf_allthreedown" );
}
}
play_godfather_vo( var_0, var_1 )
{
level endon( "debug_beat_current_encounter" );
level endon( "game_ended" );
if ( isdefined( var_1 ) )
wait( var_1 );
if ( !isdefined( var_0 ) )
return;
if ( !soundexists( var_0 ) )
return;
while ( maps\mp\mp_alien_last::vo_system_is_paused() )
wait 0.1;
maps\mp\alien\_music_and_dialog::pause_vo_system( level.players );
while ( maps\mp\alien\_music_and_dialog_dlc::is_vo_system_playing() )
wait 0.1;
wait 0.25;
var_2 = lookupsoundlength( var_0 ) / 1000;
thread maps\mp\mp_alien_last::play_global_vo( var_0 );
wait( var_2 );
maps\mp\alien\_music_and_dialog::unpause_vo_system( level.players );
}
medusa_on_state_fx()
{
var_0 = getent( "medusa_scriptable", "targetname" );
var_0 setscriptablepartstate( "base", "on" );
}
medusa_25_state_fx()
{
thread cortex_sfx_25per();
var_0 = getent( "medusa_scriptable", "targetname" );
var_0 setscriptablepartstate( "base", "25percent" );
}
medusa_50_state_fx()
{
thread cortex_sfx_50per();
var_0 = getent( "medusa_scriptable", "targetname" );
var_0 setscriptablepartstate( "base", "50percent" );
}
medusa_75_state_fx()
{
thread cortex_sfx_75per();
var_0 = getent( "medusa_scriptable", "targetname" );
var_0 setscriptablepartstate( "base", "75percent" );
}
medusa_100_state_fx()
{
thread cortex_sfx_100per();
var_0 = getent( "medusa_scriptable", "targetname" );
var_0 setscriptablepartstate( "base", "100percent" );
}
cortex_sfx_on()
{
level.cortex_sfx1 playsound( "scn_medusa_power_on" );
level.cortex_sfx2 playloopsound( "scn_medusa_thrum_lp" );
wait 4;
level.cortex_sfx3 playloopsound( "scn_medusa_running_lp" );
}
cortex_sfx_25per()
{
level.cortex_sfx1 playsound( "scn_medusa_25per" );
level.cortex_sfx3 stoploopsound( "scn_medusa_running_lp" );
wait 2.5;
level.cortex_sfx3 playloopsound( "scn_medusa_25_lp" );
}
cortex_sfx_50per()
{
level.cortex_sfx1 playsound( "scn_medusa_50per" );
level.cortex_sfx3 stoploopsound( "scn_medusa_25_lp" );
wait 2.5;
level.cortex_sfx3 playloopsound( "scn_medusa_50_lp" );
}
cortex_sfx_75per()
{
level.cortex_sfx1 playsound( "scn_medusa_75per" );
level.cortex_sfx3 stoploopsound( "scn_medusa_50_lp" );
wait 2.5;
level.cortex_sfx3 playloopsound( "scn_medusa_75_lp" );
}
cortex_sfx_100per()
{
level.cortex_sfx1 playsound( "scn_medusa_100per" );
level.cortex_sfx3 stoploopsound( "scn_medusa_75_lp" );
}
medusa_shock_behavior()
{
var_0 = 0;
var_1 = 5;
var_2 = 10;
var_3 = ( 400, -656, 1203.5 );
var_4 = getent( "cortex_base", "targetname" );
var_4.attack_bolt = spawn( "script_model", var_3 );
var_4.attack_bolt setmodel( "tag_origin" );
var_5 = 2250000;
var_4.damage_amount = 750;
for (;;)
{
foreach ( var_7 in level.agentarray )
{
if ( !isdefined( var_7.alien_type ) )
continue;
if ( !maps\mp\alien\_utility::is_true( var_7.isactive ) || !isalive( var_7 ) )
continue;
if ( maps\mp\alien\_utility::is_true( var_7.pet ) )
continue;
if ( maps\mp\alien\_utility::is_true( var_7.is_electrified ) )
continue;
if ( var_7.alien_type == "ancestor" )
continue;
var_8 = var_7.origin + ( 0, 0, 30 );
if ( var_7.alien_type == "elite" )
var_8 = var_7 gettagorigin( "tag_eye" );
if ( distancesquared( var_3, var_8 ) > var_5 )
continue;
if ( bullettracepassed( var_8, var_3, 0, var_4 ) )
{
var_7.is_electrified = 1;
var_7 thread maps\mp\mp_alien_last_traps::tesla_trap_attack( var_4, var_8 );
var_4 maps\mp\mp_alien_last_traps::reset_attack_bolt( var_3 );
wait( randomfloatrange( var_1, var_2 ) );
break;
}
}
wait 0.05;
}
}
destroy_equipment_near_base_gates()
{
var_0 = ( -682, -96, 63 );
var_1 = ( 1470, -84, 63 );
var_2 = ( 339, 493, 21 );
var_3 = ( 468, 493, 21 );
destroy_all_equipment_near( var_0 );
destroy_all_equipment_near( var_1 );
destroy_all_equipment_near( var_2 );
destroy_all_equipment_near( var_3 );
}
destroy_all_equipment_near( var_0 )
{
destroy_equipment_near( var_0, level.turrets );
destroy_equipment_near( var_0, level.placedims );
}
destroy_equipment_near( var_0, var_1 )
{
var_2 = 6400;
foreach ( var_4 in var_1 )
{
if ( !isdefined( var_4 ) )
continue;
if ( !isdefined( var_4.origin ) )
continue;
if ( isdefined( var_4.carriedby ) )
continue;
if ( distancesquared( var_0, var_4.origin ) <= var_2 )
var_4 notify( "death" );
}
}
sfx_gate_left_bend()
{
playsoundatpos( ( -556, -751, 104 ), "scn_gate_mtl_01" );
}
sfx_gate_left_expl()
{
playsoundatpos( ( -556, -751, 104 ), "scn_gate_expl_01" );
}
sfx_gate_middle_bend()
{
wait 3;
playsoundatpos( ( 426, 474, 73 ), "scn_gate_mtl_02" );
}
sfx_gate_middle_expl()
{
playsoundatpos( ( 426, 474, 73 ), "scn_gate_expl_02" );
}
sfx_gate_right_bend()
{
playsoundatpos( ( 1348, -775, 132 ), "scn_gate_mtl_03" );
}
sfx_gate_right_expl()
{
playsoundatpos( ( 1348, -775, 132 ), "scn_gate_expl_03" );
}
sfx_cross_shield_lp()
{
var_0 = spawn( "script_origin", level.dr_cross.origin );
var_0 playloopsound( "cross_shield_lp" );
level waittill( "shield_down" );
var_0 stoploopsound();
var_0 playsound( "cross_shield_down" );
wait 3;
var_0 delete();
}
sfx_cross_land()
{
wait 0.1;
playsoundatpos( level.dr_cross.origin, "scn_cross_end_01" );
thread play_cross_music();
thread sfx_cross_foley_01();
}
play_cross_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" );
}
wait 0.1;
if ( !common_scripts\utility::flag( "exfil_music_playing" ) )
level thread maps\mp\alien\_music_and_dialog::play_alien_music( "mus_alien_dlc4_cross_scene" );
}
}
sfx_cross_cortex()
{
wait 11.66;
playsoundatpos( level.dr_cross.origin, "scn_cross_end_02" );
thread sfx_cross_foley_02();
}
sfx_cross_teleport()
{
wait 33.4;
playsoundatpos( level.dr_cross.origin, "scn_cross_end_03" );
}
sfx_cross_foley_01()
{
wait 3.457;
playsoundatpos( level.dr_cross.origin, "scn_cross_end_foley_01" );
}
sfx_cross_foley_02()
{
wait 7.594;
playsoundatpos( level.dr_cross.origin, "scn_cross_end_foley_02" );
thread sfx_cross_foley_03();
}
sfx_cross_foley_03()
{
wait 10.597;
playsoundatpos( level.dr_cross.origin, "scn_cross_end_foley_03" );
}
last_end_music_sfx()
{
playsoundatpos( ( 0, 0, 0 ), "scn_last_end" );
level.cortex_sfx3 stoploopsound( "scn_medusa_75_lp" );
level.cortex_sfx2 stoploopsound( "scn_medusa_thrum_lp" );
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" );
}
wait 0.1;
if ( !common_scripts\utility::flag( "exfil_music_playing" ) )
level thread maps\mp\alien\_music_and_dialog::play_alien_music( "mus_alien_dlc4_end" );
}
}
play_end_ancestor_music()
{
if ( level.ancestor_music_played == 0 )
{
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" );
}
if ( maps\mp\_utility::isreallyalive( var_1 ) )
var_1 thread ancestor_music();
}
}
}
ancestor_music()
{
wait 1;
common_scripts\utility::flag_set( "alien_music_playing" );
wait 15.5;
self playlocalsound( "mus_alien_dlc4_ancestor_gate" );
level.ancestor_music_played = 1;
wait 50;
self playlocalsound( "mus_alien_dlc4_ancestor_fight" );
}
cross_gate_sfx()
{
wait 3.8;
level.dr_cross playsound( "scn_cross_gate" );
}
check_for_room_exploit()
{
level endon( "game_ended" );
level endon( "cortex_detonated" );
var_0 = 0;
var_1 = 5000;
level.room_exploit_threat_active = 0;
var_2 = getent( "main_base_threat_volume", "targetname" );
if ( !isdefined( var_2 ) )
return;
for (;;)
{
var_3 = 0;
foreach ( var_5 in level.players )
{
if ( var_5 istouching( var_2 ) )
var_3++;
}
if ( var_0 == 0 && var_3 >= level.players.size * 0.75 )
var_0 = gettime();
else if ( var_3 < level.players.size * 0.75 )
var_0 = 0;
if ( var_0 != 0 && gettime() - var_0 > var_1 )
level.room_exploit_threat_active = 1;
else
level.room_exploit_threat_active = 0;
wait 0.5;
}
}
initial_entity_setup()
{
var_0 = getent( "front_gate_mantle", "targetname" );
var_0 movez( -200, 0.1 );
var_1 = getent( "node_shelf", "targetname" );
var_1 delete();
var_2 = getentarray( "main_base_right_gate", "targetname" );
foreach ( var_4 in var_2 )
{
if ( isdefined( var_4.script_parameters ) && var_4.script_parameters == "exploder" )
{
var_4 notsolid();
var_4 hide();
}
}
var_2 = getentarray( "main_base_left_gate", "targetname" );
foreach ( var_4 in var_2 )
{
if ( isdefined( var_4.script_parameters ) && var_4.script_parameters == "exploder" )
{
var_4 notsolid();
var_4 hide();
}
}
var_8 = getnodearray( "main_gate_ramp_nodes", "targetname" );
foreach ( var_10 in var_8 )
var_10 disconnectnode();
}