X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/puzzles/blobdiff_plain/871bf2946c5cbfdc7621c4b3d6850af0699297a0..a4c9750f8f338b67f47b13cacfc882b4f7c8479b:/twiddle.c diff --git a/twiddle.c b/twiddle.c index fc12411..2f33fb7 100644 --- a/twiddle.c +++ b/twiddle.c @@ -209,7 +209,7 @@ static game_params *custom_params(config_item *cfg) return ret; } -static char *validate_params(game_params *params) +static char *validate_params(game_params *params, int full) { if (params->n < 2) return "Rotation radius must be at least two"; @@ -744,52 +744,32 @@ static game_state *execute_move(game_state *from, char *move) * Drawing routines. */ -static void game_size(game_params *params, game_drawstate *ds, - int *x, int *y, int expand) +static void game_compute_size(game_params *params, int tilesize, + int *x, int *y) { - double tsx, tsy, ts; - /* - * Each window dimension equals the tile size times one more - * than the grid dimension (the border is half the width of the - * tiles). - */ - tsx = (double)*x / ((double)params->w + 1.0); - tsy = (double)*y / ((double)params->h + 1.0); - ts = min(tsx, tsy); - if (expand) - ds->tilesize = (int)(ts + 0.5); - else - ds->tilesize = min((int)ts, PREFERRED_TILE_SIZE); + /* Ick: fake up `ds->tilesize' for macro expansion purposes */ + struct { int tilesize; } ads, *ds = &ads; + ads.tilesize = tilesize; *x = TILE_SIZE * params->w + 2 * BORDER; *y = TILE_SIZE * params->h + 2 * BORDER; } +static void game_set_size(game_drawstate *ds, game_params *params, + int tilesize) +{ + ds->tilesize = tilesize; +} + static float *game_colours(frontend *fe, game_state *state, int *ncolours) { float *ret = snewn(3 * NCOLOURS, float); int i; - float max; - - frontend_default_colour(fe, &ret[COL_BACKGROUND * 3]); - /* - * Drop the background colour so that the highlight is - * noticeably brighter than it while still being under 1. - */ - max = ret[COL_BACKGROUND*3]; - for (i = 1; i < 3; i++) - if (ret[COL_BACKGROUND*3+i] > max) - max = ret[COL_BACKGROUND*3+i]; - if (max * 1.2F > 1.0F) { - for (i = 0; i < 3; i++) - ret[COL_BACKGROUND*3+i] /= (max * 1.2F); - } + game_mkhighlight(fe, ret, COL_BACKGROUND, COL_HIGHLIGHT, COL_LOWLIGHT); for (i = 0; i < 3; i++) { - ret[COL_HIGHLIGHT * 3 + i] = ret[COL_BACKGROUND * 3 + i] * 1.2F; ret[COL_HIGHLIGHT_GENTLE * 3 + i] = ret[COL_BACKGROUND * 3 + i] * 1.1F; - ret[COL_LOWLIGHT * 3 + i] = ret[COL_BACKGROUND * 3 + i] * 0.8F; ret[COL_LOWLIGHT_GENTLE * 3 + i] = ret[COL_BACKGROUND * 3 + i] * 0.9F; ret[COL_TEXT * 3 + i] = 0.0; } @@ -880,29 +860,29 @@ static void draw_tile(frontend *fe, game_drawstate *ds, game_state *state, coords[2] = x + TILE_SIZE - 1; coords[3] = y; rotate(coords+2, rot); - draw_polygon(fe, coords, 3, TRUE, rot ? rot->rc : COL_LOWLIGHT); - draw_polygon(fe, coords, 3, FALSE, rot ? rot->rc : COL_LOWLIGHT); + draw_polygon(fe, coords, 3, rot ? rot->rc : COL_LOWLIGHT, + rot ? rot->rc : COL_LOWLIGHT); /* Bottom side. */ coords[2] = x; coords[3] = y + TILE_SIZE - 1; rotate(coords+2, rot); - draw_polygon(fe, coords, 3, TRUE, rot ? rot->bc : COL_LOWLIGHT); - draw_polygon(fe, coords, 3, FALSE, rot ? rot->bc : COL_LOWLIGHT); + draw_polygon(fe, coords, 3, rot ? rot->bc : COL_LOWLIGHT, + rot ? rot->bc : COL_LOWLIGHT); /* Left side. */ coords[0] = x; coords[1] = y; rotate(coords+0, rot); - draw_polygon(fe, coords, 3, TRUE, rot ? rot->lc : COL_HIGHLIGHT); - draw_polygon(fe, coords, 3, FALSE, rot ? rot->lc : COL_HIGHLIGHT); + draw_polygon(fe, coords, 3, rot ? rot->lc : COL_HIGHLIGHT, + rot ? rot->lc : COL_HIGHLIGHT); /* Top side. */ coords[2] = x + TILE_SIZE - 1; coords[3] = y; rotate(coords+2, rot); - draw_polygon(fe, coords, 3, TRUE, rot ? rot->tc : COL_HIGHLIGHT); - draw_polygon(fe, coords, 3, FALSE, rot ? rot->tc : COL_HIGHLIGHT); + draw_polygon(fe, coords, 3, rot ? rot->tc : COL_HIGHLIGHT, + rot ? rot->tc : COL_HIGHLIGHT); /* * Now the main blank area in the centre of the tile. @@ -920,8 +900,7 @@ static void draw_tile(frontend *fe, game_drawstate *ds, game_state *state, coords[6] = x + TILE_SIZE - 1 - HIGHLIGHT_WIDTH; coords[7] = y + HIGHLIGHT_WIDTH; rotate(coords+6, rot); - draw_polygon(fe, coords, 4, TRUE, flash_colour); - draw_polygon(fe, coords, 4, FALSE, flash_colour); + draw_polygon(fe, coords, 4, flash_colour, flash_colour); } else { draw_rect(fe, x + HIGHLIGHT_WIDTH, y + HIGHLIGHT_WIDTH, TILE_SIZE - 2*HIGHLIGHT_WIDTH, TILE_SIZE - 2*HIGHLIGHT_WIDTH, @@ -967,8 +946,7 @@ static void draw_tile(frontend *fe, game_drawstate *ds, game_state *state, coords[4] = cx - displ * ydx; coords[5] = cy - displ * ydy; rotate(coords+4, rot); - draw_polygon(fe, coords, 3, TRUE, COL_LOWLIGHT_GENTLE); - draw_polygon(fe, coords, 3, FALSE, COL_LOWLIGHT_GENTLE); + draw_polygon(fe, coords, 3, COL_LOWLIGHT_GENTLE, COL_LOWLIGHT_GENTLE); } coords[0] = x + TILE_SIZE/2; @@ -1082,13 +1060,11 @@ static void game_redraw(frontend *fe, game_drawstate *ds, game_state *oldstate, coords[9] = COORD(state->h) + HIGHLIGHT_WIDTH - 1; coords[6] = coords[8] + TILE_SIZE; coords[7] = coords[9] - TILE_SIZE; - draw_polygon(fe, coords, 5, TRUE, COL_HIGHLIGHT); - draw_polygon(fe, coords, 5, FALSE, COL_HIGHLIGHT); + draw_polygon(fe, coords, 5, COL_HIGHLIGHT, COL_HIGHLIGHT); coords[1] = COORD(0) - HIGHLIGHT_WIDTH; coords[0] = COORD(0) - HIGHLIGHT_WIDTH; - draw_polygon(fe, coords, 5, TRUE, COL_LOWLIGHT); - draw_polygon(fe, coords, 5, FALSE, COL_LOWLIGHT); + draw_polygon(fe, coords, 5, COL_LOWLIGHT, COL_LOWLIGHT); ds->started = TRUE; } @@ -1199,7 +1175,7 @@ static int game_wants_statusbar(void) return TRUE; } -static int game_timing_state(game_state *state) +static int game_timing_state(game_state *state, game_ui *ui) { return TRUE; } @@ -1232,7 +1208,7 @@ const struct game thegame = { game_changed_state, interpret_move, execute_move, - game_size, + PREFERRED_TILE_SIZE, game_compute_size, game_set_size, game_colours, game_new_drawstate, game_free_drawstate,