iUpdate ui_rogue - 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 90a9d3c81f27588c62faa43f22d946740042a3ce /scm/sacc/commit/90a9d3c81f27588c62faa43f22d946740042a3ce.gph bitreich.org 70 1parent cc6a6881e06ab4b851c7778842374b953e51539c /scm/sacc/commit/cc6a6881e06ab4b851c7778842374b953e51539c.gph bitreich.org 70 hAuthor: Julian Schweinsberg URL:mailto:pazz0@0xfa.de bitreich.org 70 iDate: Mon, 28 Oct 2024 15:17:33 +0100 Err bitreich.org 70 i Err bitreich.org 70 iUpdate ui_rogue Err bitreich.org 70 i Err bitreich.org 70 iui_rogue: Overengineered Edition Err bitreich.org 70 i Err bitreich.org 70 iThis adds a readme and notes (mostly ideas) file for ui_rogue, too. Err bitreich.org 70 i Err bitreich.org 70 iThese changes were made half a year ago and I don't do real Err bitreich.org 70 idocumentation of my changes... Err bitreich.org 70 i(There is some git branch, but the commit messages aren't helpful: Err bitreich.org 70 i"HuH?!", "Well, better than nothing...", "Typical Err bitreich.org 70 ipazz0-overengineering.", ...) Err bitreich.org 70 i Err bitreich.org 70 iChanges: Err bitreich.org 70 i- Better menus Err bitreich.org 70 i- Bigger maps (160x50) Err bitreich.org 70 i - Moving scrolls the displayed map if needed Err bitreich.org 70 i- Rooms and corridors use ASCII characters to look like hack Err bitreich.org 70 i- Removes look mode for now Err bitreich.org 70 i- Replaces xorshift PRNG algorithm with ranqd1 (this means that the Err bitreich.org 70 i layout of gopherholes change with this update) Err bitreich.org 70 i- Moved setupterm call out of signal handler (IIRC [you remember: Err bitreich.org 70 i months] there were some crashes I had in combination with heap Err bitreich.org 70 i allocations, my thought was that setupterm is using heap allocations) Err bitreich.org 70 i- Parameters for room generation are randomly selected (based on the Err bitreich.org 70 i hostname and port) from a list of "dungeontypes" Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M ui_rogue.c | 1225 +++++++++++++++++++++---------- Err bitreich.org 70 i A ui_rogue_notes | 31 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i A ui_rogue_readme | 28 ++++++++++++++++++++++++++++ Err bitreich.org 70 i Err bitreich.org 70 i3 files changed, 912 insertions(+), 372 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@@ -1,3 +1,5 @@ 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@@ -6,6 +8,7 @@ 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@@ -22,6 +25,47 @@ Err bitreich.org 70 i #define ERR (-1) Err bitreich.org 70 i #endif Err bitreich.org 70 i Err bitreich.org 70 i+#define maplines (lines - 2) Err bitreich.org 70 i+ Err bitreich.org 70 i+enum { Err bitreich.org 70 i+ Blocks = 1, Err bitreich.org 70 i+ Standout = 2, Err bitreich.org 70 i+ Important = 4 Err bitreich.org 70 i+}; Err bitreich.org 70 i+ Err bitreich.org 70 i+struct cell; Err bitreich.org 70 i+struct tile { Err bitreich.org 70 i+ char c; Err bitreich.org 70 i+ char flags; Err bitreich.org 70 i+ char *name; Err bitreich.org 70 i+ char *description; Err bitreich.org 70 i+ char *afterinteract; Err bitreich.org 70 i+ Item *(*interact)(struct cell *); Err bitreich.org 70 i+}; Err bitreich.org 70 i+ Err bitreich.org 70 i+struct cell { Err bitreich.org 70 i+ struct tile *tile; 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+struct room { 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 rect *p; 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+ union { Err bitreich.org 70 i+ void *p; Err bitreich.org 70 i+ int i; Err bitreich.org 70 i+ } data; Err bitreich.org 70 i+}; 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@@ -29,8 +73,88 @@ 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+size_t ox, oy; Err bitreich.org 70 i+size_t px, py; Err bitreich.org 70 i+ Err bitreich.org 70 i+#define MAPHEIGHT (50) Err bitreich.org 70 i+#define MAPWIDTH (160) Err bitreich.org 70 i+struct cell map[MAPHEIGHT][MAPWIDTH]; Err bitreich.org 70 i+ Err bitreich.org 70 i+enum { Err bitreich.org 70 i+ DungeonScreen, Err bitreich.org 70 i+ MenuScreen Err bitreich.org 70 i+} screen; Err bitreich.org 70 i+ Err bitreich.org 70 i+Item *interactitem(struct cell *); Err bitreich.org 70 i+Item *interactmenu(struct cell *); Err bitreich.org 70 i+ Err bitreich.org 70 i+struct tile tile_void = { ' ', Blocks, "Void", "The void. The thing which is everywhere where nothing is.", NULL, NULL }; Err bitreich.org 70 i+struct tile tile_floor = { '.', 0, "Floor", "An ordinary stone floor.", NULL, NULL }; Err bitreich.org 70 i+struct tile tile_corridor = { '#', 0, "Different Floor", "This floor looks different than the other one.", NULL, NULL }; Err bitreich.org 70 i+struct tile tile_verticalwall = { '|', Blocks, "Wall", "Wall.", NULL, NULL }; Err bitreich.org 70 i+struct tile tile_horizontalwall = { '-', Blocks, "Wall", "Wall.", NULL, NULL }; Err bitreich.org 70 i+struct tile tile_door = { '/', 0, "Door", "A door.", NULL, NULL }; Err bitreich.org 70 i+struct tile tile_bookshelf = { 'E', Important, "Bookshelf", "A bookshelf.", "A loading bar?! In a book?!", interactmenu }; Err bitreich.org 70 i+struct tile tile_book = { '?', Important, "%s", "A book: '%s'.", "A loading bar?! In a book?!", interactitem }; Err bitreich.org 70 i+struct tile tile_portal = { '0', Important, "%s", "A portal: '%s'.", "You are getting transported through time and space.", interactitem }; Err bitreich.org 70 i+struct tile tile_portalmachine = { 'O', Important, "Portal Machine", "A portal machine.", "You are getting transported through time and space.", interactmenu }; Err bitreich.org 70 i+struct tile tile_heapofstuff = { '%', Important, "Heap", "A heap of stuff.", "The thing you touches glows strangely...", interactmenu }; Err bitreich.org 70 i+struct tile tile_elevator = { 'L', Important, "Elevator", "An elevator.", "You hear elevator music...", interactmenu }; Err bitreich.org 70 i+struct tile tile_stairsdown = { '>', Important, "'%s'", "A staircase leading down: '%s'.", "Too many stairs...", interactitem }; Err bitreich.org 70 i+ Err bitreich.org 70 i+struct tile tile_stairsup = { '<', Standout | Important, "'%s'", "A staircase leading up: '%s'.", "Too many stairs...", interactitem }; Err bitreich.org 70 i+struct tile tile_backportal = { '0', Standout | Important, "'%s'", "A portal leading back to wherever you came from: '%s'.", "You are getting transported through time and space.", interactitem }; Err bitreich.org 70 i+ Err bitreich.org 70 i void drawscreen(void); Err bitreich.org 70 i Err bitreich.org 70 i+int Err bitreich.org 70 i+mygetchar_(void) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ int r; Err bitreich.org 70 i+ fd_set fdset; Err bitreich.org 70 i+ Err bitreich.org 70 i+ FD_ZERO(&fdset); Err bitreich.org 70 i+ FD_SET(0, &fdset); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if ((r = select(1, &fdset, NULL, NULL, NULL)) == -1) { Err bitreich.org 70 i+ if (errno == EINTR) Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ return -2; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ return getchar(); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+volatile sig_atomic_t sigwinch; Err bitreich.org 70 i+ Err bitreich.org 70 i+int Err bitreich.org 70 i+mygetchar(void) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ int r; Err bitreich.org 70 i+ Err bitreich.org 70 i+ while ((r = mygetchar_()) == -1) { Err bitreich.org 70 i+ if (sigwinch) { Err bitreich.org 70 i+ sigwinch = 0; 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+ drawscreen(); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (r == -2) Err bitreich.org 70 i+ die("mygetchar: %s", strerror(errno)); Err bitreich.org 70 i+ Err bitreich.org 70 i+ return r; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+/* Err bitreich.org 70 i+ FNV-1a ( http://www.isthe.com/chongo/tech/comp/fnv/ ) Err bitreich.org 70 i+ FNV was published into the public domain ( https://creativecommons.org/publicdomain/zero/1.0/ ) Err bitreich.org 70 i+ by Landon Curt Noll: http://www.isthe.com/chongo/tech/comp/fnv/#public_domain 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@@ -41,7 +165,7 @@ fnv1a(int n,...) 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+ 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@@ -53,42 +177,17 @@ fnv1a(int n,...) 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+ An LCG using the constants from "Numerical Recipes". Err bitreich.org 70 i+*/ Err bitreich.org 70 i+uint16_t Err bitreich.org 70 i+ranqd1(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+ return (*s = 1664525 * (*s) + 1013904223) >> 16; 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+randomneighbor(struct rect *x, struct rect *rs, uint32_t *prng, int (*filter)(struct rect *, struct rect *)) 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@@ -96,35 +195,54 @@ randomneighbor(struct rect *x, struct rect *rs, uint32_t *prng) 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 == x) 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 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 (!filter(x, r)) 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+ if (ranqd1(prng) / (1. + UINT16_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+min(size_t a, size_t b) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ if (a < b) Err bitreich.org 70 i+ return a; Err bitreich.org 70 i+ return b; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+size_t Err bitreich.org 70 i+max(size_t a, size_t b) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ if (a > b) Err bitreich.org 70 i+ return a; Err bitreich.org 70 i+ return b; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+/* Err bitreich.org 70 i+ Creates an uneven grid by splitting the map recursively. Err bitreich.org 70 i+ Returns an array containing the cells (rects) of the grid. Err bitreich.org 70 i+*/ Err bitreich.org 70 i+struct rect * Err bitreich.org 70 i+generaterects(size_t heightmin, size_t widthmin, uint32_t prng) 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+ struct rect *rects; Err bitreich.org 70 i+ size_t w, h; Err bitreich.org 70 i+ int vertical, spaceforvertical, spaceforhorizontal; 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+ memset(r, 0, sizeof(*r)); Err bitreich.org 70 i+ r->x1 = r->y1 = 0; 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@@ -134,7 +252,6 @@ generaterooms_gnarf(uint32_t prng, struct room *rs, size_t l) 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@@ -142,35 +259,36 @@ generaterooms_gnarf(uint32_t prng, struct room *rs, size_t l) 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+ spaceforvertical = r->y2 - r->y1 >= heightmin * 2; Err bitreich.org 70 i+ spaceforhorizontal = r->x2 - r->x1 >= widthmin * 2; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (spaceforhorizontal && spaceforvertical) { Err bitreich.org 70 i+ vertical = ranqd1(&prng) & 1; Err bitreich.org 70 i+ } else if (spaceforhorizontal) { 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+ } else if (spaceforvertical) { 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+ h = heightmin + ranqd1(&prng) % (1 + r->y2 - r->y1 - heightmin * 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+ w = widthmin + ranqd1(&prng) % (1 + r->x2 - r->x1 - widthmin * 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+ memset(t, 0, 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@@ -181,6 +299,7 @@ generaterooms_gnarf(uint32_t prng, struct room *rs, size_t l) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i t = malloc(sizeof(*t)); Err bitreich.org 70 i+ memset(t, 0, 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@@ -191,8 +310,6 @@ generaterooms_gnarf(uint32_t prng, struct room *rs, size_t l) 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@@ -200,75 +317,107 @@ generaterooms_gnarf(uint32_t prng, struct room *rs, size_t l) 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+ return rects; Err bitreich.org 70 i+} 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+void Err bitreich.org 70 i+connectpoints_horizontal(size_t y, Err bitreich.org 70 i+ size_t ax, int ea, struct tile *at, Err bitreich.org 70 i+ size_t bx, int eb, struct tile *bt, Err bitreich.org 70 i+ struct tile *t) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ size_t i, s, e; Err bitreich.org 70 i+ ssize_t ii; 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+ if (ax < bx) Err bitreich.org 70 i+ ii = 1; Err bitreich.org 70 i+ else if (ax > bx) 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- return l; Err bitreich.org 70 i+ s = ax; Err bitreich.org 70 i+ if (ea) Err bitreich.org 70 i+ s += ii; Err bitreich.org 70 i+ e = bx + ii; Err bitreich.org 70 i+ if (eb) Err bitreich.org 70 i+ e -= ii; Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (i = s; i != e; i += ii) Err bitreich.org 70 i+ map[y][i].tile = t; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (e - ii == s) { Err bitreich.org 70 i+ if (at != t) Err bitreich.org 70 i+ map[y][s].tile = at; Err bitreich.org 70 i+ if (bt != t) Err bitreich.org 70 i+ map[y][s].tile = bt; Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ map[y][s].tile = at; Err bitreich.org 70 i+ map[y][e - ii].tile = bt; 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-distance(size_t x1, size_t y1, size_t x2, size_t y2) Err bitreich.org 70 i+void Err bitreich.org 70 i+connectpoints_vertical(size_t x, Err bitreich.org 70 i+ size_t ay, int ea, struct tile *at, Err bitreich.org 70 i+ size_t by, int eb, struct tile *bt, Err bitreich.org 70 i+ struct tile *t) Err bitreich.org 70 i { Err bitreich.org 70 i- size_t d; Err bitreich.org 70 i+ size_t i, s, e; Err bitreich.org 70 i+ ssize_t ii; 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+ if (ay < by) Err bitreich.org 70 i+ ii = 1; Err bitreich.org 70 i+ else if (ay > by) Err bitreich.org 70 i+ ii = -1; Err bitreich.org 70 i else Err bitreich.org 70 i- d += x1 - x2; Err bitreich.org 70 i+ ii = 0; Err bitreich.org 70 i Err bitreich.org 70 i- return d; Err bitreich.org 70 i+ s = ay; Err bitreich.org 70 i+ if (ea) Err bitreich.org 70 i+ s += ii; Err bitreich.org 70 i+ e = by + ii; Err bitreich.org 70 i+ if (eb) Err bitreich.org 70 i+ e -= ii; Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (i = s; i != e; i += ii) Err bitreich.org 70 i+ map[i][x].tile = t; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (e - ii == s) { Err bitreich.org 70 i+ if (at != t) Err bitreich.org 70 i+ map[s][x].tile = at; Err bitreich.org 70 i+ if (bt != t) Err bitreich.org 70 i+ map[s][x].tile = bt; Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ map[s][x].tile = at; Err bitreich.org 70 i+ map[e - ii][x].tile = bt; 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+connectpoints(size_t ax, size_t ay, int ea, struct tile *at, Err bitreich.org 70 i+ size_t bx, size_t by, int eb, struct tile *bt, Err bitreich.org 70 i+ int vertical, struct tile *ct) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ if (!vertical) { Err bitreich.org 70 i+ connectpoints_horizontal(ay, Err bitreich.org 70 i+ ax, ea, at, Err bitreich.org 70 i+ bx, 0, ct, Err bitreich.org 70 i+ ct); Err bitreich.org 70 i+ connectpoints_vertical(bx, Err bitreich.org 70 i+ ay, 0, ct, Err bitreich.org 70 i+ by, eb, bt, Err bitreich.org 70 i+ ct); Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ connectpoints_vertical(ax, Err bitreich.org 70 i+ ay, ea, at, Err bitreich.org 70 i+ by, 0, ct, Err bitreich.org 70 i+ ct); Err bitreich.org 70 i+ connectpoints_horizontal(by, Err bitreich.org 70 i+ ax, 0, ct, Err bitreich.org 70 i+ bx, eb, bt, Err bitreich.org 70 i+ ct); 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@@ -300,50 +449,246 @@ nearestpoints(struct room *a, struct room *b, size_t *ax, size_t *ay, size_t *bx 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+connectadjacentrooms(struct rect *a, struct room *ar, struct rect *b, struct room *br) 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+ size_t irx1, iry1, irx2, iry2; Err bitreich.org 70 i+ size_t rx1, ry1, rx2, ry2; Err bitreich.org 70 i+ size_t cx, cy; Err bitreich.org 70 i+ struct rect *r1, *r2; Err bitreich.org 70 i+ struct room *room1, *room2; Err bitreich.org 70 i+ int vertical; Err bitreich.org 70 i Err bitreich.org 70 i- nearestpoints(a, b, &x1, &y1, &x2, &y2); Err bitreich.org 70 i+ if (a->x2 == b->x1) { Err bitreich.org 70 i+ r1 = a; Err bitreich.org 70 i+ room1 = ar; Err bitreich.org 70 i+ r2 = b; Err bitreich.org 70 i+ room2 = br; Err bitreich.org 70 i+ } else if (b->x2 == a->x1) { Err bitreich.org 70 i+ r1 = b; Err bitreich.org 70 i+ room1 = br; Err bitreich.org 70 i+ r2 = a; Err bitreich.org 70 i+ room2 = ar; Err bitreich.org 70 i+ } else if (a->y2 == b->y1) { Err bitreich.org 70 i+ r1 = a; Err bitreich.org 70 i+ room1 = ar; Err bitreich.org 70 i+ r2 = b; Err bitreich.org 70 i+ room2 = br; Err bitreich.org 70 i+ } else if (b->y2 == a->y1) { Err bitreich.org 70 i+ r1 = b; Err bitreich.org 70 i+ room1 = br; Err bitreich.org 70 i+ room2 = ar; Err bitreich.org 70 i+ r2 = a; Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ return; Err bitreich.org 70 i+ } 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+ if (r1->y2 == r2->y1) { Err bitreich.org 70 i+ irx1 = max(r1->x1, r2->x1); Err bitreich.org 70 i+ irx2 = min(r1->x2, r2->x2); Err bitreich.org 70 i+ iry1 = r1->y2; Err bitreich.org 70 i+ iry2 = r1->y2 + 1; Err bitreich.org 70 i } else { Err bitreich.org 70 i- ii = 0; Err bitreich.org 70 i+ iry1 = max(r1->y1, r2->y1); Err bitreich.org 70 i+ iry2 = min(r1->y2, r2->y2); Err bitreich.org 70 i+ irx1 = r1->x2; Err bitreich.org 70 i+ irx2 = r1->x2 + 1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ nearestpoints(room1, room2, &rx1, &ry1, &rx2, &ry2); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (r1->y2 == r2->y1) { Err bitreich.org 70 i+ /* both points are in the intersection */ Err bitreich.org 70 i+ if (rx1 >= irx1 && rx1 < irx2 && Err bitreich.org 70 i+ rx2 >= irx1 && rx2 < irx2) { Err bitreich.org 70 i+ vertical = 1; Err bitreich.org 70 i+ cx = (rx2 + rx1) / 2; Err bitreich.org 70 i+ cy = (ry2 + ry1) / 2; Err bitreich.org 70 i+ } else Err bitreich.org 70 i+ /* none is in the intersection */ Err bitreich.org 70 i+ if (!(rx1 >= irx1 && rx1 < irx2) && Err bitreich.org 70 i+ !(rx2 >= irx1 && rx2 < irx2)) { Err bitreich.org 70 i+ vertical = 0; Err bitreich.org 70 i+ cx = irx1; Err bitreich.org 70 i+ cy = r1->y2; Err bitreich.org 70 i+ } else if (rx1 >= irx1 && rx1 < irx2) { Err bitreich.org 70 i+ vertical = 1; Err bitreich.org 70 i+ cx = (rx2 + rx1) / 2; Err bitreich.org 70 i+ cy = r1->y2; Err bitreich.org 70 i+ } else if (rx2 >= irx1 && rx2 < irx2) { Err bitreich.org 70 i+ vertical = 1; Err bitreich.org 70 i+ cx = rx2; Err bitreich.org 70 i+ cy = r1->y2 - 1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ /* both points are in the intersection */ Err bitreich.org 70 i+ if (ry1 >= iry1 && ry1 < iry2 && Err bitreich.org 70 i+ ry2 >= iry1 && ry2 < iry2) { Err bitreich.org 70 i+ vertical = 0; Err bitreich.org 70 i+ cx = (rx2 + rx1) / 2; Err bitreich.org 70 i+ cy = (ry2 + ry1) / 2; Err bitreich.org 70 i+ } else Err bitreich.org 70 i+ /* none is in the intersection */ Err bitreich.org 70 i+ if (!(ry1 >= iry1 && ry1 < iry2) && Err bitreich.org 70 i+ !(ry2 >= iry1 && ry2 < iry2)) { Err bitreich.org 70 i+ vertical = 1; Err bitreich.org 70 i+ cx = r1->x2; Err bitreich.org 70 i+ cy = iry1; Err bitreich.org 70 i+ } else if (ry1 >= iry1 && ry1 < iry2) { Err bitreich.org 70 i+ vertical = 0; Err bitreich.org 70 i+ cx = r1->x2; Err bitreich.org 70 i+ cy = (ry2 + ry1) / 2; Err bitreich.org 70 i+ } else if (ry2 >= iry1 && ry2 < iry2) { Err bitreich.org 70 i+ vertical = 0; Err bitreich.org 70 i+ cx = r1->x2 - 1; Err bitreich.org 70 i+ cy = ry2; Err bitreich.org 70 i+ } Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i+ if (rx1 == rx2) { Err bitreich.org 70 i+ connectpoints_vertical(rx1, Err bitreich.org 70 i+ ry1, 1, &tile_door, Err bitreich.org 70 i+ ry2, 1, &tile_door, Err bitreich.org 70 i+ &tile_corridor); Err bitreich.org 70 i+ } else if (ry1 == ry2) { Err bitreich.org 70 i+ connectpoints_horizontal(ry1, Err bitreich.org 70 i+ rx1, 1, &tile_door, Err bitreich.org 70 i+ rx2, 1, &tile_door, Err bitreich.org 70 i+ &tile_corridor); Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ connectpoints(rx1, ry1, 1, &tile_door, Err bitreich.org 70 i+ cx, cy, 0, &tile_corridor, Err bitreich.org 70 i+ vertical, &tile_corridor); Err bitreich.org 70 i+ connectpoints(cx, cy, 1, &tile_corridor, Err bitreich.org 70 i+ rx2, ry2, 1, &tile_door, Err bitreich.org 70 i+ !vertical, &tile_corridor); Err bitreich.org 70 i+ } Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+int Err bitreich.org 70 i+rectisfull(struct rect *x, struct rect *r) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ return !!r->data.i; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+int Err bitreich.org 70 i+rectisempty(struct rect *x, struct rect *r) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ return !r->data.i; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+int Err bitreich.org 70 i+rectisnotp(struct rect *x, struct rect *r) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ return r->data.p && x->p != r && r->p != x; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+int Err bitreich.org 70 i+rectisrandom(struct rect *x, struct rect *r) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ return 1; 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+ Basically https://www.roguebasin.com/index.php/Diffusion-limited_aggregation Err bitreich.org 70 i+ Returns the list of carved rooms. 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+struct rect * Err bitreich.org 70 i+dla(struct rect *rects, size_t l, uint32_t prng) { Err bitreich.org 70 i+ size_t rl, i, n; Err bitreich.org 70 i+ struct rect *r, *t, *walk, *p; 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+ for (r = rects, rl = 0; r; r = r->next) Err bitreich.org 70 i+ rl++; 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+ /* get the rect which contains the map center */ 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- for (i = x1; i != x2; i += ii) Err bitreich.org 70 i- map[y2][i].c = '.'; Err bitreich.org 70 i+ p = NULL; Err bitreich.org 70 i+ walk = NULL; Err bitreich.org 70 i+ i = 0; Err bitreich.org 70 i+ for (;;) { Err bitreich.org 70 i+ r->p = p; Err bitreich.org 70 i+ r->data.i = 1; 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+ if (i >= l - 1) Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ Err bitreich.org 70 i+ t = NULL; Err bitreich.org 70 i+ for (r = rects, n = 0; r; r = r->next) { Err bitreich.org 70 i+ if (r->data.i) Err bitreich.org 70 i+ continue; Err bitreich.org 70 i+ n++; Err bitreich.org 70 i+ if (ranqd1(&prng) / (1. + UINT16_MAX) < 1. / n) Err bitreich.org 70 i+ t = r; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* there is no free rect left */ Err bitreich.org 70 i+ if (!t) Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* do a random walk starting from t until the walk collides with a carved room (r) */ Err bitreich.org 70 i+ while ((r = randomneighbor(t, rects, &prng, rectisrandom)) && !r->data.i) Err bitreich.org 70 i+ t = r; Err bitreich.org 70 i+ Err bitreich.org 70 i+ p = r; Err bitreich.org 70 i+ r = t; Err bitreich.org 70 i+ Err bitreich.org 70 i+ i++; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ return walk; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+rendermapchar(size_t i, size_t j) { Err bitreich.org 70 i+ if (map[i][j].tile->flags & Standout) Err bitreich.org 70 i+ putp(tparm(enter_standout_mode, 0, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ putchar(map[i][j].tile->c); Err bitreich.org 70 i+ if (map[i][j].tile->flags & Standout) 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+ Err bitreich.org 70 i+void Err bitreich.org 70 i+rendermapline(size_t i) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ size_t j; Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (j = ox; j < min(MAPWIDTH, ox + columns); j++) Err bitreich.org 70 i+ rendermapchar(i, j); 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+ size_t i; 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+ if (px < columns / 2 || MAPWIDTH <= columns) Err bitreich.org 70 i+ ox = 0; Err bitreich.org 70 i+ else if (px >= MAPWIDTH - columns / 2 - 1) Err bitreich.org 70 i+ ox = MAPWIDTH - columns; Err bitreich.org 70 i+ else Err bitreich.org 70 i+ ox = px - columns / 2; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (py < maplines / 2 || MAPHEIGHT <= maplines) Err bitreich.org 70 i+ oy = 0; Err bitreich.org 70 i+ else if (py >= MAPHEIGHT - maplines / 2 - 1) Err bitreich.org 70 i+ oy = MAPHEIGHT - maplines; Err bitreich.org 70 i+ else Err bitreich.org 70 i+ oy = py - maplines / 2; Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (i = oy; i < min(MAPHEIGHT, oy + (lines - 2)); i++) { Err bitreich.org 70 i+ if (i != oy) Err bitreich.org 70 i+ putp(tparm(cursor_down, 0, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ rendermapline(i); Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -366,92 +711,171 @@ placeitems_hash(Item *item, size_t *assocs, size_t k) 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+#define POSITIONS_LENGTH 5 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+ OtherStuff, 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+enum { Err bitreich.org 70 i+ FillEntireCell = 1 Err bitreich.org 70 i+}; Err bitreich.org 70 i+ Err bitreich.org 70 i+#define length(a) (sizeof(a) / sizeof(a[0])) Err bitreich.org 70 i+static struct dungeontype { Err bitreich.org 70 i+ char *name; Err bitreich.org 70 i+ char flags; Err bitreich.org 70 i+ size_t heightmin; Err bitreich.org 70 i+ size_t heightmax; Err bitreich.org 70 i+ size_t widthmin; Err bitreich.org 70 i+ size_t widthmax; Err bitreich.org 70 i+ size_t margin; Err bitreich.org 70 i+ size_t wiggle; Err bitreich.org 70 i+} dungeontypes[] = { Err bitreich.org 70 i+ { "rogueish", 0, 2, 5, 3, 7, 2, 0 }, Err bitreich.org 70 i+ { "rogueish-wide", 0, 2, 5, 3, 7, 3, 1 }, Err bitreich.org 70 i+ { "compact", FillEntireCell, 2, 2, 3, 3, 1, 0 }, Err bitreich.org 70 i+}; 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+generatemap(Item *item, Item *pitem) 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 l, i, j, k, ir, n, m, x, y; Err bitreich.org 70 i+ struct rect *rects, *walk, *tr, *cr; Err bitreich.org 70 i+ struct room *rooms, *room; Err bitreich.org 70 i size_t *cassocs; Err bitreich.org 70 i- struct room *rooms, *r; Err bitreich.org 70 i+ int changedlevel, gonedown; Err bitreich.org 70 i+ char buffer[10]; Err bitreich.org 70 i+ uint32_t prng; Err bitreich.org 70 i struct { Err bitreich.org 70 i- unsigned char x, y; Err bitreich.org 70 i+ size_t 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+ size_t cellwidth, cellheight; Err bitreich.org 70 i+ struct dungeontype *type; Err bitreich.org 70 i+ Err bitreich.org 70 i+ type = &dungeontypes[fnv1a(3, item->host, item->port, "dungeontype") % length(dungeontypes)]; Err bitreich.org 70 i+ Err bitreich.org 70 i+ cellheight = type->heightmin + 2 * type->margin + type->wiggle; Err bitreich.org 70 i+ cellwidth = type->widthmin + 2 * type->margin + type->wiggle; Err bitreich.org 70 i+ Err bitreich.org 70 i+ rects = generaterects(cellheight, cellwidth, fnv1a(4, item->host, item->port, item->selector, "gridseed")); 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 != 'i' && Err bitreich.org 70 i+ dir->items[j].type != '3') 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+ walk = dla(rects, k, fnv1a(4, item->host, item->port, item->selector, "randomwalkseed")); Err bitreich.org 70 i+ for (cr = walk, k = 0; cr; cr = cr->next2, k++); Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (cr = rects; cr; cr = cr->next) Err bitreich.org 70 i+ cr->data.p = NULL; Err bitreich.org 70 i+ Err bitreich.org 70 i+ rooms = calloc(k, sizeof(*rooms)); Err bitreich.org 70 i+ for (cr = walk, i = 0; cr; cr = cr->next2, i++) Err bitreich.org 70 i+ cr->data.p = &rooms[i]; Err bitreich.org 70 i+ Err bitreich.org 70 i+ prng = fnv1a(4, item->host, item->port, item->selector, "roomsseed"); Err bitreich.org 70 i+ for (cr = walk; cr; cr = cr->next2) { Err bitreich.org 70 i+ room = cr->data.p; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (type->flags & FillEntireCell) { Err bitreich.org 70 i+ room->w = cr->x2 - cr->x1 - 2 * type->margin; Err bitreich.org 70 i+ room->x = cr->x1 + type->margin; Err bitreich.org 70 i+ room->h = cr->y2 - cr->y1 - 2 * type->margin; Err bitreich.org 70 i+ room->y = cr->y1 + type->margin; Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ room->w = type->widthmin + ranqd1(&prng) % (1 + min(cr->x2 - cr->x1 - type->widthmin - 2 * type->margin, type->widthmax - type->widthmin)); Err bitreich.org 70 i+ room->x = cr->x1 + type->margin + ranqd1(&prng) % (1 + cr->x2 - cr->x1 - room->w - 2 * type->margin); Err bitreich.org 70 i+ room->h = type->heightmin + ranqd1(&prng) % (1 + min(cr->y2 - cr->y1 - type->heightmin - 2 * type->margin, type->heightmax - type->heightmin)); Err bitreich.org 70 i+ room->y = cr->y1 + type->margin + ranqd1(&prng) % (1 + cr->y2 - cr->y1 - room->h - 2 * type->margin); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } 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+ map[i][j].tile = &tile_void; 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+ for (cr = walk; cr; cr = cr->next2) { Err bitreich.org 70 i+ room = cr->data.p; Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (x = room->x - 1; x < room->x + room->w + 1; x++) Err bitreich.org 70 i+ map[room->y-1][x].tile = &tile_horizontalwall; Err bitreich.org 70 i+ for (y = room->y; y < room->y + room->h; y++) { Err bitreich.org 70 i+ map[y][room->x - 1].tile = &tile_verticalwall; Err bitreich.org 70 i+ for (x = room->x; x < room->x + room->w; x++) Err bitreich.org 70 i+ map[y][x].tile = &tile_floor; Err bitreich.org 70 i+ map[y][room->x + room->w].tile = &tile_verticalwall; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ for (x = room->x - 1; x < room->x + room->w + 1; x++) Err bitreich.org 70 i+ map[room->y + room->h][x].tile = &tile_horizontalwall; 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+ for (cr = walk; cr; cr = cr->next2) { Err bitreich.org 70 i+ if (cr->p) Err bitreich.org 70 i+ connectadjacentrooms(cr, cr->data.p, Err bitreich.org 70 i+ cr->p, cr->p->data.p); Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* Add some loop possibility */ Err bitreich.org 70 i+ if (tr = randomneighbor(cr, rects, &prng, rectisnotp)) Err bitreich.org 70 i+ connectadjacentrooms(cr, cr->data.p, Err bitreich.org 70 i+ tr, tr->data.p); Err bitreich.org 70 i+ } 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+ changedlevel = item != pitem; Err bitreich.org 70 i+ gonedown = pitem == item->entry; 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+ The placement of items affects the initial placement of the Err bitreich.org 70 i+ player, because they could have gone back to this map, so they Err bitreich.org 70 i+ 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+ /* Err bitreich.org 70 i+ The initial room is everytime the first one. Reason: The count Err bitreich.org 70 i+ of rooms is based on how many entries are in the gophermap and Err bitreich.org 70 i+ how many rooms can fit on the map. There will be at minimum 1. Err bitreich.org 70 i+ So when more entries get added there will be more rooms but the Err bitreich.org 70 i+ first one stays at the same position. I think about the Err bitreich.org 70 i+ retrying and clownflare things on bitreich.org, the selector Err bitreich.org 70 i+ doesn't change... Err bitreich.org 70 i+ */ Err bitreich.org 70 i+ ir = 0; 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+ /* select random positions for different item types inside the current room */ Err bitreich.org 70 i+ snprintf(buffer, sizeof(buffer), "%lu", 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+ for (j = 0, m = rooms[i].h * rooms[i].w; j < m; j++) { Err bitreich.org 70 i+ n = j; Err bitreich.org 70 i+ if (j >= POSITIONS_LENGTH) Err bitreich.org 70 i+ n *= ranqd1(&prng) / (double)UINT16_MAX; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (n < POSITIONS_LENGTH) { 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+ 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@@ -462,35 +886,44 @@ generatemap(Item *item, int new) 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+ map[y][x].tile = &tile_bookshelf; Err bitreich.org 70 i else Err bitreich.org 70 i- map[y][x].c = '?'; Err bitreich.org 70 i+ map[y][x].tile = &tile_book; 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+ map[y][x].tile = &tile_portalmachine; Err bitreich.org 70 i else Err bitreich.org 70 i- map[y][x].c = '0'; Err bitreich.org 70 i+ map[y][x].tile = &tile_portal; 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+ map[y][x].tile = &tile_elevator; Err bitreich.org 70 i else Err bitreich.org 70 i- map[y][x].c = '>'; Err bitreich.org 70 i+ map[y][x].tile = &tile_stairsdown; Err bitreich.org 70 i } Err bitreich.org 70 i break; Err bitreich.org 70 i- default: Err bitreich.org 70 i+ case 0: Err bitreich.org 70 i+ case 'i': Err bitreich.org 70 i+ case '3': Err bitreich.org 70 i continue; Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ default: Err bitreich.org 70 i+ x = positions[OtherStuff].x; Err bitreich.org 70 i+ y = positions[OtherStuff].y; Err bitreich.org 70 i+ map[y][x].tile = &tile_heapofstuff; Err bitreich.org 70 i+ break; Err bitreich.org 70 i } 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+ if (changedlevel && citem == pitem) { Err bitreich.org 70 i px = x; Err bitreich.org 70 i py = y; Err bitreich.org 70 i } Err bitreich.org 70 i@@ -500,23 +933,28 @@ generatemap(Item *item, int new) 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+ map[y][x].tile = &tile_backportal; Err bitreich.org 70 i else Err bitreich.org 70 i- map[y][x].c = '<'; Err bitreich.org 70 i+ map[y][x].tile = &tile_stairsup; 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+ if (changedlevel && i == ir && (gonedown || !pitem)) { 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(cassocs); Err bitreich.org 70 i free(rooms); Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (cr = rects; cr;) { Err bitreich.org 70 i+ tr = cr; Err bitreich.org 70 i+ cr = cr->next; Err bitreich.org 70 i+ free(tr); 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@@ -544,6 +982,7 @@ uicleanup(void) 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(change_scroll_region, 0, lines-1, 0, 0, 0, 0, 0, 0, 0)); 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@@ -655,7 +1094,7 @@ uistatus(char *fmt, ...) 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+ mygetchar(); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i@@ -668,225 +1107,287 @@ displayinfoline(char *fmt, ...) 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+char *menutitle; Err bitreich.org 70 i+Item **menuitems; Err bitreich.org 70 i+size_t menunitems; Err bitreich.org 70 i+volatile size_t menuoffset; Err bitreich.org 70 i+size_t menuselected; Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+menudraw(void) Err bitreich.org 70 i { Err bitreich.org 70 i- size_t i; Err bitreich.org 70 i+ size_t i, n; Err bitreich.org 70 i Err bitreich.org 70 i+ putp(tparm(change_scroll_region, 1, lines-1, 0, 0, 0, 0, 0, 0, 0)); 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+ puts(menutitle); 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+ if (menuselected - menuoffset >= lines - 1) Err bitreich.org 70 i+ menuoffset = menuselected - (lines - 1) + 1; Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (i = menuoffset, n = 0; i < menunitems && n < lines - 1; i++, n++) { Err bitreich.org 70 i+ if (i != menuoffset) Err bitreich.org 70 i+ putp(tparm(cursor_down, 0, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ if (i == menuselected) Err bitreich.org 70 i+ putp(tparm(enter_standout_mode, 0, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ mbsprint(menuitems[i]->username, columns); Err bitreich.org 70 i+ if (i == menuselected) Err bitreich.org 70 i+ putp(tparm(exit_standout_mode, 0, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ putp(tparm(column_address, 0, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ } 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+showmenu(char *title, Item **item, size_t l) 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+ menutitle = title; Err bitreich.org 70 i+ menuitems = item; Err bitreich.org 70 i+ menunitems = l; Err bitreich.org 70 i+ menuselected = 0; Err bitreich.org 70 i+ menuoffset = 0; Err bitreich.org 70 i+ screen = MenuScreen; 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+ selection = NULL; Err bitreich.org 70 i+ for (;;) { Err bitreich.org 70 i+ switch (mygetchar()) { Err bitreich.org 70 i+ case 'j': Err bitreich.org 70 i+ if (menuselected + 1 < menunitems) { Err bitreich.org 70 i+ putp(tparm(cursor_address, 1 + menuselected - menuoffset, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ mbsprint(menuitems[menuselected]->username, columns); Err bitreich.org 70 i+ menuselected++; Err bitreich.org 70 i+ putp(tparm(column_address, 0, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ if (menuselected - menuoffset >= lines - 1) { Err bitreich.org 70 i+ menuoffset++; Err bitreich.org 70 i+ putp(tparm(scroll_forward, 0, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ putp(tparm(cursor_down, 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+ mbsprint(menuitems[menuselected]->username, columns); 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 break; Err bitreich.org 70 i- case 'L': Err bitreich.org 70 i- displayinfoline("You hear elevator music..."); Err bitreich.org 70 i+ case 'k': Err bitreich.org 70 i+ if (menuselected > 0) { Err bitreich.org 70 i+ putp(tparm(cursor_address, 1 + menuselected - menuoffset, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ mbsprint(menuitems[menuselected]->username, columns); Err bitreich.org 70 i+ menuselected--; Err bitreich.org 70 i+ putp(tparm(column_address, 0, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ if (menuselected < menuoffset) { Err bitreich.org 70 i+ menuoffset = menuselected; Err bitreich.org 70 i+ putp(tparm(scroll_reverse, 0, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ putp(tparm(cursor_up, 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+ mbsprint(menuitems[menuselected]->username, columns); 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 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+ case ' ': Err bitreich.org 70 i+ selection = menuitems[menuselected]; Err bitreich.org 70 i+ case 0x1b: Err bitreich.org 70 i+ goto endloop; Err bitreich.org 70 i break; Err bitreich.org 70 i } Err bitreich.org 70 i+ fflush(stdout); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i+endloop: Err bitreich.org 70 i+ screen = DungeonScreen; Err bitreich.org 70 i+ drawscreen(); 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+Item * Err bitreich.org 70 i+interactitem(struct cell *c) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ displayinfoline(map[py][px].tile->afterinteract); Err bitreich.org 70 i+ Err bitreich.org 70 i+ return map[py][px].items[0]; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+Item * Err bitreich.org 70 i+interactmenu(struct cell *c) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ Item *selection; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (selection = showmenu(map[py][px].tile->name, map[py][px].items, map[py][px].nitems)) Err bitreich.org 70 i+ displayinfoline(map[py][px].tile->afterinteract); 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+Item * Err bitreich.org 70 i+interact(Item *item) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ if (map[py][px].tile->interact) Err bitreich.org 70 i+ return map[py][px].tile->interact(&map[py][px]); Err bitreich.org 70 i+ Err bitreich.org 70 i+ return NULL; 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+ char *name; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (map[y][x].nitems) { 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+ name = 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+ name = 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+ } else { Err bitreich.org 70 i+ name = NULL; Err bitreich.org 70 i } Err bitreich.org 70 i+ if (map[y][x].tile->flags & Important || verbose) Err bitreich.org 70 i+ displayinfoline(map[y][x].tile->description, name); Err bitreich.org 70 i+ else Err bitreich.org 70 i+ displayinfoline(""); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+dungeondraw(void) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ putp(tparm(change_scroll_region, 0, lines-3, 0, 0, 0, 0, 0, 0, 0)); 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+ rendermap(); Err bitreich.org 70 i+ Err bitreich.org 70 i+ putp(tparm(cursor_address, py - oy, px - ox, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ putchar('@'); Err bitreich.org 70 i+ putp(tparm(cursor_address, py - oy, px - ox, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (curentry->entry != curentry) { Err bitreich.org 70 i+ displaybar(curentry->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+ describe(px, py, 0); 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+ ssize_t i; Err bitreich.org 70 i size_t x, y; Err bitreich.org 70 i+ size_t noy, nox; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if ((ssize_t)py + dy >= MAPHEIGHT || (ssize_t)py + dy < 0) Err bitreich.org 70 i+ return; Err bitreich.org 70 i+ if ((ssize_t)px + dx >= MAPWIDTH || (ssize_t)px + dx < 0) Err bitreich.org 70 i+ return; 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+ x = px + dx; Err bitreich.org 70 i+ y = py + dy; Err bitreich.org 70 i Err bitreich.org 70 i- if (map[y][x].c == '#') Err bitreich.org 70 i+ if (map[y][x].tile->flags & Blocks) 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+ if (dx) { Err bitreich.org 70 i+ if (x < columns / 2 || MAPWIDTH <= columns) Err bitreich.org 70 i+ nox = 0; Err bitreich.org 70 i+ else if (x >= MAPWIDTH - columns / 2 - 1) Err bitreich.org 70 i+ nox = MAPWIDTH - columns; Err bitreich.org 70 i+ else Err bitreich.org 70 i+ nox = x - columns / 2; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (ox != nox) { Err bitreich.org 70 i+ putp(tparm(cursor_address, 0, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ rendermap(); Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ putp(tparm(cursor_address, py - oy, px - ox, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ rendermapchar(py, px); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } else if (dy) { Err bitreich.org 70 i+ putp(tparm(cursor_address, py - oy, px - ox, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ rendermapchar(py, px); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (y < maplines / 2 || MAPHEIGHT <= maplines) { Err bitreich.org 70 i+ noy = 0; Err bitreich.org 70 i+ } else if (y >= MAPHEIGHT - maplines / 2 - 1) { Err bitreich.org 70 i+ noy = MAPHEIGHT - maplines; Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ noy = y - maplines / 2; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (noy < oy) { Err bitreich.org 70 i+ putp(tparm(cursor_address, 0, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ for (i = (ssize_t)oy - 1; i >= (ssize_t)noy; i--) { Err bitreich.org 70 i+ putp(tparm(scroll_reverse, 0, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ rendermapline(i); Err bitreich.org 70 i+ putp(tparm(column_address, 0, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } else if (noy > oy) { Err bitreich.org 70 i+ putp(tparm(cursor_address, lines-3, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ for (i = oy + 1; i <= noy; i++) { Err bitreich.org 70 i+ putp(tparm(scroll_forward, 0, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ rendermapline(i + maplines - 1); Err bitreich.org 70 i+ putp(tparm(column_address, 0, 0, 0, 0, 0, 0, 0, 0, 0)); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } Err bitreich.org 70 i+ oy = noy; Err bitreich.org 70 i+ } 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+ putp(tparm(cursor_address, py - oy, px - ox, 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+ putp(tparm(cursor_address, py - oy, px - ox, 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+ describe(px, py, 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+ switch (screen) { Err bitreich.org 70 i+ case DungeonScreen: Err bitreich.org 70 i+ dungeondraw(); Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case MenuScreen: Err bitreich.org 70 i+ menudraw(); Err bitreich.org 70 i+ break; 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+ fflush(stdout); 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+ if (!entry || !(entry->type == '1' || entry->type == '+' || entry->type == '7')) 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+ if (entry != curentry) { Err bitreich.org 70 i+ generatemap(entry, curentry); Err bitreich.org 70 i+ curentry = entry; Err bitreich.org 70 i+ } 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+ if (!entry || !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+ switch (mygetchar()) { 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@@ -899,40 +1400,20 @@ uiselectitem(Item *entry) 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+ if (e = interact(entry)) 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+ case 0x1b: Err bitreich.org 70 i return NULL; Err bitreich.org 70 i } Err bitreich.org 70 i+ fflush(stdout); 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+ sigwinch = 1; Err bitreich.org 70 i } Err bitreich.org 70 1diff --git a/ui_rogue_notes b/ui_rogue_notes /scm/sacc/file/ui_rogue_notes.gph bitreich.org 70 i@@ -0,0 +1,31 @@ Err bitreich.org 70 i+# Notes Err bitreich.org 70 i+- in need for a big gopher directory? use gopher://bitreich.org/1/memecache/ Err bitreich.org 70 i+ Err bitreich.org 70 i+# Bugs Err bitreich.org 70 i+- not all corridors have 2 doors Err bitreich.org 70 i+ Err bitreich.org 70 i+# Future Features? Err bitreich.org 70 i+- k-medoids clustering using selector strings in reasonable time... Err bitreich.org 70 i+ - items with similar selectors should get inserted into the same rooms Err bitreich.org 70 i+ - one could use some mapping (sammon mapping?) to place the rooms based on the cluster medoids Err bitreich.org 70 i+ - similar clusters are near together Err bitreich.org 70 i+- examine mode Err bitreich.org 70 i+ - allow the cursor to move freely and describe the tiles with describe() in verbose mode Err bitreich.org 70 i+- running using H, J, K, L Err bitreich.org 70 i+ - go into the direction until the floor tile changes? Err bitreich.org 70 i+ - with wall sliding to go through corridors Err bitreich.org 70 i+ - needs to stop at junctions Err bitreich.org 70 i+- spells Err bitreich.org 70 i+ - teleport to a random room on the current level Err bitreich.org 70 i+ - teleport to a random already visited level Err bitreich.org 70 i+ - inscribe a scroll to teleport later back to the current level Err bitreich.org 70 i+- visibility thingies to declutter things Err bitreich.org 70 i+ - maybe like hack: keep things visible after discovery Err bitreich.org 70 i+ - and what's with persisting this information? Err bitreich.org 70 i+ - only show the content of the current room Err bitreich.org 70 i+- better dungeon generation Err bitreich.org 70 i+ - analyse things to create clever corridors Err bitreich.org 70 i+- different dungeon themes Err bitreich.org 70 i+ - so basically an extended dungeontype thing, with different dungeon generation algorithms Err bitreich.org 70 i+ - maybe some special layouts for root directories (empty selector) Err bitreich.org 70 i+ - i look at you, ultima castle generator! https://slash.itch.io/ultima-castle-generator Err bitreich.org 70 1diff --git a/ui_rogue_readme b/ui_rogue_readme /scm/sacc/file/ui_rogue_readme.gph bitreich.org 70 i@@ -0,0 +1,28 @@ Err bitreich.org 70 i+# Description Err bitreich.org 70 i+This UI module (?) for sacc displays directories like rogue/hack dungeon levels. Err bitreich.org 70 i+ Err bitreich.org 70 i+The code is ugly. It's obvious that I (pazz0) don't know what I do. Err bitreich.org 70 i+ Err bitreich.org 70 i+# Compiling Err bitreich.org 70 i+Copy ui_rogue.c in the sacc source directory. Err bitreich.org 70 i+Go in the sacc source directory and execute blindly the following commands: Err bitreich.org 70 i+``` Err bitreich.org 70 i+make clean && make UI=rogue Err bitreich.org 70 i+``` Err bitreich.org 70 i+sacc will now have the much more confusing ui_rogue interface. Err bitreich.org 70 i+ Err bitreich.org 70 i+# Key mapping Err bitreich.org 70 i+h, j, k, l: left, down, up, right Err bitreich.org 70 i+space: interact (in dungeon), select (in menu) Err bitreich.org 70 i+ESC or q: exit (in dungeon), close menu Err bitreich.org 70 i+ Err bitreich.org 70 i+# Map explanation Err bitreich.org 70 i+E or ?: bookshelf/book (gopher type '0') Err bitreich.org 70 i+L or >: elevator/staircase down/staircase up (gopher type '1' on the current server) Err bitreich.org 70 i+O or 0: portal machine/portal (gopher type '1' on another server) Err bitreich.org 70 i+%: heap of stuff (other non-handled gopher types, apart from 'i' and '3') Err bitreich.org 70 i+standout (inverse) 0 or <: a way to go back to the previous gopher directory Err bitreich.org 70 i+ Err bitreich.org 70 i+. or #: floor Err bitreich.org 70 i+/: doors (behaves like floor) Err bitreich.org 70 i+| or -: wall Err bitreich.org 70 .