426 lines
12 KiB
Plaintext
426 lines
12 KiB
Plaintext
#include common_scripts\utility;
|
|
#include maps\_utility;
|
|
#include maps\_anim;
|
|
#include maps\_specialops;
|
|
#include maps\so_hidden_so_ghillies_code;
|
|
|
|
// ---------------------------------------------------------------------------------
|
|
// Init
|
|
// ---------------------------------------------------------------------------------
|
|
main()
|
|
{
|
|
level.so_compass_zoom = "far";
|
|
|
|
default_start( ::start_so_hidden );
|
|
add_start( "so_hidden", ::start_so_hidden, "SO Hidden" );
|
|
add_start( "so_hidden_ghillie_crates", ::start_so_hidden_ghillie_crates, "Ghillie - Crates" );
|
|
add_start( "so_hidden_ghillie_valley", ::start_so_hidden_ghillie_valley, "Ghillie - Valley" );
|
|
add_start( "so_hidden_patrol_church", ::start_so_hidden_patrol_church, "Patrol - Church" );
|
|
add_start( "so_hidden_patrol_houses", ::start_so_hidden_patrol_houses, "Patrol - Houses" );
|
|
add_start( "so_hidden_patrol_barn", ::start_so_hidden_patrol_barn, "Patrol - Barn" );
|
|
add_start( "so_hidden_ghillie_houses", ::start_so_hidden_ghillie_houses, "Ghillie - Houses" );
|
|
|
|
setsaveddvar( "sm_sunShadowScale", "0.7" ); // optimization
|
|
setsaveddvar( "ui_hidemap", "1" );
|
|
|
|
maps\so_hidden_so_ghillies_anim::main();
|
|
maps\so_ghillies_precache::main();
|
|
maps\createart\so_ghillies_art::main();
|
|
maps\so_ghillies_fx::main();
|
|
|
|
maps\_load::main();
|
|
|
|
thread maps\so_ghillies_amb::main();
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------
|
|
// Challenge Initializations
|
|
// ---------------------------------------------------------------------------------
|
|
start_so_hidden()
|
|
{
|
|
start_so_hidden_basics();
|
|
|
|
thread enable_patrol_enemies_crates();
|
|
thread enable_ghillie_enemies_crates();
|
|
thread enable_ghillie_enemies_valley();
|
|
thread enable_patrol_enemies_church();
|
|
thread enable_patrol_enemies_houses();
|
|
thread enable_patrol_enemies_barn();
|
|
thread enable_ghillie_enemies_houses();
|
|
}
|
|
|
|
start_so_hidden_ghillie_crates()
|
|
{
|
|
start_so_hidden_basics();
|
|
|
|
thread enable_ghillie_enemies_crates();
|
|
thread enable_ghillie_enemies_valley();
|
|
thread enable_patrol_enemies_church();
|
|
thread enable_patrol_enemies_houses();
|
|
thread enable_patrol_enemies_barn();
|
|
thread enable_ghillie_enemies_houses();
|
|
|
|
start_so_hidden_gogogo( "start_ghillie_crates" );
|
|
}
|
|
|
|
start_so_hidden_ghillie_valley()
|
|
{
|
|
start_so_hidden_basics();
|
|
|
|
thread enable_ghillie_enemies_valley();
|
|
thread enable_patrol_enemies_church();
|
|
thread enable_patrol_enemies_houses();
|
|
thread enable_patrol_enemies_barn();
|
|
thread enable_ghillie_enemies_houses();
|
|
|
|
start_so_hidden_gogogo( "start_ghillie_valley" );
|
|
}
|
|
|
|
start_so_hidden_patrol_church()
|
|
{
|
|
start_so_hidden_basics();
|
|
|
|
thread enable_patrol_enemies_church();
|
|
thread enable_patrol_enemies_houses();
|
|
thread enable_patrol_enemies_barn();
|
|
thread enable_ghillie_enemies_houses();
|
|
|
|
start_so_hidden_gogogo( "start_patrol_church" );
|
|
}
|
|
|
|
start_so_hidden_patrol_houses()
|
|
{
|
|
start_so_hidden_basics();
|
|
|
|
thread enable_patrol_enemies_houses();
|
|
thread enable_patrol_enemies_barn();
|
|
thread enable_ghillie_enemies_houses();
|
|
|
|
start_so_hidden_gogogo( "start_patrol_houses" );
|
|
}
|
|
|
|
start_so_hidden_patrol_barn()
|
|
{
|
|
start_so_hidden_basics();
|
|
|
|
thread enable_patrol_enemies_barn();
|
|
thread enable_ghillie_enemies_houses();
|
|
|
|
start_so_hidden_gogogo( "start_patrol_barn" );
|
|
}
|
|
|
|
start_so_hidden_ghillie_houses()
|
|
{
|
|
start_so_hidden_basics();
|
|
|
|
thread enable_ghillie_enemies_houses();
|
|
|
|
start_so_hidden_gogogo( "start_ghillie_houses" );
|
|
}
|
|
|
|
start_so_hidden_basics()
|
|
{
|
|
so_hidden_init();
|
|
|
|
thread enable_stealth();
|
|
thread enable_radiation();
|
|
array_thread( level.players, ::dialog_unsilenced_weapons );
|
|
|
|
thread fade_challenge_in();
|
|
thread fade_challenge_out( "so_hidden_complete" );
|
|
|
|
thread enable_challenge_timer( "so_hidden_start" , "so_hidden_complete" );
|
|
thread enable_triggered_complete( "so_hidden_exit_trigger", "so_hidden_complete", "all" );
|
|
|
|
// Hint to show current bonuses.
|
|
array_thread( level.players, ::hud_bonuses_create );
|
|
}
|
|
|
|
so_hidden_init()
|
|
{
|
|
flag_init( "so_hidden_complete" );
|
|
flag_init( "so_hidden_exit_trigger" );
|
|
flag_init( "force_disable_stealth" );
|
|
|
|
flag_init( "church_windows_back" );
|
|
flag_init( "church_windows_front" );
|
|
flag_init( "school_windows" );
|
|
flag_init( "house_windows" );
|
|
|
|
// thread stealth_achievement();
|
|
|
|
level.custom_eog_no_kills = true;
|
|
level.custom_eog_no_partner = true;
|
|
level.eog_summary_callback = ::custom_eog_summary;
|
|
|
|
switch( level.gameSkill )
|
|
{
|
|
case 0: // Easy
|
|
case 1: so_hidden_setup_regular(); break; // Regular
|
|
case 2: so_hidden_setup_hardened(); break; // Hardened
|
|
case 3: so_hidden_setup_veteran(); break; // Veteran
|
|
}
|
|
|
|
// Objective marker updates.
|
|
thread objective_set_chopper();
|
|
|
|
// Give player a chance to not be seen through windows.
|
|
array_thread( getentarray( "clip_nosight", "targetname" ), ::clip_nosight_wait_for_activate );
|
|
|
|
// Open up the church doorway.
|
|
church_doors = getentarray( "church_door_front", "targetname" );
|
|
foreach ( door in church_doors )
|
|
{
|
|
door ConnectPaths();
|
|
door Delete();
|
|
}
|
|
|
|
// Keeps track of how many are active at a time.
|
|
level.ghillie_count = 0;
|
|
level.patrol_count = 0;
|
|
level.enemies_spawned = 0;
|
|
|
|
level.ghillie_go_aggro_distance = 450;
|
|
|
|
patrol_enemy_reset_multi_kill();
|
|
|
|
// Only allow kill announcements every few seconds.
|
|
level.death_dialog_throttle = 2500;
|
|
level.death_dialog_time = gettime() + level.death_dialog_throttle;
|
|
|
|
level.dialog_kill_stealth = [];
|
|
level.dialog_kill_stealth[ level.dialog_kill_stealth.size ] = "so_hid_ghil_goodnight";
|
|
level.dialog_kill_stealth[ level.dialog_kill_stealth.size ] = "so_hid_ghil_beautiful";
|
|
level.dialog_kill_stealth[ level.dialog_kill_stealth.size ] = "so_hid_ghil_perfect";
|
|
|
|
level.dialog_kill_quiet = [];
|
|
level.dialog_kill_quiet[ level.dialog_kill_quiet.size ] = "so_hid_ghil_tango_down";
|
|
level.dialog_kill_quiet[ level.dialog_kill_quiet.size ] = "so_hid_ghil_hesdown";
|
|
level.dialog_kill_quiet[ level.dialog_kill_quiet.size ] = "so_hid_ghil_neutralized";
|
|
|
|
level.dialog_kill_basic = [];
|
|
level.dialog_kill_basic[ level.dialog_kill_basic.size ] = "so_hid_ghil_sloppy";
|
|
level.dialog_kill_basic[ level.dialog_kill_basic.size ] = "so_hid_ghil_noisy";
|
|
level.dialog_kill_basic[ level.dialog_kill_basic.size ] = "so_hid_ghil_do_better";
|
|
|
|
// Global time bonuses
|
|
level.bonus_stealth = 6;
|
|
level.bonus_nofire = 3;
|
|
level.bonus_basic = 1;
|
|
level.bonus_time_given = 0;
|
|
|
|
// Global number of kill counts
|
|
level.deaths_stealth = 0;
|
|
level.deaths_nofire = 0;
|
|
level.deaths_basic = 0;
|
|
|
|
// Individual player kill counts
|
|
foreach ( player in level.players )
|
|
{
|
|
player.kills_stealth = 0;
|
|
player.kills_nofire = 0;
|
|
player.kills_basic = 0;
|
|
}
|
|
|
|
level._effect[ "extraction_smoke" ] = loadfx( "smoke/signal_smoke_green" );
|
|
|
|
deadquotes = [];
|
|
deadquotes[ deadquotes.size ] = "@DEADQUOTE_SO_STEALTH_LOOK_FOR_ENEMIES";
|
|
deadquotes[ deadquotes.size ] = "@DEADQUOTE_SO_STEALTH_STAY_LOW";
|
|
deadquotes[ deadquotes.size ] = "@DEADQUOTE_SO_STEALTH_USE_SILENCERS";
|
|
so_include_deadquote_array( deadquotes );
|
|
}
|
|
|
|
start_so_hidden_gogogo( start_id )
|
|
{
|
|
start_point = getstruct( start_id, "script_noteworthy" );
|
|
maps\_specialops_code::place_player_at_start_point( level.player, start_point );
|
|
if ( is_coop() )
|
|
maps\_specialops_code::place_player2_near_player1();
|
|
|
|
wait 0.05;
|
|
flag_set( "so_hidden_start" );
|
|
}
|
|
|
|
so_hidden_setup_regular()
|
|
{
|
|
obj = getstruct( "so_hidden_obj_church", "script_noteworthy" );
|
|
objective_add( 1, "current", &"SO_HIDDEN_SO_GHILLIES_OBJ_REGULAR", obj.origin );
|
|
|
|
level.coop_difficulty_scalar = 0.75;
|
|
|
|
level.ghillie_move_intro_min = 2.0;
|
|
level.ghillie_move_intro_max = 3.0;
|
|
level.ghillie_move_time_min = 4.0;
|
|
level.ghillie_move_time_max = 8.0;
|
|
|
|
level.ghillie_shoot_pause_min = 2.5;
|
|
level.ghillie_shoot_pause_max = 3.5;
|
|
level.ghillie_shoot_quit_min = 4.0;
|
|
level.ghillie_shoot_quit_max = 8.0;
|
|
level.ghillie_shoot_hold_min = 2.0;
|
|
level.ghillie_shoot_hold_max = 3.0;
|
|
level.ghillie_crouch_chance = 0.33;
|
|
|
|
level.ghillie_flub_time_min = 5000;
|
|
level.ghillie_flub_time_max = 10000;
|
|
}
|
|
|
|
so_hidden_setup_hardened()
|
|
{
|
|
obj = getstruct( "so_hidden_obj_church", "script_noteworthy" );
|
|
objective_add( 1, "current", &"SO_HIDDEN_SO_GHILLIES_OBJ_HARDENED", obj.origin );
|
|
|
|
level.coop_difficulty_scalar = 0.33;
|
|
|
|
level.ghillie_move_intro_min = 2.0;
|
|
level.ghillie_move_intro_max = 3.0;
|
|
level.ghillie_move_time_min = 4.0;
|
|
level.ghillie_move_time_max = 8.0;
|
|
|
|
level.ghillie_shoot_pause_min = 1.0;
|
|
level.ghillie_shoot_pause_max = 1.75;
|
|
level.ghillie_shoot_quit_min = 8.0;
|
|
level.ghillie_shoot_quit_max = 12.0;
|
|
level.ghillie_shoot_hold_min = 0.8;
|
|
level.ghillie_shoot_hold_max = 1.6;
|
|
level.ghillie_crouch_chance = 0.15;
|
|
|
|
level.ghillie_flub_time_min = 10000;
|
|
level.ghillie_flub_time_max = 20000;
|
|
}
|
|
|
|
so_hidden_setup_veteran()
|
|
{
|
|
obj = getstruct( "so_hidden_obj_church", "script_noteworthy" );
|
|
objective_add( 1, "current", &"SO_HIDDEN_SO_GHILLIES_OBJ_VETERAN", obj.origin );
|
|
|
|
level.coop_difficulty_scalar = 0.25;
|
|
|
|
level.ghillie_move_intro_min = 1.0;
|
|
level.ghillie_move_intro_max = 2.0;
|
|
level.ghillie_move_time_min = 4.0;
|
|
level.ghillie_move_time_max = 8.0;
|
|
|
|
level.ghillie_shoot_pause_min = 0.4;
|
|
level.ghillie_shoot_pause_max = 0.8;
|
|
level.ghillie_shoot_quit_min = 10.0;
|
|
level.ghillie_shoot_quit_max = 20.0;
|
|
level.ghillie_shoot_hold_min = 0.2;
|
|
level.ghillie_shoot_hold_max = 0.4;
|
|
level.ghillie_crouch_chance = 0.0;
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------
|
|
// Enable/Disable events
|
|
// ---------------------------------------------------------------------------------
|
|
|
|
// ---------------------------------------------------------------------------------
|
|
|
|
enable_patrol_enemies_crates()
|
|
{
|
|
thread create_patrol_enemies( "patrol_enemy_crates", "patrol_enemies_spawn_crates" );
|
|
}
|
|
|
|
enable_patrol_enemies_church()
|
|
{
|
|
flag_set( "church_windows_back" );
|
|
thread create_patrol_enemies( "patrol_enemy_church", "patrol_enemies_spawn_church", 0.5 );
|
|
}
|
|
|
|
enable_patrol_enemies_houses()
|
|
{
|
|
flag_set( "church_windows_front" );
|
|
flag_set( "school_windows" );
|
|
thread create_patrol_enemies( "patrol_enemy_houses", "patrol_enemies_spawn_houses" );
|
|
}
|
|
|
|
enable_patrol_enemies_barn()
|
|
{
|
|
flag_set( "house_windows" );
|
|
thread create_patrol_enemies( "patrol_enemy_barn", "patrol_enemies_spawn_barn" );
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------
|
|
|
|
enable_ghillie_enemies_crates()
|
|
{
|
|
thread create_ghillie_enemies( "ghillie_enemy_crates", "ghillie_enemies_spawn_crates" );
|
|
}
|
|
|
|
enable_ghillie_enemies_valley()
|
|
{
|
|
thread create_ghillie_enemies( "ghillie_enemy_valley", "ghillie_enemies_spawn_crates", "ghillie_enemies_spawn_valley" );
|
|
}
|
|
|
|
enable_ghillie_enemies_houses()
|
|
{
|
|
thread create_ghillie_enemies( "ghillie_enemy_houses", "ghillie_enemies_spawn_houses" );
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------
|
|
|
|
enable_stealth()
|
|
{
|
|
thread turn_on_stealth();
|
|
}
|
|
|
|
enable_radiation()
|
|
{
|
|
thread turn_on_radiation();
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------
|
|
|
|
custom_eog_summary()
|
|
{
|
|
enemies_left = level.enemies_spawned;
|
|
foreach( player in level.players )
|
|
{
|
|
enemies_left -= player.kills_stealth;
|
|
enemies_left -= player.kills_nofire;
|
|
enemies_left -= player.kills_basic;
|
|
}
|
|
|
|
foreach ( player in level.players )
|
|
{
|
|
player add_custom_eog_summary_line( "@SO_HIDDEN_SO_GHILLIES_STAT_STEALTH", player.kills_stealth );
|
|
player add_custom_eog_summary_line( "@SO_HIDDEN_SO_GHILLIES_STAT_NOFIRE", player.kills_nofire );
|
|
player add_custom_eog_summary_line( "@SO_HIDDEN_SO_GHILLIES_STAT_BASIC", player.kills_basic );
|
|
if ( flag( "so_hidden_complete" ) )
|
|
player add_custom_eog_summary_line( "@SO_HIDDEN_SO_GHILLIES_STAT_SKIPPED", enemies_left );
|
|
}
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------
|
|
|
|
stealth_achievement()
|
|
{
|
|
flag_wait( "so_hidden_complete" );
|
|
|
|
if ( !stealth_achieved() )
|
|
return;
|
|
|
|
foreach ( player in level.players )
|
|
{
|
|
// No achievement for individual players unless they made at least one perfect kill.
|
|
if ( player.kills_stealth > 0 )
|
|
player maps\_utility::player_giveachievement_wrapper( "WRAITH" );
|
|
}
|
|
}
|
|
|
|
stealth_achieved()
|
|
{
|
|
// No achievement if any non-perfect kills happened during the mission.
|
|
foreach( player in level.players )
|
|
{
|
|
if ( player.kills_nofire > 0 )
|
|
return false;
|
|
if ( player.kills_basic > 0 )
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
// --------------------------------------------------------------------------------- |