Skip to content

Commit

Permalink
FULLPIPE: Fix bug #10317: Save game metadata is missing
Browse files Browse the repository at this point in the history
  • Loading branch information
sev- committed Dec 1, 2017
1 parent dfbf27b commit 1f2290c
Show file tree
Hide file tree
Showing 7 changed files with 34 additions and 15 deletions.
16 changes: 14 additions & 2 deletions engines/fullpipe/detection.cpp
Expand Up @@ -156,6 +156,7 @@ bool FullpipeMetaEngine::hasFeature(MetaEngineFeature f) const {
(f == kSavesSupportMetaInfo) ||
(f == kSavesSupportThumbnail) ||
(f == kSavesSupportCreationDate) ||
(f == kSavesSupportPlayTime) ||
(f == kSupportsLoadingDuringStartup) ||
(f == kSimpleSavesNames);
}
Expand Down Expand Up @@ -184,7 +185,14 @@ SaveStateList FullpipeMetaEngine::listSaves(const char *target) const {
if (in) {
Fullpipe::FullpipeSavegameHeader header;
Fullpipe::readSavegameHeader(in.get(), header);
saveList.push_back(SaveStateDescriptor(slotNum, header.saveName));

SaveStateDescriptor desc;

parseSavegameHeader(header, desc);

desc.setSaveSlot(slotNum);

saveList.push_back(desc);
}
}
}
Expand All @@ -207,7 +215,11 @@ SaveStateDescriptor FullpipeMetaEngine::querySaveMetaInfos(const char *target, i
Fullpipe::readSavegameHeader(f.get(), header);

// Create the return descriptor
SaveStateDescriptor desc(slot, header.saveName);
SaveStateDescriptor desc;

parseSavegameHeader(header, desc);

desc.setSaveSlot(slot);
desc.setThumbnail(header.thumbnail);

return desc;
Expand Down
2 changes: 1 addition & 1 deletion engines/fullpipe/fullpipe.cpp
Expand Up @@ -239,7 +239,7 @@ Common::Error FullpipeEngine::loadGameState(int slot) {
}

Common::Error FullpipeEngine::saveGameState(int slot, const Common::String &description) {
if (_gameLoader->writeSavegame(_currentScene, getSavegameFile(slot)))
if (_gameLoader->writeSavegame(_currentScene, getSavegameFile(slot), description))
return Common::kNoError;
else
return Common::kUnknownError;
Expand Down
5 changes: 3 additions & 2 deletions engines/fullpipe/gameloader.h
Expand Up @@ -32,7 +32,7 @@

namespace Fullpipe {

#define FULLPIPE_SAVEGAME_VERSION 1
#define FULLPIPE_SAVEGAME_VERSION 2

class SceneTag;
class MctlCompound;
Expand Down Expand Up @@ -80,6 +80,7 @@ struct FullpipeSavegameHeader {
char id[6];
uint8 version;
Common::String saveName;
Common::String description;
uint32 date;
uint16 time;
uint32 playtime;
Expand Down Expand Up @@ -115,7 +116,7 @@ class GameLoader : public CObject {
PicAniInfoList savePicAniInfos(Scene *sc, int flag1, int flag2);

bool readSavegame(const char *fname);
bool writeSavegame(Scene *sc, const char *fname);
bool writeSavegame(Scene *sc, const char *fname, const Common::String &description);

void addVar(GameVar *var, GameVar *subvar);

Expand Down
2 changes: 1 addition & 1 deletion engines/fullpipe/messages.cpp
Expand Up @@ -353,7 +353,7 @@ void MessageQueue::messageQueueCallback1(int par) {
}

if (g_fp->_currentScene)
g_fp->_gameLoader->writeSavegame(g_fp->_currentScene, "savetmp.sav");
g_fp->_gameLoader->writeSavegame(g_fp->_currentScene, "savetmp.sav", "");
}
}

Expand Down
2 changes: 1 addition & 1 deletion engines/fullpipe/modal.cpp
Expand Up @@ -2285,7 +2285,7 @@ void ModalSaveGame::saveload() {
}

if (g_fp->_isSaveAllowed && allowed)
g_fp->_gameLoader->writeSavegame(g_fp->_currentScene, getSaveName());
g_fp->_gameLoader->writeSavegame(g_fp->_currentScene, getSaveName(), "");
}
} else {
if (getSaveName()) {
Expand Down
15 changes: 8 additions & 7 deletions engines/fullpipe/stateloader.cpp
Expand Up @@ -178,7 +178,7 @@ void parseSavegameHeader(Fullpipe::FullpipeSavegameHeader &header, SaveStateDesc
desc.setSaveTime(hour, minutes);
desc.setPlayTime(header.playtime * 1000);

desc.setDescription(header.saveName);
desc.setDescription(header.description);
}

void fillDummyHeader(Fullpipe::FullpipeSavegameHeader &header) {
Expand Down Expand Up @@ -214,22 +214,23 @@ bool readSavegameHeader(Common::InSaveFile *in, FullpipeSavegameHeader &header)
}

header.version = in->readByte();
if (header.version != FULLPIPE_SAVEGAME_VERSION) {
in->seek(oldPos, SEEK_SET); // Rewind the file
fillDummyHeader(header);
return false;
}

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
header.thumbnail = Common::SharedPtr<Graphics::Surface>(Graphics::loadThumbnail(*in), Graphics::SurfaceDeleter());

Expand Down
7 changes: 6 additions & 1 deletion engines/fullpipe/statesaver.cpp
Expand Up @@ -31,7 +31,7 @@

namespace Fullpipe {

bool GameLoader::writeSavegame(Scene *sc, const char *fname) {
bool GameLoader::writeSavegame(Scene *sc, const char *fname, const Common::String &description) {
GameVar *v = _gameVar->getSubVarByName("OBJSTATES")->getSubVarByName("SAVEGAME");

if (!v) {
Expand Down Expand Up @@ -146,6 +146,11 @@ bool GameLoader::writeSavegame(Scene *sc, const char *fname) {
saveFile->writeUint16LE(header2.time);
saveFile->writeUint32LE(header2.playtime);

// Added in save version 2
Common::String desc(description.c_str(), MIN(255u, description.size())); // Restrict description size
saveFile->writeByte(desc.size());
saveFile->writeString(desc);

g_fp->_currentScene->draw();

Graphics::saveThumbnail(*saveFile); // FIXME. Render proper screen
Expand Down

0 comments on commit 1f2290c

Please sign in to comment.