[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