Browse Source

♻️ Leverage 'Damage' for '_i[Min|Max]Dam' 'Item' fields

julealgon/Enhancements/DamageStruct
Juliano Leal Goncalves 5 years ago
parent
commit
534f41ceb5
  1. 2
      Source/inv.cpp
  2. 48
      Source/items.cpp
  3. 4
      Source/items.h
  4. 11
      Source/loadsave.cpp
  5. 10
      Source/msg.cpp
  6. 11
      Source/objects.cpp
  7. 2
      Source/stores.cpp

2
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;

48
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) {

4
Source/items.h

@ -7,6 +7,7 @@
#include <cstdint>
#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;

11
Source/loadsave.cpp

@ -235,8 +235,11 @@ void LoadItemData(LoadHelper &file, Item &item)
item._iCurs = file.NextLE<int32_t>();
item._ivalue = file.NextLE<int32_t>();
item._iIvalue = file.NextLE<int32_t>();
item._iMinDam = file.NextLE<int32_t>();
item._iMaxDam = file.NextLE<int32_t>();
auto minDamage = file.NextLE<int32_t>();
auto maxDamage = file.NextLE<int32_t>();
item._iDamage = { minDamage, maxDamage };
item._iAC = file.NextLE<int32_t>();
item._iFlags = file.NextLE<uint32_t>();
item._iMiscId = static_cast<item_misc_id>(file.NextLE<int32_t>());
@ -920,8 +923,8 @@ void SaveItem(SaveHelper &file, const Item &item)
file.WriteLE<int32_t>(item._iCurs);
file.WriteLE<int32_t>(item._ivalue);
file.WriteLE<int32_t>(item._iIvalue);
file.WriteLE<int32_t>(item._iMinDam);
file.WriteLE<int32_t>(item._iMaxDam);
file.WriteLE<int32_t>(item._iDamage.minValue);
file.WriteLE<int32_t>(item._iDamage.maxValue);
file.WriteLE<int32_t>(item._iAC);
file.WriteLE<uint32_t>(item._iFlags);
file.WriteLE<int32_t>(item._iMiscId);

10
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;

11
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;

2
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) {

Loading…
Cancel
Save