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