#define BORDER 0.5
-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 hmul, vmul_c, vmul_g, vmul, szx, szy;
- int sz, colh, guessh;
+ double hmul, vmul_c, vmul_g, vmul;
+ int hintw = (params->npegs+1)/2;
hmul = BORDER * 2.0 + /* border */
1.0 * 2.0 + /* vertical colour bar */
1.0 * params->npegs + /* guess pegs */
PEG_GAP * params->npegs + /* guess gaps */
- PEG_HINT * ds->hintw + /* hint pegs */
- PEG_GAP * (ds->hintw - 1); /* hint gaps */
+ PEG_HINT * hintw + /* hint pegs */
+ PEG_GAP * (hintw - 1); /* hint gaps */
vmul_c = BORDER * 2.0 + /* border */
1.0 * params->ncolours + /* colour pegs */
vmul = max(vmul_c, vmul_g);
- szx = *x / hmul;
- szy = *y / vmul;
- sz = max(min((int)szx, (int)szy), 1);
- if (expand)
- ds->pegsz = sz;
- else
- ds->pegsz = min(sz, PEG_PREFER_SZ);
+ *x = (int)ceil((double)tilesize * hmul);
+ *y = (int)ceil((double)tilesize * vmul);
+}
+
+static void game_set_size(game_drawstate *ds, game_params *params,
+ int tilesize)
+{
+ int colh, guessh, x, y;
+
+ ds->pegsz = tilesize;
ds->hintsz = (int)((double)ds->pegsz * PEG_HINT);
ds->gapsz = (int)((double)ds->pegsz * PEG_GAP);
ds->pegrad = (ds->pegsz -1)/2; /* radius of peg to fit in pegsz (which is 2r+1) */
ds->hintrad = (ds->hintsz-1)/2;
- *x = (int)ceil((double)ds->pegsz * hmul);
- *y = (int)ceil((double)ds->pegsz * vmul);
- ds->w = *x; ds->h = *y;
-
colh = ((ds->pegsz + ds->gapsz) * params->ncolours) - ds->gapsz;
guessh = ((ds->pegsz + ds->gapsz) * params->nguesses); /* guesses */
guessh += ds->gapsz + ds->pegsz; /* solution */
+ game_compute_size(params, tilesize, &x, &y);
ds->colx = ds->border;
- ds->coly = (*y - colh) / 2;
+ ds->coly = (y - colh) / 2;
ds->guessx = ds->solnx = ds->border + ds->pegsz * 2; /* border + colours */
- ds->guessy = (*y - guessh) / 2;
+ ds->guessy = (y - guessh) / 2;
ds->solny = ds->guessy + ((ds->pegsz + ds->gapsz) * params->nguesses) + ds->gapsz;
- if (ds->pegsz > 0) {
- if (ds->blit_peg) blitter_free(ds->blit_peg);
- ds->blit_peg = blitter_new(ds->pegsz, ds->pegsz);
- }
+ assert(ds->pegsz > 0);
+ if (ds->blit_peg) blitter_free(ds->blit_peg);
+ ds->blit_peg = blitter_new(ds->pegsz, ds->pegsz);
}
static float *game_colours(frontend *fe, game_state *state, int *ncolours)
draw_rect(fe, cx-CGAP, cy-CGAP, PEGSZ+CGAP*2, PEGSZ+CGAP*2,
COL_BACKGROUND);
if (PEGRAD > 0) {
- draw_circle(fe, cx+PEGRAD, cy+PEGRAD, PEGRAD, 1, COL_EMPTY + col);
- draw_circle(fe, cx+PEGRAD, cy+PEGRAD, PEGRAD, 0, COL_EMPTY + col);
+ draw_circle(fe, cx+PEGRAD, cy+PEGRAD, PEGRAD,
+ COL_EMPTY + col, COL_EMPTY + col);
} else
draw_rect(fe, cx, cy, PEGSZ, PEGSZ, COL_EMPTY + col);
draw_update(fe, cx-CGAP, cy-CGAP, PEGSZ+CGAP*2, PEGSZ+CGAP*2);
static void draw_cursor(frontend *fe, game_drawstate *ds, int x, int y)
{
- draw_circle(fe, x+PEGRAD, y+PEGRAD, PEGRAD+CGAP, 0, COL_CURSOR);
+ draw_circle(fe, x+PEGRAD, y+PEGRAD, PEGRAD+CGAP, -1, COL_CURSOR);
draw_update(fe, x-CGAP, y-CGAP, PEGSZ+CGAP*2, PEGSZ+CGAP*2);
}
rowy += HINTOFF;
}
if (HINTRAD > 0) {
- draw_circle(fe, rowx+HINTRAD, rowy+HINTRAD, HINTRAD, 1, col);
- draw_circle(fe, rowx+HINTRAD, rowy+HINTRAD, HINTRAD, 0, col);
+ draw_circle(fe, rowx+HINTRAD, rowy+HINTRAD, HINTRAD, col, col);
} else {
draw_rect(fe, rowx, rowy, HINTSZ, HINTSZ, col);
}
game_changed_state,
interpret_move,
execute_move,
- game_size,
+ PEG_PREFER_SZ, game_compute_size, game_set_size,
game_colours,
game_new_drawstate,
game_free_drawstate,