[Scummvm-git-logs] scummvm master -> f249786fc734426c44f2350fa2c6a0c0bc423da6
a-yyg
76591232+a-yyg at users.noreply.github.com
Thu Jul 15 19:26:21 UTC 2021
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
f249786fc7 SAGA2: Add limited Extended Savegame support
Commit: f249786fc734426c44f2350fa2c6a0c0bc423da6
https://github.com/scummvm/scummvm/commit/f249786fc734426c44f2350fa2c6a0c0bc423da6
Author: a/ (yuri.kgpps at gmail.com)
Date: 2021-07-16T04:25:06+09:00
Commit Message:
SAGA2: Add limited Extended Savegame support
Changed paths:
engines/saga2/metaengine.cpp
engines/saga2/saga2.cpp
engines/saga2/saga2.h
engines/saga2/saveload.cpp
engines/saga2/saveload.h
engines/saga2/uidialog.cpp
diff --git a/engines/saga2/metaengine.cpp b/engines/saga2/metaengine.cpp
index 22ecbc6cc7..e033b10898 100644
--- a/engines/saga2/metaengine.cpp
+++ b/engines/saga2/metaengine.cpp
@@ -30,13 +30,37 @@ public:
}
Common::Error createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const override;
+ bool hasFeature(MetaEngineFeature f) const override;
+ Common::String getSavegameFile(int saveGameIdx, const char *target) const override;
};
+bool Saga2MetaEngine::hasFeature(MetaEngineFeature f) const {
+ return
+ (f == kSupportsListSaves) ||
+ (f == kSupportsLoadingDuringStartup) ||
+ (f == kSupportsDeleteSave) ||
+ (f == kSavesSupportMetaInfo) ||
+ (f == kSavesSupportThumbnail) ||
+ (f == kSavesSupportCreationDate) ||
+ (f == kSavesSupportPlayTime) ||
+ (f == kSavesUseExtendedFormat);
+}
+
Common::Error Saga2MetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const {
*engine = new Saga2::Saga2Engine(syst);
return Common::kNoError;
}
+Common::String Saga2MetaEngine::getSavegameFile(int saveGameIdx, const char *target) const {
+ if (saveGameIdx == kSavegameFilePattern) {
+ // Pattern requested
+ return Common::String::format("###.SAV");
+ } else {
+ // Specific filename requested
+ return Common::String::format("%3.3d.SAV", saveGameIdx);
+ }
+}
+
#if PLUGIN_ENABLED_DYNAMIC(SAGA2)
REGISTER_PLUGIN_DYNAMIC(SAGA2, PLUGIN_TYPE_ENGINE, Saga2MetaEngine);
#else
diff --git a/engines/saga2/saga2.cpp b/engines/saga2/saga2.cpp
index 25749b5cf8..3bbacde2cf 100644
--- a/engines/saga2/saga2.cpp
+++ b/engines/saga2/saga2.cpp
@@ -129,6 +129,32 @@ Common::Error Saga2Engine::saveGameStream(Common::WriteStream *stream, bool isAu
return Common::kNoError;
}
+Common::Error Saga2Engine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
+ pauseTimer();
+
+ Common::OutSaveFile *out = getSaveFileManager()->openForSaving(getSaveFileName(slot), false);
+ if (!out)
+ return Common::kCreatingFileFailed;
+
+ saveGame(out, desc);
+
+ getMetaEngine()->appendExtendedSave(out, g_vm->getTotalPlayTime() / 1000, desc, false);
+
+ out->finalize();
+
+ delete out;
+
+ resumeTimer();
+
+ return Common::kNoError;
+}
+
+Common::Error Saga2Engine::loadGameState(int slot) {
+ loadSavedGameState(slot);
+
+ return Common::kNoError;
+}
+
void Saga2Engine::syncGameStream(Common::Serializer &s) {
// Use methods of Serializer to save/load fields
int dummy = 0;
diff --git a/engines/saga2/saga2.h b/engines/saga2/saga2.h
index cf521e6a5a..cc42b8ee7e 100644
--- a/engines/saga2/saga2.h
+++ b/engines/saga2/saga2.h
@@ -89,6 +89,8 @@ public:
bool canSaveGameStateCurrently() override { return true; }
Common::Error loadGameStream(Common::SeekableReadStream *stream) override;
Common::Error saveGameStream(Common::WriteStream *stream, bool isAutosave = false) override;
+ Common::Error saveGameState(int slot, const Common::String &desc, bool isAutosave) override;
+ Common::Error loadGameState(int slot) override;
void syncGameStream(Common::Serializer &s);
void loadExeResources();
diff --git a/engines/saga2/saveload.cpp b/engines/saga2/saveload.cpp
index 9f6c33e00a..ad1872a417 100644
--- a/engines/saga2/saveload.cpp
+++ b/engines/saga2/saveload.cpp
@@ -150,15 +150,9 @@ void initGameState(void) {
//----------------------------------------------------------------------
// Save the current game state
-Common::Error saveGameState(int16 saveNo, char *saveName) {
- pauseTimer();
-
+void saveGame(Common::OutSaveFile *out, Common::String saveName) {
debugC(1, kDebugSaveload, "Saving game");
- Common::OutSaveFile *out = g_vm->getSaveFileManager()->openForSaving(getSaveFileName(saveNo), false);
- if (!out)
- return Common::kCreatingFileFailed;
-
SaveFileHeader header;
header.gameID = gameID;
header.saveName = saveName;
@@ -195,14 +189,6 @@ Common::Error saveGameState(int16 saveNo, char *saveName) {
saveUIState(out);
savePaletteState(out);
saveContainerNodes(out);
-
- out->finalize();
-
- delete out;
-
- resumeTimer();
-
- return Common::kNoError;
}
bool firstChunk(Common::InSaveFile *in, ChunkID &chunk, int32 &size) {
@@ -477,11 +463,11 @@ void loadSavedGameState(int16 saveNo) {
break;
}
+ if (loadFlags & loadContainerNodesFlag)
+ break;
notEOF = nextChunk(in, id, chunkSize);
}
- delete in;
-
if (!(loadFlags & loadGlobalsFlag))
error("Globals not loaded");
@@ -521,6 +507,12 @@ void loadSavedGameState(int16 saveNo) {
if (!(loadFlags & loadActiveRegionsFlag))
error("Active Regions not loaded");
+ ExtendedSavegameHeader header;
+ if (MetaEngine::readSavegameHeader(in, &header)) {
+ g_vm->setTotalPlayTime(header.playtime * 1000);
+ }
+
+ delete in;
resumeTimer();
}
diff --git a/engines/saga2/saveload.h b/engines/saga2/saveload.h
index bbedf045e5..ea6bec28e5 100644
--- a/engines/saga2/saveload.h
+++ b/engines/saga2/saveload.h
@@ -61,7 +61,7 @@ struct SaveFileHeader {
void initGameState(void);
// Save the current game state
-Common::Error saveGameState(int16 saveNo, char *saveName);
+void saveGame(Common::OutSaveFile *out, Common::String saveName);
// Load a previously saved game state
void loadSavedGameState(int16 saveNo);
diff --git a/engines/saga2/uidialog.cpp b/engines/saga2/uidialog.cpp
index ef21ef7365..9365909ec0 100644
--- a/engines/saga2/uidialog.cpp
+++ b/engines/saga2/uidialog.cpp
@@ -976,7 +976,7 @@ int16 OptionsDialog(bool disableSaveResume) {
} else {
if (deferredSaveFlag) {
#ifdef IMMEDIATE_SAVE
- saveGameState(deferredLoadID, deferredSaveName);
+ g_vm->saveGameState(deferredLoadID, deferredSaveName, false);
#endif
}
mainWindow->invalidate(&optionsWindowRect);
@@ -1653,7 +1653,7 @@ APPFUNC(cmdFileSave) {
#ifndef IMMEDIATE_SAVE
// save game
- saveGameState(saveIndex, textBox->getLine(saveIndex));
+ g_vm->saveGameState(saveIndex, textBox->getLine(saveIndex), false);
#else
deferredLoadID = saveIndex;
deferredSaveFlag = true;
More information about the Scummvm-git-logs
mailing list