[Scummvm-cvs-logs] SF.net SVN: scummvm:[55041] scummvm/trunk/engines/mohawk

bgk at users.sourceforge.net bgk at users.sourceforge.net
Sun Dec 26 15:31:04 CET 2010


Revision: 55041
          http://scummvm.svn.sourceforge.net/scummvm/?rev=55041&view=rev
Author:   bgk
Date:     2010-12-26 14:31:03 +0000 (Sun, 26 Dec 2010)

Log Message:
-----------
MOHAWK: Merge classes MystVariables and MystSaveLoad to form MystGameState

Modified Paths:
--------------
    scummvm/trunk/engines/mohawk/myst.cpp
    scummvm/trunk/engines/mohawk/myst.h
    scummvm/trunk/engines/mohawk/myst_saveload.cpp
    scummvm/trunk/engines/mohawk/myst_saveload.h
    scummvm/trunk/engines/mohawk/myst_scripts.cpp
    scummvm/trunk/engines/mohawk/myst_scripts.h
    scummvm/trunk/engines/mohawk/myst_stacks/channelwood.cpp
    scummvm/trunk/engines/mohawk/myst_stacks/channelwood.h
    scummvm/trunk/engines/mohawk/myst_stacks/dni.cpp
    scummvm/trunk/engines/mohawk/myst_stacks/dni.h
    scummvm/trunk/engines/mohawk/myst_stacks/intro.cpp
    scummvm/trunk/engines/mohawk/myst_stacks/mechanical.cpp
    scummvm/trunk/engines/mohawk/myst_stacks/mechanical.h
    scummvm/trunk/engines/mohawk/myst_stacks/myst.cpp
    scummvm/trunk/engines/mohawk/myst_stacks/myst.h
    scummvm/trunk/engines/mohawk/myst_stacks/selenitic.cpp
    scummvm/trunk/engines/mohawk/myst_stacks/selenitic.h
    scummvm/trunk/engines/mohawk/myst_stacks/stoneship.cpp
    scummvm/trunk/engines/mohawk/myst_stacks/stoneship.h

Modified: scummvm/trunk/engines/mohawk/myst.cpp
===================================================================
--- scummvm/trunk/engines/mohawk/myst.cpp	2010-12-26 13:58:39 UTC (rev 55040)
+++ scummvm/trunk/engines/mohawk/myst.cpp	2010-12-26 14:31:03 UTC (rev 55041)
@@ -87,7 +87,7 @@
 	_console = NULL;
 	_scriptParser = NULL;
 	_varStore = NULL;
-	_saveLoad = NULL;
+	_gameState = NULL;
 	_loadDialog = NULL;
 	_optionsDialog = NULL;
 
@@ -116,7 +116,7 @@
 	delete _console;
 	delete _scriptParser;
 	delete _varStore;
-	delete _saveLoad;
+	delete _gameState;
 	delete _loadDialog;
 	delete _optionsDialog;
 	delete _prevStack;
@@ -255,7 +255,7 @@
 	_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 @@
 	// 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 @@
 
 	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 @@
 		_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 @@
 		_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 @@
 }
 
 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() {

Modified: scummvm/trunk/engines/mohawk/myst.h
===================================================================
--- scummvm/trunk/engines/mohawk/myst.h	2010-12-26 13:58:39 UTC (rev 55040)
+++ scummvm/trunk/engines/mohawk/myst.h	2010-12-26 14:31:03 UTC (rev 55041)
@@ -43,7 +43,7 @@
 class MystGraphics;
 class MystScriptParser;
 class MystConsole;
-class MystSaveLoad;
+class MystGameState;
 class MystOptionsDialog;
 class MystResource;
 class MystResourceType8;
@@ -172,7 +172,7 @@
 
 	MystView _view;
 	MystGraphics *_gfx;
-	MystSaveLoad *_saveLoad;
+	MystGameState *_gameState;
 	MystScriptParser *_scriptParser;
 	Common::Array<MystResource*> _resources;
 	MystResource *_dragResource;

Modified: scummvm/trunk/engines/mohawk/myst_saveload.cpp
===================================================================
--- scummvm/trunk/engines/mohawk/myst_saveload.cpp	2010-12-26 13:58:39 UTC (rev 55040)
+++ scummvm/trunk/engines/mohawk/myst_saveload.cpp	2010-12-26 14:31:03 UTC (rev 55041)
@@ -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.
+	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));
 
-	// Most of the variables are zero at game start.
-	_v->globals.u0 = 2;
+	// 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 @@
 	_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 @@
 	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 @@
 	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 @@
 
 	// 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 @@
 		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());
 }

Modified: scummvm/trunk/engines/mohawk/myst_saveload.h
===================================================================
--- scummvm/trunk/engines/mohawk/myst_saveload.h	2010-12-26 13:58:39 UTC (rev 55040)
+++ scummvm/trunk/engines/mohawk/myst_saveload.h	2010-12-26 14:31:03 UTC (rev 55041)
@@ -36,14 +36,18 @@
 
 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
 	   1 = Current Age / Stack
@@ -63,7 +67,7 @@
 		uint16 ending;
 		uint16 redPagesInBook;
 		uint16 bluePagesInBook;
-	} globals;
+	} _globals;
 
 	/* 50 Myst Specific Variables :
 	   0  = Marker Switch Near Cabin
@@ -163,7 +167,7 @@
 		uint16 u7;
 		uint16 u8;
 		uint16 u9;
-	} myst;
+	} _myst;
 
 	/* 7 Channelwood Specific Variables :
 	    0 = Water Pump Bridge State
@@ -182,7 +186,7 @@
 		uint16 waterValveStates;
 		uint16 holoprojectorSelection;
 		uint16 stairsUpperDoorState;
-	} channelwood;
+	} _channelwood;
 
 	/* 8 Mech Specific Variables :
 	    0 = Achenar's Room Secret Panel State
@@ -200,7 +204,7 @@
 		uint16 staircaseState;
 		uint16 elevatorRotation;
 		uint16 codeShape[4];
-	} mechanical;
+	} _mechanical;
 
 	/* 18 Selenitic Specific Variables :
 	    0 = Sound Pickup At Water Pool
@@ -233,14 +237,14 @@
 		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 @@
 		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 @@
 	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;
 };

Modified: scummvm/trunk/engines/mohawk/myst_scripts.cpp
===================================================================
--- scummvm/trunk/engines/mohawk/myst_scripts.cpp	2010-12-26 13:58:39 UTC (rev 55040)
+++ scummvm/trunk/engines/mohawk/myst_scripts.cpp	2010-12-26 14:31:03 UTC (rev 55041)
@@ -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 @@
 
 // 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 @@
 }
 
 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_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);

Modified: scummvm/trunk/engines/mohawk/myst_scripts.h
===================================================================
--- scummvm/trunk/engines/mohawk/myst_scripts.h	2010-12-26 13:58:39 UTC (rev 55040)
+++ scummvm/trunk/engines/mohawk/myst_scripts.h	2010-12-26 14:31:03 UTC (rev 55041)
@@ -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 @@
 
 protected:
 	MohawkEngine_Myst *_vm;
+	MystGameState::Globals &_globals;
 
 	typedef void (MystScriptParser::*OpcodeProcMyst)(uint16 op, uint16 var, uint16 argc, uint16* argv);
 

Modified: scummvm/trunk/engines/mohawk/myst_stacks/channelwood.cpp
===================================================================
--- scummvm/trunk/engines/mohawk/myst_stacks/channelwood.cpp	2010-12-26 13:58:39 UTC (rev 55040)
+++ scummvm/trunk/engines/mohawk/myst_stacks/channelwood.cpp	2010-12-26 14:31:03 UTC (rev 55041)
@@ -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 @@
 }
 
 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 @@
 }
 
 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 @@
 }
 
 bool MystScriptParser_Channelwood::setVarValue(uint16 var, uint16 value) {
-//	MystVariables::Channelwood &channelwood = _vm->_saveLoad->_v->channelwood;
 	bool refresh = false;
 
 	switch (var) {

Modified: scummvm/trunk/engines/mohawk/myst_stacks/channelwood.h
===================================================================
--- scummvm/trunk/engines/mohawk/myst_stacks/channelwood.h	2010-12-26 13:58:39 UTC (rev 55040)
+++ scummvm/trunk/engines/mohawk/myst_stacks/channelwood.h	2010-12-26 14:31:03 UTC (rev 55041)
@@ -71,6 +71,8 @@
 	DECLARE_OPCODE(opcode_203);
 
 	DECLARE_OPCODE(opcode_300);
+
+	MystGameState::Channelwood &_state;
 };
 
 } // End of namespace Mohawk

Modified: scummvm/trunk/engines/mohawk/myst_stacks/dni.cpp
===================================================================
--- scummvm/trunk/engines/mohawk/myst_stacks/dni.cpp	2010-12-26 13:58:39 UTC (rev 55040)
+++ scummvm/trunk/engines/mohawk/myst_stacks/dni.cpp	2010-12-26 14:31:03 UTC (rev 55041)
@@ -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 @@
 }
 
 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

Modified: scummvm/trunk/engines/mohawk/myst_stacks/dni.h
===================================================================
--- scummvm/trunk/engines/mohawk/myst_stacks/dni.h	2010-12-26 13:58:39 UTC (rev 55040)
+++ scummvm/trunk/engines/mohawk/myst_stacks/dni.h	2010-12-26 14:31:03 UTC (rev 55041)
@@ -55,6 +55,8 @@
 	DECLARE_OPCODE(opcode_200);
 
 	DECLARE_OPCODE(opcode_300);
+
+	MystGameState::Dni &_state;
 };
 
 } // End of namespace Mohawk

Modified: scummvm/trunk/engines/mohawk/myst_stacks/intro.cpp
===================================================================
--- scummvm/trunk/engines/mohawk/myst_stacks/intro.cpp	2010-12-26 13:58:39 UTC (rev 55040)
+++ scummvm/trunk/engines/mohawk/myst_stacks/intro.cpp	2010-12-26 14:31:03 UTC (rev 55041)
@@ -67,7 +67,7 @@
 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);
 	}

Modified: scummvm/trunk/engines/mohawk/myst_stacks/mechanical.cpp
===================================================================
--- scummvm/trunk/engines/mohawk/myst_stacks/mechanical.cpp	2010-12-26 13:58:39 UTC (rev 55040)
+++ scummvm/trunk/engines/mohawk/myst_stacks/mechanical.cpp	2010-12-26 14:31:03 UTC (rev 55041)
@@ -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 @@
 }
 
 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 @@
 //		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 @@
 	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 @@
 }
 
 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 @@
 }
 
 bool MystScriptParser_Mechanical::setVarValue(uint16 var, uint16 value) {
-//	MystVariables::Mechanical &mechanical = _vm->_saveLoad->_v->mechanical;
 	bool refresh = false;
 
 	switch (var) {

Modified: scummvm/trunk/engines/mohawk/myst_stacks/mechanical.h
===================================================================
--- scummvm/trunk/engines/mohawk/myst_stacks/mechanical.h	2010-12-26 13:58:39 UTC (rev 55040)
+++ scummvm/trunk/engines/mohawk/myst_stacks/mechanical.h	2010-12-26 14:31:03 UTC (rev 55041)
@@ -93,6 +93,8 @@
 	DECLARE_OPCODE(opcode_209);
 
 	DECLARE_OPCODE(opcode_300);
+
+	MystGameState::Mechanical &_state;
 };
 
 } // End of namespace Mohawk

Modified: scummvm/trunk/engines/mohawk/myst_stacks/myst.cpp
===================================================================
--- scummvm/trunk/engines/mohawk/myst_stacks/myst.cpp	2010-12-26 13:58:39 UTC (rev 55040)
+++ scummvm/trunk/engines/mohawk/myst_stacks/myst.cpp	2010-12-26 14:31:03 UTC (rev 55041)
@@ -40,9 +40,8 @@
 
 // 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 @@
 	_treeStopped = false;
 	_treeMinPosition = 0;
 	_imagerValidationStep = 0;
-	myst.treeLastMoveTime = _vm->_system->getMillis();
+	_state.treeLastMoveTime = _vm->_system->getMillis();
 }
 
 MystScriptParser_Myst::~MystScriptParser_Myst() {
@@ -256,49 +255,46 @@
 }
 
 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 @@
 			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 @@
 			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 @@
 				&& _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 @@
 	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 @@
 			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 @@
 	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 @@
 	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 @@
 	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 @@
 }
 
 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 @@
 		}
 		break;
 	case 71: // Stellar Observatory Lights
-		myst.observatoryLights = value;
+		_state.observatoryLights = value;
 		break;
 	case 89:
 	case 90:
@@ -700,7 +692,7 @@
 	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 @@
 }
 
 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_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 @@
 	_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_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 @@
 	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 @@
 		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_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 @@
 	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_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 @@
 	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_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 @@
 	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 @@
 	uint16 bookVar = 101;
 	uint16 mask = 0;
 
-	switch (globals.heldPage) {
+	switch (_globals.heldPage) {
 	case 7:
 		bookVar = 100;
 	case 1:
@@ -1056,21 +1034,21 @@
 
 	// 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_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_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 @@
 
 
 	// Play selected video
-	if (!myst.imagerActive && video != 3)
+	if (!_state.imagerActive && video != 3)
 		_vm->_sound->replaceSound(argv[0]);
 
 	switch (video) {
@@ -1143,34 +1119,34 @@
 		_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_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 @@
 		_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_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 @@
 			_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,12 +1350,10 @@
 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 = _state.cabinSafeCombination / 100;
+	uint16 d2 = (_state.cabinSafeCombination / 10) % 10;
+	uint16 d3 = _state.cabinSafeCombination % 10;
 
-	uint16 d1 = myst.cabinSafeCombination / 100;
-	uint16 d2 = (myst.cabinSafeCombination / 10) % 10;
-	uint16 d3 = myst.cabinSafeCombination % 10;
-
 	if (var == 67)
 		d1 = (d1 + 1) % 10;
 	else if (var == 68)
@@ -1390,7 +1361,7 @@
 	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 @@
 	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 @@
 				_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_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 @@
 			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 @@
 						_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 @@
 						_vm->_sound->replaceSound(soundId);
 
 					// Reset breaker state
-					myst.generatorBreakers = 0;
+					_state.generatorBreakers = 0;
 				}
 			}
 		}
@@ -1582,10 +1551,9 @@
 
 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_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_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::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_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_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::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_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 @@
 			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 @@
 				// 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_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::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 @@
 	_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 @@
 
 	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 @@
 			_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_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 @@
 			_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_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::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::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 @@
 
 	if (_dockVaultState) {
 		// Open switch
-		myst.dockMarkerSwitch = 1;
+		_state.dockMarkerSwitch = 1;
 		_vm->_sound->replaceSound(4143);
 		_vm->redrawArea(4);
 
@@ -2563,35 +2498,33 @@
 }
 
 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_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::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::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::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::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 @@
 	// 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 @@
 	_vm->_sound->stopSound();
 	_vm->_sound->pauseBackground();
 
-	if (globals.ending != 4) {
+	if (_globals.ending != 4) {
 		_vm->_video->playBackgroundMovie(file, 314, 76);
 	}
 

Modified: scummvm/trunk/engines/mohawk/myst_stacks/myst.h
===================================================================
--- scummvm/trunk/engines/mohawk/myst_stacks/myst.h	2010-12-26 13:58:39 UTC (rev 55040)
+++ scummvm/trunk/engines/mohawk/myst_stacks/myst.h	2010-12-26 14:31:03 UTC (rev 55041)
@@ -180,6 +180,8 @@
 	DECLARE_OPCODE(opcode_309);
 	DECLARE_OPCODE(opcode_312);
 
+	MystGameState::Myst &_state;
+
 	bool _generatorControlRoomRunning;
 	uint16 _generatorVoltage; // 58
 

Modified: scummvm/trunk/engines/mohawk/myst_stacks/selenitic.cpp
===================================================================
--- scummvm/trunk/engines/mohawk/myst_stacks/selenitic.cpp	2010-12-26 13:58:39 UTC (rev 55040)
+++ scummvm/trunk/engines/mohawk/myst_stacks/selenitic.cpp	2010-12-26 14:31:03 UTC (rev 55041)
@@ -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 @@
 }
 
 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 @@
 	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 @@
 	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 @@
 }
 
 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 @@
  * Sound receiver sigma button

@@ Diff output truncated at 100000 characters. @@

This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list