aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Harris <bjh21@bjh21.me.uk>2023-02-04 16:18:27 +0000
committerBen Harris <bjh21@bjh21.me.uk>2023-02-05 20:58:21 +0000
commit84ec2a0a77d63450311f7c25b36d4b9f7e3c53e1 (patch)
treef44cf44befb111ccd3bce6297918a2cd5cf0f3f1
parent9ce0a6d93212ffc0986a2b399fd8e9e983f62904 (diff)
downloadpuzzles-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.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/unequal.c b/unequal.c
index f2328b6..0a2bafd 100644
--- a/unequal.c
+++ b/unequal.c
@@ -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);