IL-GSC/BO1/PC/ZM/maps/_gameskill.gsc
2024-02-18 17:32:07 -05:00

1931 lines
58 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include maps\_utility;
#include animscripts\utility;
#include common_scripts\utility;
setSkill( reset, skill_override )
{
if ( !isdefined( level.script ) )
{
level.script = tolower( GetDvar( #"mapname" ) );
}
if ( !isdefined( reset ) || reset == false )
{
if ( isdefined( level.gameSkill ) )
{
return;
}
if ( !isdefined( level.custom_player_attacker ) )
{
level.custom_player_attacker = ::return_false;
}
level.global_damage_func_ads = ::empty_kill_func;
level.global_damage_func = ::empty_kill_func;
level.global_kill_func = ::empty_kill_func;
set_console_status();
flag_init( "player_has_red_flashing_overlay" );
flag_init( "player_is_invulnerable" );
flag_clear( "player_has_red_flashing_overlay" );
flag_clear( "player_is_invulnerable" );
level.difficultyType[ 0 ] = "easy";
level.difficultyType[ 1 ] = "normal";
level.difficultyType[ 2 ] = "hardened";
level.difficultyType[ 3 ] = "veteran";
level.difficultyString[ "easy" ] = &"GAMESKILL_EASY";
level.difficultyString[ "normal" ] = &"GAMESKILL_NORMAL";
level.difficultyString[ "hardened" ] = &"GAMESKILL_HARDENED";
level.difficultyString[ "veteran" ] = &"GAMESKILL_VETERAN";
level thread update_skill_on_change();
}
if(!IsDefined(level.invulTime_onShield_multiplier))
{
level.invulTime_onShield_multiplier = 1;
}
if(!IsDefined(level.player_attacker_accuracy_multiplier))
{
level.player_attacker_accuracy_multiplier = 1;
}
level.gameSkill = GetDvarInt( #"g_gameskill" );
if ( isdefined( skill_override ) )
{
level.gameSkill = skill_override;
}
setdvar( "saved_gameskill", level.gameSkill );
switch (level.gameSkill)
{
case 0:
setdvar ("currentDifficulty", "easy");
break;
case 1:
setdvar ("currentDifficulty", "normal");
break;
case 2:
setdvar ("currentDifficulty", "hardened");
break;
case 3:
setdvar ("currentDifficulty", "veteran");
break;
}
if ( GetDvar( #"autodifficulty_playerDeathTimer" ) == "" )
{
setdvar( "autodifficulty_playerDeathTimer", 0 );
}
anim.run_accuracy = 0.5;
logString( "difficulty: " + level.gameSkill );
setdvar( "autodifficulty_frac", 0 );
setdvar( "coop_difficulty_scaling", 1 );
level.difficultySettings_stepFunc_percent = [];
level.difficultySettings_frac_data_points = [];
level.auto_adjust_threatbias = true;
setTakeCoverWarnings();
thread increment_take_cover_warnings_on_death();
level.mg42badplace_mintime = 8;
level.mg42badplace_maxtime = 16;
add_fractional_data_point( "playerGrenadeBaseTime", 0.0, 50000 );
add_fractional_data_point( "playerGrenadeBaseTime", 0.25, 40000 );
add_fractional_data_point( "playerGrenadeBaseTime", 0.75, 25000 );
add_fractional_data_point( "playerGrenadeBaseTime", 1.0, 13500 );
level.difficultySettings[ "playerGrenadeBaseTime" ][ "hardened" ] = 10000;
level.difficultySettings[ "playerGrenadeBaseTime" ][ "veteran" ] = 0;
add_fractional_data_point( "playerGrenadeRangeTime", 0.0, 22000 );
add_fractional_data_point( "playerGrenadeRangeTime", 0.25, 20000 );
add_fractional_data_point( "playerGrenadeRangeTime", 0.75, 15000 );
add_fractional_data_point( "playerGrenadeRangeTime", 1.0, 7500 );
level.difficultySettings[ "playerGrenadeRangeTime" ][ "hardened" ] = 5000;
level.difficultySettings[ "playerGrenadeRangeTime" ][ "veteran" ] = 1;
add_fractional_data_point( "playerDoubleGrenadeTime", 0.25, 60 * 60 * 1000 );
add_fractional_data_point( "playerDoubleGrenadeTime", 0.75, 120 * 1000 );
add_fractional_data_point( "playerDoubleGrenadeTime", 1.0, 20 * 1000 );
level.difficultySettings[ "playerDoubleGrenadeTime" ][ "hardened" ] = 15 * 1000;
level.difficultySettings[ "playerDoubleGrenadeTime" ][ "veteran" ] = 0;
level.difficultySettings[ "double_grenades_allowed" ][ "easy" ] = false;
level.difficultySettings[ "double_grenades_allowed" ][ "normal" ] = true;
level.difficultySettings[ "double_grenades_allowed" ][ "hardened" ] = true;
level.difficultySettings[ "double_grenades_allowed" ][ "veteran" ] = true;
level.difficultySettings_stepFunc_percent[ "double_grenades_allowed" ] = 0.75;
add_fractional_data_point( "player_deathInvulnerableTime", 0.25, 4000 );
add_fractional_data_point( "player_deathInvulnerableTime", 0.75, 1700 );
add_fractional_data_point( "player_deathInvulnerableTime", 1.0, 850 );
level.difficultySettings[ "player_deathInvulnerableTime" ][ "hardened" ] = 600;
level.difficultySettings[ "player_deathInvulnerableTime" ][ "veteran" ] = 100;
add_fractional_data_point( "threatbias", 0.0, 80 );
add_fractional_data_point( "threatbias", 0.25, 100 );
add_fractional_data_point( "threatbias", 0.75, 150 );
add_fractional_data_point( "threatbias", 1.0, 165 );
level.difficultySettings[ "threatbias" ][ "hardened" ] = 200;
level.difficultySettings[ "threatbias" ][ "veteran" ] = 400;
add_fractional_data_point( "longRegenTime", 1.0, 5000 );
level.difficultySettings[ "longRegenTime" ][ "hardened" ] = 5000;
level.difficultySettings[ "longRegenTime" ][ "veteran" ] = 5000;
add_fractional_data_point( "healthOverlayCutoff", 0.25, 0.01 );
add_fractional_data_point( "healthOverlayCutoff", 0.75, 0.2 );
add_fractional_data_point( "healthOverlayCutoff", 1.0, 0.25 );
level.difficultySettings[ "healthOverlayCutoff" ][ "hardened" ] = 0.3;
level.difficultySettings[ "healthOverlayCutoff" ][ "veteran" ] = 0.5;
add_fractional_data_point( "base_enemy_accuracy", 0.25, 1 );
add_fractional_data_point( "base_enemy_accuracy", 0.75, 1 );
level.difficultySettings[ "base_enemy_accuracy" ][ "hardened" ] = 1.3;
level.difficultySettings[ "base_enemy_accuracy" ][ "veteran" ] = 1.3;
add_fractional_data_point( "accuracyDistScale", 0.25, 1.0 );
add_fractional_data_point( "accuracyDistScale", 0.75, 1.0 );
level.difficultySettings[ "accuracyDistScale" ][ "hardened" ] = 1.0;
level.difficultySettings[ "accuracyDistScale" ][ "veteran" ] = 0.5;
add_fractional_data_point( "playerDifficultyHealth", 0.0, 550 );
add_fractional_data_point( "playerDifficultyHealth", 0.25, 475 );
add_fractional_data_point( "playerDifficultyHealth", 0.75, 310 );
add_fractional_data_point( "playerDifficultyHealth", 1.0, 210 );
level.difficultySettings[ "playerDifficultyHealth" ][ "hardened" ] = 165;
level.difficultySettings[ "playerDifficultyHealth" ][ "veteran" ] = 115;
add_fractional_data_point( "min_sniper_burst_delay_time", 0.0, 3.5 );
add_fractional_data_point( "min_sniper_burst_delay_time", 0.25, 3.0 );
add_fractional_data_point( "min_sniper_burst_delay_time", 0.75, 2.0 );
add_fractional_data_point( "min_sniper_burst_delay_time", 1.0, 1.80 );
level.difficultySettings[ "min_sniper_burst_delay_time" ][ "hardened" ] = 1.5;
level.difficultySettings[ "min_sniper_burst_delay_time" ][ "veteran" ] = 1.1;
add_fractional_data_point( "max_sniper_burst_delay_time", 0.0, 4.5 );
add_fractional_data_point( "max_sniper_burst_delay_time", 0.25, 4.0 );
add_fractional_data_point( "max_sniper_burst_delay_time", 0.75, 3.0 );
add_fractional_data_point( "max_sniper_burst_delay_time", 1.0, 2.5 );
level.difficultySettings[ "max_sniper_burst_delay_time" ][ "hardened" ] = 2.0;
level.difficultySettings[ "max_sniper_burst_delay_time" ][ "veteran" ] = 1.5;
add_fractional_data_point( "dog_health", 0.0, 0.2 );
add_fractional_data_point( "dog_health", 0.25, 0.25 );
add_fractional_data_point( "dog_health", 0.75, 0.75 );
add_fractional_data_point( "dog_health", 1.0, 0.8 );
level.difficultySettings[ "dog_health" ][ "hardened" ] = 1.0;
level.difficultySettings[ "dog_health" ][ "veteran" ] = 1.0;
add_fractional_data_point( "dog_presstime", 0.25, 415 );
add_fractional_data_point( "dog_presstime", 0.75, 375 );
level.difficultySettings[ "dog_presstime" ][ "hardened" ] = 250;
level.difficultySettings[ "dog_presstime" ][ "veteran" ] = 225;
level.difficultySettings[ "dog_hits_before_kill" ][ "easy" ] = 2;
level.difficultySettings[ "dog_hits_before_kill" ][ "normal" ] = 1;
level.difficultySettings[ "dog_hits_before_kill" ][ "hardened" ] = 0;
level.difficultySettings[ "dog_hits_before_kill" ][ "veteran" ] = 0;
level.difficultySettings_stepFunc_percent[ "dog_hits_before_kill" ] = 0.5;
level.difficultySettings[ "pain_test" ][ "easy" ] = ::always_pain;
level.difficultySettings[ "pain_test" ][ "normal" ] = ::always_pain;
level.difficultySettings[ "pain_test" ][ "hardened" ] = ::pain_protection;
level.difficultySettings[ "pain_test" ][ "veteran" ] = ::pain_protection;
anim.pain_test = level.difficultySettings[ "pain_test" ][ get_skill_from_index( level.gameskill ) ];
level.difficultySettings[ "missTimeConstant" ][ "easy" ] = 1.0;
level.difficultySettings[ "missTimeConstant" ][ "normal" ] = 0.05;
level.difficultySettings[ "missTimeConstant" ][ "hardened" ] = 0;
level.difficultySettings[ "missTimeConstant" ][ "veteran" ] = 0;
level.difficultySettings_stepFunc_percent[ "missTimeConstant" ] = 0.5;
level.difficultySettings[ "missTimeDistanceFactor" ][ "easy" ] = 0.8 / 1000;
level.difficultySettings[ "missTimeDistanceFactor" ][ "normal" ] = 0.1 / 1000;
level.difficultySettings[ "missTimeDistanceFactor" ][ "hardened" ] = 0.05 / 1000;
level.difficultySettings[ "missTimeDistanceFactor" ][ "veteran" ] = 0;
level.difficultySettings_stepFunc_percent[ "missTimeDistanceFactor" ] = 0.5;
add_fractional_data_point( "flashbangedInvulFactor", 0.25, 0.25 );
add_fractional_data_point( "flashbangedInvulFactor", 0.75, 0.0 );
level.difficultySettings[ "flashbangedInvulFactor" ][ "easy" ] = 0.25;
level.difficultySettings[ "flashbangedInvulFactor" ][ "normal" ] = 0;
level.difficultySettings[ "flashbangedInvulFactor" ][ "hardened" ] = 0;
level.difficultySettings[ "flashbangedInvulFactor" ][ "veteran" ] = 0;
add_fractional_data_point( "invulTime_preShield", 0.0, 0.7 );
add_fractional_data_point( "invulTime_preShield", 0.25, 0.6 );
add_fractional_data_point( "invulTime_preShield", 0.75, 0.35 );
add_fractional_data_point( "invulTime_preShield", 1.0, 0.3 );
level.difficultySettings[ "invulTime_preShield" ][ "hardened" ] = 0.1;
level.difficultySettings[ "invulTime_preShield" ][ "veteran" ] = 0.0;
add_fractional_data_point( "invulTime_onShield", 0.0, 1.0 );
add_fractional_data_point( "invulTime_onShield", 0.25, 0.8 );
add_fractional_data_point( "invulTime_onShield", 0.75, 0.5 );
add_fractional_data_point( "invulTime_onShield", 1.0, 0.3 );
level.difficultySettings[ "invulTime_onShield" ][ "hardened" ] = 0.1;
level.difficultySettings[ "invulTime_onShield" ][ "veteran" ] = 0.05;
add_fractional_data_point( "invulTime_postShield", 0.0, 0.6 );
add_fractional_data_point( "invulTime_postShield", 0.25, 0.5 );
add_fractional_data_point( "invulTime_postShield", 0.75, 0.3 );
add_fractional_data_point( "invulTime_postShield", 1.0, 0.2 );
level.difficultySettings[ "invulTime_postShield" ][ "hardened" ] = 0.1;
level.difficultySettings[ "invulTime_postShield" ][ "veteran" ] = 0.0;
add_fractional_data_point( "playerHealth_RegularRegenDelay", 0.0, 3500 );
add_fractional_data_point( "playerHealth_RegularRegenDelay", 0.25, 3000 );
add_fractional_data_point( "playerHealth_RegularRegenDelay", 0.75, 2400 );
add_fractional_data_point( "playerHealth_RegularRegenDelay", 1.0, 1500 );
level.difficultySettings[ "playerHealth_RegularRegenDelay" ][ "hardened" ] = 1200;
level.difficultySettings[ "playerHealth_RegularRegenDelay" ][ "veteran" ] = 1200;
add_fractional_data_point( "worthyDamageRatio", 0.25, 0.0 );
add_fractional_data_point( "worthyDamageRatio", 0.75, 0.1 );
level.difficultySettings[ "worthyDamageRatio" ][ "hardened" ] = 0.1;
level.difficultySettings[ "worthyDamageRatio" ][ "veteran" ] = 0.1;
level.difficultySettings[ "explosivePlantTime" ][ "easy" ] = 10;
level.difficultySettings[ "explosivePlantTime" ][ "normal" ] = 10;
level.difficultySettings[ "explosivePlantTime" ][ "hardened" ] = 5;
level.difficultySettings[ "explosivePlantTime" ][ "veteran" ] = 5;
level.explosiveplanttime = level.difficultySettings[ "explosivePlantTime" ][ get_skill_from_index( level.gameskill ) ];
level.difficultySettings[ "difficultyBasedAccuracy" ][ "easy" ] = 1;
level.difficultySettings[ "difficultyBasedAccuracy" ][ "normal" ] = 1;
level.difficultySettings[ "difficultyBasedAccuracy" ][ "hardened" ] = 1;
level.difficultySettings[ "difficultyBasedAccuracy" ][ "veteran" ] = 1.25;
anim.difficultyBasedAccuracy = getRatio( "difficultyBasedAccuracy", level.gameskill, level.gameskill );
level.difficultySettings[ "coopPlayer_deathInvulnerableTime" ][ "easy" ][0] = 1.0;
level.difficultySettings[ "coopPlayer_deathInvulnerableTime" ][ "easy" ][1] = 0.9;
level.difficultySettings[ "coopPlayer_deathInvulnerableTime" ][ "easy" ][2] = 0.8;
level.difficultySettings[ "coopPlayer_deathInvulnerableTime" ][ "easy" ][3] = 0.7;
level.difficultySettings[ "coopPlayer_deathInvulnerableTime" ][ "normal" ][0] = 1.0;
level.difficultySettings[ "coopPlayer_deathInvulnerableTime" ][ "normal" ][1] = 0.9;
level.difficultySettings[ "coopPlayer_deathInvulnerableTime" ][ "normal" ][2] = 0.8;
level.difficultySettings[ "coopPlayer_deathInvulnerableTime" ][ "normal" ][3] = 0.7;
level.difficultySettings[ "coopPlayer_deathInvulnerableTime" ][ "hardened" ][0] = 1.00;
level.difficultySettings[ "coopPlayer_deathInvulnerableTime" ][ "hardened" ][1] = 0.9;
level.difficultySettings[ "coopPlayer_deathInvulnerableTime" ][ "hardened" ][2] = 0.8;
level.difficultySettings[ "coopPlayer_deathInvulnerableTime" ][ "hardened" ][3] = 0.7;
level.difficultySettings[ "coopPlayer_deathInvulnerableTime" ][ "veteran" ][0] = 1.0;
level.difficultySettings[ "coopPlayer_deathInvulnerableTime" ][ "veteran" ][1] = 0.9;
level.difficultySettings[ "coopPlayer_deathInvulnerableTime" ][ "veteran" ][2] = 0.8;
level.difficultySettings[ "coopPlayer_deathInvulnerableTime" ][ "veteran" ][3] = 0.7;
level.difficultySettings[ "coopPlayerDifficultyHealth" ][ "easy" ][0] = 1.00;
level.difficultySettings[ "coopPlayerDifficultyHealth" ][ "easy" ][1] = 0.95;
level.difficultySettings[ "coopPlayerDifficultyHealth" ][ "easy" ][2] = 0.8;
level.difficultySettings[ "coopPlayerDifficultyHealth" ][ "easy" ][3] = 0.75;
level.difficultySettings[ "coopPlayerDifficultyHealth" ][ "normal" ][0] = 1.00;
level.difficultySettings[ "coopPlayerDifficultyHealth" ][ "normal" ][1] = 0.9;
level.difficultySettings[ "coopPlayerDifficultyHealth" ][ "normal" ][2] = 0.8;
level.difficultySettings[ "coopPlayerDifficultyHealth" ][ "normal" ][3] = 0.7;
level.difficultySettings[ "coopPlayerDifficultyHealth" ][ "hardened" ][0] = 1.00;
level.difficultySettings[ "coopPlayerDifficultyHealth" ][ "hardened" ][1] = 0.85;
level.difficultySettings[ "coopPlayerDifficultyHealth" ][ "hardened" ][2] = 0.7;
level.difficultySettings[ "coopPlayerDifficultyHealth" ][ "hardened" ][3] = 0.65;
level.difficultySettings[ "coopPlayerDifficultyHealth" ][ "veteran" ][0] = 1.00;
level.difficultySettings[ "coopPlayerDifficultyHealth" ][ "veteran" ][1] = 0.8;
level.difficultySettings[ "coopPlayerDifficultyHealth" ][ "veteran" ][2] = 0.6;
level.difficultySettings[ "coopPlayerDifficultyHealth" ][ "veteran" ][3] = 0.5;
level.difficultySettings[ "coopEnemyAccuracyScalar" ][ "easy" ][0] = 1;
level.difficultySettings[ "coopEnemyAccuracyScalar" ][ "easy" ][1] = 1.1;
level.difficultySettings[ "coopEnemyAccuracyScalar" ][ "easy" ][2] = 1.2;
level.difficultySettings[ "coopEnemyAccuracyScalar" ][ "easy" ][3] = 1.3;
level.difficultySettings[ "coopEnemyAccuracyScalar" ][ "normal" ][0] = 1;
level.difficultySettings[ "coopEnemyAccuracyScalar" ][ "normal" ][1] = 1.1;
level.difficultySettings[ "coopEnemyAccuracyScalar" ][ "normal" ][2] = 1.3;
level.difficultySettings[ "coopEnemyAccuracyScalar" ][ "normal" ][3] = 1.5;
level.difficultySettings[ "coopEnemyAccuracyScalar" ][ "hardened" ][0] = 1.0;
level.difficultySettings[ "coopEnemyAccuracyScalar" ][ "hardened" ][1] = 1.2;
level.difficultySettings[ "coopEnemyAccuracyScalar" ][ "hardened" ][2] = 1.4;
level.difficultySettings[ "coopEnemyAccuracyScalar" ][ "hardened" ][3] = 1.6;
level.difficultySettings[ "coopEnemyAccuracyScalar" ][ "veteran" ][0] = 1;
level.difficultySettings[ "coopEnemyAccuracyScalar" ][ "veteran" ][1] = 1.3;
level.difficultySettings[ "coopEnemyAccuracyScalar" ][ "veteran" ][2] = 1.6;
level.difficultySettings[ "coopEnemyAccuracyScalar" ][ "veteran" ][3] = 2;
level.difficultySettings[ "coopFriendlyAccuracyScalar" ][ "easy" ][0] = 1;
level.difficultySettings[ "coopFriendlyAccuracyScalar" ][ "easy" ][1] = 0.9;
level.difficultySettings[ "coopFriendlyAccuracyScalar" ][ "easy" ][2] = 0.8;
level.difficultySettings[ "coopFriendlyAccuracyScalar" ][ "easy" ][3] = 0.7;
level.difficultySettings[ "coopFriendlyAccuracyScalar" ][ "normal" ][0] = 1;
level.difficultySettings[ "coopFriendlyAccuracyScalar" ][ "normal" ][1] = 0.8;
level.difficultySettings[ "coopFriendlyAccuracyScalar" ][ "normal" ][2] = 0.7;
level.difficultySettings[ "coopFriendlyAccuracyScalar" ][ "normal" ][3] = 0.6;
level.difficultySettings[ "coopFriendlyAccuracyScalar" ][ "hardened" ][0] = 1;
level.difficultySettings[ "coopFriendlyAccuracyScalar" ][ "hardened" ][1] = 0.7;
level.difficultySettings[ "coopFriendlyAccuracyScalar" ][ "hardened" ][2] = 0.5;
level.difficultySettings[ "coopFriendlyAccuracyScalar" ][ "hardened" ][3] = 0.5;
level.difficultySettings[ "coopFriendlyAccuracyScalar" ][ "veteran" ][0] = 1;
level.difficultySettings[ "coopFriendlyAccuracyScalar" ][ "veteran" ][1] = 0.7;
level.difficultySettings[ "coopFriendlyAccuracyScalar" ][ "veteran" ][2] = 0.5;
level.difficultySettings[ "coopFriendlyAccuracyScalar" ][ "veteran" ][3] = 0.4;
level.difficultySettings[ "coopFriendlyThreatBiasScalar" ][ "easy" ][0] = 1;
level.difficultySettings[ "coopFriendlyThreatBiasScalar" ][ "easy" ][1] = 1.1;
level.difficultySettings[ "coopFriendlyThreatBiasScalar" ][ "easy" ][2] = 1.2;
level.difficultySettings[ "coopFriendlyThreatBiasScalar" ][ "easy" ][3] = 1.3;
level.difficultySettings[ "coopFriendlyThreatBiasScalar" ][ "normal" ][0] = 1;
level.difficultySettings[ "coopFriendlyThreatBiasScalar" ][ "normal" ][1] = 2;
level.difficultySettings[ "coopFriendlyThreatBiasScalar" ][ "normal" ][2] = 3;
level.difficultySettings[ "coopFriendlyThreatBiasScalar" ][ "normal" ][3] = 4;
level.difficultySettings[ "coopFriendlyThreatBiasScalar" ][ "hardened" ][0] = 1.0;
level.difficultySettings[ "coopFriendlyThreatBiasScalar" ][ "hardened" ][1] = 3;
level.difficultySettings[ "coopFriendlyThreatBiasScalar" ][ "hardened" ][2] = 6;
level.difficultySettings[ "coopFriendlyThreatBiasScalar" ][ "hardened" ][3] = 9;
level.difficultySettings[ "coopFriendlyThreatBiasScalar" ][ "veteran" ][0] = 1;
level.difficultySettings[ "coopFriendlyThreatBiasScalar" ][ "veteran" ][1] = 10;
level.difficultySettings[ "coopFriendlyThreatBiasScalar" ][ "veteran" ][2] = 20;
level.difficultySettings[ "coopFriendlyThreatBiasScalar" ][ "veteran" ][3] = 30;
level.difficultySettings[ "lateralAccuracyModifier" ][ "easy" ] = 300;
level.difficultySettings[ "lateralAccuracyModifier" ][ "normal" ] = 700;
level.difficultySettings[ "lateralAccuracyModifier" ][ "hardened" ] = 1000;
level.difficultySettings[ "lateralAccuracyModifier" ][ "veteran" ] = 2500;
level.lastPlayerSighted = 0;
difficulty_starting_frac[ "easy" ] = 0.25;
difficulty_starting_frac[ "normal" ] = 0.75;
if ( level.gameskill <= 1 )
{
{
dif_frac = difficulty_starting_frac[ get_skill_from_index( level.gameskill ) ];
dif_frac = int( dif_frac * 100 );
setdvar( "autodifficulty_frac", dif_frac );
}
set_difficulty_from_current_aa_frac();
}
else
{
set_difficulty_from_locked_settings();
}
setdvar( "autodifficulty_original_setting", level.gameskill );
if( GetDvar( #"g_gametype" ) != "vs" )
{
setsaveddvar( "player_meleeDamageMultiplier", 100 / 250 );
}
thread coop_enemy_accuracy_scalar_watcher();
thread coop_friendly_accuracy_scalar_watcher();
thread coop_player_threat_bias_adjuster();
thread coop_spawner_count_adjuster();
}
get_skill_from_index( index )
{
return level.difficultyType[ index ];
}
apply_difficulty_frac_with_func( difficulty_func, current_frac )
{
level.invulTime_preShield = [[ difficulty_func ]]( "invulTime_preShield", current_frac );
level.invulTime_onShield = [[ difficulty_func ]]( "invulTime_onShield", current_frac ) * level.invulTime_onShield_multiplier;
level.invulTime_postShield = [[ difficulty_func ]]( "invulTime_postShield", current_frac );
level.playerHealth_RegularRegenDelay = [[ difficulty_func ]]( "playerHealth_RegularRegenDelay", current_frac );
level.worthyDamageRatio = [[ difficulty_func ]]( "worthyDamageRatio", current_frac );
if ( level.auto_adjust_threatbias )
{
thread apply_threat_bias_to_all_players(difficulty_func, current_frac);
}
level.longRegenTime = [[ difficulty_func ]]( "longRegenTime", current_frac );
level.healthOverlayCutoff = [[ difficulty_func ]]( "healthOverlayCutoff", current_frac );
anim.player_attacker_accuracy = [[ difficulty_func ]]( "base_enemy_accuracy", current_frac ) * level.player_attacker_accuracy_multiplier;
level.attackeraccuracy = anim.player_attacker_accuracy;
anim.playerGrenadeBaseTime = int( [[ difficulty_func ]]( "playerGrenadeBaseTime", current_frac ) );
anim.playerGrenadeRangeTime = int( [[ difficulty_func ]]( "playerGrenadeRangeTime", current_frac ) );
anim.playerDoubleGrenadeTime = int( [[ difficulty_func ]]( "playerDoubleGrenadeTime", current_frac ) );
anim.min_sniper_burst_delay_time = [[ difficulty_func ]]( "min_sniper_burst_delay_time", current_frac );
anim.max_sniper_burst_delay_time = [[ difficulty_func ]]( "max_sniper_burst_delay_time", current_frac );
anim.dog_health = [[ difficulty_func ]]( "dog_health", current_frac );
anim.dog_presstime = [[ difficulty_func ]]( "dog_presstime", current_frac );
setsaveddvar( "ai_accuracyDistScale", [[ difficulty_func ]]( "accuracyDistScale", current_frac ) );
thread coop_damage_and_accuracy_scaling(difficulty_func, current_frac);
}
apply_threat_bias_to_all_players(difficulty_func, current_frac)
{
while (!isdefined (level.flag) || !isdefined(level.flag[ "all_players_connected" ]))
{
wait 0.05;
continue;
}
flag_wait( "all_players_connected" );
players = get_players();
for( i = 0; i < players.size; i++ )
{
players[i].threatbias = int( [[ difficulty_func ]]( "threatbias", current_frac ) );
}
}
coop_damage_and_accuracy_scaling( difficulty_func, current_frac )
{
while (!isdefined (level.flag))
{
wait 0.05;
}
while (!isdefined (level.flag["all_players_spawned"]))
{
wait 0.05;
}
flag_wait( "all_players_spawned" );
players = get_players();
coop_healthscalar = getCoopValue( "coopPlayerDifficultyHealth", players.size );
if( GetDvar( #"g_gametype" ) != "vs" )
{
setsaveddvar( "player_damageMultiplier", 100 / ([[ difficulty_func ]]( "playerDifficultyHealth", current_frac ) * coop_healthscalar) );
coop_invuln_remover = getCoopValue( "coopPlayer_deathInvulnerableTime", players.size );
setsaveddvar( "player_deathInvulnerableTime", int( [[ difficulty_func ]]( "player_deathInvulnerableTime", current_frac ) * coop_invuln_remover) );
}
}
apply_difficulty_step_with_func( difficulty_func, current_frac )
{
anim.missTimeConstant = [[ difficulty_func ]]( "missTimeConstant", current_frac );
anim.missTimeDistanceFactor = [[ difficulty_func ]]( "missTimeDistanceFactor", current_frac );
anim.dog_hits_before_kill = [[ difficulty_func ]]( "dog_hits_before_kill", current_frac );
anim.double_grenades_allowed = [[ difficulty_func ]]( "double_grenades_allowed", current_frac );
}
set_difficulty_from_locked_settings()
{
apply_difficulty_frac_with_func( ::get_locked_difficulty_val, 1 );
apply_difficulty_step_with_func( ::get_locked_difficulty_step_val, 1 );
}
set_difficulty_from_current_aa_frac()
{
level.auto_adjust_difficulty_frac = GetDvarInt( #"autodifficulty_frac" );
current_frac = level.auto_adjust_difficulty_frac * 0.01;
assert( level.auto_adjust_difficulty_frac >= 0 );
assert( level.auto_adjust_difficulty_frac <= 100 );
apply_difficulty_frac_with_func( ::get_blended_difficulty, current_frac );
apply_difficulty_step_with_func( ::get_stepped_difficulty, current_frac );
}
get_stepped_difficulty( system, current_frac )
{
if ( current_frac >= level.difficultySettings_stepFunc_percent[ system ] )
{
return level.difficultySettings[ system ][ "normal" ];
}
return level.difficultySettings[ system ][ "easy" ];
}
get_locked_difficulty_step_val( system, ignored )
{
return level.difficultySettings[ system ][ get_skill_from_index( level.gameskill ) ];
}
get_blended_difficulty( system, current_frac )
{
difficulty_array = level.difficultySettings_frac_data_points[ system ];
for ( i = 1; i < difficulty_array.size; i++ )
{
high_frac = difficulty_array[ i ][ "frac" ];
high_val = difficulty_array[ i ][ "val" ];
if ( current_frac <= high_frac )
{
low_frac = difficulty_array[ i - 1 ][ "frac" ];
low_val = difficulty_array[ i - 1 ][ "val" ];
frac_range = high_frac - low_frac;
val_range = high_val - low_val;
base_frac = current_frac - low_frac;
result_frac = base_frac / frac_range;
return low_val + result_frac * val_range;
}
}
assertex( difficulty_array.size == 1, "Shouldnt be multiple data points if we're here." );
return difficulty_array[ 0 ][ "val" ];
}
getCurrentDifficultySetting( msg )
{
return level.difficultySettings[ msg ][ get_skill_from_index( level.gameskill ) ];
}
getRatio( msg, min, max )
{
return( level.difficultySettings[ msg ][ level.difficultyType[ min ] ] * ( 100 - GetDvarInt( #"autodifficulty_frac" ) ) + level.difficultySettings[ msg ][ level.difficultyType[ max ] ] * GetDvarInt( #"autodifficulty_frac" ) ) * 0.01;
}
getCoopValue( msg, numplayers )
{
if (numplayers <= 0)
{
numplayers = 1;
}
return( level.difficultySettings[ msg ][ GetDvar( #"currentDifficulty" ) ][numplayers - 1]);
}
get_locked_difficulty_val( msg, ignored )
{
return level.difficultySettings[ msg ][ level.difficultyType[ level.gameskill ] ];
}
always_pain()
{
return false;
}
pain_protection()
{
if ( !pain_protection_check() )
{
return false;
}
return( randomint( 100 ) > 25 );
}
pain_protection_check()
{
if ( !isalive( self.enemy ) )
{
return false;
}
if ( !IsPlayer(self.enemy) )
{
return false;
}
if ( !isalive( level.painAI ) || level.painAI.a.script != "pain" )
{
level.painAI = self;
}
if ( self == level.painAI )
{
return false;
}
if ( self.damageWeapon != "none" && weaponIsBoltAction( self.damageWeapon ) )
{
return false;
}
return true;
}
axisAccuracyControl()
{
self endon( "long_death" );
self endon( "death" );
self coop_axis_accuracy_scaler();
}
alliesAccuracyControl()
{
self endon( "long_death" );
self endon( "death" );
self coop_allies_accuracy_scaler();
}
set_accuracy_based_on_situation()
{
if ( self animscripts\combat_utility::isSniper() && isAlive( self.enemy ) )
{
self setSniperAccuracy();
return;
}
if ( isPlayer( self.enemy ) )
{
resetMissDebounceTime();
if ( self.a.missTime > gettime() )
{
self.accuracy = 0;
return;
}
if ( self.a.script == "move" )
{
self.accuracy = anim.run_accuracy * self.baseAccuracy;
return;
}
}
else
{
if ( self.a.script == "move" )
{
self.accuracy = anim.run_accuracy * self.baseAccuracy;
return;
}
}
self.accuracy = self.baseAccuracy;
}
setSniperAccuracy()
{
if ( !isdefined( self.sniperShotCount ) )
{
self.sniperShotCount = 0;
self.sniperHitCount = 0;
}
self.sniperShotCount++ ;
if ( ( !isDefined( self.lastMissedEnemy ) || self.enemy != self.lastMissedEnemy ) && distanceSquared( self.origin, self.enemy.origin ) > 500 * 500 )
{
self.accuracy = 0;
if ( level.gameSkill > 0 || self.sniperShotCount > 1 )
{
self.lastMissedEnemy = self.enemy;
}
return;
}
self.accuracy = ( 1 + 1 * self.sniperHitCount ) * self.baseAccuracy;
self.sniperHitCount++ ;
if ( level.gameSkill < 1 && self.sniperHitCount == 1 )
{
self.lastMissedEnemy = undefined;
}
}
didSomethingOtherThanShooting()
{
self.a.missTimeDebounce = 0;
}
resetMissTime()
{
if ( self.team != "axis" )
{
return;
}
if ( self.weapon == "none" )
{
return;
}
if ( self usingBoltActionWeapon() )
{
self.missTime = 0;
return;
}
if ( !self animscripts\weaponList::usingAutomaticWeapon() && !self animscripts\weaponList::usingSemiAutoWeapon() )
{
self.missTime = 0;
return;
}
self.a.nonstopFire = false;
if ( !isalive( self.enemy ) )
{
return;
}
if ( !IsPlayer(self.enemy) )
{
self.accuracy = self.baseAccuracy;
return;
}
dist = distance( self.enemy.origin, self.origin );
self setMissTime( anim.missTimeConstant + dist * anim.missTimeDistanceFactor );
}
resetMissDebounceTime()
{
self.a.missTimeDebounce = gettime() + 3000;
}
setMissTime( howLong )
{
assertex( self.team == "axis", "Non axis tried to set misstime" );
if ( self.a.missTimeDebounce > gettime() )
{
return;
}
if ( howLong > 0 )
{
self.accuracy = 0;
}
howLong *= 1000;
self.a.missTime = gettime() + howLong;
self.a.accuracyGrowthMultiplier = 1;
}
playerHurtcheck()
{
self.hurtAgain = false;
for ( ;; )
{
self waittill( "damage", amount, attacker, dir, point, mod );
if(isdefined(attacker) && isplayer(attacker) && attacker.team == self.team)
{
continue;
}
self.hurtAgain = true;
self.damagePoint = point;
self.damageAttacker = attacker;
if( IsDefined (mod) && mod == "MOD_BURNED" )
{
self setburn( 0.5 );
self PlaySound( "chr_burn" );
}
}
}
playerHealthRegen()
{
self endon ("death");
self endon ("disconnect");
if( !IsDefined( self.flag ) )
{
self.flag = [];
self.flags_lock = [];
}
if( !IsDefined(self.flag["player_has_red_flashing_overlay"]) )
{
self player_flag_init("player_has_red_flashing_overlay");
self player_flag_init("player_is_invulnerable");
}
self player_flag_clear("player_has_red_flashing_overlay");
self player_flag_clear("player_is_invulnerable");
self thread increment_take_cover_warnings_on_death();
self setTakeCoverWarnings();
self thread healthOverlay();
oldratio = 1;
health_add = 0;
regenRate = 0.1;
veryHurt = false;
playerJustGotRedFlashing = false;
if( !IsDefined( level.zombiemode ) || !level.zombiemode )
{
self thread playerBreathingSound(self.maxhealth * 0.35);
self thread playerHeartbeatSound(self.maxhealth * 0.75);
self thread endPlayerBreathingSoundOnDeath();
}
invulTime = 0;
hurtTime = 0;
newHealth = 0;
lastinvulratio = 1;
self thread playerHurtcheck();
if(!IsDefined (self.veryhurt))
{
self.veryhurt = 0;
}
self.boltHit = false;
if( GetDvar( #"scr_playerInvulTimeScale" ) == "" )
{
setdvar( "scr_playerInvulTimeScale", 1.0 );
}
playerInvulTimeScale = GetDvarFloat( #"scr_playerInvulTimeScale" );
for( ;; )
{
wait( 0.05 );
waittillframeend;
if( self.health == self.maxHealth )
{
if( self player_flag( "player_has_red_flashing_overlay" ) )
{
player_flag_clear( "player_has_red_flashing_overlay" );
level notify( "take_cover_done" );
}
lastinvulratio = 1;
playerJustGotRedFlashing = false;
veryHurt = false;
continue;
}
if( self.health <= 0 )
{
return;
}
wasVeryHurt = veryHurt;
health_ratio = self.health / self.maxHealth;
if( health_ratio <= level.healthOverlayCutoff )
{
veryHurt = true;
if( !wasVeryHurt )
{
hurtTime = gettime();
self startfadingblur( 3.6, 2 );
self player_flag_set( "player_has_red_flashing_overlay" );
playerJustGotRedFlashing = true;
}
}
if( self.hurtAgain )
{
hurtTime = gettime();
self.hurtAgain = false;
}
if( health_ratio >= oldratio )
{
if( gettime() - hurttime < level.playerHealth_RegularRegenDelay )
{
continue;
}
if( veryHurt )
{
self.veryhurt = 1;
newHealth = health_ratio;
if( gettime() > hurtTime + level.longRegenTime )
{
newHealth += regenRate;
}
if ( newHealth >= 1 )
{
reduceTakeCoverWarnings();
}
}
else
{
newHealth = 1;
self.veryhurt = 0;
}
if( newHealth > 1.0 )
{
newHealth = 1.0;
}
if( newHealth <= 0 )
{
return;
}
self setnormalhealth( newHealth );
oldratio = self.health / self.maxHealth;
continue;
}
invulWorthyHealthDrop = lastinvulRatio - health_ratio > level.worthyDamageRatio;
if( self.health <= 1 )
{
self setnormalhealth( 2 / self.maxHealth );
invulWorthyHealthDrop = true;
}
oldratio = self.health / self.maxHealth;
level notify( "hit_again" );
health_add = 0;
hurtTime = gettime();
self startfadingblur( 3, 0.8 );
if( !invulWorthyHealthDrop || playerInvulTimeScale <= 0.0 )
{
continue;
}
if( self player_flag( "player_is_invulnerable" ) )
continue;
self player_flag_set( "player_is_invulnerable" );
level notify( "player_becoming_invulnerable" );
if( playerJustGotRedFlashing )
{
invulTime = level.invulTime_onShield;
playerJustGotRedFlashing = false;
}
else if( veryHurt )
{
invulTime = level.invulTime_postShield;
}
else
{
invulTime = level.invulTime_preShield;
}
invulTime *= playerInvulTimeScale;
lastinvulratio = self.health / self.maxHealth;
self thread playerInvul( invulTime );
}
}
reduceTakeCoverWarnings()
{
players = get_players();
if ( isdefined( players[0] ) && isAlive( players[0] ) )
{
takeCoverWarnings = GetDvarInt( #"takeCoverWarnings" );
if ( takeCoverWarnings > 0 )
{
takeCoverWarnings -- ;
setdvar( "takeCoverWarnings", takeCoverWarnings );
}
}
}
playerInvul( timer )
{
if ( isdefined( self.flashendtime ) && self.flashendtime > gettime() )
{
timer = timer * getCurrentDifficultySetting( "flashbangedInvulFactor" );
}
if ( timer > 0 )
{
self.attackerAccuracy = 0;
self.ignoreRandomBulletDamage = true;
wait( timer );
}
self.attackerAccuracy = anim.player_attacker_accuracy;
self.ignoreRandomBulletDamage = false;
self player_flag_clear( "player_is_invulnerable" );
}
grenadeAwareness()
{
if ( self.team == "allies" )
{
self.grenadeawareness = 0.9;
return;
}
if ( self.team == "axis" )
{
if ( level.gameSkill >= 2 )
{
if ( randomint( 100 ) < 33 )
{
self.grenadeawareness = 0.2;
}
else
{
self.grenadeawareness = 0.5;
}
}
else
{
if ( randomint( 100 ) < 33 )
{
self.grenadeawareness = 0;
}
else
{
self.grenadeawareness = 0.2;
}
}
}
}
playerBreathingSound(healthcap)
{
self endon("end_healthregen");
self endon( "disconnect" );
self endon( "killed_player" );
if(!IsDefined (level.player_pain_vox))
{
level.player_pain_vox = 0;
}
wait (2);
player = self;
for (;;)
{
wait (0.2);
if (player.health <= 0)
{
level.player_pain_vox = 0;
return;
}
if (player.health >= healthcap)
{
player notify ("end_heartbeat_loop");
continue;
}
if (level.player_pain_vox == 0)
{
playsoundatposition ("chr_breathing_hurt_start", (0,0,0));
level.player_pain_vox = 1;
}
else
{
player playLocalSound("chr_breathing_hurt");
}
wait .545;
wait (0.1 + randomfloat (0.8));
}
}
playerHeartbeatSound(healthcap)
{
self endon( "disconnect" );
self endon( "killed_player" );
level thread heartbeat_init();
self.breathingStopTime = -10000;
self.hearbeatwait = .46;
wait (2);
player = self;
for (;;)
{
wait .2;
if (player.health >= healthcap)
{
continue;
}
level thread event_heart_beat( "stressed" , 1 );
level notify ("player_pain");
player waittill( "end_heartbeat_loop" );
wait (1.5);
level thread event_heart_beat( "none" , 0 );
level.player_pain_vox = 0;
}
}
heartbeat_init()
{
level.current_heart_waittime = 2;
level.heart_waittime = 2;
level.current_breathing_waittime = 4;
level.breathing_waittime = 4;
level.emotional_state_system = 0;
}
event_heart_beat( emotion, loudness )
{
level.current_emotion = emotion;
if(!IsDefined (level.last_emotion))
{
level.last_emotion = "undefined";
}
if( level.current_emotion != level.last_emotion)
{
if(level.emotional_state_system == 0)
{
level.emotional_state_system = 1;
level thread play_heart_beat();
level thread play_breathing();
}
if(!IsDefined (loudness) || (loudness == 0))
{
level.loudness = 0;
}
else
{
level.loudness = loudness;
}
switch (emotion)
{
case "sedated":
level.heart_waittime = 3;
level.breathing_waittime = 4;
level.last_emotion = "sedated";
break;
case "relaxed":
level.heart_waittime = 2;
level.breathing_waittime = 4;
level.last_emotion = "relaxed";
break;
case "stressed":
level.heart_waittime = 0.5;
level.breathing_waittime = 2;
level.last_emotion = "stressed";
break;
case "panicked":
level.heart_waittime = 0.3;
level.breathing_waittime = 1.5;
level.last_emotion = "panicked";
break;
case "none":
level.last_emotion = "none";
level notify ("no_more_heartbeat");
playsoundatposition ("vox_breath_scared_stop", (0,0,0));
level.emotional_state_system = 0;
break;
default: AssertMsg("Not a Valid Emotional State. Please switch with sedated, relaxed, happy, stressed, or none");
}
thread heartbeat_state_transitions();
}
}
heartbeat_state_transitions()
{
while (level.current_heart_waittime > level.heart_waittime)
{
level.current_heart_waittime = level.current_heart_waittime - .10;
wait(.30);
}
while (level.current_heart_waittime < level.heart_waittime)
{
level.current_heart_waittime = level.current_heart_waittime + .05;
wait(.40);
}
level.current_heart_waittime = level.heart_waittime;
}
play_heart_beat ()
{
player = getplayers()[0];
level endon ("no_more_heartbeat");
if(!IsDefined ( level.heart_wait_counter) )
{
level.heart_wait_counter = 0;
}
while( 1 )
{
while( level.heart_wait_counter < level.current_heart_waittime)
{
wait(0.1);
level.heart_wait_counter = level.heart_wait_counter +0.1;
}
if (level.loudness == 0)
{
playsoundatposition ("chr_heart_beat_ingame", (0,0,0));
}
else
{
playsoundatposition ("chr_heart_beat_ingame", (0,0,0));
}
level.heart_wait_counter = 0;
}
}
play_breathing()
{
level endon ("no_more_heartbeat");
if(!IsDefined ( level.breathing_wait_counter) )
{
level.breathing_wait_counter = 0;
}
for(;;)
{
while( level.breathing_wait_counter < level.current_breathing_waittime )
{
wait(0.1);
level.breathing_wait_counter = level.breathing_wait_counter +0.1;
}
playsoundatposition ("amb_player_breath_cold", (0,0,0));
level.breathing_wait_counter = 0;
}
}
base_jump_heartbeat_stop()
{
flag_wait( "players_jumped" );
level thread event_heart_beat( "none" , 0 );
}
endPlayerBreathingSoundOnDeath()
{
self endon( "disconnect" );
self waittill_either( "killed_player", "death" );
setclientsysstate( "levelNotify", "rfo2", self );
}
old_style_health_overlay()
{
overlay = newClientHudElem( self );
overlay.x = 0;
overlay.y = 0;
overlay setshader( "overlay_low_health", 640, 480 );
overlay.alignX = "left";
overlay.alignY = "top";
overlay.horzAlign = "fullscreen";
overlay.vertAlign = "fullscreen";
overlay.alpha = 0;
wait( 0.05 );
level.strings[ "take_cover" ] = spawnstruct();
level.strings[ "take_cover" ].text = &"GAME_GET_TO_COVER";
self thread healthOverlay_remove( overlay );
pulseTime = 0.8;
for( ;; )
{
overlay fadeOverTime( 0.5 );
overlay.alpha = 0;
self player_flag_wait( "player_has_red_flashing_overlay" );
self redFlashingOverlay( overlay );
}
}
new_style_health_overlay()
{
overlay = NewClientHudElem( self );
overlay.x = 0;
overlay.y = 0;
if ( issplitscreen() )
{
overlay SetShader( "overlay_low_health_splat", 640, 480 * 2 );
if ( self == level.players[ 0 ] )
{
overlay.y -= 120;
}
}
else
{
overlay SetShader( "overlay_low_health_splat", 640, 480 );
}
overlay.splatter = true;
overlay.alignX = "left";
overlay.alignY = "top";
overlay.sort = 1;
overlay.foreground = 0;
overlay.horzAlign = "fullscreen";
overlay.vertAlign = "fullscreen";
overlay.alpha = 0;
thread healthOverlay_remove( overlay );
updateTime = 0.05;
timeToFadeOut = 0.75;
while (1)
{
wait updateTime;
if(IsDefined(level.disable_damage_overlay_in_vehicle) && level.disable_damage_overlay_in_vehicle)
{
targetDamageAlpha = 0;
}
else
{
targetDamageAlpha = 1.0 - self.health / self.maxHealth;
}
if ( overlay.alpha < targetDamageAlpha )
{
overlay.alpha = targetDamageAlpha;
}
else if ( ( targetDamageAlpha == 0 ) && ( overlay.alpha != 0 ) )
{
overlay FadeOverTime( timeToFadeOut );
overlay.alpha = 0;
self playsound ("chr_breathing_better");
}
}
}
healthOverlay()
{
self endon( "disconnect" );
self endon( "noHealthOverlay" );
if ( GetDvar( #"zombiemode" ) == "1" )
{
old_style_health_overlay();
}
else
{
new_style_health_overlay();
}
}
add_hudelm_position_internal( alignY )
{
if ( level.console )
{
self.fontScale = 2;
}
else
{
self.fontScale = 1.6;
}
self.x = 0;
self.y = -36;
self.alignX = "center";
self.alignY = "bottom";
self.horzAlign = "center";
self.vertAlign = "middle";
if ( !isdefined( self.background ) )
{
return;
}
self.background.x = 0;
self.background.y = -40;
self.background.alignX = "center";
self.background.alignY = "middle";
self.background.horzAlign = "center";
self.background.vertAlign = "middle";
if ( level.console )
{
self.background setshader( "popmenu_bg", 650, 52 );
}
else
{
self.background setshader( "popmenu_bg", 650, 42 );
}
self.background.alpha = .5;
}
create_warning_elem( ender, player )
{
level.hudelm_unpause_ender = ender;
level notify( "hud_elem_interupt" );
hudelem = newHudElem();
hudelem add_hudelm_position_internal();
hudelem thread destroy_warning_elem_when_hit_again( player );
hudelem thread destroy_warning_elem_when_mission_failed( player );
hudelem setText( &"GAME_GET_TO_COVER" );
hudelem.fontscale = 2;
hudelem.alpha = 1;
hudelem.color = ( 1, 0.9, 0.9 );
player thread play_hurt_vox();
return hudelem;
}
play_hurt_vox()
{
if(IsDefined (self.veryhurt))
{
if(self.veryhurt == 0)
{
if(randomintrange(0,1) == 1)
{
playsoundatposition ("chr_breathing_hurt_start", self.origin);
}
}
}
}
waitTillPlayerIsHitAgain()
{
level endon( "hit_again" );
self waittill( "damage" );
}
destroy_warning_elem_when_hit_again( player )
{
self endon( "being_destroyed" );
player waitTillPlayerIsHitAgain();
fadeout = ( !isalive( player ) );
self thread destroy_warning_elem( fadeout );
}
destroy_warning_elem_when_mission_failed( player )
{
self endon( "being_destroyed" );
flag_wait( "missionfailed" );
player thread destroy_warning_elem( true );
}
destroy_warning_elem( fadeout )
{
self notify( "being_destroyed" );
self.beingDestroyed = true;
if ( fadeout )
{
self fadeOverTime( 0.5 );
self.alpha = 0;
wait 0.5;
}
self death_notify_wrapper();
self destroy();
}
mayChangeCoverWarningAlpha( coverWarning )
{
if ( !isdefined( coverWarning ) )
{
return false;
}
if ( isdefined( coverWarning.beingDestroyed ) )
{
return false;
}
return true;
}
fontScaler( scale, timer )
{
self endon( "death" );
scale *= 2;
dif = scale - self.fontscale;
self changeFontScaleOverTime( timer );
self.fontscale += dif;
}
fadeFunc( overlay, coverWarning, severity, mult, hud_scaleOnly )
{
pulseTime = 0.8;
scaleMin = 0.5;
fadeInTime = pulseTime * 0.1;
stayFullTime = pulseTime * ( .1 + severity * .2 );
fadeOutHalfTime = pulseTime * ( 0.1 + severity * .1 );
fadeOutFullTime = pulseTime * 0.3;
remainingTime = pulseTime - fadeInTime - stayFullTime - fadeOutHalfTime - fadeOutFullTime;
assert( remainingTime >= -.001 );
if ( remainingTime < 0 )
{
remainingTime = 0;
}
halfAlpha = 0.8 + severity * 0.1;
leastAlpha = 0.5 + severity * 0.3;
overlay fadeOverTime( fadeInTime );
overlay.alpha = mult * 1.0;
if ( mayChangeCoverWarningAlpha( coverWarning ) )
{
if ( !hud_scaleOnly )
{
coverWarning fadeOverTime( fadeInTime );
coverWarning.alpha = mult * 1.0;
}
}
if ( isDefined( coverWarning ) )
{
coverWarning thread fontScaler( 1.0, fadeInTime );
}
wait fadeInTime + stayFullTime;
overlay fadeOverTime( fadeOutHalfTime );
overlay.alpha = mult * halfAlpha;
if ( mayChangeCoverWarningAlpha( coverWarning ) )
{
if ( !hud_scaleOnly )
{
coverWarning fadeOverTime( fadeOutHalfTime );
coverWarning.alpha = mult * halfAlpha;
}
}
wait fadeOutHalfTime;
overlay fadeOverTime( fadeOutFullTime );
overlay.alpha = mult * leastAlpha;
if ( mayChangeCoverWarningAlpha( coverWarning ) )
{
if ( !hud_scaleOnly )
{
coverWarning fadeOverTime( fadeOutFullTime );
coverWarning.alpha = mult * leastAlpha;
}
}
if ( isDefined( coverWarning ) )
{
coverWarning thread fontScaler( 0.9, fadeOutFullTime );
}
wait fadeOutFullTime;
wait remainingTime;
}
shouldShowCoverWarning()
{
if( IsDefined(level.enable_cover_warning) )
{
return level.enable_cover_warning;
}
if ( !isAlive( self ) )
{
return false;
}
if ( level.gameskill > 1 )
{
return false;
}
if ( level.missionfailed )
{
return false;
}
if ( !maps\_load_common::map_is_early_in_the_game() )
{
return false;
}
if ( isSplitScreen() || coopGame() )
{
return false;
}
takeCoverWarnings = GetDvarInt( #"takeCoverWarnings" );
if ( takeCoverWarnings <= 3 )
{
return false;
}
return true;
}
redFlashingOverlay( overlay )
{
self endon( "hit_again" );
self endon( "damage" );
self endon ("death");
self endon ("disconnect");
coverWarning = undefined;
if ( self shouldShowCoverWarning() )
{
coverWarning = create_warning_elem( "take_cover_done", self );
}
stopFlashingBadlyTime = gettime() + level.longRegenTime;
fadeFunc( overlay, coverWarning, 1, 1, false );
while ( gettime() < stopFlashingBadlyTime && isalive( self ) )
{
fadeFunc( overlay, coverWarning, .9, 1, false );
}
if ( isalive( self ) )
{
fadeFunc( overlay, coverWarning, .65, 0.8, false );
}
if ( mayChangeCoverWarningAlpha( coverWarning ) )
{
coverWarning fadeOverTime( 1.0 );
coverWarning.alpha = 0;
}
fadeFunc( overlay, coverWarning, 0, 0.6, true );
overlay fadeOverTime( 0.5 );
overlay.alpha = 0;
self player_flag_clear( "player_has_red_flashing_overlay" );
setclientsysstate( "levelNotify", "rfo3", self );
wait( 0.5 );
self notify( "take_cover_done" );
self notify( "hit_again" );
}
healthOverlay_remove( overlay )
{
self endon ("disconnect");
self waittill_any ("noHealthOverlay", "death");
if ( GetDvar( #"zombiemode" ) == "1" )
{
overlay fadeOverTime( 3.5 );
overlay.alpha = 0;
}
else
{
overlay fadeOverTime( 3.5 );
overlay.alpha = 0;
}
}
setTakeCoverWarnings()
{
isPreGameplayLevel = ( level.script == "training" || level.script == "cargoship" || level.script == "coup" );
if ( GetDvarInt( #"takeCoverWarnings" ) == -1 || isPreGameplayLevel )
{
setdvar( "takeCoverWarnings", 3 + 6 );
}
}
increment_take_cover_warnings_on_death()
{
if( !IsPlayer( self ) )
{
return;
}
level notify( "new_cover_on_death_thread" );
level endon( "new_cover_on_death_thread" );
self waittill( "death" );
if( !(self player_flag( "player_has_red_flashing_overlay" ) ) )
{
return;
}
if ( level.gameSkill > 1 )
{
return;
}
warnings = GetDvarInt( #"takeCoverWarnings" );
if ( warnings < 10 )
{
setdvar( "takeCoverWarnings", warnings + 1 );
}
}
hud_debug_add_message( msg )
{
if ( !isdefined( level.hudMsgShare ) )
{
level.hudMsgShare = [];
}
if ( !isdefined( level.hudMsgShare[ msg ] ) )
{
hud = newHudElem();
hud.x = level.debugLeft;
hud.y = level.debugHeight + level.hudNum * 15;
hud.foreground = 1;
hud.sort = 100;
hud.alpha = 1.0;
hud.alignX = "left";
hud.horzAlign = "left";
hud.fontScale = 1.0;
hud setText( msg );
level.hudMsgShare[ msg ] = true;
}
}
hud_debug_add_display( msg, num, isfloat )
{
hud_debug_add_message( msg );
num = int( num );
negative = false;
if ( num < 0 )
{
negative = true;
num *= -1;
}
thousands = 0;
hundreds = 0;
tens = 0;
ones = 0;
while ( num >= 10000 )
{
num -= 10000;
}
while ( num >= 1000 )
{
num -= 1000;
thousands++ ;
}
while ( num >= 100 )
{
num -= 100;
hundreds++ ;
}
while ( num >= 10 )
{
num -= 10;
tens++ ;
}
while ( num >= 1 )
{
num -= 1;
ones++ ;
}
offset = 0;
offsetSize = 10;
if ( thousands > 0 )
{
hud_debug_add_num( thousands, offset );
offset += offsetSize;
hud_debug_add_num( hundreds, offset );
offset += offsetSize;
hud_debug_add_num( tens, offset );
offset += offsetSize;
hud_debug_add_num( ones, offset );
offset += offsetSize;
}
else if ( hundreds > 0 || isFloat )
{
hud_debug_add_num( hundreds, offset );
offset += offsetSize;
hud_debug_add_num( tens, offset );
offset += offsetSize;
hud_debug_add_num( ones, offset );
offset += offsetSize;
}
else if ( tens > 0 )
{
hud_debug_add_num( tens, offset );
offset += offsetSize;
hud_debug_add_num( ones, offset );
offset += offsetSize;
}
else
{
hud_debug_add_num( ones, offset );
offset += offsetSize;
}
if ( isFloat )
{
decimalHud = newHudElem();
decimalHud.x = 204.5;
decimalHud.y = level.debugHeight + level.hudNum * 15;
decimalHud.foreground = 1;
decimalHud.sort = 100;
decimalHud.alpha = 1.0;
decimalHud.alignX = "left";
decimalHud.horzAlign = "left";
decimalHud.fontScale = 1.0;
decimalHud setText( "." );
level.hudDebugNum[ level.hudDebugNum.size ] = decimalHud;
}
if ( negative )
{
negativeHud = newHudElem();
negativeHud.x = 195.5;
negativeHud.y = level.debugHeight + level.hudNum * 15;
negativeHud.foreground = 1;
negativeHud.sort = 100;
negativeHud.alpha = 1.0;
negativeHud.alignX = "left";
negativeHud.horzAlign = "left";
negativeHud.fontScale = 1.0;
negativeHud setText( " - " );
level.hudDebugNum[ level.hudNum ] = negativeHud;
}
level.hudNum++ ;
}
hud_debug_add_num( num, offset )
{
hud = newHudElem();
hud.x = 200 + offset * 0.65;
hud.y = level.debugHeight + level.hudNum * 15;
hud.foreground = 1;
hud.sort = 100;
hud.alpha = 1.0;
hud.alignX = "left";
hud.horzAlign = "left";
hud.fontScale = 1.0;
hud setText( num + "" );
level.hudDebugNum[ level.hudDebugNum.size ] = hud;
}
hud_debug_add_second_string( num, offset )
{
hud = newHudElem();
hud.x = 200 + offset * 0.65;
hud.y = level.debugHeight + level.hudNum * 15;
hud.foreground = 1;
hud.sort = 100;
hud.alpha = 1.0;
hud.alignX = "left";
hud.horzAlign = "left";
hud.fontScale = 1.0;
hud setText( num );
level.hudDebugNum[ level.hudDebugNum.size ] = hud;
}
aa_init_stats()
{
}
aa_add_event( event, amount )
{
old_amount = getdvarint( event );
setdvar( event, old_amount + amount );
}
return_false( attacker )
{
return false;
}
player_attacker( attacker )
{
if ( [[ level.custom_player_attacker ]]( attacker ) )
{
return true;
}
if ( IsPlayer(attacker) )
{
return true;
}
if ( !isdefined( attacker.car_damage_owner_recorder ) )
{
return false;
}
return attacker player_did_most_damage();
}
player_did_most_damage()
{
return self.player_damage * 1.75 > self.non_player_damage;
}
empty_kill_func( type, loc, point, attacker, amount )
{
}
auto_adjust_enemy_died( ai, amount, attacker, type, point )
{
aa_add_event( "aa_enemy_deaths", 1 );
if ( !isdefined( attacker ) )
{
return;
}
if ( isDefined( ai ) && isDefined( ai.attackers ) )
{
for ( j = 0; j < ai.attackers.size; j++ )
{
player = ai.attackers[j];
if ( !isDefined( player ) )
{
continue;
}
if ( player == attacker )
{
continue;
}
if( "0" == GetDvar( #"zombiemode" ) )
{
player.assists++;
}
arcademode_assignpoints( "arcademode_score_assist", player );
}
ai.attackers = [];
ai.attackerData = [];
}
if ( !player_attacker( attacker ) )
{
return;
}
if( arcadeMode() )
{
if( IsDefined( ai ) )
{
ai.anglesOnDeath = ai.angles;
if ( isdefined( attacker ) )
{
attacker.anglesOnKill = attacker getPlayerAngles();
}
}
if ( attacker.arcademode_bonus["lastKillTime"] == gettime() )
{
attacker.arcademode_bonus["uberKillingMachineStreak"]++;
}
else
{
attacker.arcademode_bonus["uberKillingMachineStreak"] = 1;
}
attacker.arcademode_bonus["lastKillTime"] = gettime();
}
attacker.kills++;
damage_location = undefined;
if( IsDefined( ai ) )
{
damage_location = ai.damagelocation;
if( damage_location == "head" || damage_location == "helmet" )
{
if( !IsDefined( level.zombietron_mode ) )
{
attacker.headshots++;
}
}
}
if( arcadeMode() )
{
[[ level.global_kill_func ]]( type, damage_location, point, attacker, ai, attacker.arcademode_bonus["uberKillingMachineStreak"] );
}
else
{
[[ level.global_kill_func ]]( type, damage_location, point, attacker );
}
aa_add_event( "aa_player_kills", 1 );
}
auto_adjust_enemy_death_detection()
{
for ( ;; )
{
self waittill( "damage", amount, attacker, direction_vec, point, type );
if ( !isDefined(amount) )
{
continue;
}
aa_add_event( "aa_enemy_damage_taken", amount );
if ( !isalive( self ) || self.delayeddeath )
{
level auto_adjust_enemy_died( self, amount, attacker, type, point );
return;
}
if ( !player_attacker( attacker ) )
{
continue;
}
self aa_player_attacks_enemy_with_ads( attacker, amount, type, point );
if( !isDefined( self ) || !isalive( self ) )
{
attacker.kills++;
return;
}
}
}
aa_player_attacks_enemy_with_ads( player, amount, type, point )
{
aa_add_event( "aa_player_damage_dealt", amount );
assertex( GetDvarInt( #"aa_player_damage_dealt" ) > 0 );
if ( self.health == self.maxhealth || !isDefined( self.attackers ) )
{
self.attackers = [];
self.attackerData = [];
}
if ( !isdefined( self.attackerData[player getEntityNumber()] ) )
{
self.attackers[ self.attackers.size ] = player;
self.attackerData[player getEntityNumber()] = false;
}
if ( !isADS(player) )
{
[[ level.global_damage_func ]]( type, self.damagelocation, point, player, amount );
return false;
}
if ( !bullet_attack( type ) )
{
[[ level.global_damage_func ]]( type, self.damagelocation, point, player, amount );
return false;
}
[[ level.global_damage_func_ads ]]( type, self.damagelocation, point, player, amount );
aa_add_event( "aa_ads_damage_dealt", amount );
return true;
}
bullet_attack( type )
{
if ( type == "MOD_PISTOL_BULLET" )
{
return true;
}
return type == "MOD_RIFLE_BULLET";
}
add_fractional_data_point( name, frac, val )
{
if ( !isdefined( level.difficultySettings_frac_data_points[ name ] ) )
{
level.difficultySettings_frac_data_points[ name ] = [];
}
array = [];
array[ "frac" ] = frac;
array[ "val" ] = val;
assertex( frac >= 0, "Tried to set a difficulty data point less than 0." );
assertex( frac <= 1, "Tried to set a difficulty data point greater than 1." );
level.difficultySettings_frac_data_points[ name ][ level.difficultySettings_frac_data_points[ name ].size ] = array;
}
update_skill_on_change()
{
waittillframeend;
for(;;)
{
lowest_current_skill = GetDvarInt( #"saved_gameskill" );
gameskill = GetDvarInt( #"g_gameskill" );
if ( gameskill < lowest_current_skill )
lowest_current_skill = gameskill;
if( lowest_current_skill < level.gameskill )
{
setSkill( true, lowest_current_skill );
}
wait( 0.1 );
}
}
coop_enemy_accuracy_scalar_watcher()
{
level waittill ("load main complete");
if( GetDvarInt( #"coop_difficulty_scaling" ) == 0 )
{
return;
}
while (1)
{
players = get_players("allies");
level.coop_enemy_accuracy_scalar = getCoopValue( "coopEnemyAccuracyScalar", players.size );
wait (0.5);
}
}
coop_friendly_accuracy_scalar_watcher()
{
level waittill ("load main complete");
if( GetDvarInt( #"coop_difficulty_scaling" ) == 0 )
{
return;
}
while (1)
{
players = get_players("allies");
level.coop_friendly_accuracy_scalar = getCoopValue( "coopFriendlyAccuracyScalar", players.size );
wait (0.5);
}
}
coop_axis_accuracy_scaler()
{
self endon ("death");
if( GetDvarInt( #"coop_difficulty_scaling" ) == 0 )
{
return;
}
initialValue = self.baseAccuracy;
while (1)
{
if( !IsDefined( level.coop_enemy_accuracy_scalar ) )
{
wait 0.5;
continue;
}
self.baseAccuracy = initialValue * level.coop_enemy_accuracy_scalar;
wait randomfloatrange(3,5);
}
}
coop_allies_accuracy_scaler()
{
self endon ("death");
if( GetDvarInt( #"coop_difficulty_scaling" ) == 0 )
{
return;
}
initialValue = self.baseAccuracy;
while (1)
{
if( !IsDefined( level.coop_friendly_accuracy_scalar ) )
{
wait 0.5;
continue;
}
self.baseAccuracy = initialValue * level.coop_friendly_accuracy_scalar;
wait randomfloatrange(3,5);
}
}
coop_player_threat_bias_adjuster()
{
while (1)
{
wait 5;
if ( level.auto_adjust_threatbias )
{
players = get_players("allies");
for( i = 0; i < players.size; i++ )
{
enable_auto_adjust_threatbias(players[i]);
}
}
}
}
coop_spawner_count_adjuster()
{
while (!isdefined (level.flag) || !isdefined(level.flag[ "all_players_connected" ]))
{
wait 0.05;
continue;
}
flag_wait( "all_players_connected" );
spawners = GetSpawnerArray();
players = get_players("allies");
for (i = 0; i < spawners.size; i++)
{
if (isdefined(spawners[i].targetname))
{
possible_trig = getentarray(spawners[i].targetname, "target");
if (isdefined(possible_trig[0]))
{
if (isdefined(possible_trig[0].targetname))
{
if (possible_trig[0].targetname == "flood_spawner")
{
spawners[i] coop_set_spawner_adjustment_values(players.size);
}
}
}
}
}
}
coop_set_spawner_adjustment_values( player_count )
{
if (!isdefined(self.count))
{
return;
}
if (isdefined(self.script_count_lock) && self.script_count_lock)
{
return;
}
if (player_count <= 1)
{
return;
}
else if (player_count == 2)
{
self.count = self.count + int(self.count * 0.75);
}
else if (player_count == 3)
{
self.count = self.count + int(self.count * 1.5);
}
else if (player_count == 4)
{
self.count = self.count + int(self.count * 2.5);
}
else
{
println("You've performed magic, sir.");
}
}