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

mthreepwood at users.sourceforge.net mthreepwood at users.sourceforge.net
Mon Dec 6 22:10:12 CET 2010


Revision: 54803
          http://scummvm.svn.sourceforge.net/scummvm/?rev=54803&view=rev
Author:   mthreepwood
Date:     2010-12-06 21:10:12 +0000 (Mon, 06 Dec 2010)

Log Message:
-----------
MOHAWK: Rewrite the Myst save/load code to use Common::Serializer and name all the variables

Modified Paths:
--------------
    scummvm/trunk/engines/mohawk/myst_saveload.cpp
    scummvm/trunk/engines/mohawk/myst_saveload.h

Modified: scummvm/trunk/engines/mohawk/myst_saveload.cpp
===================================================================
--- scummvm/trunk/engines/mohawk/myst_saveload.cpp	2010-12-06 20:29:45 UTC (rev 54802)
+++ scummvm/trunk/engines/mohawk/myst_saveload.cpp	2010-12-06 21:10:12 UTC (rev 54803)
@@ -26,13 +26,33 @@
 #include "mohawk/myst.h"
 #include "mohawk/myst_saveload.h"
 
+#include "common/serializer.h"
 #include "common/util.h"
 
 namespace Mohawk {
 
 MystSaveLoad::MystSaveLoad(MohawkEngine_Myst *vm, Common::SaveFileManager *saveFileMan) : _vm(vm), _saveFileMan(saveFileMan) {
 	_v = new MystVariables();
-	initMystVariables(_v);
+
+	// Most of the variables are zero at game start.
+	_v->globals.u0 = 2;
+	// Current Age / Stack - Start in Myst
+	_v->globals.currentAge = 2;
+	_v->globals.u1 = 1;
+
+	// Library Bookcase Door - Default to Up
+	_v->myst.libraryBookcaseDoor = 1;
+	// Dock Imager Numeric Selection - Default to 67
+	_v->myst.imagerSelection = 67;
+	// Dock Imager Active - Default to Active
+	_v->myst.imagerActive = 1;
+	// Stellar Observatory Lights - Default to On
+	_v->myst.observatoryLights = 1;
+
+	// Lighthouse Trapdoor State - Default to Locked
+	_v->stoneship.trapdoorState = 2;
+	// Lighthouse Chest Water State - Default to Full
+	_v->stoneship.chestWaterState = 1;
 }
 
 MystSaveLoad::~MystSaveLoad() {
@@ -50,417 +70,238 @@
 	Common::InSaveFile *loadFile = _saveFileMan->openForLoading(filename);
 	if (!loadFile)
 		return false;
-	debugC(kDebugSaveLoad, "Loading game from \'%s\'", filename.c_str());
 
+	debugC(kDebugSaveLoad, "Loading game from '%s'", filename.c_str());
+
 	// First, let's make sure we're using a saved game file from this version of Myst
 	// By checking length of file...
 	int32 size = loadFile->size();
 	if ((size == -1)
 	    || (size != 664 && (_vm->getFeatures() & GF_ME))
 	    || (size != 601 && !(_vm->getFeatures() & GF_ME))) {
-		warning ("Incompatible saved game version");
-		// FIXME - Add Support to load original game saves in ME and vice versa
+		warning("Incompatible saved game version");
+		// FIXME: Add Support to load original game saves in ME and vice versa
 		delete loadFile;
 		return false;
 	}
 
-	// Now, we'll read in the variable values.
-	// Lots of checking code here so that save files with differing formats are flagged...
-	if ((_v->globals.u0 = loadFile->readUint16LE()) != 2)
-		warning("Unexpected value at 0x%03X - Found %u Expected %u", loadFile->pos(), _v->globals.u0, 2);
+	Common::Serializer s(loadFile, 0);
+	syncGameState(s);
+	delete loadFile;
 
-	_v->globals.currentAge = loadFile->readUint16LE();
-	_v->globals.heldPage = loadFile->readUint16LE();
+	return true;
+}
 
-	if ((_v->globals.u1 = loadFile->readUint16LE()) != 1)
-		warning("Unexpected value at 0x%03X - Found %u Expected %u", loadFile->pos(), _v->globals.u1, 1);
+bool MystSaveLoad::saveGame(const Common::String &fname) {
+	Common::String filename(fname);
+	// Make sure we have the right extension
+	if (!filename.hasSuffix(".mys") && !filename.hasSuffix(".MYS"))
+		filename += ".mys";
 
-	_v->globals.transitions = loadFile->readUint16LE();
-	_v->globals.ending = loadFile->readUint16LE();
-	_v->globals.redPagesInBook = loadFile->readUint16LE();
-	_v->globals.bluePagesInBook = loadFile->readUint16LE();
+	Common::OutSaveFile *saveFile = _saveFileMan->openForSaving(filename);
+	if (!saveFile)
+		return false;
 
-	for (byte i = 0; i < 8; i++) {
-		if (_vm->getFeatures() & GF_ME) {
-			_v->myst_vars[i] = loadFile->readUint16LE();
+	debugC(kDebugSaveLoad, "Saving game to '%s'", filename.c_str());
 
-			if (loadFile->readUint16LE() != 0)
-				warning("Non-zero value at 0x%03X", loadFile->pos());
-		} else
-			_v->myst_vars[i] = loadFile->readByte();
+	Common::Serializer s(0, saveFile);
+	syncGameState(s);
+	saveFile->finalize();
+	delete saveFile;
 
-		if (_v->myst_vars[i] > 1)
-			warning("Non-Boolean value found at 0x%03X - Found %u", loadFile->pos(), _v->myst_vars[i]);
-	}
+	return true;
+}
 
-	if ((_v->myst_vars[8] = loadFile->readUint16LE()) > 1)
-		warning("Non-Boolean value found at 0x%03X - Found %u", loadFile->pos(), _v->myst_vars[8]);
+void MystSaveLoad::syncGameState(Common::Serializer &s) {
+	// 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);
 
-	if ((_v->myst_vars[9] = loadFile->readUint16LE()) > 1)
-		warning("Non-Boolean value found at 0x%03X - Found %u", loadFile->pos(), _v->myst_vars[9]);
-
-	if ((_v->myst_vars[10] = loadFile->readUint16LE()) > 25)
-		warning("Value exceeds maximum of %u found at 0x%03X - Found %u", 25, loadFile->pos(), _v->myst_vars[10]);
-
-	if ((_v->myst_vars[11] = loadFile->readUint16LE()) > 11)
-		warning("Value exceeds maximum of %u found at 0x%03X - Found %u", 11, loadFile->pos(), _v->myst_vars[11]);
-
-	_v->myst_vars[12] = loadFile->readUint16LE();
-	// TODO: Add validation of valid set for Clock Tower Hour Hand
-
-	if ((_v->myst_vars[13] = loadFile->readUint16LE()) > 1)
-		warning("Non-Boolean value found at 0x%03X - Found %u", loadFile->pos(), _v->myst_vars[13]);
-
-	if ((_v->myst_vars[14] = loadFile->readUint16LE()) > 1)
-		warning("Non-Boolean value found at 0x%03X - Found %u", loadFile->pos(), _v->myst_vars[14]);
-
-	if ((_v->myst_vars[15] = loadFile->readUint16LE()) > 2)
-		warning("Value exceeds maximum of %u found at 0x%03X - Found %u", 2, loadFile->pos(), _v->myst_vars[15]);
-
-	_v->myst_vars[16] = loadFile->readUint16LE();
-	_v->myst_vars[17] = loadFile->readUint16LE();
-
-	if ((_v->myst_vars[18] = loadFile->readUint16LE()) > 1)
-		warning("Non-Boolean value found at 0x%03X - Found %u", loadFile->pos(), _v->myst_vars[18]);
-
-	_v->myst_vars[19] = loadFile->readUint16LE();
-
-	if ((_v->myst_vars[20] = loadFile->readUint16LE()) > 1)
-		warning("Non-Boolean value found at 0x%03X - Found %u", loadFile->pos(), _v->myst_vars[20]);
-
-	if ((_v->myst_vars[21] = loadFile->readUint16LE()) != 0)
-		warning("Non-zero value at 0x%03X - Found %u", loadFile->pos(), _v->myst_vars[21]);
-
-	if ((_v->myst_vars[22] = loadFile->readUint16LE()) != 0)
-		warning("Non-zero value at 0x%03X - Found %u", loadFile->pos(), _v->myst_vars[22]);
-
-	if ((_v->myst_vars[23] = loadFile->readUint16LE()) != 0)
-		warning("Non-zero value at 0x%03X - Found %u", loadFile->pos(), _v->myst_vars[23]);
-
-	if ((_v->myst_vars[24] = loadFile->readUint16LE()) != 0)
-		warning("Non-zero value at 0x%03X - Found %u", loadFile->pos(), _v->myst_vars[24]);
-
-	if ((_v->myst_vars[25] = loadFile->readUint16LE()) > 359)
-		warning("Value exceeds maximum of %u found at 0x%03X - Found %u", 359, loadFile->pos(), _v->myst_vars[25]);
-
-	_v->myst_vars[26] = loadFile->readUint16LE();
-
-	if ((_v->myst_vars[27] = loadFile->readUint16LE()) > 1)
-		warning("Non-Boolean value found at 0x%03X - Found %u", loadFile->pos(), _v->myst_vars[27]);
-
-	_v->myst_vars[28] = loadFile->readUint16LE();
-	if (_v->myst_vars[28] < 1 && _v->myst_vars[28] > 31)
-		warning("Out of Range value found at 0x%03X - Found %u", loadFile->pos(), _v->myst_vars[28]);
-
-	if ((_v->myst_vars[29] = loadFile->readUint16LE()) > 1)
-		warning("Non-Boolean value found at 0x%03X - Found %u", loadFile->pos(), _v->myst_vars[29]);
-
-	if ((_v->myst_vars[30] = loadFile->readUint16LE()) > 11)
-		warning("Value exceeds maximum of %u found at 0x%03X - Found %u", 11, loadFile->pos(), _v->myst_vars[30]);
-
-	if ((_v->myst_vars[31] = loadFile->readUint16LE()) > (24 * 60))
-		warning("Value exceeds maximum of %u found at 0x%03X - Found %u", (24 * 60), loadFile->pos(), _v->myst_vars[31]);
-
-	_v->myst_vars[32] = loadFile->readUint16LE();
-
-	_v->myst_vars[33] = loadFile->readUint16LE();
-	if (_v->myst_vars[33] < 1 && _v->myst_vars[33] > 31)
-		warning("Out of Range value found at 0x%03X - Found %u", loadFile->pos(), _v->myst_vars[33]);
-
-	if ((_v->myst_vars[34] = loadFile->readUint16LE()) > 11)
-		warning("Value exceeds maximum of %u found at 0x%03X - Found %u", 11, loadFile->pos(), _v->myst_vars[34]);
-
-	if ((_v->myst_vars[35] = loadFile->readUint16LE()) > (24 * 60))
-		warning("Value exceeds maximum of %u found at 0x%03X - Found %u", (24 * 60), loadFile->pos(), _v->myst_vars[35]);
-
-	_v->myst_vars[36] = loadFile->readUint16LE();
-
-	if ((_v->myst_vars[37] = loadFile->readUint16LE()) > 999)
-		warning("Value exceeds maximum of %u found at 0x%03X - Found %u", 999, loadFile->pos(), _v->myst_vars[37]);
-
-	if ((_v->myst_vars[38] = loadFile->readUint16LE()) > 12)
-		warning("Value exceeds maximum of %u found at 0x%03X - Found %u", 12, loadFile->pos(), _v->myst_vars[38]);
-
-	_v->myst_vars[39] = loadFile->readUint16LE();
-	_v->myst_vars[40] = loadFile->readUint16LE();
-
-	_v->myst_vars[41] = loadFile->readUint16LE();
-	_v->myst_vars[42] = loadFile->readUint16LE();
-	_v->myst_vars[43] = loadFile->readUint16LE();
-	_v->myst_vars[44] = loadFile->readUint16LE();
-	_v->myst_vars[45] = loadFile->readUint16LE();
-
-	_v->myst_vars[46] = loadFile->readUint16LE();
-	_v->myst_vars[47] = loadFile->readUint16LE();
-	_v->myst_vars[48] = loadFile->readUint16LE();
-	_v->myst_vars[49] = loadFile->readUint16LE();
-
-	for (byte i = 0; i < 4; i++) {
-		if (_vm->getFeatures() & GF_ME) {
-			_v->channelwood_vars[i] = loadFile->readUint16LE();
-
-			if (loadFile->readUint16LE() != 0)
-				warning("Non-zero value at 0x%03X", loadFile->pos());
-		} else
-			_v->channelwood_vars[i] = loadFile->readByte();
-
-		if (_v->channelwood_vars[i] > 1)
-			warning("Non-Boolean value found at 0x%03X - Found %u", loadFile->pos(), _v->channelwood_vars[i]);
+	// Onto Myst
+	if (_vm->getFeatures() & GF_ME) {
+		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);
+	} 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);
 	}
 
