Add player name field to save file, save it out as a round-trip test
Adds savefile_t.playerName (SAVE_PLAYER_NAME_MAX) serialized via the existing saveFileReadString/WriteString helpers, and stamps + saves it in rpgInit() as a test that the save system now persists actual game data, not just the header/version. Verified manually: written bytes end in "Dusk\0" immediately after the version field, and loading it back returns the same string.
This commit is contained in:
@@ -18,6 +18,8 @@
|
|||||||
#include "util/memory.h"
|
#include "util/memory.h"
|
||||||
#include "util/string.h"
|
#include "util/string.h"
|
||||||
#include "assert/assert.h"
|
#include "assert/assert.h"
|
||||||
|
#include "save/save.h"
|
||||||
|
#include "error/error.h"
|
||||||
|
|
||||||
#include "ui/rpg/uiemoji.h"
|
#include "ui/rpg/uiemoji.h"
|
||||||
|
|
||||||
@@ -51,6 +53,12 @@ errorret_t rpgInit(void) {
|
|||||||
backpackAdd(ITEM_ID_POTATO, 3);
|
backpackAdd(ITEM_ID_POTATO, 3);
|
||||||
backpackAdd(ITEM_ID_APPLE, 8);
|
backpackAdd(ITEM_ID_APPLE, 8);
|
||||||
|
|
||||||
|
// TEST: Verify the save system round-trips real game data, not just the
|
||||||
|
// header/version. Remove once there's an actual name-entry flow.
|
||||||
|
savefile_t *saveFile = saveGet(0);
|
||||||
|
stringCopy(saveFile->playerName, "Dusk", SAVE_PLAYER_NAME_MAX);
|
||||||
|
errorCatch(errorPrint(saveWrite(0)));
|
||||||
|
|
||||||
// All Good!
|
// All Good!
|
||||||
errorOk();
|
errorOk();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,6 +20,9 @@
|
|||||||
/** Maximum number of independent save slots supported. */
|
/** Maximum number of independent save slots supported. */
|
||||||
#define SAVE_FILE_COUNT_MAX 3
|
#define SAVE_FILE_COUNT_MAX 3
|
||||||
|
|
||||||
|
/** Maximum length of a saved player name, including the null terminator. */
|
||||||
|
#define SAVE_PLAYER_NAME_MAX 32
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
/** Magic header bytes read from the file; must equal SAVE_FILE_HEADER. */
|
/** Magic header bytes read from the file; must equal SAVE_FILE_HEADER. */
|
||||||
char_t header[SAVE_FILE_HEADER_SIZE];
|
char_t header[SAVE_FILE_HEADER_SIZE];
|
||||||
@@ -27,4 +30,6 @@ typedef struct {
|
|||||||
uint32_t version;
|
uint32_t version;
|
||||||
/** Runtime flag - true if this slot was successfully loaded or written. */
|
/** Runtime flag - true if this slot was successfully loaded or written. */
|
||||||
bool_t exists;
|
bool_t exists;
|
||||||
|
/** The player's saved name. */
|
||||||
|
char_t playerName[SAVE_PLAYER_NAME_MAX];
|
||||||
} savefile_t;
|
} savefile_t;
|
||||||
|
|||||||
@@ -330,11 +330,13 @@ errorret_t saveStreamWriteDateImpl(
|
|||||||
errorret_t saveFileLoad(savestream_t *stream, savefile_t *file) {
|
errorret_t saveFileLoad(savestream_t *stream, savefile_t *file) {
|
||||||
saveFileReadHeader(stream, file->header);
|
saveFileReadHeader(stream, file->header);
|
||||||
saveFileReadVersion(stream, &file->version);
|
saveFileReadVersion(stream, &file->version);
|
||||||
|
saveFileReadString(stream, file->playerName, SAVE_PLAYER_NAME_MAX);
|
||||||
errorOk();
|
errorOk();
|
||||||
}
|
}
|
||||||
|
|
||||||
errorret_t saveFileWrite(savestream_t *stream, savefile_t *file) {
|
errorret_t saveFileWrite(savestream_t *stream, savefile_t *file) {
|
||||||
saveFileWriteHeader(stream, file->header);
|
saveFileWriteHeader(stream, file->header);
|
||||||
saveFileWriteVersion(stream, &file->version);
|
saveFileWriteVersion(stream, &file->version);
|
||||||
|
saveFileWriteString(stream, file->playerName, SAVE_PLAYER_NAME_MAX);
|
||||||
errorOk();
|
errorOk();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user