+
+int midend_num_presets(midend_data *me)
+{
+ if (!me->npresets) {
+ char *name;
+ game_params *preset;
+
+ while (game_fetch_preset(me->npresets, &name, &preset)) {
+ if (me->presetsize <= me->npresets) {
+ me->presetsize = me->npresets + 10;
+ me->presets = sresize(me->presets, me->presetsize,
+ game_params *);
+ me->preset_names = sresize(me->preset_names, me->presetsize,
+ char *);
+ }
+
+ me->presets[me->npresets] = preset;
+ me->preset_names[me->npresets] = name;
+ me->npresets++;
+ }
+ }
+
+ return me->npresets;
+}
+
+void midend_fetch_preset(midend_data *me, int n,
+ char **name, game_params **params)
+{
+ assert(n >= 0 && n < me->npresets);
+ *name = me->preset_names[n];
+ *params = me->presets[n];
+}
+
+int midend_wants_statusbar(midend_data *me)
+{
+ return game_wants_statusbar();
+}
+
+config_item *midend_get_config(midend_data *me, int which, char **wintitle)
+{
+ char *titlebuf;
+ config_item *ret;
+
+ titlebuf = snewn(40 + strlen(game_name), char);
+
+ switch (which) {
+ case CFG_SETTINGS:
+ sprintf(titlebuf, "%s configuration", game_name);
+ *wintitle = dupstr(titlebuf);
+ return game_configure(me->params);
+ case CFG_SEED:
+ sprintf(titlebuf, "%s game selection", game_name);
+ *wintitle = dupstr(titlebuf);
+
+ ret = snewn(2, config_item);
+
+ ret[0].type = C_STRING;
+ ret[0].name = "Game ID";
+ ret[0].ival = 0;
+ ret[0].sval = dupstr(me->seed);
+
+ ret[1].type = C_END;
+ ret[1].name = ret[1].sval = NULL;
+ ret[1].ival = 0;
+
+ return ret;
+ }
+
+ assert(!"We shouldn't be here");
+ return NULL;
+}
+
+char *midend_set_config(midend_data *me, int which, config_item *cfg)
+{
+ char *error;
+ game_params *params;
+
+ switch (which) {
+ case CFG_SETTINGS:
+ params = custom_params(cfg);
+ error = validate_params(params);
+
+ if (error) {
+ free_params(params);
+ return error;
+ }
+
+ free_params(me->params);
+ me->params = params;
+ break;
+
+ case CFG_SEED:
+ error = validate_seed(me->params, cfg[0].sval);
+ if (error)
+ return error;
+
+ sfree(me->seed);
+ me->seed = dupstr(cfg[0].sval);
+ me->fresh_seed = TRUE;
+
+ break;
+ }
+
+ return NULL;
+}