SAGA2: Use Common::String for SaveFileHeader

This commit is contained in:
a/ 2021-07-06 00:15:03 +09:00
parent 4a4fcbc2ec
commit 103bcf290e
6 changed files with 50 additions and 34 deletions

View file

@ -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
};

View file

@ -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);

View file

@ -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)

View file

@ -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
}
//----------------------------------------------------------------------

View file

@ -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

View file

@ -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;
}