aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorBastien Bouclet2011-01-02 14:15:15 +0000
committerBastien Bouclet2011-01-02 14:15:15 +0000
commitfd5754d6af59f7c6da499230273503014e4be2e4 (patch)
tree6f634878357d683be8f057e75af2b5e130aebb44 /engines
parentd063b074cd6fac667f33e0216a5f7fad1e76a5df (diff)
downloadscummvm-rg350-fd5754d6af59f7c6da499230273503014e4be2e4.tar.gz
scummvm-rg350-fd5754d6af59f7c6da499230273503014e4be2e4.tar.bz2
scummvm-rg350-fd5754d6af59f7c6da499230273503014e4be2e4.zip
MOHAWK: Fix checking Myst rocket sound puzzle before moving all the sliders.
Fix a off by one graphical glitch that happened when moving sliders. Implement opcode 300. svn-id: r55092
Diffstat (limited to 'engines')
-rw-r--r--engines/mohawk/myst_areas.cpp10
-rw-r--r--engines/mohawk/myst_stacks/myst.cpp211
-rw-r--r--engines/mohawk/myst_stacks/myst.h15
3 files changed, 58 insertions, 178 deletions
diff --git a/engines/mohawk/myst_areas.cpp b/engines/mohawk/myst_areas.cpp
index 701e3f4884..fcbca38b83 100644
--- a/engines/mohawk/myst_areas.cpp
+++ b/engines/mohawk/myst_areas.cpp
@@ -496,6 +496,8 @@ Common::Rect MystResourceType10::boundingBox() {
bb.bottom = _maxV + _sliderHeight / 2;
}
+ bb.grow(1);
+
return bb;
}
@@ -503,8 +505,8 @@ void MystResourceType10::restoreBackground() {
// Restore background
Common::Rect src = boundingBox();
Common::Rect dest = boundingBox();
- src.top = 333 - dest.bottom;
- src.bottom = 333 - dest.top;
+ src.top = 332 - dest.bottom;
+ src.bottom = 332 - dest.top;
_vm->_gfx->copyImageSectionToScreen(_vm->getCardBackgroundId(), src, dest);
}
@@ -577,7 +579,7 @@ void MystResourceType10::updatePosition(const Common::Point &mouse) {
if (_stepV) {
uint16 center = _minV + _stepV * (mouseClipped.y - _minV) / _stepV;
uint16 top = center - _sliderHeight / 2;
- if (_rect.top != top) {
+ if (_rect.top != top || _pos.y != center) {
positionChanged = true;
_pos.y = center;
_rect.top = top;
@@ -598,7 +600,7 @@ void MystResourceType10::updatePosition(const Common::Point &mouse) {
if (_stepH) {
uint16 center = _minH + _stepH * (mouseClipped.x - _minH) / _stepH;
uint16 left = center - _sliderWidth / 2;
- if (_rect.left != left) {
+ if (_rect.left != left || _pos.x != center) {
positionChanged = true;
_pos.x = center;
_rect.left = left;
diff --git a/engines/mohawk/myst_stacks/myst.cpp b/engines/mohawk/myst_stacks/myst.cpp
index af0ad1f526..98ca4e89da 100644
--- a/engines/mohawk/myst_stacks/myst.cpp
+++ b/engines/mohawk/myst_stacks/myst.cpp
@@ -161,7 +161,7 @@ void MystScriptParser_Myst::setupOpcodes() {
OPCODE(196, o_observatoryYearChangeStart);
OPCODE(197, o_observatoryYearChangeStart);
OPCODE(198, o_dockVaultForceClose);
- OPCODE(199, opcode_199);
+ OPCODE(199, o_imagerEraseStop);
// "Init" Opcodes
OPCODE(200, o_libraryBook_init);
@@ -188,17 +188,17 @@ void MystScriptParser_Myst::setupOpcodes() {
OPCODE(222, opcode_222);
// "Exit" Opcodes
- OPCODE(300, opcode_300);
- OPCODE(301, opcode_301);
- OPCODE(302, opcode_302);
- OPCODE(303, opcode_303);
+ OPCODE(300, o_bookAddSpecialPage_exit);
+ OPCODE(301, NOP);
+ OPCODE(302, NOP);
+ OPCODE(303, NOP);
OPCODE(304, o_treeCard_exit);
OPCODE(305, o_treeEntry_exit);
- OPCODE(306, opcode_306);
- OPCODE(307, opcode_307);
- OPCODE(308, opcode_308);
- OPCODE(309, opcode_309);
- OPCODE(312, opcode_312);
+ OPCODE(306, NOP);
+ OPCODE(307, o_generatorControlRoom_exit);
+ OPCODE(308, NOP);
+ OPCODE(309, NOP);
+ OPCODE(312, NOP);
}
#undef OPCODE
@@ -220,13 +220,9 @@ void MystScriptParser_Myst::disablePersistentScripts() {
_observatoryDayChanging = false;
_observatoryYearChanging = false;
_observatoryTimeChanging = false;
-
- opcode_212_disable();
}
void MystScriptParser_Myst::runPersistentScripts() {
- opcode_212_run();
-
if (_towerRotationMapRunning)
towerRotationMap_run();
@@ -2638,40 +2634,9 @@ void MystScriptParser_Myst::o_dockVaultForceClose(uint16 op, uint16 var, uint16
}
}
-void MystScriptParser_Myst::opcode_199(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- varUnusedCheck(op, var);
-
- if (argc == 0) {
- debugC(kDebugScript, "Opcode %d: Myst Imager Control Execute Button Logic", op);
-
- uint16 numericSelection = (_vm->_varStore->getVar(36) + 1) % 10;
- numericSelection += ((_vm->_varStore->getVar(35) + 1) % 10) * 10;
-
- debugC(kDebugScript, "\tImager Selection: %d", numericSelection);
-
- switch (numericSelection) {
- case 40:
- _vm->_varStore->setVar(51, 1); // Mountain
- break;
- case 67:
- _vm->_varStore->setVar(51, 2); // Water
- break;
- case 47:
- _vm->_varStore->setVar(51, 4); // Marker Switch
- break;
- case 8:
- _vm->_varStore->setVar(51, 3); // Atrus
- break;
- default:
- _vm->_varStore->setVar(51, 0); // Blank
- break;
- }
-
- // TODO: Fill in Logic
- //{ 34, 2, "Dock Forechamber Imager State" }, // 0 to 2 = Off, Mountain, Water
- //{ 310, 0, "Dock Forechamber Imager Control Temp Value?" }
- } else
- unknown(op, var, argc, argv);
+void MystScriptParser_Myst::o_imagerEraseStop(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
+ debugC(kDebugScript, "Opcode %d: Imager stop erase", op);
+ _imagerValidationRunning = false;
}
void MystScriptParser_Myst::o_libraryBook_init(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
@@ -2928,47 +2893,24 @@ void MystScriptParser_Myst::o_fireplace_init(uint16 op, uint16 var, uint16 argc,
_fireplaceLines[i] = 0;
}
-static struct {
- bool enabled;
-} g_opcode212Parameters;
-
-void MystScriptParser_Myst::opcode_212_run(void) {
- if (g_opcode212Parameters.enabled) {
- // TODO: Implement Correct Code for Myst Clock Tower Cog Puzzle
- // Card 4113
+void MystScriptParser_Myst::opcode_212(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
+ // Used for Card 4113 (Clock Tower Cog Puzzle)
- if (false) {
- // 3 videos to be played of Cog Movement
- // TODO: Not 100% sure of movie positions.
- _vm->_video->playMovie(_vm->wrapMovieFilename("cl1wg1", kMystStack), 220, 50);
- _vm->_video->playMovie(_vm->wrapMovieFilename("cl1wg2", kMystStack), 220, 80);
- _vm->_video->playMovie(_vm->wrapMovieFilename("cl1wg3", kMystStack), 220, 110);
+ if (false) {
+ // 3 videos to be played of Cog Movement
+ // TODO: Not 100% sure of movie positions.
+ _vm->_video->playMovie(_vm->wrapMovieFilename("cl1wg1", kMystStack), 220, 50);
+ _vm->_video->playMovie(_vm->wrapMovieFilename("cl1wg2", kMystStack), 220, 80);
+ _vm->_video->playMovie(_vm->wrapMovieFilename("cl1wg3", kMystStack), 220, 110);
- // 1 video of weight descent
- _vm->_video->playMovie(_vm->wrapMovieFilename("cl1wlfch", kMystStack), 123, 0);
+ // 1 video of weight descent
+ _vm->_video->playMovie(_vm->wrapMovieFilename("cl1wlfch", kMystStack), 123, 0);
- // Video of Cog Open on Success
- _vm->_video->playMovie(_vm->wrapMovieFilename("cl1wggat", kMystStack), 195, 225);
- // Var 40 set on success
- _vm->_varStore->setVar(40, 1);
- }
+ // Video of Cog Open on Success
+ _vm->_video->playMovie(_vm->wrapMovieFilename("cl1wggat", kMystStack), 195, 225);
}
}
-void MystScriptParser_Myst::opcode_212_disable(void) {
- g_opcode212Parameters.enabled = false;
-}
-
-void MystScriptParser_Myst::opcode_212(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- varUnusedCheck(op, var);
-
- // Used for Card 4113 (Clock Tower Cog Puzzle)
- if (argc == 0)
- g_opcode212Parameters.enabled = true;
- else
- unknown(op, var, argc, argv);
-}
-
void MystScriptParser_Myst::opcode_213(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
varUnusedCheck(op, var);
@@ -3159,21 +3101,16 @@ void MystScriptParser_Myst::o_rocketSliders_init(uint16 op, uint16 var, uint16 a
_rocketSlider4 = static_cast<MystResourceType10 *>(_vm->_resources[argv[3]]);
_rocketSlider5 = static_cast<MystResourceType10 *>(_vm->_resources[argv[4]]);
- if (_state.rocketSliderPosition[0]) {
- _rocketSlider1->setPosition(_state.rocketSliderPosition[0]);
- }
- if (_state.rocketSliderPosition[1]) {
- _rocketSlider2->setPosition(_state.rocketSliderPosition[1]);
- }
- if (_state.rocketSliderPosition[2]) {
- _rocketSlider3->setPosition(_state.rocketSliderPosition[2]);
- }
- if (_state.rocketSliderPosition[3]) {
- _rocketSlider4->setPosition(_state.rocketSliderPosition[3]);
- }
- if (_state.rocketSliderPosition[4]) {
- _rocketSlider5->setPosition(_state.rocketSliderPosition[4]);
- }
+ // Initialize sliders position
+ for (uint i = 0; i < 5; i++)
+ if (!_state.rocketSliderPosition[i])
+ _state.rocketSliderPosition[i] = 277;
+
+ _rocketSlider1->setPosition(_state.rocketSliderPosition[0]);
+ _rocketSlider2->setPosition(_state.rocketSliderPosition[1]);
+ _rocketSlider3->setPosition(_state.rocketSliderPosition[2]);
+ _rocketSlider4->setPosition(_state.rocketSliderPosition[3]);
+ _rocketSlider5->setPosition(_state.rocketSliderPosition[4]);
}
void MystScriptParser_Myst::o_rocketLinkVideo_init(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
@@ -3220,32 +3157,18 @@ void MystScriptParser_Myst::opcode_222(uint16 op, uint16 var, uint16 argc, uint1
unknown(op, var, argc, argv);
}
-void MystScriptParser_Myst::opcode_300(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- // Used in Card 4371 (Blue Book) Var = 101
- // and Card 4363 (Red Book) Var = 100
- debugC(kDebugScript, "Opcode %d: Book Exit Function...", op);
- debugC(kDebugScript, "Var: %d", var);
- // TODO: Fill in Logic
-}
+void MystScriptParser_Myst::o_bookAddSpecialPage_exit(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
+ debugC(kDebugScript, "Opcode %d: Book Exit Function", op);
-void MystScriptParser_Myst::opcode_301(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- // Used in Cards 4047, 4059, 4060, 4068 and 4080 (Myst Library Books - Open)
- // TODO: Fill in Logic. Clear Variable on Book exit.. or Copy from duplicate..
- _vm->_varStore->setVar(0, 1);
-}
-
-void MystScriptParser_Myst::opcode_302(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- // Used in Card 4113 (Clock Tower Cog Puzzle)
- // TODO: Fill in Logic
-}
+ uint16 numPages = bookCountPages(var);
-void MystScriptParser_Myst::opcode_303(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- varUnusedCheck(op, var);
-
- // Used for Card 4134 (Dock Facing Marker Switch)
- // Used for Card 4141 (Myst Dock Facing Sea)
- // In the original engine, this opcode stopped Gull Movies if playing,
- // upon card change, but this behavior is now default in this engine.
+ // Add special page
+ if (numPages == 5) {
+ if (var == 100)
+ _globals.redPagesInBook |= 64;
+ else
+ _globals.bluePagesInBook |= 64;
+ }
}
void MystScriptParser_Myst::o_treeCard_exit(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
@@ -3260,48 +3183,10 @@ void MystScriptParser_Myst::o_treeEntry_exit(uint16 op, uint16 var, uint16 argc,
_treeAlcove = 0;
}
-void MystScriptParser_Myst::opcode_306(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- varUnusedCheck(op, var);
-
- // Used for Card 4098 (Cabin Boiler Puzzle)
- // In the original engine, this opcode stopped the Boiler Fire and Meter Needle videos
- // if playing, upon card change, but this behavior is now default in this engine.
-}
-
-void MystScriptParser_Myst::opcode_307(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- varUnusedCheck(op, var);
-
- // Used for Card 4297 (Generator Room Controls)
- if (argc == 0) {
- debugC(kDebugScript, "Opcode %d: Unknown...", op);
- // TODO: Logic for clearing variable?
- } else
- unknown(op, var, argc, argv);
-}
-
-void MystScriptParser_Myst::opcode_308(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- varUnusedCheck(op, var);
+void MystScriptParser_Myst::o_generatorControlRoom_exit(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
+ debugC(kDebugScript, "Opcode %d: Generator room exit", op);
- // Used for Card 4530 (Rocketship Music Sliders)
- // In the original engine, this opcode stopped the Selenitic Book Movie if playing,
- // upon card change, but this behavior is now default in this engine.
-}
-
-void MystScriptParser_Myst::opcode_309(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- varUnusedCheck(op, var);
-
- // Used for Card 4168 (Green D'ni Book Open)
- // In the original engine, this opcode stopped the Green Book Atrus Movies if playing,
- // upon card change, but this behavior is now default in this engine.
-}
-
-void MystScriptParser_Myst::opcode_312(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- varUnusedCheck(op, var);
-
- // Used for Card 4698 (Dock Forechamber Imager)
- // In the original engine, this opcode stopped the Imager Movie if playing,
- // especially the hardcoded Topological Extrusion (Mountain) video,
- // upon card change, but this behavior is now default in this engine.
+ _generatorVoltage = _state.generatorVoltage;
}
} // End of namespace Mohawk
diff --git a/engines/mohawk/myst_stacks/myst.h b/engines/mohawk/myst_stacks/myst.h
index 0c70ca6db0..fcce05b447 100644
--- a/engines/mohawk/myst_stacks/myst.h
+++ b/engines/mohawk/myst_stacks/myst.h
@@ -55,7 +55,6 @@ private:
void libraryBookcaseTransform_run();
void generatorControlRoom_run();
void opcode_212_run();
- void opcode_212_disable();
void libraryCombinationBook_run();
void clockWheel_run();
void matchBurn_run();
@@ -145,7 +144,7 @@ private:
DECLARE_OPCODE(o_observatoryChangeSettingStop);
DECLARE_OPCODE(o_observatoryYearChangeStart);
DECLARE_OPCODE(o_dockVaultForceClose);
- DECLARE_OPCODE(opcode_199);
+ DECLARE_OPCODE(o_imagerEraseStop);
DECLARE_OPCODE(o_libraryBook_init);
DECLARE_OPCODE(o_courtyardBox_init);
@@ -169,17 +168,11 @@ private:
DECLARE_OPCODE(o_greenBook_init);
DECLARE_OPCODE(opcode_222);
- DECLARE_OPCODE(opcode_300);
- DECLARE_OPCODE(opcode_301);
- DECLARE_OPCODE(opcode_302);
- DECLARE_OPCODE(opcode_303);
+ DECLARE_OPCODE(o_bookAddSpecialPage_exit);
DECLARE_OPCODE(o_treeCard_exit);
DECLARE_OPCODE(o_treeEntry_exit);
- DECLARE_OPCODE(opcode_306);
- DECLARE_OPCODE(opcode_307);
- DECLARE_OPCODE(opcode_308);
- DECLARE_OPCODE(opcode_309);
- DECLARE_OPCODE(opcode_312);
+ DECLARE_OPCODE(o_generatorControlRoom_exit);
+
MystGameState::Myst &_state;