From 345ffcfaece818e14c10079c6d7cebc8a4cddbf6 Mon Sep 17 00:00:00 2001 From: cohrs Date: Wed, 26 Mar 2003 05:10:22 +0000 Subject: [PATCH] B01003 - blindfold vs dust vortex This started out as a change to address the strange sequence of messages if you remove a blindfold while engulfed in a dust vortex. That is addressed by a new function that can be called in such situations. Calls to this function were added in all the cases where the can_blnd() engulfing conditions end as a result of player action. There are some other cases that end ucreamed or usleep, but they happen between turns and shouldn't need extra handling. While I was at it, I noticed that a unicorn horn or prayer would cure blindness even while engulfed in a dust vortex. This is useless, because you immediately get blind again the next turn. So, I added checks to avoid doing this. Finally, it didn't make sense for eating a carrot to cure your blindness in these situations either, only for it to return immediately. --- doc/fixes35.0 | 4 ++++ include/extern.h | 1 + src/apply.c | 31 ++++++++++++++++++------------- src/do.c | 6 ++++-- src/do_wear.c | 6 ++++-- src/eat.c | 4 +++- src/mhitu.c | 18 ++++++++++++++++++ src/pray.c | 5 ++++- 8 files changed, 56 insertions(+), 19 deletions(-) diff --git a/doc/fixes35.0 b/doc/fixes35.0 index ed433419a..df20675cc 100644 --- a/doc/fixes35.0 +++ b/doc/fixes35.0 @@ -22,6 +22,10 @@ apply weapon skill to-hit bonus or penalty to bare-handed attacks only give monk's "cumbersome armor" message when the armor penalty causes an attack to miss identified touchstone can rub on gold like the data.base entry says +dust vortex-induced blindness should kick in immediately when blindfold + is removed or glop is wiped off +prayer/unicorn-horn won't fix blindness while still engulfed in a dust + vortex since it will just return immediately Platform- and/or Interface-Specific Fixes diff --git a/include/extern.h b/include/extern.h index dc083631f..8fb0b749f 100644 --- a/include/extern.h +++ b/include/extern.h @@ -960,6 +960,7 @@ E void FDECL(expels, (struct monst *,struct permonst *,BOOLEAN_P)); E struct attack *FDECL(getmattk, (struct permonst *,int,int *,struct attack *)); E int FDECL(mattacku, (struct monst *)); E int FDECL(magic_negation, (struct monst *)); +E boolean NDECL(gulp_blnd_check); E int FDECL(gazemu, (struct monst *,struct attack *)); E void FDECL(mdamageu, (struct monst *,int)); E int FDECL(could_seduce, (struct monst *,struct monst *,struct attack *)); diff --git a/src/apply.c b/src/apply.c index 410411edf..1219da2e1 100644 --- a/src/apply.c +++ b/src/apply.c @@ -134,21 +134,23 @@ use_towel(obj) } if (Glib) { - Glib = 0; - You("wipe off your %s.", makeplural(body_part(HAND))); - return 1; + Glib = 0; + You("wipe off your %s.", makeplural(body_part(HAND))); + return 1; } else if(u.ucreamed) { - Blinded -= u.ucreamed; - u.ucreamed = 0; + Blinded -= u.ucreamed; + u.ucreamed = 0; - if (!Blinded) { - pline("You've got the glop off."); - Blinded = 1; - make_blinded(0L,TRUE); - } else { - Your("%s feels clean now.", body_part(FACE)); + if (!Blinded) { + pline("You've got the glop off."); + if (!gulp_blnd_check()) { + Blinded = 1; + make_blinded(0L,TRUE); } - return 1; + } else { + Your("%s feels clean now.", body_part(FACE)); + } + return 1; } Your("%s and %s are already clean.", @@ -1476,7 +1478,10 @@ struct obj *obj; /* collect property troubles */ if (Sick) prop_trouble(SICK); - if (Blinded > (long)u.ucreamed) prop_trouble(BLINDED); + if (Blinded > (long)u.ucreamed && + !(u.uswallow && + attacktype_fordmg(u.ustuck->data, AT_ENGL, AD_BLND))) + prop_trouble(BLINDED); if (HHallucination) prop_trouble(HALLUC); if (Vomiting) prop_trouble(VOMITING); if (HConfusion) prop_trouble(CONFUSION); diff --git a/src/do.c b/src/do.c index e4d6fac5c..717efed21 100644 --- a/src/do.c +++ b/src/do.c @@ -1580,8 +1580,10 @@ wipeoff() if (!Blinded) { pline("You've got the glop off."); u.ucreamed = 0; - Blinded = 1; - make_blinded(0L,TRUE); + if (!gulp_blnd_check()) { + Blinded = 1; + make_blinded(0L,TRUE); + } return(0); } else if (!u.ucreamed) { Your("%s feels clean now.", body_part(FACE)); diff --git a/src/do_wear.c b/src/do_wear.c index 5caca22d1..cad425b1e 100644 --- a/src/do_wear.c +++ b/src/do_wear.c @@ -912,8 +912,10 @@ register struct obj *otmp; if (Punished) set_bc(0); } } else if (was_blind) { - changed = TRUE; /* !Blind */ - You("can see again."); + if (!gulp_blnd_check()) { + changed = TRUE; /* !Blind */ + You("can see again."); + } } if (changed) { /* blindness has just been toggled */ diff --git a/src/eat.c b/src/eat.c index df14e1d65..f7ed266c7 100644 --- a/src/eat.c +++ b/src/eat.c @@ -1638,7 +1638,9 @@ register struct obj *otmp; you_unwere(TRUE); break; case CARROT: - make_blinded((long)u.ucreamed,TRUE); + if (!u.uswallow || + !attacktype_fordmg(u.ustuck->data, AT_ENGL, AD_BLND)) + make_blinded((long)u.ucreamed,TRUE); break; case FORTUNE_COOKIE: outrumor(bcsign(otmp), BY_COOKIE); diff --git a/src/mhitu.c b/src/mhitu.c index 54b83e128..f446da92a 100644 --- a/src/mhitu.c +++ b/src/mhitu.c @@ -1588,6 +1588,24 @@ dopois: #endif /* OVL1 */ #ifdef OVLB +/* An interface for use when taking a blindfold off, for example, + * to see if an engulfing attack should immediately take affect, like + * a passive attack. TRUE if engulfing blindness occurred */ +boolean +gulp_blnd_check() +{ + struct attack *mattk; + + if (!Blinded && u.uswallow && + (mattk = attacktype_fordmg(u.ustuck->data, AT_ENGL, AD_BLND)) && + can_blnd(u.ustuck, &youmonst, mattk->aatyp, (struct obj*)0)) { + ++u.uswldtim; /* compensate for gulpmu change */ + (void) gulpmu(u.ustuck, mattk); + return TRUE; + } + return FALSE; +} + STATIC_OVL int gulpmu(mtmp, mattk) /* monster swallows you, or damage if u.uswallow */ register struct monst *mtmp; diff --git a/src/pray.c b/src/pray.c index 5915a890c..084f6d702 100644 --- a/src/pray.c +++ b/src/pray.c @@ -187,7 +187,10 @@ in_trouble() } #endif - if (Blinded > 1 && haseyes(youmonst.data)) return(TROUBLE_BLIND); + if (Blinded > 1 && haseyes(youmonst.data) && + (!u.uswallow || + !attacktype_fordmg(u.ustuck->data, AT_ENGL, AD_BLND))) + return(TROUBLE_BLIND); for(i=0; i