#define IS_MOUSE_RELEASE(m) ( (unsigned)((m) - LEFT_RELEASE) <= \
(unsigned)(RIGHT_RELEASE - LEFT_RELEASE))
+/*
+ * Flags in the back end's `flags' word.
+ */
/* Bit flags indicating mouse button priorities */
#define BUTTON_BEATS(x,y) ( 1 << (((x)-LEFT_BUTTON)*3+(y)-LEFT_BUTTON) )
-
-/* Another random flag that goes in the mouse priorities section for want
- * of a better place to put it */
+/* Flag indicating that Solve operations should be animated */
#define SOLVE_ANIMATES ( 1 << 9 )
+/* Pocket PC: Game requires right mouse button emulation */
+#define REQUIRE_RBUTTON ( 1 << 10 )
+/* Pocket PC: Game requires numeric input */
+#define REQUIRE_NUMPAD ( 1 << 11 )
+/* end of `flags' word definitions */
+
+#ifdef _WIN32_WCE
+ /* Pocket PC devices have small, portrait screen that requires more vivid colours */
+ #define SMALL_SCREEN
+ #define PORTRAIT_SCREEN
+ #define VIVID_COLOURS
+ #define STYLUS_BASED
+#endif
#define IGNOREARG(x) ( (x) = (x) )
/*
* drawing.c
*/
-drawing *drawing_init(const drawing_api *api, void *handle);
+drawing *drawing_new(const drawing_api *api, midend *me, void *handle);
void drawing_free(drawing *dr);
void draw_text(drawing *dr, int x, int y, int fonttype, int fontsize,
int align, int colour, char *text);
void midend_force_redraw(midend *me);
void midend_redraw(midend *me);
float *midend_colours(midend *me, int *ncolours);
+void midend_freeze_timer(midend *me, float tprop);
void midend_timer(midend *me, float tplus);
int midend_num_presets(midend *me);
void midend_fetch_preset(midend *me, int n,
/*
* dsf.c
*/
+int *snew_dsf(int size);
+
+void print_dsf(int *dsf, int size);
+
+/* Return the canonical element of the equivalence class containing element
+ * val. If 'inverse' is non-NULL, this function will put into it a flag
+ * indicating whether the canonical element is inverse to val. */
+int edsf_canonify(int *dsf, int val, int *inverse);
int dsf_canonify(int *dsf, int val);
+int dsf_size(int *dsf, int val);
+
+/* Allow the caller to specify that two elements should be in the same
+ * equivalence class. If 'inverse' is TRUE, the elements are actually opposite
+ * to one another in some sense. This function will fail an assertion if the
+ * caller gives it self-contradictory data, ie if two elements are claimed to
+ * be both opposite and non-opposite. */
+void edsf_merge(int *dsf, int v1, int v2, int inverse);
void dsf_merge(int *dsf, int v1, int v2);
+void dsf_init(int *dsf, int len);
/*
* version.c
*/
struct game {
const char *name;
- const char *winhelp_topic;
+ const char *winhelp_topic, *htmlhelp_topic;
game_params *(*default_params)(void);
int (*fetch_preset)(int i, char **name, game_params **params);
void (*decode_params)(game_params *, char const *string);
void (*compute_size)(game_params *params, int tilesize, int *x, int *y);
void (*set_size)(drawing *dr, game_drawstate *ds,
game_params *params, int tilesize);
- float *(*colours)(frontend *fe, game_state *state, int *ncolours);
+ float *(*colours)(frontend *fe, int *ncolours);
game_drawstate *(*new_drawstate)(drawing *dr, game_state *state);
void (*free_drawstate)(drawing *dr, game_drawstate *ds);
void (*redraw)(drawing *dr, game_drawstate *ds, game_state *oldstate,
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);
- int (*wants_statusbar)(void);
+ int wants_statusbar;
int is_timed;
int (*timing_state)(game_state *state, game_ui *ui);
- int mouse_priorities;
+ int flags;
};
/*