diff options
| author | Franklin Wei <git@fwei.tk> | 2016-01-24 21:55:16 -0500 |
|---|---|---|
| committer | Franklin Wei <git@fwei.tk> | 2016-01-24 21:55:16 -0500 |
| commit | 7ba1da83c715175fb76c17098793091e6e8db788 (patch) | |
| tree | 5766f3524929288e18758f3647a52de537191aae /src/room.c | |
| parent | 6e3d6b3186bc07003d17ad7c54bb013c9b5d6dcf (diff) | |
| download | netcosm-7ba1da83c715175fb76c17098793091e6e8db788.zip netcosm-7ba1da83c715175fb76c17098793091e6e8db788.tar.gz netcosm-7ba1da83c715175fb76c17098793091e6e8db788.tar.bz2 netcosm-7ba1da83c715175fb76c17098793091e6e8db788.tar.xz | |
some more work on objects, still can't serialize
Diffstat (limited to 'src/room.c')
| -rw-r--r-- | src/room.c | 43 |
1 files changed, 28 insertions, 15 deletions
@@ -143,24 +143,37 @@ void world_free(void) } } -struct object_t *obj_new(void) -{ - struct object_t *obj = calloc(1, sizeof(struct object_t)); - /* generate a unique 128-bit id for this object */ - /* 64 bits are used to store a nanosecond-resolution timestamp */ - /* 64 random bits are also used */ - uint64_t timestamp; - struct timeval tv; - gettimeofday(&tv, NULL); - timestamp = (uint64_t)tv.tv_sec * (uint64_t)1000000 + (uint64_t)tv.tv_usec; +/* map of class names -> object classes */ +static void *obj_class_map = NULL; - uint64_t rand_bits; - arc4random_buf(&rand_bits, sizeof(rand_bits)); +struct object_t *obj_new(const char *class_name) +{ + if(!obj_class_map) + { + extern const struct obj_class_t netcosm_obj_classes[]; + extern const size_t netcosm_obj_classes_sz; + obj_class_map = hash_init(netcosm_obj_classes_sz / 2 + 1, + hash_djb, + compare_strings); + for(unsigned i = 0; i < netcosm_obj_classes_sz; ++i) + { + if(hash_insert(obj_class_map, + netcosm_obj_classes[i].class_name, + netcosm_obj_classes + i)) + error("duplicate object class name"); + } + } - obj->id.halves[0] = timestamp; - obj->id.halves[1] = rand_bits; + struct object_t *obj = calloc(1, sizeof(struct object_t)); - return obj; + obj->class = hash_lookup(obj_class_map, class_name); + if(!obj->class) + { + free(obj); + return NULL; + } + else + return obj; } bool obj_add(room_id room, struct object_t *obj) |