[Scummvm-git-logs] scummvm master -> b7d0ffad607a093f2b3cf4464b3c8f5fd66e2c33

sev- noreply at scummvm.org
Mon Sep 1 14:53:09 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:
b7d0ffad60 HYPNO: Add keymapper support


Commit: b7d0ffad607a093f2b3cf4464b3c8f5fd66e2c33
    https://github.com/scummvm/scummvm/commit/b7d0ffad607a093f2b3cf4464b3c8f5fd66e2c33
Author: aunnoman1 (aunnoman123 at outlook.com)
Date: 2025-09-01T16:53:06+02:00

Commit Message:
HYPNO: Add keymapper support

Changed paths:
    engines/hypno/arcade.cpp
    engines/hypno/boyz/arcade.cpp
    engines/hypno/boyz/hard.cpp
    engines/hypno/hypno.cpp
    engines/hypno/hypno.h
    engines/hypno/metaengine.cpp
    engines/hypno/scene.cpp
    engines/hypno/spider/arcade.cpp
    engines/hypno/wet/arcade.cpp
    engines/hypno/wet/hard.cpp


diff --git a/engines/hypno/arcade.cpp b/engines/hypno/arcade.cpp
index 5fdc38cacec..7442ab01329 100644
--- a/engines/hypno/arcade.cpp
+++ b/engines/hypno/arcade.cpp
@@ -27,6 +27,8 @@
 #include "hypno/grammar.h"
 #include "hypno/hypno.h"
 
