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

sev- noreply at scummvm.org
Tue Apr 7 11:59:54 UTC 2026


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

Summary:
baee3d4987 MM: Rework MM1 keymap handling and add shared click actions


Commit: baee3d4987ed587bdde50113b38970003e680837
    https://github.com/scummvm/scummvm/commit/baee3d4987ed587bdde50113b38970003e680837
Author: Scorp (scorp at mrs.mn)
Date: 2026-04-07T13:59:50+02:00

Commit Message:
MM: Rework MM1 keymap handling and add shared click actions

Changed paths:
    engines/mm/metaengine.cpp
    engines/mm/mm1/events.cpp
    engines/mm/mm1/metaengine.cpp
    engines/mm/mm1/metaengine.h


diff --git a/engines/mm/metaengine.cpp b/engines/mm/metaengine.cpp
index 6a96fcaeeac..e6a75f0cdbc 100644
--- a/engines/mm/metaengine.cpp
+++ b/engines/mm/metaengine.cpp
@@ -176,13 +176,38 @@ SaveStateDescriptor MMMetaEngine::querySaveMetaInfos(const char *target, int slo
 }
 
 Common::KeymapArray MMMetaEngine::initKeymaps(const char *target) const {
+	using namespace Common;
+
+	KeymapArray keymaps;
+
+	Keymap *mainKeymap = new Keymap(Keymap::kKeymapTypeGame, "mm-main", _("Might and Magic"));
+	Action *act;
+
+	act = new Action(kStandardActionLeftClick, _("Left click"));
+	act->setLeftClickEvent();
+	act->addDefaultInputMapping("MOUSE_LEFT");
+	act->addDefaultInputMapping("JOY_A");
+	mainKeymap->addAction(act);
+
+	act = new Action(kStandardActionRightClick, _("Right click"));
+	act->setRightClickEvent();
+	act->addDefaultInputMapping("MOUSE_RIGHT");
+	act->addDefaultInputMapping("JOY_B");
+	mainKeymap->addAction(act);
+
+	keymaps.push_back(mainKeymap);
+
 #ifdef ENABLE_MM1
 	const Common::String gameId = getGameId(target);
-	if (gameId == "mm1" || gameId == "mm1_enh")
-		return MM::MM1::MetaEngine::initKeymaps();
+	if (gameId == "mm1" || gameId == "mm1_enh") {
+		KeymapArray mm1Keymaps = MM::MM1::MetaEngine::initKeymaps();
+
+		for (KeymapArray::iterator it = mm1Keymaps.begin(); it != mm1Keymaps.end(); ++it)
+			keymaps.push_back(*it);
+	}
 #endif
 
-	return Common::KeymapArray();
+	return keymaps;
 }
 
 Common::String MMMetaEngine::getGameId(const Common::String &target) {
diff --git a/engines/mm/mm1/events.cpp b/engines/mm/mm1/events.cpp
index 5e9a6547fd8..8ff20da9bee 100644
--- a/engines/mm/mm1/events.cpp
+++ b/engines/mm/mm1/events.cpp
@@ -48,6 +48,8 @@ void Events::runGame() {
 	uint currTime, nextFrameTime = 0;
 	_screen = new Graphics::Screen();
 
+	MetaEngine::setKeybindingMode(KeybindingMode::KBMODE_MENUS);
+
 	// Run the game
 	int saveSlot = ConfMan.getInt("save_slot");
 	if (saveSlot == -1 ||
diff --git a/engines/mm/mm1/metaengine.cpp b/engines/mm/mm1/metaengine.cpp
index bff0a3d82d0..fdda610cdc8 100644
--- a/engines/mm/mm1/metaengine.cpp
+++ b/engines/mm/mm1/metaengine.cpp
@@ -22,6 +22,7 @@
 #include "mm/mm1/metaengine.h"
 #include "mm/mm1/mm1.h"
 #include "common/translation.h"
+#include "backends/keymapper/keymap.h"
 #include "backends/keymapper/action.h"
 #include "backends/keymapper/standard-actions.h"
 
@@ -123,60 +124,63 @@ static const KeybindingRecord CHEAT_KEYS[] = {
 	{ KEYBIND_NONE, nullptr, nullptr, nullptr, nullptr }
 };
 
+static const char *const kMenuKeymapId = "mm1_menu";
+static const char *const kMinimalKeymapId = "mm1_minimal";
+static const char *const kPartyKeymapId = "mm1_party";
+static const char *const kNormalKeymapId = "mm1_normal";
+static const char *const kCombatKeymapId = "mm1_combat";
+static const char *const kCheatsKeymapId = "mm1_cheats";
+
+static Common::Keymap *g_menuKeymap = nullptr;
+static Common::Keymap *g_minimalKeymap = nullptr;
+static Common::Keymap *g_partyKeymap = nullptr;
+static Common::Keymap *g_normalKeymap = nullptr;
+static Common::Keymap *g_combatKeymap = nullptr;
+static Common::Keymap *g_cheatsKeymap = nullptr;
+
 struct KeysRecord {
 	const char *_id;
 	const char *_desc;
 	const KeybindingRecord *_keys;
 };
 
-static const KeysRecord MENU_RECORDS[] = {
-	{ "mm1", _s("Might and Magic 1 - Menus"), MENU_KEYS },
-	{ nullptr, nullptr, nullptr }
-};
-
-static const KeysRecord MINIMAL_RECORDS[] = {
-	{ "mm1_minimal", _s("Might and Magic 1 - Minimal Keys"), MINIMAL_KEYS },
-	{ nullptr, nullptr, nullptr }
-};
-
-static const KeysRecord PARTY_MENU_RECORDS[] = {
-	{ "mm1", _s("Might and Magic 1 - Menus"), MENU_KEYS },
-	{ "mm1_party", _s("Might and Magic 1 - Party"), PARTY_KEYS },
-	{ nullptr, nullptr, nullptr }
-};
-
-static const KeysRecord COMBAT_MENU_RECORDS[] = {
-	{ "mm1_combat", _s("Might and Magic 1 - Combat"), COMBAT_KEYS },
-	{ "mm1_party", _s("Might and Magic 1 - Party"), PARTY_KEYS },
+static const KeysRecord ALL_RECORDS[] = {
+	{ kMenuKeymapId,    _s("Might and Magic 1 - Menus"), MENU_KEYS },
+	{ kMinimalKeymapId, _s("Might and Magic 1 - Minimal Keys"), MINIMAL_KEYS },
+	{ kNormalKeymapId,  _s("Might and Magic 1 - Main"), NORMAL_KEYS },
+	{ kPartyKeymapId,   _s("Might and Magic 1 - Party"), PARTY_KEYS },
+	{ kCombatKeymapId,  _s("Might and Magic 1 - Combat"), COMBAT_KEYS },
+//	{ kCheatsKeymapId,  _s("Might and Magic 1 - Cheats"), CHEAT_KEYS },
 	{ nullptr, nullptr, nullptr }
 };
 
-static const KeysRecord NORMAL_RECORDS[] = {
-	{ "mm1", _s("Might and Magic 1"), NORMAL_KEYS },
-	{ "mm1_party", _s("Might and Magic 1 - Party"), PARTY_KEYS },
-	{ "mm1_cheats", _s("Might and Magic 1 - Cheats"), CHEAT_KEYS },
-	{ nullptr, nullptr, nullptr }
-};
+static void initKeymapPointers() {
+	Common::Keymapper *const mapper = g_engine->getEventManager()->getKeymapper();
 
-static const KeysRecord *MODE_RECORDS[6] = {
-	MENU_RECORDS,
-	MINIMAL_RECORDS,
-	PARTY_MENU_RECORDS,
-	NORMAL_RECORDS,
-	COMBAT_MENU_RECORDS,
-	nullptr		// TODO: combat keybindings
-};
+	if (!g_menuKeymap)
+		g_menuKeymap = mapper->getKeymap(kMenuKeymapId);
+	if (!g_minimalKeymap)
+		g_minimalKeymap = mapper->getKeymap(kMinimalKeymapId);
+	if (!g_partyKeymap)
+		g_partyKeymap = mapper->getKeymap(kPartyKeymapId);
+	if (!g_normalKeymap)
+		g_normalKeymap = mapper->getKeymap(kNormalKeymapId);
+	if (!g_combatKeymap)
+		g_combatKeymap = mapper->getKeymap(kCombatKeymapId);
+	if (!g_cheatsKeymap)
+		g_cheatsKeymap = mapper->getKeymap(kCheatsKeymapId);
+}
 
-Common::KeymapArray MetaEngine::initKeymaps(KeybindingMode mode) {
+Common::KeymapArray MetaEngine::initKeymaps() {
 	Common::KeymapArray keymapArray;
 	Common::Keymap *keyMap;
 	Common::Action *act;
-	const KeysRecord *recPtr = MODE_RECORDS[mode];
 
-	for (int kCtr = 0; recPtr->_id; ++recPtr, ++kCtr) {
+	for (const KeysRecord *recPtr = ALL_RECORDS; recPtr->_id; ++recPtr) {
 		// Core keymaps
 		keyMap = new Common::Keymap(Common::Keymap::kKeymapTypeGame,
 			recPtr->_id, recPtr->_desc);
+		keyMap->setEnabled(false);
 		keymapArray.push_back(keyMap);
 
 		for (const KeybindingRecord *r = recPtr->_keys; r->_id; ++r) {
@@ -201,14 +205,39 @@ Common::KeymapArray MetaEngine::initKeymaps(KeybindingMode mode) {
 	return keymapArray;
 }
 
-void MetaEngine::setKeybindingMode(KeybindingMode mode) {
-	Common::Keymapper *const mapper = g_engine->getEventManager()->getKeymapper();
-	mapper->cleanupGameKeymaps();
-
-	Common::KeymapArray arr = initKeymaps(mode);
+static bool isKeymapEnabledForMode(const Common::Keymap *keymap, KeybindingMode mode) {
+	if (keymap == g_menuKeymap)
+		return mode == KBMODE_MENUS || mode == KBMODE_PARTY_MENUS;
+	if (keymap == g_minimalKeymap)
+		return mode == KBMODE_MINIMAL;
+	if (keymap == g_partyKeymap)
+		return mode == KBMODE_PARTY_MENUS || mode == KBMODE_NORMAL || mode == KBMODE_COMBAT;
+	if (keymap == g_normalKeymap)
+		return mode == KBMODE_NORMAL;
+	if (keymap == g_combatKeymap)
+		return mode == KBMODE_COMBAT;
+	if (keymap == g_cheatsKeymap)
+		return mode == KBMODE_NORMAL;
+
+	return false;
+}
 
-	for (uint idx = 0; idx < arr.size(); ++idx)
-		mapper->addGameKeymap(arr[idx]);
+void MetaEngine::setKeybindingMode(KeybindingMode mode) {
+	initKeymapPointers();
+
+	Common::Keymap *allKeymaps[] = {
+		g_menuKeymap,
+		g_minimalKeymap,
+		g_partyKeymap,
+		g_normalKeymap,
+		g_combatKeymap,
+		g_cheatsKeymap
+	};
+
+	for (Common::Keymap *keymap : allKeymaps) {
+		if (keymap)
+			keymap->setEnabled(isKeymapEnabledForMode(keymap, mode));
+	}
 }
 
 void MetaEngine::executeAction(KeybindingAction keyAction) {
diff --git a/engines/mm/mm1/metaengine.h b/engines/mm/mm1/metaengine.h
index 82288c9bf64..7a1bfb08aa9 100644
--- a/engines/mm/mm1/metaengine.h
+++ b/engines/mm/mm1/metaengine.h
@@ -99,7 +99,7 @@ public:
 	/**
 	 * Initialize keymaps
 	 */
-	static Common::KeymapArray initKeymaps(KeybindingMode mode = KBMODE_MENUS);
+	static Common::KeymapArray initKeymaps();
 
 	/**
 	 * Execute an engine keymap action




More information about the Scummvm-git-logs mailing list