return 0;
}
#endif
- if (Levitation) {
+ /* Levitation might be blocked, but player can still use '>' to
+ turn off controlled levitaiton */
+ if (HLevitation || ELevitation) {
if ((HLevitation & I_SPECIAL) || (ELevitation & W_ARTI)) {
/* end controlled levitation */
if (ELevitation & W_ARTI) {
}
}
}
- if (float_down(I_SPECIAL|TIMEOUT, W_ARTI))
- return (1); /* came down, so moved */
+ if (float_down(I_SPECIAL|TIMEOUT, W_ARTI)) {
+ return 1; /* came down, so moved */
+ } else if (!HLevitation && !ELevitation) {
+ Your("latent levitation ceases.");
+ return 1; /* did something, effectively moved */
+ }
}
- if (Blind) {
+ if (BLevitation) {
+ ; /* weren't actually floating after all */
+ } else if (Blind) {
/* Avoid alerting player to an unknown stair or ladder.
* Changes the message for a covered, known staircase
* too; staircase knowledge is not stored anywhere.
HLevitation &= ~hmask;
ELevitation &= ~emask;
- if(Levitation) return(0); /* maybe another ring/potion/boots */
+ if (Levitation) return 0; /* maybe another ring/potion/boots */
+ if (BLevitation) {
+ /* Levitation is blocked, so hero is not actually floating
+ hence shouldn't have float_down effects and feedback */
+ float_vs_flight(); /* before nomul() rather than after */
+ return 0;
+ }
nomul(0); /* stop running or resting */
if (BFlying) {
/* controlled flight no longer overridden by levitation */