+#include "backends/keymapper/keymapper.h"
+
 namespace Hypno {
 
 extern int parse_arc(const char *);
@@ -309,12 +311,15 @@ void HypnoEngine::runArcade(ArcadeShooting *arc) {
 			case Common::EVENT_QUIT:
 			case Common::EVENT_RETURN_TO_LAUNCHER:
 				break;
+			case Common::EVENT_CUSTOM_ENGINE_ACTION_START:
+				pressedKey(event.customType);
+				if (event.customType == kActionPrimaryShoot)
+					if (clickedPrimaryShoot(mousePos))
+						shootingPrimary = true;
+				break;
 
 			case Common::EVENT_KEYDOWN:
 				pressedKey(event.kbd.keycode);
-				if (event.kbd.keycode == Common::KEYCODE_LCTRL)
-					if (clickedPrimaryShoot(mousePos))
-						shootingPrimary = true;
 				break;
 
 			case Common::EVENT_LBUTTONDOWN:
@@ -823,5 +828,16 @@ bool HypnoEngine::checkRButtonUp() {
 void HypnoEngine::setRButtonUp(const bool val) {
 	return;
 }
+
+void HypnoEngine::disableGameKeymaps() {
+	Common::Keymapper *keymapper = g_system->getEventManager()->getKeymapper();
+	keymapper->getKeymap("game-shortcuts")->setEnabled(false);
+}
+
+void HypnoEngine::enableGameKeymaps() {
+	Common::Keymapper *keymapper = g_system->getEventManager()->getKeymapper();
+	keymapper->getKeymap("game-shortcuts")->setEnabled(true);
+}
+
 } // End of namespace Hypno
 
diff --git a/engines/hypno/boyz/arcade.cpp b/engines/hypno/boyz/arcade.cpp
index 4650fb7f4c5..0d8fac6d7a9 100644
--- a/engines/hypno/boyz/arcade.cpp
+++ b/engines/hypno/boyz/arcade.cpp
@@ -24,6 +24,8 @@
 
 #include "common/events.h"
 
+#include "backends/keymapper/keymapper.h"
+
 namespace Hypno {
 
 void BoyzEngine::runBeforeArcade(ArcadeShooting *arc) {
@@ -187,14 +189,12 @@ void BoyzEngine::showArcadeStats(int territory, const ArcadeStats &data) {
 }
 
 void BoyzEngine::pressedKey(const int keycode) {
-	if (keycode == Common::KEYCODE_c) {
-		if (_cheatsEnabled) {
-			_skipLevel = true;
-			return;
-		}
-	} else if (keycode == Common::KEYCODE_k) { // Added for testing
+	if (keycode == kActionSkipLevel) {
+		_skipLevel = true;
+		return;
+	} else if (keycode == kActionKillPlayer) { // Added for testing
 		_health = 0;
-	} else if (keycode == Common::KEYCODE_ESCAPE) {
+	} else if (keycode == kActionPause) {
 		openMainMenuDialog();
 	}
 }
@@ -907,4 +907,4 @@ bool BoyzEngine::clickedSecondaryShoot(const Common::Point &mousePos) {
 	return true;
 }
 
-} // namespace Hypno
\ No newline at end of file
+} // namespace Hypno
diff --git a/engines/hypno/boyz/hard.cpp b/engines/hypno/boyz/hard.cpp
index 445e93ca7d0..f50aa4f9914 100644
--- a/engines/hypno/boyz/hard.cpp
+++ b/engines/hypno/boyz/hard.cpp
@@ -27,6 +27,8 @@
 
 #include "hypno/hypno.h"
 
+#include "backends/keymapper/keymapper.h"
+
 namespace Hypno {
 
 void BoyzEngine::runCode(Code *code) {
@@ -74,6 +76,8 @@ void BoyzEngine::runMainMenu(Code *code) {
 		if (posY >= 185)
 			break;
 	}
+	Common::Keymapper *keymapper = g_system->getEventManager()->getKeymapper();
+	keymapper->getKeymap("game-shortcuts")->setEnabled(false);
 	g_system->setFeatureState(OSystem::kFeatureVirtualKeyboard, true);
 	while (!shouldQuit() && cont) {
 		while (g_system->getEventManager()->pollEvent(event)) {
@@ -120,6 +124,7 @@ void BoyzEngine::runMainMenu(Code *code) {
 		g_system->delayMillis(10);
 	}
 	g_system->setFeatureState(OSystem::kFeatureVirtualKeyboard, false);
+	keymapper->getKeymap("game-shortcuts")->setEnabled(true);
 	menu->free();
 	delete menu;
 
@@ -152,6 +157,8 @@ bool BoyzEngine::runExitMenu() {
 	Common::Rect yesBox(142, 87, 179, 102);
 	Common::Rect noBox(142, 104, 179, 119);
 	bool cont = true;
+	Common::Keymapper *keymapper = g_system->getEventManager()->getKeymapper();
+	keymapper->getKeymap("exit-menu")->setEnabled(true);
 	while (!shouldQuit() && cont) {
 		while (g_system->getEventManager()->pollEvent(event)) {
 			Common::Point mousePos = g_system->getEventManager()->getMousePos();
@@ -162,12 +169,12 @@ bool BoyzEngine::runExitMenu() {
 			case Common::EVENT_RETURN_TO_LAUNCHER:
 				break;
 
-			case Common::EVENT_KEYDOWN:
-				if (event.kbd.keycode == Common::KEYCODE_y) {
+			case Common::EVENT_CUSTOM_ENGINE_ACTION_START:
+				if (event.customType == kActionYes) {
 					quit = true;
 					cont = false;
 
-				} else if (event.kbd.keycode == Common::KEYCODE_n) {
+				} else if (event.customType == kActionNo) {
 					quit = false;
 					cont = false;
 					break;
@@ -194,6 +201,7 @@ bool BoyzEngine::runExitMenu() {
 		drawScreen();
 		g_system->delayMillis(10);
 	}
+	keymapper->getKeymap("exit-menu")->setEnabled(false);
 	menu->free();
 	delete menu;
 	return quit;
@@ -215,6 +223,9 @@ void BoyzEngine::runDifficultyMenu(Code *code) {
 	free(palette);
 	drawImage(*menu, 0, 0, false);
 	bool cont = true;
+	Common::Keymapper *keymapper = g_system->getEventManager()->getKeymapper();
+	keymapper->getKeymap("game-shortcuts")->setEnabled(false);
+	keymapper->getKeymap("difficulty-menu")->setEnabled(true);
 	while (!shouldQuit() && cont) {
 		while (g_system->getEventManager()->pollEvent(event)) {
 			mousePos = g_system->getEventManager()->getMousePos();
@@ -241,17 +252,17 @@ void BoyzEngine::runDifficultyMenu(Code *code) {
 				}
 				break;
 
-			case Common::EVENT_KEYDOWN:
-				if (event.kbd.keycode == Common::KEYCODE_c) {
+			case Common::EVENT_CUSTOM_ENGINE_ACTION_START:
+				if (event.customType == kActionDifficultyChump) {
 					_difficulty = "chump";
 					cont = false;
-				} else if (event.kbd.keycode == Common::KEYCODE_p) {
+				} else if (event.customType == kActionDifficultyPunk) {
 					_difficulty = "punk";
 					cont = false;
-				} else if (event.kbd.keycode == Common::KEYCODE_b) {
+				} else if (event.customType == kActionDifficultyBadass) {
 					_difficulty = "bad ass";
 					cont = false;
-				} else if (event.kbd.keycode == Common::KEYCODE_a) {
+				} else if (event.customType == kActionDifficultExit) {
 					cont = false;
 				}
 				break;
@@ -264,6 +275,8 @@ void BoyzEngine::runDifficultyMenu(Code *code) {
 		drawScreen();
 		g_system->delayMillis(10);
 	}
+	keymapper->getKeymap("difficulty-menu")->setEnabled(false);
+	keymapper->getKeymap("game-shortcuts")->setEnabled(true);
 
 	if (_difficulty.empty())
 		_nextLevel = "<main_menu>";
@@ -303,6 +316,9 @@ void BoyzEngine::runRetryMenu(Code *code) {
 	free(palette);
 	drawImage(*menu, 0, 0, false);
 	bool cont = true;
+	Common::Keymapper *keymapper = g_system->getEventManager()->getKeymapper();
+	keymapper->getKeymap("game-shortcuts")->setEnabled(false);
+	keymapper->getKeymap("retry-menu")->setEnabled(true);
 	while (!shouldQuit() && cont) {
 		while (g_system->getEventManager()->pollEvent(event)) {
 			mousePos = g_system->getEventManager()->getMousePos();
@@ -331,20 +347,20 @@ void BoyzEngine::runRetryMenu(Code *code) {
 					quitGame();
 				break;
 
-			case Common::EVENT_KEYDOWN:
-				if (event.kbd.keycode == Common::KEYCODE_s) {
+			case Common::EVENT_CUSTOM_ENGINE_ACTION_START:
+				if (event.customType == kActionRetry) {
 					_nextLevel = _checkpoint;
 					cont = false;
-				} else if (event.kbd.keycode == Common::KEYCODE_n) {
+				} else if (event.customType == kActionNewMission) {
 					_nextLevel = "<main_menu>";
 					cont = false;
-				} else if (event.kbd.keycode == Common::KEYCODE_t) {
+				} else if (event.customType == kActionRestart) {
 					// Restore initial health for the team
 					_health = _maxHealth;
 					_stats = _globalStats;
 					_nextLevel = firstLevelTerritory(_checkpoint);
 					cont = false;
-				} else if (event.kbd.keycode == Common::KEYCODE_q)
+				} else if (event.customType == kActionQuit)
 					quitGame();
 				break;
 
@@ -356,6 +372,8 @@ void BoyzEngine::runRetryMenu(Code *code) {
 		drawScreen();
 		g_system->delayMillis(10);
 	}
+	keymapper->getKeymap("retry-menu")->setEnabled(false);
+	keymapper->getKeymap("game-shortcuts")->setEnabled(true);
 
 	menu->free();
 	delete menu;
diff --git a/engines/hypno/hypno.cpp b/engines/hypno/hypno.cpp
index b9c6d21f16f..87431bfbc45 100644
--- a/engines/hypno/hypno.cpp
+++ b/engines/hypno/hypno.cpp
@@ -42,6 +42,8 @@
 #include "hypno/grammar.h"
 #include "hypno/hypno.h"
 
+#include "backends/keymapper/keymapper.h"
+
 namespace Hypno {
 
 Hotspots *g_parsedHots;
@@ -233,12 +235,16 @@ void HypnoEngine::runIntros(Videos &videos) {
 		playVideo(*it);
 	}
 
+	Common::Keymapper *keymapper = g_system->getEventManager()->getKeymapper();
+	disableGameKeymaps();
+	keymapper->getKeymap("intro")->setEnabled(true);
+
 	while (!shouldQuit()) {
 		while (g_system->getEventManager()->pollEvent(event)) {
 			// Events
 			switch (event.type) {
-			case Common::EVENT_KEYDOWN:
-				if (event.kbd.keycode == Common::KEYCODE_ESCAPE)
+			case Common::EVENT_CUSTOM_ENGINE_ACTION_START:
+				if (event.customType == kActionSkipIntro)
 					skip = true;
 				break;
 			case Common::EVENT_LBUTTONDOWN:
@@ -290,6 +296,8 @@ void HypnoEngine::runIntros(Videos &videos) {
 		g_system->updateScreen();
 		g_system->delayMillis(10);
 	}
+	keymapper->getKeymap("intro")->setEnabled(false);
+	enableGameKeymaps();
 }
 
 void HypnoEngine::runIntro(MVideo &video) {
diff --git a/engines/hypno/hypno.h b/engines/hypno/hypno.h
index 6dc1c2fa609..acd0808e774 100644
--- a/engines/hypno/hypno.h
+++ b/engines/hypno/hypno.h
@@ -78,6 +78,32 @@ enum SpiderColors {
 	kSpiderColorBlue = 252,
 };
 
+enum HYPNOActions {
+	kActionNone,
+	kActionSkipIntro,
+	kActionSkipCutscene,
+	kActionPrimaryShoot,
+	kActionSkipLevel,
+	kActionKillPlayer,
+	kActionPause,
+	kActionLeft,
+	kActionDown,
+	kActionRight,
+	kActionUp,
+	kActionYes,
+	kActionNo,
+	kActionDifficultyChump,
+	kActionDifficultyPunk,
+	kActionDifficultyBadass,
+	kActionDifficultExit,
+	kActionRetry,
+	kActionRestart,
+	kActionNewMission,
+	kActionQuit,
+	kActionCredits,
+	kActionSelect,
+};
+
 class HypnoEngine;
 
 class CursorCache {
@@ -287,6 +313,8 @@ public:
 	virtual byte *getTargetColor(Common::String name, int levelId);
 	virtual bool checkRButtonUp();
 	virtual void setRButtonUp(const bool val);
+	virtual void disableGameKeymaps();
+	virtual void enableGameKeymaps();
 
 	// Segments
 	Segments _segments;
@@ -455,6 +483,8 @@ public:
 	byte *getTargetColor(Common::String name, int levelId) override;
 	bool checkRButtonUp() override;
 	void setRButtonUp(const bool val) override;
+	void disableGameKeymaps() override;
+	void enableGameKeymaps() override;
 
 
 	bool hasFeature(EngineFeature f) const override {
diff --git a/engines/hypno/metaengine.cpp b/engines/hypno/metaengine.cpp
index ebb0a36df4e..4b3ce6f641a 100644
--- a/engines/hypno/metaengine.cpp
+++ b/engines/hypno/metaengine.cpp
@@ -26,6 +26,10 @@
 #include "hypno/hypno.h"
 #include "hypno/detection.h"
 
+#include "backends/keymapper/action.h"
+#include "backends/keymapper/keymapper.h"
+#include "backends/keymapper/standard-actions.h"
+
 static const ADExtraGuiOptionsMap optionsList[] = {
 	{
 		GAMEOPTION_ORIGINAL_CHEATS,
@@ -96,6 +100,7 @@ public:
 	}
 
 	Common::Error createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const override;
+	Common::KeymapArray initKeymaps(const char *target) const override;
 };
 
 Common::Error HypnoMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const {
@@ -111,6 +116,273 @@ Common::Error HypnoMetaEngine::createInstance(OSystem *syst, Engine **engine, co
 	return Common::kNoError;
 }
 
+
+Common::KeymapArray HypnoMetaEngine::initKeymaps(const char *target) const {
+	using namespace Common;
+	using namespace Hypno;
+
+	Common::String gameId = ConfMan.get("gameid", target);
+
+	KeymapArray keymaps;
+
+	Keymap *engineKeymap = new Keymap(Keymap::kKeymapTypeGame, "hypno-default", _("Default keymappings"));
+	Keymap *introKeymap = new Keymap(Keymap::kKeymapTypeGame, "intro", _("Intro keymappings"));
+	Keymap *cutsceneKeymap = new Keymap(Keymap::kKeymapTypeGame, "cutscene", _("Cutscene keymappings"));
+
+	Common::Action *act;
+
+	act = new Common::Action(kStandardActionLeftClick, _("Primary shoot"));
+	act->setLeftClickEvent();
+	act->addDefaultInputMapping("MOUSE_LEFT");
+	act->addDefaultInputMapping("JOY_A");
+	engineKeymap->addAction(act);
+
+	act = new Common::Action(kStandardActionRightClick, _("Secondary shoot"));
+	act->setRightClickEvent();
+	act->addDefaultInputMapping("MOUSE_RIGHT");
+	act->addDefaultInputMapping("JOY_B");
+	engineKeymap->addAction(act);
+
+	act = new Common::Action("SKIPINTRO", _("Skip intro"));
+	act->setCustomEngineActionEvent(kActionSkipIntro);
+	act->addDefaultInputMapping("ESCAPE");
+	act->addDefaultInputMapping("JOY_Y");
+	introKeymap->addAction(act);
+
+	act = new Common::Action("SKIPCUTSCENE", _("Skip cutscene"));
+	act->setCustomEngineActionEvent(kActionSkipCutscene);
+	act->addDefaultInputMapping("ESCAPE");
+	act->addDefaultInputMapping("JOY_Y");
+	cutsceneKeymap->addAction(act);
+
+	keymaps.push_back(engineKeymap);
+	keymaps.push_back(introKeymap);
+	keymaps.push_back(cutsceneKeymap);
+
+	introKeymap->setEnabled(false);
+	cutsceneKeymap->setEnabled(false);
+
+	if (gameId == "soldierboyz") {
+		Keymap *gameKeymap = new Keymap(Keymap::kKeymapTypeGame, "game-shortcuts", _("Game keymappings"));
+		Keymap *exitMenuKeymap = new Keymap(Keymap::kKeymapTypeGame, "exit-menu", _("Exit menu keymappings"));
+		Keymap *difficulyMenuKeymap = new Keymap(Keymap::kKeymapTypeGame, "difficulty-menu", _("Difficulty selection menu keymappings"));
+		Keymap *retryMenuKeymap = new Keymap(Keymap::kKeymapTypeGame, "retry-menu", _("Retry menu keymappings"));
+
+		if (ConfMan.getBool("cheats",target)) {
+			act = new Common::Action("SKIPLEVEL", _("Skip level (cheat)"));
+			act->setCustomEngineActionEvent(kActionSkipLevel);
+			act->addDefaultInputMapping("c");
+			act->addDefaultInputMapping("JOY_X");
+			gameKeymap->addAction(act);
+		}
+
+		// I18N: (Game name: Soldier Boyz) player refers to the users own character.
+		act = new Common::Action("KILLPLAYER", _("Kill player"));
+		act->setCustomEngineActionEvent(kActionKillPlayer);
+		act->addDefaultInputMapping("k");
+		act->addDefaultInputMapping("JOY_LEFT");
+		gameKeymap->addAction(act);
+
+		act = new Common::Action("PAUSE", _("Pause"));
+		act->setCustomEngineActionEvent(kActionPause);
+		act->addDefaultInputMapping("ESCAPE");
+		act->addDefaultInputMapping("JOY_UP");
+		gameKeymap->addAction(act);
+
+		act = new Common::Action("YES", _("Yes"));
+		act->setCustomEngineActionEvent(kActionYes);
+		act->addDefaultInputMapping("y");
+		act->addDefaultInputMapping("JOY_A");
+		exitMenuKeymap->addAction(act);
+
+		act = new Common::Action("NO", _("No"));
+		act->setCustomEngineActionEvent(kActionNo);
+		act->addDefaultInputMapping("n");
+		act->addDefaultInputMapping("JOY_B");
+		exitMenuKeymap->addAction(act);
+
+		// I18N: (Game name: Soldier Boyz) the game has 3 difficulty levels: Chump, Punk and Badass. Chump is the easy mode.
+		act = new Common::Action("CHUMP", _("Chump"));
+		act->setCustomEngineActionEvent(kActionDifficultyChump);
+		act->addDefaultInputMapping("c");
+		act->addDefaultInputMapping("JOY_LEFT");
+		difficulyMenuKeymap->addAction(act);
+
+		// I18N: (Game name: Soldier Boyz) the game has 3 difficulty levels: Chump, Punk and Badass. Punk is the medium mode.
+		act = new Common::Action("PUNK", _("Punk"));
+		act->setCustomEngineActionEvent(kActionDifficultyPunk);
+		act->addDefaultInputMapping("p");
+		act->addDefaultInputMapping("JOY_UP");
+		difficulyMenuKeymap->addAction(act);
+
+		// I18N: (Game name: Soldier Boyz) the game has 3 difficulty levels: Chump, Punk and Badass. Badass is the hard mode.
+		act = new Common::Action("BADASS", _("Badass"));
+		act->setCustomEngineActionEvent(kActionDifficultyBadass);
+		act->addDefaultInputMapping("b");
+		act->addDefaultInputMapping("JOY_RIGHT");
+		difficulyMenuKeymap->addAction(act);
+
+		act = new Common::Action("CANCEL", _("Cancel"));
+		act->setCustomEngineActionEvent(kActionDifficultExit);
+		act->addDefaultInputMapping("a");
+		act->addDefaultInputMapping("JOY_DOWN");
+		difficulyMenuKeymap->addAction(act);
+
+		// I18N: (Game name: Soldier Boyz) This makes the player restart from the last checkpoint.
+		act = new Common::Action("RETRY", _("Retry sector"));
+		act->setCustomEngineActionEvent(kActionRetry);
+		act->addDefaultInputMapping("s");
+		act->addDefaultInputMapping("JOY_LEFT");
+		retryMenuKeymap->addAction(act);
+
+		// I18N: (Game name: Soldier Boyz) This makes the player restart the current mission / level.
+		act = new Common::Action("RESTART", _("Restart territory"));
+		act->setCustomEngineActionEvent(kActionRestart);
+		act->addDefaultInputMapping("t");
+		act->addDefaultInputMapping("JOY_UP");
+		retryMenuKeymap->addAction(act);
+
+		act = new Common::Action("EXIT", _("Begin new mission"));
+		act->setCustomEngineActionEvent(kActionNewMission);
+		act->addDefaultInputMapping("n");
+		act->addDefaultInputMapping("JOY_RIGHT");
+		retryMenuKeymap->addAction(act);
+
+		act = new Common::Action("QUIT", _("Quit"));
+		act->setCustomEngineActionEvent(kActionQuit);
+		act->addDefaultInputMapping("q");
+		act->addDefaultInputMapping("JOY_DOWN");
+		retryMenuKeymap->addAction(act);
+
+		keymaps.push_back(gameKeymap);
+		keymaps.push_back(exitMenuKeymap);
+		keymaps.push_back(difficulyMenuKeymap);
+		keymaps.push_back(retryMenuKeymap);
+
+		exitMenuKeymap->setEnabled(false);
+		difficulyMenuKeymap->setEnabled(false);
+		retryMenuKeymap->setEnabled(false);
+
+	} else if (gameId == "sinistersix") {
+		Keymap *gameKeymap = new Keymap(Keymap::kKeymapTypeGame, "game-shortcuts", _("Game keymappings"));
+
+		if (ConfMan.getBool("cheats", target)) {
+			act = new Common::Action("SKIPLEVEL", _("Skip level (cheat)"));
+			act->setCustomEngineActionEvent(kActionSkipLevel);
+			act->addDefaultInputMapping("c");
+			act->addDefaultInputMapping("JOY_X");
+			gameKeymap->addAction(act);
+		}
+
+		// I18N: (Game name: Marvel Comics Spider-Man: The Sinister Six) player refers to the users own character.
+		act = new Common::Action("KILLPLAYER", _("Kill player"));
+		act->setCustomEngineActionEvent(kActionKillPlayer);
+		act->addDefaultInputMapping("k");
+		act->addDefaultInputMapping("JOY_Y");
+		gameKeymap->addAction(act);
+
+		act = new Common::Action("LEFT", _("Move left"));
+		act->setCustomEngineActionEvent(kActionLeft);
+		act->addDefaultInputMapping("LEFT");
+		act->addDefaultInputMapping("JOY_LEFT");
+		gameKeymap->addAction(act);
+
+		act = new Common::Action("DOWN", _("Move down"));
+		act->setCustomEngineActionEvent(kActionDown);
+		act->addDefaultInputMapping("DOWN");
+		act->addDefaultInputMapping("JOY_DOWN");
+		gameKeymap->addAction(act);
+
+		act = new Common::Action("RIGHT", _("Move right"));
+		act->setCustomEngineActionEvent(kActionRight);
+		act->addDefaultInputMapping("RIGHT");
+		act->addDefaultInputMapping("JOY_RIGHT");
+		gameKeymap->addAction(act);
+
+		act = new Common::Action("UP", _("Move up"));
+		act->setCustomEngineActionEvent(kActionUp);
+		act->addDefaultInputMapping("UP");
+		act->addDefaultInputMapping("JOY_UP");
+		gameKeymap->addAction(act);
+
+		keymaps.push_back(gameKeymap);
+
+	} else if (gameId == "wetlands") {
+		Keymap *gameKeymap = new Keymap(Keymap::kKeymapTypeGame, "game-shortcuts", _("Game keymappings"));
+		Keymap *menuKeymap = new Keymap(Keymap::kKeymapTypeGame, "menu", _("Menu keymappings"));
+		Keymap *pauseKeymap = new Keymap(Keymap::kKeymapTypeGame, "pause", _("Pause keymappings"));
+		Keymap *directionKeymap = new Keymap(Keymap::kKeymapTypeGame, "direction", _("Direction keymappings"));
+
+		act = new Common::Action("CREDITS", _("Show credits"));
+		act->setCustomEngineActionEvent(kActionCredits);
+		act->addDefaultInputMapping("c");
+		act->addDefaultInputMapping("JOY_LEFT_TRIGGER");
+		gameKeymap->addAction(act);
+
+		act = new Common::Action("SKIPLEVEL", _("Skip level (cheat)"));
+		act->setCustomEngineActionEvent(kActionSkipLevel);
+		act->addDefaultInputMapping("s");
+		act->addDefaultInputMapping("JOY_X");
+		gameKeymap->addAction(act);
+
+		// I18N: (Game name: Wetlands) player refers to the users own character.
+		act = new Common::Action("KILLPLAYER", _("Kill player"));
+		act->setCustomEngineActionEvent(kActionKillPlayer);
+		act->addDefaultInputMapping("k");
+		act->addDefaultInputMapping("JOY_RIGHT_TRIGGER");
+		gameKeymap->addAction(act);
+
+		act = new Common::Action("LEFT", _("Move left"));
+		act->setCustomEngineActionEvent(kActionLeft);
+		act->allowKbdRepeats();
+		act->addDefaultInputMapping("LEFT");
+		act->addDefaultInputMapping("JOY_LEFT");
+		directionKeymap->addAction(act);
+
+		act = new Common::Action("DOWN", _("Move down"));
+		act->setCustomEngineActionEvent(kActionDown);
+		act->allowKbdRepeats();
+		act->addDefaultInputMapping("DOWN");
+		act->addDefaultInputMapping("JOY_DOWN");
+		directionKeymap->addAction(act);
+
+		act = new Common::Action("RIGHT", _("Move right"));
+		act->setCustomEngineActionEvent(kActionRight);
+		act->allowKbdRepeats();
+		act->addDefaultInputMapping("RIGHT");
+		act->addDefaultInputMapping("JOY_RIGHT");
+		directionKeymap->addAction(act);
+
+		act = new Common::Action("UP", _("Move up"));
+		act->setCustomEngineActionEvent(kActionUp);
+		act->allowKbdRepeats();
+		act->addDefaultInputMapping("UP");
+		act->addDefaultInputMapping("JOY_UP");
+		directionKeymap->addAction(act);
+
+		act = new Common::Action("SELECT", _("Select"));
+		act->setCustomEngineActionEvent(kActionSelect);
+		act->addDefaultInputMapping("RETURN");
+		act->addDefaultInputMapping("JOY_X");
+		menuKeymap->addAction(act);
+
+		act = new Common::Action("PAUSE", _("Pause"));
+		act->setCustomEngineActionEvent(kActionPause);
+		act->addDefaultInputMapping("ESCAPE");
+		act->addDefaultInputMapping("JOY_Y");
+		pauseKeymap->addAction(act);
+
+		keymaps.push_back(gameKeymap);
+		keymaps.push_back(menuKeymap);
+		keymaps.push_back(pauseKeymap);
+		keymaps.push_back(directionKeymap);
+
+		menuKeymap->setEnabled(false);
+	}
+
+	return keymaps;
+}
+
 namespace Hypno {
 
 bool HypnoEngine::isDemo() const {
diff --git a/engines/hypno/scene.cpp b/engines/hypno/scene.cpp
index 00740e37455..dfcb4b2a5f8 100644
--- a/engines/hypno/scene.cpp
+++ b/engines/hypno/scene.cpp
@@ -24,6 +24,8 @@
 #include "hypno/grammar.h"
 #include "hypno/hypno.h"
 
+#include "backends/keymapper/keymapper.h"
+
 namespace Hypno {
 
 extern int parse_mis(const char *);
@@ -279,6 +281,7 @@ void HypnoEngine::runScene(Scene *scene) {
 	_refreshConversation = false;
 	Common::Event event;
 	Common::Point mousePos;
+	Common::Keymapper *keymapper = g_system->getEventManager()->getKeymapper();
 	Common::List<uint32> videosToRemove;
 	bool enableLoopingVideos = true;
 	int32 lastCountdown = 0;
@@ -315,12 +318,15 @@ void HypnoEngine::runScene(Scene *scene) {
 			lastCountdown = _countdown;
 		}
 
+		disableGameKeymaps();
+		keymapper->getKeymap("cutscene")->setEnabled(true);
+
 		while (g_system->getEventManager()->pollEvent(event)) {
 			mousePos = g_system->getEventManager()->getMousePos();
 			// Events
 			switch (event.type) {
-			case Common::EVENT_KEYDOWN:
-				if (event.kbd.keycode == Common::KEYCODE_ESCAPE) {
+			case Common::EVENT_CUSTOM_ENGINE_ACTION_START:
+				if (event.customType == kActionSkipCutscene) {
 					for (Videos::iterator it = _videosPlaying.begin(); it != _videosPlaying.end(); ++it) {
 						if (it->decoder) {
 							skipVideo(*it);
@@ -385,6 +391,9 @@ void HypnoEngine::runScene(Scene *scene) {
 			}
 		}
 
+		keymapper->getKeymap("cutscene")->setEnabled(false);
+		enableGameKeymaps();
+
 		if (_refreshConversation && !_conversation.empty() &&
 			_nextSequentialVideoToPlay.empty() &&
 			_nextParallelVideoToPlay.empty() &&
diff --git a/engines/hypno/spider/arcade.cpp b/engines/hypno/spider/arcade.cpp
index 55e19ffd708..736ae2b4424 100644
--- a/engines/hypno/spider/arcade.cpp
+++ b/engines/hypno/spider/arcade.cpp
@@ -101,23 +101,21 @@ void SpiderEngine::findNextSegment(ArcadeShooting *arc) {
 
 
 void SpiderEngine::pressedKey(const int keycode) {
-	if (keycode == Common::KEYCODE_c) {
-		if (_cheatsEnabled) {
-			_skipLevel = true;
-			return;
-		}
-	} else if (keycode == Common::KEYCODE_k) { // Added for testing
+	if (keycode == kActionSkipLevel) {
+		_skipLevel = true;
+		return;
+	} else if (keycode == kActionKillPlayer) { // Added for testing
 		_health = 0;
-	} else if (keycode == Common::KEYCODE_LEFT) {
+	} else if (keycode == kActionLeft) {
 		_lastPlayerPosition = _currentPlayerPosition;
 		_currentPlayerPosition = kPlayerLeft;
-	} else if (keycode == Common::KEYCODE_DOWN) {
+	} else if (keycode == kActionDown) {
 		_lastPlayerPosition = _currentPlayerPosition;
 		_currentPlayerPosition = kPlayerBottom;
-	} else if (keycode == Common::KEYCODE_RIGHT) {
+	} else if (keycode == kActionRight) {
 		_lastPlayerPosition = _currentPlayerPosition;
 		_currentPlayerPosition = kPlayerRight;
-	} else if (keycode == Common::KEYCODE_UP) {
+	} else if (keycode == kActionUp) {
 		_lastPlayerPosition = _currentPlayerPosition;
 		_currentPlayerPosition = kPlayerTop;
 	}
diff --git a/engines/hypno/wet/arcade.cpp b/engines/hypno/wet/arcade.cpp
index f39de2a14b2..f58b8e9ea6c 100644
--- a/engines/hypno/wet/arcade.cpp
+++ b/engines/hypno/wet/arcade.cpp
@@ -26,6 +26,8 @@
 #include "gui/message.h"
 #include "graphics/cursorman.h"
 
+#include "backends/keymapper/keymapper.h"
+
 namespace Hypno {
 
 void WetEngine::initSegment(ArcadeShooting *arc) {
@@ -730,7 +732,7 @@ void WetEngine::runBeforeArcade(ArcadeShooting *arc) {
 }
 
 void WetEngine::pressedKey(const int keycode) {
-	if (keycode == Common::KEYCODE_c) {
+	if (keycode == kActionCredits) {
 		_background->decoder->pauseVideo(true);
 		showCredits();
 		loadPalette(_currentPalette);
@@ -740,33 +742,31 @@ void WetEngine::pressedKey(const int keycode) {
 		drawScreen();
 		if (!_music.empty())
 			playSound(_music, 0, _musicRate); // restore music
-	} else if (keycode == Common::KEYCODE_s) { // Added for testing
-		if (_cheatsEnabled) {
-			_skipLevel = true;
-		}
-	} else if (keycode == Common::KEYCODE_k) { // Added for testing
+	} else if (keycode == kActionSkipLevel) { // Added for testing
+		_skipLevel = true;
+	} else if (keycode == kActionKillPlayer) { // Added for testing
 		_health = 0;
-	} else if (keycode == Common::KEYCODE_ESCAPE) {
+	} else if (keycode == kActionPause) {
 		openMainMenuDialog();
-	} else if (keycode == Common::KEYCODE_LEFT) {
+	} else if (keycode == kActionLeft) {
 		if (_arcadeMode == "YT" && _c33PlayerPosition.x > 0) {
 			_c33UseMouse = false;
 			if (_c33PlayerDirection.size() < 3)
 				_c33PlayerDirection.push_back(kPlayerLeft);
 		}
-	} else if (keycode == Common::KEYCODE_DOWN) {
+	} else if (keycode == kActionDown) {
 		if (_arcadeMode == "YT" && _c33PlayerPosition.y < 130) { // Viewport value minus 30
 			_c33UseMouse = false;
 			if (_c33PlayerDirection.size() < 3)
 				_c33PlayerDirection.push_back(kPlayerBottom);
 		}
-	} else if (keycode == Common::KEYCODE_RIGHT) {
+	} else if (keycode == kActionRight) {
 		if (_arcadeMode == "YT" && _c33PlayerPosition.x < _screenW) {
 			_c33UseMouse = false;
 			if (_c33PlayerDirection.size() < 3)
 				_c33PlayerDirection.push_back(kPlayerRight);
 		}
-	} else if (keycode == Common::KEYCODE_UP) {
+	} else if (keycode == kActionUp) {
 		if (_arcadeMode == "YT" && _c33PlayerPosition.y > 0) {
 			_c33UseMouse = false;
 			if (_c33PlayerDirection.size() < 3)
@@ -1184,4 +1184,18 @@ void WetEngine::setRButtonUp(const bool val) {
 	_rButtonUp = val;
 }
 
+void WetEngine::disableGameKeymaps() {
+	Common::Keymapper *keymapper = g_system->getEventManager()->getKeymapper();
+	keymapper->getKeymap("game-shortcuts")->setEnabled(false);
+	keymapper->getKeymap("pause")->setEnabled(false);
+	keymapper->getKeymap("direction")->setEnabled(false);
+}
+
+void WetEngine::enableGameKeymaps() {
+	Common::Keymapper *keymapper = g_system->getEventManager()->getKeymapper();
+	keymapper->getKeymap("game-shortcuts")->setEnabled(true);
+	keymapper->getKeymap("pause")->setEnabled(true);
+	keymapper->getKeymap("direction")->setEnabled(true);
+}
+
 } // End of namespace Hypno
diff --git a/engines/hypno/wet/hard.cpp b/engines/hypno/wet/hard.cpp
index 9c27378ec75..1a5580d3b0f 100644
--- a/engines/hypno/wet/hard.cpp
+++ b/engines/hypno/wet/hard.cpp
@@ -27,6 +27,8 @@
 
 #include "hypno/hypno.h"
 
+#include "backends/keymapper/keymapper.h"
+
 namespace Hypno {
 
 void WetEngine::endCredits(Code *code) {
@@ -85,6 +87,11 @@ void WetEngine::runLevelMenu(Code *code) {
 	drawImage(*menu, 0, 0, false);
 	bool cont = true;
 	playSound("sound/bub01.raw", 0, 22050);
+
+	Common::Keymapper *keymapper = g_system->getEventManager()->getKeymapper();
+	keymapper->getKeymap("game-shortcuts")->setEnabled(false);
+	keymapper->getKeymap("menu")->setEnabled(true);
+
 	while (!shouldQuit() && cont) {
 		while (g_system->getEventManager()->pollEvent(event)) {
 			// Events
@@ -94,18 +101,18 @@ void WetEngine::runLevelMenu(Code *code) {
 			case Common::EVENT_RETURN_TO_LAUNCHER:
 				break;
 
-			case Common::EVENT_KEYDOWN:
-				if (event.kbd.keycode == Common::KEYCODE_DOWN && currentLevel < _lastLevel) {
+			case Common::EVENT_CUSTOM_ENGINE_ACTION_START:
+				if (event.customType == kActionDown && currentLevel < _lastLevel) {
 					playSound("sound/m_hilite.raw", 1, 11025);
 					currentLevel++;
-				} else if (event.kbd.keycode == Common::KEYCODE_UP && currentLevel > 0) {
+				} else if (event.customType == kActionUp && currentLevel > 0) {
 					playSound("sound/m_hilite.raw", 1, 11025);
 					currentLevel--;
-				} else if (event.kbd.keycode == Common::KEYCODE_RETURN ) {
+				} else if (event.customType == kActionSelect ) {
 					playSound("sound/m_choice.raw", 1, 11025);
 					_nextLevel = Common::String::format("c%d", _ids[currentLevel]);
 					cont = false;
-				} else if (event.kbd.keycode == Common::KEYCODE_ESCAPE) {
+				} else if (event.customType == kActionPause) {
 					openMainMenuDialog();
 				}
 
@@ -127,6 +134,10 @@ void WetEngine::runLevelMenu(Code *code) {
 		drawScreen();
 		g_system->delayMillis(10);
 	}
+
+	keymapper->getKeymap("menu")->setEnabled(false);
+	keymapper->getKeymap("game-shortcuts")->setEnabled(true);
+
 	menu->free();
 	delete menu;
 }
@@ -146,7 +157,13 @@ void WetEngine::runMainMenu(Code *code) {
 	drawImage(surName, subName.left, subName.top, true);
 	drawString("scifi08.fgx", _enterNameString, 48, 50, 100, c);
 	_name.clear();
+
+	Common::Keymapper *keymapper = g_system->getEventManager()->getKeymapper();
+	keymapper->getKeymap("game-shortcuts")->setEnabled(false);
+	keymapper->getKeymap("pause")->setEnabled(false);
+	keymapper->getKeymap("direction")->setEnabled(false);
 	g_system->setFeatureState(OSystem::kFeatureVirtualKeyboard, true);
+
 	bool cont = true;
 	while (!shouldQuit() && cont) {
 		while (g_system->getEventManager()->pollEvent(event)) {
@@ -213,6 +230,10 @@ void WetEngine::runMainMenu(Code *code) {
 	bool found = loadProfile(_name);
 
 	g_system->setFeatureState(OSystem::kFeatureVirtualKeyboard, false);
+	keymapper->getKeymap("game-shortcuts")->setEnabled(true);
+	keymapper->getKeymap("pause")->setEnabled(true);
+	keymapper->getKeymap("direction")->setEnabled(true);
+
 	if (found || _name.empty()) {
 		menu->free();
 		delete menu;
@@ -251,6 +272,11 @@ void WetEngine::runMainMenu(Code *code) {
 	drawString("scifi08.fgx", _name, 140, 50, 170, c);
 
 	cont = true;
+
+	keymapper->getKeymap("game-shortcuts")->setEnabled(false);
+	keymapper->getKeymap("pause")->setEnabled(false);
+	keymapper->getKeymap("menu")->setEnabled(true);
+
 	while (!shouldQuit() && cont) {
 		while (g_system->getEventManager()->pollEvent(event)) {
 			// Events
@@ -261,7 +287,7 @@ void WetEngine::runMainMenu(Code *code) {
 				break;
 
 			case Common::EVENT_LBUTTONDOWN:
-			case Common::EVENT_KEYDOWN:
+			case Common::EVENT_CUSTOM_ENGINE_ACTION_START:
 				if (!g_system->hasFeature(OSystem::kFeatureTouchscreen))
 					event.mouse = Common::Point(0, 0);
 
@@ -275,13 +301,13 @@ void WetEngine::runMainMenu(Code *code) {
 					}
 				} else if (idx == 1 && subWet.contains(event.mouse)) {
 					//  Nothing
-				} else if ((subWet.contains(event.mouse) || subDamp.contains(event.mouse) || event.kbd.keycode == Common::KEYCODE_LEFT) && idx > 0) {
+				} else if ((subWet.contains(event.mouse) || subDamp.contains(event.mouse) || event.customType == kActionLeft) && idx > 0) {
 					playSound("sound/no_rapid.raw", 1, 11025);
 					idx--;
-				} else if ((subWet.contains(event.mouse) || subSoaked.contains(event.mouse) || event.kbd.keycode == Common::KEYCODE_RIGHT) && idx < 2) {
+				} else if ((subWet.contains(event.mouse) || subSoaked.contains(event.mouse) || event.customType == kActionRight) && idx < 2) {
 					playSound("sound/no_rapid.raw", 1, 11025);
 					idx++;
-				} else if (event.kbd.keycode == Common::KEYCODE_RETURN)
+				} else if (event.customType == kActionSelect)
 					cont = false;
 
 				drawImage(*menu, 0, 0, false);
@@ -307,6 +333,11 @@ void WetEngine::runMainMenu(Code *code) {
 		drawScreen();
 		g_system->delayMillis(10);
 	}
+
+	keymapper->getKeymap("menu")->setEnabled(false);
+	keymapper->getKeymap("game-shortcuts")->setEnabled(true);
+	keymapper->getKeymap("pause")->setEnabled(true);
+
 	_name.toLowercase(); // make sure it is lowercase when we finish
 	_difficulty = difficulties[idx];
 	_nextLevel = code->levelIfWin;




More information about the Scummvm-git-logs mailing list