vulnerable items thrown into lava
Reported directly to devteam, player threw a troll corpse into lava and then later got messages about it reviving and burning to death. Items thrown, kicked, or dropped into lava were being subjected to fire damage (so scrolls burned up, potions boiled, non-fireproofed flammable weapons and armor eroded), but corpses and a lot of other stuff not subject to erosion remained unaffected. This makes things that are made out of wood, cloth, flesh and other flammable stuff burn up (when in lava, not when hit by fire).
This commit is contained in:
2
src/do.c
2
src/do.c
@@ -190,7 +190,7 @@ const char *verb;
|
||||
newsym(x, y);
|
||||
return TRUE;
|
||||
} else if (is_lava(x, y)) {
|
||||
return fire_damage(obj, FALSE, x, y);
|
||||
return lava_damage(obj, x, y);
|
||||
} else if (is_pool(x, y)) {
|
||||
/* Reasonably bulky objects (arbitrary) splash when dropped.
|
||||
* If you're floating above the water even small things make
|
||||
|
||||
46
src/trap.c
46
src/trap.c
@@ -3287,6 +3287,7 @@ xchar x, y;
|
||||
{
|
||||
struct obj *obj, *nobj;
|
||||
int num = 0;
|
||||
|
||||
for (obj = chain; obj; obj = nobj) {
|
||||
nobj = here ? obj->nexthere : obj->nobj;
|
||||
if (fire_damage(obj, force, x, y))
|
||||
@@ -3298,6 +3299,51 @@ xchar x, y;
|
||||
return num;
|
||||
}
|
||||
|
||||
/* obj has been thrown or dropped into lava; damage is worse than mere fire */
|
||||
boolean
|
||||
lava_damage(obj, x, y)
|
||||
struct obj *obj;
|
||||
xchar x, y;
|
||||
{
|
||||
int otyp = obj->otyp, ocls = obj->oclass;
|
||||
|
||||
/* the Amulet, invocation items, and Rider corpses are never destroyed
|
||||
(let Book of the Dead fall through to fire_damage() to get feedback) */
|
||||
if (obj_resists(obj, 0, 0) && otyp != SPE_BOOK_OF_THE_DEAD)
|
||||
return FALSE;
|
||||
/* destroy liquid (venom), wax, veggy, flesh, paper (except for scrolls
|
||||
and books--let fire damage deal with them), cloth, leather, wood, bone
|
||||
unless it's inherently or explicitly fireproof or contains something;
|
||||
note: potions are glass so fall through to fire_damage() and boil */
|
||||
if (objects[otyp].oc_material < DRAGON_HIDE
|
||||
&& ocls != SCROLL_CLASS && ocls != SPBOOK_CLASS
|
||||
&& objects[otyp].oc_oprop != FIRE_RES
|
||||
&& otyp != WAN_FIRE && otyp != FIRE_HORN
|
||||
/* assumes oerodeproof isn't overloaded for some other purpose on
|
||||
non-eroding items */
|
||||
&& !obj->oerodeproof
|
||||
/* fire_damage() knows how to deal with containers and contents */
|
||||
&& !Has_contents(obj)) {
|
||||
if (cansee(x, y)) {
|
||||
/* this feedback is pretty clunky and can become very verbose
|
||||
when former contents of a burned container get here via
|
||||
flooreffects() */
|
||||
if (obj == thrownobj || obj == kickedobj)
|
||||
pline("%s %s up!", is_plural(obj) ? "They" : "It",
|
||||
otense(obj, "burn"));
|
||||
else
|
||||
You_see("%s hit lava and burn up!", doname(obj));
|
||||
}
|
||||
if (carried(obj)) { /* shouldn't happen */
|
||||
remove_worn_item(obj, TRUE);
|
||||
useupall(obj);
|
||||
} else
|
||||
delobj(obj);
|
||||
return TRUE;
|
||||
}
|
||||
return fire_damage(obj, TRUE, x, y);
|
||||
}
|
||||
|
||||
void
|
||||
acid_damage(obj)
|
||||
struct obj *obj;
|
||||
|
||||
Reference in New Issue
Block a user