diff --git a/engines/grim/detection.cpp b/engines/grim/detection.cpp index 05d3305e330..b23abf7fc7b 100644 --- a/engines/grim/detection.cpp +++ b/engines/grim/detection.cpp @@ -442,7 +442,7 @@ SaveStateList GrimMetaEngine::listSaves(const char *target) const { int slotNum = atoi(file->c_str() + 4); if (slotNum >= 0 && slotNum <= 99) { - SaveGame *savedState = new SaveGame((*file).c_str(), false); + SaveGame *savedState = SaveGame::openForLoading((*file).c_str()); if (savedState) { if (savedState->saveVersion() != SaveGame::SAVEGAME_VERSION) { delete savedState; diff --git a/engines/grim/grim.cpp b/engines/grim/grim.cpp index 947bc7d0445..96fa022e15b 100644 --- a/engines/grim/grim.cpp +++ b/engines/grim/grim.cpp @@ -1137,7 +1137,7 @@ void GrimEngine::savegameRestore() { } else { filename = _savegameFileName; } - _savedState = new SaveGame(filename, false); + _savedState = SaveGame::openForLoading(filename); if (!_savedState || _savedState->saveVersion() != SaveGame::SAVEGAME_VERSION) return; g_imuse->stopAllSounds(); @@ -1314,7 +1314,7 @@ void GrimEngine::savegameSave() { } else { strcpy(filename, _savegameFileName.c_str()); } - _savedState = new SaveGame(filename, true); + _savedState = SaveGame::openForSaving(filename); if (!_savedState) return; diff --git a/engines/grim/lua_v1.cpp b/engines/grim/lua_v1.cpp index 7ccd400a42c..b63bde72c51 100644 --- a/engines/grim/lua_v1.cpp +++ b/engines/grim/lua_v1.cpp @@ -962,7 +962,7 @@ void L1_GetSaveGameImage() { return; } const char *filename = lua_getstring(param); - SaveGame *savedState = new SaveGame(filename, false); + SaveGame *savedState = SaveGame::openForLoading(filename); if (!savedState || savedState->saveVersion() != SaveGame::SAVEGAME_VERSION) { lua_pushnil(); return; @@ -1016,7 +1016,7 @@ void L1_GetSaveGameData() { if (!lua_isstring(param)) return; const char *filename = lua_getstring(param); - SaveGame *savedState = new SaveGame(filename, false); + SaveGame *savedState = SaveGame::openForLoading(filename); lua_Object result = lua_createtable(); if (!savedState || savedState->saveVersion() != SaveGame::SAVEGAME_VERSION) { diff --git a/engines/grim/lua_v1_sound.cpp b/engines/grim/lua_v1_sound.cpp index 5c521e6174d..e360accde57 100644 --- a/engines/grim/lua_v1_sound.cpp +++ b/engines/grim/lua_v1_sound.cpp @@ -229,7 +229,7 @@ void L1_ImSetSequence() { } void L1_SaveIMuse() { - SaveGame *savedIMuse = new SaveGame("grim.tmp", true); + SaveGame *savedIMuse = SaveGame::openForSaving("grim.tmp"); if (!savedIMuse) return; g_imuse->saveState(savedIMuse); @@ -237,7 +237,7 @@ void L1_SaveIMuse() { } void L1_RestoreIMuse() { - SaveGame *savedIMuse = new SaveGame("grim.tmp", false); + SaveGame *savedIMuse = SaveGame::openForLoading("grim.tmp"); if (!savedIMuse) return; g_imuse->stopAllSounds(); diff --git a/engines/grim/savegame.cpp b/engines/grim/savegame.cpp index 35b4ddc5d40..380b1b5fd8b 100644 --- a/engines/grim/savegame.cpp +++ b/engines/grim/savegame.cpp @@ -35,31 +35,48 @@ namespace Grim { int SaveGame::SAVEGAME_VERSION = 18; -// Constructor. Should create/open a saved game -SaveGame::SaveGame(const Common::String &filename, bool saving) : - _saving(saving), _currentSection(0), _sectionBuffer(0) { - if (_saving) { - _outSaveFile = g_system->getSavefileManager()->openForSaving(filename); - if (!_outSaveFile) { - warning("SaveGame::SaveGame() Error creating savegame file"); - return; - } - _outSaveFile->writeUint32BE(SAVEGAME_HEADERTAG); - _outSaveFile->writeUint32BE(SAVEGAME_VERSION); - - _version = SAVEGAME_VERSION; - } else { - uint32 tag; - - _inSaveFile = g_system->getSavefileManager()->openForLoading(filename); - if (!_inSaveFile) { - warning("SaveGame::SaveGame() Error opening savegame file"); - return; - } - tag = _inSaveFile->readUint32BE(); - assert(tag == SAVEGAME_HEADERTAG); - _version = _inSaveFile->readUint32BE(); +SaveGame *SaveGame::openForLoading(const Common::String &filename) { + Common::InSaveFile *inSaveFile = g_system->getSavefileManager()->openForLoading(filename); + if (!inSaveFile) { + warning("SaveGame::openForLoading() Error opening savegame file"); + return NULL; } + + SaveGame *save = new SaveGame(); + + save->_saving = false; + save->_inSaveFile = inSaveFile; + + uint32 tag = inSaveFile->readUint32BE(); + assert(tag == SAVEGAME_HEADERTAG); + save->_version = inSaveFile->readUint32BE(); + + return save; +} + +SaveGame *SaveGame::openForSaving(const Common::String &filename) { + Common::OutSaveFile *outSaveFile = g_system->getSavefileManager()->openForSaving(filename); + if (!outSaveFile) { + warning("SaveGame::openForSaving() Error creating savegame file"); + return NULL; + } + + SaveGame *save = new SaveGame(); + + save->_saving = true; + save->_outSaveFile = outSaveFile; + + outSaveFile->writeUint32BE(SAVEGAME_HEADERTAG); + outSaveFile->writeUint32BE(SAVEGAME_VERSION); + + save->_version = SAVEGAME_VERSION; + + return save; +} + +SaveGame::SaveGame() : + _currentSection(0), _sectionBuffer(0) { + } SaveGame::~SaveGame() { diff --git a/engines/grim/savegame.h b/engines/grim/savegame.h index a39c33ce0f2..56d52e1d805 100644 --- a/engines/grim/savegame.h +++ b/engines/grim/savegame.h @@ -35,7 +35,8 @@ class Color; class SaveGame { public: - SaveGame(const Common::String &filename, bool saving); + static SaveGame *openForLoading(const Common::String &filename); + static SaveGame *openForSaving(const Common::String &filename); ~SaveGame(); static int SAVEGAME_VERSION; @@ -69,6 +70,8 @@ public: void checkAlloc(int size); protected: + SaveGame(); + int _version; bool _saving; Common::InSaveFile *_inSaveFile;