iUI: Add pazz0's dungeon-crawler-like interface - sacc - sacc(omys), simple console gopher client Err bitreich.org 70 hgit clone git://bitreich.org/sacc/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/sacc/ URL:git://bitreich.org/sacc/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/sacc/ bitreich.org 70 1Log /scm/sacc/log.gph bitreich.org 70 1Files /scm/sacc/files.gph bitreich.org 70 1Refs /scm/sacc/refs.gph bitreich.org 70 1Tags /scm/sacc/tag bitreich.org 70 1LICENSE /scm/sacc/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 1commit d16bb53db353da7b817b18809adf57b57c4f973e /scm/sacc/commit/d16bb53db353da7b817b18809adf57b57c4f973e.gph bitreich.org 70 1parent 0fce134e1baa2ae47aeb0ee7c091e6c25651bcea /scm/sacc/commit/0fce134e1baa2ae47aeb0ee7c091e6c25651bcea.gph bitreich.org 70 hAuthor: Quentin Rameau URL:mailto:quinq@fifth.space bitreich.org 70 iDate: Thu, 28 Mar 2024 12:13:51 +0100 Err bitreich.org 70 i Err bitreich.org 70 iUI: Add pazz0's dungeon-crawler-like interface Err bitreich.org 70 i Err bitreich.org 70 iThis definitely looks fun and interesting Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i A ui_rogue.c | 938 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i Err bitreich.org 70 i1 file changed, 938 insertions(+), 0 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/ui_rogue.c b/ui_rogue.c /scm/sacc/file/ui_rogue.c.gph bitreich.org 70 i@@ -0,0 +1,938 @@ Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+ Err bitreich.org 70 i+#include "common.h" Err bitreich.org 70 i+#include "config.h" Err bitreich.org 70 i+ Err bitreich.org 70 i+#define C(c) #c Err bitreich.org 70 i+#define S(c) C(c) Err bitreich.org 70 i+ Err bitreich.org 70 i+/* ncurses doesn't define those in term.h, where they're used */ Err bitreich.org 70 i+#ifndef OK Err bitreich.org 70 i+#define OK (0) Err bitreich.org 70 i+#endif Err bitreich.org 70 i+#ifndef ERR Err bitreich.org 70 i+#define ERR (-1) Err bitreich.org 70 i+#endif Err bitreich.org 70 i+ Err bitreich.org 70 i+static struct termios tsave; Err bitreich.org 70 i+static struct termios tsacc; Err bitreich.org 70 i+static Item *curentry; Err bitreich.org 70 i+static int termset = ERR; Err bitreich.org 70 i+static char bufout[256]; Err bitreich.org 70 i+static char bufout2[256]; Err bitreich.org 70 i+ Err bitreich.org 70 i+void drawscreen(void); Err bitreich.org 70 i+ Err bitreich.org 70 i+uint32_t Err bitreich.org 70 i+fnv1a(int n,...) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ int i; Err bitreich.org 70 i+ char *s; Err bitreich.org 70 i+ va_list l; Err bitreich.org 70 i+ uint32_t h; Err bitreich.org 70 i+ Err bitreich.org 70 i+ h = 0x811c9dc5; Err bitreich.org 70 i+ Err bitreich.org 70 i+ va_start(l, n); Err bitreich.org 70 i+ for (i = 0; i < n; i++) { Err bitreich.org 70 i+ for (s = va_arg(l, char*); *s; s++) { Err bitreich.org 70 i+ h ^= *s; Err bitreich.org 70 i+ h *= 0x01000193; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } Err bitreich.org 70 i+ va_end(l); Err bitreich.org 70 i+ Err bitreich.org 70 i+ return h; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+uint32_t Err bitreich.org 70 i+xorshift(uint32_t *s) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ *s ^= *s << 13; Err bitreich.org 70 i+ *s ^= *s >> 17; Err bitreich.org 70 i+ *s ^= *s << 5; Err bitreich.org 70 i+ return *s; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+struct cell { Err bitreich.org 70 i+ char c; Err bitreich.org 70 i+ size_t nitems; Err bitreich.org 70 i+ Item **items; Err bitreich.org 70 i+}; Err bitreich.org 70 i+ Err bitreich.org 70 i+#define MAPHEIGHT (25) Err bitreich.org 70 i+#define MAPWIDTH (80) Err bitreich.org 70 i+struct cell map[MAPHEIGHT][MAPWIDTH]; Err bitreich.org 70 i+ Err bitreich.org 70 i+struct room { Err bitreich.org 70 i+ struct room *p; Err bitreich.org 70 i+ void *d; Err bitreich.org 70 i+ size_t x, y; Err bitreich.org 70 i+ size_t w, h; Err bitreich.org 70 i+}; Err bitreich.org 70 i+ Err bitreich.org 70 i+struct rect { Err bitreich.org 70 i+ struct rect *next, *next2; Err bitreich.org 70 i+ struct room *room; Err bitreich.org 70 i+ size_t x1, y1; Err bitreich.org 70 i+ size_t x2, y2; Err bitreich.org 70 i+ size_t d; Err bitreich.org 70 i+}; Err bitreich.org 70 i+ Err bitreich.org 70 i+struct rect * Err bitreich.org 70 i+randomneighbor(struct rect *x, struct rect *rs, uint32_t *prng) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ struct rect *r, *result; Err bitreich.org 70 i+ size_t n; Err bitreich.org 70 i+ Err bitreich.org 70 i+ n = 0; Err bitreich.org 70 i+ result = NULL; Err bitreich.org 70 i+ for (r = rs; r; r = r->next) { Err bitreich.org 70 i+ if (r->y2 < x->y1 || r->y1 > x->y2 || r->x2 < x->x1 || r->x1 > x->x2) Err bitreich.org 70 i+ continue; Err bitreich.org 70 i+ if ((r->y2 == x->y1 || r->y1 == x->y2) && (r->x2 == x->x1 || r->x1 == x->x2)) Err bitreich.org 70 i+ continue; Err bitreich.org 70 i+ n++; Err bitreich.org 70 i+ if (xorshift(prng) / (1. + UINT32_MAX) < 1. / n) Err bitreich.org 70 i+ result = r; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ return result; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+#define ROOM_HEIGHT_MIN 3 Err bitreich.org 70 i+#define ROOM_WIDTH_MIN 5 Err bitreich.org 70 i+#define ROOM_MARGIN_MIN 1 Err bitreich.org 70 i+#define CELL_HEIGHT_MIN (ROOM_HEIGHT_MIN + ROOM_MARGIN_MIN + 3) Err bitreich.org 70 i+#define CELL_WIDTH_MIN (ROOM_WIDTH_MIN + ROOM_MARGIN_MIN + 3) Err bitreich.org 70 i+size_t Err bitreich.org 70 i+generaterooms_gnarf(uint32_t prng, struct room *rs, size_t l) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ struct rect *queuehead, *queuetail; Err bitreich.org 70 i+ struct rect *r, *t; Err bitreich.org 70 i+ struct rect *rects, *walk; Err bitreich.org 70 i+ size_t w, h, i, j, rl, n; Err bitreich.org 70 i+ int vertical; Err bitreich.org 70 i+ struct room *room; Err bitreich.org 70 i+ Err bitreich.org 70 i+ r = malloc(sizeof(*r)); Err bitreich.org 70 i+ r->x1 = r->y1 = ROOM_MARGIN_MIN; Err bitreich.org 70 i+ r->x2 = MAPWIDTH; Err bitreich.org 70 i+ r->y2 = MAPHEIGHT; Err bitreich.org 70 i+ r->d = 0; Err bitreich.org 70 i+ Err bitreich.org 70 i+ queuetail = r; Err bitreich.org 70 i+ queuetail->next = NULL; Err bitreich.org 70 i+ queuehead = r; Err bitreich.org 70 i+ Err bitreich.org 70 i+ rects = NULL; Err bitreich.org 70 i+ rl = 0; Err bitreich.org 70 i+ Err bitreich.org 70 i+ while (queuehead) { Err bitreich.org 70 i+ r = queuehead; Err bitreich.org 70 i+ if (queuetail == queuehead) Err bitreich.org 70 i+ queuetail = NULL; Err bitreich.org 70 i+ queuehead = queuehead->next; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (r->x2 - r->x1 >= CELL_WIDTH_MIN * 2 && r->y2 - r->y1 >= CELL_HEIGHT_MIN * 2) { Err bitreich.org 70 i+ vertical = xorshift(&prng) & 1; Err bitreich.org 70 i+ } else if (r->x2 - r->x1 >= CELL_WIDTH_MIN * 2) { Err bitreich.org 70 i+ vertical = 0; Err bitreich.org 70 i+ } else if (r->y2 - r->y1 >= CELL_HEIGHT_MIN * 2) { Err bitreich.org 70 i+ vertical = 1; Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ r->next = rects; Err bitreich.org 70 i+ rects = r; Err bitreich.org 70 i+ rl++; Err bitreich.org 70 i+ continue; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (vertical) { Err bitreich.org 70 i+ w = r->x2 - r->x1; Err bitreich.org 70 i+ h = CELL_HEIGHT_MIN + xorshift(&prng) % (1 + r->y2 - r->y1 - CELL_HEIGHT_MIN * 2); Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ w = CELL_WIDTH_MIN + xorshift(&prng) % (1 + r->x2 - r->x1 - CELL_WIDTH_MIN * 2); Err bitreich.org 70 i+ h = r->y2 - r->y1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ t = malloc(sizeof(*t)); Err bitreich.org 70 i+ t->x1 = r->x1; Err bitreich.org 70 i+ t->y1 = r->y1; Err bitreich.org 70 i+ t->x2 = r->x1 + w; Err bitreich.org 70 i+ t->y2 = r->y1 + h; Err bitreich.org 70 i+ t->d = r->d + 1; Err bitreich.org 70 i+ t->next = NULL; Err bitreich.org 70 i+ t->room = NULL; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (!queuetail) { Err bitreich.org 70 i+ queuehead = t; Err bitreich.org 70 i+ queuetail = t; Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ queuetail->next = t; Err bitreich.org 70 i+ queuetail = t; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ t = malloc(sizeof(*t)); Err bitreich.org 70 i+ if (vertical) { Err bitreich.org 70 i+ t->x1 = r->x1; Err bitreich.org 70 i+ t->y1 = r->y1 + h; Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ t->x1 = r->x1 + w; Err bitreich.org 70 i+ t->y1 = r->y1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ t->x2 = r->x2; Err bitreich.org 70 i+ t->y2 = r->y2; Err bitreich.org 70 i+ t->d = r->d + 1; Err bitreich.org 70 i+ t->next = NULL; Err bitreich.org 70 i+ t->room = NULL; Err bitreich.org 70 i+ Err bitreich.org 70 i+ queuetail->next = t; Err bitreich.org 70 i+ queuetail = t; Err bitreich.org 70 i+ Err bitreich.org 70 i+ free(r); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (l > rl) Err bitreich.org 70 i+ l = rl; Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (r = rects; r; r = r->next) { Err bitreich.org 70 i+ if (MAPHEIGHT / 2 >= r->y1 && MAPHEIGHT / 2 < r->y2 && Err bitreich.org 70 i+ MAPWIDTH / 2 >= r->x1 && MAPWIDTH / 2 < r->x2) Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ i = 0; Err bitreich.org 70 i+ rs[i].w = ROOM_WIDTH_MIN + xorshift(&prng) % (1 + r->x2 - r->x1 - ROOM_MARGIN_MIN - ROOM_WIDTH_MIN); Err bitreich.org 70 i+ rs[i].h = ROOM_HEIGHT_MIN + xorshift(&prng) % (1 + r->y2 - r->y1 - ROOM_MARGIN_MIN - ROOM_HEIGHT_MIN); Err bitreich.org 70 i+ rs[i].x = r->x1 + xorshift(&prng) % (1 + r->x2 - r->x1 - ROOM_MARGIN_MIN - rs[i].w); Err bitreich.org 70 i+ rs[i].y = r->y1 + xorshift(&prng) % (1 + r->y2 - r->y1 - ROOM_MARGIN_MIN - rs[i].h); Err bitreich.org 70 i+ rs[i].p = NULL; Err bitreich.org 70 i+ r->room = &rs[i]; Err bitreich.org 70 i+ Err bitreich.org 70 i+ walk = r; Err bitreich.org 70 i+ walk->next2 = NULL; Err bitreich.org 70 i+ Err bitreich.org 70 i+ i++; Err bitreich.org 70 i+ for (; i < l;) { Err bitreich.org 70 i+ t = randomneighbor(r, rects, &prng); Err bitreich.org 70 i+ if (!t || t->room) { Err bitreich.org 70 i+ n = 0; Err bitreich.org 70 i+ for (t = walk; t; t = t->next2) { Err bitreich.org 70 i+ n++; Err bitreich.org 70 i+ if (xorshift(&prng) / (1. + UINT32_MAX) < 1. / n) Err bitreich.org 70 i+ r = t; Err bitreich.org 70 i+ Err bitreich.org 70 i+ } Err bitreich.org 70 i+ continue; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ rs[i].w = ROOM_WIDTH_MIN + xorshift(&prng) % (1 + t->x2 - t->x1 - ROOM_MARGIN_MIN - ROOM_WIDTH_MIN); Err bitreich.org 70 i+ rs[i].h = ROOM_HEIGHT_MIN + xorshift(&prng) % (1 + t->y2 - t->y1 - ROOM_MARGIN_MIN - ROOM_HEIGHT_MIN); Err bitreich.org 70 i+ rs[i].x = t->x1 + xorshift(&prng) % (1 + t->x2 - t->x1 - ROOM_MARGIN_MIN - rs[i].w); Err bitreich.org 70 i+ rs[i].y = t->y1 + xorshift(&prng) % (1 + t->y2 - t->y1 - ROOM_MARGIN_MIN - rs[i].h); Err bitreich.org 70 i+ rs[i].p = r->room; Err bitreich.org 70 i+ t->room = &rs[i]; Err bitreich.org 70 i+ i++; Err bitreich.org 70 i+ r = t; Err bitreich.org 70 i+ r->next2 = walk; Err bitreich.org 70 i+ walk = r; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (r = rects; r;) { Err bitreich.org 70 i+ t = r->next; Err bitreich.org 70 i+ free(r); Err bitreich.org 70 i+ r = t; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ return l; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+size_t Err bitreich.org 70 i+distance(size_t x1, size_t y1, size_t x2, size_t y2) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ size_t d; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (y1 < y2) Err bitreich.org 70 i+ d = y2 - y1; Err bitreich.org 70 i+ else Err bitreich.org 70 i+ d = y1 - y2; Err bitreich.org 70 i+ if (x1 < x2) Err bitreich.org 70 i+ d += x2 - x1; Err bitreich.org 70 i+ else Err bitreich.org 70 i+ d += x1 - x2; Err bitreich.org 70 i+ Err bitreich.org 70 i+ return d; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+nearestpoints(struct room *a, struct room *b, size_t *ax, size_t *ay, size_t *bx, size_t *by) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ if (a->y >= b->y && a->y < b->y + b->h) { Err bitreich.org 70 i+ *ay = *by = a->y; Err bitreich.org 70 i+ } else if (b->y >= a->y && b->y < a->y + a->h) { Err bitreich.org 70 i+ *ay = *by = b->y; Err bitreich.org 70 i+ } else if (a->y >= b->y) { Err bitreich.org 70 i+ *ay = a->y; Err bitreich.org 70 i+ *by = b->y + b->h - 1; Err bitreich.org 70 i+ } else if (b->y >= a->y) { Err bitreich.org 70 i+ *ay = a->y + a->h - 1; Err bitreich.org 70 i+ *by = b->y; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (a->x >= b->x && a->x < b->x + b->w) { Err bitreich.org 70 i+ *ax = *bx = a->x; Err bitreich.org 70 i+ } else if (b->x >= a->x && b->x < a->x + a->w) { Err bitreich.org 70 i+ *ax = *bx = b->x; Err bitreich.org 70 i+ } else if (a->x >= b->x) { Err bitreich.org 70 i+ *ax = a->x; Err bitreich.org 70 i+ *bx = b->x + b->w - 1; Err bitreich.org 70 i+ } else if (b->x >= a->x) { Err bitreich.org 70 i+ *ax = a->x + a->w - 1; Err bitreich.org 70 i+ *bx = b->x; Err bitreich.org 70 i+ } Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+connectrooms(struct room *a, struct room *b) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ size_t i, j; Err bitreich.org 70 i+ ssize_t ii; Err bitreich.org 70 i+ size_t x1, y1; Err bitreich.org 70 i+ size_t x2, y2; Err bitreich.org 70 i+ Err bitreich.org 70 i+ nearestpoints(a, b, &x1, &y1, &x2, &y2); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (y1 > y2) { Err bitreich.org 70 i+ ii = -1; Err bitreich.org 70 i+ } else if (y2 > y1) { Err bitreich.org 70 i+ ii = 1; Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ ii = 0; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+/* Err bitreich.org 70 i+printf("%lu\t%lu\t%d\n", y1, y2, ii); Err bitreich.org 70 i+*/ Err bitreich.org 70 i+ for (i = y1; i != y2; i += ii) Err bitreich.org 70 i+ map[i][x1].c = '.'; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (x1 > x2) { Err bitreich.org 70 i+ ii = -1; Err bitreich.org 70 i+ } else if (x2 > x1) { Err bitreich.org 70 i+ ii = 1; Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ ii = 0; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (i = x1; i != x2; i += ii) Err bitreich.org 70 i+ map[y2][i].c = '.'; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+rendermap(void) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ size_t i, j; Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (i = 0; i < MAPHEIGHT; i++) { Err bitreich.org 70 i+ for (j = 0; j < MAPWIDTH; j++) Err bitreich.org 70 i+ putchar(map[i][j].c); Err bitreich.org 70 i+ putchar('\n'); Err bitreich.org 70 i+ } Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+size_t Err bitreich.org 70 i+placeitems_hash(Item *item, size_t *assocs, size_t k) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ Dir *dir; Err bitreich.org 70 i+ Item *citem; Err bitreich.org 70 i+ size_t i; Err bitreich.org 70 i+ Err bitreich.org 70 i+ dir = item->dat; Err bitreich.org 70 i+ for (i = 0; i < dir->nitems; i++) { Err bitreich.org 70 i+ citem = &dir->items[i]; Err bitreich.org 70 i+ /* TODO Somewhere else */ Err bitreich.org 70 i+ if (!citem->host || !citem->port || !citem->selector) Err bitreich.org 70 i+ continue; Err bitreich.org 70 i+ assocs[i] = fnv1a(6, item->host, item->port, item->selector, citem->host, citem->port, citem->selector) % k; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ return k; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+#define POSITIONS_LENGTH 4 Err bitreich.org 70 i+enum { Err bitreich.org 70 i+ Portal, Err bitreich.org 70 i+ StaircaseDown, Err bitreich.org 70 i+ Bookshelf, Err bitreich.org 70 i+ Back Err bitreich.org 70 i+}; Err bitreich.org 70 i+ Err bitreich.org 70 i+size_t px, py; Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+generatemap(Item *item, int new) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ Dir *dir; Err bitreich.org 70 i+ Item *citem; Err bitreich.org 70 i+ size_t i, j, k, l, ir; Err bitreich.org 70 i+ size_t x, y; Err bitreich.org 70 i+ ssize_t n, m; Err bitreich.org 70 i+ size_t *cassocs; Err bitreich.org 70 i+ struct room *rooms, *r; Err bitreich.org 70 i+ struct { Err bitreich.org 70 i+ unsigned char x, y; Err bitreich.org 70 i+ } positions[POSITIONS_LENGTH]; Err bitreich.org 70 i+ uint32_t prng; Err bitreich.org 70 i+ char buffer[3]; Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (i = 0; i < MAPHEIGHT; i++) { Err bitreich.org 70 i+ for (j = 0; j < MAPWIDTH; j++) { Err bitreich.org 70 i+ map[i][j].c = '#'; Err bitreich.org 70 i+ free(map[i][j].items); Err bitreich.org 70 i+ map[i][j].items = NULL; Err bitreich.org 70 i+ map[i][j].nitems = 0; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ dir = item->dat; Err bitreich.org 70 i+ for (j = l = 0; j < dir->nitems; j++) { Err bitreich.org 70 i+ if (dir->items[j].type == '0' || Err bitreich.org 70 i+ dir->items[j].type == '1') Err bitreich.org 70 i+ l++; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ k = 1 + l / 10; Err bitreich.org 70 i+ rooms = calloc(k, sizeof(*rooms)); Err bitreich.org 70 i+ if (!rooms) Err bitreich.org 70 i+ return; Err bitreich.org 70 i+ k = generaterooms_gnarf(fnv1a(3, item->host, item->port, item->selector), rooms, k); Err bitreich.org 70 i+ Err bitreich.org 70 i+ cassocs = calloc(dir->nitems, sizeof(*cassocs)); Err bitreich.org 70 i+ if (!cassocs) Err bitreich.org 70 i+ goto cleanup; Err bitreich.org 70 i+ Err bitreich.org 70 i+ k = placeitems_hash(item, cassocs, k); Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* Insert rooms */ Err bitreich.org 70 i+ for (i = 0; i < k; i++) { Err bitreich.org 70 i+ for (y = rooms[i].y; y < rooms[i].y + rooms[i].h; y++) { Err bitreich.org 70 i+ for (x = rooms[i].x; x < rooms[i].x + rooms[i].w; x++) Err bitreich.org 70 i+ map[y][x].c = '.'; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* Insert connections */ Err bitreich.org 70 i+ for (i = 0; i < k; i++) { Err bitreich.org 70 i+ if (rooms[i].p) Err bitreich.org 70 i+ connectrooms(&rooms[i], rooms[i].p); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* Err bitreich.org 70 i+ Insert items Err bitreich.org 70 i+ The placement of items affects the initial placement of the player, because they could have gone back to this map, so they should appear at the elevator/portal/stair they used. Err bitreich.org 70 i+ */ Err bitreich.org 70 i+ ir = fnv1a(4, item->host, item->port, item->selector, "initial_room") % k; Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (i = 0; i < k; i++) { Err bitreich.org 70 i+ snprintf(buffer, sizeof(buffer), "%d", i); Err bitreich.org 70 i+ prng = fnv1a(4, item->host, item->port, item->selector, buffer); Err bitreich.org 70 i+ for (j = 0, n = 0, m = rooms[i].h * rooms[i].w; j < m; j++) { Err bitreich.org 70 i+ if ((m - j) * (xorshift(&prng) / (double)UINT32_MAX) < POSITIONS_LENGTH - n) { Err bitreich.org 70 i+ positions[n].x = rooms[i].x + j % rooms[i].w; Err bitreich.org 70 i+ positions[n].y = rooms[i].y + j / rooms[i].w; Err bitreich.org 70 i+ n++; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ if (n == POSITIONS_LENGTH) Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ for (j = 0; j < dir->nitems; j++) { Err bitreich.org 70 i+ if (cassocs[j] != i) Err bitreich.org 70 i+ continue; Err bitreich.org 70 i+ Err bitreich.org 70 i+ citem = &dir->items[j]; Err bitreich.org 70 i+ switch (citem->type) { Err bitreich.org 70 i+ case '0': Err bitreich.org 70 i+ x = positions[Bookshelf].x; Err bitreich.org 70 i+ y = positions[Bookshelf].y; Err bitreich.org 70 i+ if (map[y][x].nitems) Err bitreich.org 70 i+ map[y][x].c = 'E'; Err bitreich.org 70 i+ else Err bitreich.org 70 i+ map[y][x].c = '?'; Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case '1': Err bitreich.org 70 i+ if (strcmp(citem->host, item->host) || strcmp(citem->port, item->port)) { Err bitreich.org 70 i+ x = positions[Portal].x; Err bitreich.org 70 i+ y = positions[Portal].y; Err bitreich.org 70 i+ if (map[y][x].nitems) Err bitreich.org 70 i+ map[y][x].c = 'O'; Err bitreich.org 70 i+ else Err bitreich.org 70 i+ map[y][x].c = '0'; Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ x = positions[StaircaseDown].x; Err bitreich.org 70 i+ y = positions[StaircaseDown].y; Err bitreich.org 70 i+ if (map[y][x].nitems) Err bitreich.org 70 i+ map[y][x].c = 'L'; Err bitreich.org 70 i+ else Err bitreich.org 70 i+ map[y][x].c = '>'; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ default: Err bitreich.org 70 i+ continue; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ map[y][x].nitems++; Err bitreich.org 70 i+ map[y][x].items = realloc(map[y][x].items, map[y][x].nitems * sizeof(*map[y][x].items)); Err bitreich.org 70 i+ map[y][x].items[map[y][x].nitems-1] = citem; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (new && j == dir->curline && citem->raw) { Err bitreich.org 70 i+ px = x; Err bitreich.org 70 i+ py = y; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (i == ir && item->entry != item) { Err bitreich.org 70 i+ y = positions[Back].y; Err bitreich.org 70 i+ x = positions[Back].x; Err bitreich.org 70 i+ if (strcmp(item->entry->host, item->host) || strcmp(item->entry->port, item->port)) Err bitreich.org 70 i+ map[y][x].c = '0'; Err bitreich.org 70 i+ else Err bitreich.org 70 i+ map[y][x].c = '<'; Err bitreich.org 70 i+ map[y][x].nitems++; Err bitreich.org 70 i+ map[y][x].items = realloc(map[y][x].items, map[y][x].nitems * sizeof(*map[y][x].items)); Err bitreich.org 70 i+ map[y][x].items[map[y][x].nitems-1] = item->entry; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (i == ir && new && !dir->items[dir->curline].raw) { Err bitreich.org 70 i+ px = positions[Back].x; Err bitreich.org 70 i+ py = positions[Back].y; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } Err bitreich.org 70 i+ free(cassocs); Err bitreich.org 70 i+ Err bitreich.org 70 i+cleanup: Err bitreich.org 70 i+ free(rooms); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+uisetup(void) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ tcgetattr(0, &tsave); Err bitreich.org 70 i+ tsacc = tsave; Err bitreich.org 70 i+ tsacc.c_lflag &= ~(ECHO|ICANON); Err bitreich.org 70 i+ tsacc.c_cc[VMIN] = 1; Err bitreich.org 70 i+ tsacc.c_cc[VTIME] = 0; Err bitreich.org 70 i+ tcsetattr(0, TCSANOW, &tsacc); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (termset != OK) Err bitreich.org 70 i+ /* setupterm call exits on error */ Err bitreich.org 70 i+ termset = setupterm(NULL, 1, NULL); Err bitreich.org 70 i+ putp(tparm(clear_screen, 0, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ fflush(stdout); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+uicleanup(void) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ tcsetattr(0, TCSANOW, &tsave); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (termset != OK) Err bitreich.org 70 i+ return; Err bitreich.org 70 i+ Err bitreich.org 70 i+ putp(tparm(clear_screen, 0, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ fflush(stdout); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+char * Err bitreich.org 70 i+uiprompt(char *fmt, ...) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ va_list ap; Err bitreich.org 70 i+ char *input = NULL; Err bitreich.org 70 i+ size_t n; Err bitreich.org 70 i+ ssize_t r; Err bitreich.org 70 i+ Err bitreich.org 70 i+ putp(tparm(save_cursor, 0, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ Err bitreich.org 70 i+ putp(tparm(cursor_address, lines-1, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ putp(tparm(clr_eol, 0, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ Err bitreich.org 70 i+ va_start(ap, fmt); Err bitreich.org 70 i+ vsnprintf(bufout, sizeof(bufout), fmt, ap); Err bitreich.org 70 i+ va_end(ap); Err bitreich.org 70 i+ Err bitreich.org 70 i+ n = mbsprint(bufout, columns); Err bitreich.org 70 i+ Err bitreich.org 70 i+ putp(tparm(clr_eol, 0, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ Err bitreich.org 70 i+ putp(tparm(cursor_address, lines-1, n, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ Err bitreich.org 70 i+ tsacc.c_lflag |= (ECHO|ICANON); Err bitreich.org 70 i+ tcsetattr(0, TCSANOW, &tsacc); Err bitreich.org 70 i+ fflush(stdout); Err bitreich.org 70 i+ Err bitreich.org 70 i+ n = 0; Err bitreich.org 70 i+ r = getline(&input, &n, stdin); Err bitreich.org 70 i+ Err bitreich.org 70 i+ tsacc.c_lflag &= ~(ECHO|ICANON); Err bitreich.org 70 i+ tcsetattr(0, TCSANOW, &tsacc); Err bitreich.org 70 i+ putp(tparm(restore_cursor, 0, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ fflush(stdout); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (r == -1) { Err bitreich.org 70 i+ clearerr(stdin); Err bitreich.org 70 i+ clear(&input); Err bitreich.org 70 i+ } else if (input[r - 1] == '\n') { Err bitreich.org 70 i+ input[--r] = '\0'; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ return input; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+displaybar(char *s) { Err bitreich.org 70 i+ size_t n; Err bitreich.org 70 i+ Err bitreich.org 70 i+ putp(tparm(save_cursor, 0, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ Err bitreich.org 70 i+ putp(tparm(cursor_address, lines-2, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ putp(tparm(enter_standout_mode, 0, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ Err bitreich.org 70 i+ n = mbsprint(s, columns); Err bitreich.org 70 i+ for (n = columns - n; n; n--) Err bitreich.org 70 i+ putchar(' '); Err bitreich.org 70 i+ Err bitreich.org 70 i+ putp(tparm(exit_standout_mode, 0, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ Err bitreich.org 70 i+ putp(tparm(restore_cursor, 0, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ fflush(stdout); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+vdisplayinfoline(char *fmt, va_list ap) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ putp(tparm(save_cursor, 0, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ Err bitreich.org 70 i+ putp(tparm(cursor_address, lines-1, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ Err bitreich.org 70 i+ vsnprintf(bufout, sizeof(bufout), fmt, ap); Err bitreich.org 70 i+ Err bitreich.org 70 i+ mbsprint(bufout, columns); Err bitreich.org 70 i+ Err bitreich.org 70 i+ putp(tparm(clr_eol, 0, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ Err bitreich.org 70 i+ putp(tparm(restore_cursor, 0, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ fflush(stdout); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+uistatus(char *fmt, ...) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ va_list ap; Err bitreich.org 70 i+ size_t n; Err bitreich.org 70 i+ Err bitreich.org 70 i+ putp(tparm(save_cursor, 0, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ Err bitreich.org 70 i+ putp(tparm(cursor_address, lines-1, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ Err bitreich.org 70 i+ va_start(ap, fmt); Err bitreich.org 70 i+ n = vsnprintf(bufout, sizeof(bufout), fmt, ap); Err bitreich.org 70 i+ va_end(ap); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (n < sizeof(bufout)-1) { Err bitreich.org 70 i+ snprintf(bufout+n, sizeof(bufout)-n, Err bitreich.org 70 i+ " [Press a key to continue \xe2\x98\x83]"); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ mbsprint(bufout, columns); Err bitreich.org 70 i+ Err bitreich.org 70 i+ putp(tparm(clr_eol, 0, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ Err bitreich.org 70 i+ putp(tparm(restore_cursor, 0, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ fflush(stdout); Err bitreich.org 70 i+ Err bitreich.org 70 i+ getchar(); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+displayinfoline(char *fmt, ...) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ va_list ap; Err bitreich.org 70 i+ Err bitreich.org 70 i+ va_start(ap, fmt); Err bitreich.org 70 i+ vdisplayinfoline(fmt, ap); Err bitreich.org 70 i+ va_end(ap); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+Item * Err bitreich.org 70 i+showmenu(char *title, Item **item, size_t l) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ size_t i; Err bitreich.org 70 i+ Err bitreich.org 70 i+ putp(tparm(clear_screen, 0, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ Err bitreich.org 70 i+ putp(tparm(enter_standout_mode, 0, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ printf("%s\n", title); Err bitreich.org 70 i+ putp(tparm(exit_standout_mode, 0, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ for (i = 0; i < l; i++) Err bitreich.org 70 i+ printf("%lu\t%s\n", i, item[i]->username); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (!scanf("%lu", &i) || i >= l) Err bitreich.org 70 i+ return NULL; Err bitreich.org 70 i+ fflush(stdout); Err bitreich.org 70 i+ Err bitreich.org 70 i+ return item[i]; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+Item * Err bitreich.org 70 i+prompt(char *text, Item *item) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ displayinfoline(text, item->username); Err bitreich.org 70 i+ getchar(); Err bitreich.org 70 i+ return item; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+Item * Err bitreich.org 70 i+interact(Item *item) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ Item *selection; Err bitreich.org 70 i+ Err bitreich.org 70 i+ selection = NULL; Err bitreich.org 70 i+ Err bitreich.org 70 i+ switch (map[py][px].c) { Err bitreich.org 70 i+ case '?': Err bitreich.org 70 i+ case '0': Err bitreich.org 70 i+ case '>': Err bitreich.org 70 i+ case '<': Err bitreich.org 70 i+ selection = map[py][px].items[0]; Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 'E': Err bitreich.org 70 i+ selection = showmenu("Bookshelf", map[py][px].items, map[py][px].nitems); Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 'O': Err bitreich.org 70 i+ selection = showmenu("Portal machine", map[py][px].items, map[py][px].nitems); Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 'L': Err bitreich.org 70 i+ selection = showmenu("Elevator", map[py][px].items, map[py][px].nitems); Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ drawscreen(); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (selection) { Err bitreich.org 70 i+ switch (map[py][px].c) { Err bitreich.org 70 i+ case '?': Err bitreich.org 70 i+ case 'E': Err bitreich.org 70 i+ displayinfoline("A loading bar?! In a book?!"); Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 'O': Err bitreich.org 70 i+ case '0': Err bitreich.org 70 i+ displayinfoline("You are getting transported through time and space."); Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 'L': Err bitreich.org 70 i+ displayinfoline("You hear elevator music..."); Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case '<': Err bitreich.org 70 i+ case '>': Err bitreich.org 70 i+ displayinfoline("Too many stairs..."); Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ return selection; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+describe(size_t x, size_t y, int verbose) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ switch (map[y][x].c) { Err bitreich.org 70 i+ case 'E': Err bitreich.org 70 i+ displayinfoline("A bookshelf."); Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 'O': Err bitreich.org 70 i+ displayinfoline("A portal machine."); Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 'L': Err bitreich.org 70 i+ displayinfoline("An elevator."); Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case '?': Err bitreich.org 70 i+ case '>': Err bitreich.org 70 i+ case '<': Err bitreich.org 70 i+ case '0': Err bitreich.org 70 i+ if (*map[y][x].items[0]->username) { Err bitreich.org 70 i+ displayinfoline("'%s'.", map[y][x].items[0]->username); Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ itemuri(map[y][x].items[0], bufout2, sizeof(bufout2)); Err bitreich.org 70 i+ displayinfoline("'%s'.", bufout2); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ default: Err bitreich.org 70 i+ if (verbose) { Err bitreich.org 70 i+ switch (map[y][x].c) { Err bitreich.org 70 i+ case '.': Err bitreich.org 70 i+ displayinfoline("Floor."); Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case '#': Err bitreich.org 70 i+ displayinfoline("Wall."); Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ displayinfoline(""); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ } Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+move(ssize_t dx, ssize_t dy) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ size_t x, y; Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* allow wraparound of the world for the lulz, even if it's not happening */ Err bitreich.org 70 i+ y = (MAPHEIGHT + py + dy) % MAPHEIGHT; Err bitreich.org 70 i+ x = (MAPWIDTH + px + dx) % MAPWIDTH; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (map[y][x].c == '#') Err bitreich.org 70 i+ return; Err bitreich.org 70 i+ Err bitreich.org 70 i+ putp(tparm(cursor_address, py, px, 0, 0, 0, 0, 0, 0, 0 )); Err bitreich.org 70 i+ putchar(map[py][px].c); Err bitreich.org 70 i+ Err bitreich.org 70 i+ py = y; Err bitreich.org 70 i+ px = x; Err bitreich.org 70 i+ putp(tparm(cursor_address, py, px, 0, 0, 0, 0, 0, 0, 0 )); Err bitreich.org 70 i+ putchar('@'); Err bitreich.org 70 i+ putp(tparm(cursor_address, py, px, 0, 0, 0, 0, 0, 0, 0 )); Err bitreich.org 70 i+ Err bitreich.org 70 i+ describe(x, y, 0); Err bitreich.org 70 i+ putp(tparm(cursor_address, py, px, 0, 0, 0, 0, 0, 0, 0 )); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+drawscreen(void) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ Dir *dir; Err bitreich.org 70 i+ Err bitreich.org 70 i+ putp(tparm(clear_screen, 0, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ rendermap(); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (curentry->entry != curentry && (dir = curentry->entry->dat)) { Err bitreich.org 70 i+ displaybar(dir->items[dir->curline].username); Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ itemuri(curentry, bufout, sizeof(bufout)); Err bitreich.org 70 i+ displaybar(bufout); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ move(0, 0); Err bitreich.org 70 i+ Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+uidisplay(Item *entry) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ if (!entry || entry->type != '1') Err bitreich.org 70 i+ return; Err bitreich.org 70 i+ Err bitreich.org 70 i+ generatemap(entry, curentry != entry); Err bitreich.org 70 i+ Err bitreich.org 70 i+ curentry = entry; Err bitreich.org 70 i+ drawscreen(); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+lookmode(void) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ size_t x, y; Err bitreich.org 70 i+ Err bitreich.org 70 i+ x = px; Err bitreich.org 70 i+ y = py; Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (;;) { Err bitreich.org 70 i+ switch (getchar()) { Err bitreich.org 70 i+ case 0x1B: Err bitreich.org 70 i+ case 'q': Err bitreich.org 70 i+ putp(tparm(cursor_address, py, px, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ return; Err bitreich.org 70 i+ case 'h': Err bitreich.org 70 i+ x = (MAPWIDTH + x - 1) % MAPWIDTH; Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 'j': Err bitreich.org 70 i+ y = (y + 1) % MAPHEIGHT; Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 'k': Err bitreich.org 70 i+ y = (MAPHEIGHT + y - 1) % MAPHEIGHT; Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 'l': Err bitreich.org 70 i+ x = (x + 1) % MAPWIDTH; Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ putp(tparm(cursor_address, y, x, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ describe(x, y, 1); Err bitreich.org 70 i+ } Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+Item * Err bitreich.org 70 i+uiselectitem(Item *entry) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ Dir *dir; Err bitreich.org 70 i+ Item *e; Err bitreich.org 70 i+ size_t i; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (!entry || !(dir = entry->dat)) Err bitreich.org 70 i+ return NULL; Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (;;) { Err bitreich.org 70 i+ switch (getchar()) { Err bitreich.org 70 i+ case 'h': Err bitreich.org 70 i+ move(-1, 0); Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 'j': Err bitreich.org 70 i+ move(0, 1); Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 'k': Err bitreich.org 70 i+ move(0, -1); Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 'l': Err bitreich.org 70 i+ move(1, 0); Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 'L': Err bitreich.org 70 i+ lookmode(); Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case ' ': Err bitreich.org 70 i+ /* Portals, stairs, bookshelfs */ Err bitreich.org 70 i+ if (e = interact(entry)) { Err bitreich.org 70 i+ if (e->type == '1') { Err bitreich.org 70 i+ for (i = 0; i < dir->nitems; i++) { Err bitreich.org 70 i+ if (e == &dir->items[i]) { Err bitreich.org 70 i+ dir->curline = i; Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } Err bitreich.org 70 i+ return e; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 'q': Err bitreich.org 70 i+ return NULL; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+uisigwinch(int signal) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ Dir *dir; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (termset == OK) Err bitreich.org 70 i+ del_curterm(cur_term); Err bitreich.org 70 i+ termset = setupterm(NULL, 1, NULL); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (!curentry || !(dir = curentry->dat)) Err bitreich.org 70 i+ return; Err bitreich.org 70 i+ Err bitreich.org 70 i+ uidisplay(curentry); Err bitreich.org 70 i+} Err bitreich.org 70 .