diff --git a/Source/control.cpp b/Source/control.cpp index f0e78d43e..b0441d9c4 100644 --- a/Source/control.cpp +++ b/Source/control.cpp @@ -1505,25 +1505,25 @@ void DrawChr(CelOutputBuffer out) col = COL_WHITE; sprintf(chrstr, "%i", plr[myplr]._pBaseStr); - if (plr[myplr].GetMaximumAttributeValue(ATTRIB_STR) == plr[myplr]._pBaseStr) + if (plr[myplr].GetMaximumAttributeValue(attribute_id::ATTRIB_STR) == plr[myplr]._pBaseStr) col = COL_GOLD; ADD_PlrStringXY(out, 95, 155, 126, chrstr, col); col = COL_WHITE; sprintf(chrstr, "%i", plr[myplr]._pBaseMag); - if (plr[myplr].GetMaximumAttributeValue(ATTRIB_MAG) == plr[myplr]._pBaseMag) + if (plr[myplr].GetMaximumAttributeValue(attribute_id::ATTRIB_MAG) == plr[myplr]._pBaseMag) col = COL_GOLD; ADD_PlrStringXY(out, 95, 183, 126, chrstr, col); col = COL_WHITE; sprintf(chrstr, "%i", plr[myplr]._pBaseDex); - if (plr[myplr].GetMaximumAttributeValue(ATTRIB_DEX) == plr[myplr]._pBaseDex) + if (plr[myplr].GetMaximumAttributeValue(attribute_id::ATTRIB_DEX) == plr[myplr]._pBaseDex) col = COL_GOLD; ADD_PlrStringXY(out, 95, 211, 126, chrstr, col); col = COL_WHITE; sprintf(chrstr, "%i", plr[myplr]._pBaseVit); - if (plr[myplr].GetMaximumAttributeValue(ATTRIB_VIT) == plr[myplr]._pBaseVit) + if (plr[myplr].GetMaximumAttributeValue(attribute_id::ATTRIB_VIT) == plr[myplr]._pBaseVit) col = COL_GOLD; ADD_PlrStringXY(out, 95, 239, 126, chrstr, col); @@ -1567,14 +1567,14 @@ void DrawChr(CelOutputBuffer out) if (plr[myplr]._pStatPts > 0) { sprintf(chrstr, "%i", plr[myplr]._pStatPts); ADD_PlrStringXY(out, 95, 266, 126, chrstr, COL_RED); - if (plr[myplr]._pBaseStr < plr[myplr].GetMaximumAttributeValue(ATTRIB_STR)) - CelDrawTo(out, 137, 159, pChrButtons, chrbtn[ATTRIB_STR] + 2, 41); - if (plr[myplr]._pBaseMag < plr[myplr].GetMaximumAttributeValue(ATTRIB_MAG)) - CelDrawTo(out, 137, 187, pChrButtons, chrbtn[ATTRIB_MAG] + 4, 41); - if (plr[myplr]._pBaseDex < plr[myplr].GetMaximumAttributeValue(ATTRIB_DEX)) - CelDrawTo(out, 137, 216, pChrButtons, chrbtn[ATTRIB_DEX] + 6, 41); - if (plr[myplr]._pBaseVit < plr[myplr].GetMaximumAttributeValue(ATTRIB_VIT)) - CelDrawTo(out, 137, 244, pChrButtons, chrbtn[ATTRIB_VIT] + 8, 41); + if (plr[myplr]._pBaseStr < plr[myplr].GetMaximumAttributeValue(attribute_id::ATTRIB_STR)) + CelDrawTo(out, 137, 159, pChrButtons, chrbtn[static_cast(attribute_id::ATTRIB_STR)] + 2, 41); + if (plr[myplr]._pBaseMag < plr[myplr].GetMaximumAttributeValue(attribute_id::ATTRIB_MAG)) + CelDrawTo(out, 137, 187, pChrButtons, chrbtn[static_cast(attribute_id::ATTRIB_MAG)] + 4, 41); + if (plr[myplr]._pBaseDex < plr[myplr].GetMaximumAttributeValue(attribute_id::ATTRIB_DEX)) + CelDrawTo(out, 137, 216, pChrButtons, chrbtn[static_cast(attribute_id::ATTRIB_DEX)] + 6, 41); + if (plr[myplr]._pBaseVit < plr[myplr].GetMaximumAttributeValue(attribute_id::ATTRIB_VIT)) + CelDrawTo(out, 137, 244, pChrButtons, chrbtn[static_cast(attribute_id::ATTRIB_VIT)] + 8, 41); } if (plr[myplr]._pMaxHP > plr[myplr]._pMaxHPBase) @@ -1630,35 +1630,35 @@ void CheckChrBtns() if (!chrbtnactive && plr[myplr]._pStatPts) { HeroClass pc = plr[myplr]._pClass; - for (int i = ATTRIB_STR; i <= ATTRIB_VIT; i++) { - int max = plr[myplr].GetMaximumAttributeValue((attribute_id)i); + for (auto i : enum_values()) { + int max = plr[myplr].GetMaximumAttributeValue(i); switch (i) { - case ATTRIB_STR: + case attribute_id::ATTRIB_STR: if (plr[myplr]._pBaseStr >= max) continue; break; - case ATTRIB_MAG: + case attribute_id::ATTRIB_MAG: if (plr[myplr]._pBaseMag >= max) continue; break; - case ATTRIB_DEX: + case attribute_id::ATTRIB_DEX: if (plr[myplr]._pBaseDex >= max) continue; break; - case ATTRIB_VIT: + case attribute_id::ATTRIB_VIT: if (plr[myplr]._pBaseVit >= max) continue; break; default: continue; } - x = ChrBtnsRect[i].x + ChrBtnsRect[i].w; - y = ChrBtnsRect[i].y + ChrBtnsRect[i].h; - if (MouseX >= ChrBtnsRect[i].x + x = ChrBtnsRect[static_cast(i)].x + ChrBtnsRect[static_cast(i)].w; + y = ChrBtnsRect[static_cast(i)].y + ChrBtnsRect[static_cast(i)].h; + if (MouseX >= ChrBtnsRect[static_cast(i)].x && MouseX <= x - && MouseY >= ChrBtnsRect[i].y + && MouseY >= ChrBtnsRect[static_cast(i)].y && MouseY <= y) { - chrbtn[i] = true; + chrbtn[static_cast(i)] = true; chrbtnactive = true; } } @@ -1675,33 +1675,33 @@ int CapStatPointsToAdd(int remainingStatPoints, const PlayerStruct &player, attr void ReleaseChrBtns(bool addAllStatPoints) { chrbtnactive = false; - for (int i = ATTRIB_STR; i <= ATTRIB_VIT; ++i) { - if (!chrbtn[i]) + for (auto i : enum_values()) { + if (!chrbtn[static_cast(i)]) continue; - chrbtn[i] = false; - if (MouseX >= ChrBtnsRect[i].x - && MouseX <= ChrBtnsRect[i].x + ChrBtnsRect[i].w - && MouseY >= ChrBtnsRect[i].y - && MouseY <= ChrBtnsRect[i].y + ChrBtnsRect[i].h) { + chrbtn[static_cast(i)] = false; + if (MouseX >= ChrBtnsRect[static_cast(i)].x + && MouseX <= ChrBtnsRect[static_cast(i)].x + ChrBtnsRect[static_cast(i)].w + && MouseY >= ChrBtnsRect[static_cast(i)].y + && MouseY <= ChrBtnsRect[static_cast(i)].y + ChrBtnsRect[static_cast(i)].h) { PlayerStruct &player = plr[myplr]; int statPointsToAdd = 1; if (addAllStatPoints) - statPointsToAdd = CapStatPointsToAdd(player._pStatPts, player, (attribute_id)i); + statPointsToAdd = CapStatPointsToAdd(player._pStatPts, player, i); switch (i) { - case ATTRIB_STR: + case attribute_id::ATTRIB_STR: NetSendCmdParam1(true, CMD_ADDSTR, statPointsToAdd); player._pStatPts -= statPointsToAdd; break; - case ATTRIB_MAG: + case attribute_id::ATTRIB_MAG: NetSendCmdParam1(true, CMD_ADDMAG, statPointsToAdd); player._pStatPts -= statPointsToAdd; break; - case ATTRIB_DEX: + case attribute_id::ATTRIB_DEX: NetSendCmdParam1(true, CMD_ADDDEX, statPointsToAdd); player._pStatPts -= statPointsToAdd; break; - case ATTRIB_VIT: + case attribute_id::ATTRIB_VIT: NetSendCmdParam1(true, CMD_ADDVIT, statPointsToAdd); player._pStatPts -= statPointsToAdd; break; diff --git a/Source/enum_traits.h b/Source/enum_traits.h index aeacaacf8..23d9edb56 100644 --- a/Source/enum_traits.h +++ b/Source/enum_traits.h @@ -14,4 +14,45 @@ struct enum_size { constexpr static const std::size_t value = static_cast(T::LAST) + 1; }; +template +class enum_values { +public: + class Iterator { + typename std::underlying_type::type m_value; + + public: + Iterator(typename std::underlying_type::type value) + : m_value(value) + { + } + + const T operator*() const + { + return static_cast(m_value); + } + + void operator++() + { + m_value++; + } + + bool operator!=(Iterator rhs) const + { + return m_value != rhs.m_value; + } + }; +}; + +template +typename enum_values::Iterator begin(enum_values) +{ + return typename enum_values::Iterator(static_cast::type>(T::FIRST)); +} + +template +typename enum_values::Iterator end(enum_values) +{ + return typename enum_values::Iterator(static_cast::type>(T::LAST) + 1); +} + } diff --git a/Source/items.cpp b/Source/items.cpp index 12c1dd929..0946e25aa 100644 --- a/Source/items.cpp +++ b/Source/items.cpp @@ -4622,9 +4622,9 @@ static void SpawnOnePremium(int i, int plvl, int myplr) bool keepgoing = false; ItemStruct holditem = items[0]; - int strength = std::max(plr[myplr].GetMaximumAttributeValue(ATTRIB_STR), plr[myplr]._pStrength); - int dexterity = std::max(plr[myplr].GetMaximumAttributeValue(ATTRIB_DEX), plr[myplr]._pDexterity); - int magic = std::max(plr[myplr].GetMaximumAttributeValue(ATTRIB_MAG), plr[myplr]._pMagic); + int strength = std::max(plr[myplr].GetMaximumAttributeValue(attribute_id::ATTRIB_STR), plr[myplr]._pStrength); + int dexterity = std::max(plr[myplr].GetMaximumAttributeValue(attribute_id::ATTRIB_DEX), plr[myplr]._pDexterity); + int magic = std::max(plr[myplr].GetMaximumAttributeValue(attribute_id::ATTRIB_MAG), plr[myplr]._pMagic); strength *= 1.2; dexterity *= 1.2; magic *= 1.2; @@ -4950,9 +4950,9 @@ void SpawnBoy(int lvl) int count = 0; HeroClass pc = plr[myplr]._pClass; - int strength = std::max(plr[myplr].GetMaximumAttributeValue(ATTRIB_STR), plr[myplr]._pStrength); - int dexterity = std::max(plr[myplr].GetMaximumAttributeValue(ATTRIB_DEX), plr[myplr]._pDexterity); - int magic = std::max(plr[myplr].GetMaximumAttributeValue(ATTRIB_MAG), plr[myplr]._pMagic); + int strength = std::max(plr[myplr].GetMaximumAttributeValue(attribute_id::ATTRIB_STR), plr[myplr]._pStrength); + int dexterity = std::max(plr[myplr].GetMaximumAttributeValue(attribute_id::ATTRIB_DEX), plr[myplr]._pDexterity); + int magic = std::max(plr[myplr].GetMaximumAttributeValue(attribute_id::ATTRIB_MAG), plr[myplr]._pMagic); strength *= 1.2; dexterity *= 1.2; magic *= 1.2; @@ -5071,13 +5071,13 @@ bool HealerItemOk(int i) if (!gbIsMultiplayer) { if (AllItemsList[i].iMiscId == IMISC_ELIXSTR) - return !gbIsHellfire || plr[myplr]._pBaseStr < plr[myplr].GetMaximumAttributeValue(ATTRIB_STR); + return !gbIsHellfire || plr[myplr]._pBaseStr < plr[myplr].GetMaximumAttributeValue(attribute_id::ATTRIB_STR); if (AllItemsList[i].iMiscId == IMISC_ELIXMAG) - return !gbIsHellfire || plr[myplr]._pBaseMag < plr[myplr].GetMaximumAttributeValue(ATTRIB_MAG); + return !gbIsHellfire || plr[myplr]._pBaseMag < plr[myplr].GetMaximumAttributeValue(attribute_id::ATTRIB_MAG); if (AllItemsList[i].iMiscId == IMISC_ELIXDEX) - return !gbIsHellfire || plr[myplr]._pBaseDex < plr[myplr].GetMaximumAttributeValue(ATTRIB_DEX); + return !gbIsHellfire || plr[myplr]._pBaseDex < plr[myplr].GetMaximumAttributeValue(attribute_id::ATTRIB_DEX); if (AllItemsList[i].iMiscId == IMISC_ELIXVIT) - return !gbIsHellfire || plr[myplr]._pBaseVit < plr[myplr].GetMaximumAttributeValue(ATTRIB_VIT); + return !gbIsHellfire || plr[myplr]._pBaseVit < plr[myplr].GetMaximumAttributeValue(attribute_id::ATTRIB_VIT); } if (AllItemsList[i].iMiscId == IMISC_REJUV) diff --git a/Source/objects.cpp b/Source/objects.cpp index 3afcff2d8..2721b1d1c 100644 --- a/Source/objects.cpp +++ b/Source/objects.cpp @@ -3408,17 +3408,17 @@ bool OperateShrineMysterious(int pnum) ModifyPlrDex(pnum, -1); ModifyPlrVit(pnum, -1); - switch (random_(0, 4)) { - case ATTRIB_STR: + switch (static_cast(random_(0, 4))) { + case attribute_id::ATTRIB_STR: ModifyPlrStr(pnum, 6); break; - case ATTRIB_MAG: + case attribute_id::ATTRIB_MAG: ModifyPlrMag(pnum, 6); break; - case ATTRIB_DEX: + case attribute_id::ATTRIB_DEX: ModifyPlrDex(pnum, 6); break; - case ATTRIB_VIT: + case attribute_id::ATTRIB_VIT: ModifyPlrVit(pnum, 6); break; } diff --git a/Source/player.cpp b/Source/player.cpp index 76aab8e6d..b241a6680 100644 --- a/Source/player.cpp +++ b/Source/player.cpp @@ -197,7 +197,7 @@ Sint32 PlayerStruct::GetBaseAttributeValue(attribute_id attribute) const Sint32 PlayerStruct::GetMaximumAttributeValue(attribute_id attribute) const { - static const int MaxStats[enum_size::value][4] = { + static const int MaxStats[enum_size::value][enum_size::value] = { // clang-format off { 250, 50, 60, 100 }, { 55, 70, 250, 80 }, @@ -208,7 +208,7 @@ Sint32 PlayerStruct::GetMaximumAttributeValue(attribute_id attribute) const // clang-format on }; - return MaxStats[static_cast(_pClass)][attribute]; + return MaxStats[static_cast(_pClass)][static_cast(attribute)]; } void SetPlayerGPtrs(BYTE *pData, BYTE **pAnim) @@ -802,13 +802,13 @@ void CreatePlayer(int pnum, HeroClass c) int CalcStatDiff(int pnum) { - return plr[pnum].GetMaximumAttributeValue(ATTRIB_STR) + return plr[pnum].GetMaximumAttributeValue(attribute_id::ATTRIB_STR) - plr[pnum]._pBaseStr - + plr[pnum].GetMaximumAttributeValue(ATTRIB_MAG) + + plr[pnum].GetMaximumAttributeValue(attribute_id::ATTRIB_MAG) - plr[pnum]._pBaseMag - + plr[pnum].GetMaximumAttributeValue(ATTRIB_DEX) + + plr[pnum].GetMaximumAttributeValue(attribute_id::ATTRIB_DEX) - plr[pnum]._pBaseDex - + plr[pnum].GetMaximumAttributeValue(ATTRIB_VIT) + + plr[pnum].GetMaximumAttributeValue(attribute_id::ATTRIB_VIT) - plr[pnum]._pBaseVit; } @@ -3493,17 +3493,17 @@ void ValidatePlayer() if (gt != plr[myplr]._pGold) plr[myplr]._pGold = gt; - if (plr[myplr]._pBaseStr > plr[myplr].GetMaximumAttributeValue(ATTRIB_STR)) { - plr[myplr]._pBaseStr = plr[myplr].GetMaximumAttributeValue(ATTRIB_STR); + if (plr[myplr]._pBaseStr > plr[myplr].GetMaximumAttributeValue(attribute_id::ATTRIB_STR)) { + plr[myplr]._pBaseStr = plr[myplr].GetMaximumAttributeValue(attribute_id::ATTRIB_STR); } - if (plr[myplr]._pBaseMag > plr[myplr].GetMaximumAttributeValue(ATTRIB_MAG)) { - plr[myplr]._pBaseMag = plr[myplr].GetMaximumAttributeValue(ATTRIB_MAG); + if (plr[myplr]._pBaseMag > plr[myplr].GetMaximumAttributeValue(attribute_id::ATTRIB_MAG)) { + plr[myplr]._pBaseMag = plr[myplr].GetMaximumAttributeValue(attribute_id::ATTRIB_MAG); } - if (plr[myplr]._pBaseDex > plr[myplr].GetMaximumAttributeValue(ATTRIB_DEX)) { - plr[myplr]._pBaseDex = plr[myplr].GetMaximumAttributeValue(ATTRIB_DEX); + if (plr[myplr]._pBaseDex > plr[myplr].GetMaximumAttributeValue(attribute_id::ATTRIB_DEX)) { + plr[myplr]._pBaseDex = plr[myplr].GetMaximumAttributeValue(attribute_id::ATTRIB_DEX); } - if (plr[myplr]._pBaseVit > plr[myplr].GetMaximumAttributeValue(ATTRIB_VIT)) { - plr[myplr]._pBaseVit = plr[myplr].GetMaximumAttributeValue(ATTRIB_VIT); + if (plr[myplr]._pBaseVit > plr[myplr].GetMaximumAttributeValue(attribute_id::ATTRIB_VIT)) { + plr[myplr]._pBaseVit = plr[myplr].GetMaximumAttributeValue(attribute_id::ATTRIB_VIT); } Uint64 msk = 0; @@ -4052,31 +4052,31 @@ void CheckStats(int p) app_fatal("CheckStats: illegal player %d", p); } - for (int i = ATTRIB_STR; i <= ATTRIB_VIT; i++) { - int maxStatPoint = plr[p].GetMaximumAttributeValue((attribute_id)i); + for (auto i : enum_values()) { + int maxStatPoint = plr[p].GetMaximumAttributeValue(i); switch (i) { - case ATTRIB_STR: + case attribute_id::ATTRIB_STR: if (plr[p]._pBaseStr > maxStatPoint) { plr[p]._pBaseStr = maxStatPoint; } else if (plr[p]._pBaseStr < 0) { plr[p]._pBaseStr = 0; } break; - case ATTRIB_MAG: + case attribute_id::ATTRIB_MAG: if (plr[p]._pBaseMag > maxStatPoint) { plr[p]._pBaseMag = maxStatPoint; } else if (plr[p]._pBaseMag < 0) { plr[p]._pBaseMag = 0; } break; - case ATTRIB_DEX: + case attribute_id::ATTRIB_DEX: if (plr[p]._pBaseDex > maxStatPoint) { plr[p]._pBaseDex = maxStatPoint; } else if (plr[p]._pBaseDex < 0) { plr[p]._pBaseDex = 0; } break; - case ATTRIB_VIT: + case attribute_id::ATTRIB_VIT: if (plr[p]._pBaseVit > maxStatPoint) { plr[p]._pBaseVit = maxStatPoint; } else if (plr[p]._pBaseVit < 0) { @@ -4093,7 +4093,7 @@ void ModifyPlrStr(int p, int l) app_fatal("ModifyPlrStr: illegal player %d", p); } - int max = plr[p].GetMaximumAttributeValue(ATTRIB_STR); + int max = plr[p].GetMaximumAttributeValue(attribute_id::ATTRIB_STR); if (plr[p]._pBaseStr + l > max) { l = max - plr[p]._pBaseStr; } @@ -4120,7 +4120,7 @@ void ModifyPlrMag(int p, int l) app_fatal("ModifyPlrMag: illegal player %d", p); } - int max = plr[p].GetMaximumAttributeValue(ATTRIB_MAG); + int max = plr[p].GetMaximumAttributeValue(attribute_id::ATTRIB_MAG); if (plr[p]._pBaseMag + l > max) { l = max - plr[p]._pBaseMag; } @@ -4155,7 +4155,7 @@ void ModifyPlrDex(int p, int l) app_fatal("ModifyPlrDex: illegal player %d", p); } - int max = plr[p].GetMaximumAttributeValue(ATTRIB_DEX); + int max = plr[p].GetMaximumAttributeValue(attribute_id::ATTRIB_DEX); if (plr[p]._pBaseDex + l > max) { l = max - plr[p]._pBaseDex; } @@ -4179,7 +4179,7 @@ void ModifyPlrVit(int p, int l) app_fatal("ModifyPlrVit: illegal player %d", p); } - int max = plr[p].GetMaximumAttributeValue(ATTRIB_VIT); + int max = plr[p].GetMaximumAttributeValue(attribute_id::ATTRIB_VIT); if (plr[p]._pBaseVit + l > max) { l = max - plr[p]._pBaseVit; } diff --git a/Source/player.h b/Source/player.h index 02ab948d3..733f2aab9 100644 --- a/Source/player.h +++ b/Source/player.h @@ -41,11 +41,14 @@ enum class HeroClass : uint8_t { LAST = Barbarian }; -enum attribute_id : uint8_t { +enum class attribute_id : uint8_t { ATTRIB_STR, ATTRIB_MAG, ATTRIB_DEX, ATTRIB_VIT, + + FIRST = ATTRIB_STR, + LAST = ATTRIB_VIT }; // Logical equipment locations diff --git a/SourceX/miniwin/misc_msg.cpp b/SourceX/miniwin/misc_msg.cpp index af734ef5b..7bfed6bda 100644 --- a/SourceX/miniwin/misc_msg.cpp +++ b/SourceX/miniwin/misc_msg.cpp @@ -48,27 +48,27 @@ void FocusOnCharInfo() // Find the first incrementable stat. int stat = -1; - for (int i = ATTRIB_VIT; i >= ATTRIB_STR; i--) { - int max = plr[myplr].GetMaximumAttributeValue((attribute_id)i); + for (auto i : enum_values()) { + int max = plr[myplr].GetMaximumAttributeValue(i); switch (i) { - case ATTRIB_STR: + case attribute_id::ATTRIB_STR: if (plr[myplr]._pBaseStr >= max) continue; break; - case ATTRIB_MAG: + case attribute_id::ATTRIB_MAG: if (plr[myplr]._pBaseMag >= max) continue; break; - case ATTRIB_DEX: + case attribute_id::ATTRIB_DEX: if (plr[myplr]._pBaseDex >= max) continue; break; - case ATTRIB_VIT: + case attribute_id::ATTRIB_VIT: if (plr[myplr]._pBaseVit >= max) continue; break; } - stat = i; + stat = static_cast(i); } if (stat == -1) return;