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

bgK bastien.bouclet at gmail.com
Thu Feb 20 19:06:42 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:
eba793f3fd SKY: Implement keymapper integration


Commit: eba793f3fde8421114de3bb021c53e76650b47bc
    https://github.com/scummvm/scummvm/commit/eba793f3fde8421114de3bb021c53e76650b47bc
Author: Bastien Bouclet (bastien.bouclet at gmail.com)
Date: 2020-02-20T20:06:37+01:00

Commit Message:
SKY: Implement keymapper integration

Changed paths:
    engines/sky/control.cpp
    engines/sky/control.h
    engines/sky/detection.cpp
    engines/sky/intro.cpp
    engines/sky/mouse.cpp
    engines/sky/sky.cpp
    engines/sky/sky.h


diff --git a/engines/sky/control.cpp b/engines/sky/control.cpp
index b1835be..26d32a2 100644
--- a/engines/sky/control.cpp
+++ b/engines/sky/control.cpp
@@ -21,6 +21,8 @@
  */
 
 
+#include "backends/keymapper/keymap.h"
+
 #include "common/endian.h"
 #include "common/config-manager.h"
 #include "common/events.h"
@@ -194,7 +196,7 @@ void ControlStatus::drawToScreen() {
 	_statusText->drawToScreen(WITH_MASK);
 }
 
