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 | |
| 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')
| -rw-r--r-- | src/room.c | 43 | ||||
| -rw-r--r-- | src/room.h | 57 | ||||
| -rw-r--r-- | src/server.c | 1 | ||||
| -rw-r--r-- | src/server_reqs.c | 6 |
4 files changed, 63 insertions, 44 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) @@ -25,34 +25,30 @@ typedef enum room_id { ROOM_NONE = -1 } room_id; -typedef struct int128 { - uint64_t halves[2]; -} int128; - -typedef int128 obj_id; - typedef struct child_data user_t; enum direction_t { DIR_N = 0, DIR_NE, DIR_E, DIR_SE, DIR_S, DIR_SW, DIR_W, DIR_NW, DIR_UP, DIR_DN, DIR_IN, DIR_OT, NUM_DIRECTIONS }; -/* the data we get from a world module */ -struct roomdata_t { - /* the non-const pointers can be modified by the world module */ - const char * const uniq_id; +/* Objects belong to an object class. Objects define their object + * class through the class name, which is converted to a class ID + * internally. + */ - /* mutable properties */ - char *name; - char *desc; +struct object_t; - const char * const adjacent[NUM_DIRECTIONS]; +struct obj_class_t { + const char *class_name; - void (* const hook_init)(room_id id); - void (* const hook_enter)(room_id room, user_t *user); - void (* const hook_leave)(room_id room, user_t *user); + void (*hook_serialize)(int fd, struct object_t*); + bool (*hook_take)(struct object_t*, user_t *user); + void (*hook_drop)(struct object_t*, user_t *user); + void (*hook_use)(struct object_t*, user_t *user); + void (*hook_destroy)(struct object_t*); + const char* (*hook_desc)(struct object_t*, user_t*); }; struct object_t { - obj_id id; // don't modify + struct obj_class_t *class; const char *name; /* no articles: "a", "an", "the" */ @@ -60,13 +56,22 @@ struct object_t { bool can_take; bool list; +}; - void (*hook_serialize)(int fd, struct object_t*); - bool (*hook_take)(struct object_t*, user_t *user); - void (*hook_drop)(struct object_t*, user_t *user); - void (*hook_use)(struct object_t*, user_t *user); - void (*hook_destroy)(struct object_t*); - const char* (*hook_desc)(struct object_t*, user_t*); +/* the data we get from a world module */ +struct roomdata_t { + /* the non-const pointers can be modified by the world module */ + const char * const uniq_id; + + /* mutable properties */ + const char *name; + const char *desc; + + const char * const adjacent[NUM_DIRECTIONS]; + + void (* const hook_init)(room_id id); + void (* const hook_enter)(room_id room, user_t *user); + void (* const hook_leave)(room_id room, user_t *user); }; struct verb_t { @@ -97,8 +102,8 @@ struct room_t *room_get(room_id id); bool room_user_add(room_id id, struct child_data *child); bool room_user_del(room_id id, struct child_data *child); -/* returns a new object with a unique id */ -struct object_t *obj_new(void); +/* returns a new object of class 'c' */ +struct object_t *obj_new(const char *c); /* new should point to a new object allocated with obj_new(), with * 'name' properly set */ diff --git a/src/server.c b/src/server.c index b8d5bb4..105b648 100644 --- a/src/server.c +++ b/src/server.c @@ -155,6 +155,7 @@ static void load_worldfile(void) { extern const struct roomdata_t netcosm_world[]; extern const size_t netcosm_world_sz; + extern const char *netcosm_world_name; if(access(WORLDFILE, F_OK) < 0) diff --git a/src/server_reqs.c b/src/server_reqs.c index 7f82236..b78bf56 100644 --- a/src/server_reqs.c +++ b/src/server_reqs.c @@ -24,7 +24,7 @@ /* sends a single packet to a child, virtually guarantees receipt */ static void send_packet(struct child_data *child, unsigned char cmd, - void *data, size_t datalen) + const void *data, size_t datalen) { assert(datalen < MSG_MAX); unsigned char pkt[MSG_MAX]; @@ -133,7 +133,7 @@ static void req_send_desc(unsigned char *data, size_t datalen, struct child_data { (void) data; (void) datalen; (void) sender; struct room_t *room = room_get(sender->room); - send_packet(sender, REQ_BCASTMSG, room->data.desc, strlen(room->data.desc)); + send_packet(sender, REQ_BCASTMSG, (void*)room->data.desc, strlen(room->data.desc)); send_packet(sender, REQ_PRINTNEWLINE, NULL, 0); @@ -259,7 +259,7 @@ static void req_look_at(unsigned char *data, size_t datalen, struct child_data * struct object_t *obj = room_obj_get(sender->room, (const char*)data); if(obj) { - const char *desc = obj->hook_desc(obj, sender); + const char *desc = obj->class->hook_desc(obj, sender); send_packet(sender, REQ_BCASTMSG, (void*)desc, strlen(desc)); send_packet(sender, REQ_PRINTNEWLINE, NULL, 0); } |