[Scummvm-git-logs] scummvm master -> 11fc04bab0670dd6f42903d6a41b71186252bf0f

sev- noreply at scummvm.org
Tue Nov 4 09:15:15 UTC 2025


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .

Summary:
11fc04bab0 NGI: Switch fully to ExtendedSaves API


Commit: 11fc04bab0670dd6f42903d6a41b71186252bf0f
    https://github.com/scummvm/scummvm/commit/11fc04bab0670dd6f42903d6a41b71186252bf0f
Author: iceonGit (105015468+iceonGit at users.noreply.github.com)
Date: 2025-11-04T10:15:11+01:00

Commit Message:
NGI: Switch fully to ExtendedSaves API

Changed paths:
    engines/ngi/gameloader.cpp
    engines/ngi/gameloader.h
    engines/ngi/metaengine.cpp
    engines/ngi/modal.cpp
    engines/ngi/ngi.cpp
    engines/ngi/stateloader.cpp
    engines/ngi/statesaver.cpp


diff --git a/engines/ngi/gameloader.cpp b/engines/ngi/gameloader.cpp
index 7e7d52cf14f..4ddb446d32f 100644
--- a/engines/ngi/gameloader.cpp
+++ b/engines/ngi/gameloader.cpp
@@ -645,12 +645,6 @@ bool PreloadItems::load(MfcArchive &file) {
 	return true;
 }
 
