home · contact · privacy
Applied new style and documentation requirements to map library; also some minor...
authorChristian Heller <c.heller@plomlompom.de>
Thu, 25 Jul 2013 21:58:48 +0000 (23:58 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Thu, 25 Jul 2013 21:58:48 +0000 (23:58 +0200)
src/map.c
src/map.h

index 394f818c48a3876a9ddb445ad4fc3f44b57fe3e2..44a0057f4c8bb799d2f5caab856fa7d33feef377 100644 (file)
--- a/src/map.c
+++ b/src/map.c
@@ -1,50 +1,83 @@
 #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);
+}
index c5ceb9429c98b4f8d60a98784204e7b44289f420..9bcd11b004c0e693c3204f118f6277f9e4e64c49 100644 (file)
--- a/src/map.h
+++ b/src/map.h
@@ -1,17 +1,49 @@
+/* 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