[Scummvm-git-logs] scummvm master -> fbfc3577a9a33b86706a1906d1d2baacb9cee907

dreammaster noreply at scummvm.org
Thu Mar 30 03:20:55 UTC 2023


This automated email contains information about 6 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
d6e3ed0e0f MM: MM1: Enable combat character info
ede17241b1 MM: MM1: Don't reset inventory area after doing trade
83ca8a4ce4 MM: MM1: Split use item logic into it's own class
3a98f3acc4 MM: MM1: Added UseItem to enhanced inventory view
69a4edff7f MM: MM1: Change disableAttacks view casting to a game message
fbfc3577a9 MM: MM1: Don't show equip/remove inventory buttons when in combat


Commit: d6e3ed0e0fa1ad8d588e59d6a0e86e3f241beb5a
    https://github.com/scummvm/scummvm/commit/d6e3ed0e0fa1ad8d588e59d6a0e86e3f241beb5a
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2023-03-29T19:54:28-07:00

Commit Message:
MM: MM1: Enable combat character info

Changed paths:
    engines/mm/mm1/views_enh/character_info.h
    engines/mm/mm1/views_enh/combat.cpp
    engines/mm/mm1/views_enh/dialogs.h


diff --git a/engines/mm/mm1/views_enh/character_info.h b/engines/mm/mm1/views_enh/character_info.h
index ef8baac9733..7e4f0912e02 100644
--- a/engines/mm/mm1/views_enh/character_info.h
+++ b/engines/mm/mm1/views_enh/character_info.h
@@ -84,6 +84,15 @@ public:
 	void draw() override;
 };
 
+class CharacterInfoCombat : public CharacterInfo {
+public:
+	CharacterInfoCombat() : CharacterInfo() {
+		_name = "CharacterViewCombat";
+	}
+	virtual ~CharacterInfoCombat() {
+	}
+};
+
 } // namespace ViewsEnh
 } // namespace MM1
 } // namespace MM
diff --git a/engines/mm/mm1/views_enh/combat.cpp b/engines/mm/mm1/views_enh/combat.cpp
index ca5b82f4e87..ebb76e69330 100644
--- a/engines/mm/mm1/views_enh/combat.cpp
+++ b/engines/mm/mm1/views_enh/combat.cpp
@@ -308,6 +308,7 @@ bool Combat::msgAction(const ActionMessage &msg) {
 				if (g_globals->_combatParty[charNum] != g_globals->_currCharacter)
 					exchangeWith(charNum);
 			} else {
+				clearBottom();
 				g_globals->_currCharacter = g_globals->_combatParty[charNum];
 				addView("CharacterViewCombat");
 			}
diff --git a/engines/mm/mm1/views_enh/dialogs.h b/engines/mm/mm1/views_enh/dialogs.h
index 60e6b8f1fb0..b9fb86da23d 100644
--- a/engines/mm/mm1/views_enh/dialogs.h
+++ b/engines/mm/mm1/views_enh/dialogs.h
@@ -77,6 +77,7 @@ private:
 	ViewsEnh::Spells::CastSpell _castSpell;
 	ViewsEnh::Spells::Spellbook _spellbook;
 	ViewsEnh::CharacterInfo _characterInfo;
+	ViewsEnh::CharacterInfoCombat _characterInfoCombat;
 	ViewsEnh::CharacterInventory _characterInventory;
 	ViewsEnh::CharacterSelect _characterSelect;
 	ViewsEnh::Characters _characters;


Commit: ede17241b143f4b5f3cb46a062faffb81139e496
    https://github.com/scummvm/scummvm/commit/ede17241b143f4b5f3cb46a062faffb81139e496
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2023-03-29T19:54:28-07:00

Commit Message:
MM: MM1: Don't reset inventory area after doing trade

Changed paths:
    engines/mm/mm1/views_enh/character_inventory.cpp


diff --git a/engines/mm/mm1/views_enh/character_inventory.cpp b/engines/mm/mm1/views_enh/character_inventory.cpp
index 23ab5868a94..7fdfa4ad3b4 100644
--- a/engines/mm/mm1/views_enh/character_inventory.cpp
+++ b/engines/mm/mm1/views_enh/character_inventory.cpp
@@ -20,6 +20,8 @@
  */
 
 #include "mm/mm1/views_enh/character_inventory.h"
