+ * Data structure containing the function calls and data specific
+ * to a particular game. This is enclosed in a data structure so
+ * that a particular platform can choose, if it wishes, to compile
+ * all the games into a single combined executable rather than
+ * having lots of little ones.
+ */
+struct game {
+ const char *name;
+ const char *winhelp_topic;
+ game_params *(*default_params)(void);
+ int (*fetch_preset)(int i, char **name, game_params **params);
+ game_params *(*decode_params)(char const *string);
+ char *(*encode_params)(game_params *);
+ void (*free_params)(game_params *params);
+ game_params *(*dup_params)(game_params *params);
+ int can_configure;
+ config_item *(*configure)(game_params *params);
+ game_params *(*custom_params)(config_item *cfg);
+ char *(*validate_params)(game_params *params);
+ char *(*new_seed)(game_params *params, random_state *rs,
+ game_aux_info **aux);
+ void (*free_aux_info)(game_aux_info *aux);
+ char *(*validate_seed)(game_params *params, char *seed);
+ game_state *(*new_game)(game_params *params, char *seed);
+ game_state *(*dup_game)(game_state *state);
+ void (*free_game)(game_state *state);
+ int can_solve;
+ game_state *(*solve)(game_state *state, game_aux_info *aux, char **error);
+ int can_format_as_text;
+ char *(*text_format)(game_state *state);
+ game_ui *(*new_ui)(game_state *state);
+ void (*free_ui)(game_ui *ui);
+ game_state *(*make_move)(game_state *from, game_ui *ui, int x, int y,
+ int button);
+ void (*size)(game_params *params, int *x, int *y);
+ float *(*colours)(frontend *fe, game_state *state, int *ncolours);
+ game_drawstate *(*new_drawstate)(game_state *state);
+ void (*free_drawstate)(game_drawstate *ds);
+ void (*redraw)(frontend *fe, game_drawstate *ds, game_state *oldstate,
+ game_state *newstate, int dir, game_ui *ui, float anim_time,
+ float flash_time);
+ float (*anim_length)(game_state *oldstate, game_state *newstate, int dir);
+ float (*flash_length)(game_state *oldstate, game_state *newstate, int dir);
+ int (*wants_statusbar)(void);
+};
+
+/*
+ * For one-game-at-a-time platforms, there's a single structure
+ * like the above, under a fixed name. For all-at-once platforms,
+ * there's a list of all available puzzles in array form.