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

dreammaster paulfgilbert at gmail.com
Sun Mar 8 06:17:59 UTC 2020


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:
a43a1a6970 ULTIMA8: Disable keymappings whilst game menu is being shown


Commit: a43a1a69704e45b438d26bf0486e8a3227638182
    https://github.com/scummvm/scummvm/commit/a43a1a69704e45b438d26bf0486e8a3227638182
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-03-07T22:17:44-08:00

Commit Message:
ULTIMA8: Disable keymappings whilst game menu is being shown

Changed paths:
    engines/ultima/ultima8/gumps/menu_gump.cpp
    engines/ultima/ultima8/meta_engine.cpp
    engines/ultima/ultima8/meta_engine.h
    engines/ultima/ultima8/ultima8.cpp
    engines/ultima/ultima8/ultima8.h


diff --git a/engines/ultima/ultima8/gumps/menu_gump.cpp b/engines/ultima/ultima8/gumps/menu_gump.cpp
index b5bb8aaa8c..cdbf81bb68 100644
--- a/engines/ultima/ultima8/gumps/menu_gump.cpp
+++ b/engines/ultima/ultima8/gumps/menu_gump.cpp
@@ -22,7 +22,6 @@
 
 #include "ultima/ultima8/misc/pent_include.h"
 #include "ultima/ultima8/gumps/menu_gump.h"
-
 #include "ultima/ultima8/games/game_data.h"
 #include "ultima/ultima8/graphics/gump_shape_archive.h"
 #include "ultima/ultima8/graphics/shape.h"
@@ -46,9 +45,9 @@
 #include "ultima/ultima8/gumps/widgets/edit_widget.h"
 #include "ultima/ultima8/gumps/u8_save_gump.h"
 #include "ultima/ultima8/world/get_object.h"
-
 #include "ultima/ultima8/filesys/idata_source.h"
 #include "ultima/ultima8/filesys/odata_source.h"
