From: nethack.rankin Date: Sat, 22 Oct 2011 23:26:17 +0000 (+0000) Subject: refine blocked levitation/flight (trunk only) X-Git-Tag: MOVE2GIT~157 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=282f8e8e70fb6fee65a2d8f5e1c1cca97a053104;p=nethack refine blocked levitation/flight (trunk only) Levitation side-effects get skipped if Levitation toggles while it is blocked, so BFlying (the reason Flying is blocked) could become stale in some situations. Enlightment feedback about latent flight capability was the only thing affected. --- diff --git a/include/extern.h b/include/extern.h index 20faeb00b..ed0cdb78b 100644 --- a/include/extern.h +++ b/include/extern.h @@ -1750,6 +1750,7 @@ E void NDECL(self_invis_message); /* ### polyself.c ### */ E void NDECL(set_uasmon); +E void NDECL(float_vs_flight); E void NDECL(change_sex); E void FDECL(polyself, (int)); E int FDECL(polymon, (int)); diff --git a/src/cmd.c b/src/cmd.c index 3feac20cf..c894bc30c 100644 --- a/src/cmd.c +++ b/src/cmd.c @@ -1775,16 +1775,13 @@ int final; long save_BFly = BFlying; BFlying = 0L; - if (Flying) { - Sprintf(buf, "%s%s%s", - (save_BFly & I_SPECIAL) ? - " if you weren't levitating" : "", - ((save_BFly & (FROMOUTSIDE|I_SPECIAL)) == - (FROMOUTSIDE|I_SPECIAL)) ? " and" : "", - (save_BFly & FROMOUTSIDE) ? - if_surroundings_permitted : (const char *)""); - enl_msg(You_, "would fly", "would have flown", buf, ""); - } + if (Flying) + enl_msg(You_, "would fly", "would have flown", + Levitation ? "if you weren't levitating" : + (save_BFly == FROMOUTSIDE) ? + if_surroundings_permitted : + /* both surroundings and [latent] levitation */ + " if circumstances permitted", ""); BFlying = save_BFly; } /* actively walking on water handled earlier as a status condition */ diff --git a/src/do_wear.c b/src/do_wear.c index 955567103..0607b0190 100644 --- a/src/do_wear.c +++ b/src/do_wear.c @@ -194,6 +194,8 @@ Boots_on(VOID_ARGS) makeknown(uarmf->otyp); float_up(); spoteffects(FALSE); + } else { + float_vs_flight(); /* maybe toggle (BFlying & I_SPECIAL) */ } break; default: impossible(unknown_type, c_boots, uarmf->otyp); @@ -245,6 +247,8 @@ Boots_off(VOID_ARGS) !context.takeoff.cancelled_don) { (void) float_down(0L, 0L); makeknown(otyp); + } else { + float_vs_flight(); /* maybe toggle (BFlying & I_SPECIAL) */ } break; case LOW_BOOTS: @@ -880,6 +884,8 @@ register struct obj *obj; float_up(); learnring(obj, TRUE); spoteffects(FALSE); /* for sinks */ + } else { + float_vs_flight(); /* maybe toggle (BFlying & I_SPECIAL) */ } break; case RIN_GAIN_STRENGTH: @@ -991,6 +997,8 @@ boolean gone; if (!BLevitation) { (void) float_down(0L, 0L); if (!Levitation) learnring(obj, TRUE); + } else { + float_vs_flight(); /* maybe toggle (BFlying & I_SPECIAL) */ } break; case RIN_GAIN_STRENGTH: diff --git a/src/hack.c b/src/hack.c index 65526c64a..ce3e2ae6b 100644 --- a/src/hack.c +++ b/src/hack.c @@ -543,6 +543,9 @@ dosinkfall() off_msg(obj); } HLevitation--; + /* probably moot; we're either still levitating or went + through float_down(), but make sure BFlying is up to date */ + float_vs_flight(); } #endif @@ -1665,9 +1668,7 @@ switch_terrain() BFlying |= FROMOUTSIDE; } else if (BFlying) { BFlying &= ~FROMOUTSIDE; - /* in case BFlying got set due to levitation which then went away - while blocked; there'd be no float_down() with reset of BFlying */ - if (!HLevitation && !ELevitation) BFlying &= ~I_SPECIAL; + float_vs_flight(); /* maybe toggle (BFlying & I_SPECIAL) */ /* [minor bug: we don't know whether this is beginning flight or resuming it; that could be tracked so that this message could be adjusted to "resume flying", but isn't worth the effort...] */ diff --git a/src/polyself.c b/src/polyself.c index 66b95b3a0..2090f1c9c 100644 --- a/src/polyself.c +++ b/src/polyself.c @@ -88,11 +88,8 @@ set_uasmon() PROPSET(PASSES_WALLS, passes_walls(mdat)); PROPSET(REGENERATION, regenerates(mdat)); PROPSET(REFLECTING, (mdat == &mons[PM_SILVER_DRAGON])); - /* levitation overrides flight */ - if (HLevitation || ELevitation) - BFlying |= I_SPECIAL; - else - BFlying &= ~I_SPECIAL; + + float_vs_flight(); /* maybe toggle (BFlying & I_SPECIAL) */ #undef PROPSET @@ -101,6 +98,18 @@ set_uasmon() #endif } +/* Levitation overrides Flying; set or clear BFlying|I_SPECIAL */ +void +float_vs_flight() +{ + /* floating overrides flight; normally float_up() and float_down() + handle this, but sometimes they're skipped */ + if (HLevitation || ELevitation) + BFlying |= I_SPECIAL; + else + BFlying &= ~I_SPECIAL; +} + /* for changing into form that's immune to strangulation */ STATIC_OVL void check_strangling(on) diff --git a/src/potion.c b/src/potion.c index 7a4413e75..804c46d41 100644 --- a/src/potion.c +++ b/src/potion.c @@ -934,6 +934,7 @@ peffects(otmp) } else incr_itimeout(&HLevitation, rn1(140,10)); if (Levitation) spoteffects(FALSE); /* for sinks */ + float_vs_flight(); break; case POT_GAIN_ENERGY: /* M. Stephenson */ { register int num;