more monster/door interaction

Apply visibility fixups for monsters triggering door trap
explosions or digging through doors similar to the monster-opens-
door-handling from a couple of days.  Again, the issue is that
hero/player can see a closed door in situations where they can't
see an open one, and messages about the door being opened or
destroyed need to take that into account when seeing a closed
door go away.

Not as thoroughly tested as monster just opening closed door.
This commit is contained in:
PatR
2021-03-23 08:52:36 -07:00
parent e37d3d9f2d
commit 6c70b46ea1
4 changed files with 51 additions and 30 deletions
+1 -1
View File
@@ -1491,7 +1491,7 @@ extern boolean olfaction(struct permonst *);
/* ### monmove.c ### */ /* ### monmove.c ### */
extern boolean itsstuck(struct monst *); extern boolean itsstuck(struct monst *);
extern boolean mb_trapped(struct monst *); extern boolean mb_trapped(struct monst *, boolean);
extern boolean monhaskey(struct monst *, boolean); extern boolean monhaskey(struct monst *, boolean);
extern void mon_regen(struct monst *, boolean); extern void mon_regen(struct monst *, boolean);
extern int dochugw(struct monst *); extern int dochugw(struct monst *);
+13 -7
View File
@@ -1254,6 +1254,7 @@ boolean
mdig_tunnel(struct monst *mtmp) mdig_tunnel(struct monst *mtmp)
{ {
register struct rm *here; register struct rm *here;
boolean sawit, seeit, trapped;
int pile = rnd(12); int pile = rnd(12);
here = &levl[mtmp->mx][mtmp->my]; here = &levl[mtmp->mx][mtmp->my];
@@ -1264,19 +1265,24 @@ mdig_tunnel(struct monst *mtmp)
if (closed_door(mtmp->mx, mtmp->my)) { if (closed_door(mtmp->mx, mtmp->my)) {
if (*in_rooms(mtmp->mx, mtmp->my, SHOPBASE)) if (*in_rooms(mtmp->mx, mtmp->my, SHOPBASE))
add_damage(mtmp->mx, mtmp->my, 0L); add_damage(mtmp->mx, mtmp->my, 0L);
/* sawit: closed door location is more visible than an open one */
sawit = canseemon(mtmp); /* before door state change and unblock_pt */
trapped = (here->doormask & D_TRAPPED) ? TRUE : FALSE;
here->doormask = trapped ? D_NODOOR : D_BROKEN;
unblock_point(mtmp->mx, mtmp->my); /* vision */ unblock_point(mtmp->mx, mtmp->my); /* vision */
if (here->doormask & D_TRAPPED) { newsym(mtmp->mx, mtmp->my);
here->doormask = D_NODOOR; if (trapped) {
if (mb_trapped(mtmp)) { /* mtmp is killed */ seeit = canseemon(mtmp);
if (mb_trapped(mtmp, sawit || seeit)) { /* mtmp is killed */
newsym(mtmp->mx, mtmp->my); newsym(mtmp->mx, mtmp->my);
return TRUE; return TRUE;
} }
} else { } else {
if (!rn2(3) && flags.verbose) /* not too often.. */ if (flags.verbose) {
draft_message(TRUE); /* "You feel an unexpected draft." */ if (!Unaware && !rn2(3)) /* not too often.. */
here->doormask = D_BROKEN; draft_message(TRUE); /* "You feel an unexpected draft." */
}
} }
newsym(mtmp->mx, mtmp->my);
return FALSE; return FALSE;
} else if (here->typ == SCORR) { } else if (here->typ == SCORR) {
here->typ = CORR, here->flags = 0; here->typ = CORR, here->flags = 0;
+27 -13
View File
@@ -1092,30 +1092,44 @@ doorlock(struct obj *otmp, int x, int y)
case WAN_STRIKING: case WAN_STRIKING:
case SPE_FORCE_BOLT: case SPE_FORCE_BOLT:
if (door->doormask & (D_LOCKED | D_CLOSED)) { if (door->doormask & (D_LOCKED | D_CLOSED)) {
/* sawit: closed door location is more visible than open */
boolean sawit, seeit;
if (door->doormask & D_TRAPPED) { if (door->doormask & D_TRAPPED) {
if (MON_AT(x, y)) struct monst *mtmp = m_at(x, y);
(void) mb_trapped(m_at(x, y));
else if (flags.verbose) { sawit = mtmp ? canseemon(mtmp) : cansee(x, y);
if (cansee(x, y))
pline("KABOOM!! You see a door explode.");
else
You_hear("a distant explosion.");
}
door->doormask = D_NODOOR; door->doormask = D_NODOOR;
unblock_point(x, y); unblock_point(x, y);
newsym(x, y); newsym(x, y);
loudness = 40; seeit = mtmp ? canseemon(mtmp) : cansee(x, y);
if (mtmp) {
(void) mb_trapped(mtmp, sawit || seeit);
} else {
/* for mtmp, mb_trapped() does is own wake_nearto() */
loudness = 40;
if (flags.verbose) {
if ((sawit || seeit) && !Unaware)
pline("KABOOM!! You see a door explode.");
else if (!Deaf)
You_hear("a %s explosion.",
(distu(x, y) > 7 * 7) ? "distant"
: "nearby");
}
}
break; break;
} }
sawit = cansee(x, y);
door->doormask = D_BROKEN; door->doormask = D_BROKEN;
unblock_point(x, y);
seeit = cansee(x, y);
newsym(x, y);
if (flags.verbose) { if (flags.verbose) {
if (cansee(x, y)) if ((sawit || seeit) && !Unaware)
pline_The("door crashes open!"); pline_The("door crashes open!");
else else if (!Deaf)
You_hear("a crashing sound."); You_hear("a crashing sound.");
} }
unblock_point(x, y);
newsym(x, y);
/* force vision recalc before printing more messages */ /* force vision recalc before printing more messages */
if (g.vision_full_recalc) if (g.vision_full_recalc)
vision_recalc(0); vision_recalc(0);
+10 -9
View File
@@ -18,23 +18,24 @@ static int vamp_shift(struct monst *, struct permonst *, boolean);
/* True if mtmp died */ /* True if mtmp died */
boolean boolean
mb_trapped(struct monst* mtmp) mb_trapped(struct monst *mtmp, boolean canseeit)
{ {
if (flags.verbose) { if (flags.verbose) {
if (cansee(mtmp->mx, mtmp->my) && !Unaware) if (canseeit && !Unaware)
pline("KABOOM!! You see a door explode."); pline("KABOOM!! You see a door explode.");
else if (!Deaf) else if (!Deaf)
You_hear("a distant explosion."); You_hear("a %s explosion.",
(distu(mtmp->mx, mtmp->my) > 7 * 7) ? "distant"
: "nearby");
} }
wake_nearto(mtmp->mx, mtmp->my, 7 * 7); wake_nearto(mtmp->mx, mtmp->my, 7 * 7);
mtmp->mstun = 1; mtmp->mstun = 1;
mtmp->mhp -= rnd(15); mtmp->mhp -= rnd(15);
if (DEADMONSTER(mtmp)) { if (DEADMONSTER(mtmp)) {
mondied(mtmp); mondied(mtmp);
if (!DEADMONSTER(mtmp)) /* lifesaved */ if (DEADMONSTER(mtmp))
return FALSE;
else
return TRUE; return TRUE;
/* will get here if lifesaved */
} }
return FALSE; return FALSE;
} }
@@ -1401,7 +1402,7 @@ m_move(register struct monst* mtmp, register int after)
UnblockDoor(here, mtmp, !btrapped ? D_ISOPEN : D_NODOOR); UnblockDoor(here, mtmp, !btrapped ? D_ISOPEN : D_NODOOR);
if (btrapped) { if (btrapped) {
if (mb_trapped(mtmp)) if (mb_trapped(mtmp, canseeit))
return 2; return 2;
} else { } else {
if (flags.verbose) { if (flags.verbose) {
@@ -1417,7 +1418,7 @@ m_move(register struct monst* mtmp, register int after)
} else if (here->doormask == D_CLOSED && can_open) { } else if (here->doormask == D_CLOSED && can_open) {
UnblockDoor(here, mtmp, !btrapped ? D_ISOPEN : D_NODOOR); UnblockDoor(here, mtmp, !btrapped ? D_ISOPEN : D_NODOOR);
if (btrapped) { if (btrapped) {
if (mb_trapped(mtmp)) if (mb_trapped(mtmp, canseeit))
return 2; return 2;
} else { } else {
if (flags.verbose) { if (flags.verbose) {
@@ -1438,7 +1439,7 @@ m_move(register struct monst* mtmp, register int after)
: D_BROKEN); : D_BROKEN);
UnblockDoor(here, mtmp, mask); UnblockDoor(here, mtmp, mask);
if (btrapped) { if (btrapped) {
if (mb_trapped(mtmp)) if (mb_trapped(mtmp, canseeit))
return 2; return 2;
} else { } else {
if (flags.verbose) { if (flags.verbose) {