Stop the analysis pass in Loopy's redraw routine from being
[sgt/puzzles] / solo.c
diff --git a/solo.c b/solo.c
index 8e50c3b..d9bf18d 100644 (file)
--- a/solo.c
+++ b/solo.c
@@ -1473,7 +1473,7 @@ static int solver_killer_sums(struct solver_usage *usage, int b,
     }
     assert(nsquares > 0);
 
-    if (nsquares > 4)
+    if (nsquares < 2 || nsquares > 4)
        return 0;
 
     if (!cage_is_region) {
@@ -1773,9 +1773,16 @@ static void solver(int cr, struct block_structure *blocks,
      * Place all the clue numbers we are given.
      */
     for (x = 0; x < cr; x++)
-       for (y = 0; y < cr; y++)
-           if (grid[y*cr+x])
+       for (y = 0; y < cr; y++) {
+            int n = grid[y*cr+x];
+           if (n) {
+                if (!cube(x,y,n)) {
+                    diff = DIFF_IMPOSSIBLE;
+                    goto got_result;
+                }
                solver_place(usage, x, y, grid[y*cr+x]);
+            }
+        }
 
     /*
      * Now loop over the grid repeatedly trying all permitted modes
@@ -2041,7 +2048,7 @@ static void solver(int cr, struct block_structure *blocks,
                                             );
                if (ret > 0) {
                    changed = TRUE;
-                   kdiff = max(kdiff, DIFF_KINTERSECT);
+                   kdiff = max(kdiff, DIFF_KSUMS);
                } else if (ret < 0) {
                    diff = DIFF_IMPOSSIBLE;
                    goto got_result;
@@ -2402,7 +2409,7 @@ static void solver(int cr, struct block_structure *blocks,
                    scratch->indexlist[i*cr+n-1] = cubepos2(diag1(i), n);
             ret = solver_set(usage, scratch, scratch->indexlist
 #ifdef STANDALONE_SOLVER
-                            , "set elimination, \\-diagonal"
+                            , "set elimination, /-diagonal"
 #endif
                             );
            if (ret < 0) {
@@ -4504,7 +4511,7 @@ struct game_drawstate {
     int nregions, *entered_items;
 };
 
-static char *interpret_move(game_state *state, game_ui *ui, game_drawstate *ds,
+static char *interpret_move(game_state *state, game_ui *ui, const game_drawstate *ds,
                            int x, int y, int button)
 {
     int cr = state->cr;
@@ -5187,9 +5194,9 @@ static float game_flash_length(game_state *oldstate, game_state *newstate,
     return 0.0F;
 }
 
-static int game_is_solved(game_state *state)
+static int game_status(game_state *state)
 {
-    return state->completed;
+    return state->completed ? +1 : 0;
 }
 
 static int game_timing_state(game_state *state, game_ui *ui)
@@ -5511,7 +5518,7 @@ const struct game thegame = {
     game_redraw,
     game_anim_length,
     game_flash_length,
-    game_is_solved,
+    game_status,
     TRUE, FALSE, game_print_size, game_print,
     FALSE,                            /* wants_statusbar */
     FALSE, game_timing_state,
@@ -5578,7 +5585,7 @@ int main(int argc, char **argv)
               dlev.diff==DIFF_IMPOSSIBLE ? "Impossible (no solution exists)":
               "INTERNAL ERROR: unrecognised difficulty code");
        if (p->killer)
-           printf("Killer diffculty: %s\n",
+           printf("Killer difficulty: %s\n",
                   dlev.kdiff==DIFF_KSINGLE ? "Trivial (single square cages only)":
                   dlev.kdiff==DIFF_KMINMAX ? "Simple (maximum sum analysis required)":
                   dlev.kdiff==DIFF_KSUMS ? "Intermediate (sum possibilities)":