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

@@ -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% */