@ -2308,7 +2308,7 @@ void CreatePlayer(Player &player, HeroClass c)
player . _pMaxManaBase = player . _pMana ;
player . _pExperience = 0 ;
player . _pNextExper = ExpLvlsTbl [ 1 ] ;
player . _pNextExper = GetNextExperienceThresholdForLevel ( player . _pLevel ) ;
player . _pArmorClass = 0 ;
player . _pLightRad = 10 ;
player . _pInfraFlag = false ;
@ -2397,7 +2397,7 @@ void NextPlrLevel(Player &player)
} else {
player . _pStatPts + = 5 ;
}
player . _pNextExper = ExpLvlsTbl [ std : : min < int8_t > ( player . _pLevel , MaxCharacterLevel - 1 ) ] ;
player . _pNextExper = GetNextExperienceThresholdForLevel ( player . _pLevel ) ;
int hp = PlayersData [ static_cast < size_t > ( player . _pClass ) ] . lvlLife ;
@ -2447,14 +2447,15 @@ void AddPlrExperience(Player &player, int lvl, int exp)
// Prevent power leveling
if ( gbIsMultiplayer ) {
const uint32_t clampedPlayerLevel = std : : clamp ( static_cast < int > ( player . _pLevel ) , 1 , MaxCharacterLevel ) ;
// Use a minimum of 1 so level 0 characters can still gain experience
const uint32_t clampedPlayerLevel = static_cast < uint32_t > ( std : : max ( static_cast < int > ( player . _pLevel ) , 1 ) ) ;
// for low level characters experience gain is capped to 1/20 of current levels xp
// for high level characters experience gain is capped to 200 * current level - this is a smaller value than 1/20 of the exp needed for the next level after level 5.
clampedExp = std : : min ( { clampedExp , /* level 0-5: */ ExpLvlsTbl [ clampedPlayerLevel ] / 20U , /* level 6-50: */ 200U * clampedPlayerLevel } ) ;
clampedExp = std : : min ( { clampedExp , /* level 1-5: */ GetNextExperienceThresholdForLevel ( clampedPlayerLevel ) / 20U , /* level 6-50: */ 200U * clampedPlayerLevel } ) ;
}
const uint32_t MaxExperience = ExpLvlsTbl [ MaxCharacterLevel - 1 ] ;
const uint32_t MaxExperience = GetNextExperienceThresholdForLevel ( MaxCharacterLevel ) ;
// Overflow is only possible if a kill grants more than (2^32-1 - MaxExperience) XP in one go, which doesn't happen in normal gameplay. Clamp to experience required to reach max level
player . _pExperience = std : : min ( player . _pExperience + clampedExp , MaxExperience ) ;
@ -2465,7 +2466,7 @@ void AddPlrExperience(Player &player, int lvl, int exp)
// Increase player level if applicable
int newLvl = player . _pLevel ;
while ( newLvl < MaxCharacterLevel & & player . _pExperience > = ExpLvlsTbl [ newLvl ] ) {
while ( newLvl < MaxCharacterLevel & & player . _pExperience > = GetNextExperienceThresholdForLevel ( newLvl ) ) {
newLvl + + ;
}
if ( newLvl ! = player . _pLevel ) {
@ -2547,7 +2548,7 @@ void InitPlayer(Player &player, bool firstTime)
SpellID s = PlayersData [ static_cast < size_t > ( player . _pClass ) ] . skill ;
player . _pAblSpells = GetSpellBitmask ( s ) ;
player . _pNextExper = ExpLvlsTbl [ std : : min < int8_t > ( player . _pLevel , MaxCharacterLevel - 1 ) ] ;
player . _pNextExper = GetNextExperienceThresholdForLevel ( player . _pLevel ) ;
player . _pInvincible = false ;
if ( & player = = MyPlayer ) {