aboutsummaryrefslogtreecommitdiff
path: root/engines/mohawk
diff options
context:
space:
mode:
authorBastien Bouclet2011-01-22 16:44:00 +0000
committerBastien Bouclet2011-01-22 16:44:00 +0000
commitaeff7cf12c9fc5effa6671b6c5571a08d226b86c (patch)
treeedf0c53ed0e78eca9b617c444d4c88bff9ced207 /engines/mohawk
parentc1e68ac94da1f8429462b75e0d51b9d6c2dc2f2f (diff)
downloadscummvm-rg350-aeff7cf12c9fc5effa6671b6c5571a08d226b86c.tar.gz
scummvm-rg350-aeff7cf12c9fc5effa6671b6c5571a08d226b86c.tar.bz2
scummvm-rg350-aeff7cf12c9fc5effa6671b6c5571a08d226b86c.zip
MOHAWK: Implement Channelwood's remaining opcodes
svn-id: r55434
Diffstat (limited to 'engines/mohawk')
-rw-r--r--engines/mohawk/myst_stacks/channelwood.cpp170
-rw-r--r--engines/mohawk/myst_stacks/channelwood.h12
2 files changed, 113 insertions, 69 deletions
diff --git a/engines/mohawk/myst_stacks/channelwood.cpp b/engines/mohawk/myst_stacks/channelwood.cpp
index b759a437a3..7943c62662 100644
--- a/engines/mohawk/myst_stacks/channelwood.cpp
+++ b/engines/mohawk/myst_stacks/channelwood.cpp
@@ -50,7 +50,7 @@ void MystScriptParser_Channelwood::setupOpcodes() {
// "Stack-Specific" Opcodes
OPCODE(100, o_bridgeToggle);
OPCODE(101, o_pipeExtend);
- OPCODE(102, opcode_102);
+ OPCODE(102, o_drawImageChangeCardAndVolume);
OPCODE(104, o_waterTankValveOpen);
OPCODE(105, o_leverStartMove);
OPCODE(106, o_leverEndMove);
@@ -64,12 +64,16 @@ void MystScriptParser_Channelwood::setupOpcodes() {
OPCODE(114, o_valveHandleMoveStart2);
OPCODE(115, o_valveHandleMove3);
OPCODE(116, o_valveHandleMoveStart3);
- OPCODE(117, opcode_117);
+ OPCODE(117, o_hologramMonitor);
OPCODE(118, o_drawerOpen);
- OPCODE(119, opcode_119);
+ OPCODE(119, o_hologramTemple);
+ OPCODE(120, o_leverElev3StartMove);
+ OPCODE(121, o_leverElev3EndMove);
OPCODE(122, o_waterTankValveClose);
OPCODE(123, o_executeMouseUp);
OPCODE(124, o_leverEndMoveWithSound);
+ OPCODE(125, o_pumpLeverMove);
+ OPCODE(126, o_pumpLeverEndMove);
OPCODE(127, o_elevatorMovies);
OPCODE(128, o_leverEndMoveResumeBackground);
OPCODE(129, o_soundReplace);
@@ -80,7 +84,7 @@ void MystScriptParser_Channelwood::setupOpcodes() {
OPCODE(203, o_drawer_init);
// "Exit" Opcodes
- OPCODE(300, opcode_300);
+ OPCODE(300, NOP);
}
#undef OPCODE
@@ -315,28 +319,24 @@ void MystScriptParser_Channelwood::o_pipeExtend(uint16 op, uint16 var, uint16 ar
_vm->_sound->resumeBackgroundMyst();
}
-void MystScriptParser_Channelwood::opcode_102(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- varUnusedCheck(op, var);
+void MystScriptParser_Channelwood::o_drawImageChangeCardAndVolume(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
+ debugC(kDebugScript, "Opcode %d: Draw Full Screen Image, Change Card, and change volume", op);
- if (argc == 2 || argc == 3) {
- debugC(kDebugScript, "Opcode %d: Draw Full Screen Image, Optional Delay and Change Card", op);
+ uint16 imageId = argv[0];
+ uint16 cardId = argv[1];
- uint16 imageId = argv[0];
- uint16 cardId = argv[1];
- uint16 delay = 0;
+ debugC(kDebugScript, "\timageId: %d", imageId);
+ debugC(kDebugScript, "\tcardId: %d", cardId);
- if (argc == 3)
- delay = argv[2]; // TODO: Not sure about purpose of this parameter...
+ _vm->_gfx->copyImageToScreen(imageId, Common::Rect(0, 0, 544, 333));
+ _vm->_system->updateScreen();
+ _vm->_system->delayMillis(10);
+ _vm->changeToCard(cardId, true);
- debugC(kDebugScript, "\timageId: %d", imageId);
- debugC(kDebugScript, "\tcardId: %d", cardId);
- debugC(kDebugScript, "\tdelay: %d", delay);
-
- _vm->_gfx->copyImageToScreen(imageId, Common::Rect(0, 0, 544, 333));
- _vm->_system->delayMillis(delay / 100);
- _vm->changeToCard(cardId, true);
- } else
- unknown(op, var, argc, argv);
+ if (argc == 3) {
+ uint16 volume = argv[2];
+ _vm->_sound->changeBackgroundVolumeMyst(volume);
+ }
}
@@ -448,6 +448,50 @@ void MystScriptParser_Channelwood::o_leverEndMoveWithSound(uint16 op, uint16 var
_vm->_sound->replaceSoundMyst(soundId);
}
+void MystScriptParser_Channelwood::o_leverElev3StartMove(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
+ _vm->_gfx->copyImageToScreen(3970, Common::Rect(544, 333));
+ _vm->_system->updateScreen();
+ o_leverStartMove(op, var, argc, argv);
+}
+
+void MystScriptParser_Channelwood::o_leverElev3EndMove(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
+ o_leverEndMove(op, var, argc, argv);
+ _vm->_gfx->copyImageToScreen(3265, Common::Rect(544, 333));
+ _vm->_system->updateScreen();
+ _vm->_sound->replaceSoundMyst(5265);
+}
+
+void MystScriptParser_Channelwood::o_pumpLeverMove(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
+ debugC(kDebugScript, "Opcode %d: Pump lever move", op);
+
+ MystResourceType12 *lever = static_cast<MystResourceType12 *>(_invokingResource);
+
+ // Make the handle follow the mouse
+ int16 maxStep = lever->getStepsV() - 1;
+ Common::Rect rect = lever->getRect();
+ int16 step = ((_vm->_mouse.y - rect.top) * lever->getStepsV()) / rect.height();
+ step = CLIP<int16>(step, 0, maxStep);
+
+ lever->drawFrame(step);
+
+ if (step == maxStep) {
+ uint16 soundId = lever->getList2(0);
+ _vm->_sound->replaceBackgroundMyst(soundId, 38400);
+ } else {
+ uint16 soundId = lever->getList2(1);
+ _vm->_sound->replaceBackgroundMyst(soundId, 36864);
+ }
+}
+
+void MystScriptParser_Channelwood::o_pumpLeverEndMove(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
+ o_leverEndMove(op, var, argc, argv);
+
+ MystResourceType12 *lever = static_cast<MystResourceType12 *>(_invokingResource);
+ uint16 soundId = lever->getList3(0);
+ if (soundId)
+ _vm->_sound->replaceBackgroundMyst(soundId, 36864);
+}
+
void MystScriptParser_Channelwood::o_stairsDoorToggle(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
debugC(kDebugScript, "Opcode %d: Play stairs door video", op);
@@ -562,33 +606,36 @@ void MystScriptParser_Channelwood::o_valveHandleMoveStart3(uint16 op, uint16 var
o_valveHandleMove3(op, var, argc, argv);
}
-void MystScriptParser_Channelwood::opcode_117(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- varUnusedCheck(op, var);
+void MystScriptParser_Channelwood::o_hologramMonitor(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
+ debugC(kDebugScript, "Opcode %d: Hologram monitor", op);
+
+ // Used on Card 3012 (Temple Hologram Monitor)
+ uint16 button = argv[0]; // 0 to 3
- if (argc == 1) {
- // Used on Card 3012 (Temple Hologram Monitor)
- uint16 button = argv[0]; // 0 to 3
- _vm->_varStore->setVar(17, button);
+ if (_state.holoprojectorSelection != button || !_vm->_video->isVideoPlaying()) {
+ _state.holoprojectorSelection = button;
+ _vm->redrawArea(17);
+
+ _vm->_video->stopVideos();
switch (button) {
case 0:
- _vm->_video->playMovieBlocking(_vm->wrapMovieFilename("monalgh", kChannelwoodStack), 227, 71);
+ _vm->_video->playMovie(_vm->wrapMovieFilename("monalgh", kChannelwoodStack), 227, 70);
break;
case 1:
- _vm->_video->playMovieBlocking(_vm->wrapMovieFilename("monamth", kChannelwoodStack), 227, 71);
+ _vm->_video->playMovie(_vm->wrapMovieFilename("monamth", kChannelwoodStack), 227, 70);
break;
case 2:
- _vm->_video->playMovieBlocking(_vm->wrapMovieFilename("monasirs", kChannelwoodStack), 227, 71);
+ _vm->_video->playMovie(_vm->wrapMovieFilename("monasirs", kChannelwoodStack), 227, 70);
break;
case 3:
- _vm->_video->playMovieBlocking(_vm->wrapMovieFilename("monsmsg", kChannelwoodStack), 227, 71);
+ _vm->_video->playMovie(_vm->wrapMovieFilename("monsmsg", kChannelwoodStack), 227, 70);
break;
default:
warning("Opcode %d Control Variable Out of Range", op);
break;
}
- } else
- unknown(op, var, argc, argv);
+ }
}
void MystScriptParser_Channelwood::o_drawerOpen(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
@@ -599,31 +646,31 @@ void MystScriptParser_Channelwood::o_drawerOpen(uint16 op, uint16 var, uint16 ar
_vm->redrawArea(102, false);
}
-void MystScriptParser_Channelwood::opcode_119(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- varUnusedCheck(op, var);
+void MystScriptParser_Channelwood::o_hologramTemple(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
+ debugC(kDebugScript, "Opcode %d: Temple hologram", op);
- if (argc == 0) {
- // Used on Card 3333 (Temple Hologram)
- // TODO: Not 100% sure about movie position...
- switch (_vm->_varStore->getVar(17)) {
- case 0:
- _vm->_video->playMovieBlocking(_vm->wrapMovieFilename("holoalgh", kChannelwoodStack), 126, 74);
- break;
- case 1:
- _vm->_video->playMovieBlocking(_vm->wrapMovieFilename("holoamth", kChannelwoodStack), 126, 74);
- break;
- case 2:
- _vm->_video->playMovieBlocking(_vm->wrapMovieFilename("holoasir", kChannelwoodStack), 126, 74);
- break;
- case 3:
- _vm->_video->playMovieBlocking(_vm->wrapMovieFilename("holosmsg", kChannelwoodStack), 126, 74);
- break;
- default:
- warning("Opcode %d Control Variable Out of Range", op);
- break;
- }
- } else
- unknown(op, var, argc, argv);
+ _vm->_sound->pauseBackgroundMyst();
+
+ // Used on Card 3333 (Temple Hologram)
+ switch (_state.holoprojectorSelection) {
+ case 0:
+ _vm->_video->playMovieBlocking(_vm->wrapMovieFilename("holoalgh", kChannelwoodStack), 139, 64);
+ break;
+ case 1:
+ _vm->_video->playMovieBlocking(_vm->wrapMovieFilename("holoamth", kChannelwoodStack), 127, 73);
+ break;
+ case 2:
+ _vm->_video->playMovieBlocking(_vm->wrapMovieFilename("holoasir", kChannelwoodStack), 139, 64);
+ break;
+ case 3:
+ _vm->_video->playMovieBlocking(_vm->wrapMovieFilename("holosmsg", kChannelwoodStack), 127, 45);
+ break;
+ default:
+ warning("Opcode %d Control Variable Out of Range", op);
+ break;
+ }
+
+ _vm->_sound->resumeBackgroundMyst();
}
void MystScriptParser_Channelwood::o_executeMouseUp(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
@@ -710,13 +757,8 @@ void MystScriptParser_Channelwood::o_pipeValve_init(uint16 op, uint16 var, uint1
}
void MystScriptParser_Channelwood::o_drawer_init(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
+ debugC(kDebugScript, "Opcode %d: Sirius's drawer init", op);
_siriusDrawerState = 0;
}
-void MystScriptParser_Channelwood::opcode_300(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- // Used in Card 3012 (Achenar's Holoprojector Control)
- varUnusedCheck(op, var);
- // TODO: Fill in Logic. Clearing Variable for View?
-}
-
} // End of namespace Mohawk
diff --git a/engines/mohawk/myst_stacks/channelwood.h b/engines/mohawk/myst_stacks/channelwood.h
index 9f7ef71ff0..8c52f864cd 100644
--- a/engines/mohawk/myst_stacks/channelwood.h
+++ b/engines/mohawk/myst_stacks/channelwood.h
@@ -53,7 +53,7 @@ private:
DECLARE_OPCODE(o_bridgeToggle);
DECLARE_OPCODE(o_pipeExtend);
- DECLARE_OPCODE(opcode_102);
+ DECLARE_OPCODE(o_drawImageChangeCardAndVolume);
DECLARE_OPCODE(o_waterTankValveOpen);
DECLARE_OPCODE(o_leverStartMove);
DECLARE_OPCODE(o_leverMove);
@@ -61,6 +61,10 @@ private:
DECLARE_OPCODE(o_leverEndMove);
DECLARE_OPCODE(o_leverEndMoveResumeBackground);
DECLARE_OPCODE(o_leverEndMoveWithSound);
+ DECLARE_OPCODE(o_leverElev3StartMove);
+ DECLARE_OPCODE(o_leverElev3EndMove);
+ DECLARE_OPCODE(o_pumpLeverMove);
+ DECLARE_OPCODE(o_pumpLeverEndMove);
DECLARE_OPCODE(o_stairsDoorToggle);
DECLARE_OPCODE(o_valveHandleMove1);
DECLARE_OPCODE(o_valveHandleMoveStart1);
@@ -69,9 +73,9 @@ private:
DECLARE_OPCODE(o_valveHandleMoveStart2);
DECLARE_OPCODE(o_valveHandleMove3);
DECLARE_OPCODE(o_valveHandleMoveStart3);
- DECLARE_OPCODE(opcode_117);
+ DECLARE_OPCODE(o_hologramMonitor);
DECLARE_OPCODE(o_drawerOpen);
- DECLARE_OPCODE(opcode_119);
+ DECLARE_OPCODE(o_hologramTemple);
DECLARE_OPCODE(o_executeMouseUp);
DECLARE_OPCODE(o_waterTankValveClose);
DECLARE_OPCODE(o_elevatorMovies);
@@ -81,8 +85,6 @@ private:
DECLARE_OPCODE(o_pipeValve_init);
DECLARE_OPCODE(o_drawer_init);
- DECLARE_OPCODE(opcode_300);
-
MystGameState::Channelwood &_state;
uint16 _valveVar; // 64