[Scummvm-git-logs] scummvm master -> 555b5d3c99480e9a5e33275022427c0ba357fe73

sev- noreply at scummvm.org
Mon Jun 30 12:47:03 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:
555b5d3c99 NGI: Add keymapper support


Commit: 555b5d3c99480e9a5e33275022427c0ba357fe73
    https://github.com/scummvm/scummvm/commit/555b5d3c99480e9a5e33275022427c0ba357fe73
Author: aunnoman1 (aunnoman123 at outlook.com)
Date: 2025-06-30T14:46:59+02:00

Commit Message:
NGI: Add keymapper support

Changed paths:
    engines/ngi/messagehandlers.cpp
    engines/ngi/metaengine.cpp
    engines/ngi/modal.cpp
    engines/ngi/modal.h
    engines/ngi/ngi.cpp
    engines/ngi/ngi.h


diff --git a/engines/ngi/messagehandlers.cpp b/engines/ngi/messagehandlers.cpp
index 2bbeb62edc3..fbabb8326b7 100644
--- a/engines/ngi/messagehandlers.cpp
+++ b/engines/ngi/messagehandlers.cpp
@@ -157,22 +157,22 @@ int global_messageHandler1(ExCommand *cmd) {
 			g_nmi->defHandleKeyDown(cmd->_param);
 
 			switch (cmd->_param) {
-			case '\x1B': // ESC
+			case kActionPause: 
 				if (g_nmi->_currentScene) {
 					getGameLoaderInventory()->unselectItem(0);
 					g_nmi->openMainMenu();
 					cmd->_messageKind = 0;
 				}
 				break;
-			case 't':
+			case kActionStopSounds:
 				g_nmi->stopAllSounds();
 				cmd->_messageKind = 0;
 				break;
-			case 'u':
+			case kActionToggleMute:
 				g_nmi->toggleMute();
 				cmd->_messageKind = 0;
 				break;
-			case ' ':
+			case kActionInventory:
 				if (getGameLoaderInventory()->getIsLocked()) {
 					if (getGameLoaderInventory()->getIsInventoryOut()) {
 						getGameLoaderInventory()->setIsLocked(0);
@@ -182,21 +182,17 @@ int global_messageHandler1(ExCommand *cmd) {
 					getGameLoaderInventory()->setIsLocked(1);
 				}
 				break;
-			case '\t':
-				// Demo has no map
-				if (g_nmi->isDemo() && g_nmi->getLanguage() == Common::RU_RUS)
-					break;
-
+			case kActionMapOpen:
 				if (g_nmi->_flgCanOpenMap)
 					g_nmi->openMap();
 				cmd->_messageKind = 0;
 				break;
-			case Common::KEYCODE_F1:
+			case kActionHelp:
 				if (g_nmi->_flgCanOpenMap)
 					g_nmi->openHelp();
 				cmd->_messageKind = 0;
 				break;
-			case '8':
+			case Common::KEYCODE_8:
 				{
 					int num = 32;
 					for (uint i = 0; i < g_nmi->_gameLoader->_sc2array[num]._picAniInfos.size(); i++) {
diff --git a/engines/ngi/metaengine.cpp b/engines/ngi/metaengine.cpp
index ac05ce7cda6..1ddce7d8f67 100644
--- a/engines/ngi/metaengine.cpp
+++ b/engines/ngi/metaengine.cpp
@@ -30,6 +30,12 @@
 #include "ngi/detection.h"
 #include "ngi/gameloader.h"
 
+#include "common/translation.h"
+
+#include "backends/keymapper/action.h"
+#include "backends/keymapper/keymapper.h"
+#include "backends/keymapper/standard-actions.h"
+
 namespace NGI {
 
 uint32 NGIEngine::getFeatures() const {
@@ -65,6 +71,8 @@ public:
 	int getMaximumSaveSlot() const override { return 99; }
 
 	Common::Error createInstance(OSystem *syst, Engine **engine, const NGI::NGIGameDescription *desc) const override;
+
+	Common::KeymapArray initKeymaps(const char *target) const override;
 };
 
 bool NGIMetaEngine::hasFeature(MetaEngineFeature f) const {
@@ -84,6 +92,113 @@ Common::Error NGIMetaEngine::createInstance(OSystem *syst, Engine **engine, cons
 	return Common::kNoError;
 }
 
+Common::KeymapArray NGIMetaEngine::initKeymaps(const char *target) const {
+	using namespace Common;
+	using namespace NGI;
+
+	String extra = ConfMan.get("extra", target);
+	const bool isDemo = extra.contains("Demo");
+
+	Keymap *engineKeymap = new Keymap(Keymap::kKeymapTypeGame, "ngi-default", _("Default keymappings"));
+	Keymap *mapKeymap = new Keymap(Keymap::kKeymapTypeGame, "map", _("Map keymappings"));
+	Keymap *introKeymap = new Keymap(Keymap::kKeymapTypeGame, "intro", _("Intro keymappings"));
+	Keymap *creditsKeymap = new Keymap(Keymap::kKeymapTypeGame, "credits", _("Credits keymappings"));
+	// I18N: Keymap for various dialogs such as save game dialog.
+	Keymap *dialogKeymap = new Keymap(Keymap::kKeymapTypeGame, "dialog", _("Dialog keymappings"));
+
+	Common::Action *act;
+
+	act = new Action(kStandardActionLeftClick, _("Move / Interact"));
+	act->setLeftClickEvent();
+	act->addDefaultInputMapping("MOUSE_LEFT");
+	act->addDefaultInputMapping("JOY_A");
+	engineKeymap->addAction(act);
+
+	act = new Action(kStandardActionRightClick, _("Deselect item"));
+	act->setRightClickEvent();
+	act->addDefaultInputMapping("MOUSE_RIGHT");
+	act->addDefaultInputMapping("JOY_B");
+	engineKeymap->addAction(act);
+
+	act = new Action("PAUSE", _("Pause"));
+	act->setCustomEngineActionEvent(kActionPause);
+	act->addDefaultInputMapping("ESCAPE");
+	act->addDefaultInputMapping("JOY_Y");
+	engineKeymap->addAction(act);
+
+	// I18N: Stops all currently playing sounds.
+	act = new Action("STOPSOUNDS", _("Stop sounds"));
+	act->setCustomEngineActionEvent(kActionStopSounds);
+	act->addDefaultInputMapping("t");
+	act->addDefaultInputMapping("JOY_LEFT");
+	engineKeymap->addAction(act);
+
+	act = new Action("TOGGLEMUTE", _("Toggle mute"));
+	act->setCustomEngineActionEvent(kActionToggleMute);
+	act->addDefaultInputMapping("u");
+	act->addDefaultInputMapping("JOY_DOWN");
+	engineKeymap->addAction(act);
+
+	act = new Action("TOGGLEINV", _("Toggle inventory"));
+	act->setCustomEngineActionEvent(kActionInventory);
+	act->addDefaultInputMapping("SPACE");
+	act->addDefaultInputMapping("JOY_X");
+	engineKeymap->addAction(act);
+
+	// I18N: Opens the help screen.
+	act = new Action("TOGGLEHELP", _("Help"));
+	act->setCustomEngineActionEvent(kActionHelp);
+	act->addDefaultInputMapping("F1");
+	act->addDefaultInputMapping("JOY_LEFT_SHOULDER");
+	engineKeymap->addAction(act);
+
+	act = new Action("SKIP", _("Skip intro"));
+	act->setCustomEngineActionEvent(kActionSkipIntro);
+	act->addDefaultInputMapping("ESCAPE");
+	act->addDefaultInputMapping("RETURN");
+	act->addDefaultInputMapping("SPACE");
+	act->addDefaultInputMapping("JOY_X");
+	introKeymap->addAction(act);
+
+	act = new Action("SKIPCREDITS", _("Skip credits"));
+	act->setCustomEngineActionEvent(kActionSkipCredits);
+	act->addDefaultInputMapping("ESCAPE");
+	act->addDefaultInputMapping("JOY_X");
+	creditsKeymap->addAction(act);
+
+	// I18N: Closes any open dialogs, such as save game dialog.
+	act = new Action("CLOSEDLG", _("Close dialog"));
+	act->setCustomEngineActionEvent(kActionCloseDialog);
+	act->addDefaultInputMapping("ESCAPE");
+	act->addDefaultInputMapping("JOY_B");
+	dialogKeymap->addAction(act);
+
+	// Demo has no map
+	if (!(isDemo && parseLanguage(ConfMan.get("language", target)) == RU_RUS)) {
+		act = new Action("OPENMAP", _("Open map"));
+		act->setCustomEngineActionEvent(kActionMapOpen);
+		act->addDefaultInputMapping("TAB");
+		act->addDefaultInputMapping("JOY_RIGHT");
+		engineKeymap->addAction(act);
+
+		act = new Action("CLOSEMAP", _("Close map"));
+		act->setCustomEngineActionEvent(kActionMapClose);
+		act->addDefaultInputMapping("TAB");
+		act->addDefaultInputMapping("ESCAPE");
+		act->addDefaultInputMapping("JOY_RIGHT");
+		mapKeymap->addAction(act);
+	}
+
+	KeymapArray keymaps(5);
+	keymaps[0] = engineKeymap;
+	keymaps[1] = mapKeymap;
+	keymaps[2] = introKeymap;
+	keymaps[3] = creditsKeymap;
+	keymaps[4] = dialogKeymap;
+
+	return keymaps;
+}
+
 #if PLUGIN_ENABLED_DYNAMIC(NGI)
 	REGISTER_PLUGIN_DYNAMIC(NGI, PLUGIN_TYPE_ENGINE, NGIMetaEngine);
 #else
diff --git a/engines/ngi/modal.cpp b/engines/ngi/modal.cpp
index 23ea65a8ace..ed66ac62460 100644
--- a/engines/ngi/modal.cpp
+++ b/engines/ngi/modal.cpp
@@ -35,6 +35,8 @@
 #include "graphics/paletteman.h"
 #include "graphics/surface.h"
 
+#include "backends/keymapper/keymapper.h"
+
 namespace NGI {
 
 ModalIntro::ModalIntro() {
@@ -54,11 +56,19 @@ ModalIntro::ModalIntro() {
 
 	g_vars->sceneIntro_skipIntro = false;
 	_sfxVolume = g_nmi->_sfxVolume;
+
+	Common::Keymapper *keymapper = g_system->getEventManager()->getKeymapper();
+	keymapper->getKeymap("ngi-default")->setEnabled(false);
+	keymapper->getKeymap("intro")->setEnabled(true);
 }
 
 ModalIntro::~ModalIntro() {
 	g_nmi->stopAllSounds();
 	g_nmi->_sfxVolume = _sfxVolume;
+
+	Common::Keymapper *keymapper = g_system->getEventManager()->getKeymapper();
+	keymapper->getKeymap("intro")->setEnabled(false);
+	keymapper->getKeymap("ngi-default")->setEnabled(true);
 }
 
 bool ModalIntro::handleMessage(ExCommand *message) {
@@ -68,7 +78,7 @@ bool ModalIntro::handleMessage(ExCommand *message) {
 	if (message->_messageNum != 36)
 		return false;
 
-	if (message->_param != 13 && message->_param != 27 && message->_param != 32)
+	if (message->_param != kActionSkipIntro)
 		return false;
 
 	if (_stillRunning) {
@@ -239,11 +249,18 @@ ModalIntroDemo::ModalIntroDemo() {
 	_introFlags = 9;
 	g_vars->sceneIntro_skipIntro = false;
 	_sfxVolume = g_nmi->_sfxVolume;
+
+	Common::Keymapper *keymapper = g_system->getEventManager()->getKeymapper();
+	keymapper->getKeymap("ngi-default")->setEnabled(false);
+	keymapper->getKeymap("intro")->setEnabled(true);
 }
 
 ModalIntroDemo::~ModalIntroDemo() {
 	g_nmi->stopAllSounds();
 	g_nmi->_sfxVolume = _sfxVolume;
+	Common::Keymapper *keymapper = g_system->getEventManager()->getKeymapper();
+	keymapper->getKeymap("intro")->setEnabled(false);
+	keymapper->getKeymap("ngi-default")->setEnabled(true);
 }
 
 bool ModalIntroDemo::handleMessage(ExCommand *message) {
@@ -253,7 +270,7 @@ bool ModalIntroDemo::handleMessage(ExCommand *message) {
 	if (message->_messageNum != 36)
 		return false;
 
-	if (message->_param != 13 && message->_param != 27 && message->_param != 32)
+	if (message->_param != kActionSkipIntro)
 		return false;
 
 	if (_introFlags & 0x8) {
@@ -361,15 +378,11 @@ void ModalIntroDemo::finish() {
 
 static bool checkSkipVideo(const Common::Event &event) {
 	switch (event.type) {
-	case Common::EVENT_KEYDOWN:
-		switch (event.kbd.keycode) {
-		case Common::KEYCODE_ESCAPE:
-		case Common::KEYCODE_RETURN:
-		case Common::KEYCODE_SPACE:
+	case Common::EVENT_CUSTOM_ENGINE_ACTION_START:
+		if (event.customType == kActionSkipIntro)
 			return true;
-		default:
+		else
 			return false;
-		}
 	case Common::EVENT_QUIT:
 	case Common::EVENT_RETURN_TO_LAUNCHER:
 		return true;
@@ -439,6 +452,10 @@ ModalMap::ModalMap() {
 	_rect2.left = 0;
 	_rect2.bottom = 600;
 	_rect2.right = 800;
+
+	Common::Keymapper *keymapper = g_system->getEventManager()->getKeymapper();
+	keymapper->getKeymap("ngi-default")->setEnabled(false);
+	keymapper->getKeymap("map")->setEnabled(true);
 }
 
 ModalMap::~ModalMap() {
@@ -448,6 +465,10 @@ ModalMap::~ModalMap() {
 
 	g_nmi->_currentScene->_x = _x;
 	g_nmi->_currentScene->_y = _y;
+
+	Common::Keymapper *keymapper = g_system->getEventManager()->getKeymapper();
+	keymapper->getKeymap("map")->setEnabled(false);
+	keymapper->getKeymap("ngi-default")->setEnabled(true);
 }
 
 bool ModalMap::init(int counterdiff) {
@@ -616,7 +637,7 @@ bool ModalMap::handleMessage(ExCommand *cmd) {
 		return false;
 
 	case 36:
-		if (cmd->_param != 9 && cmd->_param != 27)
+		if (cmd->_param != kActionMapClose)
 			return false;
 
 		break;
@@ -1116,7 +1137,7 @@ void ModalFinal::unloadScenes() {
 }
 
 bool ModalFinal::handleMessage(ExCommand *cmd) {
-	if (cmd->_messageKind == 17 && cmd->_messageNum == 36 && cmd->_param == 27) {
+	if (cmd->_messageKind == 17 && cmd->_messageNum == 36 && cmd->_param == kActionPause) {
 		g_nmi->_modalObject = new ModalMainMenu();
 		g_nmi->_modalObject->_parentObj = this;
 
@@ -1178,16 +1199,24 @@ ModalCredits::ModalCredits() {
 	_currX = 400 - dims.x / 2;
 
 	_creditsPic->setOXY(_currX, _currY);
+
+	Common::Keymapper *keymapper = g_system->getEventManager()->getKeymapper();
+	keymapper->getKeymap("ngi-default")->setEnabled(false);
+	keymapper->getKeymap("credits")->setEnabled(true);
 }
 
 ModalCredits::~ModalCredits() {
 	g_nmi->_gameLoader->unloadScene(SC_TITLES);
 
 	g_nmi->_sfxVolume = _sfxVolume;
+
+	Common::Keymapper *keymapper = g_system->getEventManager()->getKeymapper();
+	keymapper->getKeymap("credits")->setEnabled(false);
+	keymapper->getKeymap("ngi-default")->setEnabled(true);
 }
 
 bool ModalCredits::handleMessage(ExCommand *cmd) {
-	if (cmd->_messageKind == 17 && cmd->_messageNum == 36 && cmd->_param == 27) {
+	if (cmd->_messageKind == 17 && cmd->_messageNum == 36 && cmd->_param == kActionSkipCredits) {
 		_fadeIn = false;
 
 		return true;
@@ -1391,7 +1420,7 @@ bool ModalMainMenu::handleMessage(ExCommand *message) {
 	if (message->_messageNum != 36)
 		return false;
 
-	if (message->_param == 27)
+	if (message->_param == kActionPause)
 		_hoverAreaId = PIC_MNU_CONTINUE_L;
 	else
 		enableDebugMenu(message->_param);
@@ -1836,6 +1865,10 @@ ModalQuery::~ModalQuery() {
 
 bool ModalQuery::create(Scene *sc, Scene *bgScene, int id) {
 	if (g_nmi->isDemo() && g_nmi->getLanguage() == Common::RU_RUS) {
+		Common::Keymapper *keymapper = g_system->getEventManager()->getKeymapper();
+		keymapper->getKeymap("ngi-default")->setEnabled(false);
+		keymapper->getKeymap("dialog")->setEnabled(true);
+
 		_bg = sc->getPictureObjectById(386, 0);
 
 		if (!_bg)
@@ -1858,6 +1891,10 @@ bool ModalQuery::create(Scene *sc, Scene *bgScene, int id) {
 	}
 
 	if (id == PIC_MEX_BGR) {
+		Common::Keymapper *keymapper = g_system->getEventManager()->getKeymapper();
+		keymapper->getKeymap("ngi-default")->setEnabled(false);
+		keymapper->getKeymap("dialog")->setEnabled(true);
+
 		_bg = sc->getPictureObjectById(PIC_MEX_BGR, 0);
 
 		if (!_bg)
@@ -1922,7 +1959,7 @@ bool ModalQuery::handleMessage(ExCommand *cmd) {
 
 			if (_cancelBtn->isPointInside(g_nmi->_mouseScreenPos.x, g_nmi->_mouseScreenPos.y))
 				_queryResult = 0;
-		} else if (cmd->_messageNum == 36 && cmd->_param == 27) {
+		} else if (cmd->_messageNum == 36 && cmd->_param == kActionCloseDialog) {
 			_queryResult = 0;
 
 			return false;
@@ -1947,6 +1984,10 @@ bool ModalQuery::init(int counterdiff) {
 		return true;
 	} else {
 		if (g_nmi->isDemo() && g_nmi->getLanguage() == Common::RU_RUS) {
+			Common::Keymapper *keymapper = g_system->getEventManager()->getKeymapper();
+			keymapper->getKeymap("dialog")->setEnabled(false);
+			keymapper->getKeymap("ngi-default")->setEnabled(true);
+
 			if (!_queryResult)
 				return false;
 
@@ -1969,6 +2010,10 @@ bool ModalQuery::init(int counterdiff) {
 				g_nmi->_gameContinue = false;
 
 				return false;
+			} else if (_queryResult == 0) {
+				Common::Keymapper *keymapper = g_system->getEventManager()->getKeymapper();
+				keymapper->getKeymap("dialog")->setEnabled(false);
+				keymapper->getKeymap("ngi-default")->setEnabled(true);
 			}
 		}
 	}
@@ -1996,10 +2041,18 @@ ModalSaveGame::ModalSaveGame() {
 	_mode = 1;
 
 	_objtype = kObjTypeModalSaveGame;
+
+	Common::Keymapper *keymapper = g_system->getEventManager()->getKeymapper();
+	keymapper->getKeymap("ngi-default")->setEnabled(false);
+	keymapper->getKeymap("dialog")->setEnabled(true);
 }
 
 ModalSaveGame::~ModalSaveGame() {
 	g_nmi->_sceneRect = _rect;
+
+	Common::Keymapper *keymapper = g_system->getEventManager()->getKeymapper();
+	keymapper->getKeymap("dialog")->setEnabled(false);
+	keymapper->getKeymap("ngi-default")->setEnabled(true);
 }
 
 void ModalSaveGame::setScene(Scene *sc) {
@@ -2007,8 +2060,8 @@ void ModalSaveGame::setScene(Scene *sc) {
 	_menuScene = sc;
 }
 
-void ModalSaveGame::processKey(int key) {
-	if (key == 27)
+void ModalSaveGame::processKey(int action) {
+	if (action == kActionCloseDialog)
 		_queryRes = 0;
 }
 
@@ -2470,7 +2523,7 @@ bool ModalDemo::handleMessage(ExCommand *cmd) {
 	if (cmd->_messageNum == 29) {
 		if (_button->isPointInside(g_nmi->_mouseScreenPos.x, g_nmi->_mouseScreenPos.y))
 			_clickedQuit = 1;
-	} else if (cmd->_messageNum == 36 && (cmd->_param == 27 || g_nmi->getLanguage() == Common::RU_RUS)) {
+	} else if (cmd->_messageNum == 36 && (cmd->_param == kActionPause || g_nmi->getLanguage() == Common::RU_RUS)) {
 		_clickedQuit = 1;
 	}
 
diff --git a/engines/ngi/modal.h b/engines/ngi/modal.h
index 795a11c842d..d2c14919600 100644
--- a/engines/ngi/modal.h
+++ b/engines/ngi/modal.h
@@ -299,7 +299,7 @@ public:
 
 	void setScene(Scene *sc);
 	void setup(Scene *sc, int mode);
-	void processKey(int key);
+	void processKey(int action);
 
 	char *getSaveName();
 	bool getFileInfo(int slot, FileInfo *fileinfo);
diff --git a/engines/ngi/ngi.cpp b/engines/ngi/ngi.cpp
index f8f19ed3a18..78917bb5a60 100644
--- a/engines/ngi/ngi.cpp
+++ b/engines/ngi/ngi.cpp
@@ -343,6 +343,12 @@ void NGIEngine::updateEvents() {
 
 	while (eventMan->pollEvent(event)) {
 		switch (event.type) {
+		case Common::EVENT_CUSTOM_ENGINE_ACTION_START:
+			ex = new ExCommand(0, 17, 36, 0, 0, 0, 1, 0, 0, 0);
+			ex->_param = event.customType;
+			ex->_excFlags |= 3;
+			ex->handle();
+			break;
 		case Common::EVENT_KEYDOWN:
 			_keyState = event.kbd.keycode;
 
diff --git a/engines/ngi/ngi.h b/engines/ngi/ngi.h
index 6861ae87d25..2092835887c 100644
--- a/engines/ngi/ngi.h
+++ b/engines/ngi/ngi.h
@@ -55,6 +55,20 @@ enum {
 	kDebugXML,
 };
 
+enum NGIActions {
+	kActionNone,
+	kActionPause,
+	kActionStopSounds,
+	kActionToggleMute,
+	kActionMapOpen,
+	kActionMapClose,
+	kActionHelp,
+	kActionInventory,
+	kActionSkipIntro,
+	kActionSkipCredits,
+	kActionCloseDialog,
+};
+
 #define MAXGAMEOBJH 10000
 
 struct NGIGameDescription;




More information about the Scummvm-git-logs mailing list