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

bluegr noreply at scummvm.org
Sat Aug 31 19:29:12 UTC 2024


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:
ca60a3325f TINSEL: Add keymapper support


Commit: ca60a3325f46ec3af685f1f98e48fc8a5cc7f716
    https://github.com/scummvm/scummvm/commit/ca60a3325f46ec3af685f1f98e48fc8a5cc7f716
Author: NabeelShabbir (128056426+NabeelShabbir at users.noreply.github.com)
Date: 2024-08-31T22:29:09+03:00

Commit Message:
TINSEL: Add keymapper support

Changed paths:
    engines/tinsel/dialogs.cpp
    engines/tinsel/events.cpp
    engines/tinsel/metaengine.cpp
    engines/tinsel/tinsel.cpp
    engines/tinsel/tinsel.h


diff --git a/engines/tinsel/dialogs.cpp b/engines/tinsel/dialogs.cpp
index 8c36e3d8633..60f8e8dfa15 100644
--- a/engines/tinsel/dialogs.cpp
+++ b/engines/tinsel/dialogs.cpp
@@ -62,6 +62,8 @@
 
 #include "common/textconsole.h"
 
+#include "backends/keymapper/keymapper.h"
+
 namespace Tinsel {
 
 //----------------- LOCAL DEFINES --------------------
@@ -1411,18 +1413,18 @@ bool Dialogs::updateString(const Common::KeyState &kbd) {
 /**
  * Keystrokes get sent here when load/save screen is up.
  */
-static bool InvKeyIn(const Common::KeyState &kbd) {
-	if (kbd.keycode == Common::KEYCODE_PAGEUP ||
-	    kbd.keycode == Common::KEYCODE_PAGEDOWN ||
-	    kbd.keycode == Common::KEYCODE_HOME ||
-	    kbd.keycode == Common::KEYCODE_END)
+static bool InvKeyIn(const Common::KeyState &kbd, const Common::CustomEventType &customType) {
+	if (customType == kActionPageUp ||
+		customType == kActionPageDown ||
+		customType == kActionHome ||
+		customType == kActionEnd)
 		return true; // Key needs processing
 
 	if (kbd.keycode == 0 && kbd.ascii == 0) {
 		;
 	} else if (kbd.keycode == Common::KEYCODE_RETURN) {
 		return true; // Key needs processing
-	} else if (kbd.keycode == Common::KEYCODE_ESCAPE) {
+	} else if (customType == kActionEscape) {
 		return true; // Key needs processing
 	} else {
 #ifndef JAPAN
@@ -3659,6 +3661,11 @@ void Dialogs::openMenu(CONFTYPE menuType) {
 	_invD[INV_CONF].resizable = false;
 	_invD[INV_CONF].bMoveable = false;
 
+	Common::Keymapper *keymapper = _vm->getEventManager()->getKeymapper();
+	if (menuType == SAVE_MENU || menuType == LOAD_MENU) {
+		keymapper->getKeymap("game-shortcuts")->setEnabled(false);
+		keymapper->getKeymap("saveload-shortcuts")->setEnabled(true);
+	}
 	switch (menuType) {
 	case MAIN_MENU:
 		setMenuGlobals(&ciOption);
@@ -5494,6 +5501,13 @@ bool Dialogs::isConvWindow() {
 }
 
 void Dialogs::callFunction(BFUNC boxFunc) {
+
+	Common::Keymapper *keymapper = _vm->getEventManager()->getKeymapper();
+	if (boxFunc == CLOSEWIN || boxFunc == SAVEGAME || boxFunc == LOADGAME) {
+		keymapper->getKeymap("game-shortcuts")->setEnabled(true);
+		keymapper->getKeymap("saveload-shortcuts")->setEnabled(false);
+	}
+
 	switch (boxFunc) {
 	case SAVEGAME:
 		killInventory();
diff --git a/engines/tinsel/events.cpp b/engines/tinsel/events.cpp
index 2421f7eef85..a658a966df6 100644
--- a/engines/tinsel/events.cpp
+++ b/engines/tinsel/events.cpp
@@ -44,6 +44,8 @@
 #include "tinsel/token.h"
 #include "tinsel/noir/notebook.h"
 
+#include "backends/keymapper/keymapper.h"
+
 namespace Tinsel {
 
 //----------------- EXTERNAL FUNCTIONS ---------------------
diff --git a/engines/tinsel/metaengine.cpp b/engines/tinsel/metaengine.cpp
index 12890f38cd2..3f5237e7577 100644
--- a/engines/tinsel/metaengine.cpp
+++ b/engines/tinsel/metaengine.cpp
@@ -32,6 +32,10 @@
 
 #include "tinsel/detection.h"
 
+#include "backends/keymapper/action.h"
+#include "backends/keymapper/keymapper.h"
+#include "backends/keymapper/standard-actions.h"
+
 static const ADExtraGuiOptionsMap optionsList[] = {
 	{
 		GAMEOPTION_CROP_HEIGHT_480_TO_432,
@@ -97,6 +101,8 @@ public:
 	
 	void registerDefaultSettings(const Common::String &target) const override;
 	const ADExtraGuiOptionsMap *getAdvancedExtraGuiOptions() const override;
+
+	Common::KeymapArray initKeymaps(const char *target) const override;
 };
 
 bool TinselMetaEngine::hasFeature(MetaEngineFeature f) const {
@@ -226,6 +232,142 @@ const ADExtraGuiOptionsMap *TinselMetaEngine::getAdvancedExtraGuiOptions() const
 	return optionsList;
 }
 
+Common::KeymapArray TinselMetaEngine::initKeymaps(const char *target) const {
+	using namespace Common;
+	using namespace Tinsel;
+
+	Keymap *engineKeyMap = new Keymap(Keymap::kKeymapTypeGame, "tinsel-default", _("Default keymappings"));
+	Keymap *gameKeyMap = new Keymap(Keymap::kKeymapTypeGame, "game-shortcuts", _("Game keymappings"));
+	Keymap *saveloadKeyMap = new Keymap(Keymap::kKeymapTypeGame, "saveload-shortcuts", _("Save/Load keymappings"));
+
+	Action *act;
+
+	act = new Action(kStandardActionLeftClick, _("Left click"));
+	act->setLeftClickEvent();
+	act->addDefaultInputMapping("MOUSE_LEFT");
+	act->addDefaultInputMapping("JOY_A");
+	engineKeyMap->addAction(act);
+
+	act = new Action(kStandardActionRightClick, _("Right click"));
+	act->setRightClickEvent();
+	act->addDefaultInputMapping("MOUSE_RIGHT");
+	act->addDefaultInputMapping("JOY_B");
+	engineKeyMap->addAction(act);
+
+	act = new Action("ESCAPE", _("Escape"));
+	act->setCustomEngineActionEvent(kActionEscape);
+	act->addDefaultInputMapping("ESCAPE");
+	engineKeyMap->addAction(act);
+
+	act = new Action("MOVEUP", _("Move up"));
+	act->setCustomEngineActionEvent(kActionMoveUp);
+	act->addDefaultInputMapping("UP");
+	act->addDefaultInputMapping("KP8");
+	gameKeyMap->addAction(act);
+
+	act = new Action("MOVEDOWN", _("Move down"));
+	act->setCustomEngineActionEvent(kActionMoveDown);
+	act->addDefaultInputMapping("DOWN");
+	act->addDefaultInputMapping("KP2");
+	gameKeyMap->addAction(act);
+
+	act = new Action("MOVELEFT", _("Move left"));
+	act->setCustomEngineActionEvent(kActionMoveLeft);
+	act->addDefaultInputMapping("LEFT");
+	act->addDefaultInputMapping("KP4");
+	gameKeyMap->addAction(act);
+
+	act = new Action("MOVERIGHT", _("Move right"));
+	act->setCustomEngineActionEvent(kActionMoveRight);
+	act->addDefaultInputMapping("RIGHT");
+	act->addDefaultInputMapping("KP6");
+	gameKeyMap->addAction(act);
+
+	// I18N: Walk to where cursor points
+	act = new Action("WALK", _("Walk to"));
+	act->setCustomEngineActionEvent(kActionWalkTo);
+	act->addDefaultInputMapping("SPACE");
+	gameKeyMap->addAction(act);
+
+	// I18N: Perform action on object where cursor points
+	act = new Action("ACTION", _("Action"));
+	act->setCustomEngineActionEvent(kActionAction);
+	act->addDefaultInputMapping("RETURN");
+	act->addDefaultInputMapping("KP_ENTER");
+	gameKeyMap->addAction(act);
+
+	act = new Action("LOOK", _("Look"));
+	act->setCustomEngineActionEvent(kActionLook);
+	act->addDefaultInputMapping("l");
+	act->addDefaultInputMapping("LCTRL");
+	act->addDefaultInputMapping("RCTRL");
+	gameKeyMap->addAction(act);
+
+	act = new Action("OPTIONSDIALOG", _("Options Dialog"));
+	act->setCustomEngineActionEvent(kActionOptionsDialog);
+	act->addDefaultInputMapping("F1");
+	act->addDefaultInputMapping("1");
+	gameKeyMap->addAction(act);
+
+	act = new Action("INVENTORY", _("Inventory"));
+	act->setCustomEngineActionEvent(kActionInventory);
+	act->addDefaultInputMapping("F2");
+	gameKeyMap->addAction(act);
+
+	act = new Action("NOTEBOOK", _("Notebook"));
+	act->setCustomEngineActionEvent(kActionNotebook);
+	act->addDefaultInputMapping("F3");
+	gameKeyMap->addAction(act);
+
+	act = new Action("SAVE", _("Save"));
+	act->setCustomEngineActionEvent(kActionSave);
+	act->addDefaultInputMapping("F5");
+	act->addDefaultInputMapping("5");
+	gameKeyMap->addAction(act);
+
+	act = new Action("LOAD", _("Load"));
+	act->setCustomEngineActionEvent(kActionLoad);
+	act->addDefaultInputMapping("7");
+	act->addDefaultInputMapping("F7");
+	gameKeyMap->addAction(act);
+
+	act = new Action("QUIT", _("Quit"));
+	act->setCustomEngineActionEvent(kActionQuit);
+	act->addDefaultInputMapping("C+q");
+	act->addDefaultInputMapping("A+q");
+	gameKeyMap->addAction(act);
+
+	act = new Action("PGUPMENU", _("Page Up in save/load menu"));
+	act->setCustomEngineActionEvent(kActionPageUp);
+	act->addDefaultInputMapping("PAGEUP");
+	act->addDefaultInputMapping("KP9");
+	saveloadKeyMap->addAction(act);
+
+	act = new Action("PGDOWNMENU", _("Page down in save/load menu"));
+	act->setCustomEngineActionEvent(kActionPageDown);
+	act->addDefaultInputMapping("PAGEDOWN");
+	act->addDefaultInputMapping("KP3");
+	saveloadKeyMap->addAction(act);
+
+	act = new Action("STARTOFMENU", _("Go to start of save/load menu"));
+	act->setCustomEngineActionEvent(kActionHome);
+	act->addDefaultInputMapping("HOME");
+	act->addDefaultInputMapping("KP7");
+	saveloadKeyMap->addAction(act);
+
+	act = new Action("ENDOFMENU", _("Go to end of save/load menu"));
+	act->setCustomEngineActionEvent(kActionEnd);
+	act->addDefaultInputMapping("END");
+	act->addDefaultInputMapping("KP1");
+	saveloadKeyMap->addAction(act);
+
+	KeymapArray keymaps(3);
+	keymaps[0] = engineKeyMap;
+	keymaps[1] = gameKeyMap;
+	keymaps[2] = saveloadKeyMap;
+	return keymaps;
+}
+
 #if PLUGIN_ENABLED_DYNAMIC(TINSEL)
 	REGISTER_PLUGIN_DYNAMIC(TINSEL, PLUGIN_TYPE_ENGINE, TinselMetaEngine);
 #else
diff --git a/engines/tinsel/tinsel.cpp b/engines/tinsel/tinsel.cpp
index e78e16389f7..ced7f454eb9 100644
--- a/engines/tinsel/tinsel.cpp
+++ b/engines/tinsel/tinsel.cpp
@@ -170,107 +170,91 @@ void KeyboardProcess(CORO_PARAM, const void *) {
 					ProcessButEvent(PLR_DRAG2_END);
 			}
 			continue;
-
-		case Common::KEYCODE_LCTRL:
-		case Common::KEYCODE_RCTRL:
-			if (evt.type == Common::EVENT_KEYDOWN) {
-				ProcessKeyEvent(PLR_LOOK);
-			} else {
-				// Control key release
-			}
-			continue;
-
 		default:
 			break;
 		}
 
 		// At this point only key down events need processing
-		if (evt.type == Common::EVENT_KEYUP)
+		if (evt.type == Common::EVENT_KEYUP || evt.customType == Common::EVENT_CUSTOM_ENGINE_ACTION_END)
 			continue;
 
 		if (_vm->_keyHandler != NULL)
 			// Keyboard is hooked, so pass it on to that handler first
-			if (!_vm->_keyHandler(evt.kbd))
+			if (!_vm->_keyHandler(evt.kbd, evt.customType))
 				continue;
 
-		switch (evt.kbd.keycode) {
+		switch (evt.customType) {
 		/*** SPACE = WALKTO ***/
-		case Common::KEYCODE_SPACE:
+		case kActionWalkTo:
 			ProcessKeyEvent(PLR_WALKTO);
 			continue;
 
 		/*** RETURN = ACTION ***/
-		case Common::KEYCODE_RETURN:
-		case Common::KEYCODE_KP_ENTER:
+		case kActionAction:
 			ProcessKeyEvent(PLR_ACTION);
 			continue;
 
 		/*** l = LOOK ***/
-		case Common::KEYCODE_l:		// LOOK
+		case kActionLook:		// LOOK
 			ProcessKeyEvent(PLR_LOOK);
 			continue;
 
-		case Common::KEYCODE_ESCAPE:
+		case kActionEscape:
 			ProcessKeyEvent(PLR_ESCAPE);
 			continue;
-
-#ifdef SLOW_RINCE_DOWN
-		case '>':
-			AddInterlude(1);
-			continue;
-		case '<':
-			AddInterlude(-1);
-			continue;
-#endif
-
-		case Common::KEYCODE_1:
-		case Common::KEYCODE_F1:
+		case kActionOptionsDialog:
 			// Options dialog
 			ProcessKeyEvent(PLR_MENU);
 			continue;
-		case Common::KEYCODE_F2:
+		case kActionInventory:
 			ProcessKeyEvent(PLR_INVENTORY);
 			continue;
-		case Common::KEYCODE_F3:
+		case kActionNotebook:
 			ProcessKeyEvent(PLR_NOTEBOOK);
 			continue;
-		case Common::KEYCODE_5:
-		case Common::KEYCODE_F5:
+		case kActionSave:
 			// Save game
 			ProcessKeyEvent(PLR_SAVE);
 			continue;
-		case Common::KEYCODE_7:
-		case Common::KEYCODE_F7:
+		case kActionLoad:
 			// Load game
 			ProcessKeyEvent(PLR_LOAD);
 			continue;
-		case Common::KEYCODE_m:
-			// Debug facility - scene hopper
-			if (TinselVersion >= 2) {
-			 if (evt.kbd.hasFlags(Common::KBD_ALT))
-				ProcessKeyEvent(PLR_JUMP);
-			}
-			break;
-		case Common::KEYCODE_q:
-			if ((evt.kbd.hasFlags(Common::KBD_CTRL)) || (evt.kbd.hasFlags(Common::KBD_ALT)))
-				ProcessKeyEvent(PLR_QUIT);
+		case kActionQuit:
+			ProcessKeyEvent(PLR_QUIT);
 			continue;
-		case Common::KEYCODE_PAGEUP:
-		case Common::KEYCODE_KP9:
+		case kActionPageUp:
 			ProcessKeyEvent(PLR_PGUP);
 			continue;
-		case Common::KEYCODE_PAGEDOWN:
-		case Common::KEYCODE_KP3:
+		case kActionPageDown:
 			ProcessKeyEvent(PLR_PGDN);
 			continue;
-		case Common::KEYCODE_HOME:
-		case Common::KEYCODE_KP7:
+		case kActionHome:
 			ProcessKeyEvent(PLR_HOME);
 			continue;
-		case Common::KEYCODE_END:
-		case Common::KEYCODE_KP1:
+		case kActionEnd:
 			ProcessKeyEvent(PLR_END);
 			continue;
+		default:
+			break;
+		}
+
+		switch (evt.kbd.keycode) {
+#ifdef SLOW_RINCE_DOWN
+		case '>':
+			AddInterlude(1);
+			continue;
+		case '<':
+			AddInterlude(-1);
+			continue;
+#endif
+		case Common::KEYCODE_m:
+			// Debug facility - scene hopper
+			if (TinselVersion >= 2) {
+				if (evt.kbd.hasFlags(Common::KBD_ALT))
+					ProcessKeyEvent(PLR_JUMP);
+			}
+			break;
 		default:
 			ProcessKeyEvent(PLR_NOEVENT);
 			break;
@@ -1213,9 +1197,9 @@ bool TinselEngine::pollEvent() {
 
 	case Common::EVENT_KEYDOWN:
 	case Common::EVENT_KEYUP:
+	case Common::EVENT_CUSTOM_ENGINE_ACTION_START:
 		ProcessKeyEvent(event);
 		break;
-
 	default:
 		break;
 	}
@@ -1324,28 +1308,24 @@ void TinselEngine::ChopDrivers() {
 void TinselEngine::ProcessKeyEvent(const Common::Event &event) {
 	// Check for movement keys
 	int idx = 0;
-	switch (event.kbd.keycode) {
-	case Common::KEYCODE_UP:
-	case Common::KEYCODE_KP8:
+	switch (event.customType) {
+	case kActionMoveUp:
 		idx = MSK_UP;
 		break;
-	case Common::KEYCODE_DOWN:
-	case Common::KEYCODE_KP2:
+	case kActionMoveDown:
 		idx = MSK_DOWN;
 		break;
-	case Common::KEYCODE_LEFT:
-	case Common::KEYCODE_KP4:
+	case kActionMoveLeft:
 		idx = MSK_LEFT;
 		break;
-	case Common::KEYCODE_RIGHT:
-	case Common::KEYCODE_KP6:
+	case kActionMoveRight:
 		idx = MSK_RIGHT;
 		break;
 	default:
 		break;
 	}
 	if (idx != 0) {
-		if (event.type == Common::EVENT_KEYDOWN)
+		if (event.type == Common::EVENT_CUSTOM_ENGINE_ACTION_START)
 			_dosPlayerDir |= idx;
 		else
 			_dosPlayerDir &= ~idx;
diff --git a/engines/tinsel/tinsel.h b/engines/tinsel/tinsel.h
index a73966e4505..90da5fa2be3 100644
--- a/engines/tinsel/tinsel.h
+++ b/engines/tinsel/tinsel.h
@@ -69,6 +69,28 @@ class SystemReel;
 
 typedef Common::List<Common::Rect> RectList;
 
+enum TINSELAction {
+	kActionNone,
+	kActionWalkTo,
+	kActionAction,
+	kActionLook,
+	kActionEscape,
+	kActionOptionsDialog,
+	kActionInventory,
+	kActionNotebook,
+	kActionSave,
+	kActionLoad,
+	kActionQuit,
+	kActionPageUp,
+	kActionPageDown,
+	kActionHome,
+	kActionEnd,
+	kActionMoveUp,
+	kActionMoveDown,
+	kActionMoveLeft,
+	kActionMoveRight
+};
+
 enum {
 	kTinselDebugAnimations = 1 << 0,
 	kTinselDebugActions = 1 << 1,
@@ -85,7 +107,7 @@ enum TinselKeyDirection {
 	MSK_DIRECTION = MSK_LEFT | MSK_RIGHT | MSK_UP | MSK_DOWN
 };
 
-typedef bool (*KEYFPTR)(const Common::KeyState &);
+typedef bool (*KEYFPTR)(const Common::KeyState &, const Common::CustomEventType &);
 
 #define	SCREEN_WIDTH	(_vm->screen().w)	// PC screen dimensions
 #define	SCREEN_HEIGHT	(_vm->screen().h)




More information about the Scummvm-git-logs mailing list