[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 &param, 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 &param, 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 &param, 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 &param, 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