From 2952bdab6374a66e8acadfa95f1eec96e68f420f Mon Sep 17 00:00:00 2001 From: Pasi Kallinen Date: Sun, 18 Feb 2024 11:44:55 +0200 Subject: [PATCH] No secret doors or corridors on the early levels New players often get stuck on the first level when they can't find the secret door or corridor. Make the first two levels have no such features. --- doc/fixes3-7-0.txt | 1 + include/extern.h | 1 + src/mklev.c | 12 +++++++++++- src/sp_lev.c | 10 ++++++---- 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/doc/fixes3-7-0.txt b/doc/fixes3-7-0.txt index ab26b7bc4..0b64796a4 100644 --- a/doc/fixes3-7-0.txt +++ b/doc/fixes3-7-0.txt @@ -1362,6 +1362,7 @@ if confused #loot while on a throne moved whole stack of quivered gold into leading to crash when quiver was subsequently accessed when filling quiver slot, don't bother asking "what do you want to ready?" if invent is empty +no secret doors or corridors on the first two dungeon levels Fixes to 3.7.0-x General Problems Exposed Via git Repository diff --git a/include/extern.h b/include/extern.h index 5d9141eae..b6c0cc843 100644 --- a/include/extern.h +++ b/include/extern.h @@ -1531,6 +1531,7 @@ extern void topologize(struct mkroom *) NONNULLARG1; extern void place_branch(branch *, coordxy, coordxy) NO_NNARGS; extern boolean occupied(coordxy, coordxy); extern int okdoor(coordxy, coordxy); +extern boolean maybe_sdoor(int); extern void dodoor(coordxy, coordxy, struct mkroom *) NONNULLARG3; extern void mktrap(int, unsigned, struct mkroom *, coord *) NO_NNARGS; extern void mkstairs(coordxy, coordxy, char, struct mkroom *, boolean); diff --git a/src/mklev.c b/src/mklev.c index d35d9d97a..61042257f 100644 --- a/src/mklev.c +++ b/src/mklev.c @@ -425,6 +425,7 @@ join(register int a, register int b, boolean nxcor) gs.smeq[a] = gs.smeq[b]; } +/* create random corridors between rooms */ void makecorridors(void) { @@ -447,6 +448,7 @@ makecorridors(void) any = TRUE; } } + /* add some extra corridors which may be blocked off */ if (gn.nroom > 2) for (i = rn2(gn.nroom) + 4; i; i--) { a = rn2(gn.nroom); @@ -1599,10 +1601,18 @@ okdoor(coordxy x, coordxy y) && !near_door); } +/* do we want a secret door/corridor? */ +boolean +maybe_sdoor(int chance) +{ + return (depth(&u.uz) > 2) && !rn2(max(2, chance)); +} + +/* create a door at x,y in room aroom */ void dodoor(coordxy x, coordxy y, struct mkroom *aroom) { - dosdoor(x, y, aroom, rn2(8) ? DOOR : SDOOR); + dosdoor(x, y, aroom, maybe_sdoor(8) ? SDOOR : DOOR); } boolean diff --git a/src/sp_lev.c b/src/sp_lev.c index e03496bd7..54b26c4cb 100644 --- a/src/sp_lev.c +++ b/src/sp_lev.c @@ -2498,7 +2498,9 @@ search_door( } /* - * Dig a corridor between two points. + * Dig a corridor between two points, using terrain ftyp. + * if nxcor is TRUE, he corridor may be blocked by a boulder, + * or just end without reaching the destination. */ boolean dig_corridor( @@ -2545,12 +2547,12 @@ dig_corridor( crm = &levl[xx][yy]; if (crm->typ == btyp) { - if (ftyp != CORR || rn2(100)) { + if (ftyp == CORR && maybe_sdoor(100)) { + crm->typ = SCORR; + } else { crm->typ = ftyp; if (nxcor && !rn2(50)) (void) mksobj_at(BOULDER, xx, yy, TRUE, FALSE); - } else { - crm->typ = SCORR; } } else if (crm->typ != ftyp && crm->typ != SCORR) { /* strange ... */