#include #include #include #include "texad.h" struct command commands[] = { {LOOK , "l" }, {GO_NORTH , "n" }, {GO_SOUTH , "s" }, {GO_EAST , "e" }, {GO_WEST , "w" }, {QUIT , "q" }, {UNKNOWN , NULL} }; struct world *genesis(void) { struct world *w; struct player *p; struct room *r[3]; struct door *d[4]; unsigned int i; w = malloc(sizeof *w); p = malloc(sizeof *p); for (i = 0; i < sizeof r / sizeof *r; i++) r[i] = malloc(sizeof *r); for (i = 0; i < sizeof d / sizeof *d; i++) d[i] = malloc(sizeof *d); r[0]->title = "The foo room"; r[0]->description = "You are in the foo room. Sunlight streams from the windows."; r[1]->title = "The bar room"; r[1]->description = "You are in the bar room. A vague sense of despair washes over you."; r[2]->title = "The baz room"; r[2]->description = "You are in the baz room. It is richly furnished."; d[0]->direction = EAST; d[0]->src = r[0]; d[0]->dst = r[1]; d[1]->direction = WEST; d[1]->src = r[1]; d[1]->dst = r[0]; d[2]->direction = NORTH; d[2]->src = r[1]; d[2]->dst = r[2]; d[3]->direction = SOUTH; d[3]->src = r[2]; d[3]->dst = r[1]; struct door *ds[][3] = { {d[0], NULL, NULL}, {d[1], d[2], NULL}, {d[3], NULL, NULL} }; for (i = 0; i < sizeof r / sizeof *r; i++) { r[i]->doors = malloc(sizeof ds[i]); memcpy(r[i]->doors, ds[i], sizeof ds[i]); } p->room = r[0]; w->player = p; return w; } void apocalypse(struct world *w) { free(w->player->room); free(w->player); free(w); } int main(void) { struct world *w; w = genesis(); while (loop(w)); apocalypse(w); exit(EXIT_SUCCESS); } void look(struct room *r) { printf("%s: %s\n", r->title, r->description); return; } void move(struct player *p, enum direction dir) { struct door **ds; for (ds = p->room->doors; *ds; ds++) { if ((*ds)->direction != dir) continue; p->room = (*ds)->dst; look(p->room); return; } puts("You can't go that way."); return; } enum action parse(char *s) { unsigned long i; s[strcspn(s, "\n")] = 0; for (i = 0; i < sizeof commands / sizeof *commands; i++) if (commands[i].string && !strcmp(commands[i].string, s)) return commands[i].action; return UNKNOWN; } int loop(struct world *w) { char input[INPUT_LIMIT]; enum action a; printf("%s", PROMPT); if (fgets(input, INPUT_LIMIT, stdin) != NULL) { a = parse(input); switch (a) { case LOOK: look(w->player->room); return 1; case QUIT: return 0; case GO_NORTH: move(w->player, NORTH); return 1; case GO_SOUTH: move(w->player, SOUTH); return 1; case GO_EAST: move(w->player, EAST); return 1; case GO_WEST: move(w->player, WEST); return 1; case UNKNOWN: printf("What is \"%s\"?\n", input); return 1; } } else { puts(""); } return 0; }