[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