+/* Helper to mv_yx_in_dir_legal(). Move "yx" into hex direction "d". */
+static void mv_yx_in_dir(char d, struct yx_uint8 * yx);
+
+/* Helper to mv_yx_in_dir_legal(). Move "yx" into hex direction "d", do wrapping
+ * logic, return 1 if "yx" ends outside of the original wrap space, else 0.
+ */
+static uint8_t mv_yx_in_dir_wrap(char d, struct yx_uint8 * yx);
+
+/* Call this too often with "init" of 0 and the game exits with an error message
+ * about reaching an iteration limit. An "init" of 1 sets the iteration counter
+ * to 0. Iteration limit is currently 256 * UINT16_MAX.
+ */
+static uint8_t iter_limit(uint8_t init);
+
+/* Return 1 if cell on "pos" is neighbor to a cell of "type", else return 0. */
+static uint8_t is_neighbor(struct yx_uint8 pos, char type);
+
+/* Fill map with '~' cells. */
+static void make_sea();
+
+/* Put island of '.' cells inside map sea. */
+static void make_sea();
+
+/* Put tree cells of 'X' on island. */
+static void make_trees();
+
+
+
+static void mv_yx_in_dir(char d, struct yx_uint8 * yx)
+{
+ if (d == 'e')
+ {
+ yx->x = yx->x + (yx->y % 2);
+ yx->y--;
+ }
+ else if (d == 'd')
+ {
+ yx->x++;
+ }
+ else if (d == 'c')
+ {
+ yx->x = yx->x + (yx->y % 2);
+ yx->y++;
+ }
+ else if (d == 'x')
+ {
+ yx->x = yx->x - !(yx->y % 2);
+ yx->y++;
+ }
+ else if (d == 's')
+ {
+ yx->x--;
+ }
+ else if (d == 'w')
+ {
+ yx->x = yx->x - !(yx->y % 2);
+ yx->y--;
+ }
+}
+
+
+
+static uint8_t mv_yx_in_dir_wrap(char d, struct yx_uint8 * yx)
+{
+ static int8_t wrap_west_east = 0;
+ static int8_t wrap_north_south = 0;
+ char * err = "Too much wrapping in mv_yx_in_dir_wrap().";
+ exit_err( INT8_MIN == wrap_west_east || INT8_MIN == wrap_north_south
+ || INT8_MAX == wrap_west_east || INT8_MAX == wrap_north_south, err);
+ if (!yx)
+ {
+ wrap_west_east = wrap_north_south = 0;
+ return 0;
+ }
+ struct yx_uint8 original;
+ original.y = yx->y;
+ original.x = yx->x;
+ mv_yx_in_dir(d, yx);
+ if (strchr("edc", d) && yx->x < original.x)
+ {
+ wrap_west_east++;
+ }
+ else if (strchr("xsw", d) && yx->x > original.x)
+ {
+ wrap_west_east--;
+ }
+ if (strchr("we", d) && yx->y > original.y)
+ {
+ wrap_north_south--;
+ }
+ else if (strchr("xc", d) && yx->y < original.y)
+ {
+ wrap_north_south++;
+ }
+ return (wrap_west_east != 0) + (wrap_north_south != 0);
+}
+
+
+
+static uint8_t iter_limit(uint8_t init)
+{
+ static uint32_t i = 0;
+ char * err = "Map generation reached iteration limit. Change map size?";
+ if (init)
+ {
+ i = 0;
+ return 0;
+ }
+ i++;
+ exit_err(256 * UINT16_MAX == i, err);
+ return 1;
+}
+
+
+
+static uint8_t is_neighbor(struct yx_uint8 pos, char type)