From 13c40d85e7bb8aa9450e933ea9ac2c205d3b2e29 Mon Sep 17 00:00:00 2001 From: PatR Date: Tue, 15 Mar 2016 01:00:36 -0700 Subject: [PATCH] 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. --- doc/fixes36.1 | 3 +++ src/eat.c | 7 ++++++- src/mhitu.c | 11 ++++++++--- src/potion.c | 6 +++++- src/pray.c | 9 ++++++++- src/sit.c | 1 + src/spell.c | 4 ++-- 7 files changed, 33 insertions(+), 8 deletions(-) diff --git a/doc/fixes36.1 b/doc/fixes36.1 index 68dacfdab..d990e736c 100644 --- a/doc/fixes36.1 +++ b/doc/fixes36.1 @@ -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 diff --git a/src/eat.c b/src/eat.c index 269fcaf28..4c69cf147 100644 --- a/src/eat.c +++ b/src/eat.c @@ -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: diff --git a/src/mhitu.c b/src/mhitu.c index f7f0afde2..9f3d70b14 100644 --- a/src/mhitu.c +++ b/src/mhitu.c @@ -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; diff --git a/src/potion.c b/src/potion.c index 53de9e8d9..568c48d99 100644 --- a/src/potion.c +++ b/src/potion.c @@ -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); diff --git a/src/pray.c b/src/pray.c index 4c2df62a6..604e0663f 100644 --- a/src/pray.c +++ b/src/pray.c @@ -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; diff --git a/src/sit.c b/src/sit.c index b91da1581..b39df58ea 100644 --- a/src/sit.c +++ b/src/sit.c @@ -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(); diff --git a/src/spell.c b/src/spell.c index 6110a8472..a8adba34c 100644 --- a/src/spell.c +++ b/src/spell.c @@ -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% */ -- 2.50.1