[Scummvm-git-logs] scummvm master -> 44f7f801a1394dbea21fbb887fa7b498d6b03714

sev- sev at scummvm.org
Thu Aug 27 08:35:04 UTC 2020


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

Summary:
44f7f801a1 HDB: Add keymapper support


Commit: 44f7f801a1394dbea21fbb887fa7b498d6b03714
    https://github.com/scummvm/scummvm/commit/44f7f801a1394dbea21fbb887fa7b498d6b03714
Author: Cameron Cawley (ccawley2011 at gmail.com)
Date: 2020-08-27T10:34:59+02:00

Commit Message:
HDB: Add keymapper support

Changed paths:
    engines/hdb/detection.cpp
    engines/hdb/hdb.cpp
    engines/hdb/input.cpp
    engines/hdb/input.h
    engines/hdb/menu.cpp
    engines/hdb/menu.h


diff --git a/engines/hdb/detection.cpp b/engines/hdb/detection.cpp
index 49491f9555..438ec89e03 100644
--- a/engines/hdb/detection.cpp
+++ b/engines/hdb/detection.cpp
@@ -25,10 +25,15 @@
 #include "common/debug.h"
 #include "common/translation.h"
 
+#include "backends/keymapper/action.h"
+#include "backends/keymapper/keymapper.h"
+#include "backends/keymapper/standard-actions.h"
+
 #include "engines/advancedDetector.h"
 #include "graphics/thumbnail.h"
 
 #include "hdb/hdb.h"
+#include "hdb/input.h"
 
 namespace HDB {
 
@@ -186,6 +191,7 @@ public:
 	void removeSaveState(const char *target, int slot) const override;
 	SaveStateList listSaves(const char *target) const override;
 	SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const override;
+	Common::KeymapArray initKeymaps(const char *target) const override;
 	bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const override;
 };
 
@@ -286,6 +292,90 @@ SaveStateDescriptor HDBMetaEngine::querySaveMetaInfos(const char *target, int sl
 	return SaveStateDescriptor();
 }
 
+Common::KeymapArray HDBMetaEngine::initKeymaps(const char *target) const {
+	using namespace Common;
+	using namespace HDB;
+
+	Keymap *engineKeyMap = new Keymap(Keymap::kKeymapTypeGame, "hdb", "Hyperspace Delivery Boy!");
+
+	Action *act;
+
+	act = new Action("LCLK", _("Left Click"));
+	act->setLeftClickEvent();
+	act->addDefaultInputMapping("MOUSE_LEFT");
+	act->addDefaultInputMapping("JOY_A");
+	engineKeyMap->addAction(act);
+
+	act = new Action(kStandardActionMoveUp, _("Move up"));
+	act->setCustomEngineActionEvent(kHDBActionUp);
+	act->addDefaultInputMapping("UP");
+	act->addDefaultInputMapping("JOY_UP");
+	engineKeyMap->addAction(act);
+
+	act = new Action(kStandardActionMoveDown, _("Move down"));
+	act->setCustomEngineActionEvent(kHDBActionDown);
+	act->addDefaultInputMapping("DOWN");
+	act->addDefaultInputMapping("JOY_DOWN");
+	engineKeyMap->addAction(act);
+
+	act = new Action(kStandardActionMoveLeft, _("Move left"));
+	act->setCustomEngineActionEvent(kHDBActionLeft);
+	act->addDefaultInputMapping("LEFT");
+	act->addDefaultInputMapping("JOY_LEFT");
+	engineKeyMap->addAction(act);
+
+	act = new Action(kStandardActionMoveRight, _("Move right"));
+	act->setCustomEngineActionEvent(kHDBActionRight);
+	act->addDefaultInputMapping("RIGHT");
+	act->addDefaultInputMapping("JOY_RIGHT");
+	engineKeyMap->addAction(act);
+
+	act = new Action("USE", _("Use"));
+	act->setCustomEngineActionEvent(kHDBActionUse);
+	act->addDefaultInputMapping("RETURN");
+	act->addDefaultInputMapping("MOUSE_RIGHT");
+	act->addDefaultInputMapping("JOY_B");
+	engineKeyMap->addAction(act);
+
+	act = new Action("CLEAR", _("Clear waypoints"));
+	act->setCustomEngineActionEvent(kHDBActionClearWaypoints);
+	act->addDefaultInputMapping("MOUSE_MIDDLE");
+	act->addDefaultInputMapping("JOY_X");
+	engineKeyMap->addAction(act);
+
+#if 0
+	act = new Action("INV", _("Inventory"));
+	act->setCustomEngineActionEvent(kHDBActionInventory);
+	act->addDefaultInputMapping("SPACE");
+	act->addDefaultInputMapping("JOY_Y");
+	engineKeyMap->addAction(act);
+#endif
+
+	act = new Action(kStandardActionPause, _("Pause"));
+	act->setCustomEngineActionEvent(kHDBActionPause);
+	act->addDefaultInputMapping("p");
+	act->addDefaultInputMapping("JOY_LEFT_SHOULDER");
+	engineKeyMap->addAction(act);
+
+	act = new Action(kStandardActionOpenMainMenu, _("Menu"));
+	act->setCustomEngineActionEvent(kHDBActionMenu);
+	act->addDefaultInputMapping("ESCAPE");
+	act->addDefaultInputMapping("JOY_RIGHT_SHOULDER");
+	engineKeyMap->addAction(act);
+
+	act = new Action("DEBUG", _("Debug"));
+	act->setCustomEngineActionEvent(kHDBActionDebug);
+	act->addDefaultInputMapping("F1");
+	engineKeyMap->addAction(act);
+
+	act = new Action("QUIT", _("Quit"));
+	act->setCustomEngineActionEvent(kHDBActionQuit);
+	act->addDefaultInputMapping("F10");
+	engineKeyMap->addAction(act);
+
+	return Keymap::arrayOf(engineKeyMap);
+}
+
 bool HDBMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const {
 	if (desc) {
 		*engine = new HDB::HDBGame(syst, desc);
diff --git a/engines/hdb/hdb.cpp b/engines/hdb/hdb.cpp
index 6a62f66c87..048490dac8 100644
--- a/engines/hdb/hdb.cpp
+++ b/engines/hdb/hdb.cpp
@@ -975,28 +975,16 @@ Common::Error HDBGame::run() {
 				_input->updateMouse(event.mouse.x, event.mouse.y);
 				break;
 			case Common::EVENT_LBUTTONDOWN:
-				_input->updateMouseButtons(1, 0, 0);
+				_input->updateMouseButtons(true);
 				break;
 			case Common::EVENT_LBUTTONUP:
-				_input->updateMouseButtons(-1, 0, 0);
+				_input->updateMouseButtons(false);
 				break;
-			case Common::EVENT_MBUTTONDOWN:
-				_input->updateMouseButtons(0, 1, 0);
+			case Common::EVENT_CUSTOM_ENGINE_ACTION_START:
+				_input->updateActions(event, true, true);
 				break;
-			case Common::EVENT_MBUTTONUP:
-				_input->updateMouseButtons(0, -1, 0);
-				break;
-			case Common::EVENT_RBUTTONDOWN:
-				_input->updateMouseButtons(0, 0, 1);
-				break;
-			case Common::EVENT_RBUTTONUP:
-				_input->updateMouseButtons(0, 0, -1);
-				break;
-			case Common::EVENT_KEYDOWN:
-				_input->updateKeys(event, true);
-				break;
-			case Common::EVENT_KEYUP:
-				_input->updateKeys(event, false);
+			case Common::EVENT_CUSTOM_ENGINE_ACTION_END:
+				_input->updateActions(event, false, true);
 				break;
 			default:
 				break;
diff --git a/engines/hdb/input.cpp b/engines/hdb/input.cpp
index 6ea04141bc..7088431928 100644
--- a/engines/hdb/input.cpp
+++ b/engines/hdb/input.cpp
@@ -35,20 +35,8 @@ void Input::init() {
 	_stylusDown = false;
 	_buttons = 0;
 
-	_keyUp = Common::KEYCODE_UP;
-	_keyDown = Common::KEYCODE_DOWN;
-	_keyLeft = Common::KEYCODE_LEFT;
-	_keyRight = Common::KEYCODE_RIGHT;
-	_keyMenu = Common::KEYCODE_ESCAPE;
-	_keyUse = Common::KEYCODE_RETURN;
-	_keyInv = Common::KEYCODE_SPACE;
-	_keyDebug = Common::KEYCODE_F1;
-	_keyQuit = Common::KEYCODE_F10;
-
 	_mouseX = g_hdb->_screenWidth / 2;
 	_mouseY = g_hdb->_screenHeight / 2;
-
-	_mouseLButton = _mouseMButton = _mouseRButton = 0;
 }
 
 void Input::setButtons(uint16 b) {
@@ -278,9 +266,6 @@ void Input::stylusDown(int x, int y) {
 		return;
 	time = delay;
 
-	_stylusDown = true;
-	_stylusDownX = x;
-	_stylusDownY = y;
 	GameState gs = g_hdb->getGameState();
 
 	switch (gs) {
@@ -352,8 +337,8 @@ void Input::stylusDown(int x, int y) {
 			int mx, my;
 			g_hdb->_map->getMapXY(&mx, &my);
 
-			mx = ((mx + _stylusDownX) / kTileWidth) * kTileWidth;
-			my = ((my + _stylusDownY) / kTileHeight) * kTileHeight;
+			mx = ((mx + x) / kTileWidth) * kTileWidth;
+			my = ((my + y) / kTileHeight) * kTileHeight;
 			g_hdb->_ai->setPlayerXY(mx, my);
 
 			g_hdb->startMoveMap(x, y);
@@ -418,10 +403,6 @@ void Input::stylusDown(int x, int y) {
 	}
 }
 
-void Input::stylusUp(int x, int y) {
-	_stylusDown = false;
-}
-
 void Input::stylusMove(int x, int y) {
 	// In a cinematic?
 	if (g_hdb->_ai->playerLocked() || g_hdb->_ai->playerDead())
@@ -449,18 +430,16 @@ void Input::updateMouse(int newX, int newY) {
 		g_hdb->_gfx->showPointer(true);
 
 	// Check if LButton is being dragged
-	if (_mouseLButton)
+	if (_stylusDown)
 		stylusMove(_mouseX, _mouseY);
 }
 
-void Input::updateMouseButtons(int l, int m, int r) {
-	_mouseLButton += l;
-	_mouseMButton += m;
-	_mouseRButton += r;
+void Input::updateMouseButtons(bool isDown) {
+	_stylusDown = isDown;
 
 	// Check if LButton has been pressed
 	// Check if LButton has been lifted
-	if (_mouseLButton) {
+	if (isDown) {
 		if (g_hdb->isPPC()) {
 			stylusDown(_mouseX, _mouseY);
 			return;
@@ -476,36 +455,13 @@ void Input::updateMouseButtons(int l, int m, int r) {
 			}
 			stylusDown(_mouseX, _mouseY);
 		}
-	} else if (!_mouseLButton) {
-		stylusUp(_mouseX, _mouseY);
-	}
-
-	// Check if MButton has been pressed
-	if (_mouseMButton) {
-		if (g_hdb->getPause() && g_hdb->getGameState() == GAME_PLAY)
-			return;
-
-		g_hdb->_ai->clearWaypoints();
-		g_hdb->_sound->playSound(SND_POP);
-	}
-
-	// Check if RButton has been pressed
-	if (_mouseRButton) {
-		if (g_hdb->getPause() && g_hdb->getGameState() == GAME_PLAY)
-			return;
-
-		uint16 buttons = getButtons() | kButtonB;
-		setButtons(buttons);
-	} else if (!_mouseRButton) {
-		uint16 buttons = getButtons() & ~kButtonB;
-		setButtons(buttons);
 	}
 }
 
-void Input::updateKeys(Common::Event event, bool keyDown) {
+void Input::updateActions(Common::Event event, bool keyDown, bool fromMouse) {
 	static bool current = false, last = false;
 
-	if (keyDown && event.kbd.keycode == _keyQuit) {
+	if (keyDown && event.customType == kHDBActionQuit) {
 		g_hdb->quitGame();
 		return;
 	}
@@ -514,7 +470,7 @@ void Input::updateKeys(Common::Event event, bool keyDown) {
 
 	// PAUSE key pressed?
 	last = current;
-	if (keyDown && event.kbd.keycode == Common::KEYCODE_p && g_hdb->getGameState() == GAME_PLAY) {
+	if (keyDown && event.customType == kHDBActionPause && g_hdb->getGameState() == GAME_PLAY) {
 		current = true;
 		if (!last) {
 			g_hdb->togglePause();
@@ -524,50 +480,56 @@ void Input::updateKeys(Common::Event event, bool keyDown) {
 		current = false;
 
 	if (!g_hdb->getPause()) {
-		if (event.kbd.keycode == _keyUp) {
+		if (event.customType == kHDBActionUp) {
 			if (keyDown) {
 				buttons |= kButtonUp;
-				if (g_hdb->_gfx->getPointer())
+				if (g_hdb->_gfx->getPointer() && !fromMouse)
 					g_hdb->_gfx->showPointer(false);
 			} else {
 				buttons &= ~kButtonUp;
 			}
-		} else if (event.kbd.keycode == _keyDown) {
+		} else if (event.customType == kHDBActionDown) {
 			if (keyDown) {
 				buttons |= kButtonDown;
-				if (g_hdb->_gfx->getPointer())
+				if (g_hdb->_gfx->getPointer() && !fromMouse)
 					g_hdb->_gfx->showPointer(false);
 			} else {
 				buttons &= ~kButtonDown;
 			}
-		} else if (event.kbd.keycode == _keyLeft) {
+		} else if (event.customType == kHDBActionLeft) {
 			if (keyDown) {
 				buttons |= kButtonLeft;
-				if (g_hdb->_gfx->getPointer())
+				if (g_hdb->_gfx->getPointer() && !fromMouse)
 					g_hdb->_gfx->showPointer(false);
 			} else {
 				buttons &= ~kButtonLeft;
 			}
-		} else if (event.kbd.keycode == _keyRight) {
+		} else if (event.customType == kHDBActionRight) {
 			if (keyDown) {
 				buttons |= kButtonRight;
-				if (g_hdb->_gfx->getPointer())
+				if (g_hdb->_gfx->getPointer() && !fromMouse)
 					g_hdb->_gfx->showPointer(false);
 			} else {
 				buttons &= ~kButtonRight;
 			}
-		} else if (event.kbd.keycode == _keyUse) {
+		} else if (event.customType == kHDBActionUse) {
 			if (keyDown) {
 				buttons |= kButtonB;
-				if (g_hdb->_gfx->getPointer())
+				if (g_hdb->_gfx->getPointer() && !fromMouse)
 					g_hdb->_gfx->showPointer(false);
 			} else {
 				buttons &= ~kButtonB;
 			}
+		} else if (event.customType == kHDBActionClearWaypoints) {
+			if (keyDown) {
+				g_hdb->_ai->clearWaypoints();
+				g_hdb->_sound->playSound(SND_POP);
+			}
 		}
+		// TODO: Inventory key
 	}
 
-	if (event.kbd.keycode == _keyMenu) {
+	if (event.customType == kHDBActionMenu) {
 		if (keyDown) {
 			buttons |= kButtonA;
 			g_hdb->_gfx->showPointer(true);
@@ -576,7 +538,7 @@ void Input::updateKeys(Common::Event event, bool keyDown) {
 			buttons &= ~kButtonA;
 			g_hdb->_menu->setMenuKey(0);
 		}
-	} else if (event.kbd.keycode == _keyDebug) {
+	} else if (event.customType == kHDBActionDebug) {
 		if (keyDown)
 			buttons |= kButtonExit;
 		else
diff --git a/engines/hdb/input.h b/engines/hdb/input.h
index e870435497..5229055333 100644
--- a/engines/hdb/input.h
+++ b/engines/hdb/input.h
@@ -39,6 +39,21 @@ enum Button {
 	kButtonExit		= 2 << 8
 };
 
+enum HDBAction {
+	kHDBActionNone,
+	kHDBActionUp,
+	kHDBActionDown,
+	kHDBActionLeft,
+	kHDBActionRight,
+	kHDBActionUse,
+	kHDBActionClearWaypoints,
+	kHDBActionInventory,
+	kHDBActionMenu,
+	kHDBActionPause,
+	kHDBActionDebug,
+	kHDBActionQuit
+};
+
 class Input {
 public:
 
@@ -51,8 +66,8 @@ public:
 	void stylusMove(int x, int y);
 
 	void updateMouse(int newX, int newY);
-	void updateMouseButtons(int l, int m, int r);
-	void updateKeys(Common::Event event, bool keyDown);
+	void updateMouseButtons(bool isDown);
+	void updateActions(Common::Event event, bool keyDown, bool fromMouse);
 
 	int getMouseX() {
 		return _mouseX;
@@ -61,29 +76,11 @@ public:
 		return _mouseY;
 	}
 
-	void assignKey(int whichKey, Common::KeyCode keyPressed) {
-		switch (whichKey) {
-		case 0: _keyUp = keyPressed; return;
-		case 1: _keyDown = keyPressed; return;
-		case 2: _keyLeft = keyPressed; return;
-		case 3: _keyRight = keyPressed; return;
-		case 4: _keyUse = keyPressed; return;
-		default: break;
-		}
-	}
-
 private:
 
 	uint16 _buttons;	// Flags for buttons
 	bool _stylusDown;
-	int _stylusDownX, _stylusDownY;
 	int _mouseX, _mouseY;
-	int _mouseLButton, _mouseMButton, _mouseRButton;
-
-	// Definable Keys
-	Common::KeyCode _keyUp, _keyDown, _keyLeft, _keyRight;
-	Common::KeyCode _keyInv, _keyUse, _keyMenu, _keyDebug;
-	Common::KeyCode _keyQuit;
 };
 
 } // End of Namespace
diff --git a/engines/hdb/menu.cpp b/engines/hdb/menu.cpp
index 37ee05bd24..4c9e20d662 100644
--- a/engines/hdb/menu.cpp
+++ b/engines/hdb/menu.cpp
@@ -189,12 +189,6 @@ Menu::Menu() {
 	_nebulaY = 0;		// Used as a flag
 	_fStars[0].y = 0;	// Used as a flag
 
-	_keyAssignUp = Common::KEYCODE_UP;
-	_keyAssignDown = Common::KEYCODE_DOWN;
-	_keyAssignLeft = Common::KEYCODE_LEFT;
-	_keyAssignRight = Common::KEYCODE_RIGHT;
-	_keyAssignUse = Common::KEYCODE_RETURN;
-
 	_gCheckEmpty = nullptr;
 	_gCheckOff = nullptr;
 	_gCheckOn = nullptr;
@@ -353,46 +347,6 @@ void Menu::readConfig() {
 		needFlush = true;
 	}
 
-	if (ConfMan.hasKey(CONFIG_KEY_UP)) {
-		_keyAssignUp = (Common::KeyCode)ConfMan.getInt(CONFIG_KEY_UP);
-		g_hdb->_input->assignKey(0, _keyAssignUp);
-	} else {
-		ConfMan.setInt(CONFIG_KEY_UP, _keyAssignUp);
-		needFlush = true;
-	}
-
-	if (ConfMan.hasKey(CONFIG_KEY_DOWN)) {
-		_keyAssignDown = (Common::KeyCode)ConfMan.getInt(CONFIG_KEY_DOWN);
-		g_hdb->_input->assignKey(1, _keyAssignDown);
-	} else {
-		ConfMan.setInt(CONFIG_KEY_DOWN, _keyAssignDown);
-		needFlush = true;
-	}
-
-	if (ConfMan.hasKey(CONFIG_KEY_LEFT)) {
-		_keyAssignLeft = (Common::KeyCode)ConfMan.getInt(CONFIG_KEY_LEFT);
-		g_hdb->_input->assignKey(2, _keyAssignLeft);
-	} else {
-		ConfMan.setInt(CONFIG_KEY_LEFT, _keyAssignLeft);
-		needFlush = true;
-	}
-
-	if (ConfMan.hasKey(CONFIG_KEY_RIGHT)) {
-		_keyAssignRight = (Common::KeyCode)ConfMan.getInt(CONFIG_KEY_RIGHT);
-		g_hdb->_input->assignKey(3, _keyAssignRight);
-	} else {
-		ConfMan.setInt(CONFIG_KEY_RIGHT, _keyAssignRight);
-		needFlush = true;
-	}
-
-	if (ConfMan.hasKey(CONFIG_KEY_USE)) {
-		_keyAssignUse = (Common::KeyCode)ConfMan.getInt(CONFIG_KEY_USE);
-		g_hdb->_input->assignKey(4, _keyAssignUse);
-	} else {
-		ConfMan.setInt(CONFIG_KEY_USE, _keyAssignUse);
-		needFlush = true;
-	}
-
 	if (ConfMan.hasKey(CONFIG_CHEAT)) {
 		g_hdb->setCheatingOn();
 		debug("Cheating enabled");
@@ -412,12 +366,6 @@ void Menu::writeConfig() {
 	value = g_hdb->getStarsMonkeystone21();
 	ConfMan.setInt(CONFIG_MSTONE21, value);
 
-	ConfMan.setInt(CONFIG_KEY_UP, _keyAssignUp);
-	ConfMan.setInt(CONFIG_KEY_DOWN, _keyAssignDown);
-	ConfMan.setInt(CONFIG_KEY_LEFT, _keyAssignLeft);
-	ConfMan.setInt(CONFIG_KEY_RIGHT, _keyAssignRight);
-	ConfMan.setInt(CONFIG_KEY_USE, _keyAssignUse);
-
 	if (g_hdb->getCheatingOn())
 		ConfMan.set(CONFIG_CHEAT, "1");
 
diff --git a/engines/hdb/menu.h b/engines/hdb/menu.h
index f5b97cecc8..5d61e5a2e1 100644
--- a/engines/hdb/menu.h
+++ b/engines/hdb/menu.h
@@ -37,12 +37,6 @@ namespace HDB {
 #define	CONFIG_SOUNDCACHE	"sound_cache_max"
 #define	CONFIG_GFXCACHE		"gfx_cache_max"
 #define	CONFIG_CHEAT		"hypercheat"
-
-#define	CONFIG_KEY_UP		"keyup"
-#define	CONFIG_KEY_DOWN		"keydown"
-#define	CONFIG_KEY_LEFT		"keyleft"
-#define	CONFIG_KEY_RIGHT	"keyright"
-#define	CONFIG_KEY_USE		"keyuse"
 #define	CONFIG_VOICES		"voices"
 
 #define	TITLE_DELAY1		2				// time to wait before OOH OOH
@@ -209,7 +203,6 @@ public:
 	int	_optionsScrollX, _optionsXV, _oBannerY;
 	int	_nextScreen;
 
-	Common::KeyCode _keyAssignUp, _keyAssignDown, _keyAssignLeft, _keyAssignRight, _keyAssignUse;
 	Picture	*_contArrowUp, *_contArrowDown, *_contArrowLeft, *_contArrowRight, *_contAssign, *_warpPlaque;
 
 	Picture	*_sliderLeft, *_sliderMid, *_sliderRight, *_sliderKnob;




More information about the Scummvm-git-logs mailing list