diff options
| author | Franklin Wei <git@fwei.tk> | 2016-02-12 21:54:42 -0500 |
|---|---|---|
| committer | Franklin Wei <git@fwei.tk> | 2016-02-16 20:42:49 -0500 |
| commit | b110e7e0c519cc9575f8d224f0f75aca0d73946f (patch) | |
| tree | c3f33326a5e4822f2251e8d7370294096ab2eba4 /src/world.c | |
| parent | a006044fbcb3355f0fa063720e7c41f4971894a0 (diff) | |
| download | netcosm-b110e7e0c519cc9575f8d224f0f75aca0d73946f.zip netcosm-b110e7e0c519cc9575f8d224f0f75aca0d73946f.tar.gz netcosm-b110e7e0c519cc9575f8d224f0f75aca0d73946f.tar.bz2 netcosm-b110e7e0c519cc9575f8d224f0f75aca0d73946f.tar.xz | |
support multiple objects sharing the same name
Diffstat (limited to 'src/world.c')
| -rw-r--r-- | src/world.c | 22 |
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 */ |