diff --git a/Source/items.cpp b/Source/items.cpp index c28b3858a..f085bda23 100644 --- a/Source/items.cpp +++ b/Source/items.cpp @@ -471,40 +471,40 @@ void CalcSelfItems(Player &player) int sa = 0; int ma = 0; int da = 0; - for (int i = 0; i < NUM_INVLOC; i++) { - auto &equipment = player.InvBody[i]; - if (!equipment.isEmpty()) { - equipment._iStatFlag = true; - if (equipment._iIdentified) { - sa += equipment._iPLStr; - ma += equipment._iPLMag; - da += equipment._iPLDex; - } + + // first iteration is used for collecting stat bonuses from items + for (Item &equipment : EquippedPlayerItemsRange(player)) { + equipment._iStatFlag = true; + if (equipment._iIdentified) { + sa += equipment._iPLStr; + ma += equipment._iPLMag; + da += equipment._iPLDex; } } bool changeflag; do { + // cap stats to 0 + const int currstr = std::max(0, sa + player._pBaseStr); + const int currmag = std::max(0, ma + player._pBaseMag); + const int currdex = std::max(0, da + player._pBaseDex); + changeflag = false; - auto *pi = player.InvBody; - for (int i = 0; i < NUM_INVLOC; i++, pi++) { - if (!pi->isEmpty() && pi->_iStatFlag) { - bool sf = true; - if (sa + player._pBaseStr < pi->_iMinStr) - sf = false; - if (ma + player._pBaseMag < pi->_iMinMag) - sf = false; - if (da + player._pBaseDex < pi->_iMinDex) - sf = false; - if (!sf) { - changeflag = true; - pi->_iStatFlag = false; - if (pi->_iIdentified) { - sa -= pi->_iPLStr; - ma -= pi->_iPLMag; - da -= pi->_iPLDex; - } - } + for (Item &equipment : EquippedPlayerItemsRange(player)) { + if (!equipment._iStatFlag) + continue; + + if (currstr >= equipment._iMinStr + && currmag >= equipment._iMinMag + && currdex >= equipment._iMinDex) + continue; + + changeflag = true; + equipment._iStatFlag = false; + if (equipment._iIdentified) { + sa -= equipment._iPLStr; + ma -= equipment._iPLMag; + da -= equipment._iPLDex; } } } while (changeflag);