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:
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user