Add a game_state argument to decode_ui()

Some games would like a way to check that the parameters in the encoded
UI string are consistent with the game parameters.  Since this might
depend on the current state of the game (this being what changed_state()
is for), implement this by adding a game_state parameter to decode_ui().
Nothing currently uses it, though Guess usefully could.
This commit is contained in:
Ben Harris
2023-02-13 23:22:59 +00:00
parent 418cb3a567
commit 9be7db547a
8 changed files with 19 additions and 9 deletions

View File

@ -511,7 +511,8 @@ static char *encode_ui(const game_ui *ui)
return dupstr(buf); return dupstr(buf);
} }
static void decode_ui(game_ui *ui, const char *encoding) static void decode_ui(game_ui *ui, const char *encoding,
const game_state *state)
{ {
sscanf(encoding, "E%d", &ui->errors); sscanf(encoding, "E%d", &ui->errors);
} }

View File

@ -890,14 +890,17 @@ this function it can just set the pointer to \cw{NULL}.
\S{backend-decode-ui} \cw{decode_ui()} \S{backend-decode-ui} \cw{decode_ui()}
\c void (*decode_ui)(game_ui *ui, const char *encoding); \c void (*decode_ui)(game_ui *ui, const char *encoding,
\c const game_state *state);
This function parses a string previously output by \cw{encode_ui()}, This function parses a string previously output by \cw{encode_ui()},
and writes the decoded data back into the freshly-created \c{game_ui} and writes the decoded data back into the freshly-created \c{game_ui}
structure provided. If the string is invalid, the function should do structure provided. If the string is invalid, the function should do
the best it can, which might just mean not changing the \c{game_ui} the best it can, which might just mean not changing the \c{game_ui}
structure at all. This might happen if a save file is corrupted, or structure at all. This might happen if a save file is corrupted, or
simply from a newer version that encodes more \c{game_ui} data. simply from a newer version that encodes more \c{game_ui} data. The
current \c{game_state} is provided in case the function needs to
refer to it for validation.
Like \cw{encode_ui()}, \cw{decode_ui()} is optional. If a back-end Like \cw{encode_ui()}, \cw{decode_ui()} is optional. If a back-end
doesn't need this function it can just set the pointer to \cw{NULL}. doesn't need this function it can just set the pointer to \cw{NULL}.

View File

@ -452,7 +452,8 @@ static char *encode_ui(const game_ui *ui)
return sresize(ret, p - ret, char); return sresize(ret, p - ret, char);
} }
static void decode_ui(game_ui *ui, const char *encoding) static void decode_ui(game_ui *ui, const char *encoding,
const game_state *state)
{ {
int i; int i;
const char *p = encoding; const char *p = encoding;

View File

@ -1527,7 +1527,8 @@ static char *encode_ui(const game_ui *ui)
return dupstr(buf); return dupstr(buf);
} }
static void decode_ui(game_ui *ui, const char *encoding) static void decode_ui(game_ui *ui, const char *encoding,
const game_state *state)
{ {
int p = 0; int p = 0;
sscanf(encoding, "D%d%n", &ui->deaths, &p); sscanf(encoding, "D%d%n", &ui->deaths, &p);

View File

@ -2542,7 +2542,8 @@ static const char *midend_deserialise_internal(
data.ui = me->ourgame->new_ui(data.states[0].state); data.ui = me->ourgame->new_ui(data.states[0].state);
if (data.uistr && me->ourgame->decode_ui) if (data.uistr && me->ourgame->decode_ui)
me->ourgame->decode_ui(data.ui, data.uistr); me->ourgame->decode_ui(data.ui, data.uistr,
data.states[data.statepos-1].state);
/* /*
* Run the externally provided check function, and abort if it * Run the externally provided check function, and abort if it

View File

@ -2413,7 +2413,8 @@ static char *encode_ui(const game_ui *ui)
return dupstr(buf); return dupstr(buf);
} }
static void decode_ui(game_ui *ui, const char *encoding) static void decode_ui(game_ui *ui, const char *encoding,
const game_state *state)
{ {
int p= 0; int p= 0;
sscanf(encoding, "D%d%n", &ui->deaths, &p); sscanf(encoding, "D%d%n", &ui->deaths, &p);

3
net.c
View File

@ -2041,7 +2041,8 @@ static char *encode_ui(const game_ui *ui)
return dupstr(buf); return dupstr(buf);
} }
static void decode_ui(game_ui *ui, const char *encoding) static void decode_ui(game_ui *ui, const char *encoding,
const game_state *state)
{ {
sscanf(encoding, "O%d,%d;C%d,%d", sscanf(encoding, "O%d,%d;C%d,%d",
&ui->org_x, &ui->org_y, &ui->cx, &ui->cy); &ui->org_x, &ui->org_y, &ui->cx, &ui->cy);

View File

@ -664,7 +664,8 @@ struct game {
game_ui *(*new_ui)(const game_state *state); game_ui *(*new_ui)(const game_state *state);
void (*free_ui)(game_ui *ui); void (*free_ui)(game_ui *ui);
char *(*encode_ui)(const game_ui *ui); char *(*encode_ui)(const game_ui *ui);
void (*decode_ui)(game_ui *ui, const char *encoding); void (*decode_ui)(game_ui *ui, const char *encoding,
const game_state *state);
key_label *(*request_keys)(const game_params *params, int *nkeys); key_label *(*request_keys)(const game_params *params, int *nkeys);
void (*changed_state)(game_ui *ui, const game_state *oldstate, void (*changed_state)(game_ui *ui, const game_state *oldstate,
const game_state *newstate); const game_state *newstate);