From 103bcf290e4bb29b39d7a73667b9ab80020170cc Mon Sep 17 00:00:00 2001 From: a/ Date: Tue, 6 Jul 2021 00:15:03 +0900 Subject: [PATCH] SAGA2: Use Common::String for SaveFileHeader --- engines/saga2/detection.cpp | 1 + engines/saga2/loadsave.cpp | 17 +++++------------ engines/saga2/saga2.h | 3 ++- engines/saga2/savefile.cpp | 23 +++++++++++++++++++++++ engines/saga2/savefile.h | 20 +++++++++++++------- engines/saga2/uidialog.cpp | 20 ++++++-------------- 6 files changed, 50 insertions(+), 34 deletions(-) diff --git a/engines/saga2/detection.cpp b/engines/saga2/detection.cpp index 47974971001..5e5c55cfee6 100644 --- a/engines/saga2/detection.cpp +++ b/engines/saga2/detection.cpp @@ -39,6 +39,7 @@ static const DebugChannelDef debugFlagList[] = { {Saga2::kDebugPath, "path", "Debug the pathfinding"}, {Saga2::kDebugTasks, "tasks", "Debug the tasks"}, {Saga2::kDebugSound, "sound", "Debug the sound"}, + {Saga2::kDebugSaveload, "saveload", "Debug the game saving/loading"}, DEBUG_CHANNEL_END }; diff --git a/engines/saga2/loadsave.cpp b/engines/saga2/loadsave.cpp index de3f220eef6..c7b88d1269d 100644 --- a/engines/saga2/loadsave.cpp +++ b/engines/saga2/loadsave.cpp @@ -129,27 +129,20 @@ void initGameState(void) { //---------------------------------------------------------------------- // Save the current game state -void writeSavegameHeader(Common::OutSaveFile *out, SaveFileHeader &header) { - out->writeUint32LE(header.gameID); - out->write(header.saveName, saveNameSize); - out->write(header.reserved, sizeof(header.reserved)); -} - Common::Error saveGameState(int16 saveNo, char *saveName) { pauseTimer(); - //SaveFileConstructor saveGame(saveNo, saveName); - Common::OutSaveFile *out = g_vm->getSaveFileManager()->openForSaving(getSaveFileName(saveNo)); + debugC(1, kDebugSaveload, "Saving game"); + + Common::OutSaveFile *out = g_vm->getSaveFileManager()->openForSaving(getSaveFileName(saveNo), false); if (!out) return Common::kCreatingFileFailed; SaveFileHeader header; - memset(&header, 0, sizeof(header)); header.gameID = gameID; - Common::strlcpy(header.saveName, saveName, saveNameSize - 1); + header.saveName = saveName; - warning("saveGameState: gameID: %s, saveName: %s", tag2str(header.gameID), header.saveName); - writeSavegameHeader(out, header); + header.write(out); #if 0 saveGlobals(saveGame); diff --git a/engines/saga2/saga2.h b/engines/saga2/saga2.h index f78f0ebc111..9bc3e35ce21 100644 --- a/engines/saga2/saga2.h +++ b/engines/saga2/saga2.h @@ -65,7 +65,8 @@ enum { kDebugTimers = 1 << 8, kDebugPath = 1 << 9, kDebugTasks = 1 << 10, - kDebugSound = 1 << 11 + kDebugSound = 1 << 11, + kDebugSaveload = 1 << 12 }; #define TICKSPERSECOND (728L/10L) diff --git a/engines/saga2/savefile.cpp b/engines/saga2/savefile.cpp index 7fb8ffeae3b..d8dc122ba56 100644 --- a/engines/saga2/savefile.cpp +++ b/engines/saga2/savefile.cpp @@ -31,6 +31,25 @@ namespace Saga2 { +void SaveFileHeader::read(Common::InSaveFile *in) { + char fileName[SaveFileHeader::kSaveNameSize]; + gameID = in->readUint32BE();; + in->read(fileName, SaveFileHeader::kSaveNameSize); + saveName = fileName; +} + +void SaveFileHeader::write(Common::OutSaveFile *out) { + out->writeUint32BE(gameID); + out->write(saveName.c_str(), saveName.size()); + + int remainingBytes = SaveFileHeader::kHeaderSize - saveName.size() - 4; + + for (int i = 0; i < remainingBytes; ++i) + out->writeByte(0); + + debugC(1, kDebugSaveload, "Writing game header: gameID = %s, saveName = %s", tag2str(gameID), saveName); +} + /* ===================================================================== * Functions * ===================================================================== */ @@ -55,6 +74,9 @@ Common::String getSaveFileName(int16 saveNo) { // Constructor SaveFileConstructor::SaveFileConstructor(int16 saveNo, char *saveName) { + warning("STUB: SaveFileConstructor::SaveFileConstructor"); + +#if 0 char fileName[fileNameSize]; // Construct the file name string @@ -77,6 +99,7 @@ SaveFileConstructor::SaveFileConstructor(int16 saveNo, char *saveName) { error("Error writing save game header: \"%s\"", fileName); chunkSize = posInChunk = 0; +#endif } //---------------------------------------------------------------------- diff --git a/engines/saga2/savefile.h b/engines/saga2/savefile.h index 8c5fafe70d3..c671622e31e 100644 --- a/engines/saga2/savefile.h +++ b/engines/saga2/savefile.h @@ -48,11 +48,17 @@ const ChunkID gameID = MKTAG('F', 'T', 'A', '2'); // file. It stores the game ID and the long name of the saved game state. struct SaveFileHeader { - ChunkID gameID; // ID of game (FTA2 of DINO). - char saveName[saveNameSize]; // The long name of the saved - // game state. - int8 reserved[84]; // Room for expansion. -}; // 128 bytes + enum { + kSaveNameSize = 40, + kHeaderSize = 128 + }; + + ChunkID gameID; // ID of game (FTA2 of DINO). + Common::String saveName; // The long name of the saved + + void read(Common::InSaveFile *in); + void write(Common::OutSaveFile *out); +}; /* ===================================================================== * SaveFileChunkInfo class @@ -125,8 +131,8 @@ public: ~SaveFileReader(void); // Return a pointer to the long name of the save game state - char *saveName(void) { - return header.saveName; + const char *saveName(void) { + return header.saveName.c_str(); } // Return the number of bytes in the current chunk diff --git a/engines/saga2/uidialog.cpp b/engines/saga2/uidialog.cpp index 2f9fa9c4061..0b15b1098e5 100644 --- a/engines/saga2/uidialog.cpp +++ b/engines/saga2/uidialog.cpp @@ -589,7 +589,7 @@ char **initFileFields(void) { strings[i] = new char[editLen + 1]; if (getSaveName(i, header)) { - strncpy(strings[i], header.saveName, editLen); + strncpy(strings[i], header.saveName.c_str(), editLen); } else { strncpy(strings[i], FILE_DIALOG_NONAME, editLen); strings[i][0] |= 0x80; @@ -623,24 +623,16 @@ void destroyFileFields(char **strings) { } bool getSaveName(int8 saveNo, SaveFileHeader &header) { - FILE *fileHandle; // A standard C file handle - char fileName[fileNameSize + 1]; + Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading(getSaveFileName(saveNo)); - // Construct the file name based on the save number - getSaveFileName(saveNo, fileName); - - // Open the file or throw an exception - if ((fileHandle = fopen(fileName, "rb")) == nullptr) { + if (!in) { + warning("Unable to load save %s", getSaveFileName(saveNo)); return false; } - // Read the save file header - if (fread(&header, sizeof(header), 1, fileHandle) != 1) { - return false; - } + header.read(in); - // close the used file handle - if (fileHandle != nullptr) fclose(fileHandle); + delete in; return true; }