X-Git-Url: https://plomlompom.com/repos/foo.html?a=blobdiff_plain;ds=sidebyside;f=src%2Fserver%2Fio.c;h=3c75bd8842d15801fa3baff43186b46a477ed59e;hb=0bc5f963f66050ed0018bf1228f5b17c686457c0;hp=d4c9faf860c4f05ae969a70ca95ef685c882b8fb;hpb=eec39e9d6f991c90c8555859b5f10eb30c0370c1;p=plomrogue
diff --git a/src/server/io.c b/src/server/io.c
index d4c9faf..3c75bd8 100644
--- a/src/server/io.c
+++ b/src/server/io.c
@@ -13,7 +13,7 @@
#include /* uint8_t, uint16_t, uint32_t, UINT8_MAX */
#include /* defines FILE, sprintf(), fprintf() */
#include /* free() */
-#include /* strlen(), snprintf(), memcpy(), memset(), strchr() */
+#include /* strlen(), snprintf(), memcpy(), strchr() */
#include /* time_t */
#include /* time(), nanosleep() */
#include "../common/readwrite.h" /* atomic_write_start(), atomic_write_finish(),
@@ -24,6 +24,8 @@
#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()
*/
@@ -38,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);
@@ -124,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;
@@ -143,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__);
}
@@ -261,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')
{
@@ -356,6 +367,7 @@ extern char * io_round()
if (world.do_update)
{
update_worldstate_file();
+ send_to_outfile("WORLD_UPDATED\n", 1);
world.do_update = 0;
}
try_growing_queue();