weapon rustproofing status
From a bug report, hitting a rust monster with a fireproof--but not identified as fireproof--weapon caused the rknown bit to become set, identifying the item as fireproof. That would also happen for a monster's anything-proof weapon if it hit a rust monster, whether you could see it happen or not. The code involved is convoluted; I hope this fix is correct.
This commit is contained in:
@@ -307,6 +307,8 @@ non-unicorn horn healing magic which cures sickness now also cures vomiting
|
||||
vomiting/nauseated state is included in enlightenment feedback
|
||||
vomiting countdown actually triggered the final vomit code twice
|
||||
rats aren't capable of vomiting
|
||||
fireproof, non-rustable weapon would be revealed as fireproof by hitting a
|
||||
rust-causing target; ditto for fixed crysknife
|
||||
|
||||
|
||||
Platform- and/or Interface-Specific Fixes
|
||||
|
||||
23
src/wield.c
23
src/wield.c
@@ -1,4 +1,4 @@
|
||||
/* SCCS Id: @(#)wield.c 3.5 2006/07/14 */
|
||||
/* SCCS Id: @(#)wield.c 3.5 2007/02/07 */
|
||||
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
||||
/* NetHack may be freely redistributed. See license for details. */
|
||||
|
||||
@@ -622,7 +622,7 @@ boolean for_dip;
|
||||
{
|
||||
int erosion;
|
||||
struct monst *victim;
|
||||
boolean vismon, visobj, chill;
|
||||
boolean vismon, visobj, chill, erodible;
|
||||
boolean ret = FALSE;
|
||||
boolean already_affected = FALSE;
|
||||
|
||||
@@ -638,6 +638,7 @@ boolean for_dip;
|
||||
if (already_affected) ret = TRUE;
|
||||
}
|
||||
erosion = acid_dmg ? target->oeroded2 : target->oeroded;
|
||||
erodible = acid_dmg ? is_corrodeable(target) : is_rustprone(target);
|
||||
|
||||
if (target->greased) {
|
||||
grease_protect(target,(char *)0,victim);
|
||||
@@ -677,20 +678,24 @@ boolean for_dip;
|
||||
Yobjnam2(target, chill ? "freeze" : "boil"));
|
||||
}
|
||||
/* no damage to object */
|
||||
} else if (target->oerodeproof ||
|
||||
(acid_dmg ? !is_corrodeable(target) : !is_rustprone(target))) {
|
||||
if (flags.verbose || !(target->oerodeproof && target->rknown)) {
|
||||
if (((victim == &youmonst) || vismon) && !for_dip)
|
||||
} else if (target->oerodeproof || !erodible) {
|
||||
/* no message if dipping or not carried */
|
||||
if (for_dip) {
|
||||
/* assumes that for_dip implies player action */
|
||||
if (!Blind) target->rknown = 0;
|
||||
} else if (victim == &youmonst || vismon) {
|
||||
if (flags.verbose || (erodible && !target->rknown))
|
||||
pline("%s not %s.", Yobjnam2(target, "are"),
|
||||
already_affected ? "harmed" : "affected");
|
||||
/* no message if not carried or dipping */
|
||||
if (erodible) target->rknown = 1;
|
||||
}
|
||||
if (target->oerodeproof) target->rknown = !for_dip;
|
||||
} else if (erosion < MAX_ERODE) {
|
||||
if ((victim == &youmonst) || vismon || visobj)
|
||||
if (victim == &youmonst || vismon || visobj) {
|
||||
pline("%s%s!", Yobjnam2(target, acid_dmg ? "corrode" : "rust"),
|
||||
erosion+1 == MAX_ERODE ? " completely" :
|
||||
erosion ? " further" : "");
|
||||
target->rknown = 1; /* it's obviously not erode-proof */
|
||||
}
|
||||
if (acid_dmg)
|
||||
target->oeroded2++;
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user