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 ... */