+ try_fputc('\'', file, __func__);
+ }
+}
+
+
+
+static void write_key_space_value(FILE * file, char * key, uint32_t value)
+{
+ write_key_space(file, key);
+ write_value(file, value);
+ try_fputc('\n', file, __func__);
+}
+
+
+
+static void write_key_space_string(FILE * file, char * key, char * string)
+{
+ write_key_space(file, key);
+ write_string(file, string);
+ try_fputc('\n', file, __func__);
+}
+
+
+
+static void write_thing(FILE * file, struct Thing * t)
+{
+ struct Thing * o;
+ for (o = t->owns; o; o = o->next)
+ {
+ write_thing(file, o);
+ }
+ write_key_space_value(file, s[S_CMD_T_ID], t->id);
+ write_key_space_value(file, s[S_CMD_T_TYPE], t->type);
+ write_key_space_value(file, s[S_CMD_T_POSY], t->pos.y);
+ write_key_space_value(file, s[S_CMD_T_POSX], t->pos.x);
+ write_key_space_value(file, s[S_CMD_T_COMMAND], t->command);
+ write_key_space_value(file, s[S_CMD_T_ARGUMENT], t->arg);
+ write_key_space_value(file, s[S_CMD_T_PROGRESS], t->progress);
+ write_key_space_value(file, s[S_CMD_T_HP], t->lifepoints);
+ for (o = t->owns; o; o = o->next)
+ {
+ write_key_space_value(file, s[S_CMD_T_CARRIES], o->id);
+ }
+ if (t->mem_map)
+ {
+ 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++)