Skip to content
Permalink
Browse files

ZVISION: Implement auto-saving

  • Loading branch information
bluegr committed Dec 26, 2014
1 parent eea1ee4 commit e5f0ee2271f4a43ff05b82380ab22eade9763702
@@ -308,6 +308,11 @@ SaveStateDescriptor ZVisionMetaEngine::querySaveMetaInfos(const char *target, in
if (successfulRead) {
SaveStateDescriptor desc(slot, header.saveName);

// Do not allow save slot 0 (used for auto-saving) to be deleted or
// overwritten.
desc.setDeletableFlag(slot != 0);
desc.setWriteProtectedFlag(slot == 0);

desc.setThumbnail(header.thumbnail);

if (header.version > 0) {
@@ -87,6 +87,8 @@ void SaveManager::saveGame(uint slot, const Common::String &saveName) {

file->finalize();
delete file;

_lastSaveTime = g_system->getMillis();
}

void SaveManager::saveGame(uint slot, const Common::String &saveName, Common::MemoryWriteStreamDynamic *stream) {
@@ -99,6 +101,8 @@ void SaveManager::saveGame(uint slot, const Common::String &saveName, Common::Me

file->finalize();
delete file;

_lastSaveTime = g_system->getMillis();
}

void SaveManager::saveGameBuffered(uint slot, const Common::String &saveName) {
@@ -109,15 +113,7 @@ void SaveManager::saveGameBuffered(uint slot, const Common::String &saveName) {
}

void SaveManager::autoSave() {
Common::OutSaveFile *file = g_system->getSavefileManager()->openForSaving(_engine->generateAutoSaveFileName());

writeSaveGameHeader(file, "auto");

_engine->getScriptManager()->serialize(file);

// Cleanup
file->finalize();
delete file;
saveGame(0, "Auto save");
}

void SaveManager::writeSaveGameHeader(Common::OutSaveFile *file, const Common::String &saveName) {
@@ -48,13 +48,18 @@ struct SaveGameHeader {

class SaveManager {
public:
SaveManager(ZVision *engine) : _engine(engine), _tempSave(NULL) {}
SaveManager(ZVision *engine) : _engine(engine), _tempSave(NULL), _lastSaveTime(0) {}
~SaveManager() {
flushSaveBuffer();
}

uint32 getLastSaveTime() const {
return _lastSaveTime;
}

private:
ZVision *_engine;
uint32 _lastSaveTime;
static const uint32 SAVEGAME_ID;

enum {
@@ -67,8 +72,7 @@ class SaveManager {
public:
/**
* Called every room change. Saves the state of the room just before
* we switched rooms. Uses ZVision::generateAutoSaveFileName() to
* create the save file name.
* the room changes.
*/
void autoSave();
/**
@@ -569,10 +569,6 @@ void ScriptManager::ChangeLocationReal() {
} else {
if (_currentLocation.world == 'g' && _currentLocation.room == 'j')
_engine->getSaveManager()->flushSaveBuffer();
else {
// Auto save
//_engine->getSaveManager()->autoSave();
}
}

setStateValue(StateKey_World, _nextLocation.world);
@@ -259,6 +259,10 @@ Common::Error ZVision::run() {
delay >>= 1;
}

if (canSaveGameStateCurrently() && shouldPerformAutoSave(_saveManager->getLastSaveTime())) {
_saveManager->autoSave();
}

_system->delayMillis(delay);
}

@@ -279,10 +283,6 @@ Common::String ZVision::generateSaveFileName(uint slot) {
return Common::String::format("%s.%03u", _targetName.c_str(), slot);
}

Common::String ZVision::generateAutoSaveFileName() {
return Common::String::format("%s.auto", _targetName.c_str());
}

void ZVision::setRenderDelay(uint delay) {
_frameRenderDelay = delay;
}
@@ -194,7 +194,6 @@ class ZVision : public Engine {
Video::VideoDecoder *loadAnimation(const Common::String &fileName);

Common::String generateSaveFileName(uint slot);
Common::String generateAutoSaveFileName();

void setRenderDelay(uint);
bool canRender();

0 comments on commit e5f0ee2

Please sign in to comment.
You can’t perform that action at this time.