more earthquake

When a drum of earthquake targets a secret door, reveal it (which
is always followed by collapsing the door), and when it targets a
secret corridor, reveal that corridor.  Both situations also place
a pit at the location.
This commit is contained in:
PatR
2020-01-05 11:30:38 -08:00
parent cedc757e16
commit 52f4803a5a
3 changed files with 51 additions and 19 deletions

View File

@@ -1,4 +1,4 @@
$NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.50 $ $NHDT-Date: 1578216006 2020/01/05 09:20:06 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.51 $ $NHDT-Date: 1578252630 2020/01/05 19:30:30 $
General Fixes and Modified Features General Fixes and Modified Features
----------------------------------- -----------------------------------
@@ -31,6 +31,7 @@ don't allow twoweapon combat if either weapon is a bow, crossbow, or sling
drum of earthquake feedback reported various things (fountains, thrones, &c) drum of earthquake feedback reported various things (fountains, thrones, &c)
falling into a chasm but they remained intact because trap creation falling into a chasm but they remained intact because trap creation
had been changed to not clobber such things (so couldn't make pits) had been changed to not clobber such things (so couldn't make pits)
make earthquake which hits a secret door or a secret corridor reveal it
Fixes to 3.7.0-x Problems that Were Exposed Via git Repository Fixes to 3.7.0-x Problems that Were Exposed Via git Repository

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 detect.c $NHDT-Date: 1577050472 2019/12/22 21:34:32 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.110 $ */ /* NetHack 3.6 detect.c $NHDT-Date: 1578252630 2020/01/05 19:30:30 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.114 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Robert Patrick Rankin, 2018. */ /*-Copyright (c) Robert Patrick Rankin, 2018. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -1447,14 +1447,14 @@ struct rm *lev;
{ {
int newmask = lev->doormask & ~WM_MASK; int newmask = lev->doormask & ~WM_MASK;
if (Is_rogue_level(&u.uz)) if (Is_rogue_level(&u.uz)) {
/* rogue didn't have doors, only doorways */ /* rogue didn't have doors, only doorways */
newmask = D_NODOOR; newmask = D_NODOOR;
else } else {
/* newly exposed door is closed */ /* newly exposed door is closed */
if (!(newmask & D_LOCKED)) if (!(newmask & D_LOCKED))
newmask |= D_CLOSED; newmask |= D_CLOSED;
}
lev->typ = DOOR; lev->typ = DOOR;
lev->doormask = newmask; lev->doormask = newmask;
} }

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 music.c $NHDT-Date: 1578216006 2020/01/05 09:20:06 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.66 $ */ /* NetHack 3.6 music.c $NHDT-Date: 1578252632 2020/01/05 19:30:32 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.67 $ */
/* Copyright (c) 1989 by Jean-Christophe Collet */ /* Copyright (c) 1989 by Jean-Christophe Collet */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -268,6 +268,24 @@ int force;
if (rn2(14 - force)) if (rn2(14 - force))
continue; continue;
/*
* Possible extensions:
* When a door is trapped, explode it instead of silently
* turning it into an empty doorway.
* Trigger divine wrath when an altar is dumped into a chasm.
* Sometimes replace sink with fountain or fountain with pool
* instead of always producing a pit.
* Sometimes release monster and/or treasure from a grave or
* a throne instead of just dumping them into the chasm.
* Chance to destroy wall segments? Trees too?
* Honor non-diggable for locked doors, walls, and trees.
* Treat non-passwall as if it was non-diggable?
* Conjoin some of the umpteen pits when they're adjacent?
*
* Replace 'goto do_pit;' with 'do_pit = TRUE; break;' and
* move the pit code to after the switch.
*/
switch (levl[x][y].typ) { switch (levl[x][y].typ) {
case FOUNTAIN: /* make the fountain disappear */ case FOUNTAIN: /* make the fountain disappear */
if (cansee(x, y)) if (cansee(x, y))
@@ -278,6 +296,7 @@ int force;
pline_The("kitchen sink falls%s.", into_a_chasm); pline_The("kitchen sink falls%s.", into_a_chasm);
goto do_pit; goto do_pit;
case ALTAR: case ALTAR:
/* always preserve the high altars */
if (Is_astralevel(&u.uz) || Is_sanctum(&u.uz)) if (Is_astralevel(&u.uz) || Is_sanctum(&u.uz))
break; break;
/* no need to check for high altar here; we've just /* no need to check for high altar here; we've just
@@ -295,19 +314,26 @@ int force;
case THRONE: case THRONE:
if (cansee(x, y)) if (cansee(x, y))
pline_The("throne falls%s.", into_a_chasm); pline_The("throne falls%s.", into_a_chasm);
goto do_pit;
case SCORR:
levl[x][y].typ = CORR;
unblock_point(x, y);
if (cansee(x, y))
pline("A secret corridor is revealed.");
/*FALLTHRU*/ /*FALLTHRU*/
case ROOM: case CORR:
case CORR: /* Try to make a pit */ case ROOM: /* Try to make a pit. */
do_pit: do_pit:
/* maketrap() won't replace furniture with a trap, /* maketrap() won't replace furniture with a trap,
so remove the furniture first */ so remove the furniture first */
if (levl[x][y].typ != CORR) { if (levl[x][y].typ != CORR) {
if (levl[x][y].typ != DOOR) if (levl[x][y].typ != DOOR) {
levl[x][y].typ = ROOM; levl[x][y].typ = ROOM;
levl[x][y].flags = 0; /* clear doormask (D_NODOOR) or /* clear blessed fountain, disturbed grave */
* altarmask or looted throne */ levl[x][y].horizontal = 0;
levl[x][y].horizontal = 0; /* clear blessed fountain, }
* disturbed grave */ /* clear doormask, altarmask, looted throne */
levl[x][y].flags = 0; /* same as 'doormask = D_NODOOR' */
} }
chasm = maketrap(x, y, PIT); chasm = maketrap(x, y, PIT);
if (!chasm) if (!chasm)
@@ -415,18 +441,23 @@ int force;
newsym(x, y); newsym(x, y);
} }
break; break;
case SDOOR:
cvt_sdoor_to_door(&levl[x][y]); /* .typ = DOOR */
if (cansee(x, y))
pline("A secret door is revealed.");
/*FALLTHRU*/
case DOOR: /* make the door collapse */ case DOOR: /* make the door collapse */
/* if already doorless, treat like room or corridor */
if (levl[x][y].doormask == D_NODOOR) if (levl[x][y].doormask == D_NODOOR)
goto do_pit; goto do_pit;
/* TODO: if door is trapped, the trap should explode; /* wasn't doorless, now it will be */
forcing D_NODOOR just makes trap silently go away */ levl[x][y].doormask = D_NODOOR;
unblock_point(x, y);
newsym(x, y); /* before pline */
if (cansee(x, y)) if (cansee(x, y))
pline_The("door collapses."); pline_The("door collapses.");
if (*in_rooms(x, y, SHOPBASE)) if (*in_rooms(x, y, SHOPBASE))
add_damage(x, y, 0L); add_damage(x, y, 0L);
levl[x][y].doormask = D_NODOOR;
unblock_point(x, y);
newsym(x, y);
break; break;
} }
} }