[Scummvm-cvs-logs] SF.net SVN: scummvm: [22446] residual/trunk
aquadran at users.sourceforge.net
aquadran at users.sourceforge.net
Sat May 13 08:24:37 CEST 2006
Revision: 22446
Author: aquadran
Date: 2006-05-13 08:07:35 -0700 (Sat, 13 May 2006)
ViewCVS: http://svn.sourceforge.net/scummvm/?rev=22446&view=rev
Log Message:
-----------
restored previous savegame code, but adopted lua access to save/restore
Modified Paths:
--------------
residual/trunk/engine.cpp
residual/trunk/engine.h
residual/trunk/lua.cpp
residual/trunk/savegame.cpp
residual/trunk/savegame.h
Modified: residual/trunk/engine.cpp
===================================================================
--- residual/trunk/engine.cpp 2006-05-13 13:57:47 UTC (rev 22445)
+++ residual/trunk/engine.cpp 2006-05-13 15:07:35 UTC (rev 22446)
@@ -456,12 +456,12 @@
}
}
-void Engine::savegameGzread(void *data, int size) {
- gzread(g_engine->_savegameFileHandle, data, size);
+void Engine::savegameRead(void *data, int size) {
+ g_engine->_savedState->read(data, size);
}
-void Engine::savegameGzwrite(void *data, int size) {
- gzwrite(g_engine->_savegameFileHandle, data, size);
+void Engine::savegameWrite(void *data, int size) {
+ g_engine->_savedState->write(data, size);
}
void Engine::savegameRestore() {
@@ -474,7 +474,6 @@
strcpy(filename, _savegameFileName);
}
_savedState = new SaveGame(filename, false);
- _savegameFileHandle = _savedState->fileHandle();
g_imuse->stopAllSounds();
g_imuse->resetState();
@@ -494,7 +493,9 @@
//Primitive_Restore(_savedState);
//Smush_Restore(_savedState);
g_imuse->restoreState(_savedState);
- lua_Restore(savegameGzread);
+ _savedState->beginSection('LUAS');
+ lua_Restore(savegameRead);
+ _savedState->endSection();
// unlock resources
delete _savedState;
@@ -515,7 +516,6 @@
strcpy(filename, _savegameFileName);
}
_savedState = new SaveGame(filename, true);
- _savegameFileHandle = _savedState->fileHandle();
g_imuse->pause(true);
g_smush->pause(true);
@@ -531,7 +531,9 @@
//Primitive_Save(_savedState);
//Smush_Save(_savedState);
g_imuse->saveState(_savedState);
- lua_Save(savegameGzwrite);
+ _savedState->beginSection('LUAS');
+ lua_Save(savegameWrite);
+ _savedState->endSection();
delete _savedState;
Modified: residual/trunk/engine.h
===================================================================
--- residual/trunk/engine.h 2006-05-13 13:57:47 UTC (rev 22445)
+++ residual/trunk/engine.h 2006-05-13 15:07:35 UTC (rev 22446)
@@ -156,13 +156,12 @@
void savegameSave();
void savegameRestore();
void savegameCallback();
- static void savegameGzread(void *data, int size);
- static void savegameGzwrite(void *data, int size);
-
+ static void savegameRead(void *data, int size);
+ static void savegameWrite(void *data, int size);
+
bool _savegameLoadRequest;
bool _savegameSaveRequest;
char *_savegameFileName;
- gzFile _savegameFileHandle;
SaveGame *_savedState;
Engine();
Modified: residual/trunk/lua.cpp
===================================================================
--- residual/trunk/lua.cpp 2006-05-13 13:57:47 UTC (rev 22445)
+++ residual/trunk/lua.cpp 2006-05-13 15:07:35 UTC (rev 22446)
@@ -2816,7 +2816,7 @@
g_engine->updateDisplayScene();
screenshot = g_driver->getScreenshot(width, height);
g_engine->setMode(mode);
- savedState->writeTag('SIMG');
+ savedState->beginSection('SIMG');
if (screenshot) {
int size = screenshot->width() * screenshot->height() * sizeof(uint16);
screenshot->setNumber(0);
@@ -2826,6 +2826,7 @@
} else {
error("Unable to store screenshot!");
}
+ savedState->endSection();
printf("StoreSaveGameImage() finished.\n");
}
@@ -2843,7 +2844,7 @@
DEBUG_FUNCTION();
filename = luaL_check_string(1);
SaveGame *savedState = new SaveGame(filename, false);
- dataSize = savedState->checkTag('SIMG');
+ dataSize = savedState->beginSection('SIMG');
data = (char *)malloc(dataSize);
savedState->read(data, dataSize);
screenshot = new Bitmap(data, width, height, "screenshot");
@@ -2854,6 +2855,7 @@
lua_pushnil();
error("Could not restore screenshot from file!");
}
+ savedState->endSection();
printf("GetSaveGameImage() finished.\n");
}
@@ -2870,7 +2872,7 @@
savedState = g_engine->savedState();
if (savedState == NULL)
error("Cannot obtain saved game!");
- savedState->writeTag('SUBS');
+ savedState->beginSection('SUBS');
count = 0;
for (;;) {
lua_pushobject(table);
@@ -2884,6 +2886,7 @@
savedState->write(&len, sizeof(int));
savedState->write(str, len);
}
+ savedState->endSection();
printf("SubmitSaveGameData() finished.\n");
StoreSaveGameImage(savedState);
}
@@ -2897,7 +2900,7 @@
DEBUG_FUNCTION();
filename = luaL_check_string(1);
SaveGame *savedState = new SaveGame(filename, false);
- dataSize = savedState->checkTag('SUBS');
+ dataSize = savedState->beginSection('SUBS');
result = lua_createtable();
@@ -2920,6 +2923,7 @@
}
lua_pushobject(result);
+ savedState->endSection();
delete savedState;
printf("GetSaveGameData() finished.\n");
}
Modified: residual/trunk/savegame.cpp
===================================================================
--- residual/trunk/savegame.cpp 2006-05-13 13:57:47 UTC (rev 22445)
+++ residual/trunk/savegame.cpp 2006-05-13 15:07:35 UTC (rev 22446)
@@ -29,7 +29,7 @@
// Constructor. Should create/open a saved game
SaveGame::SaveGame(char *filename, bool saving) :
- _saving(saving) {
+ _saving(saving), _currentSection(0) {
if (_saving) {
uint32 tag = SAVEGAME_HEADERTAG;
uint32 version = SAVEGAME_VERSION;
@@ -63,31 +63,58 @@
gzclose(_fileHandle);
}
-int SaveGame::read(void *data, int size) {
- if (_saving)
- error("SaveGame::readBlock called when storing a savegame!");
- return gzread(_fileHandle, data, size);
+uint32 SaveGame::beginSection(uint32 sectionTag) {
+ if (_currentSection != 0)
+ error("Tried to begin a new save game section with ending old section!");
+ _currentSection = sectionTag;
+ _sectionSize = 0;
+ _sectionBuffer = (char *) malloc(_sectionSize);
+ if (!_saving) {
+ uint32 tag = 0;
+
+ while (tag != sectionTag) {
+ free(_sectionBuffer);
+ gzread(_fileHandle, &tag, sizeof(uint32));
+ if (tag == SAVEGAME_FOOTERTAG)
+ error("Unable to find requested section of savegame!");
+ gzread(_fileHandle, &_sectionSize, sizeof(uint32));
+ _sectionBuffer = (char *)malloc(_sectionSize);
+ gzread(_fileHandle, _sectionBuffer, _sectionSize);
+ }
+ }
+ _sectionPtr = 0;
+ return _sectionSize;
}
-int SaveGame::checkTag(uint32 tag) {
- uint32 readTag;
- int res = read(&readTag, 4);
- assert(res == 4);
- if (readTag != tag) {
- error("SaveGame::readAndCheck: Wrong tag. Expected: %d", tag);
+void SaveGame::endSection() {
+ if (_currentSection == 0)
+ error("Tried to end a save game section without starting a section!");
+ if(_saving) {
+ gzwrite(_fileHandle, &_currentSection, sizeof(uint32));
+ gzwrite(_fileHandle, &_sectionSize, sizeof(uint32));
+ gzwrite(_fileHandle, _sectionBuffer, _sectionSize);
}
+ free(_sectionBuffer);
+ _currentSection = 0;
+}
- return res;
+void SaveGame::read(void *data, int size) {
+ if (_saving)
+ error("SaveGame::readBlock called when storing a savegame!");
+ if (_currentSection == 0)
+ error("Tried to read a block without starting a section!");
+ memcpy(data, &_sectionBuffer[_sectionPtr], size);
+ _sectionPtr += size;
}
-int SaveGame::write(void *data, int size) {
+void SaveGame::write(void *data, int size) {
if (!_saving)
error("SaveGame::writeBlock called when restoring a savegame!");
- return gzwrite(_fileHandle, data, size);
+ if (_currentSection == 0)
+ error("Tried to write a block without starting a section!");
+ _sectionBuffer = (char *)realloc(_sectionBuffer, _sectionSize + size);
+ if (_sectionBuffer == NULL)
+ error("Failed to allocate space for buffer!");
+ memcpy(&_sectionBuffer[_sectionSize], data, size);
+ _sectionSize += size;
}
-
-int SaveGame::writeTag(uint32 tag) {
- int res = write(&tag, 4);
- assert(res == 4);
- return res;
-}
Modified: residual/trunk/savegame.h
===================================================================
--- residual/trunk/savegame.h 2006-05-13 13:57:47 UTC (rev 22445)
+++ residual/trunk/savegame.h 2006-05-13 15:07:35 UTC (rev 22446)
@@ -32,16 +32,24 @@
SaveGame(char *filename, bool saving);
~SaveGame();
- int read(void *data, int size);
- int checkTag(uint32 tag);
- int write(void *data, int size);
- int writeTag(uint32 tag);
- gzFile fileHandle() { return _fileHandle; }
+// int read(void *data, int size);
+// int checkTag(uint32 tag);
+// int write(void *data, int size);
+// int writeTag(uint32 tag);
+// gzFile fileHandle() { return _fileHandle; }
+ uint32 beginSection(uint32 sectionTag);
+ void endSection();
+ void read(void *data, int size);
+ void write(void *data, int size);
+
protected:
bool _saving;
gzFile _fileHandle;
-
+ uint32 _currentSection;
+ uint32 _sectionSize;
+ uint32 _sectionPtr;
+ char *_sectionBuffer;
};
#endif
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list