Stop the analysis pass in Loopy's redraw routine from being
[sgt/puzzles] / towers.c
index f06f2ad..bd39554 100644 (file)
--- a/towers.c
+++ b/towers.c
@@ -1225,14 +1225,13 @@ static int check_errors(game_state *state, int *errors)
     }
 
     for (i = 0; i < 4*w; i++) {
-       int start, step, j, k, n, best;
+       int start, step, j, n, best;
        STARTSTEP(start, step, i, w);
 
        if (!clues[i])
            continue;
 
        best = n = 0;
-       k = 0;
        for (j = 0; j < w; j++) {
            int number = grid[start+j*step];
            if (!number)
@@ -1256,7 +1255,7 @@ static int check_errors(game_state *state, int *errors)
     return errs;
 }
 
-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 w = state->par.w;
@@ -1290,10 +1289,11 @@ static char *interpret_move(game_state *state, game_ui *ui, game_drawstate *ds,
                        (x - ox >= 0 && x - ox < TILESIZE &&
                         y - oy >= 0 && y - oy < TILESIZE) ||
                        /* in triangle between top-left corners? */
-                       (ox > bx && x >= bx && x <= ox &&
+                       (ox > bx && x >= bx && x <= ox && y <= by &&
                         (by-y) * (ox-bx) <= (by-oy) * (x-bx)) ||
                        /* in triangle between bottom-right corners? */
                        (ox > bx && x >= bx+TILESIZE && x <= ox+TILESIZE &&
+                        y >= oy+TILESIZE &&
                         (by-y+TILESIZE)*(ox-bx) >= (by-oy)*(x-bx-TILESIZE))) {
                        tx = cx;
                        ty = cy;
@@ -1524,12 +1524,14 @@ static void draw_tile(drawing *dr, game_drawstate *ds, struct clues *clues,
                      int x, int y, long tile)
 {
     int w = clues->w /* , a = w*w */;
-    int tx, ty;
+    int tx, ty, bg;
     char str[64];
 
     tx = COORD(x);
     ty = COORD(y);
 
+    bg = (tile & DF_HIGHLIGHT) ? COL_HIGHLIGHT : COL_BACKGROUND;
+
     /* draw tower */
     if (ds->three_d && (tile & DF_PLAYAREA) && (tile & DF_DIGIT_MASK)) {
        int coords[8];
@@ -1545,7 +1547,7 @@ static void draw_tile(drawing *dr, game_drawstate *ds, struct clues *clues,
        coords[5] = coords[3] - yoff;
        coords[6] = coords[0] + xoff;
        coords[7] = coords[1] - yoff;
-       draw_polygon(dr, coords, 4, COL_BACKGROUND, COL_GRID);
+       draw_polygon(dr, coords, 4, bg, COL_GRID);
 
        /* bottom face of tower */
        coords[0] = tx + TILESIZE;
@@ -1556,7 +1558,7 @@ static void draw_tile(drawing *dr, game_drawstate *ds, struct clues *clues,
        coords[5] = coords[3] - yoff;
        coords[6] = coords[0] + xoff;
        coords[7] = coords[1] - yoff;
-       draw_polygon(dr, coords, 4, COL_BACKGROUND, COL_GRID);
+       draw_polygon(dr, coords, 4, bg, COL_GRID);
 
        /* now offset all subsequent drawing to the top of the tower */
        tx += xoff;
@@ -1564,8 +1566,7 @@ static void draw_tile(drawing *dr, game_drawstate *ds, struct clues *clues,
     }
 
     /* erase background */
-    draw_rect(dr, tx, ty, TILESIZE, TILESIZE,
-             (tile & DF_HIGHLIGHT) ? COL_HIGHLIGHT : COL_BACKGROUND);
+    draw_rect(dr, tx, ty, TILESIZE, TILESIZE, bg);
 
     /* pencil-mode highlight */
     if (tile & DF_HIGHLIGHT_PENCIL) {
@@ -1807,6 +1808,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)
 {
     if (state->completed)
@@ -1926,6 +1932,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,