X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/puzzles/blobdiff_plain/01be48b0c1057068d1b86c5ce72314de932a8dad..a1d5acfff9de3df31ef5575b2350a6c8973fb2d1:/mines.c diff --git a/mines.c b/mines.c index 7f7d316..4006294 100644 --- a/mines.c +++ b/mines.c @@ -31,7 +31,7 @@ #include "puzzles.h" enum { - COL_BACKGROUND, + COL_BACKGROUND, COL_BACKGROUND2, COL_1, COL_2, COL_3, COL_4, COL_5, COL_6, COL_7, COL_8, COL_MINE, COL_BANG, COL_CROSS, COL_FLAG, COL_FLAGBASE, COL_QUERY, COL_HIGHLIGHT, COL_LOWLIGHT, @@ -71,7 +71,7 @@ struct mine_layout { struct game_state { int w, h, n, dead, won; struct mine_layout *layout; /* real mine positions */ - char *grid; /* player knowledge */ + signed char *grid; /* player knowledge */ /* * Each item in the `grid' array is one of the following values: * @@ -560,7 +560,8 @@ static void std_add(struct squaretodo *std, int i) std->next[i] = -1; } -static void known_squares(int w, int h, struct squaretodo *std, char *grid, +static void known_squares(int w, int h, struct squaretodo *std, + signed char *grid, int (*open)(void *ctx, int x, int y), void *openctx, int x, int y, int mask, int mine) { @@ -627,9 +628,10 @@ struct perturbations { * steps were required; the exact return value is the number of * perturb calls. */ -static int minesolve(int w, int h, int n, char *grid, +static int minesolve(int w, int h, int n, signed char *grid, int (*open)(void *ctx, int x, int y), - struct perturbations *(*perturb)(void *ctx, char *grid, + struct perturbations *(*perturb)(void *ctx, + signed char *grid, int x, int y, int mask), void *ctx, random_state *rs) { @@ -1278,7 +1280,7 @@ static int minesolve(int w, int h, int n, char *grid, */ struct minectx { - char *grid; + signed char *grid; int w, h; int sx, sy; random_state *rs; @@ -1337,7 +1339,7 @@ static int squarecmp(const void *av, const void *bv) return 0; } -static struct perturbations *mineperturb(void *vctx, char *grid, +static struct perturbations *mineperturb(void *vctx, signed char *grid, int setx, int sety, int mask) { struct minectx *ctx = (struct minectx *)vctx; @@ -1657,7 +1659,7 @@ static char *minegen(int w, int h, int n, int x, int y, int unique, * We bypass this bit if we're not after a unique grid. */ if (unique) { - char *solvegrid = snewn(w*h, char); + signed char *solvegrid = snewn(w*h, char); struct minectx actx, *ctx = &actx; int solveret, prevret = -2; @@ -1803,7 +1805,7 @@ static void obfuscate_bitmap(unsigned char *bmp, int bits, int decode) static char *new_mine_layout(int w, int h, int n, int x, int y, int unique, random_state *rs, char **game_desc) { - char *grid, *ret, *p; + signed char *grid, *ret, *p; unsigned char *bmp; int i, area; @@ -1847,24 +1849,30 @@ static char *new_mine_layout(int w, int h, int n, int x, int y, int unique, } static char *new_game_desc(game_params *params, random_state *rs, - game_aux_info **aux) + game_aux_info **aux, int interactive) { -#ifdef PREOPENED - int x = random_upto(rs, params->w); - int y = random_upto(rs, params->h); - char *grid, *desc; + if (!interactive) { + /* + * For batch-generated grids, pre-open one square. + */ + int x = random_upto(rs, params->w); + int y = random_upto(rs, params->h); + signed char *grid; + char *desc; - grid = new_mine_layout(params->w, params->h, params->n, - x, y, params->unique, rs); -#else - char *rsdesc, *desc; + grid = new_mine_layout(params->w, params->h, params->n, + x, y, params->unique, rs, &desc); + sfree(grid); + return desc; + } else { + char *rsdesc, *desc; - rsdesc = random_state_encode(rs); - desc = snewn(strlen(rsdesc) + 100, char); - sprintf(desc, "r%d,%c,%s", params->n, params->unique ? 'u' : 'a', rsdesc); - sfree(rsdesc); - return desc; -#endif + rsdesc = random_state_encode(rs); + desc = snewn(strlen(rsdesc) + 100, char); + sprintf(desc, "r%d,%c,%s", params->n, params->unique ? 'u' : 'a', rsdesc); + sfree(rsdesc); + return desc; + } } static void game_free_aux_info(game_aux_info *aux) @@ -2081,6 +2089,8 @@ static game_state *new_game(midend_data *me, game_params *params, char *desc) state->layout->me = me; } else { + state->layout->rs = NULL; + state->layout->me = NULL; state->layout->mines = snewn(wh, char); x = atoi(desc); @@ -2219,8 +2229,8 @@ static void free_ui(game_ui *ui) sfree(ui); } -static game_state *make_move(game_state *from, game_ui *ui, int x, int y, - int button) +static game_state *make_move(game_state *from, game_ui *ui, game_drawstate *ds, + int x, int y, int button) { game_state *ret; int cx, cy; @@ -2331,7 +2341,7 @@ static game_state *make_move(game_state *from, game_ui *ui, int x, int y, struct game_drawstate { int w, h, started; - char *grid; + signed char *grid; /* * Items in this `grid' array have all the same values as in * the game_state grid, and in addition: @@ -2356,6 +2366,10 @@ static float *game_colours(frontend *fe, game_state *state, int *ncolours) frontend_default_colour(fe, &ret[COL_BACKGROUND * 3]); + ret[COL_BACKGROUND2 * 3 + 0] = ret[COL_BACKGROUND * 3 + 0] * 19.0 / 20.0; + ret[COL_BACKGROUND2 * 3 + 1] = ret[COL_BACKGROUND * 3 + 1] * 19.0 / 20.0; + ret[COL_BACKGROUND2 * 3 + 2] = ret[COL_BACKGROUND * 3 + 2] * 19.0 / 20.0; + ret[COL_1 * 3 + 0] = 0.0F; ret[COL_1 * 3 + 1] = 0.0F; ret[COL_1 * 3 + 2] = 1.0F; @@ -2456,7 +2470,8 @@ static void draw_tile(frontend *fe, int x, int y, int v, int bg) /* * Omit the highlights in this case. */ - draw_rect(fe, x, y, TILE_SIZE, TILE_SIZE, bg); + draw_rect(fe, x, y, TILE_SIZE, TILE_SIZE, + bg == COL_BACKGROUND ? COL_BACKGROUND2 : bg); draw_line(fe, x, y, x + TILE_SIZE - 1, y, COL_LOWLIGHT); draw_line(fe, x, y, x, y + TILE_SIZE - 1, COL_LOWLIGHT); } else { @@ -2524,7 +2539,8 @@ static void draw_tile(frontend *fe, int x, int y, int v, int bg) * on), we clear the square to COL_BANG. */ draw_rect(fe, x, y, TILE_SIZE, TILE_SIZE, - (v == 65 ? COL_BANG : bg)); + (v == 65 ? COL_BANG : + bg == COL_BACKGROUND ? COL_BACKGROUND2 : bg)); draw_line(fe, x, y, x + TILE_SIZE - 1, y, COL_LOWLIGHT); draw_line(fe, x, y, x, y + TILE_SIZE - 1, COL_LOWLIGHT);