+#include "mm/mm1/views_enh/game_messages.h"
+#include "mm/mm1/views_enh/trade.h"
 #include "mm/mm1/views_enh/which_item.h"
 #include "mm/mm1/data/locations.h"
 #include "mm/mm1/globals.h"
@@ -44,7 +46,9 @@ bool CharacterInventory::msgFocus(const FocusMessage &msg) {
 	ItemsView::msgFocus(msg);
 	assert(g_globals->_currCharacter);
 
-	if (dynamic_cast<WhichItem *>(msg._priorView) == nullptr)
+	if (dynamic_cast<WhichItem *>(msg._priorView) == nullptr &&
+		dynamic_cast<Trade *>(msg._priorView) == nullptr &&
+		dynamic_cast<GameMessages *>(msg._priorView) == nullptr)
 		_mode = BACKPACK_MODE;
 	populateItems();
 


Commit: 83ca8a4ce471c29ba6406c97d982ab439f8504d6
    https://github.com/scummvm/scummvm/commit/83ca8a4ce471c29ba6406c97d982ab439f8504d6
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2023-03-29T19:54:28-07:00

Commit Message:
MM: MM1: Split use item logic into it's own class

Changed paths:
  A engines/mm/mm1/game/use_item.cpp
  A engines/mm/mm1/game/use_item.h
    engines/mm/mm1/game/combat.h
    engines/mm/mm1/views/character_info.cpp
    engines/mm/mm1/views/character_info.h
    engines/mm/mm1/views/combat.h
    engines/mm/mm1/views_enh/combat.h
    engines/mm/module.mk


diff --git a/engines/mm/mm1/game/combat.h b/engines/mm/mm1/game/combat.h
index 5d7ee271b42..720d86eb023 100644
--- a/engines/mm/mm1/game/combat.h
+++ b/engines/mm/mm1/game/combat.h
@@ -321,6 +321,12 @@ public:
 	 */
 	virtual void displaySpellResult(const InfoMessage &msg) = 0;
 
+	/**
+	 * Disable the flags for allowing attacks for
+	 * the current character
+	 */
+	virtual void disableAttacks() = 0;
+
 	void iterateMonsters1();
 	void iterateMonsters2();
 	void resetDestMonster();
diff --git a/engines/mm/mm1/game/use_item.cpp b/engines/mm/mm1/game/use_item.cpp
new file mode 100644
index 00000000000..caf7508dfb5
--- /dev/null
+++ b/engines/mm/mm1/game/use_item.cpp
@@ -0,0 +1,120 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "mm/mm1/game/use_item.h"
+#include "mm/mm1/game/combat.h"
+#include "mm/mm1/game/spells_party.h"
+#include "mm/mm1/globals.h"
+
+namespace MM {
+namespace MM1 {
+namespace Game {
+
+
+Common::String UseItem::combatUseItem(Inventory &inv, Inventory::Entry &invEntry,
+		bool isEquipped) {
+	Common::String msg;
+	Item *item = g_globals->_items.getItem(invEntry._id);
+
+	if (!item->_effectId) {
+		msg = STRING["dialogs.character.use_combat.no_special_power"];
+
+	} else if (item->_equipMode == IS_EQUIPPABLE || isEquipped) {
+		if (invEntry._charges) {
+			g_globals->_combatEffectCtr++;
+			inv.removeCharge(&invEntry);
+
+			if (item->_effectId == 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?");
+
+				if (g_globals->_combatEffectCtr)
+					(isEquipped ? &g_globals->_currCharacter->_equipped :
+						&g_globals->_currCharacter->_backpack)->removeCharge(&invEntry);
+
+				g_globals->_party.updateAC();
+				msg = STRING["dialogs.character.use_combat.done"];
+				return false;
+			}
+		} else {
+			msg = STRING["dialogs.character.use_combat.no_charges_left"];
+		}
+	} else {
+		msg = STRING["dialogs.character.use_combat.not_equipped"];
+	}
+
+	Game::Combat *combat = dynamic_cast<Game::Combat *>(g_events->priorView());
+	assert(combat);
+	combat->disableAttacks();
+
+	return msg;
+}
+
+Common::String UseItem::nonCombatUseItem(Inventory &inv, Inventory::Entry &invEntry,
+		bool isEquipped) {
+	Common::String msg;
+	Item *item = g_globals->_items.getItem(invEntry._id);
+
+	if (!item->_effectId) {
+		msg = STRING["dialogs.character.use_noncombat.no_special_power"];
+
+	} else if (item->_equipMode == IS_EQUIPPABLE || isEquipped) {
+		if (invEntry._charges) {
+			g_globals->_nonCombatEffectCtr++;
+			inv.removeCharge(&invEntry);
+
+			if (item->_effectId == 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?");
+
+				if (g_globals->_nonCombatEffectCtr)
+					(isEquipped ? &g_globals->_currCharacter->_equipped :
+						&g_globals->_currCharacter->_backpack)->removeCharge(&invEntry);
+
+				g_globals->_party.updateAC();
+				msg = STRING["spells.done"];
+				return false;
+			}
+		} else {
+			msg = STRING["dialogs.character.use_noncombat.no_charges_left"];
+		}
+	} else {
+		msg = STRING["dialogs.character.use_noncombat.not_equipped"];
+	}
+
+	Game::Combat *combat = dynamic_cast<Game::Combat *>(g_events->priorView());
+	assert(combat);
+	combat->disableAttacks();
+
+	return msg;
+}
+
+} // namespace Game
+} // namespace MM1
+} // namespace MM
diff --git a/engines/mm/mm1/game/use_item.h b/engines/mm/mm1/game/use_item.h
new file mode 100644
index 00000000000..b897d8bc1c9
--- /dev/null
+++ b/engines/mm/mm1/game/use_item.h
@@ -0,0 +1,49 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef MM1_GAME_USE_ITEM_H
+#define MM1_GAME_USE_ITEM_H
+
+#include "mm/mm1/data/character.h"
+#include "mm/mm1/game/spell_casting.h"
+
+namespace MM {
+namespace MM1 {
+namespace Game {
+
+class UseItem : public MM1::Game::SpellCasting {
+public:
+	/**
+	 * Using an item during combat
+	 */
+	Common::String combatUseItem(Inventory &inv, Inventory::Entry &invEntry, bool isEquipped);
+
+	/**
+	 * Using an item outside of combat
+	 */
+	Common::String nonCombatUseItem(Inventory &inv, Inventory::Entry &invEntry, bool isEquipped);
+};
+
+} // namespace Game
+} // namespace MM1
+} // namespace MM
+
+#endif
diff --git a/engines/mm/mm1/views/character_info.cpp b/engines/mm/mm1/views/character_info.cpp
index d7f320d51e7..624470094e4 100644
--- a/engines/mm/mm1/views/character_info.cpp
+++ b/engines/mm/mm1/views/character_info.cpp
@@ -21,7 +21,6 @@
 
 #include "mm/mm1/views/character_info.h"
 #include "mm/mm1/views/combat.h"
-#include "mm/mm1/game/spells_party.h"
 #include "mm/mm1/utils/strings.h"
 #include "mm/mm1/globals.h"
 #include "mm/mm1/sound.h"
@@ -109,7 +108,7 @@ void CharacterInfo::draw() {
 void CharacterInfo::timeout() {
 	switch (_state) {
 	case USE:
-		if (dynamic_cast<Views::Combat *>(g_events->priorView()) != nullptr) {
+		if (g_events->isInCombat()) {
 			close();
 		} else {
 			_state = DISPLAY;
@@ -395,92 +394,17 @@ void CharacterInfo::tradeHowMuch() {
 }
 
 void CharacterInfo::combatUseItem(Inventory &inv, Inventory::Entry &invEntry, bool isEquipped) {
-	Item *item = g_globals->_items.getItem(invEntry._id);
-	Common::String msg;
-
-	if (!item->_effectId) {
-		msg = STRING["dialogs.character.use_combat.no_special_power"];
-
-	} else if (item->_equipMode == IS_EQUIPPABLE || isEquipped) {
-		if (invEntry._charges) {
-			g_globals->_combatEffectCtr++;
-			inv.removeCharge(&invEntry);
-
-			if (item->_effectId == 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?");
-
-				if (g_globals->_combatEffectCtr)
-					(isEquipped ? &g_globals->_currCharacter->_equipped :
-						&g_globals->_currCharacter->_backpack)->removeCharge(&invEntry);
-
-				clearLines(20, 24);
-				writeString(14, 22, STRING["dialogs.character.use_combat.done"]);
-				Sound::sound(SOUND_2);
-				g_globals->_party.updateAC();
-				delaySeconds(2);
-				return;
-			}
-		} else {
-			msg = STRING["dialogs.character.use_combat.no_charges_left"];
-		}
-	} else {
-		msg = STRING["dialogs.character.use_combat.not_equipped"];
-	}
-
+	Common::String msg = Game::UseItem::combatUseItem(inv, invEntry, isEquipped);
 	clearLines(20, 24);
-	static_cast<Views::Combat *>(g_events->priorView())->disableAttacks();
-
 	writeString(8, 21, msg);
 	delaySeconds(3);
 }
 
 void CharacterInfo::nonCombatUseItem(Inventory &inv, Inventory::Entry &invEntry, bool isEquipped) {
-	Item *item = g_globals->_items.getItem(invEntry._id);
-	Common::String msg;
-
-	if (!item->_effectId) {
-		msg = STRING["dialogs.character.use_noncombat.no_special_power"];
-
-	} else if (item->_equipMode == IS_EQUIPPABLE || isEquipped) {
-		if (invEntry._charges) {
-			g_globals->_nonCombatEffectCtr++;
-			inv.removeCharge(&invEntry);
-
-			if (item->_effectId == 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?");
-
-				if (g_globals->_nonCombatEffectCtr)
-					(isEquipped ? &g_globals->_currCharacter->_equipped :
-						&g_globals->_currCharacter->_backpack)->removeCharge(&invEntry);
-
-				clearLines(20, 24);
-				writeString(14, 22, STRING["spells.done"]);
-				Sound::sound(SOUND_2);
-				g_globals->_party.updateAC();
-				delaySeconds(2);
-				return;
-			}
-		} else {
-			msg = STRING["dialogs.character.use_noncombat.no_charges_left"];
-		}
-	} else {
-		msg = STRING["dialogs.character.use_noncombat.not_equipped"];
-	}
+	Common::String msg = Game::UseItem::nonCombatUseItem(inv, invEntry, isEquipped);
 
 	clearLines(20, 24);
-	static_cast<Views::Combat *>(g_events->priorView())->disableAttacks();
-
-	writeString(9, 21, msg);
+	writeString(8, 21, msg);
 	delaySeconds(3);
 }
 
diff --git a/engines/mm/mm1/views/character_info.h b/engines/mm/mm1/views/character_info.h
index 1cedc926bf9..3a6255f59ff 100644
--- a/engines/mm/mm1/views/character_info.h
+++ b/engines/mm/mm1/views/character_info.h
@@ -26,8 +26,8 @@
 #include "mm/mm1/views/character_base.h"
 #include "mm/mm1/data/character.h"
 #include "mm/mm1/data/items.h"
-#include "mm/mm1/game/spell_casting.h"
 #include "mm/mm1/game/equip_remove.h"
+#include "mm/mm1/game/use_item.h"
 #include "mm/mm1/views/text_entry.h"
 
 namespace MM {
@@ -37,8 +37,8 @@ namespace Views {
 /**
  * In-game character dialog
  */
-class CharacterInfo : public CharacterBase, MM1::Game::SpellCasting,
-		MM1::Game::EquipRemove {
+class CharacterInfo : public CharacterBase, MM1::Game::EquipRemove,
+	public MM1::Game::UseItem {
 private:
 	enum ViewState {
 		DISPLAY, EQUIP, GATHER, REMOVE, SHARE,
diff --git a/engines/mm/mm1/views/combat.h b/engines/mm/mm1/views/combat.h
index 5038d5082bb..c8ef562358f 100644
--- a/engines/mm/mm1/views/combat.h
+++ b/engines/mm/mm1/views/combat.h
@@ -230,7 +230,7 @@ public:
 	 * Disable the flags for allowing attacks for
 	 * the current character
 	 */
-	void disableAttacks();
+	void disableAttacks() override;
 
 	/**
 	 * Called when the view is focused
diff --git a/engines/mm/mm1/views_enh/combat.h b/engines/mm/mm1/views_enh/combat.h
index 6d673c81a1a..ce83815893f 100644
--- a/engines/mm/mm1/views_enh/combat.h
+++ b/engines/mm/mm1/views_enh/combat.h
@@ -243,7 +243,7 @@ public:
 	 * Disable the flags for allowing attacks for
 	 * the current character
 	 */
-	void disableAttacks();
+	void disableAttacks() override;
 
 	/**
 	 * Called when the view is focused
diff --git a/engines/mm/module.mk b/engines/mm/module.mk
index 98d9d534bdf..98acdbd9a50 100644
--- a/engines/mm/module.mk
+++ b/engines/mm/module.mk
@@ -45,6 +45,7 @@ MODULE_OBJS += \
 	mm1/game/spell_casting.o \
 	mm1/game/spells_party.o \
 	mm1/game/spells_monsters.o \
+	mm1/game/use_item.o \
 	mm1/game/view_base.o \
 	mm1/gfx/dta.o \
 	mm1/gfx/gfx.o \


Commit: 3a98f3acc40c46bc810480666295ce8b823bb726
    https://github.com/scummvm/scummvm/commit/3a98f3acc40c46bc810480666295ce8b823bb726
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2023-03-29T19:54:29-07:00

Commit Message:
MM: MM1: Added UseItem to enhanced inventory view

Changed paths:
    engines/mm/mm1/views/character_info.cpp
    engines/mm/mm1/views_enh/character_inventory.cpp
    engines/mm/mm1/views_enh/character_inventory.h


diff --git a/engines/mm/mm1/views/character_info.cpp b/engines/mm/mm1/views/character_info.cpp
index 624470094e4..2511464396b 100644
--- a/engines/mm/mm1/views/character_info.cpp
+++ b/engines/mm/mm1/views/character_info.cpp
@@ -239,7 +239,7 @@ bool CharacterInfo::msgKeypress(const KeypressMessage &msg) {
 			break;
 		}
 
-		if (dynamic_cast<Views::Combat *>(g_events->priorView()) != nullptr)
+		if (g_events->isInCombat())
 			combatUseItem(*inv, *invEntry, msg.keycode >= Common::KEYCODE_a);
 		else
 			nonCombatUseItem(*inv, *invEntry, msg.keycode >= Common::KEYCODE_a);
diff --git a/engines/mm/mm1/views_enh/character_inventory.cpp b/engines/mm/mm1/views_enh/character_inventory.cpp
index 7fdfa4ad3b4..968e5a76897 100644
--- a/engines/mm/mm1/views_enh/character_inventory.cpp
+++ b/engines/mm/mm1/views_enh/character_inventory.cpp
@@ -122,6 +122,9 @@ bool CharacterInventory::msgKeypress(const KeypressMessage &msg) {
 	case Common::KEYCODE_t:
 		addView("Trade");
 		break;
+	case Common::KEYCODE_u:
+		selectButton(BTN_USE);
+		break;
 	default:
 		return ItemsView::msgKeypress(msg);
 	}
@@ -183,6 +186,8 @@ void CharacterInventory::selectButton(SelectedButton btnMode) {
 			btn = STRING["enhdialogs.items.remove"];
 		else if (btnMode == BTN_DISCARD)
 			btn = STRING["enhdialogs.items.discard"];
+		else if (btnMode == BTN_USE)
+			btn = STRING["enhdialogs.items.use"];
 
 		send("WhichItem", GameMessage("DISPLAY",
 			Common::String::format("%s %s", btn.c_str(),
@@ -204,6 +209,10 @@ void CharacterInventory::performAction() {
 		discardItem();
 		break;
 
+	case BTN_USE:
+		useItem();
+		break;
+
 	default:
 		error("No button selected");
 		break;
@@ -236,6 +245,18 @@ void CharacterInventory::removeItem() {
 	}
 }
 
+void CharacterInventory::useItem() {
+	Character &c = *g_globals->_currCharacter;
+	Inventory &inv = (_mode == ARMS_MODE) ? c._equipped : c._backpack;
+	Inventory::Entry *invEntry = &inv[_selectedItem];
+	Common::String msg;
+
+	if (g_events->isInCombat())
+		msg = Game::UseItem::combatUseItem(inv, *invEntry, _mode == BACKPACK_MODE);
+	else
+		msg = Game::UseItem::nonCombatUseItem(inv, *invEntry, _mode == BACKPACK_MODE);
+}
+
 void CharacterInventory::discardItem() {
 	Character &c = *g_globals->_currCharacter;
 	Inventory &inv = (_mode == ARMS_MODE) ? c._equipped : c._backpack;
diff --git a/engines/mm/mm1/views_enh/character_inventory.h b/engines/mm/mm1/views_enh/character_inventory.h
index 64930abd51d..74287001c80 100644
--- a/engines/mm/mm1/views_enh/character_inventory.h
+++ b/engines/mm/mm1/views_enh/character_inventory.h
@@ -25,19 +25,21 @@
 #include "mm/mm1/views_enh/items_view.h"
 #include "mm/mm1/data/character.h"
 #include "mm/mm1/game/equip_remove.h"
+#include "mm/mm1/game/use_item.h"
 
 namespace MM {
 namespace MM1 {
 namespace ViewsEnh {
 
-class CharacterInventory : public ItemsView, Game::EquipRemove {
+class CharacterInventory : public ItemsView, public Game::EquipRemove,
+		public Game::UseItem {
 private:
 	enum DisplayMode {
 		ARMS_MODE, BACKPACK_MODE
 	};
 	DisplayMode _mode = ARMS_MODE;
 	enum SelectedButton {
-		BTN_NONE, BTN_EQUIP, BTN_REMOVE, BTN_DISCARD
+		BTN_NONE, BTN_EQUIP, BTN_REMOVE, BTN_DISCARD, BTN_USE
 	};
 	SelectedButton _selectedButton = BTN_NONE;
 	Common::String _tradeMode;
@@ -78,6 +80,11 @@ private:
 	 */
 	void discardItem();
 
+	/**
+	 * Use an item
+	 */
+	void useItem();
+
 	/**
 	 * Trade an item to another character
 	 */


Commit: 69a4edff7f9bec6557a37d44aa68ab6dce7516b8
    https://github.com/scummvm/scummvm/commit/69a4edff7f9bec6557a37d44aa68ab6dce7516b8
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2023-03-29T19:54:30-07:00

Commit Message:
MM: MM1: Change disableAttacks view casting to a game message

Changed paths:
    engines/mm/mm1/game/combat.h
    engines/mm/mm1/game/use_item.cpp
    engines/mm/mm1/views/combat.cpp
    engines/mm/mm1/views/combat.h
    engines/mm/mm1/views_enh/combat.cpp
    engines/mm/mm1/views_enh/combat.h


diff --git a/engines/mm/mm1/game/combat.h b/engines/mm/mm1/game/combat.h
index 720d86eb023..5d7ee271b42 100644
--- a/engines/mm/mm1/game/combat.h
+++ b/engines/mm/mm1/game/combat.h
@@ -321,12 +321,6 @@ public:
 	 */
 	virtual void displaySpellResult(const InfoMessage &msg) = 0;
 
-	/**
-	 * Disable the flags for allowing attacks for
-	 * the current character
-	 */
-	virtual void disableAttacks() = 0;
-
 	void iterateMonsters1();
 	void iterateMonsters2();
 	void resetDestMonster();
diff --git a/engines/mm/mm1/game/use_item.cpp b/engines/mm/mm1/game/use_item.cpp
index caf7508dfb5..8ea271f85df 100644
--- a/engines/mm/mm1/game/use_item.cpp
+++ b/engines/mm/mm1/game/use_item.cpp
@@ -65,9 +65,7 @@ Common::String UseItem::combatUseItem(Inventory &inv, Inventory::Entry &invEntry
 		msg = STRING["dialogs.character.use_combat.not_equipped"];
 	}
 
-	Game::Combat *combat = dynamic_cast<Game::Combat *>(g_events->priorView());
-	assert(combat);
-	combat->disableAttacks();
+	g_events->send("Combat", GameMessage("DISABLE_ATTACKS"));
 
 	return msg;
 }
@@ -108,10 +106,6 @@ Common::String UseItem::nonCombatUseItem(Inventory &inv, Inventory::Entry &invEn
 		msg = STRING["dialogs.character.use_noncombat.not_equipped"];
 	}
 
-	Game::Combat *combat = dynamic_cast<Game::Combat *>(g_events->priorView());
-	assert(combat);
-	combat->disableAttacks();
-
 	return msg;
 }
 
diff --git a/engines/mm/mm1/views/combat.cpp b/engines/mm/mm1/views/combat.cpp
index 7c63ed8cbc8..94a88655ab1 100644
--- a/engines/mm/mm1/views/combat.cpp
+++ b/engines/mm/mm1/views/combat.cpp
@@ -94,6 +94,10 @@ bool Combat::msgGame(const GameMessage &msg) {
 
 		setMode(SPELL_RESULT);
 		return true;
+
+	} else if (msg._name == "DISABLE_ATTACKS") {
+		disableAttacks();
+		return true;
 	}
 
 	return false;
diff --git a/engines/mm/mm1/views/combat.h b/engines/mm/mm1/views/combat.h
index c8ef562358f..5038d5082bb 100644
--- a/engines/mm/mm1/views/combat.h
+++ b/engines/mm/mm1/views/combat.h
@@ -230,7 +230,7 @@ public:
 	 * Disable the flags for allowing attacks for
 	 * the current character
 	 */
-	void disableAttacks() override;
+	void disableAttacks();
 
 	/**
 	 * Called when the view is focused
diff --git a/engines/mm/mm1/views_enh/combat.cpp b/engines/mm/mm1/views_enh/combat.cpp
index ebb76e69330..923fa53a67d 100644
--- a/engines/mm/mm1/views_enh/combat.cpp
+++ b/engines/mm/mm1/views_enh/combat.cpp
@@ -105,6 +105,10 @@ bool Combat::msgGame(const GameMessage &msg) {
 		if (g_globals->_combatParty[charNum] != g_globals->_currCharacter)
 			exchangeWith(charNum);
 		return true;
+
+	} else if (msg._name == "DISABLE_ATTACKS") {
+		disableAttacks();
+		return true;
 	}
 
 	return false;
diff --git a/engines/mm/mm1/views_enh/combat.h b/engines/mm/mm1/views_enh/combat.h
index ce83815893f..6d673c81a1a 100644
--- a/engines/mm/mm1/views_enh/combat.h
+++ b/engines/mm/mm1/views_enh/combat.h
@@ -243,7 +243,7 @@ public:
 	 * Disable the flags for allowing attacks for
 	 * the current character
 	 */
-	void disableAttacks() override;
+	void disableAttacks();
 
 	/**
 	 * Called when the view is focused


Commit: fbfc3577a9a33b86706a1906d1d2baacb9cee907
    https://github.com/scummvm/scummvm/commit/fbfc3577a9a33b86706a1906d1d2baacb9cee907
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2023-03-29T20:20:33-07:00

Commit Message:
MM: MM1: Don't show equip/remove inventory buttons when in combat

Changed paths:
    engines/mm/mm1/views_enh/character_inventory.cpp
    engines/mm/mm1/views_enh/items_view.cpp
    engines/mm/mm1/views_enh/scroll_view.h


diff --git a/engines/mm/mm1/views_enh/character_inventory.cpp b/engines/mm/mm1/views_enh/character_inventory.cpp
index 968e5a76897..6c9776e915b 100644
--- a/engines/mm/mm1/views_enh/character_inventory.cpp
+++ b/engines/mm/mm1/views_enh/character_inventory.cpp
@@ -20,6 +20,7 @@
  */
 
 #include "mm/mm1/views_enh/character_inventory.h"
+#include "mm/mm1/views_enh/combat.h"
 #include "mm/mm1/views_enh/game_messages.h"
 #include "mm/mm1/views_enh/trade.h"
 #include "mm/mm1/views_enh/which_item.h"
@@ -46,6 +47,10 @@ bool CharacterInventory::msgFocus(const FocusMessage &msg) {
 	ItemsView::msgFocus(msg);
 	assert(g_globals->_currCharacter);
 
+	bool inCombat = g_events->isInCombat();
+	for (int i = 2; i < 7; ++i)
+		setButtonEnabled(i, !inCombat);
+
 	if (dynamic_cast<WhichItem *>(msg._priorView) == nullptr &&
 		dynamic_cast<Trade *>(msg._priorView) == nullptr &&
 		dynamic_cast<GameMessages *>(msg._priorView) == nullptr)
@@ -104,32 +109,39 @@ bool CharacterInventory::msgKeypress(const KeypressMessage &msg) {
 		_mode = ARMS_MODE;
 		populateItems();
 		redraw();
-		break;
+		return true;
 	case Common::KEYCODE_b:
 		_mode = BACKPACK_MODE;
 		populateItems();
 		redraw();
-		break;
-	case Common::KEYCODE_e:
-		selectButton(BTN_EQUIP);
-		break;
-	case Common::KEYCODE_r:
-		selectButton(BTN_REMOVE);
-		break;
-	case Common::KEYCODE_d:
-		selectButton(BTN_DISCARD);
-		break;
-	case Common::KEYCODE_t:
-		addView("Trade");
-		break;
-	case Common::KEYCODE_u:
-		selectButton(BTN_USE);
-		break;
+		return true;
 	default:
-		return ItemsView::msgKeypress(msg);
+		break;
 	}
 
-	return true;
+	if (!g_events->isInCombat()) {
+		switch (msg.keycode) {
+		case Common::KEYCODE_e:
+			selectButton(BTN_EQUIP);
+			return true;
+		case Common::KEYCODE_r:
+			selectButton(BTN_REMOVE);
+			return true;
+		case Common::KEYCODE_d:
+			selectButton(BTN_DISCARD);
+			return true;
+		case Common::KEYCODE_t:
+			addView("Trade");
+			return true;
+		case Common::KEYCODE_u:
+			selectButton(BTN_USE);
+			return true;
+		default:
+			break;
+		}
+	}
+
+	return ItemsView::msgKeypress(msg);
 }
 
 bool CharacterInventory::msgAction(const ActionMessage &msg) {
@@ -172,7 +184,9 @@ void CharacterInventory::charSwitched(Character *priorChar) {
 }
 
 void CharacterInventory::itemSelected() {
-	// No implementation
+	if (g_events->isInCombat() && dynamic_cast<Combat *>(g_events) != nullptr) {
+		useItem();
+	}
 }
 
 void CharacterInventory::selectButton(SelectedButton btnMode) {
diff --git a/engines/mm/mm1/views_enh/items_view.cpp b/engines/mm/mm1/views_enh/items_view.cpp
index e783f0d83fe..dee06ba5df3 100644
--- a/engines/mm/mm1/views_enh/items_view.cpp
+++ b/engines/mm/mm1/views_enh/items_view.cpp
@@ -72,11 +72,13 @@ void ItemsView::draw() {
 	// Draw button text
 	setReduced(true);
 	for (uint i = 0; i < _btnText.size(); ++i) {
-		Common::Point pt(i * BUTTON_WIDTH + 5, 123);
-		if (i == (_btnText.size() - 1))
-			pt.x = EXIT_X;
+		if (isButtonEnabled(i)) {
+			Common::Point pt(i * BUTTON_WIDTH + 5, 123);
+			if (i == (_btnText.size() - 1))
+				pt.x = EXIT_X;
 
-		writeString(pt.x + 12, pt.y, _btnText[i], ALIGN_MIDDLE);
+			writeString(pt.x + 12, pt.y, _btnText[i], ALIGN_MIDDLE);
+		}
 	}
 
 	// List the items
diff --git a/engines/mm/mm1/views_enh/scroll_view.h b/engines/mm/mm1/views_enh/scroll_view.h
index 6bfc0054a1d..eb50b8340de 100644
--- a/engines/mm/mm1/views_enh/scroll_view.h
+++ b/engines/mm/mm1/views_enh/scroll_view.h
@@ -148,6 +148,13 @@ public:
 		_buttons[buttonNum]._enabled = enabled;
 	}
 
+	/**
+	 * Return true if a button is enabled
+	 */
+	bool isButtonEnabled(int buttonNum) const {
+		return _buttons[buttonNum]._enabled;
+	}
+
 	/**
 	 * Set a button's position
 	 */




More information about the Scummvm-git-logs mailing list