Fix: a number of unblock_points shouldn't unblock unconditionally

Initially diagnosed in an xnethack fuzzer crash - unblock_point
shouldn't be called when a closed door becomes non-closed, because it's
possible that there's a gas cloud on the space which means it still
blocks vision. These always need to be recalc_block_point. A number of
them were fixed, but when I went through all the xnethack ones, I found
some that were unchanged from upstream NetHack. I reproduced the sanity
check impossibles usually by breathing gas at a door as an iron golem
and then opening or destroying the door to trigger the unblock_point
call.

The use of recalc_block_point in wizterrainwish was not triggering this
bug, but the previous code there basically duplicated
recalc_block_point.
This commit is contained in:
copperwater
2025-03-08 07:47:28 -05:00
parent a6a1e1b365
commit 49b43f760f
6 changed files with 6 additions and 13 deletions

View File

@@ -3862,14 +3862,7 @@ wizterrainwish(struct _readobjnam_data *d)
} else {
if (u.utrap && u.utraptype == TT_LAVA && !is_lava(u.ux, u.uy))
reset_utrap(FALSE);
if (does_block(x, y, lev)) {
if (!didblock)
block_point(x, y);
} else {
if (didblock)
unblock_point(x, y);
}
recalc_block_point(x, y);
}
/* fixups for replaced terrain that aren't handled above */