ref: ce6e3df99bc7825d1c1638d378320375eb05fd0b
parent: e37d915f447e02b52236cee454dfe68749c6d876
author: Simon Tatham <anakin@pobox.com>
date: Mon Apr 24 13:09:30 EDT 2017
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.
--- a/loopy.c
+++ b/loopy.c
@@ -243,33 +243,55 @@
#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 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
};