1 #using scripts\shared\flag_shared;
2 #using scripts\shared\flagsys_shared;
3 #using scripts\shared\util_shared;
4 #using scripts\shared\clientfield_shared;
6 #insert scripts\shared\shared.gsh;
8 #using scripts\shared\ai\systems\weaponList;
10 #using scripts\codescripts\struct;
22 if ( !isdefined( level.script ) )
24 level.script = tolower( GetDvarString(
"mapname" ) );
29 if (
IS_TRUE( level.b_gameSkillSet ) )
49 level.b_gameSkillSet =
true;
52 replay_single_mission = GetDvarInt(
"ui_singlemission" );
53 if ( replay_single_mission == 1 )
55 single_mission_difficulty = GetDvarInt(
"ui_singlemission_difficulty" );
56 if ( single_mission_difficulty >= 0 )
58 skill_override = single_mission_difficulty;
64 if ( !isdefined( level.player_attacker_accuracy_multiplier ) )
66 level.player_attacker_accuracy_multiplier = 1;
69 anim.run_accuracy = 0.5;
71 level.auto_adjust_threatbias =
true;
86 if ( level.auto_adjust_threatbias )
103 setsaveddvar(
"ai_accuracyDistScale", 1 );
113 players = level.players;
114 for( i = 0; i < players.size; i++ )
133 return level.difficultySettings[ msg ][ level.currentDifficulty ];
155 if ( !isalive(
self.enemy ) )
160 if ( !IsPlayer(
self.enemy) )
165 if ( !isalive( level.painAI ) || level.painAI.a.script !=
"pain" )
171 if (
self == level.painAI )
176 if (
self.damageWeapon != level.weaponNone &&
self.damageWeapon.isBoltAction )
187 level notify(
"stop_printing_health_bars" );
188 level endon(
"stop_printing_health_bars" );
193 level.healthBarHudElems = [];
195 level.healthBarKeys[ 0 ] =
"Health";
196 level.healthBarKeys[ 1 ] =
"No Hit Time";
197 level.healthBarKeys[ 2 ] =
"No Die Time";
199 if ( !isdefined( level.playerInvulTimeEnd ) )
201 level.playerInvulTimeEnd = 0;
204 if ( !isdefined( level.player_deathInvulnerableTimeout ) )
206 level.player_deathInvulnerableTimeout = 0;
209 for ( i = 0; i < level.healthBarKeys.size; i++ )
211 key = level.healthBarKeys[ i ];
213 textelem = newHudElem();
216 textelem.alignX =
"left";
217 textelem.alignY =
"top";
218 textelem.horzAlign =
"fullscreen";
219 textelem.vertAlign =
"fullscreen";
220 textelem setText( key );
222 bgbar = newHudElem();
226 bgbar.alignX =
"left";
227 bgbar.alignY =
"top";
228 bgbar.horzAlign =
"fullscreen";
229 bgbar.vertAlign =
"fullscreen";
231 bgbar setshader(
"white", bgbar.maxwidth, 10 );
232 bgbar.color = ( 0.5, 0.5, 0.5 );
239 bar.horzAlign =
"fullscreen";
240 bar.vertAlign =
"fullscreen";
241 bar setshader(
"black", 1, 8 );
245 textelem.bgbar = bgbar;
250 level.healthBarHudElems[ key ] = textelem;
259 players = level.players;
261 for ( i = 0; i < level.healthBarKeys.size && players.size > 0; i++ )
263 key = level.healthBarKeys[ i ];
270 width = player.health / player.maxhealth * 300;
271 level.healthBarHudElems[ key ] SetText( level.healthBarKeys[ 0 ] +
" " + player.health );
275 width = ( level.playerInvulTimeEnd - GetTime() ) / 1000 * 40;
279 width = ( level.player_deathInvulnerableTimeout - GetTime() ) / 1000 * 40;
282 width = int( max( width, 1 ) );
283 width = int( min( width, 300 ) );
285 bar = level.healthBarHudElems[ key ].bar;
286 bar setShader(
"black", width, 8 );
288 bgbar = level.healthBarHudElems[ key ].bgbar;
289 if( width+2 > bgbar.maxwidth )
291 bgbar.maxwidth = width+2;
292 bgbar setshader(
"white", bgbar.maxwidth, 10 );
293 bgbar.color = ( 0.5, 0.5, 0.5 );
301 level notify(
"stop_printing_health_bars" );
303 if ( !isdefined( level.healthBarHudElems ) )
308 for ( i = 0; i < level.healthBarKeys.size; i++ )
310 level.healthBarHudElems[ level.healthBarKeys[ i ] ].bgbar
destroy();
311 level.healthBarHudElems[ level.healthBarKeys[ i ] ].bar
destroy();
312 level.healthBarHudElems[ level.healthBarKeys[ i ] ]
destroy();
322 self endon(
"long_death" );
323 self endon(
"death" );
325 if( isDefined(level.script) && level.script !=
"core_frontend" )
335 self endon(
"long_death" );
336 self endon(
"death" );
344 self endon(
"death" );
345 self endon(
"killHurtCheck" );
347 self.hurtAgain =
false;
350 self waittill(
"damage", amount, attacker, dir, point, mod );
352 if(isdefined(attacker) && isplayer(attacker) && attacker.team ==
self.team)
357 self.hurtAgain =
true;
358 self.damagePoint = point;
359 self.damageAttacker = attacker;
362 if( isdefined (mod) && mod ==
"MOD_BURNED" )
365 self PlaySound(
"chr_burn" );
368 invulWorthyHealthDrop = amount /
self.maxhealth >= level.worthyDamageRatio;
370 death_invuln_time = 0;
374 invulWorthyHealthDrop =
true;
379 death_invuln_time = player_death_invulnerability_time * coop_death_invulnerability_time_modifier;
381 self.eligible_for_death_invulnerability =
false;
385 level.player_deathInvulnerableTimeout = GetTime() + death_invuln_time;
388 oldratio =
self.health /
self.maxHealth;
390 level notify(
"hit_again" );
393 hurtTime = gettime();
394 if( !isdefined( level.disable_damage_blur ) )
396 self startfadingblur( 3, 0.8 );
399 if( !invulWorthyHealthDrop )
404 if(
self flag::get(
"player_is_invulnerable" ) )
408 level notify(
"player_becoming_invulnerable" );
416 invulTime = death_invuln_time;
427 self endon (
"death");
428 self endon (
"disconnect");
429 self endon (
"removehealthregen");
431 if( !isdefined(
self.flag ) )
434 self.flags_lock = [];
436 if( !isdefined(
self.flag[
"player_has_red_flashing_overlay"]) )
438 self flag::init(
"player_has_red_flashing_overlay");
452 playerJustGotRedFlashing =
false;
458 self.attackerAccuracy = 1;
459 self.oldattackeraccuracy = 1;
460 self.ignoreBulletDamage = 0;
463 if(!isdefined (
self.veryhurt))
468 self.boltHit =
false;
475 if(
self.health ==
self.maxHealth )
477 if(
self flag::get(
"player_has_red_flashing_overlay" ) )
482 playerJustGotRedFlashing =
false;
487 if(
self.health <= 0 )
492 wasVeryHurt = veryHurt;
493 health_ratio =
self.health /
self.maxHealth;
503 hurtTime = gettime();
509 self flag::set(
"player_has_red_flashing_overlay" );
510 playerJustGotRedFlashing =
true;
516 hurtTime = gettime();
517 self.hurtAgain =
false;
521 if( health_ratio >= oldratio )
523 if( gettime() - hurttime < level.playerHealth_RegularRegenDelay )
531 newHealth = health_ratio;
532 if( gettime() > hurtTime + level.longRegenTime )
534 const regenRate = 0.1;
535 newHealth += regenRate;
538 if ( newHealth >= 1 )
549 if( newHealth > 1.0 )
559 self setnormalhealth( newHealth );
561 oldratio =
self.health /
self.maxHealth;
570 players = level.players;
572 if ( isdefined( players[0] ) && isAlive( players[0] ) )
574 takeCoverWarnings = GetLocalProfileInt(
"takeCoverWarnings" );
575 if ( takeCoverWarnings > 0 )
577 takeCoverWarnings -- ;
578 SetLocalProfileVar(
"takeCoverWarnings", takeCoverWarnings );
586 self endon(
"death" );
587 self endon(
"disconnect" );
589 self.oldattackeraccuracy =
self.attackeraccuracy;
593 self.attackerAccuracy = 0;
594 self.ignoreBulletDamage =
true;
596 level.playerInvulTimeEnd = gettime() +
timer * 1000;
602 self.attackerAccuracy =
self.oldattackeraccuracy;
603 self.ignoreBulletDamage =
false;
611 if (
self.team ==
"allies" )
613 self.grenadeawareness = 0.9;
617 if (
self.team ==
"axis" )
619 if ( isdefined(level.gameSkill) && level.gameSkill >= 2 )
622 if ( randomint( 100 ) < 33 )
624 self.grenadeawareness = 0.2;
628 self.grenadeawareness = 0.5;
634 if ( randomint( 100 ) < 33 )
636 self.grenadeawareness = 0;
640 self.grenadeawareness = 0.2;
648 self endon(
"disconnect" );
649 self endon(
"killed_player" );
659 if (player.health >= healthcap)
661 if( isdefined( ent ) )
663 ent stoploopsound( 1.5 );
669 ent =
Spawn(
"script_origin",
self.origin );
670 ent playloopsound(
"", .5 );
684 self notify(
"new_style_health_overlay_done");
685 self endon (
"new_style_health_overlay_done");
686 while(!
IS_TRUE(level.disable_damage_overlay) && timeToFadeOut>0)
689 timeToFadeOut -= 0.05;
691 if (
IS_TRUE(level.disable_damage_overlay))
694 overlay fadeOverTime( 0.05 );
765 self endon(
"disconnect" );
766 self endon(
"noHealthOverlay" );
779 self.fontScale = 1.6;
784 self.alignX =
"center";
785 self.alignY =
"bottom";
786 self.horzAlign =
"center";
787 self.vertAlign =
"middle";
789 if ( !isdefined(
self.background ) )
793 self.background.x = 0;
794 self.background.y = -40;
795 self.background.alignX =
"center";
796 self.background.alignY =
"middle";
797 self.background.horzAlign =
"center";
798 self.background.vertAlign =
"middle";
801 self.background setshader(
"popmenu_bg", 650, 52 );
805 self.background setshader(
"popmenu_bg", 650, 42 );
807 self.background.alpha = .5;
812 level notify(
"hud_elem_interupt" );
813 hudelem = newHudElem();
816 hudelem setText( &
"GAME_GET_TO_COVER" );
817 hudelem.fontscale = 1.85;
819 hudelem.color = ( 1, 0.6, 0 );
826 if(isdefined (
self.veryhurt))
829 if(
self.veryhurt == 0)
831 if(randomintrange(0,1) == 1)
833 playsoundatposition (
"chr_breathing_hurt_start",
self.origin);
841 level endon(
"hit_again" );
842 self waittill(
"damage" );
848 self endon(
"being_destroyed" );
849 self endon (
"death");
859 self notify(
"being_destroyed" );
860 self.beingDestroyed =
true;
864 self fadeOverTime( 0.5 );
874 if ( !isdefined( coverWarning ) )
878 if ( isdefined( coverWarning.beingDestroyed ) )
889 self endon(
"death" );
891 dif = scale -
self.fontscale;
892 self changeFontScaleOverTime(
timer );
893 self.fontscale += dif;
900 level endon(
"missionfailed" );
905 level.cover_warning_hud = coverwarning;
907 coverwarning endon(
"death" );
909 stopFlashingBadlyTime = gettime() + level.longRegenTime;
913 while ( gettime() < stopFlashingBadlyTime && isalive(
self ) )
918 coverwarning.color = (1,yellow_fac,0);
925 coverwarning.color = (1,yellow_fac,0);
932 coverwarning fadeOverTime( 0.5 );
933 coverwarning.alpha = 0;
949 if( isdefined(level.enable_cover_warning) )
951 return level.enable_cover_warning;
954 if ( !isAlive(
self ) )
959 if ( level.gameskill > 1 )
964 if ( level.missionfailed )
976 takeCoverWarnings = GetLocalProfileInt(
"takeCoverWarnings" );
977 if ( takeCoverWarnings <= 3 )
982 if (isdefined(level.cover_warning_hud))
992 function fadeFunc( overlay, coverWarning, severity, mult, hud_scaleOnly )
994 const pulseTime = 0.8;
996 fadeInTime = pulseTime * 0.1;
997 stayFullTime = pulseTime * ( .1 + severity * .2 );
998 fadeOutHalfTime = pulseTime * ( 0.1 + severity * .1 );
999 fadeOutFullTime = pulseTime * 0.3;
1000 remainingTime = pulseTime - fadeInTime - stayFullTime - fadeOutHalfTime - fadeOutFullTime;
1001 assert( remainingTime >= -.001 );
1002 if ( remainingTime < 0 )
1007 halfAlpha = 0.8 + severity * 0.1;
1008 leastAlpha = 0.5 + severity * 0.3;
1010 overlay fadeOverTime( fadeInTime );
1011 overlay.alpha = mult * 1.0;
1014 if ( !hud_scaleOnly )
1016 coverWarning fadeOverTime( fadeInTime );
1017 coverWarning.alpha = mult * 1.0;
1020 if ( isdefined( coverWarning ) )
1022 coverWarning thread
fontScaler( 1.0, fadeInTime );
1024 wait fadeInTime + stayFullTime;
1026 overlay fadeOverTime( fadeOutHalfTime );
1027 overlay.alpha = mult * halfAlpha;
1030 if ( !hud_scaleOnly )
1032 coverWarning fadeOverTime( fadeOutHalfTime );
1033 coverWarning.alpha = mult * halfAlpha;
1037 wait fadeOutHalfTime;
1039 overlay fadeOverTime( fadeOutFullTime );
1040 overlay.alpha = mult * leastAlpha;
1043 if ( !hud_scaleOnly )
1045 coverWarning fadeOverTime( fadeOutFullTime );
1046 coverWarning.alpha = mult * leastAlpha;
1049 if ( isdefined( coverWarning ) )
1051 coverWarning thread
fontScaler( 0.9, fadeOutFullTime );
1053 wait fadeOutFullTime;
1063 self endon (
"disconnect");
1072 overlay fadeOverTime( 3.5 );
1084 isPreGameplayLevel = ( level.script ==
"training" || level.script ==
"cargoship" || level.script ==
"coup" );
1086 if ( GetLocalProfileInt(
"takeCoverWarnings" ) == -1 || isPreGameplayLevel )
1089 SetLocalProfileVar(
"takeCoverWarnings", 3 + 6 );
1097 if( !IsPlayer(
self ) )
1102 level notify(
"new_cover_on_death_thread" );
1103 level endon(
"new_cover_on_death_thread" );
1104 self waittill(
"death" );
1107 if( !(
self flag::get(
"player_has_red_flashing_overlay" ) ) )
1112 if ( level.gameSkill > 1 )
1117 warnings = GetLocalProfileInt(
"takeCoverWarnings" );
1118 if ( warnings < 10 )
1120 SetLocalProfileVar(
"takeCoverWarnings", warnings + 1 );
1132 level notify(
"update_skill_from_profile" );
1133 level endon(
"update_skill_from_profile" );
1135 level.gameSkillLowest = 9999;
1136 level.gameSkillHighest = 0;
1137 n_last_gameskill = -1;
1139 while ( !isdefined( skill_override ) )
1141 level.gameSkill = GetLocalProfileInt(
"g_gameskill" );
1143 if ( level.gameSkill != n_last_gameskill )
1145 if ( !isdefined( level.gameskill ) )
1147 level.gameskill = 0;
1150 SetDvar(
"saved_gameskill", level.gameSkill );
1152 switch ( level.gameSkill )
1156 SetDvar(
"currentDifficulty",
"easy" );
1157 level.currentDifficulty =
"easy";
1162 SetDvar(
"currentDifficulty",
"normal" );
1163 level.currentDifficulty =
"normal";
1168 SetDvar(
"currentDifficulty",
"hardened" );
1169 level.currentDifficulty =
"hardened";
1174 SetDvar(
"currentDifficulty",
"veteran" );
1175 level.currentDifficulty =
"veteran";
1180 SetDvar(
"currentDifficulty",
"realistic" );
1181 level.currentDifficulty =
"realistic";
1185 /# PrintLn(
"difficulty: " + level.gameSkill ); #/
1187 n_last_gameskill = level.gameSkill;
1189 if ( level.gameSkill < level.gameSkillLowest )
1191 level.gameSkillLowest = level.gameSkill;
1195 if ( level.gameSkill > level.gameSkillHighest )
1197 level.gameSkillHighest = level.gameSkill;
1201 foreach( player
in GetPlayers() )
1219 while (level.players.size > 1)
1221 players = GetPlayers(
"allies");
1235 while (level.players.size > 1)
1239 players = GetPlayers(
"allies");
1251 self endon (
"death");
1254 initialValue =
self.baseAccuracy;
1259 wait randomfloatrange(3,5);
1268 self endon (
"death");
1271 initialValue =
self.baseAccuracy;
1273 while (level.players.size > 1)
1275 if( !isdefined( level.coop_friendly_accuracy_scalar ) )
1281 self.baseAccuracy = initialValue * level.coop_friendly_accuracy_scalar;
1284 wait randomfloatrange(3,5);
1296 if ( level.auto_adjust_threatbias )
1298 players = GetPlayers(
"allies");
1301 for( i = 0; i < players.size; i++ )
1312 level.auto_adjust_threatbias =
true;
1315 players = level.players;
1318 if (!isdefined(level.coop_player_threatbias_scalar))
1320 level.coop_player_threatbias_scalar = 1;
1332 if ( reload || !isdefined( level.s_game_difficulty ) )
1334 level.s_game_difficulty = [];
1345 gameskill::setdiffstructarrays();
1346 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].threatbias;
1348 if( isDefined( diff_struct_value ))
1350 return diff_struct_value;
1362 gameskill::setdiffstructarrays();
1363 diff_xp_mult = level.s_game_difficulty[ level.gameSkill ].difficulty_xp_multiplier;
1365 if( isDefined( diff_xp_mult ))
1367 return diff_xp_mult;
1379 gameskill::setdiffstructarrays();
1381 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].healthOverlayCutoff;
1383 if( isDefined( diff_struct_value ))
1385 return diff_struct_value;
1396 gameskill::setdiffstructarrays();
1397 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].enemyPainChance;
1401 if( isDefined( diff_struct_value ))
1403 diff_struct_value = modifier * diff_struct_value;
1404 return diff_struct_value;
1407 if( isDefined( diff_struct_value ))
1409 return diff_struct_value;
1420 gameskill::setdiffstructarrays();
1421 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].player_deathInvulnerableTime;
1423 if( isDefined( diff_struct_value ))
1425 return diff_struct_value;
1436 gameskill::setdiffstructarrays();
1437 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].base_enemy_accuracy;
1439 if( isDefined( diff_struct_value ))
1441 return diff_struct_value;
1452 gameskill::setdiffstructarrays();
1453 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].playerDifficultyHealth;
1455 if( isDefined( diff_struct_value ))
1457 return diff_struct_value;
1467 gameskill::setdiffstructarrays();
1468 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].playerHitInvulnTime;
1472 if( isDefined( diff_struct_value ))
1474 diff_struct_value = modifier * diff_struct_value;
1475 return diff_struct_value;
1485 gameskill::setdiffstructarrays();
1486 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].missTimeConstant;
1488 if( isDefined( diff_struct_value ))
1490 return diff_struct_value;
1500 gameskill::setdiffstructarrays();
1501 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].missTimeResetDelay;
1503 if( isDefined( diff_struct_value ))
1505 return diff_struct_value;
1515 gameskill::setdiffstructarrays();
1516 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].missTimeDistanceFactor;
1518 if( isDefined( diff_struct_value ))
1520 return diff_struct_value;
1530 gameskill::setdiffstructarrays();
1531 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].dog_health;
1533 if( isDefined( diff_struct_value ))
1535 return diff_struct_value;
1545 gameskill::setdiffstructarrays();
1546 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].dog_presstime;
1548 if( isDefined( diff_struct_value ))
1550 return diff_struct_value;
1560 gameskill::setdiffstructarrays();
1561 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].dog_hits_before_kill;
1563 if( isDefined( diff_struct_value ))
1565 return diff_struct_value;
1576 gameskill::setdiffstructarrays();
1577 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].longRegenTime;
1579 if( isDefined( diff_struct_value ))
1581 return diff_struct_value;
1591 gameskill::setdiffstructarrays();
1592 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].playerHealth_RegularRegenDelay;
1594 if( isDefined( diff_struct_value ))
1596 return diff_struct_value;
1606 gameskill::setdiffstructarrays();
1607 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].worthyDamageRatio;
1609 if( isDefined( diff_struct_value ))
1611 return diff_struct_value;
1621 gameskill::setdiffstructarrays();
1623 switch( level.players.size )
1626 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].one_player_coopEnemyAccuracyScalar;
1628 if( isDefined( diff_struct_value ))
1630 return diff_struct_value;
1639 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].two_player_coopEnemyAccuracyScalar;
1641 if( isDefined( diff_struct_value ))
1643 return diff_struct_value;
1652 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].three_player_coopEnemyAccuracyScalar;
1654 if( isDefined( diff_struct_value ))
1656 return diff_struct_value;
1665 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].four_player_coopEnemyAccuracyScalar;
1667 if( isDefined( diff_struct_value ))
1669 return diff_struct_value;
1682 gameskill::setdiffstructarrays();
1684 switch( level.players.size )
1687 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].one_player_coopFriendlyAccuracyScalar;
1689 if( isDefined( diff_struct_value ))
1691 return diff_struct_value;
1700 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].two_player_coopFriendlyAccuracyScalar;
1702 if( isDefined( diff_struct_value ))
1704 return diff_struct_value;
1713 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].three_player_coopFriendlyAccuracyScalar;
1715 if( isDefined( diff_struct_value ))
1717 return diff_struct_value;
1726 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].four_player_coopFriendlyAccuracyScalar;
1728 if( isDefined( diff_struct_value ))
1730 return diff_struct_value;
1745 gameskill::setdiffstructarrays();
1747 switch( level.players.size )
1750 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].one_player_coopFriendlyThreatBiasScalar;
1752 if( isDefined( diff_struct_value ))
1754 return diff_struct_value;
1763 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].two_player_coopFriendlyThreatBiasScalar;
1765 if( isDefined( diff_struct_value ))
1767 return diff_struct_value;
1776 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].three_player_coopFriendlyThreatBiasScalar;
1778 if( isDefined( diff_struct_value ))
1780 return diff_struct_value;
1789 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].four_player_coopFriendlyThreatBiasScalar;
1791 if( isDefined( diff_struct_value ))
1793 return diff_struct_value;
1808 gameskill::setdiffstructarrays();
1810 switch( level.players.size )
1813 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].one_player_coopPlayerDifficultyHealth;
1815 if( isDefined( diff_struct_value ))
1817 return diff_struct_value;
1826 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].two_player_coopPlayerDifficultyHealth;
1828 if( isDefined( diff_struct_value ))
1830 return diff_struct_value;
1839 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].three_player_coopPlayerDifficultyHealth;
1841 if( isDefined( diff_struct_value ))
1843 return diff_struct_value;
1852 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].four_player_coopPlayerDifficultyHealth;
1854 if( isDefined( diff_struct_value ))
1856 return diff_struct_value;
1871 gameskill::setdiffstructarrays();
1873 switch( level.players.size )
1876 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].one_player_deathInvulnerableTimeModifier;
1878 if( isDefined( diff_struct_value ))
1880 return diff_struct_value;
1889 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].two_player_deathInvulnerableTimeModifier;
1891 if( isDefined( diff_struct_value ))
1893 return diff_struct_value;
1902 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].three_player_deathInvulnerableTimeModifier;
1904 if( isDefined( diff_struct_value ))
1906 return diff_struct_value;
1915 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].four_player_deathInvulnerableTimeModifier;
1917 if( isDefined( diff_struct_value ))
1919 return diff_struct_value;
1934 gameskill::setdiffstructarrays();
1936 switch( level.players.size )
1939 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].one_player_hit_invulnerability_modifier;
1941 if( isDefined( diff_struct_value ))
1943 return diff_struct_value;
1952 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].two_player_hit_invulnerability_modifier;
1954 if( isDefined( diff_struct_value ))
1956 return diff_struct_value;
1965 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].three_player_hit_invulnerability_modifier;
1967 if( isDefined( diff_struct_value ))
1969 return diff_struct_value;
1978 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].four_player_hit_invulnerability_modifier;
1980 if( isDefined( diff_struct_value ))
1982 return diff_struct_value;
1996 gameskill::setdiffstructarrays();
1998 switch( level.players.size )
2001 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].one_player_enemy_pain_chance_modifier;
2003 if( isDefined( diff_struct_value ))
2005 return diff_struct_value;
2014 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].two_player_enemy_pain_chance_modifier;
2016 if( isDefined( diff_struct_value ))
2018 return diff_struct_value;
2027 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].three_player_enemy_pain_chance_modifier;
2029 if( isDefined( diff_struct_value ))
2031 return diff_struct_value;
2040 diff_struct_value = level.s_game_difficulty[ level.gameSkill ].four_player_enemy_pain_chance_modifier;
2042 if( isDefined( diff_struct_value ))
2044 return diff_struct_value;
2059 value = level.gameSkill + level.players.size -1;
2071 if( level.gameSkill >= 4 )
2076 if( !isDefined(
self.eligible_for_death_invulnerability ))
2078 self.eligible_for_death_invulnerability =
true;
2081 return self.eligible_for_death_invulnerability;
2087 self endon(
"disconnect" );
2088 self endon(
"death" );
2090 while( !
self.eligible_for_death_invulnerability )
2092 if(
self.health >=
self.maxhealth )
2094 self.eligible_for_death_invulnerability = true ;
2106 player_damage_difficulty_modifier = 100 / player_difficulty_health;
2108 iDamage = iDamage * player_damage_difficulty_modifier;
2113 #define MAX_MELEE_DAMAGE_FROM_BEHIND 40
2116 if ( ( sMeansOfDamage ==
"MOD_MELEE" || sMeansOfDamage ==
"MOD_MELEE_WEAPON_BUTT" ) && IsEntity( eAttacker ) )
2118 iDamage = iDamage/5;
2122 playerForward = AnglesToForward( player.angles );
2123 toAttacker = VectorNormalize( eAttacker.origin - player.origin );
2127 if ( VectorDot( playerForward, toAttacker ) < 0.342 )
2139 self endon(
"death" );
2141 self.baseaccuracy =
self.accuracy;
2146 self endon(
"death" );
2148 if ( GetDvarInt(
"ai_codeGameskill" ) )
2155 if( isDefined( ai.enemy ) )
2157 if( isPlayer( ai.enemy ))
2159 if( !isDefined( ai.lastEnemyShotAt ) )
2161 ai.lastEnemyShotAt = ai.enemy;
2162 ai.buildupAccuracyModifier = 0;
2163 ai.shootTimeStart = GetTime();
2164 ai.lastShotTime = ai.shootTimeStart;
2167 if( ai.enemy != ai.lastEnemyShotAt )
2169 ai.lastEnemyShotAt = ai.enemy;
2170 ai.buildupAccuracyModifier = 0;
2171 ai.shootTimeStart = GetTime();
2172 ai.lastShotTime = ai.shootTimeStart;
2180 if( ai.accurateFire )
2182 ai.miss_time_reset_delay *=2;
2184 shotTime = GetTime();
2185 timeShooting = shotTime - ai.shootTimeStart;
2188 distance = Distance( ai.origin, ai.enemy.origin );
2189 missTime = ai.miss_time_constant * 1000;
2190 accuracyBuildupTime = missTime + ( distance * ai.miss_time_distance_factor );
2193 targetFacingAngle = AnglesToForward( ai.enemy.angles );
2194 angleFromTarget = VectorNormalize( ai.origin - ai.enemy.origin );
2196 if( VectorDot( targetFacingAngle, angleFromTarget ) < 0.7)
2198 accuracyBuildupTime *= 2;
2202 if( shotTime - ai.lastShotTime > ai.miss_time_reset_delay )
2204 ai.buildupAccuracyModifier = 0;
2205 ai.shootTimeStart = shotTime;
2210 if( timeShooting > accuracyBuildupTime )
2212 ai.buildupAccuracyModifier = 1;
2217 if( timeShooting <= accuracyBuildupTime && timeShooting > accuracyBuildupTime * 0.66)
2219 ai.buildupAccuracyModifier = 0.66;
2222 if( timeShooting <= accuracyBuildupTime * 0.66 && timeShooting > accuracyBuildupTime * 0.33)
2224 ai.buildupAccuracyModifier = 0.33;
2227 if( timeShooting <= accuracyBuildupTime * 0.33 )
2229 ai.buildupAccuracyModifier = 0;
2232 ai.lastShotTime = shotTime;
2237 ai.buildupAccuracyModifier = 1;
2240 ai.accuracy = ai.baseaccuracy * ai.buildupAccuracyModifier;
2243 self waittill(
"about_to_shoot" );