Skip to content

Commit

Permalink
ZVISION: Clean up save logic, and fix a thumbnail-related FIXME
Browse files Browse the repository at this point in the history
This fixes the save game thumbnails when using the original save/load
screens
  • Loading branch information
bluegr committed Jan 8, 2015
1 parent 345b33d commit 79b92fe
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 42 deletions.
2 changes: 1 addition & 1 deletion engines/zvision/detection.cpp
Expand Up @@ -261,7 +261,7 @@ Common::Error ZVision::ZVision::loadGameState(int slot) {
}

Common::Error ZVision::ZVision::saveGameState(int slot, const Common::String &desc) {
_saveManager->saveGame(slot, desc);
_saveManager->saveGame(slot, desc, false);
return Common::kNoError;
}

Expand Down
59 changes: 26 additions & 33 deletions engines/zvision/file/save_manager.cpp
Expand Up @@ -69,54 +69,42 @@ bool SaveManager::scummVMSaveLoadDialog(bool isSave) {
return false;

if (isSave) {
saveGame(slot, desc);
saveGame(slot, desc, false);
return true;
} else {
Common::ErrorCode result = loadGame(slot).getCode();
return (result == Common::kNoError);
}
}

void SaveManager::saveGame(uint slot, const Common::String &saveName) {
Common::SaveFileManager *saveFileManager = g_system->getSavefileManager();
Common::OutSaveFile *file = saveFileManager->openForSaving(_engine->generateSaveFileName(slot));

writeSaveGameHeader(file, saveName);
void SaveManager::saveGame(uint slot, const Common::String &saveName, bool useSaveBuffer) {
if (!_tempSave && useSaveBuffer)
return;

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

file->finalize();
delete file;

_lastSaveTime = g_system->getMillis();
}

void SaveManager::saveGame(uint slot, const Common::String &saveName, Common::MemoryWriteStreamDynamic *stream) {
Common::SaveFileManager *saveFileManager = g_system->getSavefileManager();
Common::OutSaveFile *file = saveFileManager->openForSaving(_engine->generateSaveFileName(slot));

writeSaveGameHeader(file, saveName);
writeSaveGameHeader(file, saveName, useSaveBuffer);

file->write(stream->getData(), stream->size());
if (useSaveBuffer)
file->write(_tempSave->getData(), _tempSave->size());
else
_engine->getScriptManager()->serialize(file);

file->finalize();
delete file;

_lastSaveTime = g_system->getMillis();
}

void SaveManager::saveGameBuffered(uint slot, const Common::String &saveName) {
if (_tempSave) {
saveGame(slot, saveName, _tempSave);
if (useSaveBuffer)
flushSaveBuffer();
}

_lastSaveTime = g_system->getMillis();
}

void SaveManager::autoSave() {
saveGame(0, "Auto save");
saveGame(0, "Auto save", false);
}

void SaveManager::writeSaveGameHeader(Common::OutSaveFile *file, const Common::String &saveName) {
void SaveManager::writeSaveGameHeader(Common::OutSaveFile *file, const Common::String &saveName, bool useSaveBuffer) {
file->writeUint32BE(SAVEGAME_ID);

// Write version
Expand All @@ -126,8 +114,11 @@ void SaveManager::writeSaveGameHeader(Common::OutSaveFile *file, const Common::S
file->writeString(saveName);
file->writeByte(0);

// Create a thumbnail and save it
Graphics::saveThumbnail(*file);
// Save the game thumbnail
if (useSaveBuffer)
file->write(_tempThumbnail->getData(), _tempThumbnail->size());
else
Graphics::saveThumbnail(*file);

// Write out the save date/time
TimeDate td;
Expand Down Expand Up @@ -245,18 +236,20 @@ Common::SeekableReadStream *SaveManager::getSlotFile(uint slot) {
}

void SaveManager::prepareSaveBuffer() {
if (_tempSave)
delete _tempSave;
delete _tempThumbnail;
_tempThumbnail = new Common::MemoryWriteStreamDynamic;
Graphics::saveThumbnail(*_tempThumbnail);

delete _tempSave;
_tempSave = new Common::MemoryWriteStreamDynamic;

_engine->getScriptManager()->serialize(_tempSave);
}

void SaveManager::flushSaveBuffer() {
if (_tempSave)
delete _tempSave;
delete _tempThumbnail;
_tempThumbnail = NULL;

delete _tempSave;
_tempSave = NULL;
}

Expand Down
9 changes: 4 additions & 5 deletions engines/zvision/file/save_manager.h
Expand Up @@ -48,7 +48,7 @@ struct SaveGameHeader {

class SaveManager {
public:
SaveManager(ZVision *engine) : _engine(engine), _tempSave(NULL), _lastSaveTime(0) {}
SaveManager(ZVision *engine) : _engine(engine), _tempSave(NULL), _tempThumbnail(NULL), _lastSaveTime(0) {}
~SaveManager() {
flushSaveBuffer();
}
Expand All @@ -67,6 +67,7 @@ class SaveManager {
SAVE_VERSION = 1
};

Common::MemoryWriteStreamDynamic *_tempThumbnail;
Common::MemoryWriteStreamDynamic *_tempSave;

public:
Expand All @@ -83,9 +84,7 @@ class SaveManager {
* @param slot The save slot this save pertains to. Must be [1, 20]
* @param saveName The internal name for this save. This is NOT the name of the actual save file.
*/
void saveGame(uint slot, const Common::String &saveName);
void saveGame(uint slot, const Common::String &saveName, Common::MemoryWriteStreamDynamic *stream);
void saveGameBuffered(uint slot, const Common::String &saveName);
void saveGame(uint slot, const Common::String &saveName, bool useSaveBuffer);
/**
* Loads the state data from the save file that slot references. Uses
* ZVision::generateSaveFileName(slot) to get the save file name.
Expand All @@ -101,7 +100,7 @@ class SaveManager {
void flushSaveBuffer();
bool scummVMSaveLoadDialog(bool isSave);
private:
void writeSaveGameHeader(Common::OutSaveFile *file, const Common::String &saveName);
void writeSaveGameHeader(Common::OutSaveFile *file, const Common::String &saveName, bool useSaveBuffer);
};

} // End of namespace ZVision
Expand Down
4 changes: 1 addition & 3 deletions engines/zvision/scripting/controls/save_control.cpp
Expand Up @@ -102,9 +102,7 @@ bool SaveControl::process(uint32 deltaTimeInMillis) {
toSave = false;

if (toSave) {
// FIXME: At this point, the screen shows the save control, so the save game thumbnails will always
// show the save control
_engine->getSaveManager()->saveGameBuffered(iter->saveId, inp->getText());
_engine->getSaveManager()->saveGame(iter->saveId, inp->getText(), true);
_engine->getRenderManager()->delayedMessage(_engine->getStringManager()->getTextLine(StringManager::ZVISION_STR_SAVED), 2000);
_engine->getScriptManager()->changeLocation(_engine->getScriptManager()->getLastMenuLocation());
}
Expand Down

0 comments on commit 79b92fe

Please sign in to comment.