Tweaks and more complete documentation for Same Game.
[sgt/puzzles] / mines.c
diff --git a/mines.c b/mines.c
index df8ecfa..0141517 100644 (file)
--- a/mines.c
+++ b/mines.c
@@ -25,10 +25,11 @@ enum {
     NCOLOURS
 };
 
-#define TILE_SIZE 20
+#define PREFERRED_TILE_SIZE 20
+#define TILE_SIZE (ds->tilesize)
 #define BORDER (TILE_SIZE * 3 / 2)
-#define HIGHLIGHT_WIDTH 2
-#define OUTER_HIGHLIGHT_WIDTH 3
+#define HIGHLIGHT_WIDTH (TILE_SIZE / 10)
+#define OUTER_HIGHLIGHT_WIDTH (BORDER / 10)
 #define COORD(x)  ( (x) * TILE_SIZE + BORDER )
 #define FROMCOORD(x)  ( ((x) - BORDER + TILE_SIZE) / TILE_SIZE - 1 )
 
@@ -97,8 +98,11 @@ static game_params *default_params(void)
 
 static const struct game_params mines_presets[] = {
   {9, 9, 10, TRUE},
+  {9, 9, 35, TRUE},
   {16, 16, 40, TRUE},
+  {16, 16, 99, TRUE},
   {30, 16, 99, TRUE},
+  {30, 16, 170, TRUE},
 };
 
 static int game_fetch_preset(int i, char **name, game_params **params)
@@ -2472,6 +2476,26 @@ static void free_ui(game_ui *ui)
     sfree(ui);
 }
 
+static void game_changed_state(game_ui *ui, game_state *oldstate,
+                               game_state *newstate)
+{
+}
+
+struct game_drawstate {
+    int w, h, started, tilesize;
+    signed char *grid;
+    /*
+     * Items in this `grid' array have all the same values as in
+     * the game_state grid, and in addition:
+     * 
+     *         - -10 means the tile was drawn `specially' as a result of a
+     *           flash, so it will always need redrawing.
+     * 
+     *         - -22 and -23 mean the tile is highlighted for a possible
+     *           click.
+     */
+};
+
 static game_state *make_move(game_state *from, game_ui *ui, game_drawstate *ds,
                              int x, int y, int button)
 {
@@ -2487,11 +2511,12 @@ static game_state *make_move(game_state *from, game_ui *ui, game_drawstate *ds,
 
     cx = FROMCOORD(x);
     cy = FROMCOORD(y);
-    if (cx < 0 || cx >= from->w || cy < 0 || cy >= from->h)
-       return NULL;
 
     if (button == LEFT_BUTTON || button == LEFT_DRAG ||
        button == MIDDLE_BUTTON || button == MIDDLE_DRAG) {
+       if (cx < 0 || cx >= from->w || cy < 0 || cy >= from->h)
+           return NULL;
+
        /*
         * Mouse-downs and mouse-drags just cause highlighting
         * updates.
@@ -2503,6 +2528,9 @@ static game_state *make_move(game_state *from, game_ui *ui, game_drawstate *ds,
     }
 
     if (button == RIGHT_BUTTON) {
+       if (cx < 0 || cx >= from->w || cy < 0 || cy >= from->h)
+           return NULL;
+
        /*
         * Right-clicking only works on a covered square, and it
         * toggles between -1 (marked as mine) and -2 (not marked
@@ -2529,6 +2557,8 @@ static game_state *make_move(game_state *from, game_ui *ui, game_drawstate *ds,
         * At this stage we must never return NULL: we have adjusted
         * the ui, so at worst we return `from'.
         */
+       if (cx < 0 || cx >= from->w || cy < 0 || cy >= from->h)
+           return from;
 
        /*
         * Left-clicking on a covered square opens a tile. Not
@@ -2591,23 +2621,23 @@ static game_state *make_move(game_state *from, game_ui *ui, game_drawstate *ds,
  * Drawing routines.
  */
 
-struct game_drawstate {
-    int w, h, started;
-    signed char *grid;
+static void game_size(game_params *params, game_drawstate *ds,
+                      int *x, int *y, int expand)
+{
+    int tsx, tsy, ts;
     /*
-     * Items in this `grid' array have all the same values as in
-     * the game_state grid, and in addition:
-     * 
-     *         - -10 means the tile was drawn `specially' as a result of a
-     *           flash, so it will always need redrawing.
-     * 
-     *         - -22 and -23 mean the tile is highlighted for a possible
-     *           click.
+     * Each window dimension equals the tile size times 3 more than
+     * the grid dimension (the border is 3/2 the width of the
+     * tiles).
      */
-};
+    tsx = *x / (params->w + 3);
+    tsy = *y / (params->h + 3);
+    ts = min(tsx, tsy);
+    if (expand)
+        ds->tilesize = ts;
+    else
+        ds->tilesize = min(ts, PREFERRED_TILE_SIZE);
 
-static void game_size(game_params *params, int *x, int *y)
-{
     *x = BORDER * 2 + TILE_SIZE * params->w;
     *y = BORDER * 2 + TILE_SIZE * params->h;
 }
@@ -2697,6 +2727,7 @@ static game_drawstate *game_new_drawstate(game_state *state)
     ds->w = state->w;
     ds->h = state->h;
     ds->started = FALSE;
+    ds->tilesize = 0;                  /* not decided yet */
     ds->grid = snewn(ds->w * ds->h, signed char);
 
     memset(ds->grid, -99, ds->w * ds->h);
@@ -2710,7 +2741,8 @@ static void game_free_drawstate(game_drawstate *ds)
     sfree(ds);
 }
 
-static void draw_tile(frontend *fe, int x, int y, int v, int bg)
+static void draw_tile(frontend *fe, game_drawstate *ds,
+                      int x, int y, int v, int bg)
 {
     if (v < 0) {
         int coords[12];
@@ -2944,7 +2976,7 @@ static void game_redraw(frontend *fe, game_drawstate *ds, game_state *oldstate,
                v -= 20;
 
            if (ds->grid[y*ds->w+x] != v || bg != COL_BACKGROUND) {
-               draw_tile(fe, COORD(x), COORD(y), v, bg);
+               draw_tile(fe, ds, COORD(x), COORD(y), v, bg);
                ds->grid[y*ds->w+x] = (bg == COL_BACKGROUND ? v : -10);
            }
        }
@@ -3035,6 +3067,7 @@ const struct game thegame = {
     TRUE, game_text_format,
     new_ui,
     free_ui,
+    game_changed_state,
     make_move,
     game_size,
     game_colours,