[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