#include "map.h"
-#include <stdlib.h>
-#include <stdint.h>
-#include "misc.h"
-#include "map_objects.h"
-
-struct Map init_map () {
-// Initialize map with some experimental start values.
- struct Map map;
- map.size.x = 64;
- map.size.y = 64;
- map.offset.x = 0;
- map.offset.y = 0;
- uint32_t size = map.size.x * map.size.y;
- map.cells = malloc(size);
- uint16_t y, x;
- for (y = 0; y < map.size.y; y++)
- for (x = 0; x < map.size.x; x++)
- map.cells[(y * map.size.x) + x] = '~';
- map.cells[size / 2 + (map.size.x / 2)] = '.';
- uint32_t curpos;
- while (1) {
- y = rrand(0, 0) % map.size.y;
- x = rrand(0, 0) % map.size.x;
- curpos = y * map.size.x + x;
- if ('~' == map.cells[curpos] &&
- ( (curpos >= map.size.x && '.' == map.cells[curpos - map.size.x])
- || (curpos < map.size.x * (map.size.y-1) && '.' == map.cells[curpos + map.size.x])
- || (curpos > 0 && curpos % map.size.x != 0 && '.' == map.cells[curpos-1])
- || (curpos < (map.size.x * map.size.y) && (curpos+1) % map.size.x != 0 && '.' == map.cells[curpos+1]))) {
- if (y == 0 || y == map.size.y - 1 || x == 0 || x == map.size.x - 1)
- break;
- map.cells[y * map.size.x + x] = '.'; } }
- return map; }
-
-void map_scroll (struct Map * map, char dir, struct yx_uint16 win_size) {
-// Scroll map into direction dir if possible by changing the offset.
- if (NORTH == dir && map->offset.y > 0)
- map->offset.y--;
- else if (WEST == dir && map->offset.x > 0)
- map->offset.x--;
- else if (SOUTH == dir && map->offset.y + win_size.y < map->size.y)
- map->offset.y++;
- else if (EAST == dir && map->offset.x + win_size.x < map->size.x)
- map->offset.x++; }
-
-void map_center_player (struct Map * map, struct Player * player, struct yx_uint16 frame_size) {
-// Center map on player.
- map->offset.y = center_offset (player->pos.y, map->size.y, frame_size.y);
- map->offset.x = center_offset (player->pos.x, map->size.x, frame_size.x); }
+#include <stdlib.h> /* for malloc() */
+#include <stdint.h> /* for uint16_t, uint32_t */
+#include "misc.h" /* for rrand() and center_offset() */
+#include "map_objects.h" /* for Player struct */
+#include "yx_uint16.h" /* for yx_uint16 and dir enums */
+
+
+
+struct Map init_map ()
+{
+ struct Map map;
+ map.size.x = 64;
+ map.size.y = 64;
+ map.offset.x = 0;
+ map.offset.y = 0;
+ uint32_t size = map.size.x * map.size.y;
+ map.cells = malloc(size);
+ uint16_t y, x;
+ for (y = 0; y < map.size.y; y++)
+ {
+ for (x = 0; x < map.size.x; x++)
+ {
+ map.cells[(y * map.size.x) + x] = '~';
+ }
+ }
+ map.cells[size / 2 + (map.size.x / 2)] = '.';
+ uint32_t curpos;
+ while (1)
+ {
+ y = rrand(0, 0) % map.size.y;
+ x = rrand(0, 0) % map.size.x;
+ curpos = y * map.size.x + x;
+ if ('~' == map.cells[curpos]
+ && ((curpos >= map.size.x && '.' == map.cells[curpos - map.size.x])
+ || (curpos < map.size.x * (map.size.y-1)
+ && '.' == map.cells[curpos + map.size.x])
+ || (curpos > 0 && curpos % map.size.x != 0
+ && '.' == map.cells[curpos-1])
+ || (curpos < (map.size.x * map.size.y)
+ && (curpos+1) % map.size.x != 0
+ && '.' == map.cells[curpos+1])))
+ {
+ if (y == 0 || y == map.size.y - 1 || x == 0 || x == map.size.x - 1)
+ {
+ break;
+ }
+ map.cells[y * map.size.x + x] = '.';
+ }
+ }
+ return map;
+}
+
+
+
+void map_scroll (struct Map * map, enum dir d, struct yx_uint16 win_size)
+{
+ if (NORTH == d && map->offset.y > 0)
+ {
+ map->offset.y--;
+ }
+ else if (WEST == d && map->offset.x > 0)
+ {
+ map->offset.x--;
+ }
+ else if (SOUTH == d && map->offset.y + win_size.y < map->size.y)
+ {
+ map->offset.y++;
+ }
+ else if (EAST == d && map->offset.x + win_size.x < map->size.x)
+ {
+ map->offset.x++;
+ }
+}
+
+
+
+void map_center_player(struct Map * map, struct Player * player,
+ struct yx_uint16 win_size)
+{
+ map->offset.y = center_offset (player->pos.y, map->size.y, win_size.y);
+ map->offset.x = center_offset (player->pos.x, map->size.x, win_size.x);
+}
+/* map.h
+ *
+ * Struct for the game map and routines to manipulate it.
+ */
+
#ifndef MAP_H
#define MAP_H
-#include "yx_uint16.h"
+
+#include "yx_uint16.h" /* for yx_uint16 and dir enums */
struct Player;
-struct Map {
- struct yx_uint16 size;
- struct yx_uint16 offset;
- char * cells; };
-extern struct Map init_map ();
-extern void map_scroll (struct Map *, char, struct yx_uint16);
-extern void map_center_player (struct Map *, struct Player *, struct yx_uint16);
+
+struct Map
+{
+ struct yx_uint16 size; /* map's height/width in number of cells */
+ struct yx_uint16 offset; /* the map scroll offset */
+ char * cells; /* sequence of bytes encoding map cells */
+};
+
+
+
+/* Initialize an island map as 64 x 64 cells of "~" cells representing water and
+ * "." cells representing land. The shape of the island is generated randomly by
+ * starting with a sea containing one land cell in the middle and then going
+ * into a cycle of repeatedly selecting a random cell on the map and
+ * transforming it into a land cell if it is horizontally or vertically neighbor
+ * to one. The cycle ends when a land cell is created that is only one cell away
+ * from the edge of the map. The map scroll offset is initialized to 0,0.
+ */
+extern struct Map init_map();
+
+/* Scroll map into direction "dir" by changing the scroll offset if that does
+ * not push the map view beyond the size of the map window as described by
+ * "win_size".
+ */
+extern void map_scroll(struct Map * map, enum dir d, struct yx_uint16 win_size);
+
+/* Scroll map to center on the player by changing the scroll offset as far as is
+ * possible sans leaving the size of the map window as described by "win_size".
+ */
+extern void map_center_player(struct Map * map, struct Player * player,
+ struct yx_uint16 win_size);
+
+
#endif