Fire/Frost Brand vs rusting

Implement the suggestion that Fire Brand avoids damage from rust traps
by boiling away the water.  Rather than making this be trap-specific, it
applies to all types of erosion which go through erode_obj().  That includes
hitting rust monsters but not dipping into potions or fountains, nor falling
into moats.  And it doesn't provide 100% protection, just a high chance of
avoiding rust damage.  Also, Frost Brand gets similar protection by freezing.

     The message handling needed some rewriting for the branch version.
That compiles ok but hasn't been tested.  It would have been simpler just to
move Yobjnam2() over even if nothing else was changed to use it yet....
This commit is contained in:
nethack.rankin
2005-04-19 04:15:51 +00:00
parent a85d3bf01c
commit f4a3b20afe
6 changed files with 47 additions and 50 deletions

View File

@@ -113,7 +113,7 @@ armor which auto-curses when worn by hero should do same if worn by monster
limit how high accuracy, damage, or protection can become via eating rings
when blinded hero detects a trap by touch, make sure it shows up on the map
confused remove curse will cause loss of knowledge of items' curse/bless state
With astral vision, the ";" command should only display "normal vision"
with astral vision, the ";" command should only display "normal vision"
for things that could be seen without astral vision
@@ -135,6 +135,7 @@ when adding an item to inventory, try to stack it with the quiver slot
#adjust can be used to split an inventory stack
cockatrice meat has a distinct flavor to some
wish request for "<something> armor" will match item named "<something> mail"
Fire Brand and Frost Brand have a chance to avoid taking rust damage
Platform- and/or Interface-Specific New Features

View File

@@ -60,6 +60,7 @@ E const char *FDECL(artifact_name, (const char *,short *));
E boolean FDECL(exist_artifact, (int,const char *));
E void FDECL(artifact_exists, (struct obj *,const char *,BOOLEAN_P));
E int NDECL(nartifact_exist);
E boolean FDECL(arti_immune, (struct obj *,int));
E boolean FDECL(spec_ability, (struct obj *,unsigned long));
E boolean FDECL(confers_luck, (struct obj *));
E boolean FDECL(arti_reflects, (struct obj *));

View File

@@ -1,4 +1,4 @@
/* SCCS Id: @(#)artifact.c 3.5 2003/08/11 */
/* SCCS Id: @(#)artifact.c 3.5 2005/04/15 */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -545,6 +545,22 @@ touch_artifact(obj,mon)
return 1;
}
/* decide whether an artifact itself is vulnerable to a particular type
of erosion damage, independent of the properties of its bearer */
boolean
arti_immune(obj, dtyp)
struct obj *obj;
int dtyp;
{
register const struct artifact *weap = get_artifact(obj);
if (!weap) return FALSE;
if (dtyp == AD_PHYS) return FALSE; /* nothing is immune to phys dmg */
return (weap->attk.adtyp == dtyp ||
weap->defn.adtyp == dtyp ||
weap->cary.adtyp == dtyp);
}
/* decide whether an artifact's special attacks apply against mtmp */
STATIC_OVL int
spec_applies(weap, mtmp)
@@ -1551,5 +1567,5 @@ int orc_count;
pline("%s stops glowing.", bare_artifactname(uwep));
}
}
/*artifact.c*/
/*artifact.c*/

View File

@@ -1,4 +1,4 @@
/* SCCS Id: @(#)mhitm.c 3.5 2004/10/20 */
/* SCCS Id: @(#)mhitm.c 3.5 2005/04/15 */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -1308,33 +1308,13 @@ register struct obj *obj;
boolean is_acid;
if (!magr || !mdef || !obj) return; /* just in case */
if (dmgtype(mdef->data, AD_CORR))
is_acid = TRUE;
else if (dmgtype(mdef->data, AD_RUST))
is_acid = FALSE;
else
return;
if (!mdef->mcan &&
(is_acid ? is_corrodeable(obj) : is_rustprone(obj)) &&
(is_acid ? obj->oeroded2 : obj->oeroded) < MAX_ERODE) {
if (obj->greased || obj->oerodeproof || (obj->blessed && rn2(3))) {
if (cansee(mdef->mx, mdef->my) && flags.verbose)
pline("%s weapon is not affected.",
s_suffix(Monnam(magr)));
if (obj->greased && !rn2(2)) obj->greased = 0;
} else {
if (cansee(mdef->mx, mdef->my)) {
pline("%s%s!",
Yobjnam2(obj, (is_acid ? "corrode" : "rust")),
(is_acid ? obj->oeroded2 : obj->oeroded)
? " further" : "");
}
if (is_acid) obj->oeroded2++;
else obj->oeroded++;
}
}
(void) erode_obj(obj, is_acid, FALSE, FALSE);
}
STATIC_OVL void

View File

@@ -1,4 +1,4 @@
/* SCCS Id: @(#)mhitu.c 3.5 2005/02/09 */
/* SCCS Id: @(#)mhitu.c 3.5 2005/04/15 */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -2077,7 +2077,6 @@ urustm(mon, obj)
register struct monst *mon;
register struct obj *obj;
{
boolean vis;
boolean is_acid;
if (!mon || !obj) return; /* just in case */
@@ -2087,26 +2086,7 @@ register struct obj *obj;
is_acid = FALSE;
else
return;
vis = cansee(mon->mx, mon->my);
if ((is_acid ? is_corrodeable(obj) : is_rustprone(obj)) &&
(is_acid ? obj->oeroded2 : obj->oeroded) < MAX_ERODE) {
if (obj->greased || obj->oerodeproof || (obj->blessed && rn2(3))) {
if (vis)
pline("Somehow, %s weapon is not affected.",
s_suffix(mon_nam(mon)));
if (obj->greased && !rn2(2)) obj->greased = 0;
} else {
if (vis)
pline("%s%s!",
Yobjnam2(obj, (is_acid ? "corrode" : "rust")),
(is_acid ? obj->oeroded2 : obj->oeroded)
? " further" : "");
if (is_acid) obj->oeroded2++;
else obj->oeroded++;
}
}
(void) erode_obj(obj, is_acid, FALSE, FALSE);
}
int

View File

@@ -1,4 +1,4 @@
/* SCCS Id: @(#)wield.c 3.5 2005/03/28 */
/* SCCS Id: @(#)wield.c 3.5 2005/04/15 */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -608,8 +608,7 @@ boolean for_dip;
{
int erosion;
struct monst *victim;
boolean vismon;
boolean visobj;
boolean vismon, visobj, chill;
boolean ret = FALSE;
if (!target)
@@ -639,6 +638,26 @@ boolean for_dip;
target->spe = 0;
ret = TRUE;
}
} else if (target->oartifact &&
/* (no artifacts currently meet either of these criteria) */
arti_immune(target, acid_dmg ? AD_ACID : AD_RUST)) {
if (flags.verbose) {
if (victim == &youmonst)
pline("%s.", Yobjnam2(target, "sizzle"));
}
/* no damage to object */
} else if (target->oartifact && !acid_dmg &&
/* cold and fire provide partial protection against rust */
((chill = arti_immune(target, AD_COLD)) != 0 ||
arti_immune(target, AD_FIRE)) &&
/* once rusted, the chance for further rusting goes up */
rn2(2 * (MAX_ERODE + 1 - erosion))) {
if (flags.verbose && target->oclass == WEAPON_CLASS) {
if (victim == &youmonst || vismon || visobj)
pline("%s some water.",
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)) {