home · contact · privacy
Made get_name_to_keycode() code a little less ugly/redundant by outsourcing to try_ke...
[plomrogue] / src / map.c
index 44a0057f4c8bb799d2f5caab856fa7d33feef377..629e813a1d2089621d5d525330d824bbe201469a 100644 (file)
--- a/src/map.c
+++ b/src/map.c
@@ -1,21 +1,21 @@
 #include "map.h"
-#include <stdlib.h>      /* for malloc() */
 #include <stdint.h>      /* for uint16_t, uint32_t */
-#include "misc.h"        /* for rrand() and center_offset() */
+#include "misc.h"        /* for try_malloc(), center_offset() */
 #include "map_objects.h" /* for Player struct */
 #include "yx_uint16.h"   /* for yx_uint16 and dir enums */
+#include "rrand.h"       /* for rrand() */
+#include "windows.h"     /* for struct Win */
 
 
 
-struct Map init_map ()
+extern struct Map init_map()
 {
+    char * f_name = "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);
+    map.cells = try_malloc(size, f_name);
     uint16_t y, x;
     for (y = 0; y < map.size.y; y++)
     {
@@ -28,8 +28,8 @@ struct Map init_map ()
     uint32_t curpos;
     while (1)
     {
-        y = rrand(0, 0) % map.size.y;
-        x = rrand(0, 0) % map.size.x;
+        y = rrand() % map.size.y;
+        x = rrand() % map.size.x;
         curpos = y * map.size.x + x;
         if ('~' == map.cells[curpos]
             && ((curpos >= map.size.x && '.' == map.cells[curpos - map.size.x])
@@ -53,31 +53,33 @@ struct Map init_map ()
 
 
 
-void map_scroll (struct Map * map, enum dir d, struct yx_uint16 win_size)
+extern void map_scroll(struct Win * win, struct yx_uint16 map_size, enum dir d)
 {
-    if      (NORTH == d && map->offset.y > 0)
+    uint16_t offset;
+    if ((NORTH == d || SOUTH == d) && map_size.y > win->framesize.y)
     {
-        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++;
+        offset = center_offset(win->center.y, map_size.y, win->framesize.y);
+        win->center.y = offset + (win->framesize.y / 2);
+        if      (NORTH == d && win->center.y > 0)
+        {
+            win->center.y--;
+        }
+        else if (SOUTH == d && win->center.y < map_size.y - 1)
+        {
+            win->center.y++;
+        }
     }
-    else if (EAST  == d && map->offset.x + win_size.x < map->size.x)
+    else if ((WEST == d || EAST == d) && map_size.x > win->framesize.x)
     {
-        map->offset.x++;
+        offset = center_offset(win->center.x, map_size.x, win->framesize.x);
+        win->center.x = offset + (win->framesize.x / 2);
+        if      (WEST == d && win->center.x > 0)
+        {
+            win->center.x--;
+        }
+        else if (EAST == d && win->center.x < map_size.x - 1)
+        {
+            win->center.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);
-}