[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