[Scummvm-git-logs] scummvm master -> 4cce1985961e746442657021f9aa724d1c065f29

sev- noreply at scummvm.org
Sun Aug 10 11:20:08 UTC 2025


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:
4cce198596 QUEEN: Add keymapper support


Commit: 4cce1985961e746442657021f9aa724d1c065f29
    https://github.com/scummvm/scummvm/commit/4cce1985961e746442657021f9aa724d1c065f29
Author: aunnoman1 (aunnoman123 at outlook.com)
Date: 2025-08-10T13:20:05+02:00

Commit Message:
QUEEN: Add keymapper support

Changed paths:
    engines/queen/input.cpp
    engines/queen/input.h
    engines/queen/journal.cpp
    engines/queen/journal.h
    engines/queen/metaengine.cpp
    engines/queen/queen.h


diff --git a/engines/queen/input.cpp b/engines/queen/input.cpp
index c1b4e96b588..45b426a0eb1 100644
--- a/engines/queen/input.cpp
+++ b/engines/queen/input.cpp
@@ -29,58 +29,23 @@
 
 namespace Queen {
 
-const char *const Input::_commandKeys[] = {
-	"ocmglptu", // English
-	"osbgpnre", // German
-	"ofdnepau", // French
-	"acsdgpqu", // Italian
-	"ocmglptu", // Hebrew
-	"acodmthu"  // Spanish
-};
-
-const Verb Input::_verbKeys[] = {
-	VERB_OPEN,
-	VERB_CLOSE,
-	VERB_MOVE,
-	VERB_GIVE,
-	VERB_LOOK_AT,
-	VERB_PICK_UP,
-	VERB_TALK_TO,
-	VERB_USE
+const verbAction Input::_verbActions[] = {
+	{ VERB_OPEN, kActionOpen },
+	{ VERB_CLOSE, kActionClose },
+	{ VERB_MOVE, kActionMove },
+	{ VERB_GIVE, kActionGive },
+	{ VERB_LOOK_AT, kActionLook },
+	{ VERB_PICK_UP, kActionPickUp },
+	{ VERB_TALK_TO, kActionTalk },
+	{ VERB_USE, kActionUse }
 };
 
 Input::Input(Common::Language language, OSystem *system) :
 	_system(system), _eventMan(system->getEventManager()), _fastMode(false),
 	_keyVerb(VERB_NONE), _cutawayRunning(false), _canQuit(false),
 	_cutawayQuit(false), _dialogueRunning(false), _talkQuit(false),
-	_quickSave(false), _quickLoad(false), _inKey(Common::KEYCODE_INVALID),
+	_quickSave(false), _quickLoad(false), _inKey(kActionNone),
 	_mouseButton(0), _idleTime(0) {
-
-	switch (language) {
-	case Common::EN_ANY:
-	case Common::EL_GRC:
-	case Common::RU_RUS:
-		_currentCommandKeys = _commandKeys[0];
-		break;
-	case Common::DE_DEU:
-		_currentCommandKeys = _commandKeys[1];
-		break;
-	case Common::FR_FRA:
-		_currentCommandKeys = _commandKeys[2];
-		break;
-	case Common::IT_ITA:
-		_currentCommandKeys = _commandKeys[3];
-		break;
-	case Common::HE_ISR:
-		_currentCommandKeys = _commandKeys[4];
-		break;
-	case Common::ES_ESP:
-		_currentCommandKeys = _commandKeys[5];
-		break;
-	default:
-		error("Unknown language");
-		break;
-	}
 }
 
 void Input::delay(uint amount) {
@@ -96,13 +61,11 @@ void Input::delay(uint amount) {
 		while (_eventMan->pollEvent(event)) {
 			_idleTime = 0;
 			switch (event.type) {
-			case Common::EVENT_KEYDOWN:
-				if (event.kbd.hasFlags(Common::KBD_CTRL)) {
-					if (event.kbd.keycode == Common::KEYCODE_f) {
-						_fastMode = !_fastMode;
-					}
+			case Common::EVENT_CUSTOM_ENGINE_ACTION_START:
+				if (event.customType == kActionFastMode) {
+					_fastMode = !_fastMode;
 				} else {
-					_inKey = event.kbd.keycode;
+					_inKey = event.customType;
 				}
 				break;
 
@@ -144,28 +107,28 @@ void Input::checkKeys() {
 		debug(6, "[Input::checkKeys] _inKey = %i", _inKey);
 
 	switch (_inKey) {
-	case Common::KEYCODE_SPACE:
+	case kActionSkipText:
 		_keyVerb = VERB_SKIP_TEXT;
 		break;
-	case Common::KEYCODE_COMMA:
+	case kActionScrollUp:
 		_keyVerb = VERB_SCROLL_UP;
 		break;
-	case Common::KEYCODE_PERIOD:
+	case kActionScrollDown:
 		_keyVerb = VERB_SCROLL_DOWN;
 		break;
-	case Common::KEYCODE_1:
+	case kActionInvSlot1:
 		_keyVerb = VERB_DIGIT_1;
 		break;
-	case Common::KEYCODE_2:
+	case kActionInvSlot2:
 		_keyVerb = VERB_DIGIT_2;
 		break;
-	case Common::KEYCODE_3:
+	case kActionInvSlot3:
 		_keyVerb = VERB_DIGIT_3;
 		break;
-	case Common::KEYCODE_4:
+	case kActionInvSlot4:
 		_keyVerb = VERB_DIGIT_4;
 		break;
-	case Common::KEYCODE_ESCAPE: // skip cutaway / dialogue
+	case kActionSkipCutaway: // skip cutaway / dialogue
 		if (_canQuit) {
 			if (_cutawayRunning) {
 				debug(6, "[Input::checkKeys] Setting _cutawayQuit to true");
@@ -175,8 +138,7 @@ void Input::checkKeys() {
 				_talkQuit = true;
 		}
 		break;
-	case Common::KEYCODE_F1: // use Journal
-	case Common::KEYCODE_F5:
+	case kActionJournal: // use Journal
 		if (_cutawayRunning) {
 			if (_canQuit) {
 				_keyVerb = VERB_USE_JOURNAL;
@@ -188,23 +150,23 @@ void Input::checkKeys() {
 				_talkQuit = true;
 		}
 		break;
-	case Common::KEYCODE_F11: // quicksave
+	case kActionSave: // quicksave
 		_quickSave = true;
 		break;
-	case Common::KEYCODE_F12: // quickload
+	case kActionLoad: // quickload
 		_quickLoad = true;
 		break;
 	default:
-		for (int i = 0; i < ARRAYSIZE(_verbKeys); ++i) {
-			if (_inKey == _currentCommandKeys[i]) {
-				_keyVerb = _verbKeys[i];
+		for (int i = 0; i < ARRAYSIZE(_verbActions); ++i) {
+			if (_inKey == _verbActions[i]._action) {
+				_keyVerb = _verbActions[i]._verb;
 				break;
 			}
 		}
 		break;
 	}
 
-	_inKey = Common::KEYCODE_INVALID;	// reset
+	_inKey = kActionNone;	// reset
 }
 
 Common::Point Input::getMousePos() const {
diff --git a/engines/queen/input.h b/engines/queen/input.h
index 40b4302e443..f6bb6800bae 100644
--- a/engines/queen/input.h
+++ b/engines/queen/input.h
@@ -31,6 +31,11 @@ class OSystem;
 
 namespace Queen {
 
+struct verbAction {
+	Verb _verb;
+	Common::CustomEventType _action;
+};
+
 class Input {
 public:
 
@@ -121,7 +126,7 @@ private:
 	bool _quickLoad;
 
 	//! set by delay();
-	Common::KeyCode _inKey;
+	Common::CustomEventType _inKey;
 
 	//! set by delay();
 	int _mouseButton;
@@ -129,14 +134,8 @@ private:
 	//! user idle time
 	uint32 _idleTime;
 
-	//! command keys for current language
-	const char *_currentCommandKeys;
-
-	//! command keys for all languages
-	static const char *const _commandKeys[];
-
-	//! verbs matching the command keys
-	static const Verb _verbKeys[];
+	//! verbs matching the actions
+	static const verbAction _verbActions[];
 };
 
 } // End of namespace Queen
diff --git a/engines/queen/journal.cpp b/engines/queen/journal.cpp
index a462729f8de..4d395d5caea 100644
--- a/engines/queen/journal.cpp
+++ b/engines/queen/journal.cpp
@@ -35,6 +35,8 @@
 #include "queen/resource.h"
 #include "queen/sound.h"
 
+#include "backends/keymapper/keymapper.h"
+
 namespace Queen {
 
 Journal::Journal(QueenEngine *vm)
@@ -63,12 +65,19 @@ void Journal::use() {
 	update();
 	_vm->display()->palFadeIn(ROOM_JOURNAL);
 
+	Common::Keymapper *keymapper = g_system->getEventManager()->getKeymapper();
+	keymapper->getKeymap("game-shortcuts")->setEnabled(false);
+	keymapper->getKeymap("journal")->setEnabled(true);
+
 	_quitMode = QM_LOOP;
 	while (_quitMode == QM_LOOP) {
 		Common::Event event;
 		Common::EventManager *eventMan = _system->getEventManager();
 		while (eventMan->pollEvent(event)) {
 			switch (event.type) {
+			case Common::EVENT_CUSTOM_ENGINE_ACTION_START:
+				handleAction(event.customType);
+				break;
 			case Common::EVENT_KEYDOWN:
 				handleKeyDown(event.kbd.ascii, event.kbd.keycode);
 				break;
@@ -92,6 +101,9 @@ void Journal::use() {
 		_system->updateScreen();
 	}
 
+	keymapper->getKeymap("journal")->setEnabled(false);
+	keymapper->getKeymap("game-shortcuts")->setEnabled(true);
+
 	_vm->writeOptionSettings();
 
 	_vm->display()->clearTexts(0, GAME_SCREEN_HEIGHT - 1);
@@ -227,14 +239,28 @@ void Journal::handleKeyDown(uint16 ascii, int keycode) {
 	case PM_INFO_BOX:
 		break;
 	case PM_YES_NO:
-		if (keycode == Common::KEYCODE_ESCAPE) {
-			exitYesNoPanelMode();
-		} else if (_textField.enabled) {
+		if (_textField.enabled) {
 			updateTextField(ascii, keycode);
 		}
 		break;
 	case PM_NORMAL:
-		if (keycode == Common::KEYCODE_ESCAPE) {
+		break;
+	default:
+		break;
+	}
+}
+
+void Journal::handleAction(Common::CustomEventType action) {
+	switch (_panelMode) {
+	case PM_INFO_BOX:
+		break;
+	case PM_YES_NO:
+		if (action == kActionCloseJournal) {
+			exitYesNoPanelMode();
+		}
+		break;
+	case PM_NORMAL:
+		if (action == kActionCloseJournal) {
 			_quitMode = QM_CONTINUE;
 		}
 		break;
diff --git a/engines/queen/journal.h b/engines/queen/journal.h
index 5e30e7d36da..4fc1eb3a23f 100644
--- a/engines/queen/journal.h
+++ b/engines/queen/journal.h
@@ -154,6 +154,7 @@ private:
 	void handleMouseWheel(int inc);
 	void handleMouseDown(int x, int y);
 	void handleKeyDown(uint16 ascii, int keycode);
+	void handleAction(Common::CustomEventType action);
 
 	void drawPanelText(int y, const char *text);
 	void drawCheckBox(bool active, int bobNum, int16 x, int16 y, int frameNum);
diff --git a/engines/queen/metaengine.cpp b/engines/queen/metaengine.cpp
index 3e45bffd0e1..501b1b6b828 100644
--- a/engines/queen/metaengine.cpp
+++ b/engines/queen/metaengine.cpp
@@ -25,10 +25,15 @@
 #include "common/system.h"
 #include "common/translation.h"
 
+#include "queen/input.h"
 #include "queen/queen.h"
 #include "queen/resource.h"
 #include "queen/detection.h"
 
+#include "backends/keymapper/action.h"
+#include "backends/keymapper/keymapper.h"
+#include "backends/keymapper/standard-actions.h"
+
 static const ADExtraGuiOptionsMap optionsList[] = {
 	{
 		GAMEOPTION_ALT_INTRO,
@@ -72,6 +77,7 @@ public:
 	int getMaximumSaveSlot() const override { return 99; }
 	bool removeSaveState(const char *target, int slot) const override;
 	int getAutosaveSlot() const override { return 99; }
+	Common::KeymapArray initKeymaps(const char *target) const override;
 };
 
 bool QueenMetaEngine::hasFeature(MetaEngineFeature f) const {
@@ -122,6 +128,191 @@ Common::Error QueenMetaEngine::createInstance(OSystem *syst, Engine **engine, co
 	return Common::kNoError;
 }
 
+static const char *const CommandKeys[] = {
+	"ocmglptu", // English
+	"osbgpnre", // German
+	"ofdnepau", // French
+	"acsdgpqu", // Italian
+	"ocmglptu", // Hebrew
+	"acodmthu"  // Spanish
+};
+
+const char *CurrentCommandKeys;
+
+Common::KeymapArray QueenMetaEngine::initKeymaps(const char *target) const {
+	using namespace Common;
+	using namespace Queen;
+
+	Keymap *engineKeymap = new Keymap(Keymap::kKeymapTypeGame, "queen-default", _("Default keymappings"));
+	Keymap *gameKeymap = new Keymap(Keymap::kKeymapTypeGame, "game-shortcuts", _("Game keymappings"));
+	Keymap *journalKeymap = new Keymap(Keymap::kKeymapTypeGame, "journal", _("Journal keymappings"));
+
+	Action *act;
+
+	Language language = parseLanguage(ConfMan.get("language"));
+
+	switch (language) {
+	case EN_ANY:
+	case EL_GRC:
+	case RU_RUS:
+		CurrentCommandKeys = CommandKeys[0];
+		break;
+	case DE_DEU:
+		CurrentCommandKeys = CommandKeys[1];
+		break;
+	case FR_FRA:
+		CurrentCommandKeys = CommandKeys[2];
+		break;
+	case IT_ITA:
+		CurrentCommandKeys = CommandKeys[3];
+		break;
+	case HE_ISR:
+		CurrentCommandKeys = CommandKeys[4];
+		break;
+	case ES_ESP:
+		CurrentCommandKeys = CommandKeys[5];
+		break;
+	default:
+		error("Unknown language");
+		break;
+	}
+
+	act = new Action(kStandardActionLeftClick, _("Move / Interact"));
+	act->setLeftClickEvent();
+	act->addDefaultInputMapping("MOUSE_LEFT");
+	act->addDefaultInputMapping("JOY_A");
+	engineKeymap->addAction(act);
+
+	act = new Action(kStandardActionRightClick, _("Move / Skip / Use default action with inventory item"));
+	act->setRightClickEvent();
+	act->addDefaultInputMapping("MOUSE_RIGHT");
+	act->addDefaultInputMapping("JOY_B");
+	engineKeymap->addAction(act);
+
+	act = new Action("FASTMODE", _("Toggle fast mode"));
+	act->setCustomEngineActionEvent(kActionFastMode);
+	act->addDefaultInputMapping("C+f");
+	act->addDefaultInputMapping("JOY_Y");
+	gameKeymap->addAction(act);
+
+	act = new Action("SKIPTEXT", _("Skip text"));
+	act->setCustomEngineActionEvent(kActionSkipText);
+	act->addDefaultInputMapping("SPACE");
+	gameKeymap->addAction(act);
+
+	act = new Action("INVSCROLLUP", _("Scroll inventory up"));
+	act->setCustomEngineActionEvent(kActionScrollUp);
+	act->addDefaultInputMapping("COMMA");
+	act->addDefaultInputMapping("JOY_UP");
+	gameKeymap->addAction(act);
+
+	act = new Action("INVSCROLLDOWN", _("Scroll inventory down"));
+	act->setCustomEngineActionEvent(kActionScrollDown);
+	act->addDefaultInputMapping("PERIOD");
+	act->addDefaultInputMapping("JOY_DOWN");
+	gameKeymap->addAction(act);
+
+	act = new Action("INVITEM1", _("inventory item 1"));
+	act->setCustomEngineActionEvent(kActionInvSlot1);
+	act->addDefaultInputMapping("1");
+	gameKeymap->addAction(act);
+
+	act = new Action("INVITEM2", _("inventory item 2"));
+	act->setCustomEngineActionEvent(kActionInvSlot2);
+	act->addDefaultInputMapping("2");
+	gameKeymap->addAction(act);
+
+	act = new Action("INVITEM3", _("inventory item 3"));
+	act->setCustomEngineActionEvent(kActionInvSlot3);
+	act->addDefaultInputMapping("3");
+	gameKeymap->addAction(act);
+
+	act = new Action("INVITEM4", _("inventory item 4"));
+	act->setCustomEngineActionEvent(kActionInvSlot4);
+	act->addDefaultInputMapping("4");
+	gameKeymap->addAction(act);
+
+	act = new Action("SKIPCUTAWAY", _("Skip cutaway / dialog"));
+	act->setCustomEngineActionEvent(kActionSkipCutaway);
+	act->addDefaultInputMapping("ESCAPE");
+	gameKeymap->addAction(act);
+
+	act = new Action("USEJOURNAL", _("Use journal"));
+	act->setCustomEngineActionEvent(kActionJournal);
+	act->addDefaultInputMapping("F1");
+	act->addDefaultInputMapping("F5");
+	act->addDefaultInputMapping("JOY_X");
+	gameKeymap->addAction(act);
+
+	act = new Action("QUICKSAVE", _("Quick save"));
+	act->setCustomEngineActionEvent(kActionSave);
+	act->addDefaultInputMapping("F11");
+	act->addDefaultInputMapping("JOY_LEFT_TRIGGER");
+	gameKeymap->addAction(act);
+
+	act = new Action("QUICKLOAD", _("Quick load"));
+	act->setCustomEngineActionEvent(kActionLoad);
+	act->addDefaultInputMapping("F12");
+	act->addDefaultInputMapping("JOY_RIGHT_TRIGGER");
+	gameKeymap->addAction(act);
+
+	act = new Action("OPEN", _("Open"));
+	act->setCustomEngineActionEvent(kActionOpen);
+	act->addDefaultInputMapping(String(CurrentCommandKeys[0]));
+	gameKeymap->addAction(act);
+
+	act = new Action("CLOSE", _("Close"));
+	act->setCustomEngineActionEvent(kActionClose);
+	act->addDefaultInputMapping(String(CurrentCommandKeys[1]));
+	gameKeymap->addAction(act);
+
+	act = new Action("MOVE", _("Move"));
+	act->setCustomEngineActionEvent(kActionMove);
+	act->addDefaultInputMapping(String(CurrentCommandKeys[2]));
+	gameKeymap->addAction(act);
+
+	act = new Action("GIVE", _("Give"));
+	act->setCustomEngineActionEvent(kActionGive);
+	act->addDefaultInputMapping(String(CurrentCommandKeys[3]));
+	gameKeymap->addAction(act);
+
+	act = new Action("LOOK", _("Look at"));
+	act->setCustomEngineActionEvent(kActionLook);
+	act->addDefaultInputMapping(String(CurrentCommandKeys[4]));
+	gameKeymap->addAction(act);
+
+	act = new Action("PICKUP", _("Pick up"));
+	act->setCustomEngineActionEvent(kActionPickUp);
+	act->addDefaultInputMapping(String(CurrentCommandKeys[5]));
+	gameKeymap->addAction(act);
+
+	act = new Action("TALK", _("Talk to"));
+	act->setCustomEngineActionEvent(kActionTalk);
+	act->addDefaultInputMapping(String(CurrentCommandKeys[6]));
+	gameKeymap->addAction(act);
+
+	act = new Action("USE", _("Use"));
+	act->setCustomEngineActionEvent(kActionUse);
+	act->addDefaultInputMapping(String(CurrentCommandKeys[7]));
+	gameKeymap->addAction(act);
+
+	act = new Action("CLOSE", _("Close journal"));
+	act->setCustomEngineActionEvent(kActionCloseJournal);
+	act->addDefaultInputMapping("ESCAPE");
+	act->addDefaultInputMapping("JOY_X");
+	journalKeymap->addAction(act);
+
+	KeymapArray keymaps(3);
+
+	keymaps[0] = engineKeymap;
+	keymaps[1] = gameKeymap;
+	keymaps[2] = journalKeymap;
+
+	journalKeymap->setEnabled(false);
+
+	return keymaps;
+}
+
 #if PLUGIN_ENABLED_DYNAMIC(QUEEN)
 	REGISTER_PLUGIN_DYNAMIC(QUEEN, PLUGIN_TYPE_ENGINE, QueenMetaEngine);
 #else
diff --git a/engines/queen/queen.h b/engines/queen/queen.h
index 8658286016d..2c0cf676fe0 100644
--- a/engines/queen/queen.h
+++ b/engines/queen/queen.h
@@ -39,6 +39,31 @@ class SeekableReadStream;
  */
 namespace Queen {
 
+enum QUEENActions {
+	kActionNone,
+	kActionFastMode,
+	kActionSkipText,
+	kActionScrollUp,
+	kActionScrollDown,
+	kActionInvSlot1,
+	kActionInvSlot2,
+	kActionInvSlot3,
+	kActionInvSlot4,
+	kActionSkipCutaway,
+	kActionJournal,
+	kActionSave,
+	kActionLoad,
+	kActionOpen,
+	kActionClose,
+	kActionMove,
+	kActionGive,
+	kActionLook,
+	kActionPickUp,
+	kActionTalk,
+	kActionUse,
+	kActionCloseJournal,
+};
+
 struct GameStateHeader {
 	uint32 version;
 	uint32 flags;




More information about the Scummvm-git-logs mailing list