Added support for the global menu save/loading, and changed the savegame format to store the savegame name and thumbnail

svn-id: r39979
This commit is contained in:
Paul Gilbert 2009-04-18 10:16:08 +00:00
parent 0b2e06e4a4
commit 15252ad83c
10 changed files with 210 additions and 51 deletions

View file

@ -30,6 +30,9 @@
#include "common/savefile.h"
#include "common/system.h"
#include "graphics/scaler.h"
#include "graphics/thumbnail.h"
namespace Cruise {
struct overlayRestoreTemporary {
@ -41,6 +44,53 @@ struct overlayRestoreTemporary {
overlayRestoreTemporary ovlRestoreData[90];
bool readSavegameHeader(Common::InSaveFile *in, CruiseSavegameHeader &header) {
char saveIdentBuffer[6];
header.thumbnail = NULL;
// Validate the header Id
in->read(saveIdentBuffer, 6);
if (strcmp(saveIdentBuffer, "SVMCR"))
return false;
header.version = in->readByte();
if (header.version != CRUISE_SAVEGAME_VERSION)
return false;
// Read in the string
header.saveName.clear();
char ch;
while ((ch = (char)in->readByte()) != '\0') header.saveName += ch;
// Get the thumbnail
header.thumbnail = new Graphics::Surface();
if (!Graphics::loadThumbnail(*in, *header.thumbnail)) {
delete header.thumbnail;
header.thumbnail = NULL;
return false;
}
return true;
}
void writeSavegameHeader(Common::OutSaveFile *out, CruiseSavegameHeader &header) {
// Write out a savegame header
char saveIdentBuffer[6];
strcpy(saveIdentBuffer, "SVMCR");
out->write(saveIdentBuffer, 6);
out->writeByte(CRUISE_SAVEGAME_VERSION);
// Write savegame name
out->write(header.saveName.c_str(), header.saveName.size() + 1);
// Create a thumbnail and save it
Graphics::Surface *thumb = new Graphics::Surface();
::createThumbnail(thumb, globalScreen, 320, 200, workpal);
Graphics::saveThumbnail(*out, *thumb);
delete thumb;
}
static void syncPalette(Common::Serializer &s, uint8 *p) {
// This is different from the original, where palette entries are 2 bytes each
s.syncBytes(p, NBCOLORS * 3);
@ -92,7 +142,7 @@ static void syncBasicInfo(Common::Serializer &s) {
s.syncAsSint16LE(var48);
s.syncAsSint16LE(flagCt);
s.syncAsSint16LE(var41);
s.syncAsSint16LE(entrerMenuJoueur);
s.syncAsSint16LE(playerMenuEnabled);
}
static void syncBackgroundTable(Common::Serializer &s) {
@ -716,68 +766,61 @@ void initVars(void) {
menuDown = 0;
buttonDown = 0;
var41 = 0;
entrerMenuJoueur = 0;
playerMenuEnabled = 0;
PCFadeFlag = 0;
}
int saveSavegameData(int saveGameIdx) {
char buffer[256];
sprintf(buffer, "CR.%d", saveGameIdx);
Common::Error saveSavegameData(int saveGameIdx, const Common::String &saveName) {
const char *filename = _vm->getSavegameFile(saveGameIdx);
Common::SaveFileManager *saveMan = g_system->getSavefileManager();
Common::OutSaveFile *f = saveMan->openForSaving(buffer);
Common::OutSaveFile *f = saveMan->openForSaving(filename);
if (f == NULL)
return 0;
return Common::kNoGameDataFoundError;
// Write out a savegame header
char saveIdentBuffer[6];
strcpy(saveIdentBuffer, "SAVPC");
f->write(saveIdentBuffer, 6);
// Save the savegame header
CruiseSavegameHeader header;
header.saveName = saveName;
writeSavegameHeader(f, header);
if (!f->ioFailed()) {
if (f->ioFailed()) {
delete f;
saveMan->removeSavefile(filename);
return Common::kWritingFailed;
} else {
// Create the remainder of the savegame
Common::Serializer s(NULL, f);
DoSync(s);
f->finalize();
delete f;
return 1;
} else {
delete f;
saveMan->removeSavefile(buffer);
return 0;
return Common::kNoError;
}
}
int loadSavegameData(int saveGameIdx) {
char buffer[256];
char saveIdentBuffer[6];
Common::Error loadSavegameData(int saveGameIdx) {
int lowMemorySave;
Common::String saveName;
cellStruct *currentcellHead;
sprintf(buffer, "CR.%d", saveGameIdx);
Common::SaveFileManager *saveMan = g_system->getSavefileManager();
Common::InSaveFile *f = saveMan->openForLoading(buffer);
Common::InSaveFile *f = saveMan->openForLoading(_vm->getSavegameFile(saveGameIdx));
if (f == NULL) {
printInfoBlackBox("Savegame not found...");
waitForPlayerInput();
return -1;
return Common::kNoGameDataFoundError;
}
printInfoBlackBox("Loading in progress...");
f->read(saveIdentBuffer, 6);
if (strcmp(saveIdentBuffer, "SAVPC")) {
delete f;
return -1;
}
initVars();
// Skip over the savegame header
CruiseSavegameHeader header;
readSavegameHeader(f, header);
if (header.thumbnail) delete header.thumbnail;
// Synchronise the remaining data of the savegame
Common::Serializer s(f, NULL);
DoSync(s);
@ -903,7 +946,7 @@ int loadSavegameData(int saveGameIdx) {
mainDraw(1);
flipScreen();
return (0);
return Common::kNoError;
}
} // End of namespace Cruise