The Light Up solver limits its recursion depth, so if it fails to find
[sgt/puzzles] / lightup.c
index 298b7e2..47b49b2 100644 (file)
--- a/lightup.c
+++ b/lightup.c
@@ -215,6 +215,11 @@ static void decode_params(game_params *params, char const *string)
     if (*string == 's') {
         string++;
         EATNUM(params->symm);
+    } else {
+        /* cope with user input such as '18x10' by ensuring symmetry
+         * is not selected by default to be incompatible with dimensions */
+        if (params->symm == SYMM_ROT4 && params->w != params->h)
+            params->symm = SYMM_ROT2;
     }
     params->difficulty = 0;
     /* cope with old params */
@@ -1402,6 +1407,7 @@ static int strip_unused_nums(game_state *state)
             }
         }
     }
+    debug(("Stripped %d unused numbers.\n", n));
     return n;
 }
 
@@ -1475,7 +1481,7 @@ static char *new_game_desc(game_params *params, random_state *rs,
                           char **aux, int interactive)
 {
     game_state *news = new_state(params), *copys;
-    int nsol, i, j, run, x, y, wh = params->w*params->h, num;
+    int i, j, run, x, y, wh = params->w*params->h, num;
     char *ret, *p;
     int *numindices;
 
@@ -1499,8 +1505,7 @@ static char *new_game_desc(game_params *params, random_state *rs,
             /* Take a copy, remove numbers we didn't use and check there's
              * still a unique solution; if so, use the copy subsequently. */
             copys = dup_game(news);
-            nsol = strip_unused_nums(copys);
-            debug(("Stripped %d unused numbers.\n", nsol));
+            strip_unused_nums(copys);
             if (!puzzle_is_good(copys, params->difficulty)) {
                 debug(("Stripped grid is not good, reverting.\n"));
                 free_game(copys);
@@ -1672,7 +1677,7 @@ static char *solve_game(game_state *state, game_state *currstate,
     /* That didn't work; try solving from the clean puzzle. */
     solved = dup_game(state);
     if (dosolve(solved, sflags, NULL) > 0) goto solved;
-    *error = "Puzzle is not self-consistent.";
+    *error = "Unable to find a solution to this puzzle.";
     goto done;
 
 solved:
@@ -1869,11 +1874,19 @@ static char *interpret_move(game_state *state, game_ui *ui, game_drawstate *ds,
         if (flags & F_BLACK)
             return nullret;
         if (action == FLIP_LIGHT) {
+#ifdef STYLUS_BASED
+            if (flags & F_IMPOSSIBLE || flags & F_LIGHT) c = 'I'; else c = 'L';
+#else
             if (flags & F_IMPOSSIBLE) return nullret;
             c = 'L';
+#endif
         } else {
+#ifdef STYLUS_BASED
+            if (flags & F_IMPOSSIBLE || flags & F_LIGHT) c = 'L'; else c = 'I';
+#else
             if (flags & F_LIGHT) return nullret;
             c = 'I';
+#endif
         }
         sprintf(buf, "%c%d,%d", (int)c, cx, cy);
         break;
@@ -2058,7 +2071,7 @@ static void tile_redraw(drawing *dr, game_drawstate *ds, game_state *state,
         draw_rect(dr, dx, dy, TILE_SIZE, TILE_SIZE, COL_BLACK);
         if (ds_flags & DF_NUMBERED) {
             int ccol = (ds_flags & DF_NUMBERWRONG) ? COL_ERROR : COL_LIGHT;
-            char str[10];
+            char str[32];
 
             /* We know that this won't change over the course of the game
              * so it's OK to ignore this when calculating whether or not
@@ -2152,6 +2165,11 @@ static float game_flash_length(game_state *oldstate, game_state *newstate,
     return 0.0F;
 }
 
+static int game_status(game_state *state)
+{
+    return state->completed ? +1 : 0;
+}
+
 static int game_timing_state(game_state *state, game_ui *ui)
 {
     return TRUE;
@@ -2206,7 +2224,7 @@ static void game_print(drawing *dr, game_state *state, int tilesize)
            if (ds_flags & DF_BLACK) {
                draw_rect(dr, dx, dy, TILE_SIZE, TILE_SIZE, ink);
                if (ds_flags & DF_NUMBERED) {
-                   char str[10];
+                   char str[32];
                    sprintf(str, "%d", GRID(state, lights, x, y));
                    draw_text(dr, dx + TILE_SIZE/2, dy + TILE_SIZE/2,
                              FONT_VARIABLE, TILE_SIZE*3/5,
@@ -2254,6 +2272,7 @@ const struct game thegame = {
     game_redraw,
     game_anim_length,
     game_flash_length,
+    game_status,
     TRUE, FALSE, game_print_size, game_print,
     FALSE,                            /* wants_statusbar */
     FALSE, game_timing_state,