MOHAWK: Implement Channelwood's remaining opcodes

svn-id: r55434
This commit is contained in:
Bastien Bouclet 2011-01-22 16:44:00 +00:00
parent c1e68ac94d
commit aeff7cf12c
2 changed files with 113 additions and 69 deletions

View file

@ -50,7 +50,7 @@ void MystScriptParser_Channelwood::setupOpcodes() {
// "Stack-Specific" Opcodes // "Stack-Specific" Opcodes
OPCODE(100, o_bridgeToggle); OPCODE(100, o_bridgeToggle);
OPCODE(101, o_pipeExtend); OPCODE(101, o_pipeExtend);
OPCODE(102, opcode_102); OPCODE(102, o_drawImageChangeCardAndVolume);
OPCODE(104, o_waterTankValveOpen); OPCODE(104, o_waterTankValveOpen);
OPCODE(105, o_leverStartMove); OPCODE(105, o_leverStartMove);
OPCODE(106, o_leverEndMove); OPCODE(106, o_leverEndMove);
@ -64,12 +64,16 @@ void MystScriptParser_Channelwood::setupOpcodes() {
OPCODE(114, o_valveHandleMoveStart2); OPCODE(114, o_valveHandleMoveStart2);
OPCODE(115, o_valveHandleMove3); OPCODE(115, o_valveHandleMove3);
OPCODE(116, o_valveHandleMoveStart3); OPCODE(116, o_valveHandleMoveStart3);
OPCODE(117, opcode_117); OPCODE(117, o_hologramMonitor);
OPCODE(118, o_drawerOpen); 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(122, o_waterTankValveClose);
OPCODE(123, o_executeMouseUp); OPCODE(123, o_executeMouseUp);
OPCODE(124, o_leverEndMoveWithSound); OPCODE(124, o_leverEndMoveWithSound);
OPCODE(125, o_pumpLeverMove);
OPCODE(126, o_pumpLeverEndMove);
OPCODE(127, o_elevatorMovies); OPCODE(127, o_elevatorMovies);
OPCODE(128, o_leverEndMoveResumeBackground); OPCODE(128, o_leverEndMoveResumeBackground);
OPCODE(129, o_soundReplace); OPCODE(129, o_soundReplace);
@ -80,7 +84,7 @@ void MystScriptParser_Channelwood::setupOpcodes() {
OPCODE(203, o_drawer_init); OPCODE(203, o_drawer_init);
// "Exit" Opcodes // "Exit" Opcodes
OPCODE(300, opcode_300); OPCODE(300, NOP);
} }
#undef OPCODE #undef OPCODE
@ -315,28 +319,24 @@ void MystScriptParser_Channelwood::o_pipeExtend(uint16 op, uint16 var, uint16 ar
_vm->_sound->resumeBackgroundMyst(); _vm->_sound->resumeBackgroundMyst();
} }
void MystScriptParser_Channelwood::opcode_102(uint16 op, uint16 var, uint16 argc, uint16 *argv) { void MystScriptParser_Channelwood::o_drawImageChangeCardAndVolume(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
varUnusedCheck(op, var); debugC(kDebugScript, "Opcode %d: Draw Full Screen Image, Change Card, and change volume", op);
if (argc == 2 || argc == 3) { uint16 imageId = argv[0];
debugC(kDebugScript, "Opcode %d: Draw Full Screen Image, Optional Delay and Change Card", op); uint16 cardId = argv[1];
uint16 imageId = argv[0]; debugC(kDebugScript, "\timageId: %d", imageId);
uint16 cardId = argv[1]; debugC(kDebugScript, "\tcardId: %d", cardId);
uint16 delay = 0;
if (argc == 3) _vm->_gfx->copyImageToScreen(imageId, Common::Rect(0, 0, 544, 333));
delay = argv[2]; // TODO: Not sure about purpose of this parameter... _vm->_system->updateScreen();
_vm->_system->delayMillis(10);
_vm->changeToCard(cardId, true);
debugC(kDebugScript, "\timageId: %d", imageId); if (argc == 3) {
debugC(kDebugScript, "\tcardId: %d", cardId); uint16 volume = argv[2];
debugC(kDebugScript, "\tdelay: %d", delay); _vm->_sound->changeBackgroundVolumeMyst(volume);
}
_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);
} }
@ -448,6 +448,50 @@ void MystScriptParser_Channelwood::o_leverEndMoveWithSound(uint16 op, uint16 var
_vm->_sound->replaceSoundMyst(soundId); _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) { void MystScriptParser_Channelwood::o_stairsDoorToggle(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
debugC(kDebugScript, "Opcode %d: Play stairs door video", op); 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); o_valveHandleMove3(op, var, argc, argv);
} }
void MystScriptParser_Channelwood::opcode_117(uint16 op, uint16 var, uint16 argc, uint16 *argv) { void MystScriptParser_Channelwood::o_hologramMonitor(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
varUnusedCheck(op, var); debugC(kDebugScript, "Opcode %d: Hologram monitor", op);
if (argc == 1) { // Used on Card 3012 (Temple Hologram Monitor)
// Used on Card 3012 (Temple Hologram Monitor) uint16 button = argv[0]; // 0 to 3
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) { switch (button) {
case 0: case 0:
_vm->_video->playMovieBlocking(_vm->wrapMovieFilename("monalgh", kChannelwoodStack), 227, 71); _vm->_video->playMovie(_vm->wrapMovieFilename("monalgh", kChannelwoodStack), 227, 70);
break; break;
case 1: case 1:
_vm->_video->playMovieBlocking(_vm->wrapMovieFilename("monamth", kChannelwoodStack), 227, 71); _vm->_video->playMovie(_vm->wrapMovieFilename("monamth", kChannelwoodStack), 227, 70);
break; break;
case 2: case 2:
_vm->_video->playMovieBlocking(_vm->wrapMovieFilename("monasirs", kChannelwoodStack), 227, 71); _vm->_video->playMovie(_vm->wrapMovieFilename("monasirs", kChannelwoodStack), 227, 70);
break; break;
case 3: case 3:
_vm->_video->playMovieBlocking(_vm->wrapMovieFilename("monsmsg", kChannelwoodStack), 227, 71); _vm->_video->playMovie(_vm->wrapMovieFilename("monsmsg", kChannelwoodStack), 227, 70);
break; break;
default: default:
warning("Opcode %d Control Variable Out of Range", op); warning("Opcode %d Control Variable Out of Range", op);
break; break;
} }
} else }
unknown(op, var, argc, argv);
} }
void MystScriptParser_Channelwood::o_drawerOpen(uint16 op, uint16 var, uint16 argc, uint16 *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); _vm->redrawArea(102, false);
} }
void MystScriptParser_Channelwood::opcode_119(uint16 op, uint16 var, uint16 argc, uint16 *argv) { void MystScriptParser_Channelwood::o_hologramTemple(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
varUnusedCheck(op, var); debugC(kDebugScript, "Opcode %d: Temple hologram", op);
if (argc == 0) { _vm->_sound->pauseBackgroundMyst();
// Used on Card 3333 (Temple Hologram)
// TODO: Not 100% sure about movie position... // Used on Card 3333 (Temple Hologram)
switch (_vm->_varStore->getVar(17)) { switch (_state.holoprojectorSelection) {
case 0: case 0:
_vm->_video->playMovieBlocking(_vm->wrapMovieFilename("holoalgh", kChannelwoodStack), 126, 74); _vm->_video->playMovieBlocking(_vm->wrapMovieFilename("holoalgh", kChannelwoodStack), 139, 64);
break; break;
case 1: case 1:
_vm->_video->playMovieBlocking(_vm->wrapMovieFilename("holoamth", kChannelwoodStack), 126, 74); _vm->_video->playMovieBlocking(_vm->wrapMovieFilename("holoamth", kChannelwoodStack), 127, 73);
break; break;
case 2: case 2:
_vm->_video->playMovieBlocking(_vm->wrapMovieFilename("holoasir", kChannelwoodStack), 126, 74); _vm->_video->playMovieBlocking(_vm->wrapMovieFilename("holoasir", kChannelwoodStack), 139, 64);
break; break;
case 3: case 3:
_vm->_video->playMovieBlocking(_vm->wrapMovieFilename("holosmsg", kChannelwoodStack), 126, 74); _vm->_video->playMovieBlocking(_vm->wrapMovieFilename("holosmsg", kChannelwoodStack), 127, 45);
break; break;
default: default:
warning("Opcode %d Control Variable Out of Range", op); warning("Opcode %d Control Variable Out of Range", op);
break; break;
} }
} else
unknown(op, var, argc, argv); _vm->_sound->resumeBackgroundMyst();
} }
void MystScriptParser_Channelwood::o_executeMouseUp(uint16 op, uint16 var, uint16 argc, uint16 *argv) { 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) { 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; _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 } // End of namespace Mohawk

