diff --git a/doc/fixes36.1 b/doc/fixes36.1 index f8912ff97..8bd585e21 100644 --- a/doc/fixes36.1 +++ b/doc/fixes36.1 @@ -129,6 +129,9 @@ adjust pending movement points when polymorphing into a slower creature damage inflicted by burning glob of green slime gave wrong messages monsters fleeing up the upstairs on level 1 were supposed to escape the dungeon but ended up arriving on Plane of Earth +monster hitting fire-dealing monster with weapon triggered passive damage to + weapon every time, when hero doing so only had 1/6 chance per hit +hitting steam vortex with flammable weapon would damage the weapon with fire Platform- and/or Interface-Specific Fixes diff --git a/src/mhitm.c b/src/mhitm.c index f0eab761e..533527cca 100644 --- a/src/mhitm.c +++ b/src/mhitm.c @@ -1382,20 +1382,24 @@ rustm(mdef, obj) struct monst *mdef; struct obj *obj; { - int dmgtyp; + int dmgtyp = -1, chance = 1; if (!mdef || !obj) return; /* just in case */ - /* AD_ACID is handled in passivemm */ - if (dmgtype(mdef->data, AD_CORR)) + /* AD_ACID and AD_ENCH are handled in passivemm() and passiveum() */ + if (dmgtype(mdef->data, AD_CORR)) { dmgtyp = ERODE_CORRODE; - else if (dmgtype(mdef->data, AD_RUST)) + } else if (dmgtype(mdef->data, AD_RUST)) { dmgtyp = ERODE_RUST; - else if (dmgtype(mdef->data, AD_FIRE)) + } else if (dmgtype(mdef->data, AD_FIRE) + /* steam vortex: fire resist applies, fire damage doesn't */ + && mdef->data != &mons[PM_STEAM_VORTEX]) { dmgtyp = ERODE_BURN; - else - return; - (void) erode_obj(obj, NULL, dmgtyp, EF_GREASE | EF_VERBOSE); + chance = 6; + } + + if (dmgtyp >= 0 && !rn2(chance)) + (void) erode_obj(obj, (char *) 0, dmgtyp, EF_GREASE | EF_VERBOSE); } STATIC_OVL void diff --git a/src/trap.c b/src/trap.c index 10c42a639..83164b2d5 100644 --- a/src/trap.c +++ b/src/trap.c @@ -141,24 +141,22 @@ const char *ostr; int type; int ef_flags; { - static NEARDATA const char *const action[] = { "smoulder", "rust", "rot", - "corrode" }; - static NEARDATA const char *const msg[] = { "burnt", "rusted", "rotten", - "corroded" }; - boolean vulnerable = FALSE; - boolean is_primary = TRUE; - boolean check_grease = ef_flags & EF_GREASE; - boolean print = ef_flags & EF_VERBOSE; - int erosion; + static NEARDATA const char + *const action[] = { "smoulder", "rust", "rot", "corrode" }, + *const msg[] = { "burnt", "rusted", "rotten", "corroded" }, + *const bythe[] = { "heat", "oxidation", "decay", "corrosion" }; + boolean vulnerable = FALSE, is_primary = TRUE, + check_grease = (ef_flags & EF_GREASE) ? TRUE : FALSE, + print = (ef_flags & EF_VERBOSE) ? TRUE : FALSE, + uvictim, vismon, visobj; + int erosion, cost_type; struct monst *victim; - boolean vismon; - boolean visobj; - int cost_type; if (!otmp) return ER_NOTHING; victim = carried(otmp) ? &youmonst : mcarried(otmp) ? otmp->ocarry : NULL; + uvictim = (victim == &youmonst); vismon = victim && (victim != &youmonst) && canseemon(victim); /* Is bhitpos correct here? Ugh. */ visobj = !victim && cansee(bhitpos.x, bhitpos.y); @@ -192,35 +190,32 @@ int ef_flags; if (!ostr) ostr = cxname(otmp); + /* 'visobj' messages insert "the"; probably ought to switch to the() */ + if (visobj && !(uvictim || vismon) && !strncmpi(ostr, "the ", 4)) + ostr += 4; if (check_grease && otmp->greased) { grease_protect(otmp, ostr, victim); return ER_GREASED; } else if (!vulnerable || (otmp->oerodeproof && otmp->rknown)) { - if (print && flags.verbose) { - if (victim == &youmonst) - Your("%s %s not affected.", ostr, vtense(ostr, "are")); - else if (vismon) - pline("%s %s %s not affected.", s_suffix(Monnam(victim)), - ostr, vtense(ostr, "are")); - } + if (flags.verbose && print && (uvictim || vismon)) + pline("%s %s %s not affected by %s.", + uvictim ? "Your" : s_suffix(Monnam(victim)), + ostr, vtense(ostr, "are"), bythe[type]); return ER_NOTHING; } else if (otmp->oerodeproof || (otmp->blessed && !rnl(4))) { - if (flags.verbose && (print || otmp->oerodeproof)) { - if (victim == &youmonst) - pline("Somehow, your %s %s not affected.", ostr, - vtense(ostr, "are")); - else if (vismon) - pline("Somehow, %s %s %s not affected.", - s_suffix(mon_nam(victim)), ostr, vtense(ostr, "are")); - else if (visobj) - pline("Somehow, the %s %s not affected.", ostr, - vtense(ostr, "are")); - } + if (flags.verbose && (print || otmp->oerodeproof) + && (uvictim || vismon || visobj)) + pline("Somehow, %s %s %s not affected by the %s.", + uvictim ? "your" + : !vismon ? "the" /* visobj */ + : s_suffix(mon_nam(victim)), + ostr, vtense(ostr, "are"), bythe[type]); /* We assume here that if the object is protected because it * is blessed, it still shows some minor signs of wear, and * the hero can distinguish this from an object that is - * actually proof against damage. */ + * actually proof against damage. + */ if (otmp->oerodeproof) { otmp->rknown = TRUE; if (victim == &youmonst) @@ -233,13 +228,12 @@ int ef_flags; ? " completely" : erosion ? " further" : ""; - if (victim == &youmonst) - Your("%s %s%s!", ostr, vtense(ostr, action[type]), adverb); - else if (vismon) - pline("%s %s %s%s!", s_suffix(Monnam(victim)), ostr, - vtense(ostr, action[type]), adverb); - else if (visobj) - pline("The %s %s%s!", ostr, vtense(ostr, action[type]), adverb); + if (uvictim || vismon || visobj) + pline("%s %s %s%s!", + uvictim ? "Your" + : !vismon ? "The" /* visobj */ + : s_suffix(Monnam(victim)), + ostr, vtense(ostr, action[type]), adverb); if (ef_flags & EF_PAY) costly_alteration(otmp, cost_type); @@ -254,13 +248,12 @@ int ef_flags; return ER_DAMAGED; } else if (ef_flags & EF_DESTROY) { - if (victim == &youmonst) - Your("%s %s away!", ostr, vtense(ostr, action[type])); - else if (vismon) - pline("%s %s %s away!", s_suffix(Monnam(victim)), ostr, - vtense(ostr, action[type])); - else if (visobj) - pline("The %s %s away!", ostr, vtense(ostr, action[type])); + if (uvictim || vismon || visobj) + pline("%s %s %s away!", + uvictim ? "Your" + : !vismon ? "The" /* visobj */ + : s_suffix(Monnam(victim)), + ostr, vtense(ostr, action[type])); if (ef_flags & EF_PAY) costly_alteration(otmp, cost_type); @@ -270,15 +263,13 @@ int ef_flags; return ER_DESTROYED; } else { if (flags.verbose && print) { - if (victim == &youmonst) - Your("%s %s completely %s.", ostr, - vtense(ostr, Blind ? "feel" : "look"), msg[type]); - else if (vismon) - pline("%s %s %s completely %s.", s_suffix(Monnam(victim)), + if (uvictim) + Your("%s %s completely %s.", + ostr, vtense(ostr, Blind ? "feel" : "look"), msg[type]); + else if (vismon || visobj) + pline("%s %s %s completely %s.", + !vismon ? "The" : s_suffix(Monnam(victim)), ostr, vtense(ostr, "look"), msg[type]); - else if (visobj) - pline("The %s %s completely %s.", ostr, vtense(ostr, "look"), - msg[type]); } return ER_NOTHING; } diff --git a/src/uhitm.c b/src/uhitm.c index 24c6fd870..ed22d5d82 100644 --- a/src/uhitm.c +++ b/src/uhitm.c @@ -2533,7 +2533,9 @@ struct attack *mattk; /* null means we find one internally */ switch (mattk->adtyp) { case AD_FIRE: - if (!rn2(6) && !mon->mcan) { + if (!rn2(6) && !mon->mcan + /* steam vortex: fire resist applies, fire damage doesn't */ + && mon->data != &mons[PM_STEAM_VORTEX]) { (void) erode_obj(obj, NULL, ERODE_BURN, EF_NONE); } break;