aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/mohawk/myst.cpp30
-rw-r--r--engines/mohawk/myst.h4
-rw-r--r--engines/mohawk/myst_saveload.cpp278
-rw-r--r--engines/mohawk/myst_saveload.h50
-rw-r--r--engines/mohawk/myst_scripts.cpp17
-rw-r--r--engines/mohawk/myst_scripts.h3
-rw-r--r--engines/mohawk/myst_stacks/channelwood.cpp70
-rw-r--r--engines/mohawk/myst_stacks/channelwood.h2
-rw-r--r--engines/mohawk/myst_stacks/dni.cpp6
-rw-r--r--engines/mohawk/myst_stacks/dni.h2
-rw-r--r--engines/mohawk/myst_stacks/intro.cpp2
-rw-r--r--engines/mohawk/myst_stacks/mechanical.cpp26
-rw-r--r--engines/mohawk/myst_stacks/mechanical.h2
-rw-r--r--engines/mohawk/myst_stacks/myst.cpp676
-rw-r--r--engines/mohawk/myst_stacks/myst.h2
-rw-r--r--engines/mohawk/myst_stacks/selenitic.cpp176
-rw-r--r--engines/mohawk/myst_stacks/selenitic.h2
-rw-r--r--engines/mohawk/myst_stacks/stoneship.cpp10
-rw-r--r--engines/mohawk/myst_stacks/stoneship.h2
19 files changed, 624 insertions, 736 deletions
diff --git a/engines/mohawk/myst.cpp b/engines/mohawk/myst.cpp
index 0a4f127138..5ce47848d1 100644
--- a/engines/mohawk/myst.cpp
+++ b/engines/mohawk/myst.cpp
@@ -87,7 +87,7 @@ MohawkEngine_Myst::MohawkEngine_Myst(OSystem *syst, const MohawkGameDescription
_console = NULL;
_scriptParser = NULL;
_varStore = NULL;
- _saveLoad = NULL;
+ _gameState = NULL;
_loadDialog = NULL;
_optionsDialog = NULL;
@@ -116,7 +116,7 @@ MohawkEngine_Myst::~MohawkEngine_Myst() {
delete _console;
delete _scriptParser;
delete _varStore;
- delete _saveLoad;
+ delete _gameState;
delete _loadDialog;
delete _optionsDialog;
delete _prevStack;
@@ -255,7 +255,7 @@ Common::Error MohawkEngine_Myst::run() {
_gfx = new MystGraphics(this);
_console = new MystConsole(this);
_varStore = new MystVar(this);
- _saveLoad = new MystSaveLoad(this, _saveFileMan);
+ _gameState = new MystGameState(this, _saveFileMan);
_loadDialog = new GUI::SaveLoadChooser(_("Load game:"), _("Load"));
_loadDialog->setSaveMode(false);
_optionsDialog = new MystOptionsDialog(this);
@@ -266,10 +266,10 @@ Common::Error MohawkEngine_Myst::run() {
// Load game from launcher/command line if requested
if (ConfMan.hasKey("save_slot") && canLoadGameStateCurrently()) {
uint32 gameToLoad = ConfMan.getInt("save_slot");
- Common::StringArray savedGamesList = _saveLoad->generateSaveGameList();
+ Common::StringArray savedGamesList = _gameState->generateSaveGameList();
if (gameToLoad > savedGamesList.size())
error ("Could not find saved game");
- _saveLoad->loadGame(savedGamesList[gameToLoad]);
+ _gameState->load(savedGamesList[gameToLoad]);
} else {
// Start us on the first stack.
if (getGameType() == GType_MAKINGOF)
@@ -390,7 +390,7 @@ void MohawkEngine_Myst::changeToStack(uint16 stack) {
switch (_curStack) {
case kChannelwoodStack:
- _saveLoad->_v->globals.currentAge = 4;
+ _gameState->_globals.currentAge = 4;
_scriptParser = new MystScriptParser_Channelwood(this);
break;
case kCreditsStack:
@@ -400,7 +400,7 @@ void MohawkEngine_Myst::changeToStack(uint16 stack) {
_scriptParser = new MystScriptParser_Demo(this);
break;
case kDniStack:
- _saveLoad->_v->globals.currentAge = 6;
+ _gameState->_globals.currentAge = 6;
_scriptParser = new MystScriptParser_Dni(this);
break;
case kIntroStack:
@@ -410,25 +410,25 @@ void MohawkEngine_Myst::changeToStack(uint16 stack) {
_scriptParser = new MystScriptParser_MakingOf(this);
break;
case kMechanicalStack:
- _saveLoad->_v->globals.currentAge = 3;
+ _gameState->_globals.currentAge = 3;
_scriptParser = new MystScriptParser_Mechanical(this);
break;
case kMystStack:
- _saveLoad->_v->globals.currentAge = 2;
+ _gameState->_globals.currentAge = 2;
_scriptParser = new MystScriptParser_Myst(this);
break;
case kDemoPreviewStack:
_scriptParser = new MystScriptParser_Preview(this);
break;
case kSeleniticStack:
- _saveLoad->_v->globals.currentAge = 0;
+ _gameState->_globals.currentAge = 0;
_scriptParser = new MystScriptParser_Selenitic(this);
break;
case kDemoSlidesStack:
_scriptParser = new MystScriptParser_Slides(this);
break;
case kStoneshipStack:
- _saveLoad->_v->globals.currentAge = 1;
+ _gameState->_globals.currentAge = 1;
_scriptParser = new MystScriptParser_Stoneship(this);
break;
default:
@@ -1069,19 +1069,19 @@ void MohawkEngine_Myst::runLoadDialog() {
}
Common::Error MohawkEngine_Myst::loadGameState(int slot) {
- if (_saveLoad->loadGame(_saveLoad->generateSaveGameList()[slot]))
+ if (_gameState->load(_gameState->generateSaveGameList()[slot]))
return Common::kNoError;
return Common::kUnknownError;
}
Common::Error MohawkEngine_Myst::saveGameState(int slot, const char *desc) {
- Common::StringArray saveList = _saveLoad->generateSaveGameList();
+ Common::StringArray saveList = _gameState->generateSaveGameList();
if ((uint)slot < saveList.size())
- _saveLoad->deleteSave(saveList[slot]);
+ _gameState->deleteSave(saveList[slot]);
- return _saveLoad->saveGame(Common::String(desc)) ? Common::kNoError : Common::kUnknownError;
+ return _gameState->save(Common::String(desc)) ? Common::kNoError : Common::kUnknownError;
}
bool MohawkEngine_Myst::canLoadGameStateCurrently() {
diff --git a/engines/mohawk/myst.h b/engines/mohawk/myst.h
index fb42938ec3..d7a6528f68 100644
--- a/engines/mohawk/myst.h
+++ b/engines/mohawk/myst.h
@@ -43,7 +43,7 @@ class VideoManager;
class MystGraphics;
class MystScriptParser;
class MystConsole;
-class MystSaveLoad;
+class MystGameState;
class MystOptionsDialog;
class MystResource;
class MystResourceType8;
@@ -172,7 +172,7 @@ public:
MystView _view;
MystGraphics *_gfx;
- MystSaveLoad *_saveLoad;
+ MystGameState *_gameState;
MystScriptParser *_scriptParser;
Common::Array<MystResource*> _resources;
MystResource *_dragResource;
diff --git a/engines/mohawk/myst_saveload.cpp b/engines/mohawk/myst_saveload.cpp
index b99d020449..6496693592 100644
--- a/engines/mohawk/myst_saveload.cpp
+++ b/engines/mohawk/myst_saveload.cpp
@@ -32,39 +32,45 @@
namespace Mohawk {
-MystSaveLoad::MystSaveLoad(MohawkEngine_Myst *vm, Common::SaveFileManager *saveFileMan) : _vm(vm), _saveFileMan(saveFileMan) {
- _v = new MystVariables();
-
+MystGameState::MystGameState(MohawkEngine_Myst *vm, Common::SaveFileManager *saveFileMan) : _vm(vm), _saveFileMan(saveFileMan) {
// Most of the variables are zero at game start.
- _v->globals.u0 = 2;
+ memset(&_globals, 0, sizeof(_globals));
+ memset(&_myst, 0, sizeof(_myst));
+ memset(&_channelwood, 0, sizeof(_channelwood));
+ memset(&_mechanical, 0, sizeof(_mechanical));
+ memset(&_selenitic, 0, sizeof(_selenitic));
+ memset(&_stoneship, 0, sizeof(_stoneship));
+ memset(&_dni, 0, sizeof(_dni));
+
+ // Unknown
+ _globals.u0 = 2;
// Current Age / Stack - Start in Myst
- _v->globals.currentAge = 7;
- _v->globals.u1 = 1;
+ _globals.currentAge = 7;
+ _globals.u1 = 1;
// Library Bookcase Door - Default to Up
- _v->myst.libraryBookcaseDoor = 1;
+ _myst.libraryBookcaseDoor = 1;
// Dock Imager Numeric Selection - Default to 67
- _v->myst.imagerSelection = 67;
+ _myst.imagerSelection = 67;
// Dock Imager Active - Default to Active
- _v->myst.imagerActive = 1;
+ _myst.imagerActive = 1;
// Stellar Observatory Lights - Default to On
- _v->myst.observatoryLights = 1;
+ _myst.observatoryLights = 1;
// Lighthouse Trapdoor State - Default to Locked
- _v->stoneship.trapdoorState = 2;
+ _stoneship.trapdoorState = 2;
// Lighthouse Chest Water State - Default to Full
- _v->stoneship.chestWaterState = 1;
+ _stoneship.chestWaterState = 1;
}
-MystSaveLoad::~MystSaveLoad() {
- delete _v;
+MystGameState::~MystGameState() {
}
-Common::StringArray MystSaveLoad::generateSaveGameList() {
+Common::StringArray MystGameState::generateSaveGameList() {
return _saveFileMan->listSavefiles("*.mys");
}
-bool MystSaveLoad::loadGame(const Common::String &filename) {
+bool MystGameState::load(const Common::String &filename) {
Common::InSaveFile *loadFile = _saveFileMan->openForLoading(filename);
if (!loadFile)
return false;
@@ -88,13 +94,13 @@ bool MystSaveLoad::loadGame(const Common::String &filename) {
_vm->changeToStack(kIntroStack);
// Set our default cursor
- if (_v->globals.heldPage == 0 || _v->globals.heldPage > 13)
+ if (_globals.heldPage == 0 || _globals.heldPage > 13)
_vm->setMainCursor(kDefaultMystCursor);
- else if (_v->globals.heldPage < 7)
+ else if (_globals.heldPage < 7)
_vm->setMainCursor(kBluePageCursor);
- else if (_v->globals.heldPage < 13)
+ else if (_globals.heldPage < 13)
_vm->setMainCursor(kRedPageCursor);
- else // if (_v->globals.heldPage == 13)
+ else // if (globals.heldPage == 13)
_vm->setMainCursor(kWhitePageCursor);
// Set us to the linking book
@@ -103,7 +109,7 @@ bool MystSaveLoad::loadGame(const Common::String &filename) {
return true;
}
-bool MystSaveLoad::saveGame(const Common::String &fname) {
+bool MystGameState::save(const Common::String &fname) {
Common::String filename(fname);
// Make sure we have the right extension
if (!filename.hasSuffix(".mys") && !filename.hasSuffix(".MYS"))
@@ -123,95 +129,95 @@ bool MystSaveLoad::saveGame(const Common::String &fname) {
return true;
}
-void MystSaveLoad::syncGameState(Common::Serializer &s, bool isME) {
+void MystGameState::syncGameState(Common::Serializer &s, bool isME) {
// Globals first
- s.syncAsUint16LE(_v->globals.u0);
- s.syncAsUint16LE(_v->globals.currentAge);
- s.syncAsUint16LE(_v->globals.heldPage);
- s.syncAsUint16LE(_v->globals.u1);
- s.syncAsUint16LE(_v->globals.transitions);
- s.syncAsUint16LE(_v->globals.ending);
- s.syncAsUint16LE(_v->globals.redPagesInBook);
- s.syncAsUint16LE(_v->globals.bluePagesInBook);
+ s.syncAsUint16LE(_globals.u0);
+ s.syncAsUint16LE(_globals.currentAge);
+ s.syncAsUint16LE(_globals.heldPage);
+ s.syncAsUint16LE(_globals.u1);
+ s.syncAsUint16LE(_globals.transitions);
+ s.syncAsUint16LE(_globals.ending);
+ s.syncAsUint16LE(_globals.redPagesInBook);
+ s.syncAsUint16LE(_globals.bluePagesInBook);
// Onto Myst
if (isME) {
- s.syncAsUint32LE(_v->myst.cabinMarkerSwitch);
- s.syncAsUint32LE(_v->myst.clockTowerMarkerSwitch);
- s.syncAsUint32LE(_v->myst.dockMarkerSwitch);
- s.syncAsUint32LE(_v->myst.poolMarkerSwitch);
- s.syncAsUint32LE(_v->myst.gearsMarkerSwitch);
- s.syncAsUint32LE(_v->myst.generatorMarkerSwitch);
- s.syncAsUint32LE(_v->myst.observatoryMarkerSwitch);
- s.syncAsUint32LE(_v->myst.rocketshipMarkerSwitch);
+ s.syncAsUint32LE(_myst.cabinMarkerSwitch);
+ s.syncAsUint32LE(_myst.clockTowerMarkerSwitch);
+ s.syncAsUint32LE(_myst.dockMarkerSwitch);
+ s.syncAsUint32LE(_myst.poolMarkerSwitch);
+ s.syncAsUint32LE(_myst.gearsMarkerSwitch);
+ s.syncAsUint32LE(_myst.generatorMarkerSwitch);
+ s.syncAsUint32LE(_myst.observatoryMarkerSwitch);
+ s.syncAsUint32LE(_myst.rocketshipMarkerSwitch);
} else {
- s.syncAsByte(_v->myst.cabinMarkerSwitch);
- s.syncAsByte(_v->myst.clockTowerMarkerSwitch);
- s.syncAsByte(_v->myst.dockMarkerSwitch);
- s.syncAsByte(_v->myst.poolMarkerSwitch);
- s.syncAsByte(_v->myst.gearsMarkerSwitch);
- s.syncAsByte(_v->myst.generatorMarkerSwitch);
- s.syncAsByte(_v->myst.observatoryMarkerSwitch);
- s.syncAsByte(_v->myst.rocketshipMarkerSwitch);
+ s.syncAsByte(_myst.cabinMarkerSwitch);
+ s.syncAsByte(_myst.clockTowerMarkerSwitch);
+ s.syncAsByte(_myst.dockMarkerSwitch);
+ s.syncAsByte(_myst.poolMarkerSwitch);
+ s.syncAsByte(_myst.gearsMarkerSwitch);
+ s.syncAsByte(_myst.generatorMarkerSwitch);
+ s.syncAsByte(_myst.observatoryMarkerSwitch);
+ s.syncAsByte(_myst.rocketshipMarkerSwitch);
}
- s.syncAsUint16LE(_v->myst.greenBookOpenedBefore);
- s.syncAsUint16LE(_v->myst.shipFloating);
- s.syncAsUint16LE(_v->myst.cabinValvePosition);
- s.syncAsUint16LE(_v->myst.clockTowerHourPosition);
- s.syncAsUint16LE(_v->myst.clockTowerMinutePosition);
- s.syncAsUint16LE(_v->myst.gearsOpen);
- s.syncAsUint16LE(_v->myst.clockTowerBridgeOpen);
- s.syncAsUint16LE(_v->myst.generatorBreakers);
- s.syncAsUint16LE(_v->myst.generatorButtons);
- s.syncAsUint16LE(_v->myst.generatorVoltage);
- s.syncAsUint16LE(_v->myst.libraryBookcaseDoor);
- s.syncAsUint16LE(_v->myst.imagerSelection);
- s.syncAsUint16LE(_v->myst.imagerActive);
- s.syncAsUint16LE(_v->myst.imagerWaterErased);
- s.syncAsUint16LE(_v->myst.imagerMountainErased);
- s.syncAsUint16LE(_v->myst.imagerAtrusErased);
- s.syncAsUint16LE(_v->myst.imagerMarkerErased);
- s.syncAsUint16LE(_v->myst.towerRotationAngle);
- s.syncAsUint16LE(_v->myst.courtyardImageBoxes);
- s.syncAsUint16LE(_v->myst.cabinPilotLightLit);
- s.syncAsUint16LE(_v->myst.observatoryDaySetting);
- s.syncAsUint16LE(_v->myst.observatoryLights);
- s.syncAsUint16LE(_v->myst.observatoryMonthSetting);
- s.syncAsUint16LE(_v->myst.observatoryTimeSetting);
- s.syncAsUint16LE(_v->myst.observatoryYearSetting);
- s.syncAsUint16LE(_v->myst.observatoryDayTarget);
- s.syncAsUint16LE(_v->myst.observatoryMonthTarget);
- s.syncAsUint16LE(_v->myst.observatoryTimeTarget);
- s.syncAsUint16LE(_v->myst.observatoryYearTarget);
- s.syncAsUint16LE(_v->myst.cabinSafeCombination);
- s.syncAsUint16LE(_v->myst.treePosition);
- s.syncAsUint32LE(_v->myst.treeLastMoveTime);
+ s.syncAsUint16LE(_myst.greenBookOpenedBefore);
+ s.syncAsUint16LE(_myst.shipFloating);
+ s.syncAsUint16LE(_myst.cabinValvePosition);
+ s.syncAsUint16LE(_myst.clockTowerHourPosition);
+ s.syncAsUint16LE(_myst.clockTowerMinutePosition);
+ s.syncAsUint16LE(_myst.gearsOpen);
+ s.syncAsUint16LE(_myst.clockTowerBridgeOpen);
+ s.syncAsUint16LE(_myst.generatorBreakers);
+ s.syncAsUint16LE(_myst.generatorButtons);
+ s.syncAsUint16LE(_myst.generatorVoltage);
+ s.syncAsUint16LE(_myst.libraryBookcaseDoor);
+ s.syncAsUint16LE(_myst.imagerSelection);
+ s.syncAsUint16LE(_myst.imagerActive);
+ s.syncAsUint16LE(_myst.imagerWaterErased);
+ s.syncAsUint16LE(_myst.imagerMountainErased);
+ s.syncAsUint16LE(_myst.imagerAtrusErased);
+ s.syncAsUint16LE(_myst.imagerMarkerErased);
+ s.syncAsUint16LE(_myst.towerRotationAngle);
+ s.syncAsUint16LE(_myst.courtyardImageBoxes);
+ s.syncAsUint16LE(_myst.cabinPilotLightLit);
+ s.syncAsUint16LE(_myst.observatoryDaySetting);
+ s.syncAsUint16LE(_myst.observatoryLights);
+ s.syncAsUint16LE(_myst.observatoryMonthSetting);
+ s.syncAsUint16LE(_myst.observatoryTimeSetting);
+ s.syncAsUint16LE(_myst.observatoryYearSetting);
+ s.syncAsUint16LE(_myst.observatoryDayTarget);
+ s.syncAsUint16LE(_myst.observatoryMonthTarget);
+ s.syncAsUint16LE(_myst.observatoryTimeTarget);
+ s.syncAsUint16LE(_myst.observatoryYearTarget);
+ s.syncAsUint16LE(_myst.cabinSafeCombination);
+ s.syncAsUint16LE(_myst.treePosition);
+ s.syncAsUint32LE(_myst.treeLastMoveTime);
for (int i = 0; i < 5; i++)
- s.syncAsUint16LE(_v->myst.rocketSliderPosition[i]);
+ s.syncAsUint16LE(_myst.rocketSliderPosition[i]);
- s.syncAsUint16LE(_v->myst.u6);
- s.syncAsUint16LE(_v->myst.u7);
- s.syncAsUint16LE(_v->myst.u8);
- s.syncAsUint16LE(_v->myst.u9);
+ s.syncAsUint16LE(_myst.u6);
+ s.syncAsUint16LE(_myst.u7);
+ s.syncAsUint16LE(_myst.u8);
+ s.syncAsUint16LE(_myst.u9);
// Channelwood
if (isME) {
- s.syncAsUint32LE(_v->channelwood.waterPumpBridgeState);
- s.syncAsUint32LE(_v->channelwood.elevatorState);
- s.syncAsUint32LE(_v->channelwood.stairsLowerDoorState);
- s.syncAsUint32LE(_v->channelwood.pipeState);
+ s.syncAsUint32LE(_channelwood.waterPumpBridgeState);
+ s.syncAsUint32LE(_channelwood.elevatorState);
+ s.syncAsUint32LE(_channelwood.stairsLowerDoorState);
+ s.syncAsUint32LE(_channelwood.pipeState);
} else {
- s.syncAsByte(_v->channelwood.waterPumpBridgeState);
- s.syncAsByte(_v->channelwood.elevatorState);
- s.syncAsByte(_v->channelwood.stairsLowerDoorState);
- s.syncAsByte(_v->channelwood.pipeState);
+ s.syncAsByte(_channelwood.waterPumpBridgeState);
+ s.syncAsByte(_channelwood.elevatorState);
+ s.syncAsByte(_channelwood.stairsLowerDoorState);
+ s.syncAsByte(_channelwood.pipeState);
}
- s.syncAsUint16LE(_v->channelwood.waterValveStates);
- s.syncAsUint16LE(_v->channelwood.holoprojectorSelection);
- s.syncAsUint16LE(_v->channelwood.stairsUpperDoorState);
+ s.syncAsUint16LE(_channelwood.waterValveStates);
+ s.syncAsUint16LE(_channelwood.holoprojectorSelection);
+ s.syncAsUint16LE(_channelwood.stairsUpperDoorState);
if (isME)
s.skip(4);
@@ -220,93 +226,93 @@ void MystSaveLoad::syncGameState(Common::Serializer &s, bool isME) {
// Mechanical
- s.syncAsUint16LE(_v->mechanical.achenarPanelState);
- s.syncAsUint16LE(_v->mechanical.sirrusPanelState);
- s.syncAsUint16LE(_v->mechanical.staircaseState);
- s.syncAsUint16LE(_v->mechanical.elevatorRotation);
+ s.syncAsUint16LE(_mechanical.achenarPanelState);
+ s.syncAsUint16LE(_mechanical.sirrusPanelState);
+ s.syncAsUint16LE(_mechanical.staircaseState);
+ s.syncAsUint16LE(_mechanical.elevatorRotation);
for (int i = 0; i < 4; i++)
- s.syncAsUint16LE(_v->mechanical.codeShape[i]);
+ s.syncAsUint16LE(_mechanical.codeShape[i]);
// Selenitic
if (isME) {
- s.syncAsUint32LE(_v->selenitic.emitterEnabledWater);
- s.syncAsUint32LE(_v->selenitic.emitterEnabledVolcano);
- s.syncAsUint32LE(_v->selenitic.emitterEnabledClock);
- s.syncAsUint32LE(_v->selenitic.emitterEnabledCrystal);
- s.syncAsUint32LE(_v->selenitic.emitterEnabledWind);
- s.syncAsUint32LE(_v->selenitic.soundReceiverOpened);
- s.syncAsUint32LE(_v->selenitic.tunnelLightsSwitchedOn);
+ s.syncAsUint32LE(_selenitic.emitterEnabledWater);
+ s.syncAsUint32LE(_selenitic.emitterEnabledVolcano);
+ s.syncAsUint32LE(_selenitic.emitterEnabledClock);
+ s.syncAsUint32LE(_selenitic.emitterEnabledCrystal);
+ s.syncAsUint32LE(_selenitic.emitterEnabledWind);
+ s.syncAsUint32LE(_selenitic.soundReceiverOpened);
+ s.syncAsUint32LE(_selenitic.tunnelLightsSwitchedOn);
} else {
- s.syncAsByte(_v->selenitic.emitterEnabledWater);
- s.syncAsByte(_v->selenitic.emitterEnabledVolcano);
- s.syncAsByte(_v->selenitic.emitterEnabledClock);
- s.syncAsByte(_v->selenitic.emitterEnabledCrystal);
- s.syncAsByte(_v->selenitic.emitterEnabledWind);
- s.syncAsByte(_v->selenitic.soundReceiverOpened);
- s.syncAsByte(_v->selenitic.tunnelLightsSwitchedOn);
+ s.syncAsByte(_selenitic.emitterEnabledWater);
+ s.syncAsByte(_selenitic.emitterEnabledVolcano);
+ s.syncAsByte(_selenitic.emitterEnabledClock);
+ s.syncAsByte(_selenitic.emitterEnabledCrystal);
+ s.syncAsByte(_selenitic.emitterEnabledWind);
+ s.syncAsByte(_selenitic.soundReceiverOpened);
+ s.syncAsByte(_selenitic.tunnelLightsSwitchedOn);
}
- s.syncAsUint16LE(_v->selenitic.soundReceiverCurrentSource);
+ s.syncAsUint16LE(_selenitic.soundReceiverCurrentSource);
for (byte i = 0; i < 5; i++)
- s.syncAsUint16LE(_v->selenitic.soundReceiverPositions[i]);
+ s.syncAsUint16LE(_selenitic.soundReceiverPositions[i]);
for (byte i = 0; i < 5; i++)
- s.syncAsUint16LE(_v->selenitic.soundLockSliderPositions[i]);
+ s.syncAsUint16LE(_selenitic.soundLockSliderPositions[i]);
// Stoneship
if (isME) {
- s.syncAsUint16LE(_v->stoneship.lightState);
- s.syncAsUint16LE(_v->stoneship.u0);
- s.syncAsUint16LE(_v->stoneship.u1);
+ s.syncAsUint16LE(_stoneship.lightState);
+ s.syncAsUint16LE(_stoneship.u0);
+ s.syncAsUint16LE(_stoneship.u1);
} else {
- s.syncAsByte(_v->stoneship.lightState);
- s.syncAsByte(_v->stoneship.u0);
- s.syncAsByte(_v->stoneship.u1);
+ s.syncAsByte(_stoneship.lightState);
+ s.syncAsByte(_stoneship.u0);
+ s.syncAsByte(_stoneship.u1);
}
- s.syncAsUint16LE(_v->stoneship.pumpState);
- s.syncAsUint16LE(_v->stoneship.trapdoorState);
- s.syncAsUint16LE(_v->stoneship.chestWaterState);
- s.syncAsUint16LE(_v->stoneship.chestValveState);
- s.syncAsUint16LE(_v->stoneship.chestOpenState);
- s.syncAsUint16LE(_v->stoneship.trapdoorKeyState);
+ s.syncAsUint16LE(_stoneship.pumpState);
+ s.syncAsUint16LE(_stoneship.trapdoorState);
+ s.syncAsUint16LE(_stoneship.chestWaterState);
+ s.syncAsUint16LE(_stoneship.chestValveState);
+ s.syncAsUint16LE(_stoneship.chestOpenState);
+ s.syncAsUint16LE(_stoneship.trapdoorKeyState);
for (int i = 0; i < 5; i++)
- s.syncAsUint16LE(_v->stoneship.generatorPowerLevel[i]);
+ s.syncAsUint16LE(_stoneship.generatorPowerLevel[i]);
// D'ni
- s.syncAsUint16LE(_v->dni.outcomeState);
+ s.syncAsUint16LE(_dni.outcomeState);
// Reading unknown region...
// When Zero Value regions are included, these are 5 blocks of
// 41 uint16 values.
for (byte i = 0; i < 31; i++)
- s.syncAsUint16LE(_v->unknownMyst[i]);
+ s.syncAsUint16LE(unknownMyst[i]);
s.skip(20);
for (byte i = 0; i < 37; i++)
- s.syncAsUint16LE(_v->unknownChannelwood[i]);
+ s.syncAsUint16LE(unknownChannelwood[i]);
s.skip(8);
for (byte i = 0; i < 18; i++)
- s.syncAsUint16LE(_v->unknownMech[i]);
+ s.syncAsUint16LE(unknownMech[i]);
s.skip(46);
for (byte i = 0; i < 30; i++)
- s.syncAsUint16LE(_v->unknownSelenitic[i]);
+ s.syncAsUint16LE(unknownSelenitic[i]);
s.skip(22);
for (byte i = 0; i < 22; i++)
- s.syncAsUint16LE(_v->unknownStoneship[i]);
+ s.syncAsUint16LE(unknownStoneship[i]);
s.skip(38);
@@ -314,7 +320,7 @@ void MystSaveLoad::syncGameState(Common::Serializer &s, bool isME) {
warning("Unexpected File Position 0x%03X At End of Save/Load", s.bytesSynced());
}
-void MystSaveLoad::deleteSave(const Common::String &saveName) {
+void MystGameState::deleteSave(const Common::String &saveName) {
debugC(kDebugSaveLoad, "Deleting save file \'%s\'", saveName.c_str());
_saveFileMan->removeSavefile(saveName.c_str());
}
diff --git a/engines/mohawk/myst_saveload.h b/engines/mohawk/myst_saveload.h
index b8f0bd739f..0f90d5093c 100644
--- a/engines/mohawk/myst_saveload.h
+++ b/engines/mohawk/myst_saveload.h
@@ -36,13 +36,17 @@ namespace Common {
namespace Mohawk {
-// These are left as uint16 currently, rather than
-// being changed to bool etc. to save memory.
-// This is because the exact structure
-// is subject to change and the code to implement
-// opcodes to access them is simpler this way..
-struct MystVariables {
- MystVariables() { memset(this, 0, sizeof(MystVariables)); }
+class MohawkEngine_Myst;
+
+class MystGameState {
+public:
+ MystGameState(MohawkEngine_Myst*, Common::SaveFileManager*);
+ ~MystGameState();
+
+ Common::StringArray generateSaveGameList();
+ bool load(const Common::String &);
+ bool save(const Common::String &);
+ void deleteSave(const Common::String &);
/* 8 Game Global Variables :
0 = Unknown - Fixed at 2
@@ -63,7 +67,7 @@ struct MystVariables {
uint16 ending;
uint16 redPagesInBook;
uint16 bluePagesInBook;
- } globals;
+ } _globals;
/* 50 Myst Specific Variables :
0 = Marker Switch Near Cabin
@@ -163,7 +167,7 @@ struct MystVariables {
uint16 u7;
uint16 u8;
uint16 u9;
- } myst;
+ } _myst;
/* 7 Channelwood Specific Variables :
0 = Water Pump Bridge State
@@ -182,7 +186,7 @@ struct MystVariables {
uint16 waterValveStates;
uint16 holoprojectorSelection;
uint16 stairsUpperDoorState;
- } channelwood;
+ } _channelwood;
/* 8 Mech Specific Variables :
0 = Achenar's Room Secret Panel State
@@ -200,7 +204,7 @@ struct MystVariables {
uint16 staircaseState;
uint16 elevatorRotation;
uint16 codeShape[4];
- } mechanical;
+ } _mechanical;
/* 18 Selenitic Specific Variables :
0 = Sound Pickup At Water Pool
@@ -233,14 +237,14 @@ struct MystVariables {
uint16 soundReceiverCurrentSource;
uint16 soundReceiverPositions[5];
uint16 soundLockSliderPositions[5];
- } selenitic;
+ } _selenitic;
/* 14 Stoneship Specific Variables :
0 = Light State
1 = Unknown #1
2 = Unknown #2
3 = Water Pump State
- 4 = Lighthouse Trapdoor State
+ 4 = Lighthouse Trapdoor St_v->ate
5 = Lighthouse Chest Water State
6 = Lighthouse Chest Valve State
7 = Lighthouse Chest Open State
@@ -262,14 +266,14 @@ struct MystVariables {
uint16 chestOpenState;
uint16 trapdoorKeyState;
uint16 generatorPowerLevel[5];
- } stoneship;
+ } _stoneship;
/* 1 Dunny Specific Variable :
0 = Outcome State
*/
struct Dni {
uint16 outcomeState;
- } dni;
+ } _dni;
// The values in these regions seem to be lists of resource IDs
// which correspond to VIEW resources i.e. cards
@@ -282,23 +286,9 @@ struct MystVariables {
uint16 unknownSelenitic[30];
uint16 unknownStoneship[22];
-};
-
-class MohawkEngine_Myst;
-
-class MystSaveLoad {
-public:
- MystSaveLoad(MohawkEngine_Myst*, Common::SaveFileManager*);
- ~MystSaveLoad();
-
- Common::StringArray generateSaveGameList();
- bool loadGame(const Common::String &);
- bool saveGame(const Common::String &);
- void deleteSave(const Common::String &);
+private:
void syncGameState(Common::Serializer &s, bool isME);
- MystVariables *_v;
-private:
MohawkEngine_Myst *_vm;
Common::SaveFileManager *_saveFileMan;
};
diff --git a/engines/mohawk/myst_scripts.cpp b/engines/mohawk/myst_scripts.cpp
index bf1aadcea0..f463014e61 100644
--- a/engines/mohawk/myst_scripts.cpp
+++ b/engines/mohawk/myst_scripts.cpp
@@ -27,7 +27,6 @@
#include "mohawk/myst.h"
#include "mohawk/graphics.h"
#include "mohawk/myst_areas.h"
-#include "mohawk/myst_saveload.h"
#include "mohawk/myst_scripts.h"
#include "mohawk/sound.h"
#include "mohawk/video.h"
@@ -79,7 +78,9 @@ const uint16 MystScriptParser::_startCard[11] = {
// NOTE: Credits Start Card is 10000
-MystScriptParser::MystScriptParser(MohawkEngine_Myst *vm) : _vm(vm) {
+MystScriptParser::MystScriptParser(MohawkEngine_Myst *vm) :
+ _vm(vm),
+ _globals(vm->_gameState->_globals) {
setupCommonOpcodes();
_invokingResource = NULL;
_savedCardId = 0;
@@ -225,13 +226,11 @@ MystScript MystScriptParser::readScript(Common::SeekableReadStream *stream, Myst
}
uint16 MystScriptParser::getVar(uint16 var) {
- MystVariables::Globals &globals = _vm->_saveLoad->_v->globals;
-
switch(var) {
case 105:
return _tempVar;
case 106:
- return globals.ending;
+ return _globals.ending;
default:
warning("Unimplemented var getter 0x%02x (%d)", var, var);
return _vm->_varStore->getVar(var);
@@ -333,22 +332,20 @@ void MystScriptParser::o_changeCardSwitch(uint16 op, uint16 var, uint16 argc, ui
}
void MystScriptParser::o_takePage(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- MystVariables::Globals &globals = _vm->_saveLoad->_v->globals;
-
uint16 cursorId = argv[0];
- uint16 oldPage = globals.heldPage;
+ uint16 oldPage = _globals.heldPage;
debugC(kDebugScript, "Opcode %d: takePage Var %d CursorId %d", op, var, cursorId);
// Take / drop page
toggleVar(var);
- if (oldPage != globals.heldPage) {
+ if (oldPage != _globals.heldPage) {
_vm->_cursor->hideCursor();
_vm->redrawArea(var);
// Set new cursor
- if (globals.heldPage)
+ if (_globals.heldPage)
_vm->setMainCursor(cursorId);
else
_vm->setMainCursor(kDefaultMystCursor);
diff --git a/engines/mohawk/myst_scripts.h b/engines/mohawk/myst_scripts.h
index f16c4fcbd9..96e10293ef 100644
--- a/engines/mohawk/myst_scripts.h
+++ b/engines/mohawk/myst_scripts.h
@@ -30,6 +30,8 @@
#include "common/scummsys.h"
#include "common/util.h"
+#include "mohawk/myst_saveload.h"
+
namespace Mohawk {
#define DECLARE_OPCODE(x) void x(uint16 op, uint16 var, uint16 argc, uint16 *argv)
@@ -124,6 +126,7 @@ public:
protected:
MohawkEngine_Myst *_vm;
+ MystGameState::Globals &_globals;
typedef void (MystScriptParser::*OpcodeProcMyst)(uint16 op, uint16 var, uint16 argc, uint16* argv);
diff --git a/engines/mohawk/myst_stacks/channelwood.cpp b/engines/mohawk/myst_stacks/channelwood.cpp
index a43353c441..fff6664cd7 100644
--- a/engines/mohawk/myst_stacks/channelwood.cpp
+++ b/engines/mohawk/myst_stacks/channelwood.cpp
@@ -35,7 +35,8 @@
namespace Mohawk {
-MystScriptParser_Channelwood::MystScriptParser_Channelwood(MohawkEngine_Myst *vm) : MystScriptParser(vm) {
+MystScriptParser_Channelwood::MystScriptParser_Channelwood(MohawkEngine_Myst *vm) :
+ MystScriptParser(vm), _state(vm->_gameState->_channelwood) {
setupOpcodes();
}
@@ -78,74 +79,71 @@ void MystScriptParser_Channelwood::runPersistentScripts() {
}
uint16 MystScriptParser_Channelwood::getVar(uint16 var) {
-// MystVariables::Globals &globals = _vm->_saveLoad->_v->globals;
- MystVariables::Channelwood &channelwood = _vm->_saveLoad->_v->channelwood;
-
switch(var) {
case 1: // Water Pump Bridge Raised
- return channelwood.waterPumpBridgeState;
+ return _state.waterPumpBridgeState;
case 2: // Lower Walkway to Upper Walkway Elevator Raised
- return channelwood.elevatorState;
+ return _state.elevatorState;
case 3: // Water Flowing To Lower Walkway To Upper Walkway Elevator
- return (channelwood.waterValveStates & 0xc0) ? 1 : 0;
+ return (_state.waterValveStates & 0xc0) ? 1 : 0;
case 4: // Water Flowing To Book Room Elevator
- return ((channelwood.waterValveStates & 0xf8) == 0xb0 && channelwood.pipeState) ? 1 : 0;
+ return ((_state.waterValveStates & 0xf8) == 0xb0 && _state.pipeState) ? 1 : 0;
case 5: // Lower Walkway to Upper Walkway Spiral Stair Lower Door State
- return channelwood.stairsLowerDoorState;
+ return _state.stairsLowerDoorState;
case 6: // Pipe Bridge Extended
- return channelwood.pipeState;
+ return _state.pipeState;
case 7: // Water Flowing To Water Pump For Bridge
- return ((channelwood.waterValveStates & 0xe2) == 0xc2 || (channelwood.waterValveStates & 0xf4) == 0xa0) ? 1 : 0;
+ return ((_state.waterValveStates & 0xe2) == 0xc2 || (_state.waterValveStates & 0xf4) == 0xa0) ? 1 : 0;
case 8: // Water Tank Valve
- return (channelwood.waterValveStates & 0x80) ? 1 : 0;
+ return (_state.waterValveStates & 0x80) ? 1 : 0;
case 9: // State of First Water Valve
- return (channelwood.waterValveStates & 0x40) ? 1 : 0;
+ return (_state.waterValveStates & 0x40) ? 1 : 0;
case 10: // State of Second Water Valve
- return (channelwood.waterValveStates & 0x20) ? 1 : 0;
+ return (_state.waterValveStates & 0x20) ? 1 : 0;
case 11: // State of Right Third Water Valve
- return (channelwood.waterValveStates & 0x10) ? 1 : 0;
+ return (_state.waterValveStates & 0x10) ? 1 : 0;
case 12: // State of Right-Right Fourth Water Valve
- return (channelwood.waterValveStates & 0x08) ? 1 : 0;
+ return (_state.waterValveStates & 0x08) ? 1 : 0;
case 13: // State of Right-Left Fourth Water Valve
- return (channelwood.waterValveStates & 0x04) ? 1 : 0;
+ return (_state.waterValveStates & 0x04) ? 1 : 0;
case 14: // State of Left Third Water Valve
- return (channelwood.waterValveStates & 0x02) ? 1 : 0;
+ return (_state.waterValveStates & 0x02) ? 1 : 0;
case 15: // Water Flowing To Lower Walkway To Upper Walkway Elevator
- return ((channelwood.waterValveStates & 0xf8) == 0xb8) ? 1 : 0;
+ return ((_state.waterValveStates & 0xf8) == 0xb8) ? 1 : 0;
case 16: // Channelwood Lower Walkway to Upper Walkway Spiral Stair Upper Door State
- return channelwood.stairsUpperDoorState;
+ return _state.stairsUpperDoorState;
case 17: // Achenar's Holoprojector Selection
- return channelwood.holoprojectorSelection;
+ return _state.holoprojectorSelection;
// case 18: // Sirrus's Room Bed Drawer Open
// return 0;
// return 1;
case 19: // Sound - Water Tank Valve
- return (channelwood.waterValveStates & 0x80) ? 1 : 0;
+ return (_state.waterValveStates & 0x80) ? 1 : 0;
case 20: // Sound - First Water Valve Water Flowing To Left
- return ((channelwood.waterValveStates & 0xc0) == 0x80) ? 1 : 0;
+ return ((_state.waterValveStates & 0xc0) == 0x80) ? 1 : 0;
case 21: // Sound - Second Water Valve Water Flowing To Right
- return ((channelwood.waterValveStates & 0xe0) == 0xa0) ? 1 : 0;
+ return ((_state.waterValveStates & 0xe0) == 0xa0) ? 1 : 0;
case 22: // Sound - Right Third Water Valve Water Flowing To Right
- return ((channelwood.waterValveStates & 0xf0) == 0xb0) ? 1 : 0;
+ return ((_state.waterValveStates & 0xf0) == 0xb0) ? 1 : 0;
case 23: // Sound - Right Third Water Valve Water Flowing To Left
- return ((channelwood.waterValveStates & 0xf0) == 0xa0) ? 1 : 0;
+ return ((_state.waterValveStates & 0xf0) == 0xa0) ? 1 : 0;
case 24: // Sound - Second Water Valve Water Flowing To Left
- return ((channelwood.waterValveStates & 0xe0) == 0xc0) ? 1 : 0;
+ return ((_state.waterValveStates & 0xe0) == 0xc0) ? 1 : 0;
case 25: // Sound - Right-Right Fourth Valve Water Flowing To Left (To Pipe Bridge)
- return ((channelwood.waterValveStates & 0xf8) == 0xb0) ? 1 : 0;
+ return ((_state.waterValveStates & 0xf8) == 0xb0) ? 1 : 0;
case 26: // Sound - Right-Left Fourth Valve Water Flowing To Right (To Pipe Down Tree)
- return ((channelwood.waterValveStates & 0xf4) == 0xa4) ? 1 : 0;
+ return ((_state.waterValveStates & 0xf4) == 0xa4) ? 1 : 0;
case 27: // Sound - Right-Left Fourth Valve Water Flowing To Left (To Pipe Fork)
- return ((channelwood.waterValveStates & 0xf4) == 0xa0) ? 1 : 0;
+ return ((_state.waterValveStates & 0xf4) == 0xa0) ? 1 : 0;
case 28: // Sound - Left Third Water Valve Flowing To Right (To Pipe Fork)
- return ((channelwood.waterValveStates & 0xe2) == 0xc2) ? 1 : 0;
+ return ((_state.waterValveStates & 0xe2) == 0xc2) ? 1 : 0;
case 29: // Sound - Left Third Water Valve Flowing To Left (To Pipe In Water)
- return ((channelwood.waterValveStates & 0xe2) == 0xc0) ? 1 : 0;
+ return ((_state.waterValveStates & 0xe2) == 0xc0) ? 1 : 0;
// case 30: // Temple Door State
// return 0;
// return 1;
case 32: // Sound - Water Flowing in Pipe to Book Room Elevator
- return ((channelwood.waterValveStates & 0xf8) == 0xb0 && channelwood.pipeState) ? 1 : 0;
+ return ((_state.waterValveStates & 0xf8) == 0xb0 && _state.pipeState) ? 1 : 0;
// case 102: // Sirrus's Desk Drawer / Red Page State
// return 0; // Drawer Closed
// return 1; // Drawer Open, Red Page Taken
@@ -159,12 +157,9 @@ uint16 MystScriptParser_Channelwood::getVar(uint16 var) {
}
void MystScriptParser_Channelwood::toggleVar(uint16 var) {
-// MystVariables::Globals &globals = _vm->_saveLoad->_v->globals;
- MystVariables::Channelwood &channelwood = _vm->_saveLoad->_v->channelwood;
-
switch(var) {
case 6: // Pipe Bridge Extended
- channelwood.pipeState ^= 1;
+ _state.pipeState ^= 1;
default:
MystScriptParser::toggleVar(var);
break;
@@ -172,7 +167,6 @@ void MystScriptParser_Channelwood::toggleVar(uint16 var) {
}
bool MystScriptParser_Channelwood::setVarValue(uint16 var, uint16 value) {
-// MystVariables::Channelwood &channelwood = _vm->_saveLoad->_v->channelwood;
bool refresh = false;
switch (var) {
diff --git a/engines/mohawk/myst_stacks/channelwood.h b/engines/mohawk/myst_stacks/channelwood.h
index 2c88f72442..cf1da35baf 100644
--- a/engines/mohawk/myst_stacks/channelwood.h
+++ b/engines/mohawk/myst_stacks/channelwood.h
@@ -71,6 +71,8 @@ private:
DECLARE_OPCODE(opcode_203);
DECLARE_OPCODE(opcode_300);
+
+ MystGameState::Channelwood &_state;
};
} // End of namespace Mohawk
diff --git a/engines/mohawk/myst_stacks/dni.cpp b/engines/mohawk/myst_stacks/dni.cpp
index 9eaf8b1bb3..e14ecc4b90 100644
--- a/engines/mohawk/myst_stacks/dni.cpp
+++ b/engines/mohawk/myst_stacks/dni.cpp
@@ -34,7 +34,8 @@
namespace Mohawk {
-MystScriptParser_Dni::MystScriptParser_Dni(MohawkEngine_Myst *vm) : MystScriptParser(vm) {
+MystScriptParser_Dni::MystScriptParser_Dni(MohawkEngine_Myst *vm) :
+ MystScriptParser(vm), _state(_vm->_gameState->_dni) {
setupOpcodes();
}
@@ -64,9 +65,6 @@ void MystScriptParser_Dni::runPersistentScripts() {
}
uint16 MystScriptParser_Dni::getVar(uint16 var) {
-// MystVariables::Globals &globals = _vm->_saveLoad->_v->globals;
-// MystVariables::Dni &dni = _vm->_saveLoad->_v->dni;
-
switch(var) {
// case 0: // Atrus Gone (from across room)
// return 0; // Present
diff --git a/engines/mohawk/myst_stacks/dni.h b/engines/mohawk/myst_stacks/dni.h
index a3ddedd70d..f376fb2025 100644
--- a/engines/mohawk/myst_stacks/dni.h
+++ b/engines/mohawk/myst_stacks/dni.h
@@ -55,6 +55,8 @@ private:
DECLARE_OPCODE(opcode_200);
DECLARE_OPCODE(opcode_300);
+
+ MystGameState::Dni &_state;
};
} // End of namespace Mohawk
diff --git a/engines/mohawk/myst_stacks/intro.cpp b/engines/mohawk/myst_stacks/intro.cpp
index 875eb6fce1..318edf57e9 100644
--- a/engines/mohawk/myst_stacks/intro.cpp
+++ b/engines/mohawk/myst_stacks/intro.cpp
@@ -67,7 +67,7 @@ void MystScriptParser_Intro::runPersistentScripts() {
uint16 MystScriptParser_Intro::getVar(uint16 var) {
switch(var) {
case 0:
- return _vm->_saveLoad->_v->globals.currentAge;
+ return _vm->_gameState->_globals.currentAge;
default:
return MystScriptParser::getVar(var);
}
diff --git a/engines/mohawk/myst_stacks/mechanical.cpp b/engines/mohawk/myst_stacks/mechanical.cpp
index e1933fbc28..714ec199f5 100644
--- a/engines/mohawk/myst_stacks/mechanical.cpp
+++ b/engines/mohawk/myst_stacks/mechanical.cpp
@@ -35,7 +35,8 @@
namespace Mohawk {
-MystScriptParser_Mechanical::MystScriptParser_Mechanical(MohawkEngine_Myst *vm) : MystScriptParser(vm) {
+MystScriptParser_Mechanical::MystScriptParser_Mechanical(MohawkEngine_Myst *vm) :
+ MystScriptParser(vm), _state(vm->_gameState->_mechanical) {
setupOpcodes();
}
@@ -100,14 +101,11 @@ void MystScriptParser_Mechanical::runPersistentScripts() {
}
uint16 MystScriptParser_Mechanical::getVar(uint16 var) {
-// MystVariables::Globals &globals = _vm->_saveLoad->_v->globals;
- MystVariables::Mechanical &mechanical = _vm->_saveLoad->_v->mechanical;
-
switch(var) {
case 0: // Sirrus's Secret Panel State
- return mechanical.sirrusPanelState;
+ return _state.sirrusPanelState;
case 1: // Achenar's Secret Panel State
- return mechanical.achenarPanelState;
+ return _state.achenarPanelState;
// case 3: // Sirrus's Secret Room Crate State
// return 0;
// return 1;
@@ -123,14 +121,14 @@ uint16 MystScriptParser_Mechanical::getVar(uint16 var) {
// return 0;
// return 1;
case 7: // Fortress Elevator Open
- if (mechanical.elevatorRotation == 4)
+ if (_state.elevatorRotation == 4)
return 1; // Open
else
return 0; // Closed
case 10: // Fortress Staircase State
- return mechanical.staircaseState;
+ return _state.staircaseState;
case 11: // Fortress Elevator Rotation Position
- return mechanical.elevatorRotation;
+ return _state.elevatorRotation;
// case 12: // Fortress Elevator Rotation Cog Position
// return 0;
// return 1;
@@ -146,7 +144,7 @@ uint16 MystScriptParser_Mechanical::getVar(uint16 var) {
case 17: // Code Lock Shape #2
case 18: // Code Lock Shape #3
case 19: // Code Lock Shape #4 - Right
- return mechanical.codeShape[var - 16];
+ return _state.codeShape[var - 16];
// case 20: // Crystal Lit Flag - Yellow
// return 0;
// return 1;
@@ -170,21 +168,18 @@ uint16 MystScriptParser_Mechanical::getVar(uint16 var) {
}
void MystScriptParser_Mechanical::toggleVar(uint16 var) {
-// MystVariables::Globals &globals = _vm->_saveLoad->_v->globals;
- MystVariables::Mechanical &mechanical = _vm->_saveLoad->_v->mechanical;
-
switch(var) {
// case 3: // Sirrus's Secret Room Crate State
// temp ^= 1;
// case 4: // Code Lock Puzzle Correct / Myst Book Room Staircase State
// temp ^= 1;
case 10: // Fortress Staircase State
- mechanical.staircaseState ^= 1;
+ _state.staircaseState ^= 1;
case 16: // Code Lock Shape #1 - Left
case 17: // Code Lock Shape #2
case 18: // Code Lock Shape #3
case 19: // Code Lock Shape #4 - Right
- mechanical.codeShape[var - 16] = (mechanical.codeShape[var - 16] + 1) % 10;
+ _state.codeShape[var - 16] = (_state.codeShape[var - 16] + 1) % 10;
break;
// case 102: // Red Page Grab/Release
// globals.heldPage?
@@ -197,7 +192,6 @@ void MystScriptParser_Mechanical::toggleVar(uint16 var) {
}
bool MystScriptParser_Mechanical::setVarValue(uint16 var, uint16 value) {
-// MystVariables::Mechanical &mechanical = _vm->_saveLoad->_v->mechanical;
bool refresh = false;
switch (var) {
diff --git a/engines/mohawk/myst_stacks/mechanical.h b/engines/mohawk/myst_stacks/mechanical.h
index 086986a2b2..6ea1bc6fd7 100644
--- a/engines/mohawk/myst_stacks/mechanical.h
+++ b/engines/mohawk/myst_stacks/mechanical.h
@@ -93,6 +93,8 @@ private:
DECLARE_OPCODE(opcode_209);
DECLARE_OPCODE(opcode_300);
+
+ MystGameState::Mechanical &_state;
};
} // End of namespace Mohawk
diff --git a/engines/mohawk/myst_stacks/myst.cpp b/engines/mohawk/myst_stacks/myst.cpp
index a01f98c318..bc77f150e2 100644
--- a/engines/mohawk/myst_stacks/myst.cpp
+++ b/engines/mohawk/myst_stacks/myst.cpp
@@ -40,9 +40,8 @@ namespace Mohawk {
// NOTE: Credits Start Card is 10000
-MystScriptParser_Myst::MystScriptParser_Myst(MohawkEngine_Myst *vm) : MystScriptParser(vm) {
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
-
+MystScriptParser_Myst::MystScriptParser_Myst(MohawkEngine_Myst *vm) :
+ MystScriptParser(vm), _state(_vm->_gameState->_myst) {
setupOpcodes();
// Card ID preinitialized by the engine for use by opcode 18
@@ -58,7 +57,7 @@ MystScriptParser_Myst::MystScriptParser_Myst(MohawkEngine_Myst *vm) : MystScript
_treeStopped = false;
_treeMinPosition = 0;
_imagerValidationStep = 0;
- myst.treeLastMoveTime = _vm->_system->getMillis();
+ _state.treeLastMoveTime = _vm->_system->getMillis();
}
MystScriptParser_Myst::~MystScriptParser_Myst() {
@@ -256,49 +255,46 @@ void MystScriptParser_Myst::runPersistentScripts() {
}
uint16 MystScriptParser_Myst::getVar(uint16 var) {
- MystVariables::Globals &globals = _vm->_saveLoad->_v->globals;
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
-
switch(var) {
case 0: // Myst Library Bookcase Closed
- return myst.libraryBookcaseDoor;
+ return _state.libraryBookcaseDoor;
case 1:
- if (globals.ending != 4) {
- return myst.libraryBookcaseDoor != 1;
- } else if (myst.libraryBookcaseDoor == 1) {
+ if (_globals.ending != 4) {
+ return _state.libraryBookcaseDoor != 1;
+ } else if (_state.libraryBookcaseDoor == 1) {
return 2;
} else {
return 3;
}
case 2: // Marker Switch Near Cabin
- return myst.cabinMarkerSwitch;
+ return _state.cabinMarkerSwitch;
case 3: // Marker Switch Near Clock Tower
- return myst.clockTowerMarkerSwitch;
+ return _state.clockTowerMarkerSwitch;
case 4: // Marker Switch on Dock
- return myst.dockMarkerSwitch;
+ return _state.dockMarkerSwitch;
case 5: // Marker Switch Near Ship Pool
- return myst.poolMarkerSwitch;
+ return _state.poolMarkerSwitch;
case 6: // Marker Switch Near Cogs
- return myst.gearsMarkerSwitch;
+ return _state.gearsMarkerSwitch;
case 7: // Marker Switch Near Generator Room
- return myst.generatorMarkerSwitch;
+ return _state.generatorMarkerSwitch;
case 8: // Marker Switch Near Stellar Observatory
- return myst.observatoryMarkerSwitch;
+ return _state.observatoryMarkerSwitch;
case 9: // Marker Switch Near Rocket Ship
- return myst.rocketshipMarkerSwitch;
+ return _state.rocketshipMarkerSwitch;
case 10: // Ship Floating State
- return myst.shipFloating;
+ return _state.shipFloating;
case 11: // Cabin Door Open State
return _cabinDoorOpened;
case 12: // Clock tower gears bridge
- return myst.clockTowerBridgeOpen;
+ return _state.clockTowerBridgeOpen;
case 13: // Tower in right position
- return myst.towerRotationAngle == 271
- || myst.towerRotationAngle == 83
- || myst.towerRotationAngle == 129
- || myst.towerRotationAngle == 152;
+ return _state.towerRotationAngle == 271
+ || _state.towerRotationAngle == 83
+ || _state.towerRotationAngle == 129
+ || _state.towerRotationAngle == 152;
case 14: // Tower Solution (Key) Plaque
- switch (myst.towerRotationAngle) {
+ switch (_state.towerRotationAngle) {
case 271:
return 1;
case 83:
@@ -311,16 +307,16 @@ uint16 MystScriptParser_Myst::getVar(uint16 var) {
return 0;
}
case 15: // Tower Window (Book) View
- switch (myst.towerRotationAngle) {
+ switch (_state.towerRotationAngle) {
case 271:
return 1;
case 83:
- if (myst.gearsOpen)
+ if (_state.gearsOpen)
return 6;
else
return 2;
case 129:
- if (myst.shipFloating)
+ if (_state.shipFloating)
return 5;
else
return 3;
@@ -330,10 +326,10 @@ uint16 MystScriptParser_Myst::getVar(uint16 var) {
return 0;
}
case 16: // Tower Window (Book) View From Ladder Top
- if (myst.towerRotationAngle != 271
- && myst.towerRotationAngle != 83
- && myst.towerRotationAngle != 129) {
- if (myst.towerRotationAngle == 152)
+ if (_state.towerRotationAngle != 271
+ && _state.towerRotationAngle != 83
+ && _state.towerRotationAngle != 129) {
+ if (_state.towerRotationAngle == 152)
return 2;
else
return 0;
@@ -349,14 +345,14 @@ uint16 MystScriptParser_Myst::getVar(uint16 var) {
&& _fireplaceLines[4] == 204
&& _fireplaceLines[5] == 250;
case 24: // Fireplace Blue Page Present
- if (globals.ending != 4) {
- return !(globals.bluePagesInBook & 32) && (globals.heldPage != 6);
+ if (_globals.ending != 4) {
+ return !(_globals.bluePagesInBook & 32) && (_globals.heldPage != 6);
} else {
return 0;
}
case 25: // Fireplace Red Page Present
- if (globals.ending != 4) {
- return !(globals.redPagesInBook & 32) && (globals.heldPage != 12);
+ if (_globals.ending != 4) {
+ return !(_globals.redPagesInBook & 32) && (_globals.heldPage != 12);
} else {
return 0;
}
@@ -370,16 +366,16 @@ uint16 MystScriptParser_Myst::getVar(uint16 var) {
case 33: // Courtyard Image Box - Ostrich
if (!_tempVar) {
return 0;
- } else if (myst.courtyardImageBoxes & (0x01 << (var - 26))) {
+ } else if (_state.courtyardImageBoxes & (0x01 << (var - 26))) {
return 2;
} else {
return 1;
}
case 34: // Sound Control In Dock forechamber
- if (myst.imagerActive) {
- if (myst.imagerSelection == 40 && !myst.imagerMountainErased)
+ if (_state.imagerActive) {
+ if (_state.imagerSelection == 40 && !_state.imagerMountainErased)
return 1;
- else if (myst.imagerSelection == 67 && !myst.imagerWaterErased)
+ else if (_state.imagerSelection == 67 && !_state.imagerWaterErased)
return 2;
else
return 0;
@@ -387,50 +383,50 @@ uint16 MystScriptParser_Myst::getVar(uint16 var) {
return 0;
}
case 35: // Dock Forechamber Imager Control Left Digit
- if (myst.imagerSelection > 9)
- return myst.imagerSelection / 10 - 1;
+ if (_state.imagerSelection > 9)
+ return _state.imagerSelection / 10 - 1;
else
return 9;
case 36: // Dock Forechamber Imager Control Right Digit
- return (10 + myst.imagerSelection - 1) % 10;
+ return (10 + _state.imagerSelection - 1) % 10;
case 37: // Clock Tower Control Wheels Position
- return 3 * ((myst.clockTowerMinutePosition / 5) % 3) + myst.clockTowerHourPosition % 3;
+ return 3 * ((_state.clockTowerMinutePosition / 5) % 3) + _state.clockTowerHourPosition % 3;
case 40: // Gears Open State
- return myst.gearsOpen;
+ return _state.gearsOpen;
case 41: // Dock Marker Switch Vault State
return _dockVaultState;
case 43: // Clock Tower Time
- return myst.clockTowerHourPosition * 12 + myst.clockTowerMinutePosition / 5;
+ return _state.clockTowerHourPosition * 12 + _state.clockTowerMinutePosition / 5;
case 44: // Rocket ship power state
- if (myst.generatorBreakers || myst.generatorVoltage == 0)
+ if (_state.generatorBreakers || _state.generatorVoltage == 0)
return 0;
- else if (myst.generatorVoltage != 59)
+ else if (_state.generatorVoltage != 59)
return 1;
else
return 2;
case 45: // Dock Vault Imager Active On Water
- return myst.imagerActive && myst.imagerSelection == 67 && !myst.imagerWaterErased;
+ return _state.imagerActive && _state.imagerSelection == 67 && !_state.imagerWaterErased;
case 46:
return bookCountPages(100);
case 47:
return bookCountPages(101);
case 48:
- if (myst.dockMarkerSwitch && !myst.shipFloating)
+ if (_state.dockMarkerSwitch && !_state.shipFloating)
return 1;
- else if (!myst.dockMarkerSwitch && myst.shipFloating)
+ else if (!_state.dockMarkerSwitch && _state.shipFloating)
return 2;
else
return 0;
case 49: // Generator running
- return myst.generatorVoltage > 0;
+ return _state.generatorVoltage > 0;
case 51: // Forechamber Imager Movie Control
- if (myst.imagerSelection == 40 && !myst.imagerMountainErased)
+ if (_state.imagerSelection == 40 && !_state.imagerMountainErased)
return 1;
- else if (myst.imagerSelection == 67 && !myst.imagerWaterErased)
+ else if (_state.imagerSelection == 67 && !_state.imagerWaterErased)
return 2;
- else if (myst.imagerSelection == 8 && !myst.imagerAtrusErased)
+ else if (_state.imagerSelection == 8 && !_state.imagerAtrusErased)
return 3;
- else if (myst.imagerSelection == 47 && !myst.imagerMarkerErased)
+ else if (_state.imagerSelection == 47 && !_state.imagerMarkerErased)
return 4;
else
return 0;
@@ -444,65 +440,65 @@ uint16 MystScriptParser_Myst::getVar(uint16 var) {
case 59: // Generator Switch #8
case 60: // Generator Switch #9
case 61: // Generator Switch #10
- return (myst.generatorButtons & (1 << (var - 52))) != 0;
+ return (_state.generatorButtons & (1 << (var - 52))) != 0;
case 62: // Generator Power Dial Left LED Digit
return _generatorVoltage / 10;
case 63: // Generator Power Dial Right LED Digit
return _generatorVoltage % 10;
case 64: // Generator Power To Spaceship Dial Left LED Digit
- if (myst.generatorVoltage > 59 || myst.generatorBreakers)
+ if (_state.generatorVoltage > 59 || _state.generatorBreakers)
return 0;
else
- return myst.generatorVoltage / 10;
+ return _state.generatorVoltage / 10;
case 65: // Generator Power To Spaceship Dial Right LED Digit
- if (myst.generatorVoltage > 59 || myst.generatorBreakers)
+ if (_state.generatorVoltage > 59 || _state.generatorBreakers)
return 0;
else
- return myst.generatorVoltage % 10;
+ return _state.generatorVoltage % 10;
case 66: // Generators lights on
return 0;
case 67: // Cabin Safe Lock Number #1 - Left
- return myst.cabinSafeCombination / 100;
+ return _state.cabinSafeCombination / 100;
case 68: // Cabin Safe Lock Number #2
- return (myst.cabinSafeCombination / 10) % 10;
+ return (_state.cabinSafeCombination / 10) % 10;
case 69: // Cabin Safe Lock Number #3 - Right
- return myst.cabinSafeCombination % 10;
+ return _state.cabinSafeCombination % 10;
case 70: // Cabin Safe Matchbox State
return _cabinMatchState;
case 71: // Stellar Observatory Lights
- return myst.observatoryLights;
+ return _state.observatoryLights;
case 72: // Channelwood tree position
- return myst.treePosition;
+ return _state.treePosition;
case 73: // Stellar Observatory Date - Month
- return myst.observatoryMonthSetting;
+ return _state.observatoryMonthSetting;
case 74: // Stellar Observatory Date - Day #1 (Left)
- if (myst.observatoryDaySetting / 10 == 0)
+ if (_state.observatoryDaySetting / 10 == 0)
return 10;
else
- return myst.observatoryDaySetting / 10;
+ return _state.observatoryDaySetting / 10;
case 75: // Stellar Observatory Date - Day #2 (Right)
- return myst.observatoryDaySetting % 10;
+ return _state.observatoryDaySetting % 10;
case 76: // Stellar Observatory Date - Year #1 (Left)
- return (myst.observatoryYearSetting >> 12) & 0x0f;
+ return (_state.observatoryYearSetting >> 12) & 0x0f;
case 77: // Stellar Observatory Date - Year #2
- return (myst.observatoryYearSetting >> 8) & 0x0f;
+ return (_state.observatoryYearSetting >> 8) & 0x0f;
case 78: // Stellar Observatory Date - Year #3
- return (myst.observatoryYearSetting >> 4) & 0x0f;
+ return (_state.observatoryYearSetting >> 4) & 0x0f;
case 79: // Stellar Observatory Date - Year #4 (Right)
- return (myst.observatoryYearSetting >> 0) & 0x0f;
+ return (_state.observatoryYearSetting >> 0) & 0x0f;
case 80: // Stellar Observatory Hour #1 - Left ( Number 1 (0) or Blank (10))
- if (myst.observatoryTimeSetting % (12 * 60) < (10 * 60))
+ if (_state.observatoryTimeSetting % (12 * 60) < (10 * 60))
return 10;
else
return 0;
case 81: // Stellar Observatory Hour #2 - Right
- return ((myst.observatoryTimeSetting % (12 * 60)) / 60) % 10;
+ return ((_state.observatoryTimeSetting % (12 * 60)) / 60) % 10;
case 82: // Stellar Observatory Minutes #1 - Left
- return (myst.observatoryTimeSetting % 60) / 10;
+ return (_state.observatoryTimeSetting % 60) / 10;
case 83: // Stellar Observatory Minutes #2 - Right
- return (myst.observatoryTimeSetting % 60) % 10;
+ return (_state.observatoryTimeSetting % 60) % 10;
case 88: // Stellar Observatory AM/PM
- if (myst.observatoryTimeSetting < (12 * 60))
+ if (_state.observatoryTimeSetting < (12 * 60))
return 0; // AM
else
return 1; // PM
@@ -512,107 +508,104 @@ uint16 MystScriptParser_Myst::getVar(uint16 var) {
case 92: // Stellar observatory sliders state
return 1;
case 93: // Breaker nearest Generator Room Blown
- return myst.generatorBreakers == 1;
+ return _state.generatorBreakers == 1;
case 94: // Breaker nearest Rocket Ship Blown
- return myst.generatorBreakers == 2;
+ return _state.generatorBreakers == 2;
case 95: // Going out of tree destination selection
- if (myst.treePosition == 0)
+ if (_state.treePosition == 0)
return 0;
- else if (myst.treePosition == 4 || myst.treePosition == 5)
+ else if (_state.treePosition == 4 || _state.treePosition == 5)
return 1;
else
return 2;
case 96: // Generator Power Dial Needle Position
- return myst.generatorVoltage / 4;
+ return _state.generatorVoltage / 4;
case 97: // Generator Power To Spaceship Dial Needle Position
- if (myst.generatorVoltage > 59 || myst.generatorBreakers)
+ if (_state.generatorVoltage > 59 || _state.generatorBreakers)
return 0;
else
- return myst.generatorVoltage / 4;
+ return _state.generatorVoltage / 4;
case 98: // Cabin Boiler Pilot Light Lit
- return myst.cabinPilotLightLit;
+ return _state.cabinPilotLightLit;
case 99: // Cabin Boiler Gas Valve Position
- return myst.cabinValvePosition % 6;
+ return _state.cabinValvePosition % 6;
case 102: // Red page
- if (globals.ending != 4) {
- return !(globals.redPagesInBook & 1) && (globals.heldPage != 7);
+ if (_globals.ending != 4) {
+ return !(_globals.redPagesInBook & 1) && (_globals.heldPage != 7);
} else {
return 0;
}
case 103: // Blue page
- if (globals.ending != 4) {
- return !(globals.bluePagesInBook & 1) && (globals.heldPage != 1);
+ if (_globals.ending != 4) {
+ return !(_globals.bluePagesInBook & 1) && (_globals.heldPage != 1);
} else {
return 0;
}
case 300: // Rocket Ship Music Puzzle Slider State
return 1;
case 302: // Green Book Opened Before Flag
- return myst.greenBookOpenedBefore;
+ return _state.greenBookOpenedBefore;
case 304: // Tower Rotation Map Initialized
return _towerRotationMapInitialized;
case 305: // Cabin Boiler Lit
- return myst.cabinPilotLightLit == 1 && myst.cabinValvePosition > 0;
+ return _state.cabinPilotLightLit == 1 && _state.cabinValvePosition > 0;
case 306: // Cabin Boiler Steam Sound Control
- if (myst.cabinPilotLightLit == 1) {
- if (myst.cabinValvePosition <= 0)
+ if (_state.cabinPilotLightLit == 1) {
+ if (_state.cabinValvePosition <= 0)
return 26;
else
return 27;
} else {
- return myst.cabinValvePosition;
+ return _state.cabinValvePosition;
}
case 307: // Cabin Boiler Fully Pressurised
- return myst.cabinPilotLightLit == 1 && myst.cabinValvePosition > 12;
+ return _state.cabinPilotLightLit == 1 && _state.cabinValvePosition > 12;
default:
return MystScriptParser::getVar(var);
}
}
void MystScriptParser_Myst::toggleVar(uint16 var) {
- MystVariables::Globals &globals = _vm->_saveLoad->_v->globals;
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
-
switch(var) {
case 2: // Marker Switch Near Cabin
- myst.cabinMarkerSwitch = (myst.cabinMarkerSwitch + 1) % 2;
+ _state.cabinMarkerSwitch = (_state.cabinMarkerSwitch + 1) % 2;
break;
case 3: // Marker Switch Near Clock Tower
- myst.clockTowerMarkerSwitch = (myst.clockTowerMarkerSwitch + 1) % 2;
+ _state.clockTowerMarkerSwitch = (_state.clockTowerMarkerSwitch + 1) % 2;
break;
case 4: // Marker Switch on Dock
- myst.dockMarkerSwitch = (myst.dockMarkerSwitch + 1) % 2;
+ _state.dockMarkerSwitch = (_state.dockMarkerSwitch + 1) % 2;
break;
case 5: // Marker Switch Near Ship Pool
- myst.poolMarkerSwitch = (myst.poolMarkerSwitch + 1) % 2;
+ _state.poolMarkerSwitch = (_state.poolMarkerSwitch + 1) % 2;
break;
case 6: // Marker Switch Near Cogs
- myst.gearsMarkerSwitch = (myst.gearsMarkerSwitch + 1) % 2;
+ _state.gearsMarkerSwitch = (_state.gearsMarkerSwitch + 1) % 2;
break;
case 7: // Marker Switch Near Generator Room
- myst.generatorMarkerSwitch = (myst.generatorMarkerSwitch + 1) % 2;
+ _state.generatorMarkerSwitch = (_state.generatorMarkerSwitch + 1) % 2;
break;
case 8: // Marker Switch Near Stellar Observatory
- myst.observatoryMarkerSwitch = (myst.observatoryMarkerSwitch + 1) % 2;
+ _state.observatoryMarkerSwitch = (_state.observatoryMarkerSwitch + 1) % 2;
break;
case 9: // Marker Switch Near Rocket Ship
- myst.rocketshipMarkerSwitch = (myst.rocketshipMarkerSwitch + 1) % 2;
+ _state.rocketshipMarkerSwitch = (_state.rocketshipMarkerSwitch + 1) % 2;
break;
case 24: // Fireplace Blue Page
- if (globals.ending != 4 && !(globals.bluePagesInBook & 32)) {
- if (globals.heldPage == 6)
- globals.heldPage = 0;
+ if (_globals.ending != 4 && !(_globals.bluePagesInBook & 32)) {
+ if (_globals.heldPage == 6)
+ _globals.heldPage = 0;
else {
- globals.heldPage = 6;
+ _globals.heldPage = 6;
}
}
break;
case 25: // Fireplace Red page
- if (globals.ending != 4 && !(globals.redPagesInBook & 32)) {
- if (globals.heldPage == 12)
- globals.heldPage = 0;
+ if (_globals.ending != 4 && !(_globals.redPagesInBook & 32)) {
+ if (_globals.heldPage == 12)
+ _globals.heldPage = 0;
else {
- globals.heldPage = 12;
+ _globals.heldPage = 12;
}
}
break;
@@ -626,37 +619,37 @@ void MystScriptParser_Myst::toggleVar(uint16 var) {
case 33: // Courtyard Image Box - Ostrich
{
uint16 mask = 0x01 << (var - 26);
- if (myst.courtyardImageBoxes & mask)
- myst.courtyardImageBoxes &= ~mask;
+ if (_state.courtyardImageBoxes & mask)
+ _state.courtyardImageBoxes &= ~mask;
else
- myst.courtyardImageBoxes |= mask;
+ _state.courtyardImageBoxes |= mask;
}
case 41: // Vault white page
- if (globals.ending != 4) {
+ if (_globals.ending != 4) {
if (_dockVaultState == 1) {
_dockVaultState = 2;
- globals.heldPage = 0;
+ _globals.heldPage = 0;
} else if (_dockVaultState == 2) {
_dockVaultState = 1;
- globals.heldPage = 13;
+ _globals.heldPage = 13;
}
}
break;
case 102: // Red page
- if (globals.ending != 4 && !(globals.redPagesInBook & 1)) {
- if (globals.heldPage == 7)
- globals.heldPage = 0;
+ if (_globals.ending != 4 && !(_globals.redPagesInBook & 1)) {
+ if (_globals.heldPage == 7)
+ _globals.heldPage = 0;
else {
- globals.heldPage = 7;
+ _globals.heldPage = 7;
}
}
break;
case 103: // Blue page
- if (globals.ending != 4 && !(globals.bluePagesInBook & 1)) {
- if (globals.heldPage == 1)
- globals.heldPage = 0;
+ if (_globals.ending != 4 && !(_globals.bluePagesInBook & 1)) {
+ if (_globals.heldPage == 1)
+ _globals.heldPage = 0;
else {
- globals.heldPage = 1;
+ _globals.heldPage = 1;
}
}
break;
@@ -667,13 +660,12 @@ void MystScriptParser_Myst::toggleVar(uint16 var) {
}
bool MystScriptParser_Myst::setVarValue(uint16 var, uint16 value) {
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
bool refresh = false;
switch (var) {
case 0: // Myst Library Bookcase Closed
- if (myst.libraryBookcaseDoor != value) {
- myst.libraryBookcaseDoor = value;
+ if (_state.libraryBookcaseDoor != value) {
+ _state.libraryBookcaseDoor = value;
_tempVar = 0;
refresh = true;
}
@@ -691,7 +683,7 @@ bool MystScriptParser_Myst::setVarValue(uint16 var, uint16 value) {
}
break;
case 71: // Stellar Observatory Lights
- myst.observatoryLights = value;
+ _state.observatoryLights = value;
break;
case 89:
case 90:
@@ -700,7 +692,7 @@ bool MystScriptParser_Myst::setVarValue(uint16 var, uint16 value) {
case 300: // Set slider value
break; // Do nothing
case 302: // Green Book Opened Before Flag
- myst.greenBookOpenedBefore = value;
+ _state.greenBookOpenedBefore = value;
break;
case 303: // Library Bookcase status changed
_libraryBookcaseChanged = value;
@@ -723,16 +715,14 @@ bool MystScriptParser_Myst::setVarValue(uint16 var, uint16 value) {
}
uint16 MystScriptParser_Myst::bookCountPages(uint16 var) {
- MystVariables::Globals &globals = _vm->_saveLoad->_v->globals;
-
uint16 pages = 0;
uint16 cnt = 0;
// Select book according to var
if (var == 100)
- pages = globals.redPagesInBook;
+ pages = _globals.redPagesInBook;
else if (var == 101)
- pages = globals.bluePagesInBook;
+ pages = _globals.bluePagesInBook;
// Special page present
if (pages & 64)
@@ -836,28 +826,25 @@ void MystScriptParser_Myst::o_fireplaceRotation(uint16 op, uint16 var, uint16 ar
void MystScriptParser_Myst::o_courtyardBoxesCheckSolution(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
uint16 soundId = argv[0];
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
debugC(kDebugScript, "Opcode %d: Ship Puzzle Logic", op);
debugC(kDebugScript, "\tsoundId: %d", soundId);
// Change ship state if the boxes are correctly enabled
- if (myst.courtyardImageBoxes == 50 && !myst.shipFloating) {
+ if (_state.courtyardImageBoxes == 50 && !_state.shipFloating) {
_vm->_cursor->hideCursor();
- myst.shipFloating = 1;
+ _state.shipFloating = 1;
_vm->_sound->playSoundBlocking(soundId);
_vm->_cursor->showCursor();
- } else if (myst.courtyardImageBoxes != 50 && myst.shipFloating) {
+ } else if (_state.courtyardImageBoxes != 50 && _state.shipFloating) {
_vm->_cursor->hideCursor();
- myst.shipFloating = 0;
+ _state.shipFloating = 0;
_vm->_sound->playSoundBlocking(soundId);
_vm->_cursor->showCursor();
}
}
void MystScriptParser_Myst::o_towerRotationStart(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
-
_towerRotationBlinkLabel = false;
_towerRotationMapClicked = true;
_towerRotationSpeed = 0;
@@ -865,7 +852,7 @@ void MystScriptParser_Myst::o_towerRotationStart(uint16 op, uint16 var, uint16 a
_vm->_cursor->setCursor(700);
const Common::Point center = Common::Point(383, 124);
- Common::Point end = towerRotationMapComputeCoords(center, myst.towerRotationAngle);
+ Common::Point end = towerRotationMapComputeCoords(center, _state.towerRotationAngle);
towerRotationMapComputeAngle();
towerRotationMapDrawLine(center, end);
@@ -873,27 +860,25 @@ void MystScriptParser_Myst::o_towerRotationStart(uint16 op, uint16 var, uint16 a
}
void MystScriptParser_Myst::o_towerRotationEnd(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
-
_towerRotationMapClicked = false;
// Set angle value to expected value
- if (myst.towerRotationAngle >= 265
- && myst.towerRotationAngle <= 277
- && myst.rocketshipMarkerSwitch) {
- myst.towerRotationAngle = 271;
- } else if (myst.towerRotationAngle >= 77
- && myst.towerRotationAngle <= 89
- && myst.gearsMarkerSwitch) {
- myst.towerRotationAngle = 83;
- } else if (myst.towerRotationAngle >= 123
- && myst.towerRotationAngle <= 135
- && myst.dockMarkerSwitch) {
- myst.towerRotationAngle = 129;
- } else if (myst.towerRotationAngle >= 146
- && myst.towerRotationAngle <= 158
- && myst.cabinMarkerSwitch) {
- myst.towerRotationAngle = 152;
+ if (_state.towerRotationAngle >= 265
+ && _state.towerRotationAngle <= 277
+ && _state.rocketshipMarkerSwitch) {
+ _state.towerRotationAngle = 271;
+ } else if (_state.towerRotationAngle >= 77
+ && _state.towerRotationAngle <= 89
+ && _state.gearsMarkerSwitch) {
+ _state.towerRotationAngle = 83;
+ } else if (_state.towerRotationAngle >= 123
+ && _state.towerRotationAngle <= 135
+ && _state.dockMarkerSwitch) {
+ _state.towerRotationAngle = 129;
+ } else if (_state.towerRotationAngle >= 146
+ && _state.towerRotationAngle <= 158
+ && _state.cabinMarkerSwitch) {
+ _state.towerRotationAngle = 152;
}
_vm->_sound->replaceSound(6378);
@@ -908,11 +893,9 @@ void MystScriptParser_Myst::o_imagerChangeSelection(uint16 op, uint16 var, uint1
if (_imagerValidationStep != 10) {
_imagerValidationStep = 0;
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
-
int16 signedValue = argv[0];
- uint16 d1 = (myst.imagerSelection / 10) % 10;
- uint16 d2 = myst.imagerSelection % 10;
+ uint16 d1 = (_state.imagerSelection / 10) % 10;
+ uint16 d2 = _state.imagerSelection % 10;
if (var == 35 && signedValue > 0 && d1 < 9)
d1++;
@@ -923,8 +906,8 @@ void MystScriptParser_Myst::o_imagerChangeSelection(uint16 op, uint16 var, uint1
else if (var == 36 && signedValue < 0 && d2 > 0)
d2--;
- myst.imagerSelection = 10 * d1 + d2;
- myst.imagerActive = 0;
+ _state.imagerSelection = 10 * d1 + d2;
+ _state.imagerActive = 0;
_vm->redrawArea(var);
}
@@ -932,8 +915,6 @@ void MystScriptParser_Myst::o_imagerChangeSelection(uint16 op, uint16 var, uint1
void MystScriptParser_Myst::o_dockVaultOpen(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
// Used on Myst 4143 (Dock near Marker Switch)
- MystVariables::Globals &globals = _vm->_saveLoad->_v->globals;
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
uint16 soundId = argv[0];
uint16 delay = argv[1];
uint16 directionalUpdateDataSize = argv[2];
@@ -942,15 +923,15 @@ void MystScriptParser_Myst::o_dockVaultOpen(uint16 op, uint16 var, uint16 argc,
debugC(kDebugScript, "\tsoundId: %d", soundId);
debugC(kDebugScript, "\tdirectionalUpdateDataSize: %d", directionalUpdateDataSize);
- if ((myst.cabinMarkerSwitch == 1) &&
- (myst.clockTowerMarkerSwitch == 1) &&
- (myst.dockMarkerSwitch == 0) &&
- (myst.gearsMarkerSwitch == 1) &&
- (myst.generatorMarkerSwitch == 1) &&
- (myst.observatoryMarkerSwitch == 1) &&
- (myst.poolMarkerSwitch == 1) &&
- (myst.rocketshipMarkerSwitch == 1)) {
- if (globals.heldPage != 13 && globals.ending != 4)
+ if ((_state.cabinMarkerSwitch == 1) &&
+ (_state.clockTowerMarkerSwitch == 1) &&
+ (_state.dockMarkerSwitch == 0) &&
+ (_state.gearsMarkerSwitch == 1) &&
+ (_state.generatorMarkerSwitch == 1) &&
+ (_state.observatoryMarkerSwitch == 1) &&
+ (_state.poolMarkerSwitch == 1) &&
+ (_state.rocketshipMarkerSwitch == 1)) {
+ if (_globals.heldPage != 13 && _globals.ending != 4)
_dockVaultState = 2;
else
_dockVaultState = 1;
@@ -963,7 +944,6 @@ void MystScriptParser_Myst::o_dockVaultOpen(uint16 op, uint16 var, uint16 argc,
void MystScriptParser_Myst::o_dockVaultClose(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
// Used on Myst 4143 (Dock near Marker Switch)
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
uint16 soundId = argv[0];
uint16 delay = argv[1];
uint16 directionalUpdateDataSize = argv[2];
@@ -972,14 +952,14 @@ void MystScriptParser_Myst::o_dockVaultClose(uint16 op, uint16 var, uint16 argc,
debugC(kDebugScript, "\tsoundId: %d", soundId);
debugC(kDebugScript, "\tdirectionalUpdateDataSize: %d", directionalUpdateDataSize);
- if ((myst.cabinMarkerSwitch == 1) &&
- (myst.clockTowerMarkerSwitch == 1) &&
- (myst.dockMarkerSwitch == 1) &&
- (myst.gearsMarkerSwitch == 1) &&
- (myst.generatorMarkerSwitch == 1) &&
- (myst.observatoryMarkerSwitch == 1) &&
- (myst.poolMarkerSwitch == 1) &&
- (myst.rocketshipMarkerSwitch == 1)) {
+ if ((_state.cabinMarkerSwitch == 1) &&
+ (_state.clockTowerMarkerSwitch == 1) &&
+ (_state.dockMarkerSwitch == 1) &&
+ (_state.gearsMarkerSwitch == 1) &&
+ (_state.generatorMarkerSwitch == 1) &&
+ (_state.observatoryMarkerSwitch == 1) &&
+ (_state.poolMarkerSwitch == 1) &&
+ (_state.rocketshipMarkerSwitch == 1)) {
if (_dockVaultState == 1 || _dockVaultState == 2)
_dockVaultState = 0;
@@ -990,8 +970,6 @@ void MystScriptParser_Myst::o_dockVaultClose(uint16 op, uint16 var, uint16 argc,
}
void MystScriptParser_Myst::o_bookGivePage(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- MystVariables::Globals &globals = _vm->_saveLoad->_v->globals;
-
uint16 cardIdLose = argv[0];
uint16 cardIdBookCover = argv[1];
uint16 soundIdAddPage = argv[2];
@@ -1003,7 +981,7 @@ void MystScriptParser_Myst::o_bookGivePage(uint16 op, uint16 var, uint16 argc, u
debugC(kDebugScript, "SoundId (Add Page): %d", soundIdAddPage);
// No page or white page
- if (!globals.heldPage || globals.heldPage == 13) {
+ if (!_globals.heldPage || _globals.heldPage == 13) {
_vm->changeToCard(cardIdBookCover, true);
return;
}
@@ -1011,7 +989,7 @@ void MystScriptParser_Myst::o_bookGivePage(uint16 op, uint16 var, uint16 argc, u
uint16 bookVar = 101;
uint16 mask = 0;
- switch (globals.heldPage) {
+ switch (_globals.heldPage) {
case 7:
bookVar = 100;
case 1:
@@ -1056,21 +1034,21 @@ void MystScriptParser_Myst::o_bookGivePage(uint16 op, uint16 var, uint16 argc, u
// Add page to book
if (var == 100)
- globals.redPagesInBook |= mask;
+ _globals.redPagesInBook |= mask;
else
- globals.bluePagesInBook |= mask;
+ _globals.bluePagesInBook |= mask;
// Remove page from hand
- globals.heldPage = 0;
+ _globals.heldPage = 0;
_vm->_cursor->showCursor();
if (mask == 32) {
// You lose!
if (var == 100)
- globals.currentAge = 9;
+ _globals.currentAge = 9;
else
- globals.currentAge = 10;
+ _globals.currentAge = 10;
_vm->changeToCard(cardIdLose, true);
} else {
@@ -1080,32 +1058,31 @@ void MystScriptParser_Myst::o_bookGivePage(uint16 op, uint16 var, uint16 argc, u
void MystScriptParser_Myst::o_clockWheelsExecute(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
// Used on Card 4006 (Clock Tower Time Controls)
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
uint16 soundId = argv[0];
debugC(kDebugScript, "Opcode %d: Clock Tower Bridge Puzzle Execute Button", op);
// Correct time is 2:40
- bool correctTime = myst.clockTowerHourPosition == 2
- && myst.clockTowerMinutePosition == 40;
+ bool correctTime = _state.clockTowerHourPosition == 2
+ && _state.clockTowerMinutePosition == 40;
- if (!myst.clockTowerBridgeOpen && correctTime) {
+ if (!_state.clockTowerBridgeOpen && correctTime) {
_vm->_sound->replaceSound(soundId);
_vm->_system->delayMillis(500);
// TODO: Play only 1st half of movie i.e. gears rise up, from 0 to 650
_vm->_video->playMovie(_vm->wrapMovieFilename("gears", kMystStack), 305, 33);
- myst.clockTowerBridgeOpen = 1;
+ _state.clockTowerBridgeOpen = 1;
_vm->redrawArea(12);
- } else if (myst.clockTowerBridgeOpen && !correctTime) {
+ } else if (_state.clockTowerBridgeOpen && !correctTime) {
_vm->_sound->replaceSound(soundId);
_vm->_system->delayMillis(500);
// TODO: Play only 2nd half of movie i.e. gears sink down, from 700 to 1300
_vm->_video->playMovie(_vm->wrapMovieFilename("gears", kMystStack), 305, 33);
- myst.clockTowerBridgeOpen = 0;
+ _state.clockTowerBridgeOpen = 0;
_vm->redrawArea(12);
}
}
@@ -1113,7 +1090,6 @@ void MystScriptParser_Myst::o_clockWheelsExecute(uint16 op, uint16 var, uint16 a
void MystScriptParser_Myst::o_imagerPlayButton(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
debugC(kDebugScript, "Opcode %d: Imager play button", op);
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
uint16 video = getVar(51);
// Press button
@@ -1133,7 +1109,7 @@ void MystScriptParser_Myst::o_imagerPlayButton(uint16 op, uint16 var, uint16 arg
// Play selected video
- if (!myst.imagerActive && video != 3)
+ if (!_state.imagerActive && video != 3)
_vm->_sound->replaceSound(argv[0]);
switch (video) {
@@ -1143,34 +1119,34 @@ void MystScriptParser_Myst::o_imagerPlayButton(uint16 op, uint16 var, uint16 arg
_imagerMovie->playMovie();
break;
case 1: // Mountain
- if (myst.imagerActive) {
+ if (_state.imagerActive) {
// TODO: Play from 11180 to 16800
Common::String file = _vm->wrapMovieFilename("vltmntn", kMystStack);
_vm->_video->playBackgroundMovie(file, 159, 96, false);
- myst.imagerActive = 0;
+ _state.imagerActive = 0;
} else {
// TODO: Play from 0 to 11180
Common::String file = _vm->wrapMovieFilename("vltmntn", kMystStack);
_vm->_video->playBackgroundMovie(file, 159, 96, false);
- myst.imagerActive = 1;
+ _state.imagerActive = 1;
}
break;
case 2: // Water
- if (myst.imagerActive) {
+ if (_state.imagerActive) {
_vm->_sound->replaceSound(argv[1]);
// TODO: Play from 4204 to 6040
_imagerMovie->playMovie();
- myst.imagerActive = 0;
+ _state.imagerActive = 0;
} else {
// TODO: Play from 0 to 1814
// Then play from 1814 to 4204, looping
_imagerMovie->playMovie();
- myst.imagerActive = 1;
+ _state.imagerActive = 1;
}
break;
}
@@ -1181,8 +1157,6 @@ void MystScriptParser_Myst::o_imagerPlayButton(uint16 op, uint16 var, uint16 arg
void MystScriptParser_Myst::o_imagerEraseButton(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
debugC(kDebugScript, "Opcode %d: Imager erase button", op);
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
-
_imagerRedButton = static_cast<MystResourceType8 *>(_invokingResource->_parent);
for (uint i = 0; i < 4; i++)
_imagerSound[i] = argv[i];
@@ -1202,22 +1176,22 @@ void MystScriptParser_Myst::o_imagerEraseButton(uint16 op, uint16 var, uint16 ar
_vm->_sound->playSoundBlocking(_imagerSound[3]);
// Erase selected video from imager
- switch (myst.imagerSelection) {
+ switch (_state.imagerSelection) {
case 8:
- myst.imagerAtrusErased = 1;
+ _state.imagerAtrusErased = 1;
break;
case 40:
- myst.imagerMountainErased = 1;
+ _state.imagerMountainErased = 1;
break;
case 47:
- myst.imagerMarkerErased = 1;
+ _state.imagerMarkerErased = 1;
break;
case 67:
- myst.imagerWaterErased = 1;
+ _state.imagerWaterErased = 1;
break;
}
- myst.imagerActive = 0;
+ _state.imagerActive = 0;
_imagerValidationStep = 0;
return;
} else if (_imagerValidationStep == 11) {
@@ -1283,23 +1257,22 @@ void MystScriptParser_Myst::o_towerElevatorAnimation(uint16 op, uint16 var, uint
void MystScriptParser_Myst::o_generatorButtonPressed(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
debugC(kDebugScript, "Opcode %d: Generator button pressed", op);
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
MystResource *button = _invokingResource->_parent;
generatorRedrawRocket();
- _generatorVoltage = myst.generatorVoltage;
+ _generatorVoltage = _state.generatorVoltage;
uint16 mask = 0;
uint16 value = 0;
generatorButtonValue(button, mask, value);
// Button pressed
- if (myst.generatorButtons & mask) {
- myst.generatorButtons &= ~mask;
- myst.generatorVoltage -= value;
+ if (_state.generatorButtons & mask) {
+ _state.generatorButtons &= ~mask;
+ _state.generatorVoltage -= value;
- if (myst.generatorVoltage)
+ if (_state.generatorVoltage)
_vm->_sound->replaceSound(8297);
else
_vm->_sound->replaceSound(9297);
@@ -1311,16 +1284,16 @@ void MystScriptParser_Myst::o_generatorButtonPressed(uint16 op, uint16 var, uint
_vm->_sound->replaceBackground(4297);
}
- myst.generatorButtons |= mask;
- myst.generatorVoltage += value;
+ _state.generatorButtons |= mask;
+ _state.generatorVoltage += value;
}
// Redraw button
_vm->redrawArea(button->getType8Var());
// Blow breaker
- if (myst.generatorVoltage > 59)
- myst.generatorBreakers = _vm->_rnd->getRandomNumberRng(1, 2);
+ if (_state.generatorVoltage > 59)
+ _state.generatorBreakers = _vm->_rnd->getRandomNumberRng(1, 2);
}
void MystScriptParser_Myst::generatorRedrawRocket() {
@@ -1377,11 +1350,9 @@ void MystScriptParser_Myst::generatorButtonValue(MystResource *button, uint16 &m
void MystScriptParser_Myst::o_cabinSafeChangeDigit(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
debugC(kDebugScript, "Opcode %d: Cabin safe change digit", op);
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
-
- uint16 d1 = myst.cabinSafeCombination / 100;
- uint16 d2 = (myst.cabinSafeCombination / 10) % 10;
- uint16 d3 = myst.cabinSafeCombination % 10;
+ uint16 d1 = _state.cabinSafeCombination / 100;
+ uint16 d2 = (_state.cabinSafeCombination / 10) % 10;
+ uint16 d3 = _state.cabinSafeCombination % 10;
if (var == 67)
d1 = (d1 + 1) % 10;
@@ -1390,7 +1361,7 @@ void MystScriptParser_Myst::o_cabinSafeChangeDigit(uint16 op, uint16 var, uint16
else
d3 = (d3 + 1) % 10;
- myst.cabinSafeCombination = 100 * d1 + 10 * d2 + d3;
+ _state.cabinSafeCombination = 100 * d1 + 10 * d2 + d3;
_vm->redrawArea(var);
}
@@ -1409,7 +1380,6 @@ void MystScriptParser_Myst::o_cabinSafeHandleMove(uint16 op, uint16 var, uint16
debugC(kDebugScript, "Opcode %d: Cabin safe handle move", op);
// Used on Card 4100
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
MystResourceType12 *handle = static_cast<MystResourceType12 *>(_invokingResource);
// Make the handle follow the mouse
@@ -1428,7 +1398,7 @@ void MystScriptParser_Myst::o_cabinSafeHandleMove(uint16 op, uint16 var, uint16
_vm->_sound->replaceSound(soundId);
}
// Combination is right
- if (myst.cabinSafeCombination == 724) {
+ if (_state.cabinSafeCombination == 724) {
uint16 soundId = handle->getList2(1);
if (soundId)
_vm->_sound->replaceSound(soundId);
@@ -1522,7 +1492,6 @@ void MystScriptParser_Myst::o_circuitBreakerStartMove(uint16 op, uint16 var, uin
void MystScriptParser_Myst::o_circuitBreakerMove(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
debugC(kDebugScript, "Opcode %d: Circuit breaker move", op);
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
MystResourceType12 *breaker = static_cast<MystResourceType12 *>(_invokingResource);
int16 maxStep = breaker->getStepsV() - 1;
@@ -1541,7 +1510,7 @@ void MystScriptParser_Myst::o_circuitBreakerMove(uint16 op, uint16 var, uint16 a
if (breaker->getType8Var() == 93) {
// Voltage is still too high or not broken
- if (myst.generatorVoltage > 59 || myst.generatorBreakers != 1) {
+ if (_state.generatorVoltage > 59 || _state.generatorBreakers != 1) {
uint16 soundId = breaker->getList2(1);
if (soundId)
_vm->_sound->replaceSound(soundId);
@@ -1551,11 +1520,11 @@ void MystScriptParser_Myst::o_circuitBreakerMove(uint16 op, uint16 var, uint16 a
_vm->_sound->replaceSound(soundId);
// Reset breaker state
- myst.generatorBreakers = 0;
+ _state.generatorBreakers = 0;
}
} else {
// Voltage is still too high or not broken
- if (myst.generatorVoltage > 59 || myst.generatorBreakers != 2) {
+ if (_state.generatorVoltage > 59 || _state.generatorBreakers != 2) {
uint16 soundId = breaker->getList2(1);
if (soundId)
_vm->_sound->replaceSound(soundId);
@@ -1565,7 +1534,7 @@ void MystScriptParser_Myst::o_circuitBreakerMove(uint16 op, uint16 var, uint16 a
_vm->_sound->replaceSound(soundId);
// Reset breaker state
- myst.generatorBreakers = 0;
+ _state.generatorBreakers = 0;
}
}
}
@@ -1582,10 +1551,9 @@ void MystScriptParser_Myst::o_circuitBreakerEndMove(uint16 op, uint16 var, uint1
void MystScriptParser_Myst::o_boilerIncreasePressureStart(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
debugC(kDebugScript, "Opcode %d: Boiler increase pressure start", op);
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
_treeStopped = true;
- if (myst.cabinValvePosition < 25)
+ if (_state.cabinValvePosition < 25)
_vm->_sound->stopBackground();
_boilerPressureIncreasing = true;
@@ -1593,21 +1561,20 @@ void MystScriptParser_Myst::o_boilerIncreasePressureStart(uint16 op, uint16 var,
void MystScriptParser_Myst::o_boilerLightPilot(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
debugC(kDebugScript, "Opcode %d: Boiler light pilot", op);
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
// Match is lit
if (_cabinMatchState == 1) {
- myst.cabinPilotLightLit = 1;
+ _state.cabinPilotLightLit = 1;
_vm->redrawArea(98);
// Put out match
_matchGoOutTime = _vm->_system->getMillis();
- if (myst.cabinValvePosition > 0)
+ if (_state.cabinValvePosition > 0)
_vm->_sound->replaceBackground(8098, 49152);
- if (myst.cabinValvePosition > 12)
- myst.treeLastMoveTime = _vm->_system->getMillis();
+ if (_state.cabinValvePosition > 12)
+ _state.treeLastMoveTime = _vm->_system->getMillis();
// TODO: Complete. Play movies
}
@@ -1615,36 +1582,33 @@ void MystScriptParser_Myst::o_boilerLightPilot(uint16 op, uint16 var, uint16 arg
void MystScriptParser_Myst::o_boilerIncreasePressureStop(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
debugC(kDebugScript, "Opcode %d: Boiler increase pressure stop", op);
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
_treeStopped = false;
_boilerPressureIncreasing = false;
- myst.treeLastMoveTime = _vm->_system->getMillis();
+ _state.treeLastMoveTime = _vm->_system->getMillis();
- if (myst.cabinPilotLightLit == 1) {
- if (myst.cabinValvePosition > 0)
+ if (_state.cabinPilotLightLit == 1) {
+ if (_state.cabinValvePosition > 0)
_vm->_sound->replaceBackground(8098, 49152);
// TODO: Play movies
} else {
- if (myst.cabinValvePosition > 0)
- _vm->_sound->replaceBackground(4098, myst.cabinValvePosition << 10);
+ if (_state.cabinValvePosition > 0)
+ _vm->_sound->replaceBackground(4098, _state.cabinValvePosition << 10);
}
}
void MystScriptParser_Myst::boilerPressureIncrease_run() {
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
-
// Allow increasing pressure if sound has stopped
- if (!_vm->_sound->isPlaying(5098) && myst.cabinValvePosition < 25) {
- myst.cabinValvePosition++;
- if (myst.cabinValvePosition == 1) {
+ if (!_vm->_sound->isPlaying(5098) && _state.cabinValvePosition < 25) {
+ _state.cabinValvePosition++;
+ if (_state.cabinValvePosition == 1) {
// TODO: Play fire movie
// Draw fire
_vm->redrawArea(305);
- } else if (myst.cabinValvePosition == 25) {
- if (myst.cabinPilotLightLit == 1)
+ } else if (_state.cabinValvePosition == 25) {
+ if (_state.cabinPilotLightLit == 1)
_vm->_sound->replaceBackground(8098, 49152);
else
_vm->_sound->replaceBackground(4098, 25600);
@@ -1659,12 +1623,10 @@ void MystScriptParser_Myst::boilerPressureIncrease_run() {
}
void MystScriptParser_Myst::boilerPressureDecrease_run() {
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
-
// Allow decreasing pressure if sound has stopped
- if (!_vm->_sound->isPlaying(5098) && myst.cabinValvePosition > 0) {
- myst.cabinValvePosition--;
- if (myst.cabinValvePosition == 0) {
+ if (!_vm->_sound->isPlaying(5098) && _state.cabinValvePosition > 0) {
+ _state.cabinValvePosition--;
+ if (_state.cabinValvePosition == 0) {
// TODO: Play fire movie
// Draw fire
@@ -1690,20 +1652,19 @@ void MystScriptParser_Myst::o_boilerDecreasePressureStart(uint16 op, uint16 var,
void MystScriptParser_Myst::o_boilerDecreasePressureStop(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
debugC(kDebugScript, "Opcode %d: Boiler decrease pressure stop", op);
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
_treeStopped = false;
_boilerPressureDecreasing = false;
- myst.treeLastMoveTime = _vm->_system->getMillis();
+ _state.treeLastMoveTime = _vm->_system->getMillis();
- if (myst.cabinPilotLightLit == 1) {
- if (myst.cabinValvePosition > 0)
+ if (_state.cabinPilotLightLit == 1) {
+ if (_state.cabinValvePosition > 0)
_vm->_sound->replaceBackground(8098, 49152);
// TODO: Play movies
} else {
- if (myst.cabinValvePosition > 0)
- _vm->_sound->replaceBackground(4098, myst.cabinValvePosition << 10);
+ if (_state.cabinValvePosition > 0)
+ _vm->_sound->replaceBackground(4098, _state.cabinValvePosition << 10);
}
}
@@ -1717,19 +1678,15 @@ void MystScriptParser_Myst::o_basementIncreasePressureStart(uint16 op, uint16 va
void MystScriptParser_Myst::o_basementIncreasePressureStop(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
debugC(kDebugScript, "Opcode %d: Basement increase pressure stop", op);
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
-
_treeStopped = false;
_basementPressureIncreasing = false;
- myst.treeLastMoveTime = _vm->_system->getMillis();
+ _state.treeLastMoveTime = _vm->_system->getMillis();
}
void MystScriptParser_Myst::basementPressureIncrease_run() {
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
-
// Allow increasing pressure if sound has stopped
- if (!_vm->_sound->isPlaying(4642) && myst.cabinValvePosition < 25) {
- myst.cabinValvePosition++;
+ if (!_vm->_sound->isPlaying(4642) && _state.cabinValvePosition < 25) {
+ _state.cabinValvePosition++;
// Pressure increasing sound
_vm->_sound->replaceSound(4642);
@@ -1740,11 +1697,9 @@ void MystScriptParser_Myst::basementPressureIncrease_run() {
}
void MystScriptParser_Myst::basementPressureDecrease_run() {
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
-
// Allow decreasing pressure if sound has stopped
- if (!_vm->_sound->isPlaying(4642) && myst.cabinValvePosition > 0) {
- myst.cabinValvePosition--;
+ if (!_vm->_sound->isPlaying(4642) && _state.cabinValvePosition > 0) {
+ _state.cabinValvePosition--;
// Pressure decreasing sound
_vm->_sound->replaceSound(4642);
@@ -1764,19 +1719,15 @@ void MystScriptParser_Myst::o_basementDecreasePressureStart(uint16 op, uint16 va
void MystScriptParser_Myst::o_basementDecreasePressureStop(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
debugC(kDebugScript, "Opcode %d: Basement decrease pressure stop", op);
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
-
_treeStopped = false;
_basementPressureDecreasing = false;
- myst.treeLastMoveTime = _vm->_system->getMillis();
+ _state.treeLastMoveTime = _vm->_system->getMillis();
}
void MystScriptParser_Myst::tree_run() {
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
-
uint16 pressure;
- if (myst.cabinPilotLightLit)
- pressure = myst.cabinValvePosition;
+ if (_state.cabinPilotLightLit)
+ pressure = _state.cabinValvePosition;
else
pressure = 0;
@@ -1787,24 +1738,24 @@ void MystScriptParser_Myst::tree_run() {
goingDown = false;
// Tree is within bounds
- if ((myst.treePosition < 12 && !goingDown)
- || (myst.treePosition > _treeMinPosition && goingDown)) {
+ if ((_state.treePosition < 12 && !goingDown)
+ || (_state.treePosition > _treeMinPosition && goingDown)) {
uint16 delay = treeNextMoveDelay(pressure);
uint32 time = _vm->_system->getMillis();
- if (delay < time - myst.treeLastMoveTime) {
+ if (delay < time - _state.treeLastMoveTime) {
// Tree movement
if (goingDown) {
- myst.treePosition--;
+ _state.treePosition--;
_vm->_sound->replaceSound(2);
} else {
- myst.treePosition++;
+ _state.treePosition++;
_vm->_sound->replaceSound(1);
}
// Stop background music if going up from book room
if (_vm->getCurCard() == 4630) {
- if (myst.treePosition > 0)
+ if (_state.treePosition > 0)
_vm->_sound->stopBackground();
else
_vm->_sound->replaceBackground(4630, 24576);
@@ -1816,19 +1767,17 @@ void MystScriptParser_Myst::tree_run() {
// Check if alcove is accessible
treeSetAlcoveAccessible();
- myst.treeLastMoveTime = time;
+ _state.treeLastMoveTime = time;
}
}
}
}
void MystScriptParser_Myst::treeSetAlcoveAccessible() {
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
-
if (_treeAlcove) {
// Make alcove accessible if the tree is in the correct position
- _treeAlcove->setEnabled(myst.treePosition >= _treeMinAccessiblePosition
- && myst.treePosition <= _treeMaxAccessiblePosition);
+ _treeAlcove->setEnabled(_state.treePosition >= _treeMinAccessiblePosition
+ && _state.treePosition <= _treeMaxAccessiblePosition);
}
}
@@ -1857,36 +1806,32 @@ void MystScriptParser_Myst::o_rocketSoundSliderMove(uint16 op, uint16 var, uint1
void MystScriptParser_Myst::o_rocketSoundSliderEndMove(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
debugC(kDebugScript, "Opcode %d: Rocket slider end move", op);
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
-
_vm->checkCursorHints();
- if (myst.generatorVoltage == 59 && !myst.generatorBreakers) {
+ if (_state.generatorVoltage == 59 && !_state.generatorBreakers) {
if (_rocketSliderSound)
_vm->_sound->stopSound();
}
if (_invokingResource == _rocketSlider1) {
- myst.rocketSliderPosition[0] = _rocketSlider1->_pos.y;
+ _state.rocketSliderPosition[0] = _rocketSlider1->_pos.y;
} else if (_invokingResource == _rocketSlider2) {
- myst.rocketSliderPosition[1] = _rocketSlider2->_pos.y;
+ _state.rocketSliderPosition[1] = _rocketSlider2->_pos.y;
} else if (_invokingResource == _rocketSlider3) {
- myst.rocketSliderPosition[2] = _rocketSlider3->_pos.y;
+ _state.rocketSliderPosition[2] = _rocketSlider3->_pos.y;
} else if (_invokingResource == _rocketSlider4) {
- myst.rocketSliderPosition[3] = _rocketSlider4->_pos.y;
+ _state.rocketSliderPosition[3] = _rocketSlider4->_pos.y;
} else if (_invokingResource == _rocketSlider5) {
- myst.rocketSliderPosition[4] = _rocketSlider5->_pos.y;
+ _state.rocketSliderPosition[4] = _rocketSlider5->_pos.y;
}
_vm->_sound->resumeBackground();
}
void MystScriptParser_Myst::rocketSliderMove() {
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
-
MystResourceType10 *slider = static_cast<MystResourceType10 *>(_invokingResource);
- if (myst.generatorVoltage == 59 && !myst.generatorBreakers) {
+ if (_state.generatorVoltage == 59 && !_state.generatorBreakers) {
uint16 soundId = rocketSliderGetSound(slider->_pos.y);
if (soundId != _rocketSliderSound) {
_rocketSliderSound = soundId;
@@ -1964,7 +1909,6 @@ void MystScriptParser_Myst::rocketCheckSolution() {
void MystScriptParser_Myst::o_rocketPianoStart(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
debugC(kDebugScript, "Opcode %d: Rocket piano start move", op);
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
MystResourceType11 *key = static_cast<MystResourceType11 *>(_invokingResource);
// What the hell ??
@@ -1979,7 +1923,7 @@ void MystScriptParser_Myst::o_rocketPianoStart(uint16 op, uint16 var, uint16 arg
_vm->_system->updateScreen();
// Play note
- if (myst.generatorVoltage == 59 && !myst.generatorBreakers) {
+ if (_state.generatorVoltage == 59 && !_state.generatorBreakers) {
uint16 soundId = key->getList1(0);
_vm->_sound->replaceSound(soundId, Audio::Mixer::kMaxChannelVolume, true);
}
@@ -1990,7 +1934,6 @@ void MystScriptParser_Myst::o_rocketPianoMove(uint16 op, uint16 var, uint16 argc
const Common::Point &mouse = _vm->_system->getEventManager()->getMousePos();
Common::Rect piano = Common::Rect(85, 123, 460, 270);
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
// Unpress previous key
MystResourceType11 *key = static_cast<MystResourceType11 *>(_invokingResource);
@@ -2018,7 +1961,7 @@ void MystScriptParser_Myst::o_rocketPianoMove(uint16 op, uint16 var, uint16 argc
_vm->_gfx->copyImageSectionToScreen(key->_subImages[1].wdib, src, dest);
// Play note
- if (myst.generatorVoltage == 59 && !myst.generatorBreakers) {
+ if (_state.generatorVoltage == 59 && !_state.generatorBreakers) {
uint16 soundId = key->getList1(0);
_vm->_sound->replaceSound(soundId, Audio::Mixer::kMaxChannelVolume, true);
}
@@ -2073,7 +2016,6 @@ void MystScriptParser_Myst::o_rocketOpenBook(uint16 op, uint16 var, uint16 argc,
void MystScriptParser_Myst::o_rocketLeverMove(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
debugC(kDebugScript, "Opcode %d: Rocket lever move", op);
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
MystResourceType12 *lever = static_cast<MystResourceType12 *>(_invokingResource);
// Make the lever follow the mouse
@@ -2091,7 +2033,7 @@ void MystScriptParser_Myst::o_rocketLeverMove(uint16 op, uint16 var, uint16 argc
_vm->_sound->replaceSound(soundId);
// If rocket correctly powered
- if (myst.generatorVoltage == 59 && !myst.generatorBreakers) {
+ if (_state.generatorVoltage == 59 && !_state.generatorBreakers) {
rocketCheckSolution();
}
}
@@ -2124,32 +2066,28 @@ void MystScriptParser_Myst::o_cabinLeave(uint16 op, uint16 var, uint16 argc, uin
void MystScriptParser_Myst::o_treePressureReleaseStart(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
debugC(kDebugScript, "Opcode %d: Tree pressure release start", op);
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
-
Common::Rect src = Common::Rect(0, 0, 49, 86);
Common::Rect dest = Common::Rect(78, 46, 127, 132);
_vm->_gfx->copyImageSectionToScreen(4631, src, dest);
_vm->_system->updateScreen();
- _tempVar = myst.cabinValvePosition;
+ _tempVar = _state.cabinValvePosition;
- if (myst.treePosition >= 4) {
- myst.cabinValvePosition = 0;
+ if (_state.treePosition >= 4) {
+ _state.cabinValvePosition = 0;
_treeMinPosition = 4;
- myst.treeLastMoveTime = 0;
+ _state.treeLastMoveTime = 0;
}
}
void MystScriptParser_Myst::o_treePressureReleaseStop(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
debugC(kDebugScript, "Opcode %d: Tree pressure release stop", op);
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
-
Common::Rect rect = Common::Rect(78, 46, 127, 132);
_vm->_gfx->copyBackBufferToScreen(rect);
_vm->_system->updateScreen();
- myst.cabinValvePosition = _tempVar;
+ _state.cabinValvePosition = _tempVar;
_treeMinPosition = 0;
}
@@ -2307,14 +2245,12 @@ void MystScriptParser_Myst::clockWheelStartTurn(uint16 wheel) {
}
void MystScriptParser_Myst::clockWheelTurn(uint16 var) {
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
-
if (var == 38) {
// Hours
- myst.clockTowerHourPosition = (myst.clockTowerHourPosition + 1) % 12;
+ _state.clockTowerHourPosition = (_state.clockTowerHourPosition + 1) % 12;
} else {
// Minutes
- myst.clockTowerMinutePosition = (myst.clockTowerMinutePosition + 5) % 60;
+ _state.clockTowerMinutePosition = (_state.clockTowerMinutePosition + 5) % 60;
}
}
@@ -2428,7 +2364,6 @@ void MystScriptParser_Myst::opcode_197(uint16 op, uint16 var, uint16 argc, uint1
void MystScriptParser_Myst::o_dockVaultForceClose(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
// Used on Myst 4143 (Dock near Marker Switch)
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
uint16 soundId = argv[0];
uint16 delay = argv[1];
uint16 directionalUpdateDataSize = argv[2];
@@ -2439,7 +2374,7 @@ void MystScriptParser_Myst::o_dockVaultForceClose(uint16 op, uint16 var, uint16
if (_dockVaultState) {
// Open switch
- myst.dockMarkerSwitch = 1;
+ _state.dockMarkerSwitch = 1;
_vm->_sound->replaceSound(4143);
_vm->redrawArea(4);
@@ -2563,35 +2498,33 @@ void MystScriptParser_Myst::towerRotationDrawBuildings() {
}
uint16 MystScriptParser_Myst::towerRotationMapComputeAngle() {
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
-
_towerRotationSpeed++;
if (_towerRotationSpeed >= 7)
_towerRotationSpeed = 7;
else
_towerRotationSpeed++;
- myst.towerRotationAngle = (myst.towerRotationAngle + _towerRotationSpeed) % 360;
- uint16 angle = myst.towerRotationAngle;
+ _state.towerRotationAngle = (_state.towerRotationAngle + _towerRotationSpeed) % 360;
+ uint16 angle = _state.towerRotationAngle;
_towerRotationOverSpot = false;
if (angle >= 265 && angle <= 277
- && myst.rocketshipMarkerSwitch) {
+ && _state.rocketshipMarkerSwitch) {
angle = 271;
_towerRotationOverSpot = true;
_towerRotationSpeed = 1;
} else if (angle >= 77 && angle <= 89
- && myst.gearsMarkerSwitch) {
+ && _state.gearsMarkerSwitch) {
angle = 83;
_towerRotationOverSpot = true;
_towerRotationSpeed = 1;
} else if (angle >= 123 && angle <= 135
- && myst.dockMarkerSwitch) {
+ && _state.dockMarkerSwitch) {
angle = 129;
_towerRotationOverSpot = true;
_towerRotationSpeed = 1;
} else if (angle >= 146 && angle <= 158
- && myst.cabinMarkerSwitch) {
+ && _state.cabinMarkerSwitch) {
angle = 152;
_towerRotationOverSpot = true;
_towerRotationSpeed = 1;
@@ -2660,10 +2593,8 @@ void MystScriptParser_Myst::o_forechamberDoor_init(uint16 op, uint16 var, uint16
}
void MystScriptParser_Myst::o_shipAccess_init(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
-
// Enable acces to the ship
- if (myst.shipFloating) {
+ if (_state.shipFloating) {
_invokingResource->setEnabled(true);
}
}
@@ -2685,11 +2616,9 @@ void MystScriptParser_Myst::o_imager_init(uint16 op, uint16 var, uint16 argc, ui
}
void MystScriptParser_Myst::imager_run() {
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
-
_imagerRunning = false;
- if (myst.imagerActive && myst.imagerSelection == 67) {
+ if (_state.imagerActive && _state.imagerSelection == 67) {
// TODO: play between 1814 and 4204 looping
_imagerMovie->playMovie();
}
@@ -2716,13 +2645,11 @@ void MystScriptParser_Myst::o_libraryBookcaseTransform_init(uint16 op, uint16 va
}
void MystScriptParser_Myst::generatorControlRoom_run(void) {
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
-
- if (_generatorVoltage == myst.generatorVoltage) {
+ if (_generatorVoltage == _state.generatorVoltage) {
generatorRedrawRocket();
} else {
// Animate generator gauge
- if (_generatorVoltage > myst.generatorVoltage)
+ if (_generatorVoltage > _state.generatorVoltage)
_generatorVoltage--;
else
_generatorVoltage++;
@@ -2735,11 +2662,9 @@ void MystScriptParser_Myst::generatorControlRoom_run(void) {
}
void MystScriptParser_Myst::o_generatorControlRoom_init(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
-
debugC(kDebugScript, "Opcode %d: Generator control room init", op);
- _generatorVoltage = myst.generatorVoltage;
+ _generatorVoltage = _state.generatorVoltage;
_generatorControlRoomRunning = true;
}
@@ -2878,28 +2803,26 @@ void MystScriptParser_Myst::opcode_218(uint16 op, uint16 var, uint16 argc, uint1
void MystScriptParser_Myst::o_rocketSliders_init(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
debugC(kDebugScript, "Opcode %d: Rocket sliders init", op);
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
-
_rocketSlider1 = static_cast<MystResourceType10 *>(_vm->_resources[argv[0]]);
_rocketSlider2 = static_cast<MystResourceType10 *>(_vm->_resources[argv[1]]);
_rocketSlider3 = static_cast<MystResourceType10 *>(_vm->_resources[argv[2]]);
_rocketSlider4 = static_cast<MystResourceType10 *>(_vm->_resources[argv[3]]);
_rocketSlider5 = static_cast<MystResourceType10 *>(_vm->_resources[argv[4]]);
- if (myst.rocketSliderPosition[0]) {
- _rocketSlider1->setPosition(myst.rocketSliderPosition[0]);
+ if (_state.rocketSliderPosition[0]) {
+ _rocketSlider1->setPosition(_state.rocketSliderPosition[0]);
}
- if (myst.rocketSliderPosition[1]) {
- _rocketSlider2->setPosition(myst.rocketSliderPosition[1]);
+ if (_state.rocketSliderPosition[1]) {
+ _rocketSlider2->setPosition(_state.rocketSliderPosition[1]);
}
- if (myst.rocketSliderPosition[2]) {
- _rocketSlider3->setPosition(myst.rocketSliderPosition[2]);
+ if (_state.rocketSliderPosition[2]) {
+ _rocketSlider3->setPosition(_state.rocketSliderPosition[2]);
}
- if (myst.rocketSliderPosition[3]) {
- _rocketSlider4->setPosition(myst.rocketSliderPosition[3]);
+ if (_state.rocketSliderPosition[3]) {
+ _rocketSlider4->setPosition(_state.rocketSliderPosition[3]);
}
- if (myst.rocketSliderPosition[4]) {
- _rocketSlider5->setPosition(myst.rocketSliderPosition[4]);
+ if (_state.rocketSliderPosition[4]) {
+ _rocketSlider5->setPosition(_state.rocketSliderPosition[4]);
}
}
@@ -2912,14 +2835,11 @@ void MystScriptParser_Myst::o_greenBook_init(uint16 op, uint16 var, uint16 argc,
// Used for Card 4168 (Green Book Movies)
debugC(kDebugScript, "Opcode %d: Green book init", op);
- MystVariables::Globals &globals = _vm->_saveLoad->_v->globals;
- MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
-
uint loopStart = 0;
uint loopEnd = 0;
Common::String file;
- if (!myst.greenBookOpenedBefore) {
+ if (!_state.greenBookOpenedBefore) {
loopStart = 113200;
loopEnd = 116400;
file = _vm->wrapMovieFilename("atrusbk1", kMystStack);
@@ -2932,7 +2852,7 @@ void MystScriptParser_Myst::o_greenBook_init(uint16 op, uint16 var, uint16 argc,
_vm->_sound->stopSound();
_vm->_sound->pauseBackground();
- if (globals.ending != 4) {
+ if (_globals.ending != 4) {
_vm->_video->playBackgroundMovie(file, 314, 76);
}
diff --git a/engines/mohawk/myst_stacks/myst.h b/engines/mohawk/myst_stacks/myst.h
index 9b65e4174f..fa87009dc0 100644
--- a/engines/mohawk/myst_stacks/myst.h
+++ b/engines/mohawk/myst_stacks/myst.h
@@ -180,6 +180,8 @@ private:
DECLARE_OPCODE(opcode_309);
DECLARE_OPCODE(opcode_312);
+ MystGameState::Myst &_state;
+
bool _generatorControlRoomRunning;
uint16 _generatorVoltage; // 58
diff --git a/engines/mohawk/myst_stacks/selenitic.cpp b/engines/mohawk/myst_stacks/selenitic.cpp
index 38b457e0cb..43c2f97d7e 100644
--- a/engines/mohawk/myst_stacks/selenitic.cpp
+++ b/engines/mohawk/myst_stacks/selenitic.cpp
@@ -36,7 +36,8 @@
namespace Mohawk {
-MystScriptParser_Selenitic::MystScriptParser_Selenitic(MohawkEngine_Myst *vm) : MystScriptParser(vm) {
+MystScriptParser_Selenitic::MystScriptParser_Selenitic(MohawkEngine_Myst *vm) :
+ MystScriptParser(vm), _state(vm->_gameState->_selenitic) {
setupOpcodes();
_invokingResource = NULL;
_mazeRunnerPosition = 288;
@@ -91,24 +92,21 @@ void MystScriptParser_Selenitic::runPersistentScripts() {
}
uint16 MystScriptParser_Selenitic::getVar(uint16 var) {
- MystVariables::Globals &globals = _vm->_saveLoad->_v->globals;
- MystVariables::Selenitic &selenitic = _vm->_saveLoad->_v->selenitic;
-
switch(var) {
case 0: // Sound receiver emitters enabled
- return selenitic.emitterEnabledWind;
+ return _state.emitterEnabledWind;
case 1:
- return selenitic.emitterEnabledVolcano;
+ return _state.emitterEnabledVolcano;
case 2:
- return selenitic.emitterEnabledClock;
+ return _state.emitterEnabledClock;
case 3:
- return selenitic.emitterEnabledWater;
+ return _state.emitterEnabledWater;
case 4:
- return selenitic.emitterEnabledCrystal;
+ return _state.emitterEnabledCrystal;
case 5: // Sound receiver opened
- return selenitic.soundReceiverOpened;
+ return _state.soundReceiverOpened;
case 6: // Tunnel lights
- return selenitic.tunnelLightsSwitchedOn;
+ return _state.tunnelLightsSwitchedOn;
case 7:// Maze runner display
if (_mazeRunnerPosition == 288) {
return 0;
@@ -122,15 +120,15 @@ uint16 MystScriptParser_Selenitic::getVar(uint16 var) {
case 8: // Viewer
return 0;
case 9: // Sound receiver selected source
- return selenitic.soundReceiverCurrentSource == 0;
+ return _state.soundReceiverCurrentSource == 0;
case 10:
- return selenitic.soundReceiverCurrentSource == 1;
+ return _state.soundReceiverCurrentSource == 1;
case 11:
- return selenitic.soundReceiverCurrentSource == 2;
+ return _state.soundReceiverCurrentSource == 2;
case 12:
- return selenitic.soundReceiverCurrentSource == 3;
+ return _state.soundReceiverCurrentSource == 3;
case 13:
- return selenitic.soundReceiverCurrentSource == 4;
+ return _state.soundReceiverCurrentSource == 4;
case 14: // Sound receiver position
return (*_soundReceiverPosition) / 1000;
case 15:
@@ -161,55 +159,52 @@ uint16 MystScriptParser_Selenitic::getVar(uint16 var) {
case 33: // Maze runner at entry
return _mazeRunnerPosition != 288;
case 102: // Red page
- return !(globals.redPagesInBook & 2) && (globals.heldPage != 8);
+ return !(_globals.redPagesInBook & 2) && (_globals.heldPage != 8);
case 103: // Blue page
- return !(globals.bluePagesInBook & 2) && (globals.heldPage != 2);
+ return !(_globals.bluePagesInBook & 2) && (_globals.heldPage != 2);
default:
return MystScriptParser::getVar(var);
}
}
void MystScriptParser_Selenitic::toggleVar(uint16 var) {
- MystVariables::Globals &globals = _vm->_saveLoad->_v->globals;
- MystVariables::Selenitic &selenitic = _vm->_saveLoad->_v->selenitic;
-
switch(var) {
case 0: // Sound receiver emitters enabled
- selenitic.emitterEnabledWind = (selenitic.emitterEnabledWind + 1) % 2;
+ _state.emitterEnabledWind = (_state.emitterEnabledWind + 1) % 2;
break;
case 1:
- selenitic.emitterEnabledVolcano = (selenitic.emitterEnabledVolcano + 1) % 2;
+ _state.emitterEnabledVolcano = (_state.emitterEnabledVolcano + 1) % 2;
break;
case 2:
- selenitic.emitterEnabledClock = (selenitic.emitterEnabledClock + 1) % 2;
+ _state.emitterEnabledClock = (_state.emitterEnabledClock + 1) % 2;
break;
case 3:
- selenitic.emitterEnabledWater = (selenitic.emitterEnabledWater + 1) % 2;
+ _state.emitterEnabledWater = (_state.emitterEnabledWater + 1) % 2;
break;
case 4:
- selenitic.emitterEnabledCrystal = (selenitic.emitterEnabledCrystal + 1) % 2;
+ _state.emitterEnabledCrystal = (_state.emitterEnabledCrystal + 1) % 2;
break;
case 5: // Sound receiver opened
- selenitic.soundReceiverOpened = (selenitic.soundReceiverOpened + 1) % 2;
+ _state.soundReceiverOpened = (_state.soundReceiverOpened + 1) % 2;
break;
case 6: // Tunnel lights
- selenitic.tunnelLightsSwitchedOn = (selenitic.tunnelLightsSwitchedOn + 1) % 2;
+ _state.tunnelLightsSwitchedOn = (_state.tunnelLightsSwitchedOn + 1) % 2;
break;
case 102: // Red page
- if (!(globals.redPagesInBook & 2)) {
- if (globals.heldPage == 8)
- globals.heldPage = 0;
+ if (!(_globals.redPagesInBook & 2)) {
+ if (_globals.heldPage == 8)
+ _globals.heldPage = 0;
else {
- globals.heldPage = 8;
+ _globals.heldPage = 8;
}
}
break;
case 103: // Blue page
- if (!(globals.bluePagesInBook & 2)) {
- if (globals.heldPage == 2)
- globals.heldPage = 0;
+ if (!(_globals.bluePagesInBook & 2)) {
+ if (_globals.heldPage == 2)
+ _globals.heldPage = 0;
else {
- globals.heldPage = 2;
+ _globals.heldPage = 2;
}
}
break;
@@ -220,66 +215,65 @@ void MystScriptParser_Selenitic::toggleVar(uint16 var) {
}
bool MystScriptParser_Selenitic::setVarValue(uint16 var, uint16 value) {
- MystVariables::Selenitic &selenitic = _vm->_saveLoad->_v->selenitic;
bool refresh = false;
switch (var) {
case 0: // Sound receiver emitters enabled
- if (selenitic.emitterEnabledWind != value) {
- selenitic.emitterEnabledWind = value;
+ if (_state.emitterEnabledWind != value) {
+ _state.emitterEnabledWind = value;
refresh = true;
}
break;
case 1:
- if (selenitic.emitterEnabledVolcano != value) {
- selenitic.emitterEnabledVolcano = value;
+ if (_state.emitterEnabledVolcano != value) {
+ _state.emitterEnabledVolcano = value;
refresh = true;
}
break;
case 2:
- if (selenitic.emitterEnabledClock != value) {
- selenitic.emitterEnabledClock = value;
+ if (_state.emitterEnabledClock != value) {
+ _state.emitterEnabledClock = value;
refresh = true;
}
break;
case 3:
- if (selenitic.emitterEnabledWater != value) {
- selenitic.emitterEnabledWater = value;
+ if (_state.emitterEnabledWater != value) {
+ _state.emitterEnabledWater = value;
refresh = true;
}
break;
case 4:
- if (selenitic.emitterEnabledCrystal != value) {
- selenitic.emitterEnabledCrystal = value;
+ if (_state.emitterEnabledCrystal != value) {
+ _state.emitterEnabledCrystal = value;
refresh = true;
}
break;
case 5: // Sound receiver opened
- if (selenitic.soundReceiverOpened != value) {
- selenitic.soundReceiverOpened = value;
+ if (_state.soundReceiverOpened != value) {
+ _state.soundReceiverOpened = value;
refresh = true;
}
break;
case 6: // Tunnel lights
- if (selenitic.tunnelLightsSwitchedOn != value) {
- selenitic.tunnelLightsSwitchedOn = value;
+ if (_state.tunnelLightsSwitchedOn != value) {
+ _state.tunnelLightsSwitchedOn = value;
refresh = true;
}
break;
case 20: // Sound lock sliders
- selenitic.soundLockSliderPositions[0] = value;
+ _state.soundLockSliderPositions[0] = value;
break;
case 21:
- selenitic.soundLockSliderPositions[1] = value;
+ _state.soundLockSliderPositions[1] = value;
break;
case 22:
- selenitic.soundLockSliderPositions[2] = value;
+ _state.soundLockSliderPositions[2] = value;
break;
case 23:
- selenitic.soundLockSliderPositions[3] = value;
+ _state.soundLockSliderPositions[3] = value;
break;
case 24:
- selenitic.soundLockSliderPositions[4] = value;
+ _state.soundLockSliderPositions[4] = value;
break;
case 30:
_mazeRunnerDoorOpened = value;
@@ -592,8 +586,6 @@ void MystScriptParser_Selenitic::o_mazeRunnerSoundRepeat(uint16 op, uint16 var,
* Sound receiver sigma button
*/
void MystScriptParser_Selenitic::o_soundReceiverSigma(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- MystVariables::Selenitic &selenitic = _vm->_saveLoad->_v->selenitic;
-
debugC(kDebugScript, "Opcode %d: Sound receiver sigma button", op);
_vm->_cursor->hideCursor();
@@ -622,7 +614,7 @@ void MystScriptParser_Selenitic::o_soundReceiverSigma(uint16 op, uint16 var, uin
break;
}
- _soundReceiverPosition = &selenitic.soundReceiverPositions[source];
+ _soundReceiverPosition = &_state.soundReceiverPositions[source];
_vm->_sound->stopBackground();
_vm->_sound->replaceSound(2287);
soundReceiverDrawView();
@@ -635,7 +627,7 @@ void MystScriptParser_Selenitic::o_soundReceiverSigma(uint16 op, uint16 var, uin
_soundReceiverSigmaPressed = true;
_vm->_sound->stopBackground();
- _soundReceiverSources[selenitic.soundReceiverCurrentSource]->drawConditionalDataToScreen(1);
+ _soundReceiverSources[_state.soundReceiverCurrentSource]->drawConditionalDataToScreen(1);
soundReceiverDrawView();
@@ -714,8 +706,6 @@ void MystScriptParser_Selenitic::soundReceiverDrawAngle() {
* Sound receiver source selection buttons
*/
void MystScriptParser_Selenitic::o_soundReceiverSource(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- MystVariables::Selenitic &selenitic = _vm->_saveLoad->_v->selenitic;
-
debugC(kDebugScript, "Opcode %d: Sound receiver source", op);
if (_soundReceiverSigmaPressed) {
@@ -727,12 +717,12 @@ void MystScriptParser_Selenitic::o_soundReceiverSource(uint16 op, uint16 var, ui
uint pressedButton = var - 9;
- if (selenitic.soundReceiverCurrentSource != pressedButton) {
- selenitic.soundReceiverCurrentSource = pressedButton;
+ if (_state.soundReceiverCurrentSource != pressedButton) {
+ _state.soundReceiverCurrentSource = pressedButton;
_soundReceiverCurrentSource->drawConditionalDataToScreen(0);
- _soundReceiverPosition = &selenitic.soundReceiverPositions[pressedButton];
+ _soundReceiverPosition = &_state.soundReceiverPositions[pressedButton];
_soundReceiverCurrentSource = _soundReceiverSources[pressedButton];
_vm->_sound->stopSound();
@@ -841,25 +831,24 @@ void MystScriptParser_Selenitic::o_soundLockStartMove(uint16 op, uint16 var, uin
void MystScriptParser_Selenitic::o_soundLockEndMove(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
debugC(kDebugScript, "Opcode %d: Sound lock end move", op);
- MystVariables::Selenitic &selenitic = _vm->_saveLoad->_v->selenitic;
MystResourceType10 *slider = soundLockSliderFromVar(var);
uint16 *value = 0;
switch (var) {
case 20: // Sound lock sliders
- value = &selenitic.soundLockSliderPositions[0];
+ value = &_state.soundLockSliderPositions[0];
break;
case 21:
- value = &selenitic.soundLockSliderPositions[1];
+ value = &_state.soundLockSliderPositions[1];
break;
case 22:
- value = &selenitic.soundLockSliderPositions[2];
+ value = &_state.soundLockSliderPositions[2];
break;
case 23:
- value = &selenitic.soundLockSliderPositions[3];
+ value = &_state.soundLockSliderPositions[3];
break;
case 24:
- value = &selenitic.soundLockSliderPositions[4];
+ value = &_state.soundLockSliderPositions[4];
break;
}
@@ -899,7 +888,6 @@ void MystScriptParser_Selenitic::soundLockCheckSolution(MystResourceType10 *slid
void MystScriptParser_Selenitic::o_soundLockButton(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
debugC(kDebugScript, "Opcode %d: Sound lock button", op);
- MystVariables::Selenitic &selenitic = _vm->_saveLoad->_v->selenitic;
bool solved = true;
_vm->_sound->pauseBackground();
@@ -907,11 +895,11 @@ void MystScriptParser_Selenitic::o_soundLockButton(uint16 op, uint16 var, uint16
_soundLockButton->drawConditionalDataToScreen(1);
_vm->_cursor->hideCursor();
- soundLockCheckSolution(_soundLockSlider1, selenitic.soundLockSliderPositions[0], 5, solved);
- soundLockCheckSolution(_soundLockSlider2, selenitic.soundLockSliderPositions[1], 9, solved);
- soundLockCheckSolution(_soundLockSlider3, selenitic.soundLockSliderPositions[2], 0, solved);
- soundLockCheckSolution(_soundLockSlider4, selenitic.soundLockSliderPositions[3], 6, solved);
- soundLockCheckSolution(_soundLockSlider5, selenitic.soundLockSliderPositions[4], 7, solved);
+ soundLockCheckSolution(_soundLockSlider1, _state.soundLockSliderPositions[0], 5, solved);
+ soundLockCheckSolution(_soundLockSlider2, _state.soundLockSliderPositions[1], 9, solved);
+ soundLockCheckSolution(_soundLockSlider3, _state.soundLockSliderPositions[2], 0, solved);
+ soundLockCheckSolution(_soundLockSlider4, _state.soundLockSliderPositions[3], 6, solved);
+ soundLockCheckSolution(_soundLockSlider5, _state.soundLockSliderPositions[4], 7, solved);
_vm->_sound->replaceSound(1148);
_vm->_sound->resumeBackground();
@@ -1006,9 +994,7 @@ void MystScriptParser_Selenitic::soundReceiverIncreaseSpeed() {
}
void MystScriptParser_Selenitic::soundReceiverUpdateSound() {
- MystVariables::Selenitic &selenitic = _vm->_saveLoad->_v->selenitic;
-
- uint16 soundId = soundReceiverCurrentSound(selenitic.soundReceiverCurrentSource, *_soundReceiverPosition);
+ uint16 soundId = soundReceiverCurrentSound(_state.soundReceiverCurrentSource, *_soundReceiverPosition);
_vm->_sound->replaceSound(soundId);
}
@@ -1064,35 +1050,31 @@ uint16 MystScriptParser_Selenitic::soundReceiverCurrentSound(uint16 source, uint
}
void MystScriptParser_Selenitic::soundReceiverSolution(uint16 source, uint16 &solution, bool &enabled) {
- MystVariables::Selenitic &selenitic = _vm->_saveLoad->_v->selenitic;
-
switch (source) {
case 0:
- enabled = selenitic.emitterEnabledWater;
+ enabled = _state.emitterEnabledWater;
solution = 1534;
break;
case 1:
- enabled = selenitic.emitterEnabledVolcano;
+ enabled = _state.emitterEnabledVolcano;
solution = 1303;
break;
case 2:
- enabled = selenitic.emitterEnabledClock;
+ enabled = _state.emitterEnabledClock;
solution = 556;
break;
case 3:
- enabled = selenitic.emitterEnabledCrystal;
+ enabled = _state.emitterEnabledCrystal;
solution = 150;
break;
case 4:
- enabled = selenitic.emitterEnabledWind;
+ enabled = _state.emitterEnabledWind;
solution = 2122;
break;
}
}
void MystScriptParser_Selenitic::o_soundReceiver_init(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- MystVariables::Selenitic &selenitic = _vm->_saveLoad->_v->selenitic;
-
debugC(kDebugScript, "Opcode %d: Sound receiver init", op);
// Used for Card 1245 (Sound Receiver)
@@ -1112,16 +1094,14 @@ void MystScriptParser_Selenitic::o_soundReceiver_init(uint16 op, uint16 var, uin
_soundReceiverAngle3 = static_cast<MystResourceType8 *>(_vm->_resources[12]);
_soundReceiverAngle4 = static_cast<MystResourceType8 *>(_vm->_resources[13]);
- uint16 currentSource = selenitic.soundReceiverCurrentSource;
- _soundReceiverPosition = &selenitic.soundReceiverPositions[currentSource];
+ uint16 currentSource = _state.soundReceiverCurrentSource;
+ _soundReceiverPosition = &_state.soundReceiverPositions[currentSource];
_soundReceiverCurrentSource = _soundReceiverSources[currentSource];
_soundReceiverSigmaPressed = false;
}
void MystScriptParser_Selenitic::o_soundLock_init(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
- MystVariables::Selenitic &selenitic = _vm->_saveLoad->_v->selenitic;
-
debugC(kDebugScript, "Opcode %d: Sound lock init", op);
for (uint i = 0; i < _vm->_resources.size(); i++) {
@@ -1129,23 +1109,23 @@ void MystScriptParser_Selenitic::o_soundLock_init(uint16 op, uint16 var, uint16
switch (_vm->_resources[i]->getType8Var()) {
case 20:
_soundLockSlider1 = static_cast<MystResourceType10 *>(_vm->_resources[i]);
- _soundLockSlider1->setStep(selenitic.soundLockSliderPositions[0]);
+ _soundLockSlider1->setStep(_state.soundLockSliderPositions[0]);
break;
case 21:
_soundLockSlider2 = static_cast<MystResourceType10 *>(_vm->_resources[i]);
- _soundLockSlider2->setStep(selenitic.soundLockSliderPositions[1]);
+ _soundLockSlider2->setStep(_state.soundLockSliderPositions[1]);
break;
case 22:
_soundLockSlider3 = static_cast<MystResourceType10 *>(_vm->_resources[i]);
- _soundLockSlider3->setStep(selenitic.soundLockSliderPositions[2]);
+ _soundLockSlider3->setStep(_state.soundLockSliderPositions[2]);
break;
case 23:
_soundLockSlider4 = static_cast<MystResourceType10 *>(_vm->_resources[i]);
- _soundLockSlider4->setStep(selenitic.soundLockSliderPositions[3]);
+ _soundLockSlider4->setStep(_state.soundLockSliderPositions[3]);
break;
case 24:
_soundLockSlider5 = static_cast<MystResourceType10 *>(_vm->_resources[i]);
- _soundLockSlider5->setStep(selenitic.soundLockSliderPositions[4]);
+ _soundLockSlider5->setStep(_state.soundLockSliderPositions[4]);
break;
}
} else if (_vm->_resources[i]->type == kMystConditionalImage) {
diff --git a/engines/mohawk/myst_stacks/selenitic.h b/engines/mohawk/myst_stacks/selenitic.h
index cb0f31f93b..54e9db4d66 100644
--- a/engines/mohawk/myst_stacks/selenitic.h
+++ b/engines/mohawk/myst_stacks/selenitic.h
@@ -76,6 +76,8 @@ private:
void soundReceiver_run();
+ MystGameState::Selenitic &_state;
+
bool _soundReceiverRunning;
bool _soundReceiverSigmaPressed; // 6
MystResourceType8 *_soundReceiverSources[5]; // 92 -> 108
diff --git a/engines/mohawk/myst_stacks/stoneship.cpp b/engines/mohawk/myst_stacks/stoneship.cpp
index 7bd2ee1021..eb281d14e1 100644
--- a/engines/mohawk/myst_stacks/stoneship.cpp
+++ b/engines/mohawk/myst_stacks/stoneship.cpp
@@ -35,7 +35,8 @@
namespace Mohawk {
-MystScriptParser_Stoneship::MystScriptParser_Stoneship(MohawkEngine_Myst *vm) : MystScriptParser(vm) {
+MystScriptParser_Stoneship::MystScriptParser_Stoneship(MohawkEngine_Myst *vm) :
+ MystScriptParser(vm), _state(vm->_gameState->_stoneship) {
setupOpcodes();
}
@@ -92,9 +93,6 @@ void MystScriptParser_Stoneship::runPersistentScripts() {
}
uint16 MystScriptParser_Stoneship::getVar(uint16 var) {
-// MystVariables::Globals &globals = _vm->_saveLoad->_v->globals;
-// MystVariables::Stoneship &stoneship = _vm->_saveLoad->_v->stoneship;
-
switch(var) {
//case 0: // Water Drained From Lighthouse / Right Button Of Pump
// return 0; // Water Present / Button Dark
@@ -152,9 +150,6 @@ uint16 MystScriptParser_Stoneship::getVar(uint16 var) {
}
void MystScriptParser_Stoneship::toggleVar(uint16 var) {
-// MystVariables::Globals &globals = _vm->_saveLoad->_v->globals;
-// MystVariables::Stoneship &stoneship = _vm->_saveLoad->_v->stoneship;
-
switch(var) {
default:
MystScriptParser::toggleVar(var);
@@ -163,7 +158,6 @@ void MystScriptParser_Stoneship::toggleVar(uint16 var) {
}
bool MystScriptParser_Stoneship::setVarValue(uint16 var, uint16 value) {
-// MystVariables::Stoneship &stoneship = _vm->_saveLoad->_v->stoneship;
bool refresh = false;
switch (var) {
diff --git a/engines/mohawk/myst_stacks/stoneship.h b/engines/mohawk/myst_stacks/stoneship.h
index a0c7151bc1..9e65b9c33f 100644
--- a/engines/mohawk/myst_stacks/stoneship.h
+++ b/engines/mohawk/myst_stacks/stoneship.h
@@ -85,6 +85,8 @@ private:
DECLARE_OPCODE(opcode_210);
DECLARE_OPCODE(opcode_300);
+
+ MystGameState::Stoneship &_state;
};
}