[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