[Scummvm-git-logs] scummvm master -> 764be8d584b56e5c267d8203502d34933782687b
dreammaster
noreply at scummvm.org
Wed Apr 12 05:51:13 UTC 2023
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
764be8d584 MM: MM1: Items data update
Commit: 764be8d584b56e5c267d8203502d34933782687b
https://github.com/scummvm/scummvm/commit/764be8d584b56e5c267d8203502d34933782687b
Author: filasfilas (filas at mail.ru)
Date: 2023-04-11T22:51:08-07:00
Commit Message:
MM: MM1: Items data update
Changed paths:
engines/mm/mm1/data/items.cpp
engines/mm/mm1/data/items.h
engines/mm/mm1/game/equip_remove.cpp
engines/mm/mm1/game/equip_remove.h
engines/mm/mm1/game/use_item.cpp
engines/mm/mm1/game/use_item.h
engines/mm/mm1/maps/map27.cpp
engines/mm/mm1/views/locations/temple.cpp
engines/mm/mm1/views_enh/locations/temple.cpp
diff --git a/engines/mm/mm1/data/items.cpp b/engines/mm/mm1/data/items.cpp
index 117f5b3ba02..49c94cc0337 100644
--- a/engines/mm/mm1/data/items.cpp
+++ b/engines/mm/mm1/data/items.cpp
@@ -51,14 +51,17 @@ bool ItemsArray::load() {
item._name.deleteLastChar();
item._disablements = getNextValue(line);
- item._equipMode = (EquipMode)getNextValue(line);
- item._val10 = getNextValue(line);
- item._effectId = getNextValue(line);
- item._spellId = getNextValue(line);
+ item._constBonus_id = getNextValue(line);
+ item._constBonus_value = getNextValue(line);
+ item._tempBonus_id = getNextValue(line);
+
+ if (item._tempBonus_id != 0xff) {item._tempBonus_value = getNextValue(line);}
+ else {item._spellId = getNextValue(line);}
+
item._maxCharges = getNextValue(line);
item._cost = getNextValue(line);
- item._val16 = getNextValue(line);
- item._val17 = getNextValue(line);
+ item._damage = getNextValue(line);
+ item._AC_Dmg = getNextValue(line);
}
return true;
diff --git a/engines/mm/mm1/data/items.h b/engines/mm/mm1/data/items.h
index 351333891b5..ddcb2fe0f4f 100644
--- a/engines/mm/mm1/data/items.h
+++ b/engines/mm/mm1/data/items.h
@@ -73,7 +73,7 @@ enum ItemCategory {
};
enum EquipMode {
- EQUIPMODE_0 = 0, IS_EQUIPPABLE = 1,
+ NO_EQUIP_BONUS = 0, IS_EQUIPPABLE = 1,
EQUIP_CURSED = 0xff
};
@@ -84,14 +84,15 @@ enum TransferKind {
struct ItemData {
byte _disablements = 0;
- EquipMode _equipMode = EQUIPMODE_0;
- byte _val10 = 0;
- byte _effectId = 0;
+ byte _constBonus_id = 0; // id equals to character characteristic id, except special "EquipMode" values
+ byte _constBonus_value = 0; // value to be added to character characteristic
+ byte _tempBonus_id = 0; // id equals to character characteristic id, except 0xff
+ byte _tempBonus_value = 0; // value to be added to character characteristic
byte _spellId = 0;
- byte _maxCharges = 0;
+ byte _maxCharges = 0; // for spells and tempBonus
uint16 _cost = 0;
- byte _val16 = 0;
- byte _val17 = 0;
+ byte _damage = 0;
+ byte _AC_Dmg = 0; //it is AC for armor and additional damage for weapon
};
struct Item : public ItemData {
diff --git a/engines/mm/mm1/game/equip_remove.cpp b/engines/mm/mm1/game/equip_remove.cpp
index 7bbb51607c8..4907b77f1a8 100644
--- a/engines/mm/mm1/game/equip_remove.cpp
+++ b/engines/mm/mm1/game/equip_remove.cpp
@@ -85,7 +85,7 @@ bool EquipRemove::equipItem(int index, Common::Point &textPos, Common::String &e
}
if (equipError.empty()) {
- if (item._equipMode == IS_EQUIPPABLE) {
+ if (item._constBonus_id == IS_EQUIPPABLE) {
equipError = STRING["dialogs.character.not_equipped"];
textPos.x = 10;
}
@@ -134,12 +134,12 @@ bool EquipRemove::equipItem(int index, Common::Point &textPos, Common::String &e
c._backpack.removeAt(index);
uint freeIndex = c._equipped.add(itemId, charges);
- if (item._equipMode != EQUIPMODE_0) {
- if (item._equipMode == IS_EQUIPPABLE) {
+ if (item._constBonus_id != NO_EQUIP_BONUS) {
+ if (item._constBonus_id == IS_EQUIPPABLE) {
equipError = STRING["dialogs.character.not_equipped"];
textPos.x = 10;
- } else if (item._equipMode == EQUIP_CURSED) {
- c._equipped[freeIndex]._charges += item._val10;
+ } else if (item._constBonus_id == EQUIP_CURSED) {
+ c._equipped[freeIndex]._charges += item._constBonus_value;
}
}
}
@@ -147,19 +147,22 @@ bool EquipRemove::equipItem(int index, Common::Point &textPos, Common::String &e
if (!equipError.empty())
return false;
+ //add const equip bonus to character parameters
+ applyEquipBonus(item._constBonus_id, item._constBonus_value);
+
switch (getItemCategory(itemId)) {
case ITEMCAT_WEAPON:
case ITEMCAT_TWO_HANDED:
- c._physicalAttr._base = item._val16;
- c._physicalAttr._current = item._val17;
+ c._physicalAttr._base = item._damage;
+ c._physicalAttr._current = item._AC_Dmg;
break;
case ITEMCAT_MISSILE:
- c._missileAttr._base = item._val16;
- c._missileAttr._current = item._val17;
+ c._missileAttr._base = item._damage;
+ c._missileAttr._current = item._AC_Dmg;
break;
case ITEMCAT_ARMOR:
case ITEMCAT_SHIELD:
- c._ac._base += item._val17;
+ c._ac._base += item._AC_Dmg;
break;
default:
break;
@@ -178,7 +181,7 @@ bool EquipRemove::removeItem(int index, Common::Point &textPos, Common::String &
g_globals->_items.getItem(itemId);
const Item &item = g_globals->_currItem;
- if (item._equipMode == EQUIP_CURSED) {
+ if (item._constBonus_id == EQUIP_CURSED) {
removeError = STRING["dialogs.character.cursed"];
textPos.x = 13;
} else if (c._backpack.full()) {
@@ -193,11 +196,14 @@ bool EquipRemove::removeItem(int index, Common::Point &textPos, Common::String &
c._equipped.removeAt(index);
c._backpack.add(itemId, charges);
- if (item._val10) {
+ if (item._constBonus_value) {
// TODO: _equipMode is used as a character offset. Need to
// find an example that calls it so I know what area of
// the character updates are being done to
- error("TODO: item flag in remove item");
+ //error("TODO: item flag in remove item");
+
+ //substract const equip bonus from character parameters
+ applyEquipBonus(item._constBonus_id, -item._constBonus_value);
}
switch (getItemCategory(itemId)) {
@@ -210,7 +216,7 @@ bool EquipRemove::removeItem(int index, Common::Point &textPos, Common::String &
break;
case ITEMCAT_ARMOR:
case ITEMCAT_SHIELD:
- c._ac._base = MAX((int)c._ac._base - (int)item._val17, 0);
+ c._ac._base = MAX((int)c._ac._base - (int)item._AC_Dmg, 0);
break;
default:
break;
@@ -219,6 +225,34 @@ bool EquipRemove::removeItem(int index, Common::Point &textPos, Common::String &
return true;
}
+void EquipRemove::applyEquipBonus(int id, int value){
+ if ((id<2)||(id>=0xff)) return;
+ Character &c = *g_globals->_currCharacter;
+
+ // TODO: check strange cases (decimal id numbers): 16, 19
+ switch (id) {
+ //case 16: c.sex = NONE; break; //UNOBTAINIUM
+ // case 19: c._luck._race = NONE; break; //JADE AMULET
+ case 21: c._intelligence._base += value; break;
+ case 23: c._might._base += value; break;
+ case 25: c._personality._base += value; break;
+ case 29: c._speed._base += value; break;
+ case 31: c._accuracy._base += value; break;
+ case 33: c._luck._base += value; break;
+ case 37: c._age._current += value; break;
+ case 60: c._ac._base += value; break;
+ case 88: c._resistances._s._magic._base += value; break;
+ case 90: c._resistances._s._fire._base += value; break;
+ case 92: c._resistances._s._cold._base += value; break;
+ case 94: c._resistances._s._electricity._base += value; break;
+ case 96: c._resistances._s._acid._base += value; break;
+ case 98: c._resistances._s._fear._base += value; break;
+ case 100: c._resistances._s._poison._base += value; break;
+ case 102: c._resistances._s._psychic._base += value; break; //resistance to sleep
+ case 108: c._trapCtr += value; break;
+ }
+}
+
} // namespace Game
} // namespace MM1
diff --git a/engines/mm/mm1/game/equip_remove.h b/engines/mm/mm1/game/equip_remove.h
index dd3dfb4957e..29e570264d3 100644
--- a/engines/mm/mm1/game/equip_remove.h
+++ b/engines/mm/mm1/game/equip_remove.h
@@ -38,6 +38,12 @@ struct EquipRemove {
* Remove an item
*/
bool removeItem(int index, Common::Point &textPos, Common::String &removeError);
+
+ /**
+ * apply an equip bonus on a current character
+ */
+ void applyEquipBonus(int id, int value);
+
};
} // namespace Game
diff --git a/engines/mm/mm1/game/use_item.cpp b/engines/mm/mm1/game/use_item.cpp
index 77f8ed025a2..ba56cdd98f0 100644
--- a/engines/mm/mm1/game/use_item.cpp
+++ b/engines/mm/mm1/game/use_item.cpp
@@ -20,6 +20,7 @@
*/
#include "mm/mm1/game/use_item.h"
+#include "mm/mm1/game/equip_remove.h"
#include "mm/mm1/game/combat.h"
#include "mm/mm1/game/spells_party.h"
#include "mm/mm1/globals.h"
@@ -34,21 +35,23 @@ Common::String UseItem::combatUseItem(Inventory &inv, Inventory::Entry &invEntry
Common::String msg;
Item *item = g_globals->_items.getItem(invEntry._id);
- if (!item->_effectId) {
+ if (!item->_tempBonus_id) {
msg = STRING["dialogs.character.use_combat.no_special_power"];
- } else if (item->_equipMode == IS_EQUIPPABLE || isEquipped) {
+ } else if (item->_constBonus_id == IS_EQUIPPABLE || isEquipped) {
if (invEntry._charges) {
g_globals->_combatEffectCtr++;
inv.removeCharge(&invEntry);
- if (item->_effectId == 0xff) {
+ if (item->_tempBonus_id == 0xff) {
setSpell(item->_spellId, 0, 0);
Game::SpellsParty::cast(_spellIndex, g_globals->_currCharacter);
} else {
// TODO: find out area of Character _effectId is used as an offset for
- error("TODO: _effectId used as a character offset to increase attribute?");
+ //error("TODO: _effectId used as a character offset to increase attribute?");
+ //add temporary equip bonus to character parameters
+ applyItemBonus(item->_tempBonus_id, item->_tempBonus_value);
if (g_globals->_combatEffectCtr)
(isEquipped ? &g_globals->_currCharacter->_equipped :
@@ -75,21 +78,23 @@ Common::String UseItem::nonCombatUseItem(Inventory &inv, Inventory::Entry &invEn
Common::String msg;
Item *item = g_globals->_items.getItem(invEntry._id);
- if (!item->_effectId) {
+ if (!item->_tempBonus_id) {
msg = STRING["dialogs.character.use_noncombat.no_special_power"];
- } else if (item->_equipMode == IS_EQUIPPABLE || isEquipped) {
+ } else if (item->_constBonus_id == IS_EQUIPPABLE || isEquipped) {
if (invEntry._charges) {
g_globals->_nonCombatEffectCtr++;
inv.removeCharge(&invEntry);
- if (item->_effectId == 0xff) {
+ if (item->_tempBonus_id== 0xff) {
setSpell(item->_spellId, 0, 0);
Game::SpellsParty::cast(_spellIndex, g_globals->_currCharacter);
} else {
// TODO: find out area of Character _effectId is used as an offset for
- error("TODO: _effectId used as a character offset to increase attribute?");
+ //error("TODO: _effectId used as a character offset to increase attribute?");
+ //add temorary equip bonus to character parameters
+ applyItemBonus (item->_tempBonus_id, item->_tempBonus_value);
if (g_globals->_nonCombatEffectCtr)
(isEquipped ? &g_globals->_currCharacter->_equipped :
@@ -109,6 +114,27 @@ Common::String UseItem::nonCombatUseItem(Inventory &inv, Inventory::Entry &invEn
return msg;
}
+void UseItem::applyItemBonus(int id, int value){
+ if ((id<2)||(id>=0xff)) return;
+ Character &c = *g_globals->_currCharacter;
+ switch (id) {
+ case 24: c._might._current += value; break;
+ case 30: c._speed._current += value; break;
+ case 32: c._accuracy._current += value; break;
+ case 34: c._luck._current += value; break;
+ case 36: c._level._current += value; break;
+ case 37: c._age._current += value; break;
+ case 43: c._sp._current += value; break;
+ case 48: c._spellLevel._current += value; break;
+ case 49: c._gems += value; break;
+ case 58: c._gold += 255*value; break;
+ case 62: c._food += value; break;
+ case 89: c._resistances._s._magic._current += value; break;
+ case 99: c._resistances._s._fear._current += value; break;
+ }
+}
+
+
} // namespace Game
} // namespace MM1
} // namespace MM
diff --git a/engines/mm/mm1/game/use_item.h b/engines/mm/mm1/game/use_item.h
index b897d8bc1c9..5dd32787c37 100644
--- a/engines/mm/mm1/game/use_item.h
+++ b/engines/mm/mm1/game/use_item.h
@@ -40,6 +40,11 @@ public:
* Using an item outside of combat
*/
Common::String nonCombatUseItem(Inventory &inv, Inventory::Entry &invEntry, bool isEquipped);
+
+ /**
+ * Apply item to a character parameter
+ */
+ void applyItemBonus(int id, int value);
};
} // namespace Game
diff --git a/engines/mm/mm1/maps/map27.cpp b/engines/mm/mm1/maps/map27.cpp
index 1c104807d90..69a2163e82b 100644
--- a/engines/mm/mm1/maps/map27.cpp
+++ b/engines/mm/mm1/maps/map27.cpp
@@ -114,7 +114,7 @@ void Map27::special04() {
for (int itemNum = (int)inv.size() - 1; itemNum >= 0; --itemNum) {
Item *item = g_globals->_items.getItem(c._equipped[itemNum]._id);
- if (item->_equipMode == EQUIP_CURSED)
+ if (item->_constBonus_id == EQUIP_CURSED)
inv.removeAt(itemNum);
}
}
diff --git a/engines/mm/mm1/views/locations/temple.cpp b/engines/mm/mm1/views/locations/temple.cpp
index 8a930899ceb..f493d9bc216 100644
--- a/engines/mm/mm1/views/locations/temple.cpp
+++ b/engines/mm/mm1/views/locations/temple.cpp
@@ -119,7 +119,7 @@ void Temple::changeCharacter(uint index) {
_uncurseCost = UNCURSE_COST[townNum];
for (i = 0; i < INVENTORY_COUNT; ++i) {
if (c._equipped[i]) {
- if (g_globals->_items.getItem(c._equipped[i])->_equipMode == EQUIP_CURSED)
+ if (g_globals->_items.getItem(c._equipped[i])->_constBonus_id == EQUIP_CURSED)
break;
}
}
@@ -185,7 +185,7 @@ void Temple::uncurseItems() {
for (int i = 0; i < INVENTORY_COUNT; ++i) {
if (c._equipped[i]) {
g_globals->_items.getItem(c._equipped[i]);
- if (g_globals->_currItem._equipMode == EQUIP_CURSED) {
+ if (g_globals->_currItem._constBonus_id == EQUIP_CURSED) {
c._equipped.removeAt(i);
--i;
}
diff --git a/engines/mm/mm1/views_enh/locations/temple.cpp b/engines/mm/mm1/views_enh/locations/temple.cpp
index a3521266e12..31bd43f6c08 100644
--- a/engines/mm/mm1/views_enh/locations/temple.cpp
+++ b/engines/mm/mm1/views_enh/locations/temple.cpp
@@ -143,7 +143,7 @@ void Temple::updateCosts() {
_uncurseCost = UNCURSE_COST[townNum];
for (i = 0; i < INVENTORY_COUNT; ++i) {
if (c._equipped[i]) {
- if (g_globals->_items.getItem(c._equipped[i])->_equipMode == EQUIP_CURSED)
+ if (g_globals->_items.getItem(c._equipped[i])->_constBonus_id == EQUIP_CURSED)
break;
}
}
@@ -178,7 +178,7 @@ void Temple::uncurseItems() {
for (int i = 0; i < INVENTORY_COUNT; ++i) {
if (c._equipped[i]) {
g_globals->_items.getItem(c._equipped[i]);
- if (g_globals->_currItem._equipMode == EQUIP_CURSED) {
+ if (g_globals->_currItem._constBonus_id == EQUIP_CURSED) {
c._equipped.removeAt(i);
--i;
}
More information about the Scummvm-git-logs
mailing list