aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
Diffstat (limited to 'engines')
-rw-r--r--engines/agi/agi.cpp2
-rw-r--r--engines/agi/agi.h2
-rw-r--r--engines/agi/keyboard.cpp35
3 files changed, 36 insertions, 3 deletions
diff --git a/engines/agi/agi.cpp b/engines/agi/agi.cpp
index 60c8d1f3ef..b293a8e9e5 100644
--- a/engines/agi/agi.cpp
+++ b/engines/agi/agi.cpp
@@ -173,6 +173,7 @@ int AgiEngine::agiInit() {
#endif
_keyHoldMode = false;
+ _keyHoldModeLastKey = Common::KEYCODE_INVALID;
_game.mouseFence.setWidth(0); // Reset
@@ -423,6 +424,7 @@ AgiEngine::AgiEngine(OSystem *syst, const AGIGameDescription *gameDesc) : AgiBas
_inventory = nullptr;
_keyHoldMode = false;
+ _keyHoldModeLastKey = Common::KEYCODE_INVALID;
_artificialDelayCurrentRoom = 0;
_artificialDelayCurrentPicture = 0;
diff --git a/engines/agi/agi.h b/engines/agi/agi.h
index b8c30e9d5c..2b62f9757a 100644
--- a/engines/agi/agi.h
+++ b/engines/agi/agi.h
@@ -27,6 +27,7 @@
#include "common/error.h"
#include "common/util.h"
#include "common/file.h"
+#include "common/keyboard.h"
#include "common/rect.h"
#include "common/rendermode.h"
#include "common/stack.h"
@@ -936,6 +937,7 @@ public:
int getDirection(int16 objX, int16 objY, int16 destX, int16 destY, int16 stepSize);
bool _keyHoldMode;
+ Common::KeyCode _keyHoldModeLastKey;
// Keyboard
int doPollKeyboard();
diff --git a/engines/agi/keyboard.cpp b/engines/agi/keyboard.cpp
index 7ed67949b5..8fb49fdf02 100644
--- a/engines/agi/keyboard.cpp
+++ b/engines/agi/keyboard.cpp
@@ -247,6 +247,29 @@ void AgiEngine::processScummVMEvents() {
default:
break;
}
+
+ switch (event.kbd.keycode) {
+ case Common::KEYCODE_LEFT:
+ case Common::KEYCODE_RIGHT:
+ case Common::KEYCODE_UP:
+ case Common::KEYCODE_DOWN:
+ case Common::KEYCODE_HOME:
+ case Common::KEYCODE_END:
+ case Common::KEYCODE_PAGEUP:
+ case Common::KEYCODE_PAGEDOWN:
+ case Common::KEYCODE_KP4:
+ case Common::KEYCODE_KP6:
+ case Common::KEYCODE_KP8:
+ case Common::KEYCODE_KP2:
+ case Common::KEYCODE_KP9:
+ case Common::KEYCODE_KP3:
+ case Common::KEYCODE_KP7:
+ case Common::KEYCODE_KP1:
+ _keyHoldModeLastKey = event.kbd.keycode;
+ break;
+ default:
+ break;
+ }
}
if (key)
keyEnqueue(key);
@@ -255,8 +278,12 @@ void AgiEngine::processScummVMEvents() {
case Common::EVENT_KEYUP:
if (_keyHoldMode) {
// Original AGI actually created direction events in here
- // We don't do that, that's why we create a stationary event instead, which will
- // result in a direction change to 0 in handleController().
+ // but only in case the last pressed cursor key was released, in other cases it did nothing.
+ // So when you pressed and held down left and then pressed up, and then released left,
+ // direction wouldn't be changed at all.
+ //
+ // We don't create direction events in here, that's why we create a stationary event instead,
+ // which will result in a direction change to 0 in handleController().
switch (event.kbd.keycode) {
case Common::KEYCODE_LEFT:
case Common::KEYCODE_RIGHT:
@@ -274,7 +301,9 @@ void AgiEngine::processScummVMEvents() {
case Common::KEYCODE_KP3:
case Common::KEYCODE_KP7:
case Common::KEYCODE_KP1:
- keyEnqueue(AGI_KEY_STATIONARY);
+ if (_keyHoldModeLastKey == event.kbd.keycode) {
+ keyEnqueue(AGI_KEY_STATIONARY);
+ }
break;
default:
break;