wizard mode wishing for secret doors
Allow wishing for secret doors and secret corridors. It's a bit more strict about where the wish is performed than wishing for furniture. Implemented in order to test drum of earthquake effects. I spent a lot of time figuring out SDOOR details that somebody already knew at some point but evidently didn't document--you can't specify D_CLOSED for them or the display code will issue impossible warnings about wall mode angles.
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
$NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.51 $ $NHDT-Date: 1578252630 2020/01/05 19:30:30 $
|
||||
$NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.52 $ $NHDT-Date: 1578258722 2020/01/05 21:12:02 $
|
||||
|
||||
General Fixes and Modified Features
|
||||
-----------------------------------
|
||||
@@ -74,6 +74,9 @@ add 'quick_farsight' option to provide some control over random clairvoyance
|
||||
replace "money" in in-game texts with "gold"
|
||||
when hallucinating, see hallucinated currencies instead of bits for an ale
|
||||
applying a spellbook hints about read charges left
|
||||
wizard mode wishing for level topology can now create hidden doors (ask for
|
||||
"secret door" when at a door or wall location) and hidden corridor
|
||||
spots ("secret corridor" at a corridor location)
|
||||
|
||||
|
||||
Platform- and/or Interface-Specific New Features
|
||||
|
||||
15
include/rm.h
15
include/rm.h
@@ -1,4 +1,4 @@
|
||||
/* NetHack 3.6 rm.h $NHDT-Date: 1573943499 2019/11/16 22:31:39 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.66 $ */
|
||||
/* NetHack 3.6 rm.h $NHDT-Date: 1578258722 2020/01/05 21:12:02 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.77 $ */
|
||||
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
||||
/*-Copyright (c) Pasi Kallinen, 2017. */
|
||||
/* NetHack may be freely redistributed. See license for details. */
|
||||
@@ -310,9 +310,20 @@ extern const struct symdef def_warnsyms[WARNCOUNT];
|
||||
#define SYMHANDLING(ht) (g.symset[g.currentgraphics].handling == (ht))
|
||||
|
||||
/*
|
||||
* The 5 possible states of doors
|
||||
* Note: secret doors (SDOOR) want to use both rm.doormask and
|
||||
* rm.wall_info but those both overload rm.flags. SDOOR only
|
||||
* has 2 states (closed or locked). However, it can't specify
|
||||
* D_CLOSED due to that conflicting with WM_MASK (below). When
|
||||
* a secret door is revealed, the door gets set to D_CLOSED iff
|
||||
* it isn't set to D_LOCKED (see cvt_sdoor_to_door() in detect.c).
|
||||
*
|
||||
* D_TRAPPED conflicts with W_NONDIGGABLE but the latter is not
|
||||
* expected to be used on door locations.
|
||||
*/
|
||||
|
||||
/*
|
||||
* The 5 possible states of doors.
|
||||
*/
|
||||
#define D_NODOOR 0
|
||||
#define D_BROKEN 1
|
||||
#define D_ISOPEN 2
|
||||
|
||||
45
src/objnam.c
45
src/objnam.c
@@ -1,4 +1,4 @@
|
||||
/* NetHack 3.7 objnam.c $NHDT-Date: 1578190895 2020/01/05 02:21:35 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.279 $ */
|
||||
/* NetHack 3.7 objnam.c $NHDT-Date: 1578258724 2020/01/05 21:12:04 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.280 $ */
|
||||
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
||||
/*-Copyright (c) Robert Patrick Rankin, 2011. */
|
||||
/* NetHack may be freely redistributed. See license for details. */
|
||||
@@ -3695,7 +3695,7 @@ struct obj *no_wish;
|
||||
wiztrap:
|
||||
if (wizard && !g.program_state.wizkit_wishing) {
|
||||
struct rm *lev;
|
||||
boolean madeterrain = FALSE;
|
||||
boolean madeterrain = FALSE, badterrain = FALSE;
|
||||
int trap, x = u.ux, y = u.uy;
|
||||
|
||||
for (trap = NO_TRAP + 1; trap < TRAPNUM; trap++) {
|
||||
@@ -3789,6 +3789,45 @@ struct obj *no_wish;
|
||||
lev->typ = IRONBARS;
|
||||
pline("Iron bars.");
|
||||
madeterrain = TRUE;
|
||||
} else if (!BSTRCMPI(bp, p - 11, "secret door")) {
|
||||
if (lev->typ == DOOR
|
||||
|| (IS_WALL(lev->typ) && lev->typ != DBWALL)) {
|
||||
lev->typ = SDOOR;
|
||||
lev->wall_info = 0;
|
||||
/* lev->horizontal stays as-is */
|
||||
/* no special handling for rogue level is necessary;
|
||||
exposing a secret door there yields a doorless doorway */
|
||||
#if 0 /*
|
||||
* Can't do this; secret doors want both doormask and
|
||||
* wall_info but those both overload rm.flags which makes
|
||||
* D_CLOSED conflict with WM_MASK. However, converting
|
||||
* secret door to regular door sets D_CLOSED iff D_LOCKED
|
||||
* isn't specified so the alternate code suffices.
|
||||
*/
|
||||
lev->doormask = locked ? D_LOCKED : D_CLOSED;
|
||||
#else
|
||||
/* cvt_sdoor_to_door() will change D_NODOOR to D_CLOSED */
|
||||
lev->doormask = locked ? D_LOCKED : D_NODOOR;
|
||||
#endif
|
||||
if (trapped)
|
||||
lev->doormask |= D_TRAPPED;
|
||||
block_point(x, y);
|
||||
pline("Secret door.");
|
||||
madeterrain = TRUE;
|
||||
} else {
|
||||
pline("Secret door requires door or wall location.");
|
||||
badterrain = TRUE;
|
||||
}
|
||||
} else if (!BSTRCMPI(bp, p - 15, "secret corridor")) {
|
||||
if (lev->typ == CORR) {
|
||||
lev->typ = SCORR;
|
||||
block_point(x, y);
|
||||
pline("Secret corridor.");
|
||||
madeterrain = TRUE;
|
||||
} else {
|
||||
pline("Secret corridor requires corridor location.");
|
||||
badterrain = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
if (madeterrain) {
|
||||
@@ -3803,6 +3842,8 @@ struct obj *no_wish;
|
||||
&& !is_lava(u.ux, u.uy)) {
|
||||
reset_utrap(FALSE);
|
||||
}
|
||||
}
|
||||
if (madeterrain || badterrain) {
|
||||
/* cast 'const' away; caller won't modify this */
|
||||
return (struct obj *) &cg.zeroobj;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user