X-Git-Url: https://plomlompom.com/repos/?a=blobdiff_plain;f=src%2Fserver%2Fio.c;h=3c75bd8842d15801fa3baff43186b46a477ed59e;hb=bf396f111317663bba3950e57968af19f2f56a44;hp=227be3fd4e192a4886c29617771cc2637a245696;hpb=5826d08f8d4f8e9346a381d054e7cda473a947f9;p=plomrogue diff --git a/src/server/io.c b/src/server/io.c index 227be3f..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,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') {