diff options
author | Martin Kiewitz | 2017-02-11 10:35:10 +0100 |
---|---|---|
committer | Martin Kiewitz | 2017-02-11 10:35:10 +0100 |
commit | e64e3888163b6f5cce0a8e298eb4379b66426bff (patch) | |
tree | 14c639e95aff91b5708ee30e861eb0c00b30ba21 /engines | |
parent | 8420310989cd52627c95ee6966bbe46f99626239 (diff) | |
download | scummvm-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')
-rw-r--r-- | engines/agi/agi.cpp | 2 | ||||
-rw-r--r-- | engines/agi/agi.h | 2 | ||||
-rw-r--r-- | engines/agi/keyboard.cpp | 35 |
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; |