diff options
| author | Ben Harris <bjh21@bjh21.me.uk> | 2023-02-10 17:09:18 +0000 |
|---|---|---|
| committer | Ben Harris <bjh21@bjh21.me.uk> | 2023-02-10 18:32:00 +0000 |
| commit | bf9abb2a127a4a81babe50ecb419527f8aeffe28 (patch) | |
| tree | 0d41c52bd1a6e35485e4eca8c9699e8efd71c3ab /bridges.c | |
| parent | bd5c0a37a019c540eda05f8291cad90ffd598134 (diff) | |
| download | puzzles-bf9abb2a127a4a81babe50ecb419527f8aeffe28.zip puzzles-bf9abb2a127a4a81babe50ecb419527f8aeffe28.tar.gz puzzles-bf9abb2a127a4a81babe50ecb419527f8aeffe28.tar.bz2 puzzles-bf9abb2a127a4a81babe50ecb419527f8aeffe28.tar.xz | |
Forbid impossible moves in Bridges
Specifically, a bridge or a non-bridge must connect two islands that
differ in precisely one co-ordinate. Without this, a save file that
tries to connect or disconnect two non-orthogonal islands will cause
"island_join: Assertion `!"island_join: islands not orthogonal."'
failed."
Here's a save file demonstrating the problem:
SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
VERSION :1:1
GAME :7:Bridges
PARAMS :13:3x3i30e10m2d0
CPARAMS :13:3x3i30e10m2d0
DESC :6:b1c1a2
NSTATES :1:2
STATEPOS:1:2
MOVE :10:L0,2,2,0,1
Diffstat (limited to 'bridges.c')
| -rw-r--r-- | bridges.c | 3 |
1 files changed, 3 insertions, 0 deletions
@@ -2571,6 +2571,8 @@ static game_state *execute_move(const game_state *state, const char *move) goto badmove; if (!INGRID(ret, x1, y1) || !INGRID(ret, x2, y2)) goto badmove; + /* Precisely one co-ordinate must differ between islands. */ + if ((x1 != x2) + (y1 != y2) != 1) goto badmove; is1 = INDEX(ret, gridi, x1, y1); is2 = INDEX(ret, gridi, x2, y2); if (!is1 || !is2) goto badmove; @@ -2582,6 +2584,7 @@ static game_state *execute_move(const game_state *state, const char *move) goto badmove; if (!INGRID(ret, x1, y1) || !INGRID(ret, x2, y2)) goto badmove; + if ((x1 != x2) + (y1 != y2) != 1) goto badmove; is1 = INDEX(ret, gridi, x1, y1); is2 = INDEX(ret, gridi, x2, y2); if (!is1 || !is2) goto badmove; |