View file

@ -53,7 +53,7 @@ private:
DECLARE_OPCODE(o_bridgeToggle); DECLARE_OPCODE(o_bridgeToggle);
DECLARE_OPCODE(o_pipeExtend); DECLARE_OPCODE(o_pipeExtend);
DECLARE_OPCODE(opcode_102); DECLARE_OPCODE(o_drawImageChangeCardAndVolume);
DECLARE_OPCODE(o_waterTankValveOpen); DECLARE_OPCODE(o_waterTankValveOpen);
DECLARE_OPCODE(o_leverStartMove); DECLARE_OPCODE(o_leverStartMove);
DECLARE_OPCODE(o_leverMove); DECLARE_OPCODE(o_leverMove);
@ -61,6 +61,10 @@ private:
DECLARE_OPCODE(o_leverEndMove); DECLARE_OPCODE(o_leverEndMove);
DECLARE_OPCODE(o_leverEndMoveResumeBackground); DECLARE_OPCODE(o_leverEndMoveResumeBackground);
DECLARE_OPCODE(o_leverEndMoveWithSound); 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_stairsDoorToggle);
DECLARE_OPCODE(o_valveHandleMove1); DECLARE_OPCODE(o_valveHandleMove1);
DECLARE_OPCODE(o_valveHandleMoveStart1); DECLARE_OPCODE(o_valveHandleMoveStart1);
@ -69,9 +73,9 @@ private:
DECLARE_OPCODE(o_valveHandleMoveStart2); DECLARE_OPCODE(o_valveHandleMoveStart2);
DECLARE_OPCODE(o_valveHandleMove3); DECLARE_OPCODE(o_valveHandleMove3);
DECLARE_OPCODE(o_valveHandleMoveStart3); DECLARE_OPCODE(o_valveHandleMoveStart3);
DECLARE_OPCODE(opcode_117); DECLARE_OPCODE(o_hologramMonitor);
DECLARE_OPCODE(o_drawerOpen); DECLARE_OPCODE(o_drawerOpen);
DECLARE_OPCODE(opcode_119); DECLARE_OPCODE(o_hologramTemple);
DECLARE_OPCODE(o_executeMouseUp); DECLARE_OPCODE(o_executeMouseUp);
DECLARE_OPCODE(o_waterTankValveClose); DECLARE_OPCODE(o_waterTankValveClose);
DECLARE_OPCODE(o_elevatorMovies); DECLARE_OPCODE(o_elevatorMovies);
@ -81,8 +85,6 @@ private:
DECLARE_OPCODE(o_pipeValve_init); DECLARE_OPCODE(o_pipeValve_init);
DECLARE_OPCODE(o_drawer_init); DECLARE_OPCODE(o_drawer_init);
DECLARE_OPCODE(opcode_300);
MystGameState::Channelwood &_state; MystGameState::Channelwood &_state;
uint16 _valveVar; // 64 uint16 _valveVar; // 64