X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/puzzles/blobdiff_plain/4a9957b631033dd550ade368dddad95fbc9d115d..e1f3c70792cacbc9f081f56294b132d9ffbd71f0:/puzzles.h diff --git a/puzzles.h b/puzzles.h index f2ef978..c9cca05 100644 --- a/puzzles.h +++ b/puzzles.h @@ -184,11 +184,14 @@ void draw_polygon(drawing *dr, int *coords, int npoints, int fillcolour, int outlinecolour); void draw_circle(drawing *dr, int cx, int cy, int radius, int fillcolour, int outlinecolour); +void draw_thick_line(drawing *dr, float thickness, + float x1, float y1, float x2, float y2, int colour); void clip(drawing *dr, int x, int y, int w, int h); void unclip(drawing *dr); void start_draw(drawing *dr); void draw_update(drawing *dr, int x, int y, int w, int h); void end_draw(drawing *dr); +char *text_fallback(drawing *dr, const char *const *strings, int nstrings); void status_bar(drawing *dr, char *text); blitter *blitter_new(drawing *dr, int w, int h); void blitter_free(drawing *dr, blitter *bl); @@ -217,6 +220,7 @@ int print_rgb_grey_colour(drawing *dr, float r, float g, float b, float grey); int print_rgb_hatched_colour(drawing *dr, float r, float g, float b, int hatch); void print_line_width(drawing *dr, int width); +void print_line_dotted(drawing *dr, int dotted); /* * midend.c @@ -249,6 +253,9 @@ char *midend_get_game_id(midend *me); int midend_can_format_as_text_now(midend *me); char *midend_text_format(midend *me); char *midend_solve(midend *me); +int midend_status(midend *me); +int midend_can_undo(midend *me); +int midend_can_redo(midend *me); void midend_supersede_game_desc(midend *me, char *desc, char *privdesc); char *midend_rewrite_statusbar(midend *me, char *text); void midend_serialise(midend *me, @@ -259,6 +266,7 @@ char *midend_deserialise(midend *me, void *rctx); /* Printing functions supplied by the mid-end */ char *midend_print_puzzle(midend *me, document *doc, int with_soln); +int midend_tilesize(midend *me); /* * malloc.c @@ -301,10 +309,14 @@ void shuffle(void *array, int nelts, int eltsize, random_state *rs); void draw_rect_outline(drawing *dr, int x, int y, int w, int h, int colour); +/* Draw a set of rectangle corners (e.g. for a cursor display). */ +void draw_rect_corners(drawing *dr, int cx, int cy, int r, int col); + void move_cursor(int button, int *x, int *y, int maxw, int maxh, int wrap); /* Used in netslide.c and sixteen.c for cursor movement around edge. */ int c2pos(int w, int h, int cx, int cy); +int c2diff(int w, int h, int cx, int cy, int button); void pos2c(int w, int h, int pos, int *cx, int *cy); /* Draws text with an 'outline' formed by offsetting the text @@ -336,6 +348,49 @@ void dsf_merge(int *dsf, int v1, int v2); void dsf_init(int *dsf, int len); /* + * tdq.c + */ + +/* + * Data structure implementing a 'to-do queue', a simple + * de-duplicating to-do list mechanism. + * + * Specification: a tdq is a queue which can hold integers from 0 to + * n-1, where n was some constant specified at tdq creation time. No + * integer may appear in the queue's current contents more than once; + * an attempt to add an already-present integer again will do nothing, + * so that that integer is removed from the queue at the position + * where it was _first_ inserted. The add and remove operations take + * constant time. + * + * The idea is that you might use this in applications like solvers: + * keep a tdq listing the indices of grid squares that you currently + * need to process in some way. Whenever you modify a square in a way + * that will require you to re-scan its neighbours, add them to the + * list with tdq_add; meanwhile you're constantly taking elements off + * the list when you need another square to process. In solvers where + * deductions are mostly localised, this should prevent repeated + * O(N^2) loops over the whole grid looking for something to do. (But + * if only _most_ of the deductions are localised, then you should + * respond to an empty to-do list by re-adding everything using + * tdq_fill, so _then_ you rescan the whole grid looking for newly + * enabled non-local deductions. Only if you've done that and emptied + * the list again finding nothing new to do are you actually done.) + */ +typedef struct tdq tdq; +tdq *tdq_new(int n); +void tdq_free(tdq *tdq); +void tdq_add(tdq *tdq, int k); +int tdq_remove(tdq *tdq); /* returns -1 if nothing available */ +void tdq_fill(tdq *tdq); /* add everything to the tdq at once */ + +/* + * laydomino.c + */ +int *domino_layout(int w, int h, random_state *rs); +void domino_layout_prealloc(int w, int h, random_state *rs, + int *grid, int *grid2, int *list); +/* * version.c */ extern char ver[]; @@ -444,8 +499,8 @@ struct game { void (*decode_ui)(game_ui *ui, char *encoding); void (*changed_state)(game_ui *ui, game_state *oldstate, game_state *newstate); - char *(*interpret_move)(game_state *state, game_ui *ui, game_drawstate *ds, - int x, int y, int button); + char *(*interpret_move)(game_state *state, game_ui *ui, + const game_drawstate *ds, int x, int y, int button); game_state *(*execute_move)(game_state *state, char *move); int preferred_tilesize; void (*compute_size)(game_params *params, int tilesize, int *x, int *y); @@ -461,6 +516,7 @@ struct game { game_ui *ui); float (*flash_length)(game_state *oldstate, game_state *newstate, int dir, game_ui *ui); + int (*status)(game_state *state); int can_print, can_print_in_colour; void (*print_size)(game_params *params, float *x, float *y); void (*print)(drawing *dr, game_state *state, int tilesize); @@ -503,6 +559,12 @@ struct drawing_api { void (*end_page)(void *handle, int number); void (*end_doc)(void *handle); void (*line_width)(void *handle, float width); + void (*line_dotted)(void *handle, int dotted); + char *(*text_fallback)(void *handle, const char *const *strings, + int nstrings); + void (*draw_thick_line)(void *handle, float thickness, + float x1, float y1, float x2, float y2, + int colour); }; /*