+/* 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 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)
+{
+ uint8_t ind = pos.y % 2;
+ uint8_t diag_west = pos.x + ind > 0;
+ uint8_t diag_east = pos.x + ind <= world.map.size.x - 1;
+ uint16_t pos_i = (pos.y * world.map.size.x) + pos.x;
+ if ( ( pos.y > 0 && diag_east
+ && type == world.map.cells[pos_i - world.map.size.x + ind])
+ || ( pos.x < world.map.size.x - 1
+ && type == world.map.cells[pos_i + 1])
+ || ( pos.y < world.map.size.y - 1 && diag_east
+ && type == world.map.cells[pos_i + world.map.size.x + ind])
+ || ( pos.y > 0 && diag_west
+ && type == world.map.cells[pos_i - world.map.size.x - !ind])
+ || ( pos.x > 0
+ && type == world.map.cells[pos_i - 1])
+ || ( pos.y < world.map.size.y - 1 && diag_west
+ && type == world.map.cells[pos_i + world.map.size.x - !ind]))
+ {
+ return 1;
+ }
+ return 0;
+}
+
+
+
+static void make_sea()