home · contact · privacy
Server/AI: Explore map for (long-time) unexplored cells.
[plomrogue] / src / server / io.c
index 227be3fd4e192a4886c29617771cc2637a245696..3c75bd8842d15801fa3baff43186b46a477ed59e 100644 (file)
@@ -13,7 +13,7 @@
 #include <stdint.h> /* uint8_t, uint16_t, uint32_t, UINT8_MAX */
 #include <stdio.h> /* defines FILE, sprintf(), fprintf() */
 #include <stdlib.h> /* free() */
-#include <string.h> /* strlen(), snprintf(), memcpy(), memset(), strchr() */
+#include <string.h> /* strlen(), snprintf(), memcpy(), strchr() */
 #include <sys/types.h> /* time_t */
 #include <time.h> /* time(), nanosleep() */
 #include "../common/readwrite.h" /* atomic_write_start(), atomic_write_finish(),
@@ -24,6 +24,7 @@
 #include "../common/try_malloc.h" /* try_malloc() */
 #include "cleanup.h" /* set_cleanup_flag() */
 #include "hardcoded_strings.h" /* s */
+#include "map.h" /* init_empty_map() */
 #include "run.h" /* send_to_outfile() */
 #include "things.h" /* Thing, ThingType, ThingInMemory, ThingAction,
                      * get_thing_type(), get_player()
@@ -39,6 +40,9 @@ static void write_string(FILE * file, char * string);
 static void write_key_space_value(FILE * file, char * key, uint32_t value);
 static void write_key_space_string(FILE * file, char * key, char * string);
 
+/* Write to "file" game-map-sized "map" in "command"-prefixed numbered lines. */
+static void write_mem_map(FILE * file, char * map, char * command);
+
 /* Write to "file" \n-delimited line of "key" + space + "value" as string. */
 static void write_thing(FILE * file, struct Thing * t);
 
@@ -125,6 +129,33 @@ static void write_key_space_string(FILE * file, char * key, char * string)
 
 
 
+static void write_mem_map(FILE * file, char * map, char * command)
+{
+    if (map)
+    {
+        uint32_t map_size = world.map.length * world.map.length;/* snprintf() */
+        char * map_copy = try_malloc(map_size + 1, __func__);    /* reads one */
+        memcpy(map_copy, map, map_size);              /* byte beyond map_size */
+        map_copy[map_size] = '\0';         /* if string is not \0-terminated. */
+        uint16_t y;
+        char string[UINT8_MAX + 1 + 1];
+        for (y = 0; y < world.map.length; y++)
+        {
+            int test = snprintf(string, world.map.length + 1, "%s",
+                                map_copy + (y * world.map.length));
+            exit_trouble(test < 0, __func__, "snprintf()");
+            write_key_space(file, command);
+            write_value(file, y);
+            try_fputc(' ', file, __func__);
+            write_string(file, string);
+            try_fputc('\n', file, __func__);
+        }
+        free(map_copy);
+    }
+}
+
+
+
 static void write_thing(FILE * file, struct Thing * t)
 {
     struct Thing * o;
@@ -144,38 +175,18 @@ static void write_thing(FILE * file, struct Thing * t)
     {
         write_key_space_value(file, s[S_CMD_T_CARRIES], o->id);
     }
-    if (t->mem_map)
+    write_mem_map(file, t->mem_depth_map, s[S_CMD_T_MEMDEPTHMAP]);
+    write_mem_map(file, t->mem_map, s[S_CMD_T_MEMMAP]);
+    struct ThingInMemory * tm = t->t_mem;
+    for (; tm; tm = tm->next)
     {
-        uint32_t map_size = world.map.length * world.map.length;/* snprintf() */
-        char * mem_map_copy = try_malloc(map_size + 1, __func__);/* reads one */
-        memcpy(mem_map_copy, t->mem_map, map_size);   /* byte beyond map_size */
-        mem_map_copy[map_size] = '\0';     /* if string is not \0-terminated. */
-        uint16_t y;
-        char string[UINT8_MAX + 1 + 1];
-        for (y = 0; y < world.map.length; y++)
-        {
-
-            int test = snprintf(string, world.map.length + 1, "%s",
-                                mem_map_copy + (y * world.map.length));
-            exit_trouble(test < 0, __func__, "snprintf()");
-            write_key_space(file, s[S_CMD_T_MEMMAP]);
-            write_value(file, y);
-            try_fputc(' ', file, __func__);
-            write_string(file, string);
-            try_fputc('\n', file, __func__);
-        }
-        free(mem_map_copy);
-        struct ThingInMemory * tm = t->t_mem;
-        for (; tm; tm = tm->next)
-        {
-            write_key_space(file, s[S_CMD_T_MEMTHING]);
-            write_value(file, tm->type);
-            try_fputc(' ', file, __func__);
-            write_value(file, tm->pos.y);
-            try_fputc(' ', file, __func__);
-            write_value(file, tm->pos.x);
-            try_fputc('\n', file, __func__);
-        }
+        write_key_space(file, s[S_CMD_T_MEMTHING]);
+        write_value(file, tm->type);
+        try_fputc(' ', file, __func__);
+        write_value(file, tm->pos.y);
+        try_fputc(' ', file, __func__);
+        write_value(file, tm->pos.x);
+        try_fputc('\n', file, __func__);
     }
     try_fputc('\n', file, __func__);
 }
@@ -262,13 +273,12 @@ static void write_inventory(struct Thing * player, FILE * file)
 
 static char * build_visible_map(struct Thing * player)
 {
-    uint32_t map_size = world.map.length * world.map.length;
-    char * visible_map = try_malloc(map_size, __func__);
-    memset(visible_map, ' ', map_size);
+    char * visible_map;
+    init_empty_map(&visible_map);
     if (player->fov_map) /* May fail if player thing was created / positioned */
     {                    /* by god command after turning off FOV building.    */
-        uint32_t pos_i;
-        for (pos_i = 0; pos_i < map_size; pos_i++)
+        uint32_t pos_i = 0;
+        for (; pos_i < (uint32_t) world.map.length * world.map.length; pos_i++)
         {
             if (player->fov_map[pos_i] == 'v')
             {