diff options
author | Filippos Karapetis | 2011-09-26 00:56:10 +0300 |
---|---|---|
committer | Filippos Karapetis | 2011-09-26 00:56:10 +0300 |
commit | 81fdf2c10306fa8d449476f6c77afb8299b93f4d (patch) | |
tree | e2d2eaee87f943740ad32c6431b0c7ec18fd25c1 /engines | |
parent | bd6a05bdd4e71548aadc2c846b6ab16d4d486a2e (diff) | |
download | scummvm-rg350-81fdf2c10306fa8d449476f6c77afb8299b93f4d.tar.gz scummvm-rg350-81fdf2c10306fa8d449476f6c77afb8299b93f4d.tar.bz2 scummvm-rg350-81fdf2c10306fa8d449476f6c77afb8299b93f4d.zip |
AGI: Fixed bug #3074570 - "AGI LSL1: TAB stops working after restart"
Applied eriktorbjorn's patch from that bug tracker item (slightly
modified), which is what NAGI does, and which fixes restarting in LSL1
and PQ1 (bug #2823762), and other AGI games that do not reset the
controller keys when restarting.
Diffstat (limited to 'engines')
-rw-r--r-- | engines/agi/agi.cpp | 6 | ||||
-rw-r--r-- | engines/agi/agi.h | 1 | ||||
-rw-r--r-- | engines/agi/cycle.cpp | 1 | ||||
-rw-r--r-- | engines/agi/keyboard.cpp | 2 | ||||
-rw-r--r-- | engines/agi/op_cmd.cpp | 23 |
5 files changed, 16 insertions, 17 deletions
diff --git a/engines/agi/agi.cpp b/engines/agi/agi.cpp index 3a79f02cb6..49b43356ea 100644 --- a/engines/agi/agi.cpp +++ b/engines/agi/agi.cpp @@ -578,11 +578,7 @@ AgiEngine::AgiEngine(OSystem *syst, const AGIGameDescription *gameDesc) : AgiBas _predictiveDictLineCount = 0; _firstSlot = 0; - // NOTE: On game reload the keys do not get set again, - // thus it is incorrect to reset it in agiInit(). Fixes bug #2823762 - _game.lastController = 0; - for (int i = 0; i < MAX_DIRS; i++) - _game.controllerOccured[i] = false; + resetControllers(); setupOpcodes(); _game._curLogic = NULL; diff --git a/engines/agi/agi.h b/engines/agi/agi.h index 189eb7ddff..4037faeb4a 100644 --- a/engines/agi/agi.h +++ b/engines/agi/agi.h @@ -614,7 +614,6 @@ struct AgiGame { bool controllerOccured[MAX_DIRS]; /**< keyboard keypress events */ AgiController controllers[MAX_CONTROLLERS]; - int lastController; char strings[MAX_STRINGS + 1][MAX_STRINGLEN]; /**< strings */ diff --git a/engines/agi/cycle.cpp b/engines/agi/cycle.cpp index e6f122f9f6..9cbab1f3c4 100644 --- a/engines/agi/cycle.cpp +++ b/engines/agi/cycle.cpp @@ -384,7 +384,6 @@ int AgiEngine::runGame() { if (_restartGame) { setflag(fRestartGame, true); - _game.lastController = 0; setvar(vTimeDelay, 2); // "normal" speed _restartGame = false; } diff --git a/engines/agi/keyboard.cpp b/engines/agi/keyboard.cpp index d899a6e202..4ac08492ae 100644 --- a/engines/agi/keyboard.cpp +++ b/engines/agi/keyboard.cpp @@ -114,7 +114,7 @@ int AgiEngine::handleController(int key) { debugC(3, kDebugLevelInput, "key = %04x", key); - for (i = 0; i < _game.lastController; i++) { + for (i = 0; i < MAX_CONTROLLERS; i++) { if (_game.controllers[i].keycode == key) { debugC(3, kDebugLevelInput, "event %d: key press", _game.controllers[i].controller); _game.controllerOccured[_game.controllers[i].controller] = true; diff --git a/engines/agi/op_cmd.cpp b/engines/agi/op_cmd.cpp index d1db9564b3..15f7ac6163 100644 --- a/engines/agi/op_cmd.cpp +++ b/engines/agi/op_cmd.cpp @@ -1516,20 +1516,25 @@ void cmdSetCursorChar(AgiGame *state, uint8 *p) { } void cmdSetKey(AgiGame *state, uint8 *p) { - int key; + int key = 256 * p1 + p0; + int slot = -1; - if (state->lastController >= MAX_CONTROLLERS) { + for (int i = 0; i < MAX_CONTROLLERS; i++) { + if (slot == -1 && !state->controllers[i].keycode) + slot = i; + + if (state->controllers[i].keycode == key && state->controllers[i].controller == p2) + return; + } + + if (slot == -1) { warning("Number of set.keys exceeded %d", MAX_CONTROLLERS); return; } - debugC(4, kDebugLevelScripts, "%d %d %d", p0, p1, p2); - - key = 256 * p1 + p0; - - state->controllers[state->lastController].keycode = key; - state->controllers[state->lastController].controller = p2; - state->lastController++; + debugC(4, kDebugLevelScripts, "cmdSetKey: %d %d %d", p0, p1, p2); + state->controllers[slot].keycode = key; + state->controllers[slot].controller = p2; state->controllerOccured[p2] = false; } |