[Scummvm-git-logs] scummvm master -> 93935a779883131f7f9568153cf29ead2affd833

dreammaster dreammaster at scummvm.org
Fri Jan 12 03:31:59 CET 2018


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
93935a7798 XEEN: Implementing savegame code


Commit: 93935a779883131f7f9568153cf29ead2affd833
    https://github.com/scummvm/scummvm/commit/93935a779883131f7f9568153cf29ead2affd833
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2018-01-11T21:31:48-05:00

Commit Message:
XEEN: Implementing savegame code

Changed paths:
    engines/xeen/events.cpp
    engines/xeen/events.h
    engines/xeen/files.cpp
    engines/xeen/files.h
    engines/xeen/saves.cpp
    engines/xeen/saves.h


diff --git a/engines/xeen/events.cpp b/engines/xeen/events.cpp
index cc58edd..babfdcb 100644
--- a/engines/xeen/events.cpp
+++ b/engines/xeen/events.cpp
@@ -31,7 +31,7 @@
 
 namespace Xeen {
 
-EventsManager::EventsManager(XeenEngine *vm) : _vm(vm),
+EventsManager::EventsManager(XeenEngine *vm) : _vm(vm), _playTime(0),
 		_frameCounter(0), _priorFrameCounterTime(0), _gameCounter(0),
 		_leftButton(false), _rightButton(false), _sprites("mouse.icn") {
 	Common::fill(&_gameCounters[0], &_gameCounters[6], 0);
@@ -181,6 +181,7 @@ void EventsManager::waitForPressAnimated() {
 
 void EventsManager::nextFrame() {
 	++_frameCounter;
+	++_playTime;
 
 	// Allow debugger to update
 	_vm->_debugger->update();
diff --git a/engines/xeen/events.h b/engines/xeen/events.h
index cf74a64..e6018f6 100644
--- a/engines/xeen/events.h
+++ b/engines/xeen/events.h
@@ -41,6 +41,7 @@ private:
 	uint32 _priorFrameCounterTime;
 	uint32 _gameCounter;
 	uint32 _gameCounters[6];
+	uint32 _playTime;
 	Common::Queue<Common::KeyState> _keys;
 	SpriteResource _sprites;
 
@@ -107,6 +108,8 @@ public:
 	uint32 timeElapsed4() const { return _frameCounter - _gameCounters[4]; }
 	uint32 timeElapsed5() const { return _frameCounter - _gameCounters[5]; }
 	uint32 getTicks() { return _frameCounter; }
+	uint32 playTime() const { return _playTime; }
+	void setPlayTime(uint32 time) { _playTime = time; }
 
 	bool wait(uint numFrames, bool interruptable = true);
 
diff --git a/engines/xeen/files.cpp b/engines/xeen/files.cpp
index 375b9df..0ed6dbd 100644
--- a/engines/xeen/files.cpp
+++ b/engines/xeen/files.cpp
@@ -23,6 +23,7 @@
 #include "common/scummsys.h"
 #include "common/archive.h"
 #include "common/memstream.h"
+#include "common/substream.h"
 #include "common/textconsole.h"
 #include "xeen/xeen.h"
 #include "xeen/files.h"
@@ -393,9 +394,10 @@ void SaveArchive::load(Common::SeekableReadStream *stream) {
 	loadIndex(stream);
 
 	delete[] _data;
-	_data = new byte[stream->size()];
+	_dataSize = stream->size();
+	_data = new byte[_dataSize];
 	stream->seek(0);
-	stream->read(_data, stream->size());
+	stream->read(_data, _dataSize);
 
 	// Load in the character stats and active party
 	Common::SeekableReadStream *chr = createReadStreamForMember("maze.chr");
@@ -435,6 +437,11 @@ void SaveArchive::reset(CCArchive *src) {
 	load(&f);
 }
 
+void SaveArchive::save(Common::WriteStream &s) {
+	s.writeUint32LE(_dataSize);
+	s.write(_data, _dataSize);
+}
+
 /*------------------------------------------------------------------------*/
 
 OutFile::OutFile(const Common::String &filename) :
diff --git a/engines/xeen/files.h b/engines/xeen/files.h
index 34a9690..b5636b1 100644
--- a/engines/xeen/files.h
+++ b/engines/xeen/files.h
@@ -258,9 +258,8 @@ class SaveArchive : public BaseCCArchive {
 private:
 	Party *_party;
 	byte *_data;
+	uint32 _dataSize;
 	Common::HashMap<uint16, Common::MemoryWriteStreamDynamic *> _newData;
-
-	void load(Common::SeekableReadStream *stream);
 public:
 	SaveArchive(Party *party);
 	~SaveArchive();
@@ -270,8 +269,20 @@ public:
 	*/
 	void reset(CCArchive *src);
 
-	// Archive implementation
+	/**
+	 * Archive implementation
+	 */
 	virtual Common::SeekableReadStream *createReadStreamForMember(const Common::String &name) const;
+
+	/**
+	 * Loads a save archive from a stream
+	 */
+	void load(Common::SeekableReadStream *stream);
+
+	/**
+	 * Saves a save archive to a savegame
+	 */
+	void save(Common::WriteStream &s);
 };
 
 /**
diff --git a/engines/xeen/saves.cpp b/engines/xeen/saves.cpp
index 504bb18..0bc4129 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
diff --git a/engines/xeen/saves.h b/engines/xeen/saves.h
index 2711cc7..334ea3d 100644
--- a/engines/xeen/saves.h
+++ b/engines/xeen/saves.h
@@ -46,11 +46,6 @@ private:
 	Common::String _targetName;
 private:
 	/**
-	 * Synchronize savegame data
-	 */
-	void synchronize(Common::Serializer &s);
-
-	/**
 	 * Support method that generates a savegame name
 	 * @param slot		Slot number
 	 */





More information about the Scummvm-git-logs mailing list