aboutsummaryrefslogtreecommitdiff
path: root/tracks.c
diff options
context:
space:
mode:
authorSimon Tatham <anakin@pobox.com>2023-01-19 12:47:55 +0000
committerSimon Tatham <anakin@pobox.com>2023-01-19 12:47:55 +0000
commitb4aaa11943fb72b09fe173bc97bd9313ff94738c (patch)
tree2a15f3eaeaff30978542f40aa5609fca414d6976 /tracks.c
parentb5e02b0b9c1b35b0b907bf6d63e62b9fafd9cb7e (diff)
downloadpuzzles-b4aaa11943fb72b09fe173bc97bd9313ff94738c.zip
puzzles-b4aaa11943fb72b09fe173bc97bd9313ff94738c.tar.gz
puzzles-b4aaa11943fb72b09fe173bc97bd9313ff94738c.tar.bz2
puzzles-b4aaa11943fb72b09fe173bc97bd9313ff94738c.tar.xz
Tracks: tighten up the 'illegal solve submoves' fix.
Chris mentioned in the commit message that there was a risk that illegal moves might be permitted when playing on after a solve. So I've changed the condition so that it depends only on whether the move _currently being executed_ is a solve, rather than whether there was a solve action anywhere in the undo history. (Also, wrapped overlong lines while I was here.)
Diffstat (limited to 'tracks.c')
-rw-r--r--tracks.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/tracks.c b/tracks.c
index d52a311..07a9a80 100644
--- a/tracks.c
+++ b/tracks.c
@@ -2408,6 +2408,7 @@ static game_state *execute_move(const game_state *state, const char *move)
int w = state->p.w, x, y, n, i;
char c, d;
unsigned f;
+ bool move_is_solve = false;
game_state *ret = dup_game(state);
/* this is breaking the bank on GTK, which vsprintf's into a fixed-size buffer
@@ -2418,6 +2419,7 @@ static game_state *execute_move(const game_state *state, const char *move)
c = *move;
if (c == 'S') {
ret->used_solve = true;
+ move_is_solve = true;
move++;
} else if (c == 'T' || c == 't' || c == 'N' || c == 'n') {
/* set track, clear track; set notrack, clear notrack */
@@ -2429,7 +2431,8 @@ static game_state *execute_move(const game_state *state, const char *move)
f = (c == 'T' || c == 't') ? S_TRACK : S_NOTRACK;
if (d == 'S') {
- if (!ui_can_flip_square(ret, x, y, f == S_NOTRACK) && !ret->used_solve)
+ if (!ui_can_flip_square(ret, x, y, f == S_NOTRACK) &&
+ !move_is_solve)
goto badmove;
if (c == 'T' || c == 'N')
ret->sflags[y*w+x] |= f;
@@ -2440,7 +2443,8 @@ static game_state *execute_move(const game_state *state, const char *move)
unsigned df = 1<<i;
if (MOVECHAR(df) == d) {
- if (!ui_can_flip_edge(ret, x, y, df, f == S_NOTRACK) && !ret->used_solve)
+ if (!ui_can_flip_edge(ret, x, y, df, f == S_NOTRACK) &&
+ !move_is_solve)
goto badmove;
if (c == 'T' || c == 'N')
S_E_SET(ret, x, y, df, f);