-Control::Control(Common::SaveFileManager *saveFileMan, Screen *screen, Disk *disk, Mouse *mouse, Text *text, MusicBase *music, Logic *logic, Sound *sound, SkyCompact *skyCompact, OSystem *system) {
+Control::Control(Common::SaveFileManager *saveFileMan, Screen *screen, Disk *disk, Mouse *mouse, Text *text, MusicBase *music, Logic *logic, Sound *sound, SkyCompact *skyCompact, OSystem *system, Common::Keymap *shortcutsKeymap) {
 	_saveFileMan = saveFileMan;
 
 	_skyScreen = screen;
@@ -206,7 +208,9 @@ Control::Control(Common::SaveFileManager *saveFileMan, Screen *screen, Disk *dis
 	_skySound = sound;
 	_skyCompact = skyCompact;
 	_system = system;
+	_shortcutsKeymap = shortcutsKeymap;
 	_controlPanel = NULL;
+	_action = kSkyActionNone;
 }
 
 ConResource *Control::createResource(void *pSpData, uint32 pNSprites, uint32 pCurSprite, int16 pX, int16 pY, uint32 pText, uint8 pOnClick, uint8 panelType) {
@@ -494,7 +498,7 @@ void Control::doControlPanel() {
 		delay(ANIM_DELAY);
 		if (!_controlPanel)
 			return;
-		if (_keyPressed.keycode == Common::KEYCODE_ESCAPE) { // escape pressed
+		if (_action == kSkyActionSkip) { // escape pressed
 			_mouseClicked = false;
 			quitPanel = true;
 		}
@@ -838,6 +842,7 @@ bool Control::autoSaveExists() {
 
 uint16 Control::saveRestorePanel(bool allowSave) {
 	_keyPressed.reset();
+	_action = kSkyActionNone;
 	_mouseWheel = 0;
 	buttonControl(NULL);
 	_text->drawToScreen(WITH_MASK); // flush text restore buffer
@@ -849,6 +854,9 @@ uint16 Control::saveRestorePanel(bool allowSave) {
 		lookList = _savePanLookList;
 		lookListLen = 6;
 		_system->setFeatureState(OSystem::kFeatureVirtualKeyboard, true);
+
+		 // Disable the shortcuts keymap during text input to prevent letters from being mapped to action events
+		_shortcutsKeymap->setEnabled(false);
 	} else {
 		lookList = _restorePanLookList;
 		if (autoSaveExists())
@@ -896,11 +904,11 @@ uint16 Control::saveRestorePanel(bool allowSave) {
 		delay(ANIM_DELAY);
 		if (!_controlPanel)
 			return clickRes;
-		if (_keyPressed.keycode == Common::KEYCODE_ESCAPE) { // escape pressed
+		if (_action == kSkyActionSkip) { // escape pressed
 			_mouseClicked = false;
 			clickRes = CANCEL_PRESSED;
 			quitPanel = true;
-		} else if ((_keyPressed.keycode == Common::KEYCODE_RETURN) || (_keyPressed.keycode == Common::KEYCODE_KP_ENTER)) {
+		} else if (_action == kSkyActionConfirm) { // enter pressed
 			clickRes = handleClick(lookList[0]);
 			if (!_controlPanel) //game state was destroyed
 				return clickRes;
@@ -910,7 +918,7 @@ uint16 Control::saveRestorePanel(bool allowSave) {
 				displayMessage(0, "Could not save the game. (%s)", _saveFileMan->popErrorDesc().c_str());
 			quitPanel = true;
 			_mouseClicked = false;
-			_keyPressed.reset();
+			_action = kSkyActionNone;
 		} if (allowSave && _keyPressed.keycode) {
 			handleKeyPress(_keyPressed, saveGameTexts[_selectedGame]);
 			refreshNames = true;
@@ -979,6 +987,7 @@ uint16 Control::saveRestorePanel(bool allowSave) {
 		free(textSprites[cnt]);
 
 	if (allowSave) {
+		_shortcutsKeymap->setEnabled(true);
 		_system->setFeatureState(OSystem::kFeatureVirtualKeyboard, false);
 	}
 
@@ -1495,11 +1504,15 @@ void Control::delay(unsigned int amount) {
 	uint32 start = _system->getMillis();
 	uint32 cur = start;
 	_keyPressed.reset();
+	_action = kSkyActionNone;
 
 	do {
 		Common::EventManager *eventMan = _system->getEventManager();
 		while (eventMan->pollEvent(event)) {
 			switch (event.type) {
+			case Common::EVENT_CUSTOM_ENGINE_ACTION_START:
+				_action = event.customType;
+				break;
 			case Common::EVENT_KEYDOWN:
 				_keyPressed = event.kbd;
 				break;
diff --git a/engines/sky/control.h b/engines/sky/control.h
index 0534fd3..eb69fe5 100644
--- a/engines/sky/control.h
+++ b/engines/sky/control.h
@@ -180,7 +180,7 @@ private:
 
 class Control {
 public:
-	Control(Common::SaveFileManager *saveFileMan, Screen *screen, Disk *disk, Mouse *mouse, Text *text, MusicBase *music, Logic *logic, Sound *sound, SkyCompact *skyCompact, OSystem *system);
+	Control(Common::SaveFileManager *saveFileMan, Screen *screen, Disk *disk, Mouse *mouse, Text *text, MusicBase *music, Logic *logic, Sound *sound, SkyCompact *skyCompact, OSystem *system, Common::Keymap *shortcutsKeymap);
 	void doControlPanel();
 	void doLoadSavePanel();
 	void restartGame();
@@ -248,7 +248,9 @@ private:
 	OSystem *_system;
 	bool _mouseClicked;
 	Common::KeyState _keyPressed;
+	Common::CustomEventType _action;
 	int _mouseWheel;
+	Common::Keymap *_shortcutsKeymap;
 
 	struct {
 		uint8 *controlPanel;
diff --git a/engines/sky/detection.cpp b/engines/sky/detection.cpp
index cb412a6..c652688 100644
--- a/engines/sky/detection.cpp
+++ b/engines/sky/detection.cpp
@@ -25,6 +25,9 @@
 
 #include "base/plugins.h"
 
+#include "backends/keymapper/action.h"
+#include "backends/keymapper/keymap.h"
+#include "backends/keymapper/standard-actions.h"
 #include "common/config-manager.h"
 #include "engines/advancedDetector.h"
 #include "engines/metaengine.h"
@@ -84,6 +87,7 @@ public:
 	const ExtraGuiOptions getExtraGuiOptions(const Common::String &target) const override;
 	PlainGameDescriptor findGame(const char *gameid) const override;
 	DetectedGames detectGames(const Common::FSList &fslist) const override;
+	Common::KeymapArray initKeymaps(const char *target) const override;
 
 	Common::Error createInstance(OSystem *syst, Engine **engine) const override;
 
@@ -201,6 +205,73 @@ DetectedGames SkyMetaEngine::detectGames(const Common::FSList &fslist) const {
 	return detectedGames;
 }
 
+Common::KeymapArray SkyMetaEngine::initKeymaps(const char *target) const {
+	using namespace Common;
+	using namespace Sky;
+
+	Keymap *mainKeymap = new Keymap(Keymap::kKeymapTypeGame, "sky-main", "Beneath a Steel Sky");
+
+	Action *act;
+
+	act = new Action("LCLK", _("Walk / Look / Talk"));
+	act->setLeftClickEvent();
+	act->addDefaultInputMapping("MOUSE_LEFT");
+	act->addDefaultInputMapping("JOY_A");
+	mainKeymap->addAction(act);
+
+	act = new Action("RCLK", _("Use"));
+	act->setRightClickEvent();
+	act->addDefaultInputMapping("MOUSE_RIGHT");
+	act->addDefaultInputMapping("JOY_B");
+	mainKeymap->addAction(act);
+
+	act = new Action("CONFIRM", _("Confirm"));
+	act->setCustomEngineActionEvent(kSkyActionConfirm);
+	act->addDefaultInputMapping("RETURN");
+	act->addDefaultInputMapping("KP_ENTER");
+	mainKeymap->addAction(act);
+
+	act = new Action(kStandardActionSkip, _("Skip / Close"));
+	act->setCustomEngineActionEvent(kSkyActionSkip);
+	act->addDefaultInputMapping("ESCAPE");
+	act->addDefaultInputMapping("JOY_Y");
+	mainKeymap->addAction(act);
+
+	Keymap *shortcutsKeymap = new Keymap(Keymap::kKeymapTypeGame, SkyEngine::shortcutsKeymapId, "Beneath a Steel Sky - Shortcuts");
+
+	act = new Action(kStandardActionOpenMainMenu, _("Open control panel"));
+	act->setCustomEngineActionEvent(kSkyActionOpenControlPanel);
+	act->addDefaultInputMapping("F5");
+	act->addDefaultInputMapping("JOY_X");
+	shortcutsKeymap->addAction(act);
+
+	act = new Action("SKPL", _("Skip line"));
+	act->setCustomEngineActionEvent(kSkyActionSkipLine);
+	act->addDefaultInputMapping("PERIOD");
+	shortcutsKeymap->addAction(act);
+
+	act = new Action(kStandardActionPause, _("Pause"));
+	act->setCustomEngineActionEvent(kSkyActionPause);
+	act->addDefaultInputMapping("p");
+	shortcutsKeymap->addAction(act);
+
+	act = new Action("FAST", _("Toggle fast mode"));
+	act->setCustomEngineActionEvent(kSkyActionToggleFastMode);
+	act->addDefaultInputMapping("C+f");
+	shortcutsKeymap->addAction(act);
+
+	act = new Action("RFAST", _("Toggle really fast mode"));
+	act->setCustomEngineActionEvent(kSkyActionToggleReallyFastMode);
+	act->addDefaultInputMapping("C+g");
+	shortcutsKeymap->addAction(act);
+
+	KeymapArray keymaps(2);
+	keymaps[0] = mainKeymap;
+	keymaps[1] = shortcutsKeymap;
+
+	return keymaps;
+}
+
 Common::Error SkyMetaEngine::createInstance(OSystem *syst, Engine **engine) const {
 	assert(engine);
 	*engine = new Sky::SkyEngine(syst);
diff --git a/engines/sky/intro.cpp b/engines/sky/intro.cpp
index 00b1e51..2b94f92 100644
--- a/engines/sky/intro.cpp
+++ b/engines/sky/intro.cpp
@@ -927,8 +927,8 @@ bool Intro::escDelay(uint32 msecs) {
 	int32 nDelay = 0;
 	do {
 		while (eventMan->pollEvent(event)) {
-			if (event.type == Common::EVENT_KEYDOWN) {
-				if (event.kbd.keycode == Common::KEYCODE_ESCAPE)
+			if (event.type == Common::EVENT_CUSTOM_ENGINE_ACTION_START) {
+				if (event.customType == kSkyActionSkip)
 					return false;
 			} else if (event.type == Common::EVENT_QUIT || event.type == Common::EVENT_RTL) {
 				return false;
diff --git a/engines/sky/mouse.cpp b/engines/sky/mouse.cpp
index de2d222..3f0dcb1 100644
--- a/engines/sky/mouse.cpp
+++ b/engines/sky/mouse.cpp
@@ -185,8 +185,8 @@ void Mouse::waitMouseNotPressed(int minDelay) {
 
 		while (eventMan->pollEvent(event)) {
 			switch (event.type) {
-			case Common::EVENT_KEYDOWN:
-				if (event.kbd.keycode == Common::KEYCODE_ESCAPE) {
+			case Common::EVENT_CUSTOM_ENGINE_ACTION_START:
+				if (event.customType == kSkyActionSkip) {
 					minDelay = 0;
 					mousePressed = false;
 				}
diff --git a/engines/sky/sky.cpp b/engines/sky/sky.cpp
index 7650802..af992eb 100644
--- a/engines/sky/sky.cpp
+++ b/engines/sky/sky.cpp
@@ -20,6 +20,8 @@
  *
  */
 
+#include "backends/keymapper/keymapper.h"
+
 #include "common/config-manager.h"
 #include "common/system.h"
 #include "common/textconsole.h"
@@ -70,6 +72,8 @@ void *SkyEngine::_itemList[300];
 
 SystemVars SkyEngine::_systemVars = {0, 0, 0, 0, 4316, 0, 0, false, false };
 
+const char *SkyEngine::shortcutsKeymapId = "sky-shortcuts";
+
 SkyEngine::SkyEngine(OSystem *syst)
 	: Engine(syst), _fastMode(0), _debugger(0) {
 }
@@ -113,35 +117,34 @@ void SkyEngine::initVirgin() {
 }
 
 void SkyEngine::handleKey() {
-	if (_keyPressed.keycode && _systemVars.paused) {
+	if ((_action != kSkyActionNone || _keyPressed.keycode) && _systemVars.paused) {
 		_skySound->fnUnPauseFx();
 		_systemVars.paused = false;
 		_skyScreen->setPaletteEndian((uint8 *)_skyCompact->fetchCpt(SkyEngine::_systemVars.currentPalette));
-	} else if (_keyPressed.hasFlags(Common::KBD_CTRL)) {
-		if (_keyPressed.keycode == Common::KEYCODE_f)
+	} else {
+		switch (_action) {
+		case kSkyActionToggleFastMode:
 			_fastMode ^= 1;
-		else if (_keyPressed.keycode == Common::KEYCODE_g)
+			break;
+
+		case kSkyActionToggleReallyFastMode:
 			_fastMode ^= 2;
-	} else if (_keyPressed.keycode) {
-		switch (_keyPressed.keycode) {
-		case Common::KEYCODE_BACKQUOTE:
-		case Common::KEYCODE_HASH:
-			_debugger->attach();
 			break;
-		case Common::KEYCODE_F5:
+
+		case kSkyActionOpenControlPanel:
 			_skyControl->doControlPanel();
 			break;
 
-		case Common::KEYCODE_ESCAPE:
+		case kSkyActionSkip:
 			if (!_systemVars.pastIntro)
 				_skyControl->restartGame();
 			break;
 
-		case Common::KEYCODE_PERIOD:
+		case kSkyActionSkipLine:
 			_skyMouse->logicClick();
 			break;
 
-		case Common::KEYCODE_p:
+		case kSkyActionPause:
 			_skyScreen->halvePalette();
 			_skySound->fnPauseFx();
 			_systemVars.paused = true;
@@ -151,11 +154,13 @@ void SkyEngine::handleKey() {
 			break;
 		}
 	}
+
+	_action = kSkyActionNone;
 	_keyPressed.reset();
 }
 
 Common::Error SkyEngine::go() {
-	_keyPressed.reset();
+	_action = kSkyActionNone;
 
 	uint16 result = 0;
 	if (ConfMan.hasKey("save_slot")) {
@@ -285,7 +290,11 @@ Common::Error SkyEngine::init() {
 	_skyLogic = new Logic(_skyCompact, _skyScreen, _skyDisk, _skyText, _skyMusic, _skyMouse, _skySound);
 	_skyMouse->useLogicInstance(_skyLogic);
 
-	_skyControl = new Control(_saveFileMan, _skyScreen, _skyDisk, _skyMouse, _skyText, _skyMusic, _skyLogic, _skySound, _skyCompact, _system);
+	Common::Keymapper *keymapper = _system->getEventManager()->getKeymapper();
+	Common::Keymap *shortcutsKeymap = keymapper->getKeymap(shortcutsKeymapId);
+	assert(shortcutsKeymap);
+
+	_skyControl = new Control(_saveFileMan, _skyScreen, _skyDisk, _skyMouse, _skyText, _skyMusic, _skyLogic, _skySound, _skyCompact, _system, shortcutsKeymap);
 	_skyLogic->useControlInstance(_skyControl);
 
 	switch (Common::parseLanguage(ConfMan.get("language"))) {
@@ -374,6 +383,7 @@ void SkyEngine::delay(int32 amount) {
 	Common::Event event;
 
 	uint32 start = _system->getMillis();
+	_action = kSkyActionNone;
 	_keyPressed.reset();
 
 	if (amount < 0)
@@ -382,6 +392,9 @@ void SkyEngine::delay(int32 amount) {
 	do {
 		while (_eventMan->pollEvent(event)) {
 			switch (event.type) {
+			case Common::EVENT_CUSTOM_ENGINE_ACTION_START:
+				_action = (SkyAction)event.customType;
+				break;
 			case Common::EVENT_KEYDOWN:
 				_keyPressed = event.kbd;
 				break;
diff --git a/engines/sky/sky.h b/engines/sky/sky.h
index 2e505b4..ecebcc6 100644
--- a/engines/sky/sky.h
+++ b/engines/sky/sky.h
@@ -61,8 +61,20 @@ class MusicBase;
 class Debugger;
 class SkyCompact;
 
+enum SkyAction {
+	kSkyActionNone,
+	kSkyActionToggleFastMode,
+	kSkyActionToggleReallyFastMode,
+	kSkyActionOpenControlPanel,
+	kSkyActionConfirm,
+	kSkyActionSkip,
+	kSkyActionSkipLine,
+	kSkyActionPause
+};
+
 class SkyEngine : public Engine {
 protected:
+	SkyAction _action;
 	Common::KeyState _keyPressed;
 
 	Sound *_skySound;
@@ -99,6 +111,8 @@ public:
 
 	static SystemVars _systemVars;
 
+	static const char *shortcutsKeymapId;
+
 protected:
 	// Engine APIs
 	Common::Error init();




More information about the Scummvm-git-logs mailing list