-	_v->channelwood_vars[4] = loadFile->readUint16LE();
+	s.syncAsUint16LE(_v->myst.greenBookState);
+	s.syncAsUint16LE(_v->myst.shipState);
+	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.u0);
+	s.syncAsUint16LE(_v->myst.u1);
+	s.syncAsUint16LE(_v->myst.u2);
+	s.syncAsUint16LE(_v->myst.u3);
+	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.syncAsUint16LE(_v->myst.u4);
+	s.syncAsUint16LE(_v->myst.u5);
 
-	if ((_v->channelwood_vars[5] = loadFile->readUint16LE()) > 3)
-		warning("Value exceeds maximum of %u found at 0x%03X - Found %u", 3, loadFile->pos(), _v->channelwood_vars[5]);
+	for (int i = 0; i < 5; i++)
+		s.syncAsUint16LE(_v->myst.rocketSliderPosition[i]);
 
-	if ((_v->channelwood_vars[6] = loadFile->readUint16LE()) > 1)
-		warning("Non-Boolean value found at 0x%03X - Found %u", loadFile->pos(), _v->channelwood_vars[6]);
+	s.syncAsUint16LE(_v->myst.u6);
+	s.syncAsUint16LE(_v->myst.u7);
+	s.syncAsUint16LE(_v->myst.u8);
+	s.syncAsUint16LE(_v->myst.u9);
 
