From 8e80f5690d6e7e1c7d176a258799df29e703975a Mon Sep 17 00:00:00 2001 From: Bastien Bouclet Date: Sat, 2 Jul 2011 21:47:33 +0200 Subject: MOHAWK: Misc Mechanical fixes. Many thanks to Patrick Monnerat for the patch. - Adds break statements where missing in Mechanical::toggleVar() and Mechanical::setVarValue() - Restore proper numbering of Achenar and Sirrus panel state variables, which were wrongly swapped. - When bird is singing, play sound continuously. - When operating the fortress elevator, keep the engine sound active while the elevator is moving.--- engines/mohawk/myst_scripts.cpp | 1 + engines/mohawk/myst_stacks/mechanical.cpp | 20 ++++++++++++++------ engines/mohawk/sound.cpp | 13 +++++++++++++ 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/engines/mohawk/myst_scripts.cpp b/engines/mohawk/myst_scripts.cpp index 17f6de534f..307be2dd05 100644 --- a/engines/mohawk/myst_scripts.cpp +++ b/engines/mohawk/myst_scripts.cpp @@ -560,6 +560,7 @@ void MystScriptParser::o_playSoundBlocking(uint16 op, uint16 var, uint16 argc, u debugC(kDebugScript, "Opcode %d: playSoundBlocking", op); debugC(kDebugScript, "\tsoundId: %d", soundId); + _vm->_sound->stopSound(); _vm->_sound->playSoundBlocking(soundId); } diff --git a/engines/mohawk/myst_stacks/mechanical.cpp b/engines/mohawk/myst_stacks/mechanical.cpp index d6dd1b5407..12d9dc7e2f 100644 --- a/engines/mohawk/myst_stacks/mechanical.cpp +++ b/engines/mohawk/myst_stacks/mechanical.cpp @@ -102,6 +102,7 @@ void Mechanical::setupOpcodes() { void Mechanical::disablePersistentScripts() { _fortressSimulationRunning = false; + _elevatorRotationLeverMoving = false; _elevatorGoingMiddle = false; _birdSinging = false; _fortressRotationRunning = false; @@ -126,10 +127,10 @@ void Mechanical::runPersistentScripts() { uint16 Mechanical::getVar(uint16 var) { switch(var) { - case 0: // Sirrus's Secret Panel State - return _state.sirrusPanelState; - case 1: // Achenar's Secret Panel State + case 0: // Achenar's Secret Panel State return _state.achenarPanelState; + case 1: // Sirrus's Secret Panel State + return _state.sirrusPanelState; case 2: // Achenar's Secret Room Crate Lid Open and Blue Page Present if (_state.achenarCrateOpened) { if (_globals.bluePagesInBook & 4 || _globals.heldPage == 3) @@ -195,16 +196,21 @@ uint16 Mechanical::getVar(uint16 var) { void Mechanical::toggleVar(uint16 var) { switch(var) { - case 0: // Sirrus's Secret Panel State - _state.sirrusPanelState ^= 1; - case 1: // Achenar's Secret Panel State + case 0: // Achenar's Secret Panel State _state.achenarPanelState ^= 1; + break; + case 1: // Sirrus's Secret Panel State + _state.sirrusPanelState ^= 1; + break; case 3: // Achenar's Secret Room Crate State _state.achenarCrateOpened ^= 1; + break; case 4: // Myst Book Room Staircase State _mystStaircaseState ^= 1; + break; case 10: // Fortress Staircase State _state.staircaseState ^= 1; + break; case 16: // Code Lock Shape #1 - Left case 17: // Code Lock Shape #2 case 18: // Code Lock Shape #3 @@ -242,6 +248,7 @@ bool Mechanical::setVarValue(uint16 var, uint16 value) { switch (var) { case 13: _elevatorPosition = value; + break; case 14: // Elevator going down when at top _elevatorGoingDown = value; break; @@ -724,6 +731,7 @@ void Mechanical::birdSing_run() { uint32 time = _vm->_system->getMillis(); if (_birdSingEndTime < time) { _bird->pauseMovie(true); + _vm->_sound->stopSound(); _birdSinging = false; } } diff --git a/engines/mohawk/sound.cpp b/engines/mohawk/sound.cpp index 6144c89e21..791b18db49 100644 --- a/engines/mohawk/sound.cpp +++ b/engines/mohawk/sound.cpp @@ -141,6 +141,19 @@ Audio::SoundHandle *Sound::replaceSoundMyst(uint16 id, byte volume, bool loop) { && name.equals(_vm->getResourceName(ID_MSND, convertMystID(_handles[i].id)))) return &_handles[i].handle; + // The original engine also forces looping for those sounds + switch (id) { + case 2205: + case 2207: + case 5378: + case 7220: + case 9119: // Elevator engine sound in mechanical age is looping. + case 9120: + case 9327: + loop = true; + break; + } + stopSound(); return playSound(id, volume, loop); } -- cgit v1.2.3