diff options
author | Bastien Bouclet | 2011-01-22 16:44:00 +0000 |
---|---|---|
committer | Bastien Bouclet | 2011-01-22 16:44:00 +0000 |
commit | aeff7cf12c9fc5effa6671b6c5571a08d226b86c (patch) | |
tree | edf0c53ed0e78eca9b617c444d4c88bff9ced207 /engines | |
parent | c1e68ac94da1f8429462b75e0d51b9d6c2dc2f2f (diff) | |
download | scummvm-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')
-rw-r--r-- | engines/mohawk/myst_stacks/channelwood.cpp | 170 | ||||
-rw-r--r-- | engines/mohawk/myst_stacks/channelwood.h | 12 |
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 |