~mdw
/
sgt
/
puzzles
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
missing `i' in `\e'
[sgt/puzzles]
/
guess.c
diff --git
a/guess.c
b/guess.c
index
12d8b1b
..
0984d24
100644
(file)
--- a/
guess.c
+++ b/
guess.c
@@
-212,7
+212,7
@@
static game_params *custom_params(config_item *cfg)
return ret;
}
return ret;
}
-static char *validate_params(game_params *params)
+static char *validate_params(game_params *params
, int full
)
{
if (params->ncolours < 2 || params->npegs < 2)
return "Trivial solutions are uninteresting";
{
if (params->ncolours < 2 || params->npegs < 2)
return "Trivial solutions are uninteresting";
@@
-768,7
+768,8
@@
static game_state *execute_move(game_state *from, char *move)
for (i = 0; i < from->solution->npegs; i++) {
int val = atoi(p);
for (i = 0; i < from->solution->npegs; i++) {
int val = atoi(p);
- if (val <= 0 || val > from->params.ncolours) {
+ int min_colour = from->params.allow_blank? 0 : 1;
+ if (val < min_colour || val > from->params.ncolours) {
free_game(ret);
return NULL;
}
free_game(ret);
return NULL;
}
@@
-805,18
+806,18
@@
static game_state *execute_move(game_state *from, char *move)
#define BORDER 0.5
#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 */
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_c = BORDER * 2.0 + /* border */
1.0 * params->ncolours + /* colour pegs */
@@
-828,13
+829,16
@@
static void game_size(game_params *params, game_drawstate *ds,
vmul = max(vmul_c, vmul_g);
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;
+
+ ds->pegsz = tilesize;
ds->hintsz = (int)((double)ds->pegsz * PEG_HINT);
ds->gapsz = (int)((double)ds->pegsz * PEG_GAP);
ds->hintsz = (int)((double)ds->pegsz * PEG_HINT);
ds->gapsz = (int)((double)ds->pegsz * PEG_GAP);
@@
-843,25
+847,21
@@
static void game_size(game_params *params, game_drawstate *ds,
ds->pegrad = (ds->pegsz -1)/2; /* radius of peg to fit in pegsz (which is 2r+1) */
ds->hintrad = (ds->hintsz-1)/2;
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 */
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, &ds->w, &ds->h);
ds->colx = ds->border;
ds->colx = ds->border;
- ds->coly = (
*y
- colh) / 2;
+ ds->coly = (
ds->h
- colh) / 2;
ds->guessx = ds->solnx = ds->border + ds->pegsz * 2; /* border + colours */
ds->guessx = ds->solnx = ds->border + ds->pegsz * 2; /* border + colours */
- ds->guessy = (
*y
- guessh) / 2;
+ ds->guessy = (
ds->h
- guessh) / 2;
ds->solny = ds->guessy + ((ds->pegsz + ds->gapsz) * params->nguesses) + ds->gapsz;
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)
}
static float *game_colours(frontend *fe, game_state *state, int *ncolours)
@@
-1021,8
+1021,8
@@
static void draw_peg(frontend *fe, game_drawstate *ds, int cx, int cy,
draw_rect(fe, cx-CGAP, cy-CGAP, PEGSZ+CGAP*2, PEGSZ+CGAP*2,
COL_BACKGROUND);
if (PEGRAD > 0) {
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);
} else
draw_rect(fe, cx, cy, PEGSZ, PEGSZ, COL_EMPTY + col);
draw_update(fe, cx-CGAP, cy-CGAP, PEGSZ+CGAP*2, PEGSZ+CGAP*2);
@@
-1030,7
+1030,7
@@
static void draw_peg(frontend *fe, game_drawstate *ds, int cx, int cy,
static void draw_cursor(frontend *fe, game_drawstate *ds, int x, int y)
{
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);
}
draw_update(fe, x-CGAP, y-CGAP, PEGSZ+CGAP*2, PEGSZ+CGAP*2);
}
@@
-1129,8
+1129,7
@@
static void hint_redraw(frontend *fe, game_drawstate *ds, int guess,
rowy += HINTOFF;
}
if (HINTRAD > 0) {
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);
}
} else {
draw_rect(fe, rowx, rowy, HINTSZ, HINTSZ, col);
}
@@
-1264,7
+1263,7
@@
static int game_wants_statusbar(void)
return FALSE;
}
return FALSE;
}
-static int game_timing_state(game_state *state)
+static int game_timing_state(game_state *state
, game_ui *ui
)
{
return TRUE;
}
{
return TRUE;
}
@@
-1297,7
+1296,7
@@
const struct game thegame = {
game_changed_state,
interpret_move,
execute_move,
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,
game_colours,
game_new_drawstate,
game_free_drawstate,