From 534f41ceb592c6d9dff5e8cddee08f4342f000df Mon Sep 17 00:00:00 2001 From: Juliano Leal Goncalves Date: Mon, 20 Sep 2021 01:13:02 -0300 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Leverage=20'Damage'=20for?= =?UTF-8?q?=20'=5Fi[Min|Max]Dam'=20'Item'=20fields?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Source/inv.cpp | 2 +- Source/items.cpp | 48 +++++++++++++++++++++------------------------ Source/items.h | 4 ++-- Source/loadsave.cpp | 11 +++++++---- Source/msg.cpp | 10 +++++----- Source/objects.cpp | 11 +++++------ Source/stores.cpp | 2 +- 7 files changed, 43 insertions(+), 45 deletions(-) diff --git a/Source/inv.cpp b/Source/inv.cpp index 18e0f2313..d5ead53f6 100644 --- a/Source/inv.cpp +++ b/Source/inv.cpp @@ -1794,7 +1794,7 @@ int SyncPutItem(Player &player, Point position, int idx, uint16_t icreateinfo, i item._iCharges = ch; item._iMaxCharges = mch; item._iPLToHit = toHit; - item._iMaxDam = maxDam; + item._iDamage.maxValue = maxDam; item._iMinStr = minStr; item._iMinMag = minMag; item._iMinDex = minDex; diff --git a/Source/items.cpp b/Source/items.cpp index 54ad1a41c..878e1fa22 100644 --- a/Source/items.cpp +++ b/Source/items.cpp @@ -1023,8 +1023,7 @@ int SaveItemPower(Item &item, const ItemPower &power) item._iFlags |= ISPL_RNDARROWVEL; break; case IPL_SETDAM: - item._iMinDam = power.param1; - item._iMaxDam = power.param2; + item._iDamage = { power.param1, power.param2 }; break; case IPL_SETDUR: item._iDurability = power.param1; @@ -1838,14 +1837,13 @@ bool ApplyOilToItem(Item &item, Player &player) } break; case IMISC_OILSHARP: - if (item._iMaxDam - item._iMinDam < 30) { - item._iMaxDam = item._iMaxDam + 1; + if (item._iDamage.maxValue - item._iDamage.minValue < 30) { + item._iDamage += { 0, 1 }; } break; case IMISC_OILDEATH: - if (item._iMaxDam - item._iMinDam < 30) { - item._iMinDam = item._iMinDam + 1; - item._iMaxDam = item._iMaxDam + 2; + if (item._iDamage.maxValue - item._iDamage.minValue < 30) { + item._iDamage += { 1, 2 }; } break; case IMISC_OILSKILL: @@ -2661,8 +2659,8 @@ void CalcPlrItemVals(Player &player, bool loadgfx) for (auto &item : player.InvBody) { if (!item.isEmpty() && item._iStatFlag) { - mind += item._iMinDam; - maxd += item._iMaxDam; + mind += item._iDamage.minValue; + maxd += item._iDamage.maxValue; tac += item._iAC; if (item._iSpell != SPL_NULL) { @@ -3003,8 +3001,7 @@ void SetPlrHandItem(Item &item, int itemData) strcpy(item._iIName, _(pAllItem.iName)); item._iLoc = pAllItem.iLoc; item._iClass = pAllItem.iClass; - item._iMinDam = pAllItem.iMinDam; - item._iMaxDam = pAllItem.iMaxDam; + item._iDamage = { pAllItem.iMinDam, pAllItem.iMaxDam }; item._iAC = pAllItem.iMinAC; item._iMiscId = pAllItem.iMiscId; item._iSpell = pAllItem.iSpell; @@ -3259,8 +3256,7 @@ void GetItemAttrs(Item &item, int itemData, int lvl) strcpy(item._iIName, _(AllItemsList[itemData].iName)); item._iLoc = AllItemsList[itemData].iLoc; item._iClass = AllItemsList[itemData].iClass; - item._iMinDam = AllItemsList[itemData].iMinDam; - item._iMaxDam = AllItemsList[itemData].iMaxDam; + item._iDamage = { AllItemsList[itemData].iMinDam, AllItemsList[itemData].iMaxDam }; item._iAC = AllItemsList[itemData].iMinAC + GenerateRnd(AllItemsList[itemData].iMaxAC - AllItemsList[itemData].iMinAC + 1); item._iFlags = AllItemsList[itemData].iFlags; item._iMiscId = AllItemsList[itemData].iMiscId; @@ -4138,16 +4134,16 @@ void DrawUniqueInfo(const Surface &out) void PrintItemDetails(Item *x) { if (x->_iClass == ICLASS_WEAPON) { - if (x->_iMinDam == x->_iMaxDam) { + if (x->_iDamage.IsFixed()) { if (x->_iMaxDur == DUR_INDESTRUCTIBLE) - strcpy(tempstr, fmt::format(_("damage: {:d} Indestructible"), x->_iMinDam).c_str()); + strcpy(tempstr, fmt::format(_("damage: {:d} Indestructible"), x->_iDamage.minValue).c_str()); else - strcpy(tempstr, fmt::format(_(/* TRANSLATORS: Dur: is durability */ "damage: {:d} Dur: {:d}/{:d}"), x->_iMinDam, x->_iDurability, x->_iMaxDur).c_str()); + strcpy(tempstr, fmt::format(_(/* TRANSLATORS: Dur: is durability */ "damage: {:d} Dur: {:d}/{:d}"), x->_iDamage.minValue, x->_iDurability, x->_iMaxDur).c_str()); } else { if (x->_iMaxDur == DUR_INDESTRUCTIBLE) - strcpy(tempstr, fmt::format(_("damage: {:d}-{:d} Indestructible"), x->_iMinDam, x->_iMaxDam).c_str()); + strcpy(tempstr, fmt::format(_("damage: {:d}-{:d} Indestructible"), x->_iDamage.minValue, x->_iDamage.maxValue).c_str()); else - strcpy(tempstr, fmt::format(_(/* TRANSLATORS: Dur: is durability */ "damage: {:d}-{:d} Dur: {:d}/{:d}"), x->_iMinDam, x->_iMaxDam, x->_iDurability, x->_iMaxDur).c_str()); + strcpy(tempstr, fmt::format(_(/* TRANSLATORS: Dur: is durability */ "damage: {:d}-{:d} Dur: {:d}/{:d}"), x->_iDamage.minValue, x->_iDamage.maxValue, x->_iDurability, x->_iMaxDur).c_str()); } AddPanelString(tempstr); } @@ -4159,10 +4155,10 @@ void PrintItemDetails(Item *x) AddPanelString(tempstr); } if (x->_iMiscId == IMISC_STAFF && x->_iMaxCharges != 0) { - if (x->_iMinDam == x->_iMaxDam) - strcpy(tempstr, fmt::format(_(/* TRANSLATORS: dam: is damage Dur: is durability */ "dam: {:d} Dur: {:d}/{:d}"), x->_iMinDam, x->_iDurability, x->_iMaxDur).c_str()); + if (x->_iDamage.IsFixed()) + strcpy(tempstr, fmt::format(_(/* TRANSLATORS: dam: is damage Dur: is durability */ "dam: {:d} Dur: {:d}/{:d}"), x->_iDamage.minValue, x->_iDurability, x->_iMaxDur).c_str()); else - strcpy(tempstr, fmt::format(_(/* TRANSLATORS: dam: is damage Dur: is durability */ "dam: {:d}-{:d} Dur: {:d}/{:d}"), x->_iMinDam, x->_iMaxDam, x->_iDurability, x->_iMaxDur).c_str()); + strcpy(tempstr, fmt::format(_(/* TRANSLATORS: dam: is damage Dur: is durability */ "dam: {:d}-{:d} Dur: {:d}/{:d}"), x->_iDamage.minValue, x->_iDamage.maxValue, x->_iDurability, x->_iMaxDur).c_str()); strcpy(tempstr, fmt::format(_("Charges: {:d}/{:d}"), x->_iCharges, x->_iMaxCharges).c_str()); AddPanelString(tempstr); } @@ -4185,16 +4181,16 @@ void PrintItemDetails(Item *x) void PrintItemDur(Item *x) { if (x->_iClass == ICLASS_WEAPON) { - if (x->_iMinDam == x->_iMaxDam) { + if (x->_iDamage.IsFixed()) { if (x->_iMaxDur == DUR_INDESTRUCTIBLE) - strcpy(tempstr, fmt::format(_("damage: {:d} Indestructible"), x->_iMinDam).c_str()); + strcpy(tempstr, fmt::format(_("damage: {:d} Indestructible"), x->_iDamage.minValue).c_str()); else - strcpy(tempstr, fmt::format(_("damage: {:d} Dur: {:d}/{:d}"), x->_iMinDam, x->_iDurability, x->_iMaxDur).c_str()); + strcpy(tempstr, fmt::format(_("damage: {:d} Dur: {:d}/{:d}"), x->_iDamage.minValue, x->_iDurability, x->_iMaxDur).c_str()); } else { if (x->_iMaxDur == DUR_INDESTRUCTIBLE) - strcpy(tempstr, fmt::format(_("damage: {:d}-{:d} Indestructible"), x->_iMinDam, x->_iMaxDam).c_str()); + strcpy(tempstr, fmt::format(_("damage: {:d}-{:d} Indestructible"), x->_iDamage.minValue, x->_iDamage.maxValue).c_str()); else - strcpy(tempstr, fmt::format(_("damage: {:d}-{:d} Dur: {:d}/{:d}"), x->_iMinDam, x->_iMaxDam, x->_iDurability, x->_iMaxDur).c_str()); + strcpy(tempstr, fmt::format(_("damage: {:d}-{:d} Dur: {:d}/{:d}"), x->_iDamage.minValue, x->_iDamage.maxValue, x->_iDurability, x->_iMaxDur).c_str()); } AddPanelString(tempstr); if (x->_iMiscId == IMISC_STAFF && x->_iMaxCharges > 0) { diff --git a/Source/items.h b/Source/items.h index cde37819a..f0feb1039 100644 --- a/Source/items.h +++ b/Source/items.h @@ -7,6 +7,7 @@ #include +#include "damage.hpp" #include "DiabloUI/ui_item.h" #include "engine/animationinfo.h" #include "engine/point.hpp" @@ -194,8 +195,7 @@ struct Item { uint8_t _iCurs; int _ivalue; int _iIvalue; - uint8_t _iMinDam; - uint8_t _iMaxDam; + Damage _iDamage; int16_t _iAC; uint32_t _iFlags; // item_special_effect enum item_misc_id _iMiscId; diff --git a/Source/loadsave.cpp b/Source/loadsave.cpp index c6b6f10ad..f10dd3637 100644 --- a/Source/loadsave.cpp +++ b/Source/loadsave.cpp @@ -235,8 +235,11 @@ void LoadItemData(LoadHelper &file, Item &item) item._iCurs = file.NextLE(); item._ivalue = file.NextLE(); item._iIvalue = file.NextLE(); - item._iMinDam = file.NextLE(); - item._iMaxDam = file.NextLE(); + + auto minDamage = file.NextLE(); + auto maxDamage = file.NextLE(); + item._iDamage = { minDamage, maxDamage }; + item._iAC = file.NextLE(); item._iFlags = file.NextLE(); item._iMiscId = static_cast(file.NextLE()); @@ -920,8 +923,8 @@ void SaveItem(SaveHelper &file, const Item &item) file.WriteLE(item._iCurs); file.WriteLE(item._ivalue); file.WriteLE(item._iIvalue); - file.WriteLE(item._iMinDam); - file.WriteLE(item._iMaxDam); + file.WriteLE(item._iDamage.minValue); + file.WriteLE(item._iDamage.maxValue); file.WriteLE(item._iAC); file.WriteLE(item._iFlags); file.WriteLE(item._iMiscId); diff --git a/Source/msg.cpp b/Source/msg.cpp index f47fb942b..d070d674d 100644 --- a/Source/msg.cpp +++ b/Source/msg.cpp @@ -1977,7 +1977,7 @@ void DeltaAddItem(int ii) pD->bMCh = Items[ii]._iMaxCharges; pD->wValue = Items[ii]._ivalue; pD->wToHit = Items[ii]._iPLToHit; - pD->wMaxDam = Items[ii]._iMaxDam; + pD->wMaxDam = Items[ii]._iDamage.maxValue; pD->bMinStr = Items[ii]._iMinStr; pD->bMinMag = Items[ii]._iMinMag; pD->bMinDex = Items[ii]._iMinDex; @@ -2117,7 +2117,7 @@ void DeltaLoadLevel() item._iCharges = sgLevels[currlevel].item[i].bCh; item._iMaxCharges = sgLevels[currlevel].item[i].bMCh; item._iPLToHit = sgLevels[currlevel].item[i].wToHit; - item._iMaxDam = sgLevels[currlevel].item[i].wMaxDam; + item._iDamage.maxValue = sgLevels[currlevel].item[i].wMaxDam; item._iMinStr = sgLevels[currlevel].item[i].bMinStr; item._iMinMag = sgLevels[currlevel].item[i].bMinMag; item._iMinDex = sgLevels[currlevel].item[i].bMinDex; @@ -2361,7 +2361,7 @@ void NetSendCmdGItem(bool bHiPri, _cmd_id bCmd, BYTE mast, BYTE pnum, BYTE ii) cmd.bMCh = Items[ii]._iMaxCharges; cmd.wValue = Items[ii]._ivalue; cmd.wToHit = Items[ii]._iPLToHit; - cmd.wMaxDam = Items[ii]._iMaxDam; + cmd.wMaxDam = Items[ii]._iDamage.maxValue; cmd.bMinStr = Items[ii]._iMinStr; cmd.bMinMag = Items[ii]._iMinMag; cmd.bMinDex = Items[ii]._iMinDex; @@ -2405,7 +2405,7 @@ void NetSendCmdPItem(bool bHiPri, _cmd_id bCmd, Point position) cmd.bMCh = myPlayer.HoldItem._iMaxCharges; cmd.wValue = myPlayer.HoldItem._ivalue; cmd.wToHit = myPlayer.HoldItem._iPLToHit; - cmd.wMaxDam = myPlayer.HoldItem._iMaxDam; + cmd.wMaxDam = myPlayer.HoldItem._iDamage.maxValue; cmd.bMinStr = myPlayer.HoldItem._iMinStr; cmd.bMinMag = myPlayer.HoldItem._iMinMag; cmd.bMinDex = myPlayer.HoldItem._iMinDex; @@ -2480,7 +2480,7 @@ void NetSendCmdDItem(bool bHiPri, int ii) cmd.bMCh = Items[ii]._iMaxCharges; cmd.wValue = Items[ii]._ivalue; cmd.wToHit = Items[ii]._iPLToHit; - cmd.wMaxDam = Items[ii]._iMaxDam; + cmd.wMaxDam = Items[ii]._iDamage.maxValue; cmd.bMinStr = Items[ii]._iMinStr; cmd.bMinMag = Items[ii]._iMinMag; cmd.bMinDex = Items[ii]._iMinDex; diff --git a/Source/objects.cpp b/Source/objects.cpp index 1b30e38e4..d272c7a07 100644 --- a/Source/objects.cpp +++ b/Source/objects.cpp @@ -2683,9 +2683,8 @@ bool OperateShrineGloomy(int pnum) case ItemType::Bow: case ItemType::Mace: case ItemType::Staff: - item._iMaxDam--; - if (item._iMaxDam < item._iMinDam) - item._iMaxDam = item._iMinDam; + if (!item._iDamage.IsFixed()) + item._iDamage -= { 0, 1 }; break; case ItemType::Shield: case ItemType::Helm: @@ -2714,9 +2713,9 @@ bool OperateShrineWeird(int pnum) auto &player = Players[pnum]; if (!player.InvBody[INVLOC_HAND_LEFT].isEmpty() && player.InvBody[INVLOC_HAND_LEFT]._itype != ItemType::Shield) - player.InvBody[INVLOC_HAND_LEFT]._iMaxDam++; + player.InvBody[INVLOC_HAND_LEFT]._iDamage += { 0, 1 }; if (!player.InvBody[INVLOC_HAND_RIGHT].isEmpty() && player.InvBody[INVLOC_HAND_RIGHT]._itype != ItemType::Shield) - player.InvBody[INVLOC_HAND_RIGHT]._iMaxDam++; + player.InvBody[INVLOC_HAND_RIGHT]._iDamage += { 0, 1 }; for (int j = 0; j < player._pNumInv; j++) { switch (player.InvList[j]._itype) { @@ -2725,7 +2724,7 @@ bool OperateShrineWeird(int pnum) case ItemType::Bow: case ItemType::Mace: case ItemType::Staff: - player.InvList[j]._iMaxDam++; + player.InvList[j]._iDamage += { 0, 1 }; break; default: break; diff --git a/Source/stores.cpp b/Source/stores.cpp index 0ae198ba8..67cfb0e7a 100644 --- a/Source/stores.cpp +++ b/Source/stores.cpp @@ -192,7 +192,7 @@ void PrintStoreItem(Item *x, int l, UiFlags flags) } sstr[0] = '\0'; if (x->_iClass == ICLASS_WEAPON) - strcpy(sstr, fmt::format(_("Damage: {:d}-{:d} "), x->_iMinDam, x->_iMaxDam).c_str()); + strcpy(sstr, fmt::format(_("Damage: {:d}-{:d} "), x->_iDamage.minValue, x->_iDamage.maxValue).c_str()); if (x->_iClass == ICLASS_ARMOR) strcpy(sstr, fmt::format(_("Armor: {:d} "), x->_iAC).c_str()); if (x->_iMaxDur != DUR_INDESTRUCTIBLE && x->_iMaxDur != 0) {