-const char *getSavegameFile(int saveGameIdx) {
-	static char buffer[20];
-	Common::sprintf_s(buffer, "fullpipe.s%02d", saveGameIdx);
-	return buffer;
-}
-
 void GameLoader::restoreDefPicAniInfos() {
 	for (uint i = 0; i < _sc2array.size(); i++) {
 		_sc2array[i]._picAniInfos.clear();
diff --git a/engines/ngi/gameloader.h b/engines/ngi/gameloader.h
index 9981f348785..07146d68041 100644
--- a/engines/ngi/gameloader.h
+++ b/engines/ngi/gameloader.h
@@ -75,16 +75,6 @@ class PreloadItems : public Common::Array<PreloadItem>, public CObject {
 	bool load(MfcArchive &file) override;
 };
 
-struct FullpipeSavegameHeader {
-	char id[6];
-	uint8 version;
-	Common::String saveName;
-	Common::String description;
-	uint32 date;
-	uint16 time;
-	uint32 playtime;
-	Graphics::Surface *thumbnail;
-};
 
 struct SaveHeader {
 	int32 version;
@@ -140,9 +130,6 @@ class GameLoader : public CObject {
 	int _preloadEntranceId;
 };
 
-const char *getSavegameFile(int saveGameIdx);
-WARN_UNUSED_RESULT bool readSavegameHeader(Common::InSaveFile *in, FullpipeSavegameHeader &header, bool skipThumbnail = true);
-void parseSavegameHeader(NGI::FullpipeSavegameHeader &header, SaveStateDescriptor &desc);
 
 Inventory2 *getGameLoaderInventory();
 InteractionController *getGameLoaderInteractionController();
diff --git a/engines/ngi/metaengine.cpp b/engines/ngi/metaengine.cpp
index 1ddce7d8f67..2b0a57ef97e 100644
--- a/engines/ngi/metaengine.cpp
+++ b/engines/ngi/metaengine.cpp
@@ -22,6 +22,7 @@
 #include "base/plugins.h"
 
 #include "engines/advancedDetector.h"
+#include "engines/metaengine.h"
 #include "common/file.h"
 
 #include "graphics/surface.h"
@@ -73,6 +74,18 @@ public:
 	Common::Error createInstance(OSystem *syst, Engine **engine, const NGI::NGIGameDescription *desc) const override;
 
 	Common::KeymapArray initKeymaps(const char *target) const override;
+
+    Common::String getSavegameFile(int saveGameIdx, const char *target) const override {
+	    if (saveGameIdx == kSavegameFilePattern) {
+	    	// Pattern requested
+	    	const char *pattern = "%s.s##";
+	    	return Common::String::format(pattern, "fullpipe");
+	    } else {
+	    	// Specific filename requested
+	    	const char *pattern = "%s.s%02d";
+	    	return Common::String::format(pattern, "fullpipe", saveGameIdx);
+	    }
+	}
 };
 
 bool NGIMetaEngine::hasFeature(MetaEngineFeature f) const {
diff --git a/engines/ngi/modal.cpp b/engines/ngi/modal.cpp
index ed66ac62460..f6b32a6896a 100644
--- a/engines/ngi/modal.cpp
+++ b/engines/ngi/modal.cpp
@@ -19,6 +19,7 @@
  *
  */
 
+#include "engines/metaengine.h"
 #include "ngi/ngi.h"
 
 #include "ngi/constants.h"
@@ -2170,7 +2171,7 @@ void ModalSaveGame::setup(Scene *sc, int mode) {
 	for (int i = 0; i < 7; i++) {
 		FileInfo &fileinfo = _files[i];
 
-		Common::strlcpy(fileinfo.filename, getSavegameFile(i), sizeof(fileinfo.filename));
+		Common::strlcpy(fileinfo.filename, g_nmi->getMetaEngine()->getSavegameFile(i,fileinfo.filename).c_str(), sizeof(fileinfo.filename));
 
 		if (!getFileInfo(i, &fileinfo)) {
 			fileinfo.empty = true;
@@ -2200,20 +2201,20 @@ char *ModalSaveGame::getSaveName() {
 
 bool ModalSaveGame::getFileInfo(int slot, FileInfo *fileinfo) {
 	Common::ScopedPtr<Common::InSaveFile> f(g_system->getSavefileManager()->openForLoading(
-		NGI::getSavegameFile(slot)));
+		g_nmi->getMetaEngine()->getSavegameFile(slot,fileinfo->filename)));
 
 	if (!f)
 		return false;
 
-	NGI::FullpipeSavegameHeader header;
-	if (!NGI::readSavegameHeader(f.get(), header))
+	ExtendedSavegameHeader header;
+	if (!MetaEngine::readSavegameHeader(f.get(), &header))
 		return false;
 
 	// Create the return descriptor
 	SaveStateDescriptor desc(g_nmi->getMetaEngine(), slot, header.description);
 	char res[17];
 
-	NGI::parseSavegameHeader(header, desc);
+	MetaEngine::parseSavegameHeader(&header, &desc);
 
 	snprintf(res, sizeof(res), "%s %s", desc.getSaveDate().c_str(), desc.getSaveTime().c_str());
 
diff --git a/engines/ngi/ngi.cpp b/engines/ngi/ngi.cpp
index 78917bb5a60..3c9d89a991c 100644
--- a/engines/ngi/ngi.cpp
+++ b/engines/ngi/ngi.cpp
@@ -26,6 +26,7 @@
 #include "common/debug-channels.h"
 #include "audio/mixer.h"
 
+#include "engines/metaengine.h"
 #include "engines/util.h"
 #include "graphics/surface.h"
 
@@ -42,7 +43,6 @@
 #include "ngi/floaters.h"
 #include "ngi/console.h"
 #include "ngi/constants.h"
-
 namespace NGI {
 
 NGIEngine *g_nmi = nullptr;
@@ -222,14 +222,14 @@ bool NGIEngine::shouldQuit() {
 Common::Error NGIEngine::loadGameState(int slot) {
 	deleteModalObject();
 
-	if (_gameLoader->readSavegame(getSavegameFile(slot)))
+	if (_gameLoader->readSavegame(g_nmi->getMetaEngine()->getSavegameFile(slot,"fullpipe").c_str()))
 		return Common::kNoError;
 	else
 		return Common::kUnknownError;
 }
 
 Common::Error NGIEngine::saveGameState(int slot, const Common::String &description, bool isAutosave) {
-	if (_gameLoader->writeSavegame(_currentScene, getSavegameFile(slot), description))
+	if (_gameLoader->writeSavegame(_currentScene, g_nmi->getMetaEngine()->getSavegameFile(slot,"fullpipe").c_str(), description))
 		return Common::kNoError;
 	else
 		return Common::kUnknownError;
diff --git a/engines/ngi/stateloader.cpp b/engines/ngi/stateloader.cpp
index 4f3129bd7ae..f06223a7c20 100644
--- a/engines/ngi/stateloader.cpp
+++ b/engines/ngi/stateloader.cpp
@@ -67,8 +67,8 @@ bool GameLoader::readSavegame(const char *fname) {
 	Common::Array<byte> map(800);
 	saveFile->read(map.data(), 800);
 
-	FullpipeSavegameHeader header2;
-	if (NGI::readSavegameHeader(saveFile.get(), header2)) {
+	ExtendedSavegameHeader header2;
+	if (MetaEngine::readSavegameHeader(saveFile.get(), &header2)) {
 		g_nmi->setTotalPlayTime(header2.playtime * 1000);
 	}
 
@@ -171,80 +171,6 @@ bool GameLoader::readSavegame(const char *fname) {
 	return true;
 }
 
-void parseSavegameHeader(NGI::FullpipeSavegameHeader &header, SaveStateDescriptor &desc) {
-	int day = (header.date >> 24) & 0xFF;
-	int month = (header.date >> 16) & 0xFF;
-	int year = header.date & 0xFFFF;
-	desc.setSaveDate(year, month, day);
-	int hour = (header.time >> 8) & 0xFF;
-	int minutes = header.time & 0xFF;
-	desc.setSaveTime(hour, minutes);
-	desc.setPlayTime(header.playtime * 1000);
-
-	desc.setDescription(header.description);
-}
-
-void fillDummyHeader(NGI::FullpipeSavegameHeader &header) {
-	// This is wrong header, perhaps it is original savegame. Thus fill out dummy values
-	header.date = (20 << 24) | (9 << 16) | 2016;
-	header.time = (9 << 8) | 56;
-	header.playtime = 0;
-}
-
-WARN_UNUSED_RESULT bool readSavegameHeader(Common::InSaveFile *in, FullpipeSavegameHeader &header, bool skipThumbnail) {
-	uint oldPos = in->pos();
-
-	in->seek(-4, SEEK_END);
-
-	int headerOffset = in->readUint32LE();
-
-	// Sanity check
-	if (headerOffset >= in->pos() || headerOffset == 0) {
-		in->seek(oldPos, SEEK_SET); // Rewind the file
-		fillDummyHeader(header);
-		return false;
-	}
-
-	in->seek(headerOffset, SEEK_SET);
-
-	in->read(header.id, 6);
-
-	// Validate the header Id
-	if (strcmp(header.id, "SVMCR")) {
-		in->seek(oldPos, SEEK_SET); // Rewind the file
-		fillDummyHeader(header);
-		return false;
-	}
-
-	header.version = in->readByte();
-	header.date = in->readUint32LE();
-	header.time = in->readUint16LE();
-	header.playtime = in->readUint32LE();
-
-	if (header.version > 1)
-		header.description = in->readPascalString();
-
-	// Generate savename
-	SaveStateDescriptor desc;
-
-	parseSavegameHeader(header, desc);
-
-	header.saveName = Common::String::format("%s %s", desc.getSaveDate().c_str(), desc.getSaveTime().c_str());
-
-	if (header.description.empty())
-		header.description = header.saveName;
-
-	// Get the thumbnail
-	if (!Graphics::loadThumbnail(*in, header.thumbnail, skipThumbnail)) {
-		in->seek(oldPos, SEEK_SET); // Rewind the file
-		return false;
-	}
-
-	in->seek(oldPos, SEEK_SET); // Rewind the file
-
-	return true;
-}
-
 void GameLoader::addVar(GameVar *var, GameVar *subvar) {
 	if (var && subvar) {
 		int type = var->_varType;
diff --git a/engines/ngi/statesaver.cpp b/engines/ngi/statesaver.cpp
index c4278eb798d..a3d9f6b550f 100644
--- a/engines/ngi/statesaver.cpp
+++ b/engines/ngi/statesaver.cpp
@@ -22,6 +22,7 @@
 #include "common/memstream.h"
 
 #include "graphics/thumbnail.h"
+#include "engines/metaengine.h"
 
 #include "ngi/ngi.h"
 
@@ -126,7 +127,7 @@ bool GameLoader::writeSavegame(Scene *sc, const char *fname, const Common::Strin
 	saveFile->write(stream.getData(), stream.size());
 
 	uint headerPos = saveFile->pos();
-	FullpipeSavegameHeader header2;
+	ExtendedSavegameHeader header2;
 
 	Common::strcpy_s(header2.id, "SVMCR");
 	header2.version = NGI_SAVEGAME_VERSION;




More information about the Scummvm-git-logs mailing list