diff --git a/src/do.c b/src/do.c index 93b08b5fd..841cc0592 100644 --- a/src/do.c +++ b/src/do.c @@ -756,7 +756,9 @@ dodown() 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) { @@ -771,10 +773,16 @@ dodown() } } } - 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. diff --git a/src/trap.c b/src/trap.c index 0982cb7de..d3d2334ba 100644 --- a/src/trap.c +++ b/src/trap.c @@ -2669,7 +2669,13 @@ long hmask, emask; /* might cancel timeout */ 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 */