aboutsummaryrefslogtreecommitdiff
path: root/src
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
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')
-rw-r--r--src/room.c43
-rw-r--r--src/room.h57
-rw-r--r--src/server.c1
-rw-r--r--src/server_reqs.c6
4 files changed, 63 insertions, 44 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)
diff --git a/src/room.h b/src/room.h
index 485e307..ad5304f 100644
--- a/src/room.h
+++ b/src/room.h
@@ -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);
}