chiark / gitweb /
Use symbolic enum values in the Loopy presets array.
authorSimon Tatham <anakin@pobox.com>
Mon, 24 Apr 2017 16:09:30 +0000 (17:09 +0100)
committerSimon Tatham <anakin@pobox.com>
Mon, 24 Apr 2017 16:09:39 +0000 (17:09 +0100)
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

diff --git a/loopy.c b/loopy.c
index 15623eeb367605e458d5292892fc63b6d4dafbae..9cef879ef535768cd5834ec1a6aa090d8192a73b 100644 (file)
--- 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) \
-
-#define GRID_NAME(title,type,amin,omin) #title,
-#define GRID_CONFIG(title,type,amin,omin) ":" #title
-#define GRID_TYPE(title,type,amin,omin) type,
+/*
+ * 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_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
 };