diff options
| author | Franklin Wei <git@fwei.tk> | 2016-03-29 16:03:47 -0400 |
|---|---|---|
| committer | Franklin Wei <git@fwei.tk> | 2016-03-29 16:03:47 -0400 |
| commit | 281bb06f483f571bdbb8e314a5bd951ed671e6d8 (patch) | |
| tree | cfc7e2a4027574da7266ed61a1d55007d975518c | |
| parent | 8426162eb0a463118e77e3fe32b96552565584a1 (diff) | |
| download | netcosm-281bb06f483f571bdbb8e314a5bd951ed671e6d8.zip netcosm-281bb06f483f571bdbb8e314a5bd951ed671e6d8.tar.gz netcosm-281bb06f483f571bdbb8e314a5bd951ed671e6d8.tar.bz2 netcosm-281bb06f483f571bdbb8e314a5bd951ed671e6d8.tar.xz | |
fix things
| -rw-r--r-- | src/client.c | 6 | ||||
| -rw-r--r-- | src/client_reqs.c | 9 | ||||
| -rw-r--r-- | src/server_reqs.c | 45 | ||||
| -rw-r--r-- | src/util.h | 2 | ||||
| -rw-r--r-- | src/world.h | 4 | ||||
| -rw-r--r-- | worlds/test.c | 108 |
6 files changed, 133 insertions, 41 deletions
diff --git a/src/client.c b/src/client.c index 45139e8..89044b0 100644 --- a/src/client.c +++ b/src/client.c @@ -198,8 +198,6 @@ char *client_read_password(void) return ret; } -#define WSPACE " \t\r\n" - #define CMD_OK 0 #define CMD_LOGOUT 1 #define CMD_QUIT 2 @@ -308,9 +306,9 @@ int client_cb(char **save) else if(!strcmp(what, "KICK")) { char *pid_s = strtok_r(NULL, WSPACE, save); - all_upper(pid_s); if(pid_s) { + all_upper(pid_s); if(!strcmp(pid_s, "ALL")) { const char *msg = "Kicking everyone...\n"; @@ -420,7 +418,7 @@ int go_cb(char **save) client_look(); } else - out("Expected direction after GO.\n"); + out("I don't understand where you want me to go.\n"); return CMD_OK; } diff --git a/src/client_reqs.c b/src/client_reqs.c index a1cf947..36f341c 100644 --- a/src/client_reqs.c +++ b/src/client_reqs.c @@ -265,8 +265,13 @@ void client_look_at(char *obj) void client_take(char *obj) { - all_lower(obj); - send_master(REQ_TAKE, obj, strlen(obj) + 1); + if(obj) + { + all_lower(obj); + send_master(REQ_TAKE, obj, strlen(obj) + 1); + } + else + out("You must supply an object.\n"); } void client_inventory(void) diff --git a/src/server_reqs.c b/src/server_reqs.c index eadae9f..676403d 100644 --- a/src/server_reqs.c +++ b/src/server_reqs.c @@ -238,24 +238,27 @@ static void req_move_room(unsigned char *data, size_t datalen, struct child_data /* TODO: bounds checking on `dir' */ room_id new = current->adjacent[dir]; - struct room_t *new_room = room_get(new); - - if((!new_room->data.hook_enter || - (new_room->data.hook_enter && new_room->data.hook_enter(new, sender))) && - (!current->data.hook_leave || - (current->data.hook_leave && current->data.hook_leave(sender->room, sender)))) + + if(new == ROOM_NONE) { - room_user_del(sender->room, sender); - - if(new != ROOM_NONE) - { - - child_set_room(sender, new); - status = 1; - } - else - send_msg(sender, "You cannot go that way.\n"); + send_msg(sender, "You cannot go that way.\n"); } + else + { + struct room_t *new_room = room_get(new); + + if((!new_room->data.hook_enter || + (new_room->data.hook_enter && new_room->data.hook_enter(new, sender))) && + (!current->data.hook_leave || + (current->data.hook_leave && current->data.hook_leave(sender->room, sender)))) + { + room_user_del(sender->room, sender); + + child_set_room(sender, new); + status = 1; + } + } + send_packet(sender, REQ_MOVE, &status, sizeof(status)); } @@ -423,8 +426,16 @@ static void req_inventory(unsigned char *data, size_t datalen, struct child_data char *article = (is_vowel(name[0])?"An":"A"); strlcat(buf, article, sizeof(buf)); strlcat(buf, " ", sizeof(buf)); + strlcat(buf, name, sizeof(buf)); } - strlcat(buf, name, sizeof(buf)); + else + { + char tmp[2]; + tmp[0] = toupper(name[0]); + tmp[1] = '\0'; + strlcat(buf, tmp, sizeof(buf)); + strlcat(buf, name + 1, sizeof(buf)); + } strlcat(buf, "\n", sizeof(buf)); } else @@ -21,6 +21,8 @@ #include "room.h" +#define WSPACE " \t\r\n" + /* utility functions */ void __attribute__((noreturn,format(printf,1,2))) error(const char *fmt, ...); void __attribute__((format(printf,4,5))) debugf_real(const char*, int, const char*, const char *fmt, ...); diff --git a/src/world.h b/src/world.h index 7749a63..50f9769 100644 --- a/src/world.h +++ b/src/world.h @@ -48,11 +48,11 @@ void world_save(const char *fname); /* loads the world from disk */ bool world_load(const char *fname, const struct roomdata_t *data, size_t data_sz, const char *world_name); -/** verbs **/ +/** global verbs **/ bool world_verb_add(struct verb_t*); bool world_verb_del(struct verb_t*); -/* gets the map of verbs */ +/* gets the map of global verbs */ void *world_verb_map(void); void world_free(void); diff --git a/worlds/test.c b/worlds/test.c index 64dcfdb..d4d5fb1 100644 --- a/worlds/test.c +++ b/worlds/test.c @@ -15,6 +15,15 @@ static void deadend_init(room_id id) new = obj_copy(new); room_obj_add(id, new); #endif + + struct verb_t *verb = verb_new("dig"); + verb->name = strdup("dig"); + world_verb_add(verb); + + verb = verb_new("put"); + verb->name = strdup("put"); + world_verb_add(verb); + } static void ew_road_init(room_id id) @@ -29,30 +38,26 @@ static void ew_road_init(room_id id) static void fork_init(room_id id) { - struct verb_t *new = verb_new("dig"); - new->name = strdup("dig"); - room_verb_add(id, new); - room_get(id)->userdata = calloc(1, sizeof(bool)); /* flag for whether the user has already dug */ bool *b = room_get(id)->userdata; *b = false; } -static void fork_ser(room_id id, int fd) +static void bool_ser(room_id id, int fd) { bool *b = room_get(id)->userdata; write_bool(fd, *b); } -static void fork_deser(room_id id, int fd) +static void bool_deser(room_id id, int fd) { bool *b = calloc(1, sizeof(bool)); *b = read_bool(fd); room_get(id)->userdata = b; } -static void fork_destroy(room_id id) +static void bool_destroy(room_id id) { free(room_get(id)->userdata); } @@ -110,6 +115,16 @@ static void mailroom_init(room_id id) static void computer_room_init(room_id id) { + struct object_t *new = obj_new("/generic/notake"); + new->name = strdup("computer"); + new->userdata = strdup("I see nothing special about that."); + new->hidden = true; + + room_obj_add(id, new); + room_obj_add_alias(id, new, "vax"); + + /* flag for whether computer is active */ + room_get(id)->userdata = malloc(sizeof(bool)); } const struct roomdata_t netcosm_world[] = { @@ -147,9 +162,9 @@ const struct roomdata_t netcosm_world[] = { fork_init, NULL, NULL, - fork_ser, - fork_deser, - fork_destroy, + bool_ser, + bool_deser, + bool_destroy, }, { @@ -251,9 +266,9 @@ const struct roomdata_t netcosm_world[] = { computer_room_init, NULL, NULL, - NULL, - NULL, - NULL, + bool_ser, + bool_deser, + bool_destroy, }, }; @@ -390,6 +405,8 @@ static void dig_exec(struct verb_t *verb, char *args, user_t *user) goto nothing; } } + else + send_msg(user, "Digging here reveals nothing.\n"); return; @@ -397,19 +414,78 @@ nothing: send_msg(user, "Digging here reveals nothing.\n"); } +static void put_exec(struct verb_t *verb, char *args, user_t *user) +{ + char *save; + const char *obj_name = strtok_r(args, WSPACE, &save); + + if(!obj_name) + { + send_msg(user, "You must supply an object\n"); + return; + } + + args = NULL; + const struct multimap_list *list = multimap_lookup(userdb_lookup(user->user)->objects, + obj_name, NULL); + if(!list) + { + send_msg(user, "You don't have that.\n"); + return; + } + + struct object_t *obj = list->val; + + /* original dunnet ignores the preposition */ + const char *prep = strtok_r(args, WSPACE, &save); + + const char *ind_obj_name = strtok_r(args, WSPACE, &save); + + if(!ind_obj_name) + { + send_msg(user, "You must supply an indirect object.\n"); + return; + } + + list = room_obj_get(user->room, ind_obj_name); + + if(!list) + { + send_msg(user, "I don't know what that indirect object is.\n"); + return; + } + + struct object_t *ind_obj = list->val; + + /* now execute the verb */ + if(!strcmp(obj->name, "CPU card") && !strcmp(ind_obj->name, "computer") && user->room == room_get_id("computer_room")) + { + userdb_del_obj_by_ptr(user->user, obj); + send_msg(user, "As you put the CPU board in the computer, it immediately springs to life. The lights start flashing, and the fans seem to startup.\n"); + bool *b = room_get(user->room)->userdata; + *b = true; + } + else + { + send_msg(user, "I don't know how to combine those objects. Perhaps you should just try dropping it.\n"); + } +} + +/* global verbs */ + const struct verb_class_t netcosm_verb_classes[] = { { "dig", dig_exec }, + { "put", + put_exec }, /* { "shake", shake_exec }, { "climb", climb_exec }, - { "put", - put_exec }, { "eat", eat_exec }, - { "feed", + { "feed", feed_exec }, */ }; |