From: Simon Tatham Date: Mon, 24 Apr 2017 16:06:36 +0000 (+0100) Subject: Use the new hierarchical preset menu feature in Loopy. X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=commitdiff_plain;h=e3821d1f68bf531fa485fd5b4c2882b838824347;p=sgt-puzzles.git 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.) --- diff --git a/loopy.c b/loopy.c index bc6ebb3..ef8dbb5 100644 --- a/loopy.c +++ b/loopy.c @@ -513,22 +513,15 @@ static game_params *dup_params(const game_params *params) return ret; } -static const game_params presets[] = { +static const game_params loopy_presets_top[] = { #ifdef SMALL_SCREEN { 7, 7, DIFF_EASY, LOOPY_GRID_SQUARE }, { 7, 7, DIFF_NORMAL, LOOPY_GRID_SQUARE }, { 7, 7, DIFF_HARD, LOOPY_GRID_SQUARE }, - { 7, 7, DIFF_HARD, LOOPY_GRID_HONEYCOMB }, { 7, 7, DIFF_HARD, LOOPY_GRID_TRIANGULAR }, { 5, 5, DIFF_HARD, LOOPY_GRID_SNUBSQUARE }, { 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 }, - { 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_P3 }, #else @@ -538,38 +531,64 @@ static const game_params presets[] = { { 10, 10, DIFF_NORMAL, LOOPY_GRID_SQUARE }, { 7, 7, 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 }, { 7, 7, DIFF_HARD, LOOPY_GRID_SNUBSQUARE }, { 9, 9, DIFF_HARD, LOOPY_GRID_CAIRO }, + { 5, 5, DIFF_HARD, LOOPY_GRID_KITE }, + { 10, 10, DIFF_HARD, LOOPY_GRID_PENROSE_P2 }, + { 10, 10, DIFF_HARD, LOOPY_GRID_PENROSE_P3 }, +#endif +}; + +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_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_P3 }, #endif }; -static int game_fetch_preset(int i, char **name, game_params **params) +static void preset_menu_add_preset_with_title(struct preset_menu *menu, + const game_params *params) { - game_params *tmppar; char buf[80]; + game_params *dup_params; - if (i < 0 || i >= lenof(presets)) - return FALSE; + sprintf(buf, "%dx%d %s - %s", params->h, params->w, + gridnames[params->type], diffnames[params->diff]); - tmppar = snew(game_params); - *tmppar = presets[i]; - *params = tmppar; - sprintf(buf, "%dx%d %s - %s", tmppar->h, tmppar->w, - gridnames[tmppar->type], diffnames[tmppar->diff]); - *name = dupstr(buf); + dup_params = snew(game_params); + *dup_params = *params; - 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) @@ -3548,7 +3567,7 @@ static void game_print(drawing *dr, const game_state *state, int tilesize) const struct game thegame = { "Loopy", "games.loopy", "loopy", default_params, - game_fetch_preset, NULL, + NULL, game_preset_menu, decode_params, encode_params, free_params,