aboutsummaryrefslogtreecommitdiff
path: root/src/world.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/world.c')
-rw-r--r--src/world.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/src/world.c b/src/world.c
index cd46c4d..256aff1 100644
--- a/src/world.c
+++ b/src/world.c
@@ -19,6 +19,7 @@
#include "globals.h"
#include "hash.h"
+#include "multimap.h"
#include "room.h"
#include "world.h"
#include "userdb.h"
@@ -40,6 +41,7 @@ void world_save(const char *fname)
write_uint32(fd, WORLD_MAGIC);
write(fd, &world_sz, sizeof(world_sz));
write_string(fd, world_name);
+ write_uint64(fd, obj_get_idcounter());
/* write all the global verbs */
void *global_verbs = world_verb_map();
@@ -82,11 +84,18 @@ void world_save(const char *fname)
void *save;
while(1)
{
- struct object_t *obj = room_obj_iterate(id, &save);
- if(!obj)
+ const struct multimap_list *iter = room_obj_iterate(id, &save, NULL);
+ if(!iter)
break;
- id = ROOM_NONE;
- obj_write(fd, obj);
+ while(iter)
+ {
+ struct object_t *obj = iter->val;
+ if(!obj)
+ break;
+ id = ROOM_NONE;
+ obj_write(fd, obj);
+ iter = iter->next;
+ }
}
/* and now all the verbs... */
@@ -158,6 +167,8 @@ bool world_load(const char *fname, const struct roomdata_t *data, size_t data_sz
return false;
}
+ obj_set_idcounter(read_uint64(fd));
+
size_t n_global_verbs = read_size(fd);
for(unsigned i = 0; i < n_global_verbs; ++i)
{
@@ -185,8 +196,7 @@ bool world_load(const char *fname, const struct roomdata_t *data, size_t data_sz
{
struct object_t *obj = obj_read(fd);
- if(!room_obj_add(i, obj))
- error("duplicate object name in room '%s'", world[i].data.name);
+ room_obj_add(i, obj);
}
/* read room-local verbs */