GRIM: New static functions to create a SaveGame object that deal with failures.
This commit is contained in:
parent
ba723db930
commit
9b11f73bc0
6 changed files with 52 additions and 32 deletions
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
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;
|
||||
}
|
||||
_outSaveFile->writeUint32BE(SAVEGAME_HEADERTAG);
|
||||
_outSaveFile->writeUint32BE(SAVEGAME_VERSION);
|
||||
|
||||
_version = SAVEGAME_VERSION;
|
||||
} else {
|
||||
uint32 tag;
|
||||
SaveGame *save = new SaveGame();
|
||||
|
||||
_inSaveFile = g_system->getSavefileManager()->openForLoading(filename);
|
||||
if (!_inSaveFile) {
|
||||
warning("SaveGame::SaveGame() Error opening savegame file");
|
||||
return;
|
||||
}
|
||||
tag = _inSaveFile->readUint32BE();
|
||||
save->_saving = false;
|
||||
save->_inSaveFile = inSaveFile;
|
||||
|
||||
uint32 tag = inSaveFile->readUint32BE();
|
||||
assert(tag == SAVEGAME_HEADERTAG);
|
||||
_version = _inSaveFile->readUint32BE();
|
||||
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() {
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue