aboutsummaryrefslogtreecommitdiff
path: root/engines/mohawk/myst_saveload.cpp
diff options
context:
space:
mode:
authorMatthew Hoops2010-12-06 21:10:12 +0000
committerMatthew Hoops2010-12-06 21:10:12 +0000
commitedf4b1926bd7365d5b88c9e344aca35cf44da4db (patch)
treef5acfa83dfe61701b72403e509d3da4f672a3018 /engines/mohawk/myst_saveload.cpp
parentfb854b1483a0bcb18ac938b3e0164c7e7e22f81d (diff)
downloadscummvm-rg350-edf4b1926bd7365d5b88c9e344aca35cf44da4db.tar.gz
scummvm-rg350-edf4b1926bd7365d5b88c9e344aca35cf44da4db.tar.bz2
scummvm-rg350-edf4b1926bd7365d5b88c9e344aca35cf44da4db.zip
MOHAWK: Rewrite the Myst save/load code to use Common::Serializer and name all the variables
svn-id: r54803
Diffstat (limited to 'engines/mohawk/myst_saveload.cpp')
-rw-r--r--engines/mohawk/myst_saveload.cpp797
1 files changed, 192 insertions, 605 deletions
diff --git a/engines/mohawk/myst_saveload.cpp b/engines/mohawk/myst_saveload.cpp
index 90ae2906ed..e5aaf7fe05 100644
--- a/engines/mohawk/myst_saveload.cpp
+++ b/engines/mohawk/myst_saveload.cpp
@@ -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,7 +70,8 @@ bool MystSaveLoad::loadGame(const Common::String &filename) {
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...
@@ -58,409 +79,229 @@ bool MystSaveLoad::loadGame(const Common::String &filename) {
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);
-
- _v->globals.currentAge = loadFile->readUint16LE();
- _v->globals.heldPage = loadFile->readUint16LE();
-
- if ((_v->globals.u1 = loadFile->readUint16LE()) != 1)
- warning("Unexpected value at 0x%03X - Found %u Expected %u", loadFile->pos(), _v->globals.u1, 1);
-
- _v->globals.transitions = loadFile->readUint16LE();
- _v->globals.ending = loadFile->readUint16LE();
- _v->globals.redPagesInBook = loadFile->readUint16LE();
- _v->globals.bluePagesInBook = loadFile->readUint16LE();
-
- for (byte i = 0; i < 8; i++) {
- if (_vm->getFeatures() & GF_ME) {
- _v->myst_vars[i] = loadFile->readUint16LE();
-
- if (loadFile->readUint16LE() != 0)
- warning("Non-zero value at 0x%03X", loadFile->pos());
- } else
- _v->myst_vars[i] = loadFile->readByte();
-
- if (_v->myst_vars[i] > 1)
- warning("Non-Boolean value found at 0x%03X - Found %u", loadFile->pos(), _v->myst_vars[i]);
- }
-
- if ((_v->myst_vars[8] = loadFile->readUint16LE()) > 1)
- warning("Non-Boolean value found at 0x%03X - Found %u", loadFile->pos(), _v->myst_vars[8]);
-
- 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]);
- }
-
- _v->channelwood_vars[4] = loadFile->readUint16LE();
+ Common::Serializer s(loadFile, 0);
+ syncGameState(s);
+ delete loadFile;
- 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]);
+ return true;
+}
- if ((_v->channelwood_vars[6] = loadFile->readUint16LE()) > 1)
- warning("Non-Boolean value found at 0x%03X - Found %u", loadFile->pos(), _v->channelwood_vars[6]);
+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";
- if (_vm->getFeatures() & GF_ME) {
- if (loadFile->readUint16LE() != 0)
- warning("Non-zero value at 0x%03X", loadFile->pos());
+ Common::OutSaveFile *saveFile = _saveFileMan->openForSaving(filename);
+ if (!saveFile)
+ return false;
- 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());
+ debugC(kDebugSaveLoad, "Saving game to '%s'", filename.c_str());
- 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]);
+ Common::Serializer s(0, saveFile);
+ syncGameState(s);
+ saveFile->finalize();
+ delete saveFile;
- _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]);
+ return true;
+}
+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);
+
+ // Onto Myst
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->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 {
- _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();
- }
-
- _v->selenitic.soundReceiverCurrentSource = loadFile->readUint16LE();
-
- for(byte i = 0; i < 5; i++)
- _v->selenitic.soundReceiverPositions[i] = loadFile->readUint16LE();
-
- for(byte i = 0; i < 5; i++)
- _v->selenitic.soundLockSliderPositions[i] = loadFile->readUint16LE();
-
- 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();
-
- 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 (byte i = 0; i < 1; i++)
- _v->dunny_vars[i] = loadFile->readUint16LE();
-
- // 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());
+ 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);
}
- 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());
+ 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);
+
+ for (int i = 0; i < 5; i++)
+ s.syncAsUint16LE(_v->myst.rocketSliderPosition[i]);
+
+ 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) {
+ s.syncAsUint32LE(_v->channelwood.waterPumpBridgeState);
+ s.syncAsUint32LE(_v->channelwood.elevatorState);
+ s.syncAsUint32LE(_v->channelwood.stairsLowerDoorState);
+ s.syncAsUint32LE(_v->channelwood.pipeState);
+ } else {
+ s.syncAsByte(_v->channelwood.waterPumpBridgeState);
+ s.syncAsByte(_v->channelwood.elevatorState);
+ s.syncAsByte(_v->channelwood.stairsLowerDoorState);
+ s.syncAsByte(_v->channelwood.pipeState);
}
- for (byte i = 0; i < 18; i++)
- _v->unknown_mech[i] = loadFile->readUint16LE();
+ s.syncAsUint16LE(_v->channelwood.waterValveStates);
+ s.syncAsUint16LE(_v->channelwood.holoprojectorSelection);
+ s.syncAsUint16LE(_v->channelwood.stairsUpperDoorState);
- for (byte i = 0; i < 23; i++) {
- if (loadFile->readUint16LE() != 0)
- warning("Non-zero value at 0x%03X", loadFile->pos());
- }
+ if (_vm->getFeatures() & GF_ME)
+ s.skip(4);
+ else
+ s.skip(1);
- for (byte i = 0; i < 30; i++)
- _v->unknown_selenitic[i] = loadFile->readUint16LE();
+ // Mechanical
- for (byte i = 0; i < 11; i++) {
- if (loadFile->readUint16LE() != 0)
- warning("Non-zero value at 0x%03X", loadFile->pos());
- }
+ s.syncAsUint16LE(_v->mechanical.achenarPanelState);
+ s.syncAsUint16LE(_v->mechanical.sirrusPanelState);
+ s.syncAsUint16LE(_v->mechanical.staircaseState);
+ s.syncAsUint16LE(_v->mechanical.elevatorRotation);
- for (byte i = 0; i < 22; i++)
- _v->unknown_stoneship[i] = loadFile->readUint16LE();
+ for (int i = 0; i < 4; i++)
+ s.syncAsUint16LE(_v->mechanical.codeShape[i]);
- for (byte i = 0; i < 19; i++) {
- if (loadFile->readUint16LE() != 0)
- warning("Non-zero value at 0x%03X", loadFile->pos());
- }
+ // Selenitic
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());
- }
-
- delete loadFile;
-
- debug_printMystVariables(_v);
-
- return true;
-}
-
-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";
-
- 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]);
+ 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);
}
- 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]);
- }
+ s.syncAsUint16LE(_v->selenitic.soundReceiverCurrentSource);
- for (byte i = 4; i < 7; i++)
- saveFile->writeUint16LE(_v->channelwood_vars[i]);
+ for (byte i = 0; i < 5; i++)
+ s.syncAsUint16LE(_v->selenitic.soundReceiverPositions[i]);
- if (_vm->getFeatures() & GF_ME) {
- saveFile->writeUint16LE(0);
- saveFile->writeUint16LE(0);
- } else
- saveFile->writeByte(0);
+ for (byte i = 0; i < 5; i++)
+ s.syncAsUint16LE(_v->selenitic.soundLockSliderPositions[i]);
- for (byte i = 0; i < 8; i++)
- saveFile->writeUint16LE(_v->mech_vars[i]);
+ // Stoneship
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);
-
- for(byte i = 0; i < 5; i++)
- saveFile->writeUint16LE(_v->selenitic.soundReceiverPositions[i]);
+ 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.soundLockSliderPositions[i]);
+ for (int i = 0; i < 5; i++)
+ s.syncAsUint16LE(_v->stoneship.generatorPowerLevel[i]);
- 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]);
+ // D'ni
+ s.syncAsUint16LE(_v->dni.outcomeState);
- for (byte i = 0; i < 1; i++)
- saveFile->writeUint16LE(_v->dunny_vars[i]);
+ // Reading unknown region...
+ // When Zero Value regions are included, these are 5 blocks of
+ // 41 uint16 values.
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]);
-
- for (byte i = 0; i < 19; i++)
- saveFile->writeUint16LE(0);
-
- saveFile->finalize();
+ s.syncAsUint16LE(_v->unknownStoneship[i]);
- delete saveFile;
+ s.skip(38);
- 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 @@ void MystSaveLoad::deleteSave(const Common::String &saveName) {
_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