diff options
| author | Ben Harris <bjh21@bjh21.me.uk> | 2023-02-04 16:18:27 +0000 |
|---|---|---|
| committer | Ben Harris <bjh21@bjh21.me.uk> | 2023-02-05 20:58:21 +0000 |
| commit | 84ec2a0a77d63450311f7c25b36d4b9f7e3c53e1 (patch) | |
| tree | f44cf44befb111ccd3bce6297918a2cd5cf0f3f1 | |
| parent | 9ce0a6d93212ffc0986a2b399fd8e9e983f62904 (diff) | |
| download | puzzles-84ec2a0a77d63450311f7c25b36d4b9f7e3c53e1.zip puzzles-84ec2a0a77d63450311f7c25b36d4b9f7e3c53e1.tar.gz puzzles-84ec2a0a77d63450311f7c25b36d4b9f7e3c53e1.tar.bz2 puzzles-84ec2a0a77d63450311f7c25b36d4b9f7e3c53e1.tar.xz | |
Unequal: Don't insist that solve moves must actually solve
A corrupt save file can include an "S" move that doesn't give a valid
solution. An assertion failure ("execute_move: Assertion `rc > 0'
failed.") at that point is rude, so now we just don't set the
"completed" flag in that case. We still set the "cheated" flag, to
reward (lack of) effort.
Here's a trivial test case:
SAVEFILE:41:Simon Tatham's Portable Puzzle Collection
GAME :7:Unequal
CPARAMS :1:3
PARAMS :1:3
DESC :17:0,0,0,0,0,0,0,0,0
NSTATES :1:2
STATEPOS:1:2
MOVE :10:S222222222
| -rw-r--r-- | unequal.c | 8 |
1 files changed, 4 insertions, 4 deletions
@@ -1652,7 +1652,7 @@ static char *interpret_move(const game_state *state, game_ui *ui, static game_state *execute_move(const game_state *state, const char *move) { game_state *ret = NULL; - int x, y, n, i, rc; + int x, y, n, i; debug(("execute_move: %s", move)); @@ -1677,7 +1677,7 @@ static game_state *execute_move(const game_state *state, const char *move) const char *p; ret = dup_game(state); - ret->completed = ret->cheated = true; + ret->cheated = true; p = move+1; for (i = 0; i < state->order*state->order; i++) { @@ -1688,8 +1688,8 @@ static game_state *execute_move(const game_state *state, const char *move) p++; } if (*p) goto badmove; - rc = check_complete(ret->nums, ret, true); - assert(rc > 0); + if (!ret->completed && check_complete(ret->nums, ret, true) > 0) + ret->completed = true; return ret; } else if (move[0] == 'M') { ret = dup_game(state); |