shithub: puzzles

Download patch

ref: b5e02b0b9c1b35b0b907bf6d63e62b9fafd9cb7e
parent: aaa36328dd33e255e41547fdeab08fe93e3db716
author: Chris Boyle <chris@boyle.name>
date: Wed Jan 18 15:58:31 EST 2023

Tracks: let solve make illegal moves

Not only does it set the outer edges to NOTRACK, but it may also overwrite
any mistakes the user has previously made elsewhere. Otherwise, the entire
solve is rejected ("Solve unavailable" error on Android) if the user has
made a single mistake, which is inconsistent with the other games.

This may be giving a free pass to corrupted moves that occur after a solve,
so this may still want tightening up in some way, but it's still limited to
squares within the grid, so I agree with Ben's assessment that this is
likely not to be exploitable.

Fixes #584

(cherry picked from Android port, commit
33bd14fb6f7cd760e7218fffd90f3a266b1f4123)

--- a/tracks.c
+++ b/tracks.c
@@ -2429,7 +2429,7 @@
             f = (c == 'T' || c == 't') ? S_TRACK : S_NOTRACK;
 
             if (d == 'S') {
-                if (!ui_can_flip_square(ret, x, y, f == S_NOTRACK))
+                if (!ui_can_flip_square(ret, x, y, f == S_NOTRACK) && !ret->used_solve)
                     goto badmove;
                 if (c == 'T' || c == 'N')
                     ret->sflags[y*w+x] |= f;
@@ -2440,7 +2440,7 @@
                     unsigned df = 1<<i;
 
                     if (MOVECHAR(df) == d) {
-                        if (!ui_can_flip_edge(ret, x, y, df, f == S_NOTRACK))
+                        if (!ui_can_flip_edge(ret, x, y, df, f == S_NOTRACK) && !ret->used_solve)
                             goto badmove;
                         if (c == 'T' || c == 'N')
                             S_E_SET(ret, x, y, df, f);