#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;
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
};