[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