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;