[Scummvm-git-logs] scummvm master -> 89b95438155be205a7dc688ee8e928dd25fe9ff7

neuromancer noreply at scummvm.org
Thu Jan 4 10:13:43 UTC 2024


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

Summary:
ab3354dfb6 FREESCAPE: improved keymap handling
89b9543815 FREESCAPE: wrap event manager to make sure key events are properly handled in different platforms


Commit: ab3354dfb66f6e4aface6ce1e900006343183924
    https://github.com/scummvm/scummvm/commit/ab3354dfb66f6e4aface6ce1e900006343183924
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2024-01-04T11:12:04+01:00

Commit Message:
FREESCAPE: improved keymap handling

Changed paths:
    engines/freescape/movement.cpp


diff --git a/engines/freescape/movement.cpp b/engines/freescape/movement.cpp
index feae7c1d984..73c5fee662a 100644
--- a/engines/freescape/movement.cpp
+++ b/engines/freescape/movement.cpp
@@ -36,24 +36,28 @@ void FreescapeEngine::initKeymaps(Common::Keymap *engineKeyMap, const char *targ
 	act->setKeyEvent(Common::KEYCODE_UP);
 	act->allowKbdRepeats();
 	act->addDefaultInputMapping("JOY_UP");
+	act->addDefaultInputMapping("o");
 	engineKeyMap->addAction(act);
 
 	act = new Common::Action(Common::kStandardActionMoveDown, _("Down"));
 	act->setKeyEvent(Common::KEYCODE_DOWN);
 	act->allowKbdRepeats();
 	act->addDefaultInputMapping("JOY_DOWN");
+	act->addDefaultInputMapping("k");
 	engineKeyMap->addAction(act);
 
 	act = new Common::Action(Common::kStandardActionMoveLeft, _("Strafe Left"));
 	act->setKeyEvent(Common::KEYCODE_LEFT);
 	act->allowKbdRepeats();
 	act->addDefaultInputMapping("JOY_LEFT");
+	act->addDefaultInputMapping("q");
 	engineKeyMap->addAction(act);
 
 	act = new Common::Action(Common::kStandardActionMoveRight, _("Strafe Right"));
 	act->setKeyEvent(Common::KEYCODE_RIGHT);
 	act->allowKbdRepeats();
 	act->addDefaultInputMapping("JOY_RIGHT");
+	act->addDefaultInputMapping("w");
 	engineKeyMap->addAction(act);
 
 	act = new Common::Action("SHOOT", _("Shoot"));
@@ -61,16 +65,19 @@ void FreescapeEngine::initKeymaps(Common::Keymap *engineKeyMap, const char *targ
 	act->allowKbdRepeats();
 	act->setLeftClickEvent();
 	act->addDefaultInputMapping("JOY_A");
+	act->addDefaultInputMapping("0");
 	engineKeyMap->addAction(act);
 
 	act = new Common::Action("RISE", _("Rise/Fly up"));
 	act->setKeyEvent(Common::KeyState(Common::KEYCODE_r, 'r'));
 	act->addDefaultInputMapping("JOY_B");
+	act->addDefaultInputMapping("r");
 	engineKeyMap->addAction(act);
 
 	act = new Common::Action("LOWER", _("Lower/Fly down"));
 	act->setKeyEvent(Common::KeyState(Common::KEYCODE_f, 'f'));
 	act->addDefaultInputMapping("JOY_Y");
+	act->addDefaultInputMapping("f");
 	engineKeyMap->addAction(act);
 
 	act = new Common::Action("SWITCH", _("Change mode"));


Commit: 89b95438155be205a7dc688ee8e928dd25fe9ff7
    https://github.com/scummvm/scummvm/commit/89b95438155be205a7dc688ee8e928dd25fe9ff7
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2024-01-04T11:12:04+01:00

Commit Message:
FREESCAPE: wrap event manager to make sure key events are properly handled in different platforms

Changed paths:
  A engines/freescape/events.cpp
    engines/freescape/freescape.cpp
    engines/freescape/freescape.h
    engines/freescape/module.mk
    engines/freescape/movement.cpp


diff --git a/engines/freescape/events.cpp b/engines/freescape/events.cpp
new file mode 100644
index 00000000000..dd74d28c9a9
--- /dev/null
+++ b/engines/freescape/events.cpp
@@ -0,0 +1,85 @@
+/* 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 "freescape/freescape.h"
+
+namespace Freescape {
+
+EventManagerWrapper::EventManagerWrapper(Common::EventManager *delegate) :
+		_delegate(delegate),
+		_keyRepeatTime(0) {
+	assert(delegate);
+}
+
+bool EventManagerWrapper::pollEvent(Common::Event &event) {
+	uint32 time = g_system->getMillis(true);
+	bool gotEvent = _delegate->pollEvent(event);
+
+	if (gotEvent) {
+		switch (event.type) {
+		case Common::EVENT_KEYDOWN:
+			// init continuous event stream
+			_currentKeyDown = event.kbd;
+			_keyRepeatTime = time + kKeyRepeatInitialDelay;
+			break;
+
+		case Common::EVENT_KEYUP:
+			if (event.kbd.keycode == _currentKeyDown.keycode) {
+				// Only stop firing events if it's the current key
+				_currentKeyDown.keycode = Common::KEYCODE_INVALID;
+			}
+			break;
+
+		default:
+			break;
+		}
+
+		return true;
+	} else {
+		// Check if event should be sent again (keydown)
+		if (_currentKeyDown.keycode != Common::KEYCODE_INVALID && _keyRepeatTime <= time) {
+			// fire event
+			event.type = Common::EVENT_KEYDOWN;
+			event.kbdRepeat = true;
+			event.kbd = _currentKeyDown;
+			_keyRepeatTime = time + kKeyRepeatSustainDelay;
+
+			return true;
+		}
+
+		return false;
+	}
+}
+
+void EventManagerWrapper::purgeKeyboardEvents() {
+	_delegate->purgeKeyboardEvents();
+}
+
+void EventManagerWrapper::purgeMouseEvents() {
+	_delegate->purgeMouseEvents();
+}
+
+void EventManagerWrapper::pushEvent(Common::Event &event) {
+	_delegate->pushEvent(event);
+}
+
+} // namespace Freescape
diff --git a/engines/freescape/freescape.cpp b/engines/freescape/freescape.cpp
index 863918b5517..7c3de9833b2 100644
--- a/engines/freescape/freescape.cpp
+++ b/engines/freescape/freescape.cpp
@@ -163,6 +163,7 @@ FreescapeEngine::FreescapeEngine(OSystem *syst, const ADGameDescription *gd)
 	_maxShield = 63;
 	_maxEnergy = 63;
 	_gameStateBits = 0;
+	_eventManager = new EventManagerWrapper(g_system->getEventManager());
 
 	g_freescape = this;
 }
@@ -346,8 +347,8 @@ void FreescapeEngine::resetInput() {
 	_shootMode = false;
 	centerCrossair();
 	g_system->warpMouse(_crossairPosition.x, _crossairPosition.y);
-	g_system->getEventManager()->purgeMouseEvents();
-	g_system->getEventManager()->purgeKeyboardEvents();
+	_eventManager->purgeMouseEvents();
+	_eventManager->purgeKeyboardEvents();
 	rotate(0, 0);
 }
 
@@ -360,13 +361,13 @@ void FreescapeEngine::processInput() {
 	Common::Point mousePos;
 
 	if (_demoMode && !_demoEvents.empty()) {
-		g_system->getEventManager()->purgeMouseEvents();
-		g_system->getEventManager()->purgeKeyboardEvents();
-		g_system->getEventManager()->pushEvent(_demoEvents.front());
+		_eventManager->purgeMouseEvents();
+		_eventManager->purgeKeyboardEvents();
+		_eventManager->pushEvent(_demoEvents.front());
 		_demoEvents.remove_at(0);
 	}
 
-	while (g_system->getEventManager()->pollEvent(event)) {
+	while (_eventManager->pollEvent(event)) {
 		if (_demoMode) {
 			if (event.type == Common::EVENT_SCREEN_CHANGED)
 				; // Allow event
@@ -464,8 +465,8 @@ void FreescapeEngine::processInput() {
 				} else {
 					g_system->lockMouse(false);
 					g_system->warpMouse(_crossairPosition.x, _crossairPosition.y);
-					g_system->getEventManager()->purgeMouseEvents();
-					g_system->getEventManager()->purgeKeyboardEvents();
+					_eventManager->purgeMouseEvents();
+					_eventManager->purgeKeyboardEvents();
 				}
 				break;
 			case Common::KEYCODE_i:
@@ -509,7 +510,7 @@ void FreescapeEngine::processInput() {
 					event.relMouse.y = -event.relMouse.y;
 
 				g_system->warpMouse(mousePos.x, mousePos.y);
-				g_system->getEventManager()->purgeMouseEvents();
+				_eventManager->purgeMouseEvents();
 			}
 
 			rotate(event.relMouse.x * _mouseSensitivity, event.relMouse.y * _mouseSensitivity);
diff --git a/engines/freescape/freescape.h b/engines/freescape/freescape.h
index db1f5b8d71b..511a62178ba 100644
--- a/engines/freescape/freescape.h
+++ b/engines/freescape/freescape.h
@@ -83,6 +83,28 @@ public:
 	bool endOfStream() const override { return !isPlaying(); }
 };
 
+class EventManagerWrapper {
+public:
+	EventManagerWrapper(Common::EventManager *delegate);
+	// EventManager API
+	bool pollEvent(Common::Event &event);
+	void purgeKeyboardEvents();
+	void purgeMouseEvents();
+	void pushEvent(Common::Event &event);
+
+private:
+	// for continuous events (keyDown)
+	enum {
+		kKeyRepeatInitialDelay = 400,
+		kKeyRepeatSustainDelay = 100
+	};
+
+	Common::EventManager *_delegate;
+
+	Common::KeyState _currentKeyDown;
+	uint32 _keyRepeatTime;
+};
+
 class FreescapeEngine : public Engine {
 
 public:
@@ -237,6 +259,7 @@ public:
 	bool _noClipMode;
 	bool _invertY;
 	virtual void initKeymaps(Common::Keymap *engineKeyMap, const char *target);
+	EventManagerWrapper *_eventManager;
 	void processInput();
 	void resetInput();
 	void generateDemoInput();
diff --git a/engines/freescape/module.mk b/engines/freescape/module.mk
index a074d330ed3..a2d6179a7c9 100644
--- a/engines/freescape/module.mk
+++ b/engines/freescape/module.mk
@@ -3,6 +3,7 @@ MODULE := engines/freescape
 MODULE_OBJS := \
 	area.o \
 	assets.o \
+	events.o \
 	demo.o \
 	freescape.o \
 	games/castle.o \
diff --git a/engines/freescape/movement.cpp b/engines/freescape/movement.cpp
index 73c5fee662a..c875bce94b3 100644
--- a/engines/freescape/movement.cpp
+++ b/engines/freescape/movement.cpp
@@ -34,38 +34,32 @@ void FreescapeEngine::initKeymaps(Common::Keymap *engineKeyMap, const char *targ
 
 	act = new Common::Action(Common::kStandardActionMoveUp, _("Up"));
 	act->setKeyEvent(Common::KEYCODE_UP);
-	act->allowKbdRepeats();
 	act->addDefaultInputMapping("JOY_UP");
 	act->addDefaultInputMapping("o");
 	engineKeyMap->addAction(act);
 
 	act = new Common::Action(Common::kStandardActionMoveDown, _("Down"));
 	act->setKeyEvent(Common::KEYCODE_DOWN);
-	act->allowKbdRepeats();
 	act->addDefaultInputMapping("JOY_DOWN");
 	act->addDefaultInputMapping("k");
 	engineKeyMap->addAction(act);
 
 	act = new Common::Action(Common::kStandardActionMoveLeft, _("Strafe Left"));
 	act->setKeyEvent(Common::KEYCODE_LEFT);
-	act->allowKbdRepeats();
 	act->addDefaultInputMapping("JOY_LEFT");
 	act->addDefaultInputMapping("q");
 	engineKeyMap->addAction(act);
 
 	act = new Common::Action(Common::kStandardActionMoveRight, _("Strafe Right"));
 	act->setKeyEvent(Common::KEYCODE_RIGHT);
-	act->allowKbdRepeats();
 	act->addDefaultInputMapping("JOY_RIGHT");
 	act->addDefaultInputMapping("w");
 	engineKeyMap->addAction(act);
 
 	act = new Common::Action("SHOOT", _("Shoot"));
-	act->setKeyEvent(Common::KeyState(Common::KEYCODE_0, '0'));
-	act->allowKbdRepeats();
-	act->setLeftClickEvent();
+	act->setKeyEvent(Common::KeyState(Common::KEYCODE_KP5, '5'));
 	act->addDefaultInputMapping("JOY_A");
-	act->addDefaultInputMapping("0");
+	act->addDefaultInputMapping("5");
 	engineKeyMap->addAction(act);
 
 	act = new Common::Action("RISE", _("Rise/Fly up"));




More information about the Scummvm-git-logs mailing list