+#include "ultima/ultima8/meta_engine.h"
 
 namespace Ultima {
 namespace Ultima8 {
@@ -79,11 +78,15 @@ MenuGump::MenuGump(bool nameEntryMode_)
 	PaletteManager *palman = PaletteManager::get_instance();
 	palman->getTransformMatrix(_oldPalTransform, PaletteManager::Pal_Game);
 	palman->untransformPalette(PaletteManager::Pal_Game);
+
+	MetaEngine::setGameMenuActive(true);
 }
 
 MenuGump::~MenuGump() {
+	MetaEngine::setGameMenuActive(false);
 }
 
+
 void MenuGump::Close(bool no_del) {
 	// Restore old music state and palette.
 	// Music state can be changed by the Intro and Credits
@@ -262,9 +265,15 @@ bool MenuGump::OnTextInput(int unicode) {
 
 //static
 void MenuGump::showMenu() {
-	ModalGump *gump = new MenuGump();
-	gump->InitGump(0);
-	gump->setRelativePosition(CENTER);
+	Gump *gump = Ultima8Engine::get_instance()->getMenuGump();
+
+	if (gump) {
+		gump->Close();
+	} else {
+		gump = new MenuGump();
+		gump->InitGump(0);
+		gump->setRelativePosition(CENTER);
+	}
 }
 
 //static
diff --git a/engines/ultima/ultima8/meta_engine.cpp b/engines/ultima/ultima8/meta_engine.cpp
index fe4f3d2297..251348b915 100644
--- a/engines/ultima/ultima8/meta_engine.cpp
+++ b/engines/ultima/ultima8/meta_engine.cpp
@@ -22,6 +22,7 @@
 
 #include "ultima/ultima8/meta_engine.h"
 #include "ultima/ultima8/misc/debugger.h"
+#include "ultima/ultima8/ultima8.h"
 #include "common/translation.h"
 #include "backends/keymapper/action.h"
 
@@ -86,7 +87,7 @@ static const KeybindingRecord DEBUG_KEYS[] = {
 #endif
 
 
-Common::KeymapArray MetaEngine::initKeymaps() {
+Common::KeymapArray MetaEngine::initKeymaps(bool isMenuActive) {
 	Common::KeymapArray keymapArray;
 
 	// Core keymaps
@@ -94,39 +95,54 @@ Common::KeymapArray MetaEngine::initKeymaps() {
 	keymapArray.push_back(keyMap);
 
 	for (const KeybindingRecord *r = KEYS; r->_id; ++r) {
-		Common::Action *act = new Common::Action(r->_id, _(r->_desc));
-		act->setCustomEngineActionEvent(r->_action);
-		act->addDefaultInputMapping(r->_key);
-		keyMap->addAction(act);
+		if (!isMenuActive || !strcmp(r->_id, "MENU")) {
+			Common::Action *act = new Common::Action(r->_id, _(r->_desc));
+			act->setCustomEngineActionEvent(r->_action);
+			act->addDefaultInputMapping(r->_key);
+			keyMap->addAction(act);
+		}
 	}
 
-	// Cheat keymaps
-	keyMap = new Common::Keymap(Common::Keymap::kKeymapTypeGame, "ultima8_cheats", _("Ultima VIII Cheats"));
-	keymapArray.push_back(keyMap);
+	if (!isMenuActive) {
+		// Cheat keymaps
+		keyMap = new Common::Keymap(Common::Keymap::kKeymapTypeGame, "ultima8_cheats", _("Ultima VIII Cheats"));
+		keymapArray.push_back(keyMap);
 
-	for (const KeybindingRecord *r = CHEAT_KEYS; r->_id; ++r) {
-		Common::Action *act = new Common::Action(r->_id, _(r->_desc));
-		act->setCustomEngineActionEvent(r->_action);
-		act->addDefaultInputMapping(r->_key);
-		keyMap->addAction(act);
-	}
+		for (const KeybindingRecord *r = CHEAT_KEYS; r->_id; ++r) {
+			Common::Action *act = new Common::Action(r->_id, _(r->_desc));
+			act->setCustomEngineActionEvent(r->_action);
+			act->addDefaultInputMapping(r->_key);
+			keyMap->addAction(act);
+		}
 
 #ifndef RELEASE_BUILD
-	// Debug keymaps
-	keyMap = new Common::Keymap(Common::Keymap::kKeymapTypeGame, "ultima8_debug", _("Ultima VIII Debug"));
-	keymapArray.push_back(keyMap);
-
-	for (const KeybindingRecord *r = DEBUG_KEYS; r->_id; ++r) {
-		Common::Action *act = new Common::Action(r->_id, _(r->_desc));
-		act->setCustomEngineActionEvent(r->_action);
-		act->addDefaultInputMapping(r->_key);
-		keyMap->addAction(act);
-	}
+		// Debug keymaps
+		keyMap = new Common::Keymap(Common::Keymap::kKeymapTypeGame, "ultima8_debug", _("Ultima VIII Debug"));
+		keymapArray.push_back(keyMap);
+
+		for (const KeybindingRecord *r = DEBUG_KEYS; r->_id; ++r) {
+			Common::Action *act = new Common::Action(r->_id, _(r->_desc));
+			act->setCustomEngineActionEvent(r->_action);
+			act->addDefaultInputMapping(r->_key);
+			keyMap->addAction(act);
+		}
 #endif
+	}
 
 	return keymapArray;
 }
 
+void MetaEngine::setGameMenuActive(bool isActive) {
+	Common::Keymapper *const mapper = g_engine->getEventManager()->getKeymapper();
+	mapper->cleanupGameKeymaps();
+
+	Common::KeymapArray arr = initKeymaps(isActive);
+
+	for (uint idx = 0; idx < arr.size(); ++idx)
+		mapper->addGameKeymap(arr[idx]);
+}
+
+
 void MetaEngine::pressAction(KeybindingAction keyAction) {
 	Common::String methodName = getMethod(keyAction, true);
 	if (!methodName.empty())
diff --git a/engines/ultima/ultima8/meta_engine.h b/engines/ultima/ultima8/meta_engine.h
index dd004ff262..abf33bfeb6 100644
--- a/engines/ultima/ultima8/meta_engine.h
+++ b/engines/ultima/ultima8/meta_engine.h
@@ -54,7 +54,7 @@ public:
 	/**
 	 * Initialize keymaps
 	 */
-	static Common::KeymapArray initKeymaps();
+	static Common::KeymapArray initKeymaps(bool isMenuActive = false);
 
 	/**
 	 * Execute an engine keymap press action
@@ -65,6 +65,11 @@ public:
 	 * Execute an engine keymap release action
 	 */
 	static void releaseAction(KeybindingAction keyAction);
+
+	/**
+	 * Enables/disables keymaps based on whether the in-game menu is active
+	 */
+	static void setGameMenuActive(bool isActive);
 };
 
 } // End of namespace Ultima8
diff --git a/engines/ultima/ultima8/ultima8.cpp b/engines/ultima/ultima8/ultima8.cpp
index 48724af59c..60a52f85ef 100644
--- a/engines/ultima/ultima8/ultima8.cpp
+++ b/engines/ultima/ultima8/ultima8.cpp
@@ -737,7 +737,6 @@ void Ultima8Engine::handleEvent(const Common::Event &event) {
 	HID_Key key = HID_LAST;
 	uint16 evn = HID_EVENT_LAST;
 	bool handled = false;
-	KeybindingAction keybindAction = ACTION_NONE;
 
 	switch (event.type) {
 	case Common::EVENT_KEYDOWN:
@@ -786,6 +785,14 @@ void Ultima8Engine::handleEvent(const Common::Event &event) {
 		_mouse->setMouseCoords(event.mouse.x, event.mouse.y);
 		break;
 
+	case Common::EVENT_CUSTOM_ENGINE_ACTION_START:
+		MetaEngine::pressAction((KeybindingAction)event.customType);
+		return;
+
+	case Common::EVENT_CUSTOM_ENGINE_ACTION_END:
+		MetaEngine::releaseAction((KeybindingAction)event.customType);
+		return;
+
 	case Common::EVENT_QUIT:
 		_isRunning = false;
 		break;
@@ -842,38 +849,12 @@ void Ultima8Engine::handleEvent(const Common::Event &event) {
 				gump->OnKeyUp(event.kbd.keycode);
 				return;
 
-			case Common::EVENT_CUSTOM_ENGINE_ACTION_START:
-				if ((KeybindingAction)event.customType == ACTION_MENU) {
-					// When any gump is already open, the game menu action acts to close the gump
-					gump->OnKeyDown(Common::KEYCODE_ESCAPE, 0);
-				}
-				break;
-
 			default:
 				break;
 			}
 		}
 	}
 
-	if (!gump) {
-		// Handling for keybinding actions, which only happens if no gump is open
-		switch (event.type) {
-		case Common::EVENT_CUSTOM_ENGINE_ACTION_START:
-			keybindAction = (KeybindingAction)event.customType;
-			if (keybindAction != ACTION_NONE)
-				MetaEngine::pressAction(keybindAction);
-			break;
-
-		case Common::EVENT_CUSTOM_ENGINE_ACTION_END:
-			keybindAction = (KeybindingAction)event.customType;
-			if (keybindAction != ACTION_NONE)
-				MetaEngine::releaseAction(keybindAction);
-			break;
-		default:
-			break;
-		}
-	}
-
 	// Old style input begins here
 	switch (event.type) {
 
@@ -1584,5 +1565,12 @@ void Ultima8Engine::showSplashScreen() {
 	g_system->delayMillis(2000);
 }
 
+Gump *Ultima8Engine::getMenuGump() const {
+	if (_textModes.empty())
+		return nullptr;
+
+	return p_dynamic_cast<Gump *>(_objectManager->getObject(_textModes.front()));
+}
+
 } // End of namespace Ultima8
 } // End of namespace Ultima
diff --git a/engines/ultima/ultima8/ultima8.h b/engines/ultima/ultima8/ultima8.h
index 82433f2916..4970d53878 100644
--- a/engines/ultima/ultima8/ultima8.h
+++ b/engines/ultima/ultima8/ultima8.h
@@ -59,6 +59,7 @@ class UCMachine;
 class Game;
 class Gump;
 class GameMapGump;
+class MenuGump;
 class ScalerGump;
 class InverterGump;
 class RenderSurface;
@@ -346,6 +347,7 @@ public:
 	void makeCheater() {
 		_hasCheated = true;
 	}
+	Gump *getMenuGump() const;
 };
 
 } // End of namespace Ultima8




More information about the Scummvm-git-logs mailing list