aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorFilippos Karapetis2011-09-26 00:56:10 +0300
committerFilippos Karapetis2011-09-26 00:56:10 +0300
commit81fdf2c10306fa8d449476f6c77afb8299b93f4d (patch)
treee2d2eaee87f943740ad32c6431b0c7ec18fd25c1 /engines
parentbd6a05bdd4e71548aadc2c846b6ab16d4d486a2e (diff)
downloadscummvm-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.cpp6
-rw-r--r--engines/agi/agi.h1
-rw-r--r--engines/agi/cycle.cpp1
-rw-r--r--engines/agi/keyboard.cpp2
-rw-r--r--engines/agi/op_cmd.cpp23
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;
}