+	// Channelwood
 	if (_vm->getFeatures() & GF_ME) {
-		if (loadFile->readUint16LE() != 0)
-			warning("Non-zero value at 0x%03X", loadFile->pos());
-
-		if (loadFile->readUint16LE() != 0)
-			warning("Non-zero value at 0x%03X", loadFile->pos());
-	} else if (loadFile->readByte() != 0)
-		warning("Non-zero value at 0x%03X", loadFile->pos());
-
-	for (byte i = 0; i < 3; i++)
-		if ((_v->mech_vars[i] = loadFile->readUint16LE()) > 1)
-			warning("Non-Boolean value found at 0x%03X - Found %u", loadFile->pos(), _v->mech_vars[i]);
-
-	_v->mech_vars[3] = loadFile->readUint16LE();
-	for (byte i = 4; i < 8; i++)
-		if ((_v->mech_vars[i] = loadFile->readUint16LE()) > 9)
-			warning("Value exceeds maximum of %u found at 0x%03X - Found %u", 9, loadFile->pos(), _v->mech_vars[i]);
-
-	if (_vm->getFeatures() & GF_ME) {
-		_v->selenitic.emitterEnabledWater = loadFile->readUint32LE();
-		_v->selenitic.emitterEnabledVolcano = loadFile->readUint32LE();
-		_v->selenitic.emitterEnabledClock = loadFile->readUint32LE();
-		_v->selenitic.emitterEnabledCrystal = loadFile->readUint32LE();
-		_v->selenitic.emitterEnabledWind = loadFile->readUint32LE();
-		_v->selenitic.soundReceiverOpened = loadFile->readUint32LE();
-		_v->selenitic.tunnelLightsSwitchedOn = loadFile->readUint32LE();
+		s.syncAsUint32LE(_v->channelwood.waterPumpBridgeState);
+		s.syncAsUint32LE(_v->channelwood.elevatorState);
+		s.syncAsUint32LE(_v->channelwood.stairsLowerDoorState);
+		s.syncAsUint32LE(_v->channelwood.pipeState);
 	} else {
-		_v->selenitic.emitterEnabledWater = loadFile->readByte();
-		_v->selenitic.emitterEnabledVolcano = loadFile->readByte();
-		_v->selenitic.emitterEnabledClock = loadFile->readByte();
-		_v->selenitic.emitterEnabledCrystal = loadFile->readByte();
-		_v->selenitic.emitterEnabledWind = loadFile->readByte();
-		_v->selenitic.soundReceiverOpened = loadFile->readByte();
-		_v->selenitic.tunnelLightsSwitchedOn = loadFile->readByte();
+		s.syncAsByte(_v->channelwood.waterPumpBridgeState);
+		s.syncAsByte(_v->channelwood.elevatorState);
+		s.syncAsByte(_v->channelwood.stairsLowerDoorState);
+		s.syncAsByte(_v->channelwood.pipeState);
 	}
 
-	_v->selenitic.soundReceiverCurrentSource = loadFile->readUint16LE();
+	s.syncAsUint16LE(_v->channelwood.waterValveStates);
+	s.syncAsUint16LE(_v->channelwood.holoprojectorSelection);
+	s.syncAsUint16LE(_v->channelwood.stairsUpperDoorState);
 
-	for(byte i = 0; i < 5; i++)
-		_v->selenitic.soundReceiverPositions[i] = loadFile->readUint16LE();
+	if (_vm->getFeatures() & GF_ME)
+		s.skip(4);
+	else
+		s.skip(1);
 
-	for(byte i = 0; i < 5; i++)
-		_v->selenitic.soundLockSliderPositions[i] = loadFile->readUint16LE();
+	// Mechanical
 
