fix #H8237 - corpse on an invalid trap

It's possible to get a rolling boulder trap which doesn't have any
boulder.  That isn't invalid, but if/when it happens on a shallow
level it shouldn't be covered by the corpse of a fake adventurer
since such a trap won't kill anyone.
This commit is contained in:
PatR
2019-02-21 17:53:19 -08:00
parent 738dce6b00
commit 2579a3dcbb
2 changed files with 26 additions and 11 deletions

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 mklev.c $NHDT-Date: 1511681724 2017/11/26 07:35:24 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.47 $ */
/* NetHack 3.6 mklev.c $NHDT-Date: 1550800390 2019/02/22 01:53:10 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.59 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Alex Smith, 2017. */
/* NetHack may be freely redistributed. See license for details. */
@@ -89,7 +89,7 @@ xchar xl, yl, xh, yh;
/* cannot find something reasonable -- strange */
x = xl;
y = yh;
gotit:
gotit:
cc->x = x;
cc->y = y;
return;
@@ -99,11 +99,12 @@ void
sort_rooms()
{
#if defined(SYSV) || defined(DGUX)
qsort((genericptr_t) rooms, (unsigned) nroom, sizeof(struct mkroom),
do_comp);
#define CAST_nroom (unsigned) nroom
#else
qsort((genericptr_t) rooms, nroom, sizeof(struct mkroom), do_comp);
#define CAST_nroom nroom /*as-is*/
#endif
qsort((genericptr_t) rooms, CAST_nroom, sizeof (struct mkroom), do_comp);
#undef CAST_nroom
}
STATIC_OVL void
@@ -728,11 +729,12 @@ makelevel()
/* make a secret treasure vault, not connected to the rest */
if (do_vault()) {
xchar w, h;
debugpline0("trying to make a vault...");
w = 1;
h = 1;
if (check_room(&vault_x, &w, &vault_y, &h, TRUE)) {
fill_vault:
fill_vault:
add_room(vault_x, vault_y, vault_x + w, vault_y + h, TRUE, VAULT,
FALSE);
level.flags.has_vault = 1;
@@ -785,7 +787,7 @@ makelevel()
mkroom(COCKNEST);
}
skip0:
skip0:
/* Place multi-dungeon branch. */
place_branch(branchp, 0, 0);
@@ -848,6 +850,7 @@ skip0:
if (!rn2(27 + 3 * abs(depth(&u.uz)))) {
char buf[BUFSZ];
const char *mesg = random_engraving(buf);
if (mesg) {
do {
x = somex(croom);
@@ -859,7 +862,7 @@ skip0:
}
}
skip_nonrogue:
skip_nonrogue:
if (!rn2(3)) {
(void) mkobj_at(0, somex(croom), somey(croom), TRUE);
tryct = 0;
@@ -1259,6 +1262,7 @@ struct mkroom *croom;
coord *tm;
{
register int kind;
struct trap *t;
unsigned lvl = level_difficulty();
coord m;
@@ -1367,7 +1371,11 @@ coord *tm;
|| (avoid_boulder && sobj_at(BOULDER, m.x, m.y)));
}
(void) maketrap(m.x, m.y, kind);
t = maketrap(m.x, m.y, kind);
/* we should always get type of trap we're asking for (occupied() test
should prevent cases where that might not happen) but be paranoid */
kind = t ? t->ttyp : NO_TRAP;
if (kind == WEB)
(void) makemon(&mons[PM_GIANT_SPIDER], m.x, m.y, NO_MM_FLAGS);
@@ -1392,8 +1400,13 @@ coord *tm;
lethal, and tend not to generate on shallower levels anyway.
Finally, pits are excluded because it's weird to see an item
in a pit and yet not be able to identify that the pit is there. */
if (lvl <= (unsigned) rnd(4)
if (kind != NO_TRAP && lvl <= (unsigned) rnd(4)
&& kind != SQKY_BOARD && kind != RUST_TRAP
/* rolling bounder trap might not have a boulder if there was no
viable path (such as when placed in the corner of a room), in
which case tx,ty==launch.x,y; no boulder => no dead predecessor */
&& !(kind == ROLLING_BOULDER_TRAP
&& t->launch.x == t->tx && t->launch.y == t->ty)
&& !is_pit(kind) && kind < HOLE) {
/* Object generated by the trap; initially NULL, stays NULL if
we fail to generate an object or if the trap doesn't