fix #K4098 - lava burns up item being stolen

Three months ago to prevent an "object lost" panic situation when
stealing an item that let hero survive water (several candidates)
would result in drowning, remove_worn_item() was changed to flag the
item being removed as in_use and emergency_disrobe() was changed to
avoid dropping in_use items while drowning.  That seemed to work ok.
But for lava instead of water, in_use is a flag to destroy the item
(set in advance, before issuing messages that can give the player a
chance to trigger a hangup save).  So instead of keeping the item
around for theft to finish, it was deallocating it.  steal() would
format the freed object and then access some of its fields, leading
to havoc.

This adds a hack to allow one item already flagged as in_use to be
treated differently by lava_effects() from the ones it flags for
destruction.  This also seems to work ok, but we may need to start
putting freed items on a deferred deallocation list similar to how
dead monsters are kept around for the rest of the current move.

The fix/hack has revealed two more bugs that this doesn't address.
An item being stolen is removed without any message, then if that
removal doesn't kill the hero a theft message is given.  The message
sequencing is wrong.  Flying hero who loses amulet of flying just
gets affected by lava; player is only told why after life saving.

The other issue is that life-saving from lava can teleport the hero
to where the thief can no longer be seen, yielding "It steals <item>"
even though "It" was visible when the theft started.
This commit is contained in:
PatR
2024-02-04 15:40:00 -08:00
parent e201184dd3
commit 061c2ab1b1
2 changed files with 31 additions and 4 deletions

View File

@@ -1854,6 +1854,10 @@ debug fuzzer was triggering out of bounds array access in loseexp() if
levels and restored those all the way to level 30; introducing an
assert(u.ulevel < MAXULEV) changed bounds issue to assertion failure
strength less than 25 was unintentionally being capped at 18/07
if an amulet of flying gets stolen while hero is over lava without other
protection against lava, it will be destroyed even though it isn't
flammable, then attempting to format it for messages will trigger an
impossible warning about "glorkum", then a crash occurs
Fixes to 3.7.0-x Platform and/or Interface Problems Exposed Via git Repository