~mdw
/
sgt
/
puzzles
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Remove debug output.
[sgt/puzzles]
/
pattern.c
diff --git
a/pattern.c
b/pattern.c
index
a728e15
..
523374d
100644
(file)
--- a/
pattern.c
+++ b/
pattern.c
@@
-11,9
+11,6
@@
#include "puzzles.h"
#include "puzzles.h"
-#define max(x,y) ( (x)>(y) ? (x):(y) )
-#define min(x,y) ( (x)<(y) ? (x):(y) )
-
enum {
COL_BACKGROUND,
COL_EMPTY,
enum {
COL_BACKGROUND,
COL_EMPTY,
@@
-23,15
+20,17
@@
enum {
NCOLOURS
};
NCOLOURS
};
-#define BORDER 18
+#define PREFERRED_TILE_SIZE 24
+#define TILE_SIZE (ds->tilesize)
+#define BORDER (3 * TILE_SIZE / 4)
#define TLBORDER(d) ( (d) / 5 + 2 )
#define TLBORDER(d) ( (d) / 5 + 2 )
-#define GUTTER 12
-#define TILE_SIZE 24
+#define GUTTER (TILE_SIZE / 2)
#define FROMCOORD(d, x) \
( ((x) - (BORDER + GUTTER + TILE_SIZE * TLBORDER(d))) / TILE_SIZE )
#define SIZE(d) (2*BORDER + GUTTER + TILE_SIZE * (TLBORDER(d) + (d)))
#define FROMCOORD(d, x) \
( ((x) - (BORDER + GUTTER + TILE_SIZE * TLBORDER(d))) / TILE_SIZE )
#define SIZE(d) (2*BORDER + GUTTER + TILE_SIZE * (TLBORDER(d) + (d)))
+#define GETTILESIZE(d, w) (w / (2 + TLBORDER(d) + (d)))
#define TOCOORD(d, x) (BORDER + GUTTER + TILE_SIZE * (TLBORDER(d) + (x)))
#define TOCOORD(d, x) (BORDER + GUTTER + TILE_SIZE * (TLBORDER(d) + (x)))
@@
-62,24
+61,26
@@
static game_params *default_params(void)
return ret;
}
return ret;
}
+static const struct game_params pattern_presets[] = {
+ {10, 10},
+ {15, 15},
+ {20, 20},
+#ifndef SLOW_SYSTEM
+ {25, 25},
+ {30, 30},
+#endif
+};
+
static int game_fetch_preset(int i, char **name, game_params **params)
{
game_params *ret;
char str[80];
static int game_fetch_preset(int i, char **name, game_params **params)
{
game_params *ret;
char str[80];
- static const struct { int x, y; } values[] = {
- {10, 10},
- {15, 15},
- {20, 20},
- {25, 25},
- {30, 30},
- };
-
- if (i < 0 || i >= lenof(values))
+
+ if (i < 0 || i >= lenof(pattern_presets))
return FALSE;
ret = snew(game_params);
return FALSE;
ret = snew(game_params);
- ret->w = values[i].x;
- ret->h = values[i].y;
+ *ret = pattern_presets[i];
sprintf(str, "%dx%d", ret->w, ret->h);
sprintf(str, "%dx%d", ret->w, ret->h);
@@
-100,9
+101,8
@@
static game_params *dup_params(game_params *params)
return ret;
}
return ret;
}
-static
game_params *decode_params(
char const *string)
+static
void decode_params(game_params *ret,
char const *string)
{
{
- game_params *ret = default_params();
char const *p = string;
ret->w = atoi(p);
char const *p = string;
ret->w = atoi(p);
@@
-114,11
+114,9
@@
static game_params *decode_params(char const *string)
} else {
ret->h = ret->w;
}
} else {
ret->h = ret->w;
}
-
- return ret;
}
}
-static char *encode_params(game_params *params)
+static char *encode_params(game_params *params
, int full
)
{
char ret[400];
int len;
{
char ret[400];
int len;
@@
-169,12
+167,8
@@
static game_params *custom_params(config_item *cfg)
static char *validate_params(game_params *params)
{
static char *validate_params(game_params *params)
{
- if (params->w <= 0
&&
params->h <= 0)
+ if (params->w <= 0
||
params->h <= 0)
return "Width and height must both be greater than zero";
return "Width and height must both be greater than zero";
- if (params->w <= 0)
- return "Width must be greater than zero";
- if (params->h <= 0)
- return "Height must be greater than zero";
return NULL;
}
return NULL;
}
@@
-477,13
+471,13
@@
struct game_aux_info {
unsigned char *grid;
};
unsigned char *grid;
};
-static char *new_game_
seed
(game_params *params, random_state *rs,
- game_aux_info **aux)
+static char *new_game_
desc
(game_params *params, random_state *rs,
+ game_aux_info **aux
, int interactive
)
{
unsigned char *grid;
int i, j, max, rowlen, *rowdata;
{
unsigned char *grid;
int i, j, max, rowlen, *rowdata;
- char intbuf[80], *
seed
;
- int
seedlen, seed
pos;
+ char intbuf[80], *
desc
;
+ int
desclen, desc
pos;
grid = generate_soluble(rs, params->w, params->h);
max = max(params->w, params->h);
grid = generate_soluble(rs, params->w, params->h);
max = max(params->w, params->h);
@@
-497,8
+491,7
@@
static char *new_game_seed(game_params *params, random_state *rs,
ai->w = params->w;
ai->h = params->h;
ai->w = params->w;
ai->h = params->h;
- ai->grid = snewn(ai->w * ai->h, unsigned char);
- memcpy(ai->grid, grid, ai->w * ai->h);
+ ai->grid = grid;
*aux = ai;
}
*aux = ai;
}
@@
-513,7
+506,7
@@
static char *new_game_seed(game_params *params, random_state *rs,
* passes, first computing the seed size and then writing it
* out.
*/
* passes, first computing the seed size and then writing it
* out.
*/
-
seed
len = 0;
+
desc
len = 0;
for (i = 0; i < params->w + params->h; i++) {
if (i < params->w)
rowlen = compute_rowdata(rowdata, grid+i, params->h, params->w);
for (i = 0; i < params->w + params->h; i++) {
if (i < params->w)
rowlen = compute_rowdata(rowdata, grid+i, params->h, params->w);
@@
-522,14
+515,14
@@
static char *new_game_seed(game_params *params, random_state *rs,
params->w, 1);
if (rowlen > 0) {
for (j = 0; j < rowlen; j++) {
params->w, 1);
if (rowlen > 0) {
for (j = 0; j < rowlen; j++) {
-
seed
len += 1 + sprintf(intbuf, "%d", rowdata[j]);
+
desc
len += 1 + sprintf(intbuf, "%d", rowdata[j]);
}
} else {
}
} else {
-
seed
len++;
+
desc
len++;
}
}
}
}
-
seed = snewn(seed
len, char);
-
seed
pos = 0;
+
desc = snewn(desc
len, char);
+
desc
pos = 0;
for (i = 0; i < params->w + params->h; i++) {
if (i < params->w)
rowlen = compute_rowdata(rowdata, grid+i, params->h, params->w);
for (i = 0; i < params->w + params->h; i++) {
if (i < params->w)
rowlen = compute_rowdata(rowdata, grid+i, params->h, params->w);
@@
-538,22
+531,22
@@
static char *new_game_seed(game_params *params, random_state *rs,
params->w, 1);
if (rowlen > 0) {
for (j = 0; j < rowlen; j++) {
params->w, 1);
if (rowlen > 0) {
for (j = 0; j < rowlen; j++) {
- int len = sprintf(
seed+seed
pos, "%d", rowdata[j]);
+ int len = sprintf(
desc+desc
pos, "%d", rowdata[j]);
if (j+1 < rowlen)
if (j+1 < rowlen)
-
seed[seed
pos + len] = '.';
+
desc[desc
pos + len] = '.';
else
else
-
seed[seed
pos + len] = '/';
-
seed
pos += len+1;
+
desc[desc
pos + len] = '/';
+
desc
pos += len+1;
}
} else {
}
} else {
-
seed[seed
pos++] = '/';
+
desc[desc
pos++] = '/';
}
}
}
}
- assert(
seedpos == seed
len);
- assert(
seed[seed
len-1] == '/');
-
seed[seed
len-1] = '\0';
+ assert(
descpos == desc
len);
+ assert(
desc[desc
len-1] == '/');
+
desc[desc
len-1] = '\0';
sfree(rowdata);
sfree(rowdata);
- return
seed
;
+ return
desc
;
}
static void game_free_aux_info(game_aux_info *aux)
}
static void game_free_aux_info(game_aux_info *aux)
@@
-562,7
+555,7
@@
static void game_free_aux_info(game_aux_info *aux)
sfree(aux);
}
sfree(aux);
}
-static char *validate_
seed(game_params *params, char *seed
)
+static char *validate_
desc(game_params *params, char *desc
)
{
int i, n, rowspace;
char *p;
{
int i, n, rowspace;
char *p;
@@
-573,10
+566,10
@@
static char *validate_seed(game_params *params, char *seed)
else
rowspace = params->w + 1;
else
rowspace = params->w + 1;
- if (*
seed && isdigit((unsigned char)*seed
)) {
+ if (*
desc && isdigit((unsigned char)*desc
)) {
do {
do {
- p =
seed
;
- while (
seed && isdigit((unsigned char)*seed)) seed
++;
+ p =
desc
;
+ while (
desc && isdigit((unsigned char)*desc)) desc
++;
n = atoi(p);
rowspace -= n+1;
n = atoi(p);
rowspace -= n+1;
@@
-586,15
+579,15
@@
static char *validate_seed(game_params *params, char *seed)
else
return "at least one row contains more numbers than will fit";
}
else
return "at least one row contains more numbers than will fit";
}
- } while (*
seed
++ == '.');
+ } while (*
desc
++ == '.');
} else {
} else {
-
seed
++; /* expect a slash immediately */
+
desc
++; /* expect a slash immediately */
}
}
- if (
seed
[-1] == '/') {
+ if (
desc
[-1] == '/') {
if (i+1 == params->w + params->h)
return "too many row/column specifications";
if (i+1 == params->w + params->h)
return "too many row/column specifications";
- } else if (
seed
[-1] == '\0') {
+ } else if (
desc
[-1] == '\0') {
if (i+1 < params->w + params->h)
return "too few row/column specifications";
} else
if (i+1 < params->w + params->h)
return "too few row/column specifications";
} else
@@
-604,7
+597,7
@@
static char *validate_seed(game_params *params, char *seed)
return NULL;
}
return NULL;
}
-static game_state *new_game(
game_params *params, char *seed
)
+static game_state *new_game(
midend_data *me, game_params *params, char *desc
)
{
int i;
char *p;
{
int i;
char *p;
@@
-624,15
+617,15
@@
static game_state *new_game(game_params *params, char *seed)
for (i = 0; i < params->w + params->h; i++) {
state->rowlen[i] = 0;
for (i = 0; i < params->w + params->h; i++) {
state->rowlen[i] = 0;
- if (*
seed && isdigit((unsigned char)*seed
)) {
+ if (*
desc && isdigit((unsigned char)*desc
)) {
do {
do {
- p =
seed
;
- while (
seed && isdigit((unsigned char)*seed)) seed
++;
+ p =
desc
;
+ while (
desc && isdigit((unsigned char)*desc)) desc
++;
state->rowdata[state->rowsize * i + state->rowlen[i]++] =
atoi(p);
state->rowdata[state->rowsize * i + state->rowlen[i]++] =
atoi(p);
- } while (*
seed
++ == '.');
+ } while (*
desc
++ == '.');
} else {
} else {
-
seed
++; /* expect a slash immediately */
+
desc
++; /* expect a slash immediately */
}
}
}
}
@@
-767,11
+760,24
@@
static void free_ui(game_ui *ui)
sfree(ui);
}
sfree(ui);
}
-static
game_state *make_move(game_state *from, game_ui *ui
,
-
int x, int y, int button
)
+static
void game_changed_state(game_ui *ui, game_state *oldstate
,
+
game_state *newstate
)
{
{
+}
+
+struct game_drawstate {
+ int started;
+ int w, h;
+ int tilesize;
+ unsigned char *visible;
+};
+
+static game_state *make_move(game_state *from, game_ui *ui, game_drawstate *ds,
+ int x, int y, int button) {
game_state *ret;
game_state *ret;
+ button &= ~MOD_MASK;
+
x = FROMCOORD(from->w, x);
y = FROMCOORD(from->h, y);
x = FROMCOORD(from->w, x);
y = FROMCOORD(from->h, y);
@@
-898,14
+904,17
@@
static game_state *make_move(game_state *from, game_ui *ui,
* Drawing routines.
*/
* Drawing routines.
*/
-struct game_drawstate {
- int started;
- int w, h;
- unsigned char *visible;
-};
-
-static void game_size(game_params *params, int *x, int *y)
+static void game_size(game_params *params, game_drawstate *ds,
+ int *x, int *y, int expand)
{
{
+ int ts;
+
+ ts = min(GETTILESIZE(params->w, *x), GETTILESIZE(params->h, *y));
+ if (expand)
+ ds->tilesize = ts;
+ else
+ ds->tilesize = min(ts, PREFERRED_TILE_SIZE);
+
*x = SIZE(params->w);
*y = SIZE(params->h);
}
*x = SIZE(params->w);
*y = SIZE(params->h);
}
@@
-944,6
+953,7
@@
static game_drawstate *game_new_drawstate(game_state *state)
ds->w = state->w;
ds->h = state->h;
ds->visible = snewn(ds->w * ds->h, unsigned char);
ds->w = state->w;
ds->h = state->h;
ds->visible = snewn(ds->w * ds->h, unsigned char);
+ ds->tilesize = 0; /* not decided yet */
memset(ds->visible, 255, ds->w * ds->h);
return ds;
memset(ds->visible, 255, ds->w * ds->h);
return ds;
@@
-978,8
+988,8
@@
static void grid_square(frontend *fe, game_drawstate *ds,
}
static void game_redraw(frontend *fe, game_drawstate *ds, game_state *oldstate,
}
static void game_redraw(frontend *fe, game_drawstate *ds, game_state *oldstate,
- game_state *state, int dir, game_ui *ui,
- float animtime, float flashtime)
+
game_state *state, int dir, game_ui *ui,
+
float animtime, float flashtime)
{
int i, j;
int x1, x2, y1, y2;
{
int i, j;
int x1, x2, y1, y2;
@@
-1087,13
+1097,13
@@
static void game_redraw(frontend *fe, game_drawstate *ds, game_state *oldstate,
}
static float game_anim_length(game_state *oldstate,
}
static float game_anim_length(game_state *oldstate,
- game_state *newstate, int dir)
+ game_state *newstate, int dir
, game_ui *ui
)
{
return 0.0F;
}
static float game_flash_length(game_state *oldstate,
{
return 0.0F;
}
static float game_flash_length(game_state *oldstate,
- game_state *newstate, int dir)
+ game_state *newstate, int dir
, game_ui *ui
)
{
if (!oldstate->completed && newstate->completed &&
!oldstate->cheated && !newstate->cheated)
{
if (!oldstate->completed && newstate->completed &&
!oldstate->cheated && !newstate->cheated)
@@
-1106,6
+1116,11
@@
static int game_wants_statusbar(void)
return FALSE;
}
return FALSE;
}
+static int game_timing_state(game_state *state)
+{
+ return TRUE;
+}
+
#ifdef COMBINED
#define thegame pattern
#endif
#ifdef COMBINED
#define thegame pattern
#endif
@@
-1120,9
+1135,9
@@
const struct game thegame = {
dup_params,
TRUE, game_configure, custom_params,
validate_params,
dup_params,
TRUE, game_configure, custom_params,
validate_params,
- new_game_
seed
,
+ new_game_
desc
,
game_free_aux_info,
game_free_aux_info,
- validate_
seed
,
+ validate_
desc
,
new_game,
dup_game,
free_game,
new_game,
dup_game,
free_game,
@@
-1130,6
+1145,7
@@
const struct game thegame = {
FALSE, game_text_format,
new_ui,
free_ui,
FALSE, game_text_format,
new_ui,
free_ui,
+ game_changed_state,
make_move,
game_size,
game_colours,
make_move,
game_size,
game_colours,
@@
-1139,6
+1155,8
@@
const struct game thegame = {
game_anim_length,
game_flash_length,
game_wants_statusbar,
game_anim_length,
game_flash_length,
game_wants_statusbar,
+ FALSE, game_timing_state,
+ 0, /* mouse_priorities */
};
#ifdef STANDALONE_SOLVER
};
#ifdef STANDALONE_SOLVER
@@
-1183,7
+1201,7
@@
int main(int argc, char **argv)
game_params *p;
game_state *s;
int recurse = TRUE;
game_params *p;
game_state *s;
int recurse = TRUE;
- char *id = NULL, *
seed
, *err;
+ char *id = NULL, *
desc
, *err;
int y, x;
int grade = FALSE;
int y, x;
int grade = FALSE;
@@
-1202,20
+1220,21
@@
int main(int argc, char **argv)
return 1;
}
return 1;
}
-
seed
= strchr(id, ':');
- if (!
seed
) {
+
desc
= strchr(id, ':');
+ if (!
desc
) {
fprintf(stderr, "%s: game id expects a colon in it\n", argv[0]);
return 1;
}
fprintf(stderr, "%s: game id expects a colon in it\n", argv[0]);
return 1;
}
- *
seed
++ = '\0';
+ *
desc
++ = '\0';
- p = decode_params(id);
- err = validate_seed(p, seed);
+ p = default_params();
+ decode_params(p, id);
+ err = validate_desc(p, desc);
if (err) {
fprintf(stderr, "%s: %s\n", argv[0], err);
return 1;
}
if (err) {
fprintf(stderr, "%s: %s\n", argv[0], err);
return 1;
}
- s = new_game(
p, seed
);
+ s = new_game(
NULL, p, desc
);
{
int w = p->w, h = p->h, i, j, done_any, max;
{
int w = p->w, h = p->h, i, j, done_any, max;