503 lines
15 KiB
Plaintext
503 lines
15 KiB
Plaintext
|
#include maps\_utility;
|
||
|
#include common_scripts\utility;
|
||
|
#include maps\_anim;
|
||
|
#include maps\_vehicle;
|
||
|
#include maps\_specialops;
|
||
|
#include maps\so_defense_invasion_code;
|
||
|
|
||
|
// ---------------------------------------------------------------------------------
|
||
|
// Init
|
||
|
// ---------------------------------------------------------------------------------
|
||
|
main()
|
||
|
{
|
||
|
maps\invasion_precache::main();
|
||
|
maps\invasion_fx::main();
|
||
|
maps\createart\invasion_art::main();
|
||
|
|
||
|
precachestring( &"SO_DEFENSE_INVASION_OBJ_REGULAR" );
|
||
|
precachestring( &"SO_DEFENSE_INVASION_OBJ_HARDENED" );
|
||
|
precachestring( &"SO_DEFENSE_INVASION_OBJ_VETERAN" );
|
||
|
precachestring( &"SO_DEFENSE_INVASION_WAVE_1" );
|
||
|
precachestring( &"SO_DEFENSE_INVASION_WAVE_2" );
|
||
|
precachestring( &"SO_DEFENSE_INVASION_WAVE_3" );
|
||
|
precachestring( &"SO_DEFENSE_INVASION_WAVE_4" );
|
||
|
precachestring( &"SO_DEFENSE_INVASION_WAVE_5" );
|
||
|
precachestring( &"SO_DEFENSE_INVASION_ALERT_20" );
|
||
|
precachestring( &"SO_DEFENSE_INVASION_ALERT_30" );
|
||
|
precachestring( &"SO_DEFENSE_INVASION_ALERT_30_SKILLED" );
|
||
|
precachestring( &"SO_DEFENSE_INVASION_ALERT_40" );
|
||
|
precachestring( &"SO_DEFENSE_INVASION_ALERT_40_SKILLED" );
|
||
|
precachestring( &"SO_DEFENSE_INVASION_ALERT_HELLFIRE" );
|
||
|
precachestring( &"SO_DEFENSE_INVASION_ALERT_BTR80" );
|
||
|
precachestring( &"SO_DEFENSE_INVASION_ALERT_HELI" );
|
||
|
precachestring( &"SO_DEFENSE_INVASION_ALERT_HELIS" );
|
||
|
precachestring( &"SO_DEFENSE_INVASION_ALERT_BLANK" );
|
||
|
precachestring( &"SO_DEFENSE_INVASION_ALERT_COMING" );
|
||
|
precachestring( &"SO_DEFENSE_INVASION_HUNTERS" );
|
||
|
precachestring( &"SO_DEFENSE_INVASION_BTR80" );
|
||
|
precachestring( &"SO_DEFENSE_INVASION_HELICOPTERS" );
|
||
|
precachestring( &"SO_DEFENSE_INVASION_UAV_SPOTTED" );
|
||
|
precachestring( &"SO_DEFENSE_INVASION_UAV_TARGETTING" );
|
||
|
precachestring( &"SO_DEFENSE_INVASION_KILLS_TURRET" );
|
||
|
precachestring( &"SO_DEFENSE_INVASION_KILLS_BTR80" );
|
||
|
precachestring( &"SO_DEFENSE_INVASION_KILLS_HELI" );
|
||
|
|
||
|
precacheItem( "smoke_grenade_american" );
|
||
|
precacheItem( "remote_missile_not_player_invasion" );
|
||
|
precacheModel( "weapon_stinger_obj" );
|
||
|
precacheModel( "weapon_uav_control_unit_obj" );
|
||
|
precacheItem( "flash_grenade" );
|
||
|
|
||
|
precacheItem( "zippy_rockets" );
|
||
|
precacheItem( "stinger_speedy" );
|
||
|
|
||
|
add_start( "so_defense", ::start_so_defense );
|
||
|
|
||
|
maps\_attack_heli::preLoad();
|
||
|
|
||
|
maps\_load::main();
|
||
|
|
||
|
thread maps\invasion_amb::main();
|
||
|
maps\invasion_anim::main_anim();
|
||
|
|
||
|
maps\_compass::setupMiniMap( "compass_map_invasion" );
|
||
|
}
|
||
|
|
||
|
// ---------------------------------------------------------------------------------
|
||
|
// Challenge Initializations
|
||
|
// ---------------------------------------------------------------------------------
|
||
|
start_so_defense()
|
||
|
{
|
||
|
so_defense_init();
|
||
|
so_defense_challenge_prep();
|
||
|
so_defense_wave_1();
|
||
|
so_defense_wave_2();
|
||
|
so_defense_wave_3();
|
||
|
so_defense_wave_4( true );
|
||
|
so_defense_wave_5( true );
|
||
|
so_defense_challenge_complete();
|
||
|
}
|
||
|
|
||
|
so_defense_init()
|
||
|
{
|
||
|
flag_init( "challenge_start" );
|
||
|
flag_init( "challenge_success" );
|
||
|
|
||
|
so_defense_setup_radio_dialog();
|
||
|
|
||
|
switch( level.gameSkill )
|
||
|
{
|
||
|
case 0: // Easy
|
||
|
case 1: so_defense_setup_Regular(); break; // Regular
|
||
|
case 2: so_defense_setup_hardened(); break; // Hardened
|
||
|
case 3: so_defense_setup_veteran(); break; // Veteran
|
||
|
}
|
||
|
|
||
|
// Smoke chance when spawning bank, burgertown, or taco enemies.
|
||
|
level.smoke_chance = 0.33;
|
||
|
level.smoke_throttle = 60000;
|
||
|
|
||
|
level.btr80_alert_throttle = 10000;
|
||
|
|
||
|
// Put a clamp on how often the player is alerted to hunter spawn points.
|
||
|
level.hunter_dialog_throttle = 20000;
|
||
|
|
||
|
// Remove unwanted sentries
|
||
|
sentries = getentarray( "misc_turret", "classname" );
|
||
|
foreach ( sentry in sentries )
|
||
|
sentry Delete();
|
||
|
common_scripts\_sentry::main();
|
||
|
|
||
|
// Attacker Accuracy modifiers for sentry turrets.
|
||
|
level.aamod_sentry_kill = 2.0;
|
||
|
// harder difficulties a bit more forgiving on turret usage.
|
||
|
switch( level.gameskill )
|
||
|
{
|
||
|
case 2: level.aamod_sentry_kill = 1.75; break;
|
||
|
case 3: level.aamod_sentry_kill = 1.25; break;
|
||
|
}
|
||
|
level.aamod_player_kill = -8.0;
|
||
|
level.aamod_btr80_kill = -12.0;
|
||
|
level.aamod_heli_kill = -16.0;
|
||
|
|
||
|
// Access the stingers before the player has a chance to take them
|
||
|
level.stingers = [];
|
||
|
thread stinger_maintain_spawn( "diner" );
|
||
|
thread stinger_maintain_spawn( "nates_stinger" );
|
||
|
// thread dialog_get_stinger();
|
||
|
|
||
|
// Custom end of game summary info.
|
||
|
level.custom_eog_no_partner = true;
|
||
|
level.eog_summary_callback = ::custom_eog_summary;
|
||
|
foreach ( player in level.players )
|
||
|
{
|
||
|
player.turret_kills = 0;
|
||
|
player.btr80_kills = 0;
|
||
|
player.helicopter_kills = 0;
|
||
|
}
|
||
|
|
||
|
// Prevent player from leaving the valid play space.
|
||
|
thread enable_escape_warning();
|
||
|
thread enable_escape_failure();
|
||
|
thread enable_challenge_timer( "challenge_start", "challenge_success" );
|
||
|
|
||
|
// Remove ladder clips that are there to help the player in SP.
|
||
|
ladder = getent( "nates_kitchen_ladder_clip", "targetname" );
|
||
|
ladder Delete();
|
||
|
ladder = getent( "bt_ktichen_ladder_clip", "targetname" );
|
||
|
ladder Delete();
|
||
|
|
||
|
// Remove the Predator Control Unit
|
||
|
ent = GetEnt( "predator_drone_control", "targetname" );
|
||
|
ent Delete();
|
||
|
|
||
|
// Update the enemies so they can be used properly.
|
||
|
so_defense_convert_enemies();
|
||
|
so_defense_set_enemy_spawner_flags();
|
||
|
|
||
|
// Open doors around the map.
|
||
|
door_diner_open();
|
||
|
//door_nates_locker_open();
|
||
|
//door_bt_locker_open();
|
||
|
|
||
|
deadquotes = [];
|
||
|
deadquotes[ deadquotes.size ] = "@SO_DEFENSE_INVASION_DEADQUOTE_HINT1";
|
||
|
deadquotes[ deadquotes.size ] = "@SO_DEFENSE_INVASION_DEADQUOTE_HINT2";
|
||
|
deadquotes[ deadquotes.size ] = "@SO_DEFENSE_INVASION_DEADQUOTE_HINT3";
|
||
|
deadquotes[ deadquotes.size ] = "@SO_DEFENSE_INVASION_DEADQUOTE_HINT4";
|
||
|
deadquotes[ deadquotes.size ] = "@DEADQUOTE_SO_CLAYMORE_POINT_ENEMY";
|
||
|
deadquotes[ deadquotes.size ] = "@DEADQUOTE_SO_CLAYMORE_ENEMIES_SHOOT";
|
||
|
deadquotes[ deadquotes.size ] = "@DEADQUOTE_SO_TURRET_PLACEMENT";
|
||
|
so_include_deadquote_array( deadquotes );
|
||
|
|
||
|
// HOLD HERE TILL PLAYERS READY IN ONLINE COOP
|
||
|
so_wait_for_players_ready();
|
||
|
|
||
|
// Todo: Convert the individual wave items into objectives
|
||
|
Objective_Add( 1, "current", level.challenge_objective );
|
||
|
}
|
||
|
|
||
|
so_defense_setup_regular()
|
||
|
{
|
||
|
level.challenge_objective = &"SO_DEFENSE_INVASION_OBJ_REGULAR";
|
||
|
}
|
||
|
|
||
|
so_defense_setup_hardened()
|
||
|
{
|
||
|
level.challenge_objective = &"SO_DEFENSE_INVASION_OBJ_HARDENED";
|
||
|
}
|
||
|
|
||
|
so_defense_setup_veteran()
|
||
|
{
|
||
|
level.challenge_objective = &"SO_DEFENSE_INVASION_OBJ_VETERAN";
|
||
|
}
|
||
|
|
||
|
so_defense_setup_radio_dialog()
|
||
|
{
|
||
|
level.scr_radio[ "so_def_inv_thermaloptics" ] = "so_def_inv_thermaloptics";
|
||
|
level.scr_radio[ "so_def_inv_bmpspottedyou" ] = "so_def_inv_bmpspottedyou";
|
||
|
level.scr_radio[ "so_def_inv_niceone" ] = "so_def_inv_niceone";
|
||
|
level.scr_radio[ "so_def_inv_stingerdiner" ] = "so_def_inv_stingerdiner";
|
||
|
level.scr_radio[ "so_def_inv_stingernates" ] = "so_def_inv_stingernates";
|
||
|
}
|
||
|
|
||
|
// ---------------------------------------------------------------------------------
|
||
|
// Challenge Waves
|
||
|
// ---------------------------------------------------------------------------------
|
||
|
so_defense_challenge_prep()
|
||
|
{
|
||
|
thread enable_hellfire_attack();
|
||
|
pause_hellfire_attack();
|
||
|
|
||
|
thread enable_nates_exploders();
|
||
|
|
||
|
thread fade_challenge_in();
|
||
|
|
||
|
wait so_standard_wait();
|
||
|
}
|
||
|
|
||
|
so_defense_wave_1( force_wave )
|
||
|
{
|
||
|
if ( !so_defense_can_do_wave( 1, force_wave ) )
|
||
|
return;
|
||
|
|
||
|
so_defense_announce_wave_start( "SO_DEFENSE_INVASION_WAVE_1", 10, true );
|
||
|
thread hud_display_wavecount( 1 );
|
||
|
|
||
|
flag_set( "challenge_start" );
|
||
|
|
||
|
thread hud_display_enemies_active( &"SO_DEFENSE_INVASION_HUNTERS", 20, "hunter_death" );
|
||
|
thread enable_hunter_enemy_refill( 10, 10, 10, 20 );
|
||
|
|
||
|
level waittill( "hunters_all_down" );
|
||
|
so_defense_announce_wave_complete();
|
||
|
}
|
||
|
|
||
|
so_defense_wave_2( force_wave )
|
||
|
{
|
||
|
if ( !so_defense_can_do_wave( 1, force_wave ) )
|
||
|
return;
|
||
|
|
||
|
so_defense_announce_wave_start( "SO_DEFENSE_INVASION_WAVE_2", 10 );
|
||
|
thread hud_display_wavecount( 2 );
|
||
|
|
||
|
thread unpause_hellfire_attack();
|
||
|
|
||
|
thread hud_display_enemies_active( &"SO_DEFENSE_INVASION_HUNTERS", 30, "hunter_death" );
|
||
|
thread enable_hunter_truck_enemies_road();
|
||
|
thread enable_hunter_enemy_refill( 10, 10, 10, 20 );
|
||
|
|
||
|
level waittill( "hunters_all_down" );
|
||
|
so_defense_announce_wave_complete();
|
||
|
}
|
||
|
|
||
|
so_defense_wave_3( force_wave )
|
||
|
{
|
||
|
if ( !so_defense_can_do_wave( 1, force_wave ) )
|
||
|
return;
|
||
|
|
||
|
so_defense_announce_wave_start( "SO_DEFENSE_INVASION_WAVE_3", 10 );
|
||
|
thread hud_display_wavecount( 3 );
|
||
|
|
||
|
thread unpause_hellfire_attack();
|
||
|
|
||
|
thread hud_display_enemies_active( &"SO_DEFENSE_INVASION_HUNTERS", 40, "hunter_death" );
|
||
|
thread enable_hunter_enemy_refill( 15, 15, 15, 40 );
|
||
|
|
||
|
thread hud_display_enemies_active( &"SO_DEFENSE_INVASION_HELICOPTERS", 1, "attack_heli_death" );
|
||
|
thread enable_attack_heli_everywhere();
|
||
|
|
||
|
waittill_multiple( "hunters_all_down", "attack_helis_all_down" );
|
||
|
so_defense_announce_wave_complete();
|
||
|
}
|
||
|
|
||
|
so_defense_wave_4( force_wave )
|
||
|
{
|
||
|
if ( !so_defense_can_do_wave( 2, force_wave ) )
|
||
|
return;
|
||
|
|
||
|
so_defense_announce_wave_start( "SO_DEFENSE_INVASION_WAVE_4", 10 );
|
||
|
thread hud_display_wavecount( 4 );
|
||
|
|
||
|
thread unpause_hellfire_attack();
|
||
|
|
||
|
thread hud_display_enemies_active( &"SO_DEFENSE_INVASION_HUNTERS", 30, "hunter_death" );
|
||
|
thread enable_hunter_enemy_refill( 15, 15, 15, 30 );
|
||
|
|
||
|
thread hud_display_enemies_active( &"SO_DEFENSE_INVASION_BTR80", 1, "btr80_death" );
|
||
|
thread enable_btr80_circling_street();
|
||
|
|
||
|
waittill_multiple( "hunters_all_down", "btr80s_all_down" );
|
||
|
so_defense_announce_wave_complete();
|
||
|
}
|
||
|
|
||
|
so_defense_wave_5( force_wave )
|
||
|
{
|
||
|
if ( !so_defense_can_do_wave( 3, force_wave ) )
|
||
|
return;
|
||
|
|
||
|
so_defense_announce_wave_start( "SO_DEFENSE_INVASION_WAVE_5", 10 );
|
||
|
thread hud_display_wavecount( 5 );
|
||
|
|
||
|
thread unpause_hellfire_attack();
|
||
|
|
||
|
thread hud_display_enemies_active( &"SO_DEFENSE_INVASION_HUNTERS", 40, "hunter_death" );
|
||
|
thread enable_hunter_truck_enemies_bank();
|
||
|
thread enable_hunter_enemy_refill( 15, 15, 15, 30 );
|
||
|
|
||
|
thread hud_display_enemies_active( &"SO_DEFENSE_INVASION_BTR80", 1, "btr80_death" );
|
||
|
thread enable_btr80_circling_parking_lot();
|
||
|
|
||
|
thread hud_display_enemies_active( &"SO_DEFENSE_INVASION_HELICOPTERS", 2, "attack_heli_death" );
|
||
|
thread enable_attack_heli_north();
|
||
|
thread enable_attack_heli_south( 15 );
|
||
|
|
||
|
waittill_multiple( "hunters_all_down", "btr80s_all_down", "attack_helis_all_down" );
|
||
|
so_defense_announce_wave_complete();
|
||
|
}
|
||
|
|
||
|
so_defense_announce_wave_start( wave, timer, set_start_time )
|
||
|
{
|
||
|
thread enable_countdown_timer( timer, set_start_time );
|
||
|
|
||
|
wait 2;
|
||
|
hud_display_wave( wave, timer - 2 );
|
||
|
|
||
|
thread so_defense_announce_start_music( wave );
|
||
|
|
||
|
// Reset the progress status so it can give appropriate updates each wave.
|
||
|
level.so_progress_goal_status = "none";
|
||
|
|
||
|
// Reset the hunter dialog throttle so that it will happen on the first wave again.
|
||
|
if ( isdefined( level.hunter_dialog_throttle ) )
|
||
|
level.hunter_dialog_time = gettime() - level.hunter_dialog_throttle - 1;
|
||
|
|
||
|
// Reset the stinger missile dialog throttle so that it will wait a while before activating.
|
||
|
stringer_dialog_throttle_reset();
|
||
|
}
|
||
|
|
||
|
so_defense_announce_start_music( wave )
|
||
|
{
|
||
|
// Gives time for the snare drum SFX to complete.
|
||
|
wait 0.75;
|
||
|
|
||
|
if ( wave == "SO_DEFENSE_INVASION_WAVE_5" )
|
||
|
thread music_loop( "so_defense_invasion_finalwave_music", 114 );
|
||
|
else
|
||
|
thread music_loop( "so_defense_invasion_music", 191 );
|
||
|
}
|
||
|
|
||
|
so_defense_announce_wave_complete()
|
||
|
{
|
||
|
hud_display_wavecount_remove();
|
||
|
|
||
|
pause_hellfire_attack();
|
||
|
level.player PlaySound( "arcademode_kill_streak_won" );
|
||
|
music_stop( 2 );
|
||
|
|
||
|
// Give all other notifies a chance to catch up.
|
||
|
wait 0.05;
|
||
|
level notify( "wave_complete" );
|
||
|
level.hud_display_enemies = undefined;
|
||
|
}
|
||
|
|
||
|
so_defense_challenge_complete()
|
||
|
{
|
||
|
flag_set( "challenge_success" );
|
||
|
thread fade_challenge_out();
|
||
|
}
|
||
|
|
||
|
so_defense_can_do_wave( skill, force_wave )
|
||
|
{
|
||
|
if ( isdefined( force_wave ) && force_wave )
|
||
|
return true;
|
||
|
|
||
|
return level.gameSkill >= skill;
|
||
|
}
|
||
|
|
||
|
custom_eog_summary()
|
||
|
{
|
||
|
foreach ( player in level.players )
|
||
|
{
|
||
|
player add_custom_eog_summary_line( "@SO_DEFENSE_INVASION_KILLS_TURRET", player.turret_kills );
|
||
|
player add_custom_eog_summary_line( "@SO_DEFENSE_INVASION_KILLS_BTR80", player.btr80_kills );
|
||
|
player add_custom_eog_summary_line( "@SO_DEFENSE_INVASION_KILLS_HELI", player.helicopter_kills );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// ---------------------------------------------------------------------------------
|
||
|
// Enable/Disable events
|
||
|
// ---------------------------------------------------------------------------------
|
||
|
|
||
|
// ---------------------------------------------------------------------------------
|
||
|
|
||
|
enable_nates_exploders()
|
||
|
{
|
||
|
thread fire_off_exploder( getent( "north_side_low", "targetname" ) );
|
||
|
thread fire_off_exploder( getent( "north_side_high", "targetname" ) );
|
||
|
thread fire_off_exploder( getent( "west_side", "targetname" ) );
|
||
|
}
|
||
|
|
||
|
// ---------------------------------------------------------------------------------
|
||
|
|
||
|
enable_smoke_wave_north( dialog_wait )
|
||
|
{
|
||
|
create_smoke_wave( "magic_smoke_grenade_north", dialog_wait );
|
||
|
}
|
||
|
|
||
|
enable_smoke_wave_south( dialog_wait )
|
||
|
{
|
||
|
create_smoke_wave( "magic_smoke_grenade", dialog_wait );
|
||
|
}
|
||
|
|
||
|
// ---------------------------------------------------------------------------------
|
||
|
|
||
|
enable_hunter_truck_enemies_bank()
|
||
|
{
|
||
|
create_hunter_truck_enemies( "truck_north_right" );
|
||
|
}
|
||
|
|
||
|
enable_hunter_truck_enemies_road()
|
||
|
{
|
||
|
create_hunter_truck_enemies( "truck_north_left" );
|
||
|
}
|
||
|
|
||
|
// ---------------------------------------------------------------------------------
|
||
|
|
||
|
enable_btr80_circling_street()
|
||
|
{
|
||
|
create_btr80( "nate_attacker_left" );
|
||
|
}
|
||
|
|
||
|
enable_btr80_circling_parking_lot()
|
||
|
{
|
||
|
create_btr80( "nate_attacker_mid" );
|
||
|
}
|
||
|
|
||
|
// ---------------------------------------------------------------------------------
|
||
|
|
||
|
enable_hunter_enemy_refill( refill_at, min_fill, max_fill, refill_total )
|
||
|
{
|
||
|
hunter_enemies_refill( refill_at, min_fill, max_fill, refill_total );
|
||
|
}
|
||
|
|
||
|
enable_hunter_enemy_group_bank( enemy_count )
|
||
|
{
|
||
|
create_hunter_enemy_group( "bank_enemies", enemy_count );
|
||
|
}
|
||
|
|
||
|
enable_hunter_enemy_group_gas_station( enemy_count )
|
||
|
{
|
||
|
create_hunter_enemy_group( "gas_station_enemies", enemy_count );
|
||
|
}
|
||
|
|
||
|
enable_hunter_enemy_group_taco( enemy_count )
|
||
|
{
|
||
|
create_hunter_enemy_group( "taco_enemies", enemy_count );
|
||
|
}
|
||
|
|
||
|
enable_hunter_enemy_group_burger_town( enemy_count )
|
||
|
{
|
||
|
create_hunter_enemy_group( "burger_town_enemies", enemy_count );
|
||
|
}
|
||
|
|
||
|
// ---------------------------------------------------------------------------------
|
||
|
|
||
|
enable_hellfire_attack()
|
||
|
{
|
||
|
hellfire_attack_start();
|
||
|
}
|
||
|
|
||
|
disable_hellfire_attack()
|
||
|
{
|
||
|
hellfire_attack_stop();
|
||
|
}
|
||
|
|
||
|
pause_hellfire_attack()
|
||
|
{
|
||
|
hellfire_attack_pause();
|
||
|
}
|
||
|
|
||
|
unpause_hellfire_attack()
|
||
|
{
|
||
|
hellfire_attack_unpause();
|
||
|
}
|
||
|
|
||
|
// ---------------------------------------------------------------------------------
|
||
|
|
||
|
enable_attack_heli_everywhere( wait_time )
|
||
|
{
|
||
|
create_attack_heli( "kill_heli", "attack_heli_circle_node", wait_time );
|
||
|
}
|
||
|
|
||
|
enable_attack_heli_north( wait_time )
|
||
|
{
|
||
|
create_attack_heli( "kill_heli", "attack_heli_north_circle_node", wait_time );
|
||
|
}
|
||
|
|
||
|
enable_attack_heli_south( wait_time )
|
||
|
{
|
||
|
create_attack_heli( "kill_heli", "attack_heli_south_circle_node", wait_time );
|
||
|
}
|
||
|
|
||
|
// ---------------------------------------------------------------------------------
|