aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorBastien Bouclet2010-11-29 20:57:27 +0000
committerBastien Bouclet2010-11-29 20:57:27 +0000
commit359cece3b745e668316c4b36f4aa851d17a0465d (patch)
treecaa5279488a83f58cc843993e6906d0f22d81b7b /engines
parentd3289529eb329fe3d97ae61bca52e279655121fa (diff)
downloadscummvm-rg350-359cece3b745e668316c4b36f4aa851d17a0465d.tar.gz
scummvm-rg350-359cece3b745e668316c4b36f4aa851d17a0465d.tar.bz2
scummvm-rg350-359cece3b745e668316c4b36f4aa851d17a0465d.zip
MOHAWK: Implement opcode 3 "take / drop page", and the corresponding getters and setters for selenitic
svn-id: r54623
Diffstat (limited to 'engines')
-rw-r--r--engines/mohawk/myst_scripts.cpp36
-rw-r--r--engines/mohawk/myst_scripts.h2
-rw-r--r--engines/mohawk/myst_scripts_myst.cpp2
-rw-r--r--engines/mohawk/myst_scripts_selenitic.cpp28
4 files changed, 49 insertions, 19 deletions
diff --git a/engines/mohawk/myst_scripts.cpp b/engines/mohawk/myst_scripts.cpp
index d20b7e9dd7..e4af5a325f 100644
--- a/engines/mohawk/myst_scripts.cpp
+++ b/engines/mohawk/myst_scripts.cpp
@@ -27,6 +27,7 @@
#include "mohawk/myst.h"
#include "mohawk/graphics.h"
#include "mohawk/myst_areas.h"
+#include "mohawk/myst_saveload.h"
#include "mohawk/myst_scripts.h"
#include "mohawk/sound.h"
#include "mohawk/video.h"
@@ -93,7 +94,7 @@ void MystScriptParser::setupOpcodes() {
OPCODE(0, o_0_toggleVar),
OPCODE(1, o_1_setVar),
OPCODE(2, o_2_changeCardSwitch),
- OPCODE(3, takePage),
+ OPCODE(3, o_3_takePage),
OPCODE(4, o_4_redrawCard),
// Opcode 5 Not Present
OPCODE(6, o_6_goToDest),
@@ -284,26 +285,29 @@ void MystScriptParser::o_2_changeCardSwitch(uint16 op, uint16 var, uint16 argc,
warning("Missing invokingResource in altDest call");
}
-void MystScriptParser::takePage(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- if (argc == 1) {
- uint16 cursorId = argv[0];
+void MystScriptParser::o_3_takePage(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
+ uint16 *game_globals = _vm->_saveLoad->_v->game_globals;
- debugC(kDebugScript, "Opcode %d: takePage Var %d CursorId %d", op, var, cursorId);
+ uint16 cursorId = argv[0];
+ uint16 oldPage = game_globals[2];
- if (getVar(var)) {
- _vm->setMainCursor(cursorId);
+ debugC(kDebugScript, "Opcode %d: takePage Var %d CursorId %d", op, var, cursorId);
- setVarValue(var, 0);
+ // Take / drop page
+ toggleVar(var);
- // Return pages that are already held
- if (var == 102)
- setVarValue(103, 1);
+ if (oldPage != game_globals[2]) {
+ _vm->_gfx->hideCursor();
+ _vm->redrawArea(var);
- if (var == 103)
- setVarValue(102, 1);
- }
- } else
- unknown(op, var, argc, argv);
+ // Set new cursor
+ if (game_globals[2])
+ _vm->setMainCursor(cursorId);
+ else
+ _vm->setMainCursor(kDefaultMystCursor);
+
+ _vm->_gfx->showCursor();
+ }
}
void MystScriptParser::o_4_redrawCard(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
diff --git a/engines/mohawk/myst_scripts.h b/engines/mohawk/myst_scripts.h
index ce93c8fd4e..124c626d34 100644
--- a/engines/mohawk/myst_scripts.h
+++ b/engines/mohawk/myst_scripts.h
@@ -81,7 +81,7 @@ public:
DECLARE_OPCODE(o_0_toggleVar);
DECLARE_OPCODE(o_1_setVar);
DECLARE_OPCODE(o_2_changeCardSwitch);
- DECLARE_OPCODE(takePage);
+ DECLARE_OPCODE(o_3_takePage);
DECLARE_OPCODE(o_4_redrawCard);
DECLARE_OPCODE(o_6_goToDest);
DECLARE_OPCODE(o_9_triggerMovie);
diff --git a/engines/mohawk/myst_scripts_myst.cpp b/engines/mohawk/myst_scripts_myst.cpp
index 6ea2e888d8..3ba03718b3 100644
--- a/engines/mohawk/myst_scripts_myst.cpp
+++ b/engines/mohawk/myst_scripts_myst.cpp
@@ -56,7 +56,7 @@ void MystScriptParser_Myst::setupOpcodes() {
OPCODE(0, o_0_toggleVar),
OPCODE(1, o_1_setVar),
OPCODE(2, o_2_changeCardSwitch),
- OPCODE(3, takePage),
+ OPCODE(3, o_3_takePage),
OPCODE(4, o_4_redrawCard),
// TODO: Opcode 5 Not Present
OPCODE(6, o_6_goToDest),
diff --git a/engines/mohawk/myst_scripts_selenitic.cpp b/engines/mohawk/myst_scripts_selenitic.cpp
index be541f67a5..eaa5eb22dd 100644
--- a/engines/mohawk/myst_scripts_selenitic.cpp
+++ b/engines/mohawk/myst_scripts_selenitic.cpp
@@ -56,7 +56,7 @@ void MystScriptParser_Selenitic::setupOpcodes() {
OPCODE(0, o_0_toggleVar),
OPCODE(1, o_1_setVar),
OPCODE(2, o_2_changeCardSwitch),
- OPCODE(3, takePage),
+ OPCODE(3, o_3_takePage),
OPCODE(4, o_4_redrawCard),
// TODO: Opcode 5 Not Present
OPCODE(6, o_6_goToDest),
@@ -147,6 +147,7 @@ void MystScriptParser_Selenitic::runPersistentOpcodes() {
}
uint16 MystScriptParser_Selenitic::getVar(uint16 var) {
+ uint16 *game_globals = _vm->_saveLoad->_v->game_globals;
uint16 *selenitic_vars = _vm->_saveLoad->_v->selenitic_vars;
switch(var) {
@@ -197,12 +198,17 @@ uint16 MystScriptParser_Selenitic::getVar(uint16 var) {
return 0;
case 30:
return _maze_runner_door_opened;
+ case 102: // Red page
+ return !(game_globals[6] & 2) && (game_globals[2] != 8);
+ case 103: // Blue page
+ return !(game_globals[7] & 2) && (game_globals[2] != 2);
default:
return MystScriptParser::getVar(var);
}
}
void MystScriptParser_Selenitic::toggleVar(uint16 var) {
+ uint16 *game_globals = _vm->_saveLoad->_v->game_globals;
uint16 *selenitic_vars = _vm->_saveLoad->_v->selenitic_vars;
switch(var) {
@@ -227,6 +233,26 @@ void MystScriptParser_Selenitic::toggleVar(uint16 var) {
case 6: // Tunnel lights
selenitic_vars[6] = (selenitic_vars[6] + 1) % 2;
break;
+ case 102: // Red page
+ if (!(game_globals[6] & 2)) {
+ if (game_globals[2] == 8)
+ game_globals[2] = 0;
+ else {
+ //TODO: Cursor animation
+ game_globals[2] = 8;
+ }
+ }
+ break;
+ case 103: // Blue page
+ if (!(game_globals[7] & 2)) {
+ if (game_globals[2] == 2)
+ game_globals[2] = 0;
+ else {
+ //TODO: Cursor animation
+ game_globals[2] = 2;
+ }
+ }
+ break;
default:
MystScriptParser::toggleVar(var);
break;