#include #include "adventure.h" int exec_quit(void) { return 0; } int exec_load(void) { if (load()) { return exec_look_around(); } else { return exec_quit(); } } int exec_save(void) { save(); return 1; } 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_quit, "bye" }, { &exec_load, "load" }, { &exec_save, "save" }, { &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 the 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)(); }