aboutsummaryrefslogtreecommitdiff
path: root/engines/mohawk/myst_stacks/stoneship.cpp
diff options
context:
space:
mode:
authorBastien Bouclet2011-02-12 11:03:27 +0000
committerBastien Bouclet2011-02-12 11:03:27 +0000
commit4ec51bd84368579f53d4e290bc84868e23ae94fb (patch)
tree93e1a6374a780420caab73bda7162803297e8558 /engines/mohawk/myst_stacks/stoneship.cpp
parent3354204f53bb41b28f6dbf260646df3ee70d279b (diff)
downloadscummvm-rg350-4ec51bd84368579f53d4e290bc84868e23ae94fb.tar.gz
scummvm-rg350-4ec51bd84368579f53d4e290bc84868e23ae94fb.tar.bz2
scummvm-rg350-4ec51bd84368579f53d4e290bc84868e23ae94fb.zip
MOHAWK: Implement Stoneship's last opcodes, tunnel alarm
svn-id: r55891
Diffstat (limited to 'engines/mohawk/myst_stacks/stoneship.cpp')
-rw-r--r--engines/mohawk/myst_stacks/stoneship.cpp118
1 files changed, 50 insertions, 68 deletions
diff --git a/engines/mohawk/myst_stacks/stoneship.cpp b/engines/mohawk/myst_stacks/stoneship.cpp
index fe82f99aab..ebf7f75d88 100644
--- a/engines/mohawk/myst_stacks/stoneship.cpp
+++ b/engines/mohawk/myst_stacks/stoneship.cpp
@@ -40,6 +40,8 @@ MystScriptParser_Stoneship::MystScriptParser_Stoneship(MohawkEngine_Myst *vm) :
MystScriptParser(vm), _state(vm->_gameState->_stoneship) {
setupOpcodes();
+ _tunnelRunning = false;
+
_state.generatorDepletionTime = 0;
_state.generatorDuration = 0;
_cabinMystBookPresent = 0;
@@ -52,10 +54,10 @@ MystScriptParser_Stoneship::MystScriptParser_Stoneship(MohawkEngine_Myst *vm) :
_state.trapdoorKeyState = 2;
// Power is not available when loading
-// if (_state.sideDoorOpened)
-// _state.generatorPowerAvailable = 2;
-// else
-// _state.generatorPowerAvailable = 0;
+ if (_state.sideDoorOpened)
+ _state.generatorPowerAvailable = 2;
+ else
+ _state.generatorPowerAvailable = 0;
}
MystScriptParser_Stoneship::~MystScriptParser_Stoneship() {
@@ -94,10 +96,10 @@ void MystScriptParser_Stoneship::setupOpcodes() {
OPCODE(200, o_hologramDisplay_init);
OPCODE(201, o_hologramSelection_init);
OPCODE(202, o_battery_init);
- OPCODE(203, opcode_203);
+ OPCODE(203, o_tunnelEnter_init);
OPCODE(204, o_batteryGauge_init);
- OPCODE(205, opcode_205);
- OPCODE(206, opcode_206);
+ OPCODE(205, o_tunnel_init);
+ OPCODE(206, o_tunnelLeave_init);
OPCODE(207, o_chest_init);
OPCODE(208, o_telescope_init);
OPCODE(209, o_achenarDrawers_init);
@@ -128,6 +130,9 @@ void MystScriptParser_Stoneship::runPersistentScripts() {
if (_batteryDepleting)
batteryDeplete_run();
+
+ if (_tunnelRunning)
+ tunnel_run();
}
uint16 MystScriptParser_Stoneship::getVar(uint16 var) {
@@ -171,7 +176,7 @@ uint16 MystScriptParser_Stoneship::getVar(uint16 var) {
case 12: // Trapdoor can be unlocked
return _state.trapdoorKeyState == 1 && _state.trapdoorState == 2;
case 13: // State Of Tunnels To Brothers' Rooms - Close Up
- if (_state.generatorPowerAvailable == 0) {
+ if (_state.generatorPowerAvailable != 1) {
if (_state.pumpState != 2)
return 0; // Dark, Flooded
else
@@ -827,37 +832,13 @@ void MystScriptParser_Stoneship::o_battery_init(uint16 op, uint16 var, uint16 ar
batteryGaugeUpdate();
}
-void MystScriptParser_Stoneship::opcode_203(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- varUnusedCheck(op, var);
-
- // Used for all/most Cards in Tunnels Down To Brothers Rooms
-
- // TODO: Duplicate or similar function to Opcode 203?
- if (argc == 2 || argc == 4) {
- debugC(kDebugScript, "Opcode %d: %d Arguments", op, argc);
-
- uint16 imageIdDarkDoorOpen = 0;
- uint16 imageIdDarkDoorClosed = 0;
- uint16 u0 = argv[0];
- uint16 soundIdAlarm = argv[argc - 1];
-
- if (argc == 4) {
- imageIdDarkDoorOpen = argv[1];
- imageIdDarkDoorClosed = argv[2];
- }
-
- debugC(kDebugScript, "\tu0: %d", u0);
-
- if (argc == 4) {
- debugC(kDebugScript, "\timageIdDarkDoorOpen: %d", imageIdDarkDoorOpen);
- debugC(kDebugScript, "\tsoundIdDarkDoorClosed: %d", imageIdDarkDoorClosed);
- }
+void MystScriptParser_Stoneship::o_tunnelEnter_init(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
+ debugC(kDebugScript, "Opcode %d: Tunnel enter", op);
- debugC(kDebugScript, "\tsoundIdAlarm: %d", soundIdAlarm);
+ o_tunnel_init(op, var, argc, argv);
- // TODO: Fill in Correct Function for Lights
- } else
- unknown(op, var, argc, argv);
+ _tunnelRunning = true;
+ _tunnelNextTime = _vm->_system->getMillis() + 1500;
}
void MystScriptParser_Stoneship::o_batteryGauge_init(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
@@ -882,49 +863,50 @@ void MystScriptParser_Stoneship::batteryGauge_run() {
}
}
-void MystScriptParser_Stoneship::opcode_205(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- varUnusedCheck(op, var);
-
- // Used on Cards 2322, 2285 (Tunnels Down To Brothers Rooms)
+void MystScriptParser_Stoneship::o_tunnel_init(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
+ debugC(kDebugScript, "Opcode %d: Tunnel card init", op);
- // TODO: Duplicate or similar function to Opcode 203?
- if (argc == 2 || argc == 4) {
- debugC(kDebugScript, "Opcode %d: %d Arguments", op, argc);
+ _tunnelImagesCount = argv[0];
- uint16 imageIdDoorOpen = 0;
- uint16 imageIdDoorClosed = 0;
+ assert(_tunnelImagesCount <= 2 && "Too many images");
- uint16 u0 = argv[0];
- if (argc == 4) {
- imageIdDoorOpen = argv[1];
- imageIdDoorClosed = argv[2];
+ for (uint i = 0; i < _tunnelImagesCount; i++) {
+ _tunnelImages[i] = argv[i + 1];
}
- uint16 soundIdAlarm = argv[argc - 1];
+ _tunnelAlarmSound = argv[argc - 1];
- debugC(kDebugScript, "\tu0: %d", u0);
+ debugC(kDebugScript, "\timage count: %d", _tunnelImagesCount);
+ debugC(kDebugScript, "\tsoundIdAlarm: %d", _tunnelAlarmSound);
+}
- if (argc == 4) {
- debugC(kDebugScript, "\timageIdDoorOpen: %d", imageIdDoorOpen);
- debugC(kDebugScript, "\tsoundIdDoorClosed: %d", imageIdDoorClosed);
- }
+void MystScriptParser_Stoneship::tunnel_run() {
+ uint32 time = _vm->_system->getMillis();
- debugC(kDebugScript, "\tsoundIdAlarm: %d", soundIdAlarm);
+ if (time > _tunnelNextTime) {
+ _tunnelNextTime = time + 1500;
+ if (_state.generatorPowerAvailable == 2) {
+ // Draw tunnel black
+ if (_tunnelImagesCount) {
+ _vm->_gfx->copyImageToScreen(_tunnelImages[1], Common::Rect(544, 333));
+ _vm->_system->updateScreen();
+ }
+
+ _vm->_sound->replaceSoundMyst(_tunnelAlarmSound);
- // TODO: Fill in Correct Function for Lights
- } else
- unknown(op, var, argc, argv);
+ // Draw tunnel dark
+ if (_tunnelImagesCount) {
+ _vm->_gfx->copyImageToScreen(_tunnelImages[0], Common::Rect(544, 333));
+ _vm->_system->updateScreen();
+ }
+ }
+ }
}
-void MystScriptParser_Stoneship::opcode_206(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- varUnusedCheck(op, var);
+void MystScriptParser_Stoneship::o_tunnelLeave_init(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
+ debugC(kDebugScript, "Opcode %d: Tunnel leave", op);
- // Used for Cards 2272 and 2234 (Facing Out of Door)
- if (argc == 0) {
- debugC(kDebugScript, "Opcode %d: Unknown, %d Arguments", op, argc);
- // TODO: Function Unknown...
- } else
- unknown(op, var, argc, argv);
+ _tunnelRunning = false;
}
void MystScriptParser_Stoneship::o_chest_init(uint16 op, uint16 var, uint16 argc, uint16 *argv) {