fix #H4275 - blinded, stunned, confused timers

Blindness due to face covered by pie was ignored for several cases
of magically curing blindness--cleaning the face seems better than
adjusting timeout to account for u.ucreamed for those cases.  A few
instances of taking stun or confusion damage overrode existing stun
or confusion rather than increasing it.  Plus a copy/paste mistake
for dual stun+confusion when casting an expired spell.

There was also a suggestion that vomiting when already nauseated
should decrement the timer instead of increasing it.  But there is a
negative effect for as long as it's in effect, so I left that as is.
This commit is contained in:
PatR
2016-03-15 01:00:36 -07:00
parent 77fe8db320
commit 13c40d85e7
7 changed files with 33 additions and 8 deletions

View File

@@ -185,6 +185,9 @@ wand/spell/breath zaps that reached the edge of the level on the Plane of Air
stop amulets and other items which aren't affected by erosion damage from
being subjected to erosion damage
grammar bit: polyself w/ gender change yielded "you turn into a Elvenking"
some blindness cures ignored u.ucreamed
some instances of stun or confusion timers were being overridden rather than
incremented when new stun or confusion damage was suffered
Platform- and/or Interface-Specific Fixes

View File

@@ -1502,7 +1502,9 @@ struct obj *obj;
make_confused(HConfusion + d(2, 4), FALSE);
} else if (!rn2(4) && !Blind) {
pline("Everything suddenly goes dark.");
make_blinded((long) d(2, 10), FALSE);
/* hero is not Blind, but Blinded timer might be nonzero if
blindness is being overridden by the Eyes of the Overworld */
make_blinded((Blinded & TIMEOUT) + (long) d(2, 10), FALSE);
if (!Blind)
Your1(vision_clears);
} else if (!rn2(3)) {
@@ -1785,6 +1787,9 @@ struct obj *otmp;
#endif
} else if (otmp->otyp == EGG && stale_egg(otmp)) {
pline("Ugh. Rotten egg."); /* perhaps others like it */
/* increasing existing nausea means that it will take longer
before eventual vomit, but also means that constitution
will be abused more times before illness completes */
make_vomiting((Vomiting & TIMEOUT) + (long) d(10, 4), TRUE);
} else {
give_feedback:

View File

@@ -2147,10 +2147,15 @@ register struct attack *mattk;
/* not blind at this point implies you're wearing
the Eyes of the Overworld; make them block this
particular stun attack too */
if (!Blind)
if (!Blind) {
Your1(vision_clears);
else
make_stunned((long) d(1, 3), TRUE);
} else {
long oldstun = (HStun & TIMEOUT), newstun = (long) rnd(3);
/* we don't want to increment stun duration every time
or sighted hero will become incapacitated */
make_stunned(max(oldstun, newstun), TRUE);
}
}
}
break;

View File

@@ -1090,8 +1090,12 @@ register boolean curesick, cureblind;
u.uhp = (u.uhpmax += nxtra);
}
}
if (cureblind)
if (cureblind) {
/* 3.6.1: it's debatible whether healing magic should clean off
mundane 'dirt', but if it doesn't, blindness isn't cured */
u.ucreamed = 0;
make_blinded(0L, TRUE);
}
if (curesick) {
make_vomiting(0L, TRUE);
make_sick(0L, (char *) 0, TRUE, SICK_ALL);

View File

@@ -289,7 +289,7 @@ worst_cursed_item()
} else if (uright && uright->cursed) { /* right ring */
otmp = uright;
} else if (ublindf && ublindf->cursed) { /* eyewear */
otmp = ublindf; /* must be non-blinding lenses */
otmp = ublindf; /* must be non-blinding lenses */
/* if weapon wasn't handled above, do it now */
} else if (welded(uwep)) { /* weapon */
otmp = uwep;
@@ -1048,8 +1048,15 @@ aligntyp g_align;
ABASE(A_STR) = AMAX(A_STR);
if (u.uhunger < 900)
init_uhunger();
/* luck couldn't have been negative at start of prayer because
the prayer would have failed, but might have been decremented
due to a timed event (delayed death of peaceful monster hit
by hero-created stinking cloud) during the praying interval */
if (u.uluck < 0)
u.uluck = 0;
/* superfluous; if hero was blinded we'd be handling trouble
rather than issuing a pat-on-head */
u.ucreamed = 0;
make_blinded(0L, TRUE);
context.botl = 1;
break;

View File

@@ -184,6 +184,7 @@ dosit()
if (u.uhp >= (u.uhpmax - 5))
u.uhpmax += 4;
u.uhp = u.uhpmax;
u.ucreamed = 0;
make_blinded(0L, TRUE);
make_sick(0L, (char *) 0, FALSE, SICK_ALL);
heal_legs();

View File

@@ -866,8 +866,8 @@ int spell;
break;
case 7:
case 8:
make_stunned(old_conf + 2L * duration / 3L, FALSE); /* 20% */
make_confused(old_stun + duration / 3L, FALSE);
make_stunned(old_stun + 2L * duration / 3L, FALSE); /* 20% */
make_confused(old_conf + duration / 3L, FALSE);
break;
case 9:
make_stunned(old_stun + duration, FALSE); /* 10% */