+
+ preset_menu_add_preset(menu, dupstr(name), preset);
+ }
+
+ return p;
+}
+
+static void preset_menu_alloc_ids(midend *me, struct preset_menu *menu)
+{
+ int i;
+
+ for (i = 0; i < menu->n_entries; i++)
+ menu->entries[i].id = me->n_encoded_presets++;
+
+ for (i = 0; i < menu->n_entries; i++)
+ if (menu->entries[i].submenu)
+ preset_menu_alloc_ids(me, menu->entries[i].submenu);
+}
+
+static void preset_menu_encode_params(midend *me, struct preset_menu *menu)
+{
+ int i;
+
+ for (i = 0; i < menu->n_entries; i++) {
+ if (menu->entries[i].params) {
+ me->encoded_presets[menu->entries[i].id] =
+ me->ourgame->encode_params(menu->entries[i].params, TRUE);
+ } else {
+ preset_menu_encode_params(me, menu->entries[i].submenu);
+ }
+ }
+}
+
+struct preset_menu *midend_get_presets(midend *me, int *id_limit)
+{
+ int i;
+
+ if (me->preset_menu)
+ return me->preset_menu;
+
+#if 0
+ /* Expect the game to implement exactly one of the two preset APIs */
+ assert(me->ourgame->fetch_preset || me->ourgame->preset_menu);
+ assert(!(me->ourgame->fetch_preset && me->ourgame->preset_menu));
+#endif
+
+ if (me->ourgame->fetch_preset) {
+ char *name;
+ game_params *preset;
+
+ /* Simple one-level menu */
+ assert(!me->ourgame->preset_menu);
+ me->preset_menu = preset_menu_new();
+ for (i = 0; me->ourgame->fetch_preset(i, &name, &preset); i++)
+ preset_menu_add_preset(me->preset_menu, name, preset);
+
+ } else {
+ /* Hierarchical menu provided by the game backend */
+ me->preset_menu = me->ourgame->preset_menu();