spell of protection

Another item from the "A few bugs" mail.  Casting spell of protection
when previous casting(s) hadn't timed out yet miscalculated the new AC
boost.  At low levels--when this spell probably gets its most use--the
bug wasn't noticeable.  (At high levels when someone might cast it a
whole bunch of times in succession, the effect could be noticed but
was probably just assumed to be working as intended.  Its behavior is
somewhat convoluted.)
This commit is contained in:
PatR
2015-10-08 02:19:58 -07:00
parent b2dd4bb410
commit bd3244835e
2 changed files with 28 additions and 23 deletions

View File

@@ -924,6 +924,8 @@ you shouldn't see Sting glow light blue if you're blind
when jumping, bumping into something is noisy
flesh golems hit by electricity healed by wrong amount
fleeing monsters couldn't use stairs that lead to different dungeon branch
casting spell of protection when previous casting(s) hadn't time out yet
miscalculated the new AC increment
Platform- and/or Interface-Specific Fixes

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 spell.c $NHDT-Date: 1434421353 2015/06/16 02:22:33 $ $NHDT-Branch: master $:$NHDT-Revision: 1.63 $ */
/* NetHack 3.6 spell.c $NHDT-Date: 1444295991 2015/10/08 09:19:51 $ $NHDT-Branch: master $:$NHDT-Revision: 1.64 $ */
/* Copyright (c) M. Stephenson 1988 */
/* NetHack may be freely redistributed. See license for details. */
@@ -720,10 +720,10 @@ int booktype;
STATIC_OVL void
cast_protection()
{
int loglev = 0;
int l = u.ulevel;
int natac = u.uac - u.uspellprot;
int gain;
int l = u.ulevel, loglev = 0,
gain, natac = u.uac + u.uspellprot;
/* note: u.uspellprot is subtracted when find_ac() factors it into u.uac,
so adding here factors it back out (3.4.3,3.5 had this backwards) */
/* loglev=log2(u.ulevel)+1 (1..5) */
while (l) {
@@ -752,7 +752,8 @@ cast_protection()
* 16-30 0 0, 5, 9, 11, 13, 14, 15
* 16-30 -10 0, 5, 8, 9, 10
*/
gain = loglev - (int) u.uspellprot / (4 - min(3, (10 - natac) / 10));
natac = (10 - natac) / 10; /* convert to positive and scale down */
gain = loglev - (int) u.uspellprot / (4 - min(3, natac));
if (gain > 0) {
if (!Blind) {
@@ -763,28 +764,30 @@ cast_protection()
pline_The("%s haze around you becomes more dense.", hgolden);
} else {
rmtyp = levl[u.ux][u.uy].typ;
atmosphere =
u.uswallow
? ((u.ustuck->data == &mons[PM_FOG_CLOUD])
? "mist"
: is_whirly(u.ustuck->data)
? "maelstrom"
: is_animal(u.ustuck->data) ? "maw"
: "ooze")
: u.uinwater ? "water" : (rmtyp == CLOUD)
? "cloud"
: IS_TREE(rmtyp)
? "vegitation"
: IS_STWALL(rmtyp)
? "stone"
: "air";
atmosphere = u.uswallow
? ((u.ustuck->data == &mons[PM_FOG_CLOUD])
? "mist"
: is_whirly(u.ustuck->data)
? "maelstrom"
: is_animal(u.ustuck->data)
? "maw"
: "ooze")
: (u.uinwater
? "water"
: (rmtyp == CLOUD)
? "cloud"
: IS_TREE(rmtyp)
? "vegitation"
: IS_STWALL(rmtyp)
? "stone"
: "air");
pline_The("%s around you begins to shimmer with %s haze.",
atmosphere, an(hgolden));
}
}
u.uspellprot += gain;
u.uspmtime =
P_SKILL(spell_skilltype(SPE_PROTECTION)) == P_EXPERT ? 20 : 10;
u.uspmtime = (P_SKILL(spell_skilltype(SPE_PROTECTION)) == P_EXPERT)
? 20 : 10;
if (!u.usptime)
u.usptime = u.uspmtime;
find_ac();