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.
This commit is contained in:
cohrs
2003-03-26 05:10:22 +00:00
parent 39befe07fd
commit 345ffcfaec
8 changed files with 56 additions and 19 deletions

View File

@@ -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 only give monk's "cumbersome armor" message when the armor penalty causes
an attack to miss an attack to miss
identified touchstone can rub on gold like the data.base entry says 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 Platform- and/or Interface-Specific Fixes

View File

@@ -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 struct attack *FDECL(getmattk, (struct permonst *,int,int *,struct attack *));
E int FDECL(mattacku, (struct monst *)); E int FDECL(mattacku, (struct monst *));
E int FDECL(magic_negation, (struct monst *)); E int FDECL(magic_negation, (struct monst *));
E boolean NDECL(gulp_blnd_check);
E int FDECL(gazemu, (struct monst *,struct attack *)); E int FDECL(gazemu, (struct monst *,struct attack *));
E void FDECL(mdamageu, (struct monst *,int)); E void FDECL(mdamageu, (struct monst *,int));
E int FDECL(could_seduce, (struct monst *,struct monst *,struct attack *)); E int FDECL(could_seduce, (struct monst *,struct monst *,struct attack *));

View File

@@ -134,21 +134,23 @@ use_towel(obj)
} }
if (Glib) { if (Glib) {
Glib = 0; Glib = 0;
You("wipe off your %s.", makeplural(body_part(HAND))); You("wipe off your %s.", makeplural(body_part(HAND)));
return 1; return 1;
} else if(u.ucreamed) { } else if(u.ucreamed) {
Blinded -= u.ucreamed; Blinded -= u.ucreamed;
u.ucreamed = 0; u.ucreamed = 0;
if (!Blinded) { if (!Blinded) {
pline("You've got the glop off."); pline("You've got the glop off.");
Blinded = 1; if (!gulp_blnd_check()) {
make_blinded(0L,TRUE); Blinded = 1;
} else { make_blinded(0L,TRUE);
Your("%s feels clean now.", body_part(FACE));
} }
return 1; } else {
Your("%s feels clean now.", body_part(FACE));
}
return 1;
} }
Your("%s and %s are already clean.", Your("%s and %s are already clean.",
@@ -1476,7 +1478,10 @@ struct obj *obj;
/* collect property troubles */ /* collect property troubles */
if (Sick) prop_trouble(SICK); 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 (HHallucination) prop_trouble(HALLUC);
if (Vomiting) prop_trouble(VOMITING); if (Vomiting) prop_trouble(VOMITING);
if (HConfusion) prop_trouble(CONFUSION); if (HConfusion) prop_trouble(CONFUSION);

View File

@@ -1580,8 +1580,10 @@ wipeoff()
if (!Blinded) { if (!Blinded) {
pline("You've got the glop off."); pline("You've got the glop off.");
u.ucreamed = 0; u.ucreamed = 0;
Blinded = 1; if (!gulp_blnd_check()) {
make_blinded(0L,TRUE); Blinded = 1;
make_blinded(0L,TRUE);
}
return(0); return(0);
} else if (!u.ucreamed) { } else if (!u.ucreamed) {
Your("%s feels clean now.", body_part(FACE)); Your("%s feels clean now.", body_part(FACE));

View File

@@ -912,8 +912,10 @@ register struct obj *otmp;
if (Punished) set_bc(0); if (Punished) set_bc(0);
} }
} else if (was_blind) { } else if (was_blind) {
changed = TRUE; /* !Blind */ if (!gulp_blnd_check()) {
You("can see again."); changed = TRUE; /* !Blind */
You("can see again.");
}
} }
if (changed) { if (changed) {
/* blindness has just been toggled */ /* blindness has just been toggled */

View File

@@ -1638,7 +1638,9 @@ register struct obj *otmp;
you_unwere(TRUE); you_unwere(TRUE);
break; break;
case CARROT: 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; break;
case FORTUNE_COOKIE: case FORTUNE_COOKIE:
outrumor(bcsign(otmp), BY_COOKIE); outrumor(bcsign(otmp), BY_COOKIE);

View File

@@ -1588,6 +1588,24 @@ dopois:
#endif /* OVL1 */ #endif /* OVL1 */
#ifdef OVLB #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 STATIC_OVL int
gulpmu(mtmp, mattk) /* monster swallows you, or damage if u.uswallow */ gulpmu(mtmp, mattk) /* monster swallows you, or damage if u.uswallow */
register struct monst *mtmp; register struct monst *mtmp;

View File

@@ -187,7 +187,10 @@ in_trouble()
} }
#endif #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<A_MAX; i++) for(i=0; i<A_MAX; i++)
if(ABASE(i) < AMAX(i)) return(TROUBLE_POISONED); if(ABASE(i) < AMAX(i)) return(TROUBLE_POISONED);
if(Wounded_legs if(Wounded_legs