SAGA2: Use Common::String for SaveFileHeader
This commit is contained in:
parent
4a4fcbc2ec
commit
103bcf290e
6 changed files with 50 additions and 34 deletions
|
@ -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
|
||||
};
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue