aboutsummaryrefslogtreecommitdiff
path: root/engines/xeen/saves.cpp
diff options
context:
space:
mode:
authorPaul Gilbert2018-01-11 21:31:48 -0500
committerPaul Gilbert2018-01-11 21:31:48 -0500
commit93935a779883131f7f9568153cf29ead2affd833 (patch)
tree7dedd346f3be671ad8b435bd72d5c1186f58f7f5 /engines/xeen/saves.cpp
parentebc3d270969e832db2ee9f26d958e66d4e23ed10 (diff)
downloadscummvm-rg350-93935a779883131f7f9568153cf29ead2affd833.tar.gz
scummvm-rg350-93935a779883131f7f9568153cf29ead2affd833.tar.bz2
scummvm-rg350-93935a779883131f7f9568153cf29ead2affd833.zip
XEEN: Implementing savegame code
Diffstat (limited to 'engines/xeen/saves.cpp')
-rw-r--r--engines/xeen/saves.cpp53
1 files changed, 35 insertions, 18 deletions
diff --git a/engines/xeen/saves.cpp b/engines/xeen/saves.cpp
index 504bb18dd7..0bc41293f7 100644
--- a/engines/xeen/saves.cpp
+++ b/engines/xeen/saves.cpp
@@ -23,6 +23,7 @@
#include "common/scummsys.h"
#include "common/algorithm.h"
#include "common/memstream.h"
+#include "common/substream.h"
#include "graphics/scaler.h"
#include "graphics/thumbnail.h"
#include "xeen/saves.h"
@@ -112,6 +113,9 @@ bool SavesManager::readSavegameHeader(Common::InSaveFile *in, XeenSavegameHeader
}
void SavesManager::writeSavegameHeader(Common::OutSaveFile *out, XeenSavegameHeader &header) {
+ EventsManager &events = *g_vm->_events;
+ Screen &screen = *g_vm->_screen;
+
// Write out a savegame header
out->write(SAVEGAME_STR, SAVEGAME_STR_SIZE + 1);
@@ -122,15 +126,14 @@ void SavesManager::writeSavegameHeader(Common::OutSaveFile *out, XeenSavegameHea
out->writeByte('\0');
// Write a thumbnail of the screen
- /*
uint8 thumbPalette[768];
- _screen->getPalette(thumbPalette);
+ screen.getPalette(thumbPalette);
Graphics::Surface saveThumb;
- ::createThumbnail(&saveThumb, (const byte *)_screen->getPixels(),
- _screen->w, _screen->h, thumbPalette);
+ ::createThumbnail(&saveThumb, (const byte *)screen.getPixels(),
+ screen.w, screen.h, thumbPalette);
Graphics::saveThumbnail(*out, saveThumb);
saveThumb.free();
- */
+
// Write out the save date/time
TimeDate td;
g_system->getTimeAndDate(td);
@@ -139,7 +142,7 @@ void SavesManager::writeSavegameHeader(Common::OutSaveFile *out, XeenSavegameHea
out->writeSint16LE(td.tm_mday);
out->writeSint16LE(td.tm_hour);
out->writeSint16LE(td.tm_min);
- // out->writeUint32LE(_events->getFrameCounter());
+ out->writeUint32LE(events.playTime());
}
Common::Error SavesManager::saveGameState(int slot, const Common::String &desc) {
@@ -152,8 +155,16 @@ Common::Error SavesManager::saveGameState(int slot, const Common::String &desc)
header._saveName = desc;
writeSavegameHeader(out, header);
- Common::Serializer s(nullptr, out);
- synchronize(s);
+ // Loop through saving the sides' save archives
+ SaveArchive *archives[2] = { File::_xeenSave, File::_darkSave };
+ for (int idx = 0; idx < 2; ++idx) {
+ if (archives[idx]) {
+ archives[idx]->save(*out);
+ } else {
+ // Side isn't present
+ out->writeUint32LE(0);
+ }
+ }
out->finalize();
delete out;
@@ -167,8 +178,6 @@ Common::Error SavesManager::loadGameState(int slot) {
if (!saveFile)
return Common::kReadingFailed;
- Common::Serializer s(saveFile, nullptr);
-
// Load the savaegame header
XeenSavegameHeader header;
if (!readSavegameHeader(saveFile, header))
@@ -179,9 +188,22 @@ Common::Error SavesManager::loadGameState(int slot) {
delete header._thumbnail;
}
- // Load most of the savegame data
- synchronize(s);
- delete saveFile;
+ // Set the total play time
+ g_vm->_events->setPlayTime(header._totalFrames);
+
+ // Loop through loading the sides' save archives
+ SaveArchive *archives[2] = { File::_xeenSave, File::_darkSave };
+ for (int idx = 0; idx < 2; ++idx) {
+ uint fileSize = saveFile->readUint32LE();
+
+ if (archives[idx]) {
+ Common::SeekableSubReadStream arcStream(saveFile, saveFile->pos(),
+ saveFile->pos() + fileSize);
+ archives[idx]->load(&arcStream);
+ } else {
+ assert(!fileSize);
+ }
+ }
return Common::kNoError;
}
@@ -190,9 +212,4 @@ Common::String SavesManager::generateSaveName(int slot) {
return Common::String::format("%s.%03d", _targetName.c_str(), slot);
}
-void SavesManager::synchronize(Common::Serializer &s) {
- // TODO
-}
-
-
} // End of namespace Xeen