aboutsummaryrefslogtreecommitdiff
path: root/engines/mohawk/myst_saveload.cpp
diff options
context:
space:
mode:
authorEugene Sandulenko2009-12-29 23:18:24 +0000
committerEugene Sandulenko2009-12-29 23:18:24 +0000
commit0ea022d076c491d802431ee90b658d5e8c06d0e0 (patch)
tree23953ed8dbd2c1cc798b6aa9aa51df93c7041c7d /engines/mohawk/myst_saveload.cpp
parent5f1d2a88b51af43d8903866b46a424fe556abb3c (diff)
downloadscummvm-rg350-0ea022d076c491d802431ee90b658d5e8c06d0e0.tar.gz
scummvm-rg350-0ea022d076c491d802431ee90b658d5e8c06d0e0.tar.bz2
scummvm-rg350-0ea022d076c491d802431ee90b658d5e8c06d0e0.zip
Add Mohawk engine code. Part 1/3: main code.
svn-id: r46727
Diffstat (limited to 'engines/mohawk/myst_saveload.cpp')
-rw-r--r--engines/mohawk/myst_saveload.cpp676
1 files changed, 676 insertions, 0 deletions
diff --git a/engines/mohawk/myst_saveload.cpp b/engines/mohawk/myst_saveload.cpp
new file mode 100644
index 0000000000..2f94c9e2fe
--- /dev/null
+++ b/engines/mohawk/myst_saveload.cpp
@@ -0,0 +1,676 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#include "mohawk/myst.h"
+#include "mohawk/myst_saveload.h"
+
+#include "common/util.h"
+
+namespace Mohawk {
+
+MystSaveLoad::MystSaveLoad(MohawkEngine_Myst *vm, Common::SaveFileManager *saveFileMan) : _vm(vm), _saveFileMan(saveFileMan) {
+ _v = new MystVariables();
+ initMystVariables(_v);
+}
+
+MystSaveLoad::~MystSaveLoad() {
+ delete _v;
+}
+
+Common::StringList MystSaveLoad::generateSaveGameList() {
+ return _saveFileMan->listSavefiles("*.mys");
+}
+
+bool MystSaveLoad::loadGame(Common::String filename) {
+ if (_vm->getFeatures() & GF_DEMO) // Don't load games in the demo
+ return false;
+
+ Common::InSaveFile *loadFile;
+ if (!(loadFile = _saveFileMan->openForLoading(filename.c_str())))
+ return false;
+ 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
+ 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->game_globals[0] = loadFile->readUint16LE()) != 2)
+ warning("Unexpected value at 0x%03X - Found %u Expected %u", loadFile->pos(), _v->game_globals[0], 2);
+
+ _v->game_globals[1] = loadFile->readUint16LE();
+ _v->game_globals[2] = loadFile->readUint16LE();
+
+ if ((_v->game_globals[3] = loadFile->readUint16LE()) != 1)
+ warning("Unexpected value at 0x%03X - Found %u Expected %u", loadFile->pos(), _v->game_globals[3], 1);
+
+ _v->game_globals[4] = loadFile->readUint16LE();
+ _v->game_globals[5] = loadFile->readUint16LE();
+ _v->game_globals[6] = loadFile->readUint16LE();
+ _v->game_globals[7] = 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();
+
+ 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]);
+
+ if ((_v->channelwood_vars[6] = loadFile->readUint16LE()) > 1)
+ warning("Non-Boolean value found at 0x%03X - Found %u", loadFile->pos(), _v->channelwood_vars[6]);
+
+ 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]);
+
+ for (byte i = 0; i < 7; i++) {
+ if (_vm->getFeatures() & GF_ME) {
+ _v->selenitic_vars[i] = loadFile->readUint16LE();
+
+ if (loadFile->readUint16LE() != 0)
+ warning("Non-zero value at 0x%03X", loadFile->pos());
+ } else
+ _v->selenitic_vars[i] = loadFile->readByte();
+
+ if (_v->selenitic_vars[i] > 1)
+ warning("Non-Boolean value found at 0x%03X - Found %u", loadFile->pos(), _v->selenitic_vars[i]);
+ }
+
+ for(byte i = 7; i < 18; i++)
+ _v->selenitic_vars[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->selenitic_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());
+ }
+
+ 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());
+ } 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(Common::String filename) {
+ // Make sure we have the right extension
+ if (!filename.hasSuffix(".mys") && !filename.hasSuffix(".MYS"))
+ filename += ".mys";
+
+ Common::OutSaveFile *saveFile;
+ if (!(saveFile = _saveFileMan->openForSaving(filename.c_str())))
+ return false;
+ debugC(kDebugSaveLoad, "Saving game to \'%s\'", filename.c_str());
+
+ debug_printMystVariables(_v);
+
+ // Performs no validation of variable values - Assumes they are valid.
+ for (byte i = 0; i < 8; i++)
+ saveFile->writeUint16LE(_v->game_globals[i]);
+
+ 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]);
+
+ for (byte i = 0; i < 7; i++) {
+ if (_vm->getFeatures() & GF_ME) {
+ saveFile->writeUint16LE(_v->selenitic_vars[i]);
+ saveFile->writeUint16LE(0);
+ } else
+ saveFile->writeByte(_v->selenitic_vars[i]);
+ }
+
+ for(byte i = 7; i < 18; i++)
+ saveFile->writeUint16LE(_v->selenitic_vars[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]);
+
+ 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]);
+
+ for (byte i = 0; i < 10; i++)
+ saveFile->writeUint16LE(0);
+
+ for (byte i = 0; i < 37; i++)
+ saveFile->writeUint16LE(_v->unknown_channelwood[i]);
+
+ for (byte i = 0; i < 4; i++)
+ saveFile->writeUint16LE(0);
+
+ for (byte i = 0; i < 18; i++)
+ saveFile->writeUint16LE(_v->unknown_mech[i]);
+
+ for (byte i = 0; i < 23; i++)
+ saveFile->writeUint16LE(0);
+
+ for (byte i = 0; i < 30; i++)
+ saveFile->writeUint16LE(_v->unknown_selenitic[i]);
+
+ for (byte i = 0; i < 11; i++)
+ saveFile->writeUint16LE(0);
+
+ 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();
+
+ delete saveFile;
+
+ return true;
+}
+
+void MystSaveLoad::deleteSave(Common::String saveName) {
+ debugC(kDebugSaveLoad, "Deleting save file \'%s\'", saveName.c_str());
+ _saveFileMan->removeSavefile(saveName.c_str());
+}
+
+void MystSaveLoad::initMystVariables(MystVariables *_tv) {
+ uint8 i;
+
+ // Most of the variables are zero at game start.
+ for (i = 0; i < ARRAYSIZE(_tv->game_globals); i++)
+ _tv->game_globals[i] = 0;
+ for (i = 0; i < ARRAYSIZE(_tv->myst_vars); i++)
+ _tv->myst_vars[i] = 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;
+ for (i = 0; i < ARRAYSIZE(_tv->selenitic_vars); i++)
+ _tv->selenitic_vars[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..
+
+ // Unknown - Fixed at 2
+ _tv->game_globals[0] = 2;
+ // Current Age / Stack - Start in Myst
+ _tv->game_globals[1] = 2;
+ // Unknown - Fixed at 1
+ _tv->game_globals[3] = 1;
+
+ // Library Bookcase Door - Default to Up
+ _tv->myst_vars[18] = 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 Transistions",
+ "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