-	for (byte i = 0; i < 3; i++) {
-		if (_vm->getFeatures() & GF_ME) {
-			_v->stoneship_vars[i] = loadFile->readUint16LE();
-		} else
-			_v->stoneship_vars[i] = loadFile->readByte();
+	s.syncAsUint16LE(_v->mechanical.achenarPanelState);
+	s.syncAsUint16LE(_v->mechanical.sirrusPanelState);
+	s.syncAsUint16LE(_v->mechanical.staircaseState);
+	s.syncAsUint16LE(_v->mechanical.elevatorRotation);
 
-		if (_v->stoneship_vars[i] > 1)
-			warning("Non-Boolean value found at 0x%03X - Found %u", loadFile->pos(), _v->stoneship_vars[i]);
-	}
-	for (byte i = 3; i < 14; i++)
-		_v->stoneship_vars[i] = loadFile->readUint16LE();
+	for (int i = 0; i < 4; i++)
+		s.syncAsUint16LE(_v->mechanical.codeShape[i]);
 
-	for (byte i = 0; i < 1; i++)
-		_v->dunny_vars[i] = loadFile->readUint16LE();
+	// Selenitic
 
-	// Reading unknown region...
-	// When Zero Value regions are included, these are 5 blocks of
-	// 41 uint16 values.
-
-	for (byte i = 0; i < 31; i++)
-		_v->unknown_myst[i] = loadFile->readUint16LE();
-
-	for (byte i = 0; i < 10; i++) {
-		if (loadFile->readUint16LE() != 0)
-			warning("Non-zero value at 0x%03X", loadFile->pos());
-	}
-
-	for (byte i = 0; i < 37; i++)
-		_v->unknown_channelwood[i] = loadFile->readUint16LE();
-
-	for (byte i = 0; i < 4; i++) {
-		if (loadFile->readUint16LE() != 0)
-			warning("Non-zero value at 0x%03X", loadFile->pos());
-	}
-
-	for (byte i = 0; i < 18; i++)
-		_v->unknown_mech[i] = loadFile->readUint16LE();
-
-	for (byte i = 0; i < 23; i++) {
-		if (loadFile->readUint16LE() != 0)
-			warning("Non-zero value at 0x%03X", loadFile->pos());
-	}
-
-	for (byte i = 0; i < 30; i++)
-		_v->unknown_selenitic[i] = loadFile->readUint16LE();
-
-	for (byte i = 0; i < 11; i++) {
-		if (loadFile->readUint16LE() != 0)
-			warning("Non-zero value at 0x%03X", loadFile->pos());
-	}
-
-	for (byte i = 0; i < 22; i++)
-		_v->unknown_stoneship[i] = loadFile->readUint16LE();
-
-	for (byte i = 0; i < 19; i++) {
-		if (loadFile->readUint16LE() != 0)
-			warning("Non-zero value at 0x%03X", loadFile->pos());
-	}
-
 	if (_vm->getFeatures() & GF_ME) {
-		if (loadFile->pos() != 664)
-			warning("Unexpected File Position 0x%03X At End of Load", loadFile->pos());
+		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);
 	} else {
-		if (loadFile->pos() != 601)
-			warning("Unexpected File Position 0x%03X At End of Load", loadFile->pos());
+		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);
 	}
 
-	delete loadFile;
+	s.syncAsUint16LE(_v->selenitic.soundReceiverCurrentSource);
 
-	debug_printMystVariables(_v);
+	for (byte i = 0; i < 5; i++)
+		s.syncAsUint16LE(_v->selenitic.soundReceiverPositions[i]);
 
-	return true;
-}
+	for (byte i = 0; i < 5; i++)
+		s.syncAsUint16LE(_v->selenitic.soundLockSliderPositions[i]);
 
-bool MystSaveLoad::saveGame(const Common::String &fname) {
-	Common::String filename(fname);
-	// Make sure we have the right extension
-	if (!filename.hasSuffix(".mys") && !filename.hasSuffix(".MYS"))
-		filename += ".mys";
+	// Stoneship
 
-	Common::OutSaveFile *saveFile = _saveFileMan->openForSaving(filename);
-	if (!saveFile)
-		return false;
-	debugC(kDebugSaveLoad, "Saving game to \'%s\'", filename.c_str());
-
-	debug_printMystVariables(_v);
-
-	// Performs no validation of variable values - Assumes they are valid.
-	saveFile->writeUint16LE(_v->globals.u0);
-	saveFile->writeUint16LE(_v->globals.currentAge);
-	saveFile->writeUint16LE(_v->globals.heldPage);
-	saveFile->writeUint16LE(_v->globals.u1);
-	saveFile->writeUint16LE(_v->globals.transitions);
-	saveFile->writeUint16LE(_v->globals.ending);
-	saveFile->writeUint16LE(_v->globals.redPagesInBook);
-	saveFile->writeUint16LE(_v->globals.bluePagesInBook);
-
-	for (byte i = 0; i < 8; i++) {
-		if (_vm->getFeatures() & GF_ME) {
-			saveFile->writeUint16LE(_v->myst_vars[i]);
-			saveFile->writeUint16LE(0);
-		} else
-			saveFile->writeByte(_v->myst_vars[i]);
-	}
-
-	for (byte i = 8; i < 50; i++)
-		saveFile->writeUint16LE(_v->myst_vars[i]);
-
-	for (byte i = 0; i < 4; i++) {
-		if (_vm->getFeatures() & GF_ME) {
-			saveFile->writeUint16LE(_v->channelwood_vars[i]);
-			saveFile->writeUint16LE(0);
-		} else
-			saveFile->writeByte(_v->channelwood_vars[i]);
-	}
-
-	for (byte i = 4; i < 7; i++)
-		saveFile->writeUint16LE(_v->channelwood_vars[i]);
-
 	if (_vm->getFeatures() & GF_ME) {
-		saveFile->writeUint16LE(0);
-		saveFile->writeUint16LE(0);
-	} else
-		saveFile->writeByte(0);
-
-	for (byte i = 0; i < 8; i++)
-		saveFile->writeUint16LE(_v->mech_vars[i]);
-
-	if (_vm->getFeatures() & GF_ME) {
-		saveFile->writeUint32LE(_v->selenitic.emitterEnabledWater);
-		saveFile->writeUint32LE(_v->selenitic.emitterEnabledVolcano);
-		saveFile->writeUint32LE(_v->selenitic.emitterEnabledClock);
-		saveFile->writeUint32LE(_v->selenitic.emitterEnabledCrystal);
-		saveFile->writeUint32LE(_v->selenitic.emitterEnabledWind);
-		saveFile->writeUint32LE(_v->selenitic.soundReceiverOpened);
-		saveFile->writeUint32LE(_v->selenitic.tunnelLightsSwitchedOn);
+		s.syncAsUint16LE(_v->stoneship.lightState);
+		s.syncAsUint16LE(_v->stoneship.u0);
+		s.syncAsUint16LE(_v->stoneship.u1);
 	} else {
-		saveFile->writeByte(_v->selenitic.emitterEnabledWater);
-		saveFile->writeByte(_v->selenitic.emitterEnabledVolcano);
-		saveFile->writeByte(_v->selenitic.emitterEnabledClock);
-		saveFile->writeByte(_v->selenitic.emitterEnabledCrystal);
-		saveFile->writeByte(_v->selenitic.emitterEnabledWind);
-		saveFile->writeByte(_v->selenitic.soundReceiverOpened);
-		saveFile->writeByte(_v->selenitic.tunnelLightsSwitchedOn);
+		s.syncAsByte(_v->stoneship.lightState);
+		s.syncAsByte(_v->stoneship.u0);
+		s.syncAsByte(_v->stoneship.u1);
 	}
 
-	saveFile->writeUint16LE(_v->selenitic.soundReceiverCurrentSource);
+	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);
 
