From ce6e3df99bc7825d1c1638d378320375eb05fd0b Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Mon, 24 Apr 2017 17:09:30 +0100 Subject: [PATCH] Use symbolic enum values in the Loopy presets array. The use of plain numbers was needlessly confusing, and in particular made it too easy to make unintended changes to the existing Loopy presets when inserting a new grid enum value anywhere other than at the end of the list. But in the course of doing this I realised that, against all sensibleness, the numeric indices for grid types in grid.h and in Loopy itself don't match up! Right now I don't want to get sidetracked into fixing the structural confusion that made that happen in the first place, but I've at least materialised Loopy's version of the enum with clearly identifiable LOOPY_GRID_* names. --- loopy.c | 132 +++++++++++++++++++++++++++++++++----------------------- 1 file changed, 77 insertions(+), 55 deletions(-) diff --git a/loopy.c b/loopy.c index 15623ee..9cef879 100644 --- a/loopy.c +++ b/loopy.c @@ -243,33 +243,55 @@ static void check_caches(const solver_state* sstate); #define check_caches(s) #endif -/* ------- List of grid generators ------- */ -#define GRIDLIST(A) \ - A(Squares,GRID_SQUARE,3,3) \ - A(Triangular,GRID_TRIANGULAR,3,3) \ - A(Honeycomb,GRID_HONEYCOMB,3,3) \ - A(Snub-Square,GRID_SNUBSQUARE,3,3) \ - A(Cairo,GRID_CAIRO,3,4) \ - A(Great-Hexagonal,GRID_GREATHEXAGONAL,3,3) \ - A(Octagonal,GRID_OCTAGONAL,3,3) \ - A(Kites,GRID_KITE,3,3) \ - A(Floret,GRID_FLORET,1,2) \ - A(Dodecagonal,GRID_DODECAGONAL,2,2) \ - A(Great-Dodecagonal,GRID_GREATDODECAGONAL,2,2) \ - A(Penrose (kite/dart),GRID_PENROSE_P2,3,3) \ - A(Penrose (rhombs),GRID_PENROSE_P3,3,3) - A(Great-Great-Dodecagonal,GRID_GREATGREATDODECAGONAL,2,2) \ +/* + * Grid type config options available in Loopy. + * + * Annoyingly, we have to use an enum here which doesn't match up + * exactly to the grid-type enum in grid.h. Values in params->types + * are given by names such as LOOPY_GRID_SQUARE, which shouldn't be + * confused with GRID_SQUARE which is the value you pass to grid_new() + * and friends. So beware! + * + * (This is partly for historical reasons - Loopy's version of the + * enum is encoded in game parameter strings, so we keep it for + * backwards compatibility. But also, we need to store additional data + * here alongside each enum value, such as names for the presets menu, + * which isn't stored in grid.h; so we have to have our own list macro + * here anyway, and C doesn't make it easy to enforce that that lines + * up exactly with grid.h.) + * + * Do not add values to this list _except_ at the end, or old game ids + * will stop working! + */ +#define GRIDLIST(A) \ + A("Squares",SQUARE,3,3) \ + A("Triangular",TRIANGULAR,3,3) \ + A("Honeycomb",HONEYCOMB,3,3) \ + A("Snub-Square",SNUBSQUARE,3,3) \ + A("Cairo",CAIRO,3,4) \ + A("Great-Hexagonal",GREATHEXAGONAL,3,3) \ + A("Octagonal",OCTAGONAL,3,3) \ + A("Kites",KITE,3,3) \ + A("Floret",FLORET,1,2) \ + A("Dodecagonal",DODECAGONAL,2,2) \ + A("Great-Dodecagonal",GREATDODECAGONAL,2,2) \ + A("Penrose (kite/dart)",PENROSE_P2,3,3) \ + A("Penrose (rhombs)",PENROSE_P3,3,3) \ + A("Great-Great-Dodecagonal",GREATGREATDODECAGONAL,2,2) \ + /* end of list */ -#define GRID_NAME(title,type,amin,omin) #title, -#define GRID_CONFIG(title,type,amin,omin) ":" #title -#define GRID_TYPE(title,type,amin,omin) type, +#define GRID_NAME(title,type,amin,omin) title, +#define GRID_CONFIG(title,type,amin,omin) ":" title +#define GRID_LOOPYTYPE(title,type,amin,omin) LOOPY_GRID_ ## type, +#define GRID_GRIDTYPE(title,type,amin,omin) GRID_ ## type, #define GRID_SIZES(title,type,amin,omin) \ {amin, omin, \ "Width and height for this grid type must both be at least " #amin, \ "At least one of width and height for this grid type must be at least " #omin,}, +enum { GRIDLIST(GRID_LOOPYTYPE) }; static char const *const gridnames[] = { GRIDLIST(GRID_NAME) }; #define GRID_CONFIGS GRIDLIST(GRID_CONFIG) -static grid_type grid_types[] = { GRIDLIST(GRID_TYPE) }; +static grid_type grid_types[] = { GRIDLIST(GRID_GRIDTYPE) }; #define NUM_GRID_TYPES (sizeof(grid_types) / sizeof(grid_types[0])) static const struct { int amin, omin; @@ -493,42 +515,42 @@ static game_params *dup_params(const game_params *params) static const game_params presets[] = { #ifdef SMALL_SCREEN - { 7, 7, DIFF_EASY, 0 }, - { 7, 7, DIFF_NORMAL, 0 }, - { 7, 7, DIFF_HARD, 0 }, - { 7, 7, DIFF_HARD, 1 }, - { 7, 7, DIFF_HARD, 2 }, - { 5, 5, DIFF_HARD, 3 }, - { 7, 7, DIFF_HARD, 4 }, - { 5, 4, DIFF_HARD, 5 }, - { 5, 5, DIFF_HARD, 6 }, - { 5, 5, DIFF_HARD, 7 }, - { 3, 3, DIFF_HARD, 8 }, - { 3, 3, DIFF_HARD, 9 }, - { 3, 3, DIFF_HARD, 10 }, - { 3, 2, DIFF_HARD, 13 }, - { 6, 6, DIFF_HARD, 11 }, - { 6, 6, DIFF_HARD, 12 }, + { 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 - { 7, 7, DIFF_EASY, 0 }, - { 10, 10, DIFF_EASY, 0 }, - { 7, 7, DIFF_NORMAL, 0 }, - { 10, 10, DIFF_NORMAL, 0 }, - { 7, 7, DIFF_HARD, 0 }, - { 10, 10, DIFF_HARD, 0 }, - { 10, 10, DIFF_HARD, 1 }, - { 12, 10, DIFF_HARD, 2 }, - { 7, 7, DIFF_HARD, 3 }, - { 9, 9, DIFF_HARD, 4 }, - { 5, 4, DIFF_HARD, 5 }, - { 7, 7, DIFF_HARD, 6 }, - { 5, 5, DIFF_HARD, 7 }, - { 5, 5, DIFF_HARD, 8 }, - { 5, 4, DIFF_HARD, 9 }, - { 5, 4, DIFF_HARD, 10 }, - { 5, 3, DIFF_HARD, 13 }, - { 10, 10, DIFF_HARD, 11 }, - { 10, 10, DIFF_HARD, 12 } + { 7, 7, DIFF_EASY, LOOPY_GRID_SQUARE }, + { 10, 10, DIFF_EASY, LOOPY_GRID_SQUARE }, + { 7, 7, DIFF_NORMAL, LOOPY_GRID_SQUARE }, + { 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, 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 };