[Scummvm-git-logs] scummvm master -> 817793da916bb3ea75cf5056856dd656c64ae870
sev-
noreply at scummvm.org
Sun Aug 10 08:07:42 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:
817793da91 NEVERHOOD: Add keymapper support
Commit: 817793da916bb3ea75cf5056856dd656c64ae870
https://github.com/scummvm/scummvm/commit/817793da916bb3ea75cf5056856dd656c64ae870
Author: aunnoman1 (aunnoman123 at outlook.com)
Date: 2025-08-10T10:07:39+02:00
Commit Message:
NEVERHOOD: Add keymapper support
Changed paths:
engines/neverhood/POTFILES
engines/neverhood/gamemodule.cpp
engines/neverhood/gamemodule.h
engines/neverhood/menumodule.cpp
engines/neverhood/metaengine.cpp
engines/neverhood/neverhood.cpp
engines/neverhood/neverhood.h
diff --git a/engines/neverhood/POTFILES b/engines/neverhood/POTFILES
index a5e485a8f64..ebc6ce6db48 100644
--- a/engines/neverhood/POTFILES
+++ b/engines/neverhood/POTFILES
@@ -1,2 +1,3 @@
engines/neverhood/dialogs.cpp
engines/neverhood/menumodule.cpp
+engines/neverhood/metaengine.cpp
diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 927537b6ecb..6240ca67d57 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -155,14 +155,14 @@ void GameModule::handleAsciiKey(char key) {
_currentCheat += key;
}
-void GameModule::handleKeyDown(Common::KeyCode keyCode) {
+void GameModule::handleKeyDown(Common::CustomEventType action) {
if (_childObject) {
- if (keyCode == Common::KEYCODE_ESCAPE)
+ if (action == kActionPause || action == kActionQuit || action == kActionSkipFull)
handleEscapeKey();
- else if (keyCode == Common::KEYCODE_SPACE)
+ else if (action == kActionSkipPartial)
handleSpaceKey();
debug(2, "GameModule::handleKeyDown()");
- sendMessage(_childObject, 0x000B, keyCode);
+ sendMessage(_childObject, 0x000B, action);
}
}
diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h
index 99d0acb245e..6086f1e712c 100644
--- a/engines/neverhood/gamemodule.h
+++ b/engines/neverhood/gamemodule.h
@@ -43,7 +43,7 @@ public:
void handleWheelDown();
void handleSpaceKey();
void handleAsciiKey(char key);
- void handleKeyDown(Common::KeyCode keyCode);
+ void handleKeyDown(Common::CustomEventType action);
void handleEscapeKey();
void initKeySlotsPuzzle();
void initMemoryPuzzle();
diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp
index dcfbb81e9e3..bb74fe206ca 100644
--- a/engines/neverhood/menumodule.cpp
+++ b/engines/neverhood/menumodule.cpp
@@ -31,6 +31,8 @@
#include "engines/savestate.h"
+#include "backends/keymapper/keymapper.h"
+
#if defined(USE_FREETYPE2)
#include "graphics/font.h"
#include "graphics/fonts/ttf.h"
@@ -502,7 +504,7 @@ uint32 CreditsScene::handleMessage(int messageNum, const MessageParam ¶m, En
leaveScene(0);
break;
case 0x000B:
- if (param.asInteger() == Common::KEYCODE_ESCAPE && _canAbort)
+ if (param.asInteger() == kActionSkipFull && _canAbort)
leaveScene(0);
break;
case NM_MOUSE_HIDE:
@@ -974,6 +976,10 @@ GameStateMenu::GameStateMenu(NeverhoodEngine *vm, Module *parentModule, Savegame
return;
}
+ Common::Keymapper *keymapper = g_system->getEventManager()->getKeymapper();
+ keymapper->getKeymap("game")->setEnabled(false);
+ keymapper->getKeymap("save-management")->setEnabled(true);
+
setBackground(backgroundFileHash);
setPalette(backgroundFileHash);
insertScreenMouse(mouseFileHash, mouseRect);
@@ -1031,6 +1037,7 @@ void GameStateMenu::performAction() {
uint32 GameStateMenu::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) {
Scene::handleMessage(messageNum, param, sender);
+ Common::Keymapper *keymapper = g_system->getEventManager()->getKeymapper();
switch (messageNum) {
case 0x000A:
if (!_textEditWidget->isReadOnly()) {
@@ -1039,11 +1046,15 @@ uint32 GameStateMenu::handleMessage(int messageNum, const MessageParam ¶m, E
}
break;
case 0x000B:
- if (param.asInteger() == Common::KEYCODE_RETURN)
+ if (param.asInteger() == kActionConfirm) {
performAction();
- else if (param.asInteger() == Common::KEYCODE_ESCAPE)
+ keymapper->getKeymap("save-management")->setEnabled(false);
+ keymapper->getKeymap("game")->setEnabled(true);
+ } else if (param.asInteger() == kActionPause) {
leaveScene(1);
- else if (!_textEditWidget->isReadOnly()) {
+ keymapper->getKeymap("save-management")->setEnabled(false);
+ keymapper->getKeymap("game")->setEnabled(true);
+ } else if (!_textEditWidget->isReadOnly()) {
sendMessage(_textEditWidget, 0x000B, param.asInteger());
setCurrWidget(_textEditWidget);
}
@@ -1053,9 +1064,13 @@ uint32 GameStateMenu::handleMessage(int messageNum, const MessageParam ¶m, E
switch (param.asInteger()) {
case 0:
performAction();
+ keymapper->getKeymap("save-management")->setEnabled(false);
+ keymapper->getKeymap("game")->setEnabled(true);
break;
case 1:
leaveScene(1);
+ keymapper->getKeymap("save-management")->setEnabled(false);
+ keymapper->getKeymap("game")->setEnabled(true);
break;
case 2:
_listBox->pageUp();
diff --git a/engines/neverhood/metaengine.cpp b/engines/neverhood/metaengine.cpp
index 0662b6a3b9e..b075e012b84 100644
--- a/engines/neverhood/metaengine.cpp
+++ b/engines/neverhood/metaengine.cpp
@@ -28,6 +28,12 @@
#include "neverhood/neverhood.h"
#include "neverhood/detection.h"
+#include "common/translation.h"
+
+#include "backends/keymapper/action.h"
+#include "backends/keymapper/keymapper.h"
+#include "backends/keymapper/standard-actions.h"
+
namespace Neverhood {
const char *NeverhoodEngine::getGameId() const {
@@ -73,6 +79,7 @@ public:
int getMaximumSaveSlot() const override;
bool removeSaveState(const char *target, int slot) const override;
SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const override;
+ Common::KeymapArray initKeymaps(const char *target) const override;
};
bool NeverhoodMetaEngine::hasFeature(MetaEngineFeature f) const {
@@ -168,6 +175,73 @@ SaveStateDescriptor NeverhoodMetaEngine::querySaveMetaInfos(const char *target,
return SaveStateDescriptor();
}
+Common::KeymapArray NeverhoodMetaEngine::initKeymaps(const char *target) const {
+ using namespace Common;
+ using namespace Neverhood;
+
+ Common::String extra = ConfMan.get("extra", target);
+ const bool isDemo = extra.contains("Demo");
+
+ Keymap *engineKeyMap = new Keymap(Keymap::kKeymapTypeGame, "neverhood-default", _("Default keymappings"));
+ Keymap *gameKeymap = new Keymap(Keymap::kKeymapTypeGame, "game", _("Game keymappings"));
+ Keymap *saveMenuKeymap = new Keymap(Keymap::kKeymapTypeGame, "save-management", _("Save file management menus keymappings"));
+ Keymap *pauseKeymap = new Keymap(Keymap::kKeymapTypeGame, "pause", _("Pause menu keymappings"));
+
+ Action *act;
+
+ act = new Action(kStandardActionInteract, _("Move / Interact"));
+ act->setLeftClickEvent();
+ act->addDefaultInputMapping("MOUSE_LEFT");
+ act->addDefaultInputMapping("MOUSE_RIGHT");
+ act->addDefaultInputMapping("JOY_A");
+ engineKeyMap->addAction(act);
+
+ if (isDemo) {
+ act = new Action("QUIT", _("Quit"));
+ act->setCustomEngineActionEvent(kActionQuit);
+ act->addDefaultInputMapping("ESCAPE");
+ act->addDefaultInputMapping("JOY_Y");
+ pauseKeymap->addAction(act);
+ } else {
+ act = new Action("PAUSE", _("Pause / Exit menu"));
+ act->setCustomEngineActionEvent(kActionPause);
+ act->addDefaultInputMapping("ESCAPE");
+ act->addDefaultInputMapping("JOY_Y");
+ pauseKeymap->addAction(act);
+ }
+
+ // I18N: (Game name: The Neverhood) The game has multiple cutscenes, and this action skips part of the scene.
+ act = new Action("SKIP", _("Skip section of cutscene"));
+ act->setCustomEngineActionEvent(kActionSkipPartial);
+ act->addDefaultInputMapping("SPACE");
+ act->addDefaultInputMapping("JOY_B");
+ gameKeymap->addAction(act);
+
+ // I18N: (Game name: The Neverhood) The game has multiple cutscenes, and this action skips the entire scene.
+ act = new Action("SKIPCREDITS", _("Skip entire scene (works only in some scenes)"));
+ act->setCustomEngineActionEvent(kActionSkipFull);
+ act->addDefaultInputMapping("ESCAPE");
+ act->addDefaultInputMapping("JOY_X");
+ gameKeymap->addAction(act);
+
+ // I18N: (Game name: The Neverhood) This action confirms the selected save or entered new save name in the save file management menus.
+ act = new Action("Confirm", _("Confirm the selected save / new save name"));
+ act->setCustomEngineActionEvent(kActionConfirm);
+ act->addDefaultInputMapping("RETURN");
+ act->addDefaultInputMapping("JOY_X");
+ saveMenuKeymap->addAction(act);
+
+ KeymapArray keymaps(4);
+ keymaps[0] = engineKeyMap;
+ keymaps[1] = gameKeymap;
+ keymaps[2] = pauseKeymap;
+ keymaps[3] = saveMenuKeymap;
+
+ saveMenuKeymap->setEnabled(false);
+
+ return keymaps;
+}
+
#if PLUGIN_ENABLED_DYNAMIC(NEVERHOOD)
REGISTER_PLUGIN_DYNAMIC(NEVERHOOD, PLUGIN_TYPE_ENGINE, NeverhoodMetaEngine);
#else
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index 2e407df35bf..787e50e354b 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -191,6 +191,11 @@ void NeverhoodEngine::mainLoop() {
Common::EventManager *eventMan = _system->getEventManager();
while (eventMan->pollEvent(event)) {
switch (event.type) {
+ case Common::EVENT_CUSTOM_ENGINE_ACTION_START:
+ _gameModule->handleKeyDown(event.customType);
+ break;
+ case Common::EVENT_CUSTOM_ENGINE_ACTION_END:
+ break;
case Common::EVENT_KEYDOWN:
_gameModule->handleKeyDown(event.kbd.keycode);
_gameModule->handleAsciiKey(event.kbd.ascii);
diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h
index 10b161926aa..db3b9e67ab8 100644
--- a/engines/neverhood/neverhood.h
+++ b/engines/neverhood/neverhood.h
@@ -38,6 +38,15 @@ struct ADGameDescription;
namespace Neverhood {
+enum NEVERHOODActions {
+ kActionNone,
+ kActionPause,
+ kActionQuit,
+ kActionSkipPartial,
+ kActionSkipFull,
+ kActionConfirm,
+};
+
class GameModule;
class GameVars;
class ResourceMan;
More information about the Scummvm-git-logs
mailing list