Use the new hierarchical preset menu feature in Loopy.

This is the game for which I bothered to introduce the feature at all.
Because of the large number of grid types, the presets menu was
getting quite unwieldy; but because the grid dimensions for each grid
type are more or less arbitrary, it's still useful to have at least
one reasonably sized example of each grid type. So I've compromised by
moving some of the grid types into a 'More' submenu.

(I'm not particularly wedded to _which_ settings deserve relegation. I
may change my mind and move things about later on.)
This commit is contained in:
Simon Tatham
2017-04-24 17:06:36 +01:00
parent a7dc17c425
commit e3821d1f68

73
loopy.c
View File

@ -513,22 +513,15 @@ static game_params *dup_params(const game_params *params)
return ret; return ret;
} }
static const game_params presets[] = { static const game_params loopy_presets_top[] = {
#ifdef SMALL_SCREEN #ifdef SMALL_SCREEN
{ 7, 7, DIFF_EASY, LOOPY_GRID_SQUARE }, { 7, 7, DIFF_EASY, LOOPY_GRID_SQUARE },
{ 7, 7, DIFF_NORMAL, LOOPY_GRID_SQUARE }, { 7, 7, DIFF_NORMAL, LOOPY_GRID_SQUARE },
{ 7, 7, DIFF_HARD, LOOPY_GRID_SQUARE }, { 7, 7, DIFF_HARD, LOOPY_GRID_SQUARE },
{ 7, 7, DIFF_HARD, LOOPY_GRID_HONEYCOMB },
{ 7, 7, DIFF_HARD, LOOPY_GRID_TRIANGULAR }, { 7, 7, DIFF_HARD, LOOPY_GRID_TRIANGULAR },
{ 5, 5, DIFF_HARD, LOOPY_GRID_SNUBSQUARE }, { 5, 5, DIFF_HARD, LOOPY_GRID_SNUBSQUARE },
{ 7, 7, DIFF_HARD, LOOPY_GRID_CAIRO }, { 7, 7, DIFF_HARD, LOOPY_GRID_CAIRO },
{ 5, 4, DIFF_HARD, LOOPY_GRID_GREATHEXAGONAL },
{ 5, 5, DIFF_HARD, LOOPY_GRID_OCTAGONAL },
{ 5, 5, DIFF_HARD, LOOPY_GRID_KITE }, { 5, 5, DIFF_HARD, LOOPY_GRID_KITE },
{ 3, 3, DIFF_HARD, LOOPY_GRID_FLORET },
{ 3, 3, DIFF_HARD, LOOPY_GRID_DODECAGONAL },
{ 3, 3, DIFF_HARD, LOOPY_GRID_GREATDODECAGONAL },
{ 3, 2, DIFF_HARD, LOOPY_GRID_GREATGREATDODECAGONAL },
{ 6, 6, DIFF_HARD, LOOPY_GRID_PENROSE_P2 }, { 6, 6, DIFF_HARD, LOOPY_GRID_PENROSE_P2 },
{ 6, 6, DIFF_HARD, LOOPY_GRID_PENROSE_P3 }, { 6, 6, DIFF_HARD, LOOPY_GRID_PENROSE_P3 },
#else #else
@ -538,38 +531,64 @@ static const game_params presets[] = {
{ 10, 10, DIFF_NORMAL, LOOPY_GRID_SQUARE }, { 10, 10, DIFF_NORMAL, LOOPY_GRID_SQUARE },
{ 7, 7, DIFF_HARD, LOOPY_GRID_SQUARE }, { 7, 7, DIFF_HARD, LOOPY_GRID_SQUARE },
{ 10, 10, DIFF_HARD, LOOPY_GRID_SQUARE }, { 10, 10, DIFF_HARD, LOOPY_GRID_SQUARE },
{ 10, 10, DIFF_HARD, LOOPY_GRID_HONEYCOMB },
{ 12, 10, DIFF_HARD, LOOPY_GRID_TRIANGULAR }, { 12, 10, DIFF_HARD, LOOPY_GRID_TRIANGULAR },
{ 7, 7, DIFF_HARD, LOOPY_GRID_SNUBSQUARE }, { 7, 7, DIFF_HARD, LOOPY_GRID_SNUBSQUARE },
{ 9, 9, DIFF_HARD, LOOPY_GRID_CAIRO }, { 9, 9, DIFF_HARD, LOOPY_GRID_CAIRO },
{ 5, 4, DIFF_HARD, LOOPY_GRID_GREATHEXAGONAL },
{ 7, 7, DIFF_HARD, LOOPY_GRID_OCTAGONAL },
{ 5, 5, DIFF_HARD, LOOPY_GRID_KITE }, { 5, 5, DIFF_HARD, LOOPY_GRID_KITE },
{ 5, 5, DIFF_HARD, LOOPY_GRID_FLORET },
{ 5, 4, DIFF_HARD, LOOPY_GRID_DODECAGONAL },
{ 5, 4, DIFF_HARD, LOOPY_GRID_GREATDODECAGONAL },
{ 5, 3, DIFF_HARD, LOOPY_GRID_GREATGREATDODECAGONAL },
{ 10, 10, DIFF_HARD, LOOPY_GRID_PENROSE_P2 }, { 10, 10, DIFF_HARD, LOOPY_GRID_PENROSE_P2 },
{ 10, 10, DIFF_HARD, LOOPY_GRID_PENROSE_P3 }, { 10, 10, DIFF_HARD, LOOPY_GRID_PENROSE_P3 },
#endif #endif
}; };
static int game_fetch_preset(int i, char **name, game_params **params) static const game_params loopy_presets_more[] = {
#ifdef SMALL_SCREEN
{ 7, 7, DIFF_HARD, LOOPY_GRID_HONEYCOMB },
{ 5, 4, DIFF_HARD, LOOPY_GRID_GREATHEXAGONAL },
{ 5, 5, DIFF_HARD, LOOPY_GRID_OCTAGONAL },
{ 3, 3, DIFF_HARD, LOOPY_GRID_FLORET },
{ 3, 3, DIFF_HARD, LOOPY_GRID_DODECAGONAL },
{ 3, 3, DIFF_HARD, LOOPY_GRID_GREATDODECAGONAL },
{ 3, 2, DIFF_HARD, LOOPY_GRID_GREATGREATDODECAGONAL },
#else
{ 10, 10, DIFF_HARD, LOOPY_GRID_HONEYCOMB },
{ 5, 4, DIFF_HARD, LOOPY_GRID_GREATHEXAGONAL },
{ 7, 7, DIFF_HARD, LOOPY_GRID_OCTAGONAL },
{ 5, 5, DIFF_HARD, LOOPY_GRID_FLORET },
{ 5, 4, DIFF_HARD, LOOPY_GRID_DODECAGONAL },
{ 5, 4, DIFF_HARD, LOOPY_GRID_GREATDODECAGONAL },
{ 5, 3, DIFF_HARD, LOOPY_GRID_GREATGREATDODECAGONAL },
#endif
};
static void preset_menu_add_preset_with_title(struct preset_menu *menu,
const game_params *params)
{ {
game_params *tmppar;
char buf[80]; char buf[80];
game_params *dup_params;
if (i < 0 || i >= lenof(presets)) sprintf(buf, "%dx%d %s - %s", params->h, params->w,
return FALSE; gridnames[params->type], diffnames[params->diff]);
tmppar = snew(game_params); dup_params = snew(game_params);
*tmppar = presets[i]; *dup_params = *params;
*params = tmppar;
sprintf(buf, "%dx%d %s - %s", tmppar->h, tmppar->w,
gridnames[tmppar->type], diffnames[tmppar->diff]);
*name = dupstr(buf);
return TRUE; preset_menu_add_preset(menu, dupstr(buf), dup_params);
}
static struct preset_menu *game_preset_menu(void)
{
struct preset_menu *top, *more;
int i;
top = preset_menu_new();
for (i = 0; i < lenof(loopy_presets_top); i++)
preset_menu_add_preset_with_title(top, &loopy_presets_top[i]);
more = preset_menu_add_submenu(top, dupstr("More..."));
for (i = 0; i < lenof(loopy_presets_more); i++)
preset_menu_add_preset_with_title(more, &loopy_presets_more[i]);
return top;
} }
static void free_params(game_params *params) static void free_params(game_params *params)
@ -3548,7 +3567,7 @@ static void game_print(drawing *dr, const game_state *state, int tilesize)
const struct game thegame = { const struct game thegame = {
"Loopy", "games.loopy", "loopy", "Loopy", "games.loopy", "loopy",
default_params, default_params,
game_fetch_preset, NULL, NULL, game_preset_menu,
decode_params, decode_params,
encode_params, encode_params,
free_params, free_params,