aboutsummaryrefslogtreecommitdiff
path: root/src/room.c
diff options
context:
space:
mode:
authorFranklin Wei <git@fwei.tk>2016-01-24 21:55:16 -0500
committerFranklin Wei <git@fwei.tk>2016-01-24 21:55:16 -0500
commit7ba1da83c715175fb76c17098793091e6e8db788 (patch)
tree5766f3524929288e18758f3647a52de537191aae /src/room.c
parent6e3d6b3186bc07003d17ad7c54bb013c9b5d6dcf (diff)
downloadnetcosm-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.c43
1 files changed, 28 insertions, 15 deletions
diff --git a/src/room.c b/src/room.c
index 3e708f6..ff84c94 100644
--- a/src/room.c
+++ b/src/room.c
@@ -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)