aboutsummaryrefslogtreecommitdiff
path: root/engines/hopkins/saveload.cpp
diff options
context:
space:
mode:
authorPaul Gilbert2012-10-27 22:16:54 +1100
committerPaul Gilbert2012-10-27 22:16:54 +1100
commitec0a33b9493e88a759870c9c998b1e32660dcfbb (patch)
tree185de189c345f13acaccd5afae752474e0fe4ec0 /engines/hopkins/saveload.cpp
parent1651bb07d9d3dedb643eb2ac2cb4070980f33ba5 (diff)
downloadscummvm-rg350-ec0a33b9493e88a759870c9c998b1e32660dcfbb.tar.gz
scummvm-rg350-ec0a33b9493e88a759870c9c998b1e32660dcfbb.tar.bz2
scummvm-rg350-ec0a33b9493e88a759870c9c998b1e32660dcfbb.zip
HOPKINS: Beginnings of save/load implementation
Diffstat (limited to 'engines/hopkins/saveload.cpp')
-rw-r--r--engines/hopkins/saveload.cpp98
1 files changed, 97 insertions, 1 deletions
diff --git a/engines/hopkins/saveload.cpp b/engines/hopkins/saveload.cpp
index 364a02ae67..427e2d9fce 100644
--- a/engines/hopkins/saveload.cpp
+++ b/engines/hopkins/saveload.cpp
@@ -121,7 +121,7 @@ void SaveLoadManager::writeSavegameHeader(Common::OutSaveFile *out, hopkinsSaveg
// Create a thumbnail and save it
Graphics::Surface *thumb = new Graphics::Surface();
-// ::createThumbnail(thumb, _vm->_graphicsManager.VESA_SCREEN, SCREEN_WIDTH, SCREEN_HEIGHT, NULL);
+ createThumbnail(thumb);
Graphics::saveThumbnail(*out, *thumb);
thumb->free();
delete thumb;
@@ -137,4 +137,100 @@ void SaveLoadManager::writeSavegameHeader(Common::OutSaveFile *out, hopkinsSaveg
out->writeUint32LE(_vm->_eventsManager._gameCounter);
}
+Common::Error SaveLoadManager::save(int slot, const Common::String &saveName) {
+ // Try and create the save file
+ Common::OutSaveFile *saveFile = g_system->getSavefileManager()->openForSaving(
+ _vm->generateSaveName(slot));
+ if (!saveFile)
+ return Common::kCreatingFileFailed;
+
+ // Set up the serializer
+ Common::Serializer serializer(NULL, saveFile);
+
+ // Write out the savegame header
+ hopkinsSavegameHeader header;
+ header.saveName = saveName;
+ header.version = HOPKINS_SAVEGAME_VERSION;
+ writeSavegameHeader(saveFile, header);
+
+ // Write out the savegame data
+ syncSavegameData(serializer);
+
+ // Save file complete
+ saveFile->finalize();
+ delete saveFile;
+
+ return Common::kNoError;
+}
+
+Common::Error SaveLoadManager::restore(int slot) {
+ // Try and open the save file for reading
+ Common::InSaveFile *saveFile = g_system->getSavefileManager()->openForLoading(
+ _vm->generateSaveName(slot));
+ if (!saveFile)
+ return Common::kReadingFailed;
+
+ // Set up the serializer
+ Common::Serializer serializer(saveFile, NULL);
+
+ // Read in the savegame header
+ hopkinsSavegameHeader header;
+ readSavegameHeader(saveFile, header);
+ if (header.thumbnail)
+ header.thumbnail->free();
+ delete header.thumbnail;
+
+ // Read in the savegame data
+ syncSavegameData(serializer);
+
+ // Loading save file complete
+ delete saveFile;
+
+ return Common::kNoError;
+}
+
+bool SaveLoadManager::readSavegameHeader(int slot, hopkinsSavegameHeader &header) {
+ // Try and open the save file for reading
+ Common::InSaveFile *saveFile = g_system->getSavefileManager()->openForLoading(
+ g_vm->generateSaveName(slot));
+ if (!saveFile)
+ return false;
+
+ bool result = readSavegameHeader(saveFile, header);
+ delete saveFile;
+ return result;
+}
+
+#define REDUCE_AMOUNT 80
+
+void SaveLoadManager::createThumbnail(Graphics::Surface *s) {
+ int w = _vm->_graphicsManager.Reel_Reduc(SCREEN_WIDTH, REDUCE_AMOUNT);
+ int h = _vm->_graphicsManager.Reel_Reduc(SCREEN_HEIGHT - 40, REDUCE_AMOUNT);
+
+ s->create(w, h, Graphics::PixelFormat(2, 5, 6, 5, 0, 11, 5, 0, 0));
+
+ _vm->_graphicsManager.Reduc_Ecran(_vm->_graphicsManager.VESA_BUFFER, (byte *)s->pixels,
+ _vm->_eventsManager.start_x, 20, SCREEN_WIDTH, SCREEN_HEIGHT - 40, 80);
+ _vm->_graphicsManager.INIT_TABLE(45, 80, _vm->_graphicsManager.Palette);
+ _vm->_graphicsManager.Trans_bloc2((byte *)s->pixels, _vm->_graphicsManager.TABLE_COUL, 11136);
+}
+
+void SaveLoadManager::syncSavegameData(Common::Serializer &s) {
+ s.syncBytes(&_vm->_globals.SAUVEGARDE->data[0], 0x802);
+ syncSauvegarde1(s, _vm->_globals.SAUVEGARDE->field360);
+ syncSauvegarde1(s, _vm->_globals.SAUVEGARDE->field370);
+ syncSauvegarde1(s, _vm->_globals.SAUVEGARDE->field380);
+
+ for (int i = 0; i < 35; ++i)
+ s.syncAsSint16LE(_vm->_globals.SAUVEGARDE->inventory[i]);
+}
+
+void SaveLoadManager::syncSauvegarde1(Common::Serializer &s, Sauvegarde1 &item) {
+ s.syncAsSint16LE(item.field0);
+ s.syncAsSint16LE(item.field1);
+ s.syncAsSint16LE(item.field2);
+ s.syncAsSint16LE(item.field3);
+ s.syncAsSint16LE(item.field4);
+}
+
} // End of namespace Hopkins