[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