From 9be7db547aa2eba68492dc3326ea36ebeeb63505 Mon Sep 17 00:00:00 2001 From: Ben Harris Date: Mon, 13 Feb 2023 23:22:59 +0000 Subject: [PATCH] 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. --- blackbox.c | 3 ++- devel.but | 7 +++++-- guess.c | 3 ++- inertia.c | 3 ++- midend.c | 3 ++- mines.c | 3 ++- net.c | 3 ++- puzzles.h | 3 ++- 8 files changed, 19 insertions(+), 9 deletions(-) diff --git a/blackbox.c b/blackbox.c index 7c84a16..2ec8693 100644 --- a/blackbox.c +++ b/blackbox.c @@ -511,7 +511,8 @@ static char *encode_ui(const game_ui *ui) 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); } diff --git a/devel.but b/devel.but index 9ce8eee..ae0a84d 100644 --- a/devel.but +++ b/devel.but @@ -890,14 +890,17 @@ this function it can just set the pointer to \cw{NULL}. \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()}, and writes the decoded data back into the freshly-created \c{game_ui} 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} 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 doesn't need this function it can just set the pointer to \cw{NULL}. diff --git a/guess.c b/guess.c index 1dbea4c..dc02d57 100644 --- a/guess.c +++ b/guess.c @@ -452,7 +452,8 @@ static char *encode_ui(const game_ui *ui) 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; const char *p = encoding; diff --git a/inertia.c b/inertia.c index 42c2f5b..a352514 100644 --- a/inertia.c +++ b/inertia.c @@ -1527,7 +1527,8 @@ static char *encode_ui(const game_ui *ui) 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; sscanf(encoding, "D%d%n", &ui->deaths, &p); diff --git a/midend.c b/midend.c index 2e49e8d..c9ef415 100644 --- a/midend.c +++ b/midend.c @@ -2542,7 +2542,8 @@ static const char *midend_deserialise_internal( data.ui = me->ourgame->new_ui(data.states[0].state); 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 diff --git a/mines.c b/mines.c index e9437cb..c9deb82 100644 --- a/mines.c +++ b/mines.c @@ -2413,7 +2413,8 @@ static char *encode_ui(const game_ui *ui) 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; sscanf(encoding, "D%d%n", &ui->deaths, &p); diff --git a/net.c b/net.c index 7f90047..d920c5c 100644 --- a/net.c +++ b/net.c @@ -2041,7 +2041,8 @@ static char *encode_ui(const game_ui *ui) 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", &ui->org_x, &ui->org_y, &ui->cx, &ui->cy); diff --git a/puzzles.h b/puzzles.h index 6b5ff6e..27e1443 100644 --- a/puzzles.h +++ b/puzzles.h @@ -664,7 +664,8 @@ struct game { game_ui *(*new_ui)(const game_state *state); void (*free_ui)(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); void (*changed_state)(game_ui *ui, const game_state *oldstate, const game_state *newstate);