-	for(byte i = 0; i < 5; i++)
-		saveFile->writeUint16LE(_v->selenitic.soundReceiverPositions[i]);
+	for (int i = 0; i < 5; i++)
+		s.syncAsUint16LE(_v->stoneship.generatorPowerLevel[i]);
 
-	for(byte i = 0; i < 5; i++)
-		saveFile->writeUint16LE(_v->selenitic.soundLockSliderPositions[i]);
+	// D'ni
+	s.syncAsUint16LE(_v->dni.outcomeState);
 
-	for (byte i = 0; i < 3; i++) {
-		if (_vm->getFeatures() & GF_ME) {
-			saveFile->writeUint16LE(_v->stoneship_vars[i]);
-		} else
-			saveFile->writeByte(_v->stoneship_vars[i]);
-	}
-	for (byte i = 3; i < 14; i++)
-		saveFile->writeUint16LE(_v->stoneship_vars[i]);
+	// Reading unknown region...
+	// When Zero Value regions are included, these are 5 blocks of
+	// 41 uint16 values.
 
-	for (byte i = 0; i < 1; i++)
-		saveFile->writeUint16LE(_v->dunny_vars[i]);
-
 	for (byte i = 0; i < 31; i++)
-		saveFile->writeUint16LE(_v->unknown_myst[i]);
+		s.syncAsUint16LE(_v->unknownMyst[i]);
 
-	for (byte i = 0; i < 10; i++)
-		saveFile->writeUint16LE(0);
+	s.skip(20);
 
 	for (byte i = 0; i < 37; i++)
-		saveFile->writeUint16LE(_v->unknown_channelwood[i]);
+		s.syncAsUint16LE(_v->unknownChannelwood[i]);
 
-	for (byte i = 0; i < 4; i++)
-		saveFile->writeUint16LE(0);
+	s.skip(8);
 
 	for (byte i = 0; i < 18; i++)
-		saveFile->writeUint16LE(_v->unknown_mech[i]);
+		s.syncAsUint16LE(_v->unknownMech[i]);
 
-	for (byte i = 0; i < 23; i++)
-		saveFile->writeUint16LE(0);
+	s.skip(46);
 
 	for (byte i = 0; i < 30; i++)
-		saveFile->writeUint16LE(_v->unknown_selenitic[i]);
+		s.syncAsUint16LE(_v->unknownSelenitic[i]);
 
-	for (byte i = 0; i < 11; i++)
-		saveFile->writeUint16LE(0);
+	s.skip(22);
 
 	for (byte i = 0; i < 22; i++)
-		saveFile->writeUint16LE(_v->unknown_stoneship[i]);
+		s.syncAsUint16LE(_v->unknownStoneship[i]);
 
-	for (byte i = 0; i < 19; i++)
-		saveFile->writeUint16LE(0);
+	s.skip(38);
 
-	saveFile->finalize();
-
-	delete saveFile;
-
-	return true;
+	if ((_vm->getFeatures() & GF_ME && s.bytesSynced() != 664) || (!(_vm->getFeatures() & GF_ME) && s.bytesSynced() != 601))
+		warning("Unexpected File Position 0x%03X At End of Save/Load", s.bytesSynced());
 }
 
 void MystSaveLoad::deleteSave(const Common::String &saveName) {
@@ -468,258 +309,4 @@
 	_saveFileMan->removeSavefile(saveName.c_str());
 }
 
-void MystSaveLoad::initMystVariables(MystVariables *_tv) {
-	uint8 i;
-
-	// Most of the variables are zero at game start.
-	_v->globals.u0 = 2;
-	// Current Age / Stack - Start in Myst
-	_tv->globals.currentAge = 2;
-	_tv->globals.heldPage = 0;
-	_tv->globals.u1 = 1;
-	_tv->globals.transitions = 0;
-	_tv->globals.ending = 0;
-	_tv->globals.redPagesInBook = 0;
-	_tv->globals.bluePagesInBook = 0;
-
-	_tv->myst.generatorBreakers = 0;
-	_tv->myst.generatorButtons = 0;
-	_tv->myst.generatorVoltage = 0;
-
-	for (i = 0; i < ARRAYSIZE(_tv->channelwood_vars); i++)
-		_tv->channelwood_vars[i] = 0;
-	for (i = 0; i < ARRAYSIZE(_tv->mech_vars); i++)
-		_tv->mech_vars[i] = 0;
-
-	_tv->selenitic.emitterEnabledWater = 0;
-	_tv->selenitic.emitterEnabledVolcano = 0;
-	_tv->selenitic.emitterEnabledClock = 0;
-	_tv->selenitic.emitterEnabledCrystal = 0;
-	_tv->selenitic.emitterEnabledWind = 0;
-	_tv->selenitic.soundReceiverOpened = 0;
-	_tv->selenitic.tunnelLightsSwitchedOn = 0;
-	_tv->selenitic.soundReceiverCurrentSource = 0;
-
-	for(i = 0; i < 5; i++)
-		_tv->selenitic.soundReceiverPositions[i] = 0;
-
-	for(i = 0; i < 5; i++)
-		_tv->selenitic.soundLockSliderPositions[i] = 0;
-
-	for (i = 0; i < ARRAYSIZE(_tv->stoneship_vars); i++)
-		_tv->stoneship_vars[i] = 0;
-	for (i = 0; i < ARRAYSIZE(_tv->dunny_vars); i++)
-		_tv->dunny_vars[i] = 0;
-	for (i = 0; i < ARRAYSIZE(_tv->unknown_myst); i++)
-		_tv->unknown_myst[i] = 0;
-	for (i = 0; i < ARRAYSIZE(_tv->unknown_channelwood); i++)
-		_tv->unknown_channelwood[i] = 0;
-	for (i = 0; i < ARRAYSIZE(_tv->unknown_mech); i++)
-		_tv->unknown_mech[i] = 0;
-	for (i = 0; i < ARRAYSIZE(_tv->unknown_selenitic); i++)
-		_tv->unknown_selenitic[i] = 0;
-	for (i = 0; i < ARRAYSIZE(_tv->unknown_stoneship); i++)
-		_tv->unknown_stoneship[i] = 0;
-
-	// TODO: Not all these may be needed as some of the unknown opcodes
-	//        called by init scripts may set these up as per the others..
-
-	// Library Bookcase Door - Default to Up
-	_tv->myst.libraryBookcaseDoor = 1;
-	// Dock Imager Numeric Selection - Default to 67
-	_tv->myst_vars[19] = 67;
-	// Dock Imager Active - Default to Active
-	_tv->myst_vars[20] = 1;
-	// Stellar Observatory Lights - Default to On
-	_tv->myst_vars[29] = 1;
-
-	// Lighthouse Trapdoor State - Default to Locked
-	_tv->stoneship_vars[4] = 2;
-	// Lighthouse Chest Water State - Default to Full
-	_tv->stoneship_vars[5] = 1;
-}
-
-//static const char *game_globals_names[] = {
-//	"Unknown - Fixed at 2",
-//	"Current Age / Stack",
-//	"Page Being Held",
-//	"Unknown - Fixed at 1",
-//	"Slide Transitions",
-//	"Zip Mode",
-//	"Red Pages in Book",
-//	"Blue Pages in Book"
-//};
-
-static const char *myst_vars_names[] = {
-	"Marker Switch Near Cabin",
-	"Marker Switch Near Clock Tower",
-	"Marker Switch on Dock",
-	"Marker Switch Near Ship Pool",
-	"Marker Switch Near Cogs",
-	"Marker Switch Near Generator Room",
-	"Marker Switch Near Stellar Observatory",
-	"Marker Switch Near Rocket Ship",
-	"Fireplace, Opened Green Book Before",
-	"Ship State",
-	"Cabin Gas Valve Position",
-	"Clock Tower Hour Hand Position",
-	"Clock Tower Minute Hand Position",
-	"Clock Tower Puzzle Solved / Cogs Open",
-	"Clock Tower Gear Bridge",
-	"Generator Breaker State",
-	"Generator Button State",
-	"Generator Voltage State",
-	"Library Bookcase Door",
-	"Dock Imager Numeric Selection",
-	"Dock Imager Active",
-	"Unknown #1 - Fixed at 0",
-	"Unknown #2 - Fixed at 0",
-	"Unknown #3 - Fixed at 0",
-	"Unknown #4 - Fixed at 0",
-	"Tower Rotation Angle",
-	"Boxes For Ship Float Puzzle",
-	"Tree Boiler Pilot Light Lit",
-	"Stellar Observatory Viewer, Control Setting Day",
-	"Stellar Observatory Lights",
-	"Stellar Observatory Viewer, Control Setting Month",
-	"Stellar Observatory Viewer, Control Setting Time",
-	"Stellar Observatory Viewer, Control Setting Year",
-	"Stellar Observatory Viewer, Target Day",
-	"Stellar Observatory Viewer, Target Month",
-	"Stellar Observatory Viewer, Target Time",
-	"Stellar Observatory Viewer, Target Year",
- 	"Cabin Safe Combination",
-	"Channelwood Tree Position",
-	"Checksum? #1",
-	"Checksum? #2",
-	"Rocketship Music Puzzle Slider #1 Position",
-	"Rocketship Music Puzzle Slider #2 Position",
-	"Rocketship Music Puzzle Slider #3 Position",
-	"Rocketship Music Puzzle Slider #4 Position",
-	"Rocketship Music Puzzle Slider #5 Position",
-	"Unknown #5",
-	"Unknown #6",
-	"Unknown #7",
-	"Unknown #8"
-};
-
-static const char *channelwood_vars_names[] = {
-	"Water Pump Bridge State",
-	"Lower Walkway to Upper Walkway Elevator State",
-	"Lower Walkway to Upper Walkway Spiral Stair Lower Door State",
-	"Extendable Pipe State",
-	"Water Valve States",
-	"Achenar's Holoprojector Selection",
-	"Lower Walkway to Upper Walkway Spiral Stair Upper Door State"
-};
-
-static const char *mech_vars_names[] = {
-	"Achenar's Room Secret Panel State",
-	"Sirrus' Room Secret Panel State",
-	"Fortress Staircase State",
-	"Fortress Elevator Rotation",
-	"Code Lock Shape #1 (Left)",
-	"Code Lock Shape #2",
-	"Code Lock Shape #3",
-	"Code Lock Shape #4 (Right)"
-};
-
-//static const char *selenitic_vars_names[] = {
-//	"Sound Pickup At Water Pool",
-//	"Sound Pickup At Volcanic Crack",
-//	"Sound Pickup At Clock",
-//	"Sound Pickup At Crystal Rocks",
-//	"Sound Pickup At Windy Tunnel",
-//	"Sound Receiver Doors",
-//	"Windy Tunnel Lights",
-//	"Sound Receiver Current Input",
-//	"Sound Receiver Input #0 (Water Pool) Angle Value",
-//	"Sound Receiver Input #1 (Volcanic Crack) Angle Value",
-//	"Sound Receiver Input #2 (Clock) Angle Value",
-//	"Sound Receiver Input #3 (Crystal Rocks) Angle Value",
-//	"Sound Receiver Input #4 (Windy Tunnel) Angle Value",
-//	"Sound Lock Slider #1 (Left) Position",
-//	"Sound Lock Slider #2 Position",
-//	"Sound Lock Slider #3 Position",
-//	"Sound Lock Slider #4 Position",
-//	"Sound Lock Slider #5 (Right) Position"
-//};
-
-static const char *stoneship_vars_names[] = {
-	"Light State",
-	"Unknown #1",
-	"Unknown #2",
-	"Water Pump State",
-	"Lighthouse Trapdoor State",
-	"Lighthouse Chest Water State",
-	"Lighthouse Chest Valve State",
-	"Lighthouse Chest Open State",
-	"Lighthouse Trapdoor Key State",
-	"Lighthouse Generator Power Level(?)",
-	"Lighthouse Generator Power...?",
-	"Lighthouse Generator Power Good",
-	"Lighthouse Generator Power #1 ?",
-	"Lighthouse Generator Power #2?"
-};
-
-static const char *dunny_vars_names[] = {
-	"Outcome State"
-};
-
-void MystSaveLoad::debug_printMystVariables(MystVariables *_tv) {
-	uint8 i;
-
-	debugC(kDebugSaveLoad, "Printing Myst Variable State:");
-
-//	debugC(kDebugSaveLoad, "  Game Globals:");
-//	for (i = 0; i < ARRAYSIZE(_tv->game_globals); i++)
-//		debugC(kDebugSaveLoad, "    %s: %u", game_globals_names[i], _tv->game_globals[i]);
-
-	debugC(kDebugSaveLoad, "  Myst Variables:");
-	for (i = 0; i < ARRAYSIZE(_tv->myst_vars); i++)
-		debugC(kDebugSaveLoad, "    %s: %u", myst_vars_names[i], _tv->myst_vars[i]);
-
-	debugC(kDebugSaveLoad, "  Channelwood Variables:");
-	for (i = 0; i < ARRAYSIZE(_tv->channelwood_vars); i++)
-		debugC(kDebugSaveLoad, "    %s: %u", channelwood_vars_names[i], _tv->channelwood_vars[i]);
-
-	debugC(kDebugSaveLoad, "  Mech Variables:");
-	for (i = 0; i < ARRAYSIZE(_tv->mech_vars); i++)
-		debugC(kDebugSaveLoad, "    %s: %u", mech_vars_names[i], _tv->mech_vars[i]);
-
-//	debugC(kDebugSaveLoad, "  Selenitic Variables:");
-//	for (i = 0; i < ARRAYSIZE(_tv->selenitic_vars); i++)
-//		debugC(kDebugSaveLoad, "    %s: %u", selenitic_vars_names[i], _tv->selenitic_vars[i]);
-
-	debugC(kDebugSaveLoad, "  Stoneship Variables:");
-	for (i = 0; i < ARRAYSIZE(_tv->stoneship_vars); i++)
-		debugC(kDebugSaveLoad, "    %s: %u", stoneship_vars_names[i], _tv->stoneship_vars[i]);
-
-	debugC(kDebugSaveLoad, "  Dunny Variables:");
-	for (i = 0; i < ARRAYSIZE(_tv->dunny_vars); i++)
-		debugC(kDebugSaveLoad, "    %s: %u", dunny_vars_names[i], _tv->dunny_vars[i]);
-
-	debugC(kDebugSaveLoad, "  Other Variables:");
-
-	debugC(kDebugSaveLoad, "    Unknown Myst:");
-	for (i = 0; i < ARRAYSIZE(_tv->unknown_myst); i++)
-		debugC(kDebugSaveLoad, "    %u: 0x%04X - %u", i, _tv->unknown_myst[i], _tv->unknown_myst[i]);
-
-	debugC(kDebugSaveLoad, "    Unknown Channelwood:");
-	for (i = 0; i < ARRAYSIZE(_tv->unknown_channelwood); i++)
-		debugC(kDebugSaveLoad, "    %u: 0x%04X - %u", i, _tv->unknown_channelwood[i], _tv->unknown_channelwood[i]);
-
-	debugC(kDebugSaveLoad, "    Unknown Mech:");
-	for (i = 0; i < ARRAYSIZE(_tv->unknown_mech); i++)
-		debugC(kDebugSaveLoad, "    %u: 0x%04X - %u", i, _tv->unknown_mech[i], _tv->unknown_mech[i]);
-
-	debugC(kDebugSaveLoad, "    Unknown Selenitic:");
-	for (i = 0; i < ARRAYSIZE(_tv->unknown_selenitic); i++)
-		debugC(kDebugSaveLoad, "    %u: 0x%04X - %u", i, _tv->unknown_selenitic[i], _tv->unknown_selenitic[i]);
-
-	debugC(kDebugSaveLoad, "    Unknown Stoneship:");
-	for (i = 0; i < ARRAYSIZE(_tv->unknown_stoneship); i++)
-		debugC(kDebugSaveLoad, "    %u: 0x%04X - %u", i, _tv->unknown_stoneship[i], _tv->unknown_stoneship[i]);
-}
-
 } // End of namespace Mohawk

Modified: scummvm/trunk/engines/mohawk/myst_saveload.h
===================================================================
--- scummvm/trunk/engines/mohawk/myst_saveload.h	2010-12-06 20:29:45 UTC (rev 54802)
+++ scummvm/trunk/engines/mohawk/myst_saveload.h	2010-12-06 21:10:12 UTC (rev 54803)
@@ -30,6 +30,10 @@
 #include "common/file.h"
 #include "common/str.h"
 
+namespace Common {
+	class Serializer;
+}
+
 namespace Mohawk {
 
 // These are left as uint16 currently, rather than
@@ -66,7 +70,7 @@
 	   1  = Marker Switch Near Clock Tower
 	   2  = Marker Switch on Dock
 	   3  = Marker Switch Near Ship Pool
-	   4  = Marker Switch Near Cogs
+	   4  = Marker Switch Near Gears
 	   5  = Marker Switch Near Generator Room
 	   6  = Marker Switch Near Stellar Observatory
 	   7  = Marker Switch Near Rocket Ship
@@ -75,7 +79,7 @@
 	   10 = Cabin Gas Valve Position
 	   11 = Clock Tower Hour Hand Position
 	   12 = Clock Tower Minute Hand Position
-	   13 = Clock Tower Puzzle Solved / Cogs Open
+	   13 = Clock Tower Puzzle Solved / Gears Open
 	   14 = Clock Tower Gear Bridge
 	   15 = Generator Breaker State
 	   16 = Generator Button State
@@ -113,17 +117,55 @@
 	   48 = Unknown #7
 	   49 = Unknown #8
 	*/
-	uint16 myst_vars[50];
-
 	struct Myst {
+		uint32 cabinMarkerSwitch;
+		uint32 clockTowerMarkerSwitch;
+		uint32 dockMarkerSwitch;
+		uint32 poolMarkerSwitch;
+		uint32 gearsMarkerSwitch;
+		uint32 generatorMarkerSwitch;
+		uint32 observatoryMarkerSwitch;
+		uint32 rocketshipMarkerSwitch;
+		uint16 greenBookState;
+		uint16 shipState;
+		uint16 cabinValvePosition;
+		uint16 clockTowerHourPosition;
+		uint16 clockTowerMinutePosition;
+		uint16 gearsOpen;
+		uint16 clockTowerBridgeOpen;
 		uint16 generatorBreakers;
 		uint16 generatorButtons;
 		uint16 generatorVoltage;
 		uint16 libraryBookcaseDoor;
+		uint16 imagerSelection;
+		uint16 imagerActive;
+		uint16 u0;
+		uint16 u1;
+		uint16 u2;
+		uint16 u3;
+		uint16 towerRotationAngle;
+		uint16 courtyardImageBoxes;
+		uint16 cabinPilotLightLit;
+		uint16 observatoryDaySetting;
+		uint16 observatoryLights;
+		uint16 observatoryMonthSetting;
+		uint16 observatoryTimeSetting;
+		uint16 observatoryYearSetting;
+		uint16 observatoryDayTarget;
+		uint16 observatoryMonthTarget;
+		uint16 observatoryTimeTarget;
+		uint16 observatoryYearTarget;
+		uint16 cabinSafeCombination;
+		uint16 treePosition;
+		uint16 u4;
+		uint16 u5;
 		uint16 rocketSliderPosition[5];
+		uint16 u6;
+		uint16 u7;
+		uint16 u8;
+		uint16 u9;
 	} myst;
 
-
 	/* 7 Channelwood Specific Variables :
 	    0 = Water Pump Bridge State
 	    1 = Lower Walkway to Upper Walkway Elevator State
@@ -133,7 +175,15 @@
 	    5 = Achenar's Holoprojector Selection
 	    6 = Lower Walkway to Upper Walkway Spiral Stair Upper Door State
 	*/
-	uint16 channelwood_vars[7];
+	struct Channelwood {
+		uint32 waterPumpBridgeState;
+		uint32 elevatorState;
+		uint32 stairsLowerDoorState;
+		uint32 pipeState;
+		uint16 waterValveStates;
+		uint16 holoprojectorSelection;
+		uint16 stairsUpperDoorState;
+	} channelwood;
 
 	/* 8 Mech Specific Variables :
 	    0 = Achenar's Room Secret Panel State
@@ -145,7 +195,13 @@
 	    6 = Code Lock Shape #3
 	    7 = Code Lock Shape #4 (Right)
 	*/
-	uint16 mech_vars[8];
+	struct Mechanical {
+		uint16 achenarPanelState;
+		uint16 sirrusPanelState;
+		uint16 staircaseState;
+		uint16 elevatorRotation;
+		uint16 codeShape[4];
+	} mechanical;
 
 	/* 18 Selenitic Specific Variables :
 	    0 = Sound Pickup At Water Pool
@@ -193,27 +249,40 @@
 	    9 = Lighthouse Generator Power Level(?)
 	   10 = Lighthouse Generator Power...?
 	   11 = Lighthouse Generator Power Good
-	   12 = Lighthouse Generator Power #1 ?
+	   12 = Lighthouse Generator Power #1?
 	   13 = Lighthouse Generator Power #2?
 	*/
-	uint16 stoneship_vars[14];
+	struct Stoneship {
+		uint16 lightState;
+		uint16 u0;
+		uint16 u1;
+		uint16 pumpState;
+		uint16 trapdoorState;
+		uint16 chestWaterState;
+		uint16 chestValveState;
+		uint16 chestOpenState;
+		uint16 trapdoorKeyState;
+		uint16 generatorPowerLevel[5];
+	} stoneship;
 
 	/* 1 Dunny Specific Variable :
 	    0 = Outcome State
 	*/
-	uint16 dunny_vars[1];
+	struct Dni {
+		uint16 outcomeState;
+	} dni;
 
 	// The values in these regions seem to be lists of resource IDs
 	// which correspond to VIEW resources i.e. cards
-	uint16 unknown_myst[31];
+	uint16 unknownMyst[31];
 
-	uint16 unknown_channelwood[37];
+	uint16 unknownChannelwood[37];
 
-	uint16 unknown_mech[18];
+	uint16 unknownMech[18];
 
-	uint16 unknown_selenitic[30];
+	uint16 unknownSelenitic[30];
 
-	uint16 unknown_stoneship[22];
+	uint16 unknownStoneship[22];
 };
 
 class MohawkEngine_Myst;
@@ -227,10 +296,8 @@
 	bool loadGame(const Common::String &);
 	bool saveGame(const Common::String &);
 	void deleteSave(const Common::String &);
+	void syncGameState(Common::Serializer &s);
 
-	void initMystVariables(MystVariables *_tv);
-	void debug_printMystVariables(MystVariables *_tv);
-
 	MystVariables *_v;
 private:
 	MohawkEngine_Myst *_vm;


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