mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-17 15:18:11 +00:00
73b3a43b89
Used in the 25th Anniversary edition of Myst ME
374 lines
11 KiB
C++
374 lines
11 KiB
C++
/* 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.
|
|
*
|
|
*/
|
|
|
|
#ifndef MYST_SAVELOAD_H
|
|
#define MYST_SAVELOAD_H
|
|
|
|
#include "common/savefile.h"
|
|
#include "common/file.h"
|
|
#include "common/str.h"
|
|
|
|
#include "engines/savestate.h"
|
|
|
|
namespace Common {
|
|
class Serializer;
|
|
}
|
|
|
|
namespace Mohawk {
|
|
|
|
class MohawkEngine_Myst;
|
|
|
|
struct MystSaveMetadata {
|
|
uint8 saveDay;
|
|
uint8 saveMonth;
|
|
uint16 saveYear;
|
|
|
|
uint8 saveHour;
|
|
uint8 saveMinute;
|
|
|
|
uint32 totalPlayTime;
|
|
|
|
bool autoSave;
|
|
|
|
Common::String saveDescription;
|
|
|
|
MystSaveMetadata();
|
|
bool sync(Common::Serializer &s);
|
|
};
|
|
|
|
// Page being held
|
|
enum HeldPage {
|
|
kNoPage = 0,
|
|
kBlueLibraryPage = 1,
|
|
kBlueSeleniticPage = 2,
|
|
kBlueMechanicalPage = 3,
|
|
kBlueStoneshipPage = 4,
|
|
kBlueChannelwoodPage = 5,
|
|
kBlueFirePlacePage = 6,
|
|
kRedLibraryPage = 7,
|
|
kRedSeleniticPage = 8,
|
|
kRedMechanicalPage = 9,
|
|
kRedStoneshipPage = 10,
|
|
kRedChannelwoodPage = 11,
|
|
kRedFirePlacePage = 12,
|
|
kWhitePage = 13
|
|
};
|
|
|
|
// Age the player is in
|
|
enum ActiveAge {
|
|
kSelenitic = 0,
|
|
kStoneship = 1,
|
|
kMystLibrary = 2,
|
|
kMechanical = 3,
|
|
kChannelwood = 4,
|
|
kIntro = 5,
|
|
kDni = 6,
|
|
kMystStart = 7,
|
|
kCredits = 8,
|
|
kSirrusEnding = 9,
|
|
kAchenarEnding = 10
|
|
};
|
|
|
|
// Various states that Atrus can be in when in Dni
|
|
enum DniEnding {
|
|
kDniNotVisited = 0, // Player hasn't been to Dni/K'veer yet
|
|
kAtrusWantsPage = 1, // Player is in Dni with the white page
|
|
kAtrusLeaves = 2, // Atrus leaves Dni after receiving the white page
|
|
kForgotPage = 3, // Player has entered Dni without bringing the white page
|
|
kBooksDestroyed = 4 // Atrus returns to Dni after previously leaving
|
|
// and destroying the books of his sons
|
|
};
|
|
|
|
class MystGameState {
|
|
public:
|
|
static const int kAutoSaveSlot;
|
|
|
|
MystGameState(MohawkEngine_Myst*, Common::SaveFileManager*);
|
|
~MystGameState();
|
|
|
|
static SaveStateDescriptor querySaveMetaInfos(int slot);
|
|
static Common::String querySaveDescription(int slot);
|
|
|
|
void reset();
|
|
bool load(int slot);
|
|
bool save(int slot, const Common::String &desc, const Graphics::Surface *thumbnail, bool autosave);
|
|
bool isAutoSaveAllowed();
|
|
static void deleteSave(int slot);
|
|
|
|
void addZipDest(MystStack stack, uint16 view);
|
|
bool isReachableZipDest(MystStack stack, uint16 view);
|
|
|
|
/* 8 Game Global Variables :
|
|
0 = Unknown - Fixed at 2
|
|
1 = Current Age / Stack
|
|
2 = Page Being Held
|
|
3 = Unknown - Fixed at 1
|
|
4 = Slide Transitions
|
|
5 = Ending
|
|
6 = Red Pages in Book
|
|
7 = Blue Pages in Book
|
|
*/
|
|
struct Globals {
|
|
uint16 u0;
|
|
ActiveAge currentAge;
|
|
HeldPage heldPage;
|
|
uint16 u1;
|
|
uint16 transitions;
|
|
uint16 zipMode;
|
|
uint16 redPagesInBook;
|
|
uint16 bluePagesInBook;
|
|
DniEnding ending;
|
|
} _globals;
|
|
|
|
/* 50 Myst Specific Variables :
|
|
0 = Marker Switch Near Cabin
|
|
1 = Marker Switch Near Clock Tower
|
|
2 = Marker Switch on Dock
|
|
3 = Marker Switch Near Ship Pool
|
|
4 = Marker Switch Near Gears
|
|
5 = Marker Switch Near Generator Room
|
|
6 = Marker Switch Near Stellar Observatory
|
|
7 = Marker Switch Near Rocket Ship
|
|
8 = Fireplace, Opened Green Book Before
|
|
9 = Ship State
|
|
10 = Cabin Gas Valve Position
|
|
11 = Clock Tower Hour Hand Position
|
|
12 = Clock Tower Minute Hand Position
|
|
13 = Clock Tower Puzzle Solved / Gears Open
|
|
14 = Clock Tower Gear Bridge
|
|
15 = Generator Breaker State
|
|
16 = Generator Button State
|
|
17 = Generator Voltage State
|
|
18 = Library Bookcase Door
|
|
19 = Dock Imager Numeric Selection
|
|
20 = Dock Imager Active
|
|
21 = Unknown #1 - Fixed at 0
|
|
22 = Unknown #2 - Fixed at 0
|
|
23 = Unknown #3 - Fixed at 0
|
|
24 = Unknown #4 - Fixed at 0
|
|
25 = Tower Rotation Angle
|
|
26 = Boxes For Ship Float Puzzle
|
|
27 = Tree Boiler Pilot Light Lit
|
|
28 = Stellar Observatory Viewer, Control Setting Day
|
|
29 = Stellar Observatory Lights
|
|
30 = Stellar Observatory Viewer, Control Setting Month
|
|
31 = Stellar Observatory Viewer, Control Setting Time
|
|
32 = Stellar Observatory Viewer, Control Setting Year
|
|
33 = Stellar Observatory Viewer, Target Day
|
|
34 = Stellar Observatory Viewer, Target Month
|
|
35 = Stellar Observatory Viewer, Target Time
|
|
36 = Stellar Observatory Viewer, Target Year
|
|
37 = Cabin Safe Combination
|
|
38 = Channelwood Tree Position
|
|
39 = Checksum? #1
|
|
40 = Checksum? #2
|
|
41 = Rocketship Music Puzzle Slider #1 Position
|
|
42 = Rocketship Music Puzzle Slider #2 Position
|
|
43 = Rocketship Music Puzzle Slider #3 Position
|
|
44 = Rocketship Music Puzzle Slider #4 Position
|
|
45 = Rocketship Music Puzzle Slider #5 Position
|
|
46 = Unknown #5
|
|
47 = Unknown #6
|
|
48 = Unknown #7
|
|
49 = Unknown #8
|
|
*/
|
|
struct Myst {
|
|
uint32 cabinMarkerSwitch;
|
|
uint32 clockTowerMarkerSwitch;
|
|
uint32 dockMarkerSwitch;
|
|
uint32 poolMarkerSwitch;
|
|
uint32 gearsMarkerSwitch;
|
|
uint32 generatorMarkerSwitch;
|
|
uint32 observatoryMarkerSwitch;
|
|
uint32 rocketshipMarkerSwitch;
|
|
uint16 greenBookOpenedBefore;
|
|
uint16 shipFloating;
|
|
uint16 cabinValvePosition;
|
|
uint16 clockTowerHourPosition;
|
|
uint16 clockTowerMinutePosition;
|
|
uint16 gearsOpen;
|
|
uint16 clockTowerBridgeOpen;
|
|
uint16 generatorBreakers;
|
|
uint16 generatorButtons;
|
|
uint16 generatorVoltage;
|
|
uint16 libraryBookcaseDoor;
|
|
uint16 imagerSelection;
|
|
uint16 imagerActive;
|
|
uint16 imagerWaterErased;
|
|
uint16 imagerMountainErased;
|
|
uint16 imagerAtrusErased;
|
|
uint16 imagerMarkerErased;
|
|
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;
|
|
uint32 treeLastMoveTime;
|
|
uint16 rocketSliderPosition[5];
|
|
uint16 observatoryDaySlider;
|
|
uint16 observatoryMonthSlider;
|
|
uint16 observatoryYearSlider;
|
|
uint16 observatoryTimeSlider;
|
|
} _myst;
|
|
|
|
/* 7 Channelwood Specific Variables :
|
|
0 = Water Pump Bridge State
|
|
1 = Lower Walkway to Upper Walkway Elevator State
|
|
2 = Lower Walkway to Upper Walkway Spiral Stair Lower Door State
|
|
3 = Extendable Pipe State
|
|
4 = Water Valve States
|
|
5 = Achenar's Holoprojector Selection
|
|
6 = Lower Walkway to Upper Walkway Spiral Stair Upper Door State
|
|
*/
|
|
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
|
|
1 = Sirrus' Room Secret Panel State
|
|
2 = Fortress Staircase State
|
|
3 = Fortress Elevator Rotation
|
|
4 = Code Lock Shape #1 (Left)
|
|
5 = Code Lock Shape #2
|
|
6 = Code Lock Shape #3
|
|
7 = Code Lock Shape #4 (Right)
|
|
*/
|
|
struct Mechanical {
|
|
uint32 achenarCrateOpened;
|
|
uint16 achenarPanelState;
|
|
uint16 sirrusPanelState;
|
|
uint16 staircaseState;
|
|
uint16 elevatorRotation;
|
|
uint16 codeShape[4];
|
|
} _mechanical;
|
|
|
|
/* 18 Selenitic Specific Variables :
|
|
0 = Sound Pickup At Water Pool
|
|
1 = Sound Pickup At Volcanic Crack
|
|
2 = Sound Pickup At Clock
|
|
3 = Sound Pickup At Crystal Rocks
|
|
4 = Sound Pickup At Windy Tunnel
|
|
5 = Sound Receiver Doors
|
|
6 = Windy Tunnel Lights
|
|
7 = Sound Receiver Current Input
|
|
8 = Sound Receiver Input #0 (Water Pool) Angle Value
|
|
9 = Sound Receiver Input #1 (Volcanic Crack) Angle Value
|
|
10 = Sound Receiver Input #2 (Clock) Angle Value
|
|
11 = Sound Receiver Input #3 (Crystal Rocks) Angle Value
|
|
12 = Sound Receiver Input #4 (Windy Tunnel) Angle Value
|
|
13 = Sound Lock Slider #1 (Left) Position
|
|
14 = Sound Lock Slider #2 Position
|
|
15 = Sound Lock Slider #3 Position
|
|
16 = Sound Lock Slider #4 Position
|
|
17 = Sound Lock Slider #5 (Right) Position
|
|
*/
|
|
struct Selenitic {
|
|
uint32 emitterEnabledWater;
|
|
uint32 emitterEnabledVolcano;
|
|
uint32 emitterEnabledClock;
|
|
uint32 emitterEnabledCrystal;
|
|
uint32 emitterEnabledWind;
|
|
uint32 soundReceiverOpened;
|
|
uint32 tunnelLightsSwitchedOn;
|
|
uint16 soundReceiverCurrentSource;
|
|
uint16 soundReceiverPositions[5];
|
|
uint16 soundLockSliderPositions[5];
|
|
} _selenitic;
|
|
|
|
/* 14 Stoneship Specific Variables :
|
|
0 = Light State
|
|
1 = Secret side door opened
|
|
2 = Water Pump State
|
|
3 = Lighthouse Trapdoor State
|
|
4 = Lighthouse Chest Water State
|
|
5 = Lighthouse Chest Valve State
|
|
6 = Lighthouse Chest Open State
|
|
7 = Lighthouse Trapdoor Key State
|
|
8 = Lighthouse Battery Duration
|
|
9 = Lighthouse Battery Power Good
|
|
10 = Lighthouse Battery Depletion Time
|
|
*/
|
|
struct Stoneship {
|
|
uint32 lightState;
|
|
uint16 sideDoorOpened;
|
|
uint16 pumpState;
|
|
uint16 trapdoorState;
|
|
uint16 chestWaterState;
|
|
uint16 chestValveState;
|
|
uint16 chestOpenState;
|
|
uint16 trapdoorKeyState;
|
|
uint32 generatorDuration;
|
|
uint16 generatorPowerAvailable;
|
|
uint32 generatorDepletionTime;
|
|
} _stoneship;
|
|
|
|
MystSaveMetadata _metadata;
|
|
|
|
private:
|
|
void syncGameState(Common::Serializer &s, bool isME);
|
|
static Common::String buildSaveFilename(int slot);
|
|
static Common::String buildMetadataFilename(int slot);
|
|
bool loadState(int slot);
|
|
void loadMetadata(int slot);
|
|
bool saveState(int slot);
|
|
void updateMetadateForSaving(const Common::String &desc, bool autoSave);
|
|
bool saveMetadata(int slot, const Graphics::Surface *thumbnail);
|
|
|
|
// The values in these regions are lists of VIEW resources
|
|
// which correspond to visited zip destinations
|
|
|
|
typedef uint16 ZipDests[41];
|
|
|
|
ZipDests _mystReachableZipDests;
|
|
|
|
ZipDests _channelwoodReachableZipDests;
|
|
|
|
ZipDests _mechReachableZipDests;
|
|
|
|
ZipDests _seleniticReachableZipDests;
|
|
|
|
ZipDests _stoneshipReachableZipDests;
|
|
|
|
MohawkEngine_Myst *_vm;
|
|
Common::SaveFileManager *_saveFileMan;
|
|
};
|
|
|
|
} // End of namespace Mohawk
|
|
|
|
#endif
|