#include "adventure.h" #include int exec_quit(void) { return 0; } int exec_no_match(void) { struct param *par = param_by_letter('A'); if (par->distance != dist_no_obj_specified) printf("I don't know how to %s.\n", par->tag); return 1; } int exec_look_around(void) { printf("You are in %s.\n", player->location->description); list_objs_at_loc(player->location); return 1; } int exec_look(void) { struct param *par = param_by_letter('A'); struct object *obj = par->object; enum distance dist = par->distance; if (dist >= dist_unknown_obj) printf("I don't understand what you want to see.\n"); else if (dist == dist_not_here) printf("You don't see any %s here.\n", par->tag); else if (dist == dist_overthere) printf("You squeeze your eyes, but %s is too far away.\n", par->tag); else if (dist == dist_here_contained) printf("Hard to see, try to get it first.\n"); else { printf("%s\n", obj->details); list_objs_at_loc(obj); } return 1; } int exec_go(void) { struct param *par = param_by_letter('A'); struct object *obj = par->object; enum distance dist = par->distance; if (dist >= dist_unknown_obj) printf("I don't understand where you want to go.\n"); else if (dist == dist_location) printf("You are already there.\n"); else if (dist == dist_overthere) move_player(get_passage_to(obj)); else if (dist == dist_here) move_player(obj); else if (dist < dist_not_here) printf("You can't get any closer than this.\n"); else printf("You don't see any %s here.\n", "XXX"); return 1; } int exec_get_from(void) { return move_object(param_by_letter('A'), param_by_letter('B')->object, player); } int exec_get(void) { return move_object(param_by_letter('A'), player->location, player); } int exec_drop(void) { return move_object(param_by_letter('A'), player, player->location); } int exec_give(void) { return move_object(param_by_letter('A'), player, person_here()); } int exec_ask(void) { return move_object(param_by_letter('A'), person_here(), player); } int exec_put_in(void) { return move_object(param_by_letter('A'), player, param_by_letter('B')->object); } int exec_inventory(void) { if (list_objs_at_loc(player) == 0) printf("You are empty-handed.\n"); return 1; } int exec_open(void) { struct param *par = param_by_letter('A'); if (object_within_reach("open", par)) printf("%s\n", (par->object->open)(par->object)); return 1; } int exec_close(void) { struct param *par = param_by_letter('A'); if (object_within_reach("close", par)) printf("%s\n", (par->object->close)(par->object)); return 1; } int exec_lock(void) { struct param *par = param_by_letter('A'); if (object_within_reach("lock", par)) printf("%s\n", (par->object->lock)(par->object)); return 1; } int exec_unlock(void) { struct param *par = param_by_letter('A'); if (object_within_reach("unlock", par)) printf("%s\n", (par->object->unlock)(par->object)); return 1; } int parseexec(const char *input) { static const struct command commands[] = { {&exec_quit, "quit"}, {&exec_look_around, "look"}, {&exec_look_around, "look around"}, {&exec_look, "look at A?"}, {&exec_look, "look A?"}, {&exec_go, "go to the A?"}, {&exec_go, "go to A?"}, {&exec_go, "go A?"}, {&exec_get_from, "get A from B?"}, {&exec_get, "get the A?"}, {&exec_get, "get A?"}, {&exec_get, "pick up the A?"}, {&exec_get, "pick up a A?"}, {&exec_get, "pick up A?"}, {&exec_get, "pick the A?"}, {&exec_get, "pick a A?"}, {&exec_get, "pick A?"}, {&exec_put_in, "put A in B?"}, {&exec_put_in, "drop A in B?"}, {&exec_drop, "drop A?"}, {&exec_give, "give A?"}, {&exec_ask, "ask A?"}, {&exec_inventory, "inventory"}, {&exec_open, "open A?"}, {&exec_close, "close A?"}, {&exec_lock, "lock A?"}, {&exec_unlock, "unlock A?"}, {&exec_no_match, "A?"}, }; const struct command *cmd; for (cmd = commands; !match_command(input, cmd->pattern); ++cmd) ; return (*cmd->fn)(); }