wielded candles vs rust (trunk only)

From a bug report: [ slashem-Bugs-1206099 ] Torches are not extinguished with rust traps).
A rust trap that hits the torso candles causes all lit objects being carried
to be extinguished, but one which hit the weapon arm didn't have same affect
on a wielded light.  This fix causes wielded candles or lamps (not Sunsword)
to go out if affected by any rust, such as hitting a rust monster with one,
rather than use his patch that just handled the trap case.  It also excludes
wielded lights from the existing torso splash since having them be hit by
both instances is too obviously buggy.

     I think brass lanterns ought to be exempt from being extinguished by
water (at least splashing which is less drastic than total submersion) since
there are references to them operating by batteries rather than fire, but I
didn't want to track all the places which would be affected.
This commit is contained in:
nethack.rankin
2006-06-17 04:43:44 +00:00
parent d8528f7e2f
commit e79a41ccb6
3 changed files with 27 additions and 20 deletions

View File

@@ -148,6 +148,7 @@ limit recursive calls to spoteffects (poly'd hero fell into water, reverted
ensure that the punishment ball and chain make it into the save file after being
temporarily orphaned from the normal chains in the swallowing code
charge for thrown wand that shatters into a thousand pieces in a shop
wielded light source susceptible to water gets extinguished when weapon rusts
Platform- and/or Interface-Specific Fixes

View File

@@ -1,4 +1,4 @@
/* SCCS Id: @(#)trap.c 3.5 2006/05/08 */
/* SCCS Id: @(#)trap.c 3.5 2006/06/16 */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -892,8 +892,10 @@ glovecheck: (void) rust_dmg(uarmg, "gauntlets", 1, TRUE, &youmonst);
goto glovecheck;
default:
pline("%s you!", A_gush_of_water_hits);
for (otmp=invent; otmp; otmp = otmp->nobj)
(void) snuff_lit(otmp);
for (otmp = invent; otmp; otmp = otmp->nobj)
if (otmp->lamplit && otmp != uwep &&
(otmp != uswapwep || !u.twoweap))
(void) snuff_lit(otmp);
if (uarmc)
(void) rust_dmg(uarmc, cloak_simple_name(uarmc),
1, TRUE, &youmonst);
@@ -1980,24 +1982,22 @@ glovecheck: target = which_armor(mtmp, W_ARMG);
if (in_sight)
pline("%s %s!", A_gush_of_water_hits,
mon_nam(mtmp));
for (otmp=mtmp->minvent; otmp; otmp = otmp->nobj)
(void) snuff_lit(otmp);
target = which_armor(mtmp, W_ARMC);
if (target)
(void) rust_dmg(target, cloak_simple_name(target),
1, TRUE, mtmp);
else {
target = which_armor(mtmp, W_ARM);
if (target)
(void) rust_dmg(target, "armor", 1, TRUE, mtmp);
for (otmp = mtmp->minvent; otmp; otmp = otmp->nobj)
if (otmp->lamplit &&
(otmp->owornmask & (W_WEP|W_SWAPWEP)) == 0)
(void) snuff_lit(otmp);
if ((target = which_armor(mtmp, W_ARMC)) != 0)
(void) rust_dmg(target,
cloak_simple_name(target),
1, TRUE, mtmp);
else if ((target = which_armor(mtmp, W_ARM)) != 0)
(void) rust_dmg(target, "armor", 1, TRUE, mtmp);
#ifdef TOURIST
else {
target = which_armor(mtmp, W_ARMU);
(void) rust_dmg(target, "shirt", 1, TRUE, mtmp);
}
else if ((target = which_armor(mtmp, W_ARMU)) != 0)
(void) rust_dmg(target, "shirt", 1, TRUE, mtmp);
#endif
}
}
if (mptr == &mons[PM_IRON_GOLEM]) {
if (in_sight)
pline("%s falls to pieces!", Monnam(mtmp));

View File

@@ -1,4 +1,4 @@
/* SCCS Id: @(#)wield.c 3.5 2006/04/14 */
/* SCCS Id: @(#)wield.c 3.5 2006/06/16 */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -619,6 +619,7 @@ boolean for_dip;
struct monst *victim;
boolean vismon, visobj, chill;
boolean ret = FALSE;
boolean already_affected = FALSE;
if (!target)
return FALSE;
@@ -627,6 +628,10 @@ boolean for_dip;
vismon = victim && (victim != &youmonst) && canseemon(victim);
visobj = !victim && cansee(bhitpos.x, bhitpos.y); /* assume thrown */
if (!acid_dmg && target->lamplit) {
already_affected = snuff_lit(target);
if (already_affected) ret = TRUE;
}
erosion = acid_dmg ? target->oeroded2 : target->oeroded;
if (target->greased) {
@@ -671,7 +676,8 @@ boolean for_dip;
(acid_dmg ? !is_corrodeable(target) : !is_rustprone(target))) {
if (flags.verbose || !(target->oerodeproof && target->rknown)) {
if (((victim == &youmonst) || vismon) && !for_dip)
pline("%s not affected.", Yobjnam2(target, "are"));
pline("%s not %s.", Yobjnam2(target, "are"),
already_affected ? "harmed" : "affected");
/* no message if not carried or dipping */
}
if (target->oerodeproof) target->rknown = !for_dip;