aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFranklin Wei <git@fwei.tk>2016-03-29 16:03:47 -0400
committerFranklin Wei <git@fwei.tk>2016-03-29 16:03:47 -0400
commit281bb06f483f571bdbb8e314a5bd951ed671e6d8 (patch)
treecfc7e2a4027574da7266ed61a1d55007d975518c
parent8426162eb0a463118e77e3fe32b96552565584a1 (diff)
downloadnetcosm-281bb06f483f571bdbb8e314a5bd951ed671e6d8.zip
netcosm-281bb06f483f571bdbb8e314a5bd951ed671e6d8.tar.gz
netcosm-281bb06f483f571bdbb8e314a5bd951ed671e6d8.tar.bz2
netcosm-281bb06f483f571bdbb8e314a5bd951ed671e6d8.tar.xz
fix things
-rw-r--r--src/client.c6
-rw-r--r--src/client_reqs.c9
-rw-r--r--src/server_reqs.c45
-rw-r--r--src/util.h2
-rw-r--r--src/world.h4
-rw-r--r--worlds/test.c108
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
diff --git a/src/util.h b/src/util.h
index 147e7c0..407836a 100644
--- a/src/util.h
+++ b/src/util.h
@@ -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 },
*/
};