aboutsummaryrefslogtreecommitdiff
path: root/engines/agi
diff options
context:
space:
mode:
authorMartin Kiewitz2017-02-11 10:35:10 +0100
committerMartin Kiewitz2017-02-11 10:35:10 +0100
commite64e3888163b6f5cce0a8e298eb4379b66426bff (patch)
tree14c639e95aff91b5708ee30e861eb0c00b30ba21 /engines/agi
parent8420310989cd52627c95ee6966bbe46f99626239 (diff)
downloadscummvm-rg350-e64e3888163b6f5cce0a8e298eb4379b66426bff.tar.gz
scummvm-rg350-e64e3888163b6f5cce0a8e298eb4379b66426bff.tar.bz2
scummvm-rg350-e64e3888163b6f5cce0a8e298eb4379b66426bff.zip
AGI: Hold-key-mode fix
Original AGI only created a stationary event, when the last pressed direction key was released. We do that now as well. Makes cursor in MH1 behave properly. Thanks to waltervn for pointing this out.
Diffstat (limited to 'engines/agi')
-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;