[Scummvm-git-logs] scummvm master -> 4f3db682762091146389a2553717b5a03bd59b64

sev- noreply at scummvm.org
Sun Jun 15 20:19:11 UTC 2025


This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .

Summary:
7338155681 SLUDGE: Move game descriptor table to detection_tables.h
4f3db68276 SLUDGE: Add keymapper support


Commit: 73381556815640d4c7f1f920a8abf9f50ffe6a42
    https://github.com/scummvm/scummvm/commit/73381556815640d4c7f1f920a8abf9f50ffe6a42
Author: aunnoman1 (aunnoman123 at outlook.com)
Date: 2025-06-15T22:19:07+02:00

Commit Message:
SLUDGE: Move game descriptor table to detection_tables.h

Changed paths:
    engines/sludge/detection.cpp
    engines/sludge/detection_tables.h


diff --git a/engines/sludge/detection.cpp b/engines/sludge/detection.cpp
index 95cb92f8be7..59f4c990586 100644
--- a/engines/sludge/detection.cpp
+++ b/engines/sludge/detection.cpp
@@ -36,27 +36,6 @@ static const DebugChannelDef debugFlagList[] = {
 	{Sludge::kSludgeDebugSound, "sound", "Sound debug level"},
 	DEBUG_CHANNEL_END
 };
-static const PlainGameDescriptor sludgeGames[] = {
-	{ "sludge",			"Sludge Game" },
-	{ "welcome",		"Welcome Example" },
-	{ "verbcoin",		"Verb Coin" },
-	{ "verbcoin2",		"Verb Coin 2"},
-	{ "parallax",		"Parallax Demo" },
-	{ "robinsrescue",	"Robin's Rescue" },
-	{ "outoforder",		"Out Of Order" },
-	{ "frasse",			"Frasse and the Peas of Kejick" },
-	{ "interview",		"The Interview" },
-	{ "life",			"Life Flashes By" },
-	{ "tgttpoacs",		"The Game That Takes Place on a Cruise Ship" },
-	{ "mandy",			"Mandy Christmas Adventure" },
-	{ "cubert",			"Cubert Badbone, P.I." },
-	{ "gjgagsas",		"The Game Jam Game About Games, Secrets and Stuff" },
-	{ "tsotc",			"The Secret of Tremendous Corporation" },
-	{ "nsc",			"Nathan's Second Chance" },
-	{ "atw",			"Above The Waves" },
-	{ "leptonsquest",	"Lepton's Quest" },
-	{ 0, 0 }
-};
 
 #include "sludge/detection_tables.h"
 
@@ -78,7 +57,7 @@ static char s_fallbackFileNameBuffer[51];
 
 class SludgeMetaEngineDetection : public AdvancedMetaEngineDetection<Sludge::SludgeGameDescription> {
 public:
-	SludgeMetaEngineDetection() : AdvancedMetaEngineDetection(Sludge::gameDescriptions, sludgeGames) {
+	SludgeMetaEngineDetection() : AdvancedMetaEngineDetection(Sludge::gameDescriptions, Sludge::sludgeGames) {
 		_maxScanDepth = 1;
 	}
 
diff --git a/engines/sludge/detection_tables.h b/engines/sludge/detection_tables.h
index d45e75f9dc0..79c8d2fe734 100644
--- a/engines/sludge/detection_tables.h
+++ b/engines/sludge/detection_tables.h
@@ -21,6 +21,28 @@
 
 namespace Sludge {
 
+static const PlainGameDescriptor sludgeGames[] = {
+	{ "sludge",			"Sludge Game" },
+	{ "welcome",		"Welcome Example" },
+	{ "verbcoin",		"Verb Coin" },
+	{ "verbcoin2",		"Verb Coin 2"},
+	{ "parallax",		"Parallax Demo" },
+	{ "robinsrescue",	"Robin's Rescue" },
+	{ "outoforder",		"Out Of Order" },
+	{ "frasse",			"Frasse and the Peas of Kejick" },
+	{ "interview",		"The Interview" },
+	{ "life",			"Life Flashes By" },
+	{ "tgttpoacs",		"The Game That Takes Place on a Cruise Ship" },
+	{ "mandy",			"Mandy Christmas Adventure" },
+	{ "cubert",			"Cubert Badbone, P.I." },
+	{ "gjgagsas",		"The Game Jam Game About Games, Secrets and Stuff" },
+	{ "tsotc",			"The Secret of Tremendous Corporation" },
+	{ "nsc",			"Nathan's Second Chance" },
+	{ "atw",			"Above The Waves" },
+	{ "leptonsquest",	"Lepton's Quest" },
+	{ 0, 0 }
+};
+
 #define GAME1l(t, e, f1, m1, s1, lang, pl, langId) 	{ { t, e, AD_ENTRY1s(f1, m1, s1), lang, pl, ADGF_UNSTABLE, GUIO1(GUIO_NOMIDI) }, langId }
 #define GAME1(t, e, f1, m1, s1) GAME1l(t, e, f1, m1, s1, Common::EN_ANY, Common::kPlatformUnknown, 0)
 #define GAME2l(t, e, f1, m1, s1, f2, m2, s2, lang, pl, langId) 	{ { t, e, AD_ENTRY2s(f1, m1, s1, f2, m2, s2), lang, pl, ADGF_UNSTABLE, GUIO1(GUIO_NOMIDI) }, langId }


Commit: 4f3db682762091146389a2553717b5a03bd59b64
    https://github.com/scummvm/scummvm/commit/4f3db682762091146389a2553717b5a03bd59b64
Author: aunnoman1 (aunnoman123 at outlook.com)
Date: 2025-06-15T22:19:07+02:00

Commit Message:
SLUDGE: Add keymapper support

Changed paths:
  A engines/sludge/POTFILES
  A engines/sludge/keymapper_tables.h
    engines/sludge/builtin.cpp
    engines/sludge/event.cpp
    engines/sludge/metaengine.cpp


diff --git a/engines/sludge/POTFILES b/engines/sludge/POTFILES
new file mode 100644
index 00000000000..04fdda0fd3b
--- /dev/null
+++ b/engines/sludge/POTFILES
@@ -0,0 +1,2 @@
+engines/sludge/detection_tables.h
+engines/sludge/keymapper_tables.h
diff --git a/engines/sludge/builtin.cpp b/engines/sludge/builtin.cpp
index 90f57934b33..5f8cbdfe03f 100644
--- a/engines/sludge/builtin.cpp
+++ b/engines/sludge/builtin.cpp
@@ -26,6 +26,8 @@
 
 #include "engines/metaengine.h"
 
+#include "backends/keymapper/keymapper.h"
+
 #include "sludge/builtin.h"
 #include "sludge/cursors.h"
 #include "sludge/event.h"
@@ -145,6 +147,11 @@ builtIn(freeze) {
 	g_sludge->_gfxMan->freeze();
 	freezeSubs();
 	fun->freezerLevel = 0;
+	Common::Keymapper *keymapper = g_sludge->getEventManager()->getKeymapper();
+	// Turn off keymapper in menus 
+	keymapper->getKeymap("game-shortcuts")->setEnabled(false);
+	// Turn on keymapper for controller
+	keymapper->getKeymap("menu")->setEnabled(true);
 	return BR_CONTINUE;
 }
 
@@ -152,6 +159,11 @@ builtIn(unfreeze) {
 	UNUSEDALL
 	g_sludge->_gfxMan->unfreeze();
 	unfreezeSubs();
+	Common::Keymapper *keymapper = g_sludge->getEventManager()->getKeymapper();
+	// Turn on keymapper in menus 
+	keymapper->getKeymap("game-shortcuts")->setEnabled(true);
+	// Turn off keymapper for controller
+	keymapper->getKeymap("menu")->setEnabled(false);
 	return BR_CONTINUE;
 }
 
diff --git a/engines/sludge/event.cpp b/engines/sludge/event.cpp
index 4ae54f9da4e..9dd57251495 100644
--- a/engines/sludge/event.cpp
+++ b/engines/sludge/event.cpp
@@ -201,16 +201,16 @@ bool EventManager::handleInput() {
 	if (_input.keyPressed && _currentEvents->func[kSpace]) {
 		Common::String tempString = "";
 		switch (_input.keyPressed) {
-		case 127:
+		case Common::KEYCODE_DELETE:
 			tempString = "BACKSPACE";
 			break;
-		case 9:
+		case Common::KEYCODE_TAB:
 			tempString = "TAB";
 			break;
-		case 13:
+		case Common::KEYCODE_RETURN:
 			tempString = "ENTER";
 			break;
-		case 27:
+		case Common::KEYCODE_ESCAPE:
 			tempString = "ESCAPE";
 			break;
 			/*
@@ -229,68 +229,68 @@ bool EventManager::handleInput() {
 
 				case 2019:  tempString = copyString ("PAUSE");      break;
 				*/
-		case 63276:
+		case Common::KEYCODE_PAGEUP:
 			tempString = "PAGE UP";
 			break;
-		case 63277:
+		case Common::KEYCODE_PAGEDOWN:
 			tempString = "PAGE DOWN";
 			break;
-		case 63275:
+		case Common::KEYCODE_END:
 			tempString = "END";
 			break;
-		case 63273:
+		case Common::KEYCODE_HOME:
 			tempString = "HOME";
 			break;
-		case 63234:
+		case Common::KEYCODE_LEFT:
 			tempString = "LEFT";
 			break;
-		case 63232:
+		case Common::KEYCODE_UP:
 			tempString = "UP";
 			break;
-		case 63235:
+		case Common::KEYCODE_RIGHT:
 			tempString = "RIGHT";
 			break;
-		case 63233:
+		case Common::KEYCODE_DOWN:
 			tempString = "DOWN";
 			break;
 			/*
 				case 2045:   tempString = copyString ("INSERT");     break;
 				case 2046:   tempString = copyString ("DELETE");     break;
 				*/
-		case 63236:
+		case Common::KEYCODE_F1:
 			tempString = "F1";
 			break;
-		case 63237:
+		case Common::KEYCODE_F2:
 			tempString = "F2";
 			break;
-		case 63238:
+		case Common::KEYCODE_F3:
 			tempString = "F3";
 			break;
-		case 63239:
+		case Common::KEYCODE_F4:
 			tempString = "F4";
 			break;
-		case 63240:
+		case Common::KEYCODE_F5:
 			tempString = "F5";
 			break;
-		case 63241:
+		case Common::KEYCODE_F6:
 			tempString = "F6";
 			break;
-		case 63242:
+		case Common::KEYCODE_F7:
 			tempString = "F7";
 			break;
-		case 63243:
+		case Common::KEYCODE_F8:
 			tempString = "F8";
 			break;
-		case 63244:
+		case Common::KEYCODE_F9:
 			tempString = "F9";
 			break;
-		case 63245:
+		case Common::KEYCODE_F10:
 			tempString = "F10";
 			break;
-		case 63246:
+		case Common::KEYCODE_F11:
 			tempString = "F11";
 			break;
-		case 63247:
+		case Common::KEYCODE_F12:
 			tempString = "F12";
 			break;
 
diff --git a/engines/sludge/keymapper_tables.h b/engines/sludge/keymapper_tables.h
new file mode 100644
index 00000000000..a26640b46c3
--- /dev/null
+++ b/engines/sludge/keymapper_tables.h
@@ -0,0 +1,603 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "backends/keymapper/action.h"
+#include "backends/keymapper/keymapper.h"
+#include "backends/keymapper/standard-actions.h"
+
+#include "common/translation.h"
+
+namespace Sludge {
+inline Common::KeymapArray getSludgeKeymaps(const char *target, const Common::String &gameId) {
+
+	using namespace Common;
+
+	Keymap *gameKeyMap = new Keymap(Keymap::kKeymapTypeGame, "game-shortcuts", _("Game keymappings"));
+	Keymap *debugKeyMap = new Keymap(Keymap::kKeymapTypeGame, "debug", _("Debug keymappings"));
+	Keymap *menuKeymap = new Keymap(Keymap::kKeymapTypeGame, "menu", _("Menu keymappings"));
+	Keymap *minigameKeymap = new Keymap(Keymap::kKeymapTypeGame, "minigame", _("Minigame keymappings"));
+	Action *act;
+
+	if (gameId == "outoforder") {
+		act = new Action(kStandardActionLeftClick, _("Interact"));
+		act->setLeftClickEvent();
+		act->addDefaultInputMapping("MOUSE_LEFT");
+		act->addDefaultInputMapping("JOY_A");
+		gameKeyMap->addAction(act);
+
+		act = new Action(kStandardActionRightClick, _("Change action"));
+		act->setRightClickEvent();
+		act->addDefaultInputMapping("MOUSE_RIGHT");
+		act->addDefaultInputMapping("JOY_B");
+		gameKeyMap->addAction(act);
+
+		act = new Action(kStandardActionPause, _("Pause"));
+		act->setKeyEvent(KeyState(KEYCODE_ESCAPE, ASCII_ESCAPE));
+		act->addDefaultInputMapping("ESCAPE");
+		act->addDefaultInputMapping("JOY_RIGHT");
+		gameKeyMap->addAction(act);
+
+		act = new Action("INVENTORY", _("Inventory"));
+		act->setKeyEvent(KeyState(KEYCODE_SPACE, ASCII_SPACE));
+		act->addDefaultInputMapping("SPACE");
+		act->addDefaultInputMapping("JOY_Y");
+		gameKeyMap->addAction(act);
+
+		act = new Action("SAVE", _("Quick save"));
+		act->setKeyEvent(KeyState(KEYCODE_s, 's'));
+		act->addDefaultInputMapping("s");
+		act->addDefaultInputMapping("JOY_LEFT_SHOULDER");
+		gameKeyMap->addAction(act);
+
+		act = new Action("SPEEDUP", _("Speed up dialogue"));
+		act->setKeyEvent(KeyState(KEYCODE_PLUS, '+'));
+		act->addDefaultInputMapping("PLUS");
+		act->addDefaultInputMapping("JOY_UP");
+		gameKeyMap->addAction(act);
+
+		act = new Action("SPEEDDOWN", _("Slow down dialogue"));
+		act->setKeyEvent(KeyState(KEYCODE_MINUS, '-'));
+		act->addDefaultInputMapping("MINUS");
+		act->addDefaultInputMapping("JOY_DOWN");
+		gameKeyMap->addAction(act);
+
+	} else if (gameId == "tsotc") {
+		act = new Action(kStandardActionLeftClick, _("Move / Interact"));
+		act->setLeftClickEvent();
+		act->addDefaultInputMapping("MOUSE_LEFT");
+		act->addDefaultInputMapping("JOY_A");
+		gameKeyMap->addAction(act);
+
+		act = new Action(kStandardActionRightClick, _("Skip dialogue"));
+		act->setRightClickEvent();
+		act->addDefaultInputMapping("MOUSE_RIGHT");
+		act->addDefaultInputMapping("JOY_B");
+		gameKeyMap->addAction(act);
+
+		act = new Action("QUIT", _("Quit"));
+		act->setKeyEvent(KeyState(KEYCODE_ESCAPE, ASCII_ESCAPE));
+		act->addDefaultInputMapping("ESCAPE");
+		act->addDefaultInputMapping("JOY_LEFT");
+		gameKeyMap->addAction(act);
+
+		act = new Action("LOADAUTOSAVE", _("Load auto save"));
+		act->setKeyEvent(KeyState(KEYCODE_a, 'a'));
+		act->addDefaultInputMapping("a");
+		act->addDefaultInputMapping("JOY_X");
+		gameKeyMap->addAction(act);
+
+		act = new Action("SAVE", _("Save game"));
+		act->setKeyEvent(KeyState(KEYCODE_s, 's'));
+		act->addDefaultInputMapping("s");
+		act->addDefaultInputMapping("JOY_LEFT_SHOULDER");
+		gameKeyMap->addAction(act);
+
+		act = new Action("LOAD", _("Load save"));
+		act->setKeyEvent(KeyState(KEYCODE_l, 'l'));
+		act->addDefaultInputMapping("l");
+		act->addDefaultInputMapping("JOY_RIGHT_SHOULDER");
+		gameKeyMap->addAction(act);
+
+		act = new Action("INVENTORY", _("Inventory"));
+		act->setKeyEvent(KeyState(KEYCODE_i, 'i'));
+		act->addDefaultInputMapping("i");
+		act->addDefaultInputMapping("JOY_Y");
+		gameKeyMap->addAction(act);
+
+		act = new Action("PAUSE", _("Pause"));
+		act->setKeyEvent(KeyState(KEYCODE_SPACE, ASCII_SPACE));
+		act->addDefaultInputMapping("SPACE");
+		act->addDefaultInputMapping("JOY_RIGHT");
+		gameKeyMap->addAction(act);
+
+	} else if (gameId == "gjgagsas") {
+		act = new Action(kStandardActionLeftClick, _("Move / Interact"));
+		act->setLeftClickEvent();
+		act->addDefaultInputMapping("MOUSE_LEFT");
+		act->addDefaultInputMapping("JOY_A");
+		gameKeyMap->addAction(act);
+
+		act = new Action(kStandardActionRightClick, _("Skip dialogue"));
+		act->setRightClickEvent();
+		act->addDefaultInputMapping("MOUSE_RIGHT");
+		act->addDefaultInputMapping("JOY_B");
+		gameKeyMap->addAction(act);
+
+		act = new Action("QUIT", _("Quit"));
+		act->setKeyEvent(KeyState(KEYCODE_ESCAPE, ASCII_ESCAPE));
+		act->addDefaultInputMapping("ESCAPE");
+		act->addDefaultInputMapping("JOY_LEFT");
+		gameKeyMap->addAction(act);
+
+		act = new Action("LOADAUTOSAVE", _("Load auto save"));
+		act->setKeyEvent(KeyState(KEYCODE_a, 'a'));
+		act->addDefaultInputMapping("a");
+		act->addDefaultInputMapping("JOY_X");
+		gameKeyMap->addAction(act);
+
+		act = new Action("SAVE", _("Save game"));
+		act->setKeyEvent(KeyState(KEYCODE_s, 's'));
+		act->addDefaultInputMapping("s");
+		act->addDefaultInputMapping("JOY_LEFT_SHOULDER");
+		gameKeyMap->addAction(act);
+
+		act = new Action("LOAD", _("Load save"));
+		act->setKeyEvent(KeyState(KEYCODE_l, 'l'));
+		act->addDefaultInputMapping("l");
+		act->addDefaultInputMapping("JOY_RIGHT_SHOULDER");
+		gameKeyMap->addAction(act);
+
+		act = new Action("INVENTORY", _("Inventory"));
+		act->setKeyEvent(KeyState(KEYCODE_i, 'i'));
+		act->addDefaultInputMapping("i");
+		act->addDefaultInputMapping("JOY_Y");
+		gameKeyMap->addAction(act);
+
+	} else if (gameId == "robinsrescue") {
+		act = new Action(kStandardActionLeftClick, _("Move / Interact"));
+		act->setLeftClickEvent();
+		act->addDefaultInputMapping("MOUSE_LEFT");
+		act->addDefaultInputMapping("JOY_A");
+		gameKeyMap->addAction(act);
+
+		act = new Action(kStandardActionRightClick, _("Inventory"));
+		act->setRightClickEvent();
+		act->addDefaultInputMapping("MOUSE_RIGHT");
+		act->addDefaultInputMapping("JOY_B");
+		gameKeyMap->addAction(act);
+
+		act = new Action(kStandardActionPause, _("Pause"));
+		act->setKeyEvent(KeyState(KEYCODE_ESCAPE, ASCII_ESCAPE));
+		act->addDefaultInputMapping("ESCAPE");
+		act->addDefaultInputMapping("q");
+		act->addDefaultInputMapping("JOY_RIGHT");
+		gameKeyMap->addAction(act);
+
+		act = new Action("SKIPDLG", _("Skip dialogue"));
+		act->setKeyEvent(KeyState(KEYCODE_PERIOD, '.'));
+		act->addDefaultInputMapping("PERIOD");
+		act->addDefaultInputMapping("JOY_X");
+		gameKeyMap->addAction(act);
+
+		act = new Action("SHOWFLOOR", _("DEBUG: Show floor"));
+		act->setKeyEvent(KeyState(KEYCODE_f, 'f'));
+		act->addDefaultInputMapping("f");
+		debugKeyMap->addAction(act);
+
+		act = new Action("SHOWBOXES", _("DEBUG: Show boxes"));
+		act->setKeyEvent(KeyState(KEYCODE_b, 'b'));
+		act->addDefaultInputMapping("b");
+		debugKeyMap->addAction(act);
+
+	} else if (gameId == "atw") {
+		act = new Action(kStandardActionLeftClick, _("Move / Interact"));
+		act->setLeftClickEvent();
+		act->addDefaultInputMapping("MOUSE_LEFT");
+		act->addDefaultInputMapping("JOY_A");
+		gameKeyMap->addAction(act);
+
+		act = new Action(kStandardActionRightClick, _("Inventory"));
+		act->setRightClickEvent();
+		act->addDefaultInputMapping("MOUSE_RIGHT");
+		act->addDefaultInputMapping("JOY_B");
+		gameKeyMap->addAction(act);
+
+		act = new Action("QUIT", _("Quit"));
+		act->setKeyEvent(KeyState(KEYCODE_ESCAPE, ASCII_ESCAPE));
+		act->addDefaultInputMapping("ESCAPE");
+		act->addDefaultInputMapping("q");
+		act->addDefaultInputMapping("JOY_LEFT");
+		gameKeyMap->addAction(act);
+	
+	} else if (gameId == "cubert") {
+		act = new Action(kStandardActionLeftClick, _("Move / Interact"));
+		act->setLeftClickEvent();
+		act->addDefaultInputMapping("MOUSE_LEFT");
+		act->addDefaultInputMapping("JOY_A");
+		gameKeyMap->addAction(act);
+
+		act = new Action(kStandardActionRightClick, _("Inventory / Examine"));
+		act->setRightClickEvent();
+		act->addDefaultInputMapping("MOUSE_RIGHT");
+		act->addDefaultInputMapping("JOY_B");
+		gameKeyMap->addAction(act);
+
+		act = new Action(kStandardActionPause, _("Pause"));
+		act->setKeyEvent(KeyState(KEYCODE_ESCAPE, ASCII_ESCAPE));
+		act->addDefaultInputMapping("ESCAPE");
+		act->addDefaultInputMapping("JOY_RIGHT");
+		gameKeyMap->addAction(act);
+
+	} else if (gameId == "frasse") {
+		act = new Action(kStandardActionLeftClick, _("Move / Interact"));
+		act->setLeftClickEvent();
+		act->addDefaultInputMapping("MOUSE_LEFT");
+		act->addDefaultInputMapping("JOY_A");
+		gameKeyMap->addAction(act);
+
+		act = new Action(kStandardActionRightClick, _("Inventory"));
+		act->setRightClickEvent();
+		act->addDefaultInputMapping("MOUSE_RIGHT");
+		act->addDefaultInputMapping("JOY_B");
+		gameKeyMap->addAction(act);
+
+		act = new Action(kStandardActionPause, _("Pause"));
+		act->setKeyEvent(KeyState(KEYCODE_ESCAPE, ASCII_ESCAPE));
+		act->addDefaultInputMapping("ESCAPE");
+		act->addDefaultInputMapping("JOY_RIGHT");
+		gameKeyMap->addAction(act);
+
+		act = new Action("SKIPDLG", _("Skip dialogue"));
+		act->setKeyEvent(KeyState(KEYCODE_PERIOD, '.'));
+		act->addDefaultInputMapping("PERIOD");
+		act->addDefaultInputMapping("JOY_X");
+		gameKeyMap->addAction(act);
+
+	} else if (gameId == "tgttpoacs") {
+		act = new Action(kStandardActionLeftClick, _("Move / Interact"));
+		act->setLeftClickEvent();
+		act->addDefaultInputMapping("MOUSE_LEFT");
+		act->addDefaultInputMapping("JOY_A");
+		gameKeyMap->addAction(act);
+
+		act = new Action(kStandardActionRightClick, _("Examine / Skip dialogue"));
+		act->setRightClickEvent();
+		act->addDefaultInputMapping("MOUSE_RIGHT");
+		act->addDefaultInputMapping("JOY_B");
+		gameKeyMap->addAction(act);
+
+		act = new Action(kStandardActionPause, _("Pause / Skip cutscene"));
+		act->setKeyEvent(KeyState(KEYCODE_ESCAPE, ASCII_ESCAPE));
+		act->addDefaultInputMapping("ESCAPE");
+		act->addDefaultInputMapping("JOY_RIGHT_SHOULDER");
+		gameKeyMap->addAction(act);
+
+		act = new Action("SPEEDUP", _("Speed up dialogue"));
+		act->setKeyEvent(KeyState(KEYCODE_PLUS, '+'));
+		act->addDefaultInputMapping("PLUS");
+		gameKeyMap->addAction(act);
+
+		act = new Action("SPEEDDOWN", _("Slow down dialogue"));
+		act->setKeyEvent(KeyState(KEYCODE_MINUS, '-'));
+		act->addDefaultInputMapping("MINUS");
+		gameKeyMap->addAction(act);
+
+		act = new Action("SAVE", _("Quick save"));
+		act->setKeyEvent(KeyState(KEYCODE_s, 's'));
+		act->addDefaultInputMapping("s");
+		gameKeyMap->addAction(act);
+
+		act = new Action("LOAD", _("Quick load"));
+		act->setKeyEvent(KeyState(KEYCODE_l, 'l'));
+		act->addDefaultInputMapping("l");
+		gameKeyMap->addAction(act);
+
+		act = new Action("EXAMINE", _("Examine"));
+		act->setKeyEvent(KeyState(KEYCODE_e, 'e'));
+		act->addDefaultInputMapping("e");
+		gameKeyMap->addAction(act);
+
+		act = new Action("PICKUP", _("Pick up"));
+		act->setKeyEvent(KeyState(KEYCODE_p, 'p'));
+		act->addDefaultInputMapping("p");
+		gameKeyMap->addAction(act);
+
+		act = new Action("TALK", _("Talk to"));
+		act->setKeyEvent(KeyState(KEYCODE_t, 't'));
+		act->addDefaultInputMapping("t");
+		gameKeyMap->addAction(act);
+
+		act = new Action("SMELL", _("Smell"));
+		act->setKeyEvent(KeyState(KEYCODE_m, 'm'));
+		act->addDefaultInputMapping("m");
+		gameKeyMap->addAction(act);
+
+		act = new Action("USE", _("Use"));
+		act->setKeyEvent(KeyState(KEYCODE_u, 'u'));
+		act->addDefaultInputMapping("u");
+		gameKeyMap->addAction(act);
+
+		act = new Action("CONSUME", _("Consume"));
+		act->setKeyEvent(KeyState(KEYCODE_c, 'c'));
+		act->addDefaultInputMapping("c");
+		gameKeyMap->addAction(act);
+
+		act = new Action("QUIT", _("Quit"));
+		act->setKeyEvent(KeyState(KEYCODE_q, 'q'));
+		act->addDefaultInputMapping("q");
+		act->addDefaultInputMapping("JOY_LEFT_SHOULDER");
+		gameKeyMap->addAction(act);
+
+		act = new Action("START", _("Start"));
+		act->setKeyEvent(KeyState(KEYCODE_RETURN, ASCII_RETURN));
+		act->addDefaultInputMapping("RETURN");
+		act->addDefaultInputMapping("JOY_Y");
+		minigameKeymap->addAction(act);
+
+		act = new Action("QUIT", _("Quit"));
+		act->setKeyEvent(KeyState(KEYCODE_q, 'q'));
+		act->addDefaultInputMapping("q");
+		act->addDefaultInputMapping("JOY_X");
+		minigameKeymap->addAction(act);
+
+		act = new Action("CASTEARTH", _("Cast earth spell"));
+		act->setKeyEvent(KeyState(KEYCODE_z, 'z'));
+		act->addDefaultInputMapping("z");
+		act->addDefaultInputMapping("JOY_LEFT");
+		minigameKeymap->addAction(act);
+
+		act = new Action("CASTAIR", _("Cast air spell"));
+		act->setKeyEvent(KeyState(KEYCODE_x, 'x'));
+		act->addDefaultInputMapping("x");
+		act->addDefaultInputMapping("JOY_UP");
+		minigameKeymap->addAction(act);
+
+		act = new Action("CASTFIRE", _("Cast fire spell"));
+		act->setKeyEvent(KeyState(KEYCODE_c, 'c'));
+		act->addDefaultInputMapping("c");
+		act->addDefaultInputMapping("JOY_RIGHT");
+		minigameKeymap->addAction(act);
+
+		act = new Action("CASTWATER", _("Cast water spell"));
+		act->setKeyEvent(KeyState(KEYCODE_v, 'v'));
+		act->addDefaultInputMapping("v");
+		act->addDefaultInputMapping("JOY_DOWN");
+		minigameKeymap->addAction(act);
+
+	} else if (gameId == "interview") {
+		act = new Action(kStandardActionLeftClick, _("Move / Interact"));
+		act->setLeftClickEvent();
+		act->addDefaultInputMapping("MOUSE_LEFT");
+		act->addDefaultInputMapping("JOY_A");
+		gameKeyMap->addAction(act);
+
+		act = new Action(kStandardActionRightClick, _("Skip dialogue"));
+		act->setRightClickEvent();
+		act->addDefaultInputMapping("MOUSE_RIGHT");
+		act->addDefaultInputMapping("JOY_B");
+		gameKeyMap->addAction(act);
+
+		act = new Action(kStandardActionPause, _("Pause / Skip cutscene"));
+		act->setKeyEvent(KeyState(KEYCODE_ESCAPE, ASCII_ESCAPE));
+		act->addDefaultInputMapping("ESCAPE");
+		act->addDefaultInputMapping("JOY_RIGHT");
+		gameKeyMap->addAction(act);
+
+		act = new Action("LOAD", _("Quick Load"));
+		act->setKeyEvent(KeyState(KEYCODE_l, 'l'));
+		act->addDefaultInputMapping("l");
+		act->addDefaultInputMapping("JOY_RIGHT_SHOULDER");
+		gameKeyMap->addAction(act);
+
+		act = new Action("SAVE", _("Quick Save"));
+		act->setKeyEvent(KeyState(KEYCODE_s, 's'));
+		act->addDefaultInputMapping("s");
+		act->addDefaultInputMapping("JOY_LEFT_SHOULDER");
+		gameKeyMap->addAction(act);
+
+		act = new Action("QUIT", _("Quit"));
+		act->setKeyEvent(KeyState(KEYCODE_q, 'q'));
+		act->addDefaultInputMapping("q");
+		act->addDefaultInputMapping("JOY_LEFT");
+		gameKeyMap->addAction(act);
+
+	} else if (gameId == "leptonsquest") {
+		act = new Action(kStandardActionLeftClick, _("Move / Interact / Skip dialogue"));
+		act->setLeftClickEvent();
+		act->addDefaultInputMapping("MOUSE_LEFT");
+		act->addDefaultInputMapping("JOY_A");
+		gameKeyMap->addAction(act);
+
+		act = new Action("QUIT", _("Quit"));
+		act->setKeyEvent(KeyState(KEYCODE_ESCAPE, ASCII_ESCAPE));
+		act->addDefaultInputMapping("ESCAPE");
+		act->addDefaultInputMapping("JOY_LEFT");
+		gameKeyMap->addAction(act);
+
+		act = new Action("SHOWFLOOR", _("DEBUG: Show floor"));
+		act->setKeyEvent(KeyState(KEYCODE_f, 'f'));
+		act->addDefaultInputMapping("f");
+		debugKeyMap->addAction(act);
+
+		act = new Action("SHOWBOXES", _("DEBUG: Show boxes"));
+		act->setKeyEvent(KeyState(KEYCODE_b, 'b'));
+		act->addDefaultInputMapping("b");
+		debugKeyMap->addAction(act);
+
+	} else if (gameId == "life") {
+		act = new Action(kStandardActionLeftClick, _("Move / Interact"));
+		act->setLeftClickEvent();
+		act->addDefaultInputMapping("MOUSE_LEFT");
+		act->addDefaultInputMapping("JOY_A");
+		gameKeyMap->addAction(act);
+
+		act = new Action("SKIPDLG", _("Skip dialogue"));
+		act->setRightClickEvent();
+		act->addDefaultInputMapping("MOUSE_RIGHT");
+		act->addDefaultInputMapping(".");
+		act->addDefaultInputMapping("JOY_B");
+		gameKeyMap->addAction(act);
+
+		act = new Action(kStandardActionPause, _("Pause"));
+		act->setKeyEvent(KeyState(KEYCODE_ESCAPE, ASCII_ESCAPE));
+		act->addDefaultInputMapping("ESCAPE");
+		act->addDefaultInputMapping("JOY_RIGHT");
+		gameKeyMap->addAction(act);
+
+		act = new Action("SAVE", _("Quick save"));
+		act->setKeyEvent(KeyState(KEYCODE_s, 's'));
+		act->addDefaultInputMapping("s");
+		act->addDefaultInputMapping("JOY_LEFT_SHOULDER");
+		gameKeyMap->addAction(act);
+
+		act = new Action("LOAD", _("Quick load"));
+		act->setKeyEvent(KeyState(KEYCODE_l, 'l'));
+		act->addDefaultInputMapping("l");
+		act->addDefaultInputMapping("JOY_RIGHT_SHOULDER");
+		gameKeyMap->addAction(act);
+
+	} else if (gameId == "mandy") {
+		act = new Action(kStandardActionLeftClick, _("Move / Interact"));
+		act->setLeftClickEvent();
+		act->addDefaultInputMapping("MOUSE_LEFT");
+		act->addDefaultInputMapping("JOY_A");
+		gameKeyMap->addAction(act);
+
+		act = new Action(kStandardActionRightClick, _("Skip dialogue"));
+		act->setRightClickEvent();
+		act->addDefaultInputMapping("MOUSE_RIGHT");
+		act->addDefaultInputMapping("JOY_B");
+		gameKeyMap->addAction(act);
+
+		act = new Action(kStandardActionPause, _("Pause"));
+		act->setKeyEvent(KeyState(KEYCODE_ESCAPE, ASCII_ESCAPE));
+		act->addDefaultInputMapping("ESCAPE");
+		act->addDefaultInputMapping("JOY_RIGHT");
+		gameKeyMap->addAction(act);
+
+		act = new Action("SAVE", _("Quick save"));
+		act->setKeyEvent(KeyState(KEYCODE_s, 's'));
+		act->addDefaultInputMapping("s");
+		act->addDefaultInputMapping("JOY_LEFT_SHOULDER");
+		gameKeyMap->addAction(act);
+
+		act = new Action("LOAD", _("Quick load"));
+		act->setKeyEvent(KeyState(KEYCODE_l, 'l'));
+		act->addDefaultInputMapping("l");
+		act->addDefaultInputMapping("JOY_RIGHT_SHOULDER");
+		gameKeyMap->addAction(act);
+
+	
+	} else if (gameId == "nsc") {
+		act = new Action(kStandardActionLeftClick, _("Move / Interact / Skip dialogue"));
+		act->setLeftClickEvent();
+		act->addDefaultInputMapping("MOUSE_LEFT");
+		act->addDefaultInputMapping("JOY_A");
+		gameKeyMap->addAction(act);
+
+		act = new Action(kStandardActionRightClick, _("Inventory / Skip dialogue"));
+		act->setRightClickEvent();
+		act->addDefaultInputMapping("MOUSE_RIGHT");
+		act->addDefaultInputMapping("JOY_B");
+		gameKeyMap->addAction(act);
+
+		act = new Action(kStandardActionPause, _("Pause / Skip cutscene"));
+		act->setKeyEvent(KeyState(KEYCODE_ESCAPE, ASCII_ESCAPE));
+		act->addDefaultInputMapping("ESCAPE");
+		act->addDefaultInputMapping("JOY_RIGHT");
+		gameKeyMap->addAction(act);
+
+	} else if (gameId == "verbcoin") {
+		act = new Action(kStandardActionLeftClick, _("Move / Interact"));
+		act->setLeftClickEvent();
+		act->addDefaultInputMapping("MOUSE_LEFT");
+		act->addDefaultInputMapping("JOY_A");
+		gameKeyMap->addAction(act);
+
+		act = new Action(kStandardActionRightClick, _("Skip dialogue"));
+		act->setRightClickEvent();
+		act->addDefaultInputMapping("MOUSE_RIGHT");
+		act->addDefaultInputMapping("JOY_B");
+		gameKeyMap->addAction(act);
+
+		act = new Action("QUIT", _("Quit"));
+		act->setKeyEvent(KeyState(KEYCODE_ESCAPE, ASCII_ESCAPE));
+		act->addDefaultInputMapping("ESCAPE");
+		act->addDefaultInputMapping("JOY_LEFT");
+		gameKeyMap->addAction(act);
+
+		act = new Action("SHOWBOXES", _("DEBUG: Show boxes"));
+		act->setKeyEvent(KeyState(KEYCODE_SPACE, ASCII_SPACE));
+		act->addDefaultInputMapping("SPACE");
+		debugKeyMap->addAction(act);
+
+		act = new Action("SHOWFLOOR", _("DEBUG: Show floor"));
+		act->setKeyEvent(KeyState(KEYCODE_f, 'f'));
+		act->addDefaultInputMapping("f");
+		debugKeyMap->addAction(act);
+
+	} else {
+		// Default keymap for other games
+		warning("Game-specific keymap is not defined. Using default SLUDGE engine keymap");
+
+		act = new Action(kStandardActionLeftClick, _("Left Click"));
+		act->setLeftClickEvent();
+		act->addDefaultInputMapping("MOUSE_LEFT");
+		act->addDefaultInputMapping("JOY_A");
+		gameKeyMap->addAction(act);
+
+		act = new Action(kStandardActionRightClick, _("Right Click"));
+		act->setRightClickEvent();
+		act->addDefaultInputMapping("MOUSE_RIGHT");
+		act->addDefaultInputMapping("JOY_B");
+		gameKeyMap->addAction(act);
+
+		act = new Action(kStandardActionPause, _("Pause Game"));
+		act->setKeyEvent(KeyState(KEYCODE_ESCAPE, ASCII_ESCAPE));
+		act->addDefaultInputMapping("ESCAPE");
+		act->addDefaultInputMapping("JOY_RIGHT");
+		gameKeyMap->addAction(act);
+	}
+
+	act = new Action(kStandardActionLeftClick, _("Left Click"));
+	act->setLeftClickEvent();
+	act->addDefaultInputMapping("MOUSE_LEFT");
+	act->addDefaultInputMapping("JOY_A");
+	menuKeymap->addAction(act);
+
+	act = new Action(kStandardActionRightClick, _("Right Click"));
+	act->setRightClickEvent();
+	act->addDefaultInputMapping("MOUSE_RIGHT");
+	act->addDefaultInputMapping("JOY_B");
+	menuKeymap->addAction(act);
+
+	KeymapArray keyMaps(4);
+	keyMaps[0] = gameKeyMap;
+	keyMaps[1] = debugKeyMap;
+	keyMaps[2] = menuKeymap;
+	keyMaps[3] = minigameKeymap;
+
+	menuKeymap->setEnabled(false);
+
+	return keyMaps;
+}
+
+} // End of namespace Sludge
diff --git a/engines/sludge/metaengine.cpp b/engines/sludge/metaengine.cpp
index bd7d98525e2..9d044358df5 100644
--- a/engines/sludge/metaengine.cpp
+++ b/engines/sludge/metaengine.cpp
@@ -23,6 +23,7 @@
 
 #include "sludge/sludge.h"
 #include "sludge/detection.h"
+#include "sludge/keymapper_tables.h"
 
 namespace Sludge {
 
@@ -48,12 +49,19 @@ public:
 		*engine = new Sludge::SludgeEngine(syst, desc);
 		return Common::kNoError;
 	}
+
+	Common::KeymapArray initKeymaps(const char *target) const override;
 };
 
 bool SludgeMetaEngine::hasFeature(MetaEngineFeature f) const {
 	return checkExtendedSaves(f) || (f == kSupportsLoadingDuringStartup);
 }
 
+Common::KeymapArray SludgeMetaEngine::initKeymaps(const char *target) const {
+	Common::String gameId = ConfMan.get("gameid", target);
+	return Sludge::getSludgeKeymaps(target, gameId);
+}
+
 #if PLUGIN_ENABLED_DYNAMIC(SLUDGE)
 	REGISTER_PLUGIN_DYNAMIC(SLUDGE, PLUGIN_TYPE_ENGINE, SludgeMetaEngine);
 #else




More information about the Scummvm-git-logs mailing list