Yes, but how does that affect what I proposed? There, after the level teleport from quest goal to quest start level, no monster actions were used until after reading the Book of the Dead. I don't see anything in the later part that is stopped by this limitation either.
Oh, I see; you're trying to get a monster on the Quest portal level to push the player without taking an action. That might work; I'll have to look into how schedule_goto works if it triggers twice in the same action, because I don't think that's an intended case in the code.
I suspect that if this works at all, there's a simpler way than the way you described, but that key idea is one that I haven't really looked into yet, so it might yet lead to an action saving on the way down (which is when we really want it).
EDIT: As far as I can tell, deferred_goto is called once at the end of the monster turn, then not called again before the player acts (unless the player is helpless, in which case it's called at the end of helplessness). That in itself is not a problem: we could trigger the level change using a zero time action. However, the specific case of getting a monster to push us off the portal seems to be missing a spoteffects() call, meaning that the game wouldn't notice if we landed on a trap, water, etc. At least spoteffects() is sufficiently widely used that there might be some way to do it indirectly. (It's actually done indirectly in n720's plan, via using the depolymorph code.)
Actually getting a monster onto the Quest portal might also be difficult. We can't do it from outside – if there's a monster on the portal we couldn't use it ourself, so how could we have entered the Quest? – but we might be able to do it via letting a monster leave the Quest via the portal. When changing level, the player is placed before any monsters which migrated there since the player was last there; however, the migrating monsters can legally be placed on the same square as the player, having a chance to push them. So that seems like it might work too.
As a sanity check, it's worth verifying that all this actually saves time:
2000 player action 1 or monster action 1: unlock Quest
2000 player action 2: level teleport to Quest
2000 monster action 2: kill the Dark One, teleport player onto Bell, teleport player onto levport trap (very difficult – remember the level's only just been generated! – but theoretically possible)
2000 player action 3a: zero-time drop into water, crawl onto portal, get pushed onto water (requires ridiculous polyform management as mentioned by n720 earlier)
2000 player action 3b: zero-time drop into water, crawl onto levport trap (or trapdoor, I guess), levport to Valley
2000 player action 3c: manual level teleport to VS level, "oLS-cancelled
2000 player action 3d: start reading Book
2000 player action 4: finish reading Book
2000 player action 5: enter Sanctum
2000 monster discharge: retrieve Amulet, etc.
Yep, it seems like if all of this can be made to work, it's an action faster.
I think there are two fundamental problems with a 2003-turn run:
a) How to get into the Sanctum before the end of turn 2000;
b) How to get into the correct polyform by the end of 2002,
I've mostly been looking for a way to do a). Unfortunately, although your plan is very impressive and deals with a number of things I didn't realise were problems, there are two big issues with it. One is that detonating landmines will cause wounded legs status, interfering with many actions we need to perform, and I don't think it can be cured without spending a player action. The other is that the timing rules for explosions are different from what you imagine here (explosions do damage to terrain left to right (for some reason) but damage to the player last). There seems to be a much simpler solution if we're using landmine chains, though; after a 0-time unpolymorph that drops us into water and crawls out right onto a landmine on ice, have a fiery explosion (from a lit potion of oil on the square) melt the ice on that square and the square to the right, and have a magic portal and polymorph trap there (in that order) on the square to the right and the square to its right. We don't fall in once and crawl out twice; rather, we fall in once, crawl out once, then fall in again when the explosion catches up to us, pushing us onto the polymorph trap. In a bit of coding that was really annoying for most of my plans but helpful for this one, magic portals (unlike level teleport traps, which trigger immediately if it's the player's turn) never activate until all effects of the current action have been resolved. Now we're a flier in the upper Dungeons over water, and still have a "oLS equipped; there are multiple ways to get to the VS level in zero time from there.
EDIT: This doesn't work on Home:1 for a wizard as on hard-floor levels you can't dig on squares where a trap already exists. That's a ridiculous restriction, but it prevents us getting ice underneath a polymorph trap. This may be fixable. (It could be fixed by playing valk, but this would require redoing the whole run and give us fewer, maybe zero, options on Fire. There's hopefully an easier way to fix it.)
The amount of luck in the plan is astronomical as worded, though; a 200 teleport fail on an unvisited level which we can't migrate monsters onto have odds that are unlikely to be satisfied on any RNG seed that exists, unless we're in a swimming polyform that can't exist on land (this makes all the squares on the level mostly-invalid targets, meaning that most teleport attempts will naturally fail). Swimming polyforms, however, can't pick up items; so we couldn't pick up the Bell on action 2 and although it's easy enough to get migrating monsters to carry it around, I can't see a way to get the Bell dropped some time during the zero-time portion of action 3 so that we can autopick it up (other than by catching the Dark One in the explosion, but if he drops it on a square "behind" us in the explosion it'll be a water square so we can't pick it up, and if he's on a square "ahead" of us in the explosion he'll still be alive so won't have dropped it). At least there's a lot of scope here for creativity, so there's likely some way to do it.
However, b) is also a problem, and this is one of the best attempts at it I've seen. One huge problem here is the amount of luck needed. The portal on Fire would have to be on some very specific locations; (67, 12), (64, 15), (64, 16), and (64, 17) appear to be the only four map tiles that work (out of the entire very large map), and even then, we need a push from a monster to reach any of those (they're all out of the range of a 4-square jump from the starting location of (69, 16)).
Coming onto Water, nh_timeout() runs before movebubbles(), so my basic idea was to flood the area with monsters so that there was no room to move the player inside a bubble. Unfortunately, after inspecting the code, this seems not to work; the player turns out to take precedence over monsters when the bubble moves, so there's no way to escape the bubble as a result of a turn boundary; the monsters will be mnexto()ed around in order to make room. Even if that could be fixed, Water doesn't seem like a fun level to do a 200 teleport fail on.
Assuming that we fulfil a), which now seems likely to be possible somehow, we'll be in the Sanctum on the last player action of turn 2000. We have one free action then to trigger a monster turn, and can spend it fixing wounded legs or putting on a "oLS (but not both). Even assuming we could do both, though, we can't leave the Sanctum before the first action of turn 2001 (although we can reach dlvl 1 on the subsequent monster action); can't reach Earth before the second action of turn 2001 (slight exception: if we're in natural form and an artifact generates on the entry square on Earth, we can "oLS-cancel it, but this doesn't seem useful (due to the need to be in natural form) and is also incredibly unlikely, and I'm not sure it's even possible – it would be another matter if we could migrate a trice corpse there but we can't); almost certainly can't reach Air before the third action of turn 2001 (there's no timing reason why a monster action couldn't get us from Earth to Air on the second monster action of turn 2001, but I don't know of an action that would actually accomplish that without spending an additional player action to #monster for enexto); so because we used the third player or third monster action of turn 2001 to reach Air, we can't reach Air with more than one action left.
I'm considering a hypercharge engulf to be too unlikely to succeed here (in addition to the fact that it would be very slow and tedious to set up – possibly taking more time than we had, because setting it up requires turn boundaries – and the fact that I have no idea how it interacts with portals, it moves the player in a random walk and a random walk from the entry square of Air hitting the portal is very unlikely if the walk's of a reasonable length). So we can't reach Fire on this action, except possibly via overflow hurtling (in which case we end up on Fire in natural form).
I think the best approach might be to go back to the old, old plan for the Planes; if we're on Air on the last action of turn 2001, the best approach might be simply to manually polymorph into an air-E, use the turn boundary to flood the level with eggs, and enexto to Fire on the first action of turn 2002. We're now on Fire with three actions left, which beats the two we'd get from an overflow hurtle solution; even though we get there later we're moving faster, so actually have more time left. Polymorph into air-E, equip Eyes, step, jump is four actions, but (if we had time to equip a "oLS and didn't need to heal our legs) we could "oLS-cancel one of them. A push from a monster might theoretically mean that we didn't have to step, which would give time to heal our legs too (making the jump legal). That would take us to Water with four actions left, which is enough.
Moderator, Senior Ambassador, Experienced player
(908)
Joined: 9/14/2008
Posts: 1014
OK, I read through the most recent routing plan a few times and I see... a lot of things we still have to do. Seriously, at this rate this game is going to hold the record for the most effort spent on routing of any TAS ever created for all time.
OK, so if we are on Air on the last action of turn 2001 and the hope is we can get away with a plan involving egg hatching, enexto for Fire, polymorph into an air elemental, equip the eyes, step, jump, somehow get pushed by a monster, and also heal our legs so we magically end up on Water with four actions left. I think. That plan makes a lot of assumptions about what's possible so I'm expecting we'll need to test several parts of it out first by source code diving or possibly actual contrived wizmode / Santa mode tests.
So with all that said, what's the next most sane thing to "worry" about, and by "worry" I really mean the more positive statement "Given what we know now, what do we need to resolve next to know for certain what is possible and what is impossible about this plan?" I must say it's nice to finally be having productive conversations. I'm still unsure if we're going to be able to pull off a 2003 turn run but if we can't I feel confident we'll be making that decision after exhausting every other possible option.
I really want this to work but don't think it adds up.
Trying to follow this exactly, the double-drown here relies on losing HP from emergency_disrobe → flooreffects. In order for flooreffects to be able to call drown(), you'd need to be on a water tile. However, dropping a boulder on water turns off the handling for dropping a boulder on a pit (because the boulder/water interaction is checked first), and even if the boulder "sinks without a trace" the game still doesn't check the pit.
Let's see. In order to get a double-drown glitch, we need to trigger a recursive spoteffects in water_damage, losehp (trivial but requires being an iron golem), split_mon, unleash_all, [not dismount_steed: the devteam thought of that], unmul (if asleep), or emergency_disrobe. Also, we need to not be helpless (after unmul, if any) and be in a polyform with positive speed.
Using a potion of acid would trigger in water_damage; that's the right time. Unfortunately, it doesn't appear to do any damage; there's a comment "/* damage player/monster? */" but the actual damage seems not to have been implemented.
The boulder dropping trick suggested earlier would trigger in emergency_disrobe, which is also the correct time, but unfortunately we'd need to simultaneously be in water and not in water.
I'd checked most of the functions listed above a week or so ago, because this is one of the last remaining pieces necessary in the run and we're so close. One I didn't check was unmul, and it has a fairly interesting codepath to prayer_done, which might potentially be the breakthrough we need. Unfortunately, the only codepath through to rehumanize() that I see there is via p_type -1, which for a neutral character like ours triggers only if we're undead and only with a 10% chance (although 10% is massive in a TAS). Luckily, p_type is a static/global, which means that there might be a storage glitch for it.
Note that we're going to need to stack a number of different storage glitches to get this to work – we need to store all of u.usleep, afternmv, and p_type – and although it seems plausible that there's a way to store those (lifesaving looks really promising), I'd need to test because it involves glitches that aren't currently known.
Feedback on storage glitches: although all three variables are probably storable, u.usleep gets unstored whenever nomul is called and you don't end up helpless. And unfortunately, way too many things call nomul (including anything we could use to leave the Dark One's Dungeon without spending time or a "oLS). So we'd somehow need to fall asleep in the middle of the zero-turn stuff on the Home:1, and that doesn't seem to be possible. (For some bizarre reason, an exploding potion of sleep actually causes paralysis-resistable-by-sleep-resistance rather than actual sleep.) We could trigger a sleep trap but we'd then have no way to move off it.
I'm beginning to suspect that reaching the VS level faster is in fact completely impossible after all.
A partial breakthrough that still isn't enough to hit 2003:
FIQ (the author of the FIQHack variant of NetHack, and who therefore has a lot of experience with NetHack's monster AI) pointed out that it's possible for a covetous monster to teleport onto the Amulet, pick it up, and c!oGL out of the Sanctum all in a single monster turn.
The main practical advantage of this is that if we can't reach the Sanctum when we want to (i.e. with an action still to go in turn 2000), we only reach Earth one action late rather than 2. In fact, it's now clearly possible to reach Air by the turn 2001-2 boundary. Unfortunately, that requires an enexto on Earth, and thus being in the wrong polyform. We'd therefore need to somehow save an additional action on the way from the Sanctum to the Planes. Annoyingly, we have a spare action while we're waiting for the monster to c!oGL up (which we could use to equip a "oLS), but we don't have a "oLS-cancellable action on the way up to save with it.
The plan in this case would look something like this:
2000 action 1: gain alignment, quest permission, etc. (on player or monster action)
2000 action 2: levport to the Dark One's Dungeon, get the Bell, Eye, etc., on the monster turn
2000 action 3: branchport to the Valley, get the Eye stolen
2000 action 4 ("oLS-cancelled): levport to the VS level
2000 action 4: read the Book, action 1
2000 action 5: read the Book, action 2
2000 action 5 monster turn: we hit a polytrap and a levport trap, so as to end up in the Sanctum by turn boundary
Note that until hitting the final polytrap, we're doing all this in a humanoid polyform, so we don't have to worry about vision to read the Book.
2001 action 1: equip a new "oLS, the Amulet gets carried out of the Sanctum on the monster action (imagine a lot of fighting going on here with each monster only acting once)
2001 action 2: "oLS (or level-teleport) out of the sanctum, monsters teleport us onto a levport trap like before and then onto the Amulet, taking us to DL1 in the correct polyform with the Amulet (a big advantage of this plan: we don't need to hit a polytrap on the way up, making generating the VS level easier); autopickup the Eyes of the Overworld
2001 action 3: c!oGL to Earth
2001 action 4: ??? (enexto to Air doesn't work as we end up in a slow polyform for turn boundary)
We'd somehow need to either "oLS-cancel action 3 (we can't cancel either of the first two as "oLS-cancelling prevents monsters acting), or else somehow polymorph as a consequence of arriving on Air. Cancelling action 3 is the most promising path at the moment, but that would pretty much require autopicking up an artifact, and getting one of those to Earth before we get there is probably not possible. (I'm wondering if it's somehow possible to get the Wizard of Yendor to carry it up, but getting it to drop in the very narrow window of time we have between migration and autopickup is probably impossible, and getting it to drop on the right square seems even harder.)
EDIT: An artifact wouldn't work, it does HP damage and that doesn't kill us when we're polymorphed. It'd have to be a cockatrice corpse instead.
Noob question but: when does the bell get rung in that plan? I confess I don't fully understand the mechanics of the ritual, but don't you have to spend an action ringing the bell before reading the book? (or is that what you mean by "action 1" and "action 2"?)
EDIT: never mind, found the answer earlier in the thread
Right, reading the book takes 2 actions, ringing the Bell probably isn't necessary though if you're fast enough (IIRC this still hasn't been tested yet).
Unfortunately, you still have to have it in inventory.
Moderator, Senior Ambassador, Experienced player
(908)
Joined: 9/14/2008
Posts: 1014
And there's no such thing as inventory storage without violating the "no corrupting memory" rule I suspect...
What avenues of investigation are still open?
It's basically down to trying to find a new technique to save time somewhere, preferably earlier in the ascension run. The strategy for Water and Astral is pretty much decided now (we can enter Water as an air elemental at the turn 2002-3 boundary, polymorph using the boundary, then enexto across Water, spawn monsters on Astral, enexto across Astral, and sacrifice the Amulet as our four actions). So we need to complete Fire on turn 2002 (in air-E form). The problem is that we can't with present knowledge reach Air until after we've already spent an action on turn 2002 (unless we do so in a slow polyform, which means we'd lose most of our turn 2002 actions); and although there are known fast ways to cross Air (enexto, overflow hurtle), they both seem to be much slower without the help of a turn boundary. There's also some doubt on how long would be spent doing, e.g., polyform adjustment on Fire once we get there (the fastest known way to cross Fire is by jumping but we'd need the Eyes of the Overworld equipped to do that, and we can't glitch the amulet to D:1 while they're in our inventory so we'd need to equip them manually at some point; autopickup is sufficient to get them into our inventory en route).
Saving an action any time before Earth would mean that we could arrive on Air and still have the last action on turn 2001 available, which we could use to polymorph into an air-E (and then use the subsequent turn boundary to hatch eggs, polymorph back into p/t, and cross it in a single action). A third fast way to cross Air (that doesn't require a turn boundary or too much luck to manipulate / too much grinding to fit into the turncount) might also work.
Incidentally, it may be possible to reach the Sanctum an action earlier via playing a different character. The Valkyrie quest home level is more sequence-break friendly than the Wizard quest home level is (due to being able to generate ice and traps on the same square); I don't know if it's sufficiently good to save an action on the descent to the VS level, but I'm not really looking into it as changing the character would desync the entire run. I originally rejected the Valkyrie as a character because I thought they'd be slower on the Plane of Fire, but there is in fact a square that can possibly hold the portal and that's within jumping range of both characters. Actually manipulating the portal to be there, together with the perfect push from a monster, would be a nightmare, but it it maybe doable.
The most promising 2003 that's compatible with the current partial run, therefore, is going to involve finding a timesave somewhere on turn 2000 or 2001. Thanks to the recent breakthrough, we're now only one action off regardless of where on those two turns that action is saved.
On the quest goal level, it looks like it should be possible to get put onto the level teleport trap by being thrown off a steed instead; we just have to get the monsters in the right order. This requires being in a flying form that is also capable of riding: winged gargoyles, mind flayers, angels, vampires, and wraiths seem to work.
I think I have found a solution for the part after that. In the drag_ball function, there is a part that pulls you back if the chain is in water and the ball is not in the same body of water. (Helpfully, teleds, the function called for climbing out of water, unlike regular movement, does not stop when drag_ball returns false, and ignores the cause_delay flag.) The water on the Wizard quest start level is of MOAT type, which joins up, so we need to get the ball out of water for this to happen.
This setup should work:
Begin by dropping into the water at 1. Crawl out onto 2.
* The land mine on 2 is set off and breaks a lit potion of oil, which melts the ice; crawl out onto 3, moving the chain onto A.
The explosion continues and melts the ice on 3; crawl out onto 4, moving the chain onto 3 and the ball onto A.
* The land mine on 4 is set off and breaks another lit potion of oil, melting the ice; crawl out, with 6 as the destination --
but before that, you get dragged back into the water at 4, and crawl out onto 5. 5 and 6 should have a polymorph trap and the magic portal on them.
(The asterisks mark opportunities for luck manipulation by scattering additional items.)
A successful prayer can fix TROUBLE_LYCANTHROPE, which should work. As a bonus, a successful prayer can also heal wounded legs.
This can be incorporated into the above setup to also end up without wounded legs, should that be necessary. There is a difficulty because fall_asleep, with wakeup_msg true (as for sleep traps), sets afternmv unless the value of multi is different to the sleep time.
Proceed from 1 to 4 as before, making 7 the destination for crawling out.
After getting pulled back into the water, crawl out onto 5.
* The land mine on 5 breaks a potion of unholy water, triggering lycanthropy, then breaks a lit potion of oil, melting the ice.
Crawl out onto 6, but avoid the trap.
* The land mine from 5 continues; it breaks one or more potions of paralysis, close enough to affect you.
Finally, it calls dotrap. Now the sleep trap takes effect, and the rnd(25) duration has to be less than the duration of the paralysis from earlier (rnd(5)) so that afternmv does not get set.
Now you go to 7, and then the fiery explosion from 4 melts the ice at 7.
(Again, the asterisks mark opportunities for luck manipulation by scattering additional items.)
I had thought of that, but it does not work because the Valkyrie quest start level has only fire traps.
On the Plane of Fire, what about reading a scroll of punishment and throwing the ball? That is not prevented by wounded legs and does not end the turn, and it has a longer range than jumping, but fewer choices.
Something else I found: the break_armor function (used when polymorphing) calls cancel_don in several places, which could sometimes be an easier way than getting the item stolen of ending helplessness in that way. Unfortunately, I don't see even any speed-24 forms that can hold on to any equipped items; the fastest I found is the mountain centaur, with speed 20, which can only be used for one turn before losing an extra action. (Avoiding air-elemental form would also allow us to retain punishment.)
I need to check that, but I'm very hopeful. I did a few checks for obvious problems/brokennesses, and actually discovered that the code is broken in the opposite way to the usual (instead of spoteffects not getting called at all – which is what I feared and would have broken the plan – it appears to get called twice, once in drag_ball and once in teleds).
That said, teleds() is past the point where a crawl-out effect can be stored (which is part of the reason I missed this particular line myself). I don't think it's the drowning effect that's being stored here, like in a traditional double-drown. However, I suspect the teleds() effect itself is being stack-stored, and as that contains both a set of the player's x/y, and a spoteffects() call, it looks like it should work. (Or to put it more precisely: we're not storing the action "crawl out of water after drowning", but the action "place the player onto the square they just crawled onto and check for traps there".)
I can still see a lot of difficulties with this (beyond verifying that the glitch works – it's very complex – it's going to take some effort to actually get the Bell into our inventory with a route like this, although a team of friendly quantum mechanics is likely enough), but it's very promising and definitely worth testing.
(Incidentally, many of the polyforms you listed aren't actually valid as polyforms, but there are enough that are that that won't be a limit on the actual run.)
After checking, I don't think afternmv is storable after all. The problem is that multi can't be set from a negative value to a positive or zero value without clearing it, and so although we can store it from one cause of helplessness into another, it's going to clear itself as soon as we become non-helpless (and we can't levport down from Home:1 while helpless, as far as I know).
This isn't fatal to the plan but it means that we'll need to use some other approach for fixing or working around wounded legs.
I noticed a mistake in the plan I posted: you will actually be dragged back to 3, not to 4, so the traps have to be arranged a bit differently.
A monster drinking a cursed potion of invisibility can set multi to -1 (function you_aggravate), which makes helplessness end at the next turn boundary.
I've now tested the plan for Home:1 and it works! The trap arrangement needs to be tweaked slightly, as you suggested; after several experiments, I got it to work with the portal above 4 and the polytrap below 5. (I don't think the vertical positioning matters much for this, but the horizontal positioning is crucial.) You can make it much more likely to work (almost 50%) by creating a wall of red molds around the area; they're immune to fire, so they don't care about the exploding oil, and block our movement, making it more likely we'll crawl to the right square.
One major problem is that in order to do a zero-time artiblast depolymorph, we need an artifact that can blast us in zero time. There are only two options: the MKoT and the PYEC, but both have their own issues. The MKoT is chaotic, and will cost us a turn when blasting us unless we're chaotic too. Unfortunately, we need to be neutral for the Quest unlock and as far as I'm aware, there's no way to change alignment fast enough to save time like that.
That leaves the PYEC, which has no alignment issues, but it has a different issue: it gives MR and thus will block a polytrap working. The only fix I can see to this issue is to drop it while climbing out of the water. Unfortunately, if we do that, we're not getting it back, so we won't be able to use zero-time artiblast depolymorph elsewhere in the run. (I hope there's some way to get past the very next hurdle, getting from the Dungeons to the Valley, without it. Using the Orb of Fate's blast seems promising, although we'd need to die twice in response to it in order to "oLS-cancel the action, with no intervening nomul() call. I can't spot one in spoteffects() or drown(), though, so perhaps this is doable after all.)
Many of my plans along these lines had problems getting the Bell into inventory, but in this case we can probably just get teleported onto it after we've hit the levport trap to leave the Quest goal level (using a selective autopickup filter to avoid picking up the MR-granting Eye at the same time).
Huh, it does work.
I'm pretty surprised at that because I thought I'd checked all the codepaths. Perhaps I had some sort of mental block that prevented me considering invalid commands (in this case, applying an artifact that doesn't have an apply effect).
In a way this might make the TAS a bit less interesting, as it means that we don't have to screw around nearly as much on Home:1 as we would otherwise (I was preparing some sort of super-elaborate plan with multiple zero-turn backtracks via double-drowns). On the other hand, it does rather increase the chance that it gets finished at all.
Moderator, Senior Ambassador, Experienced player
(908)
Joined: 9/14/2008
Posts: 1014
I, for one, am definitely interested in seeing this TAS through to the end. :) I'm obviously in the midst of SGDQ but we should connect after I get home. I'd love to get some progress going again.
The previous way to trigger enexto in some places was with a leashed monster, but that won't work now because falling into water removes leashes. For the Astral Plane, we can have one of the revived corpses have OATTACHED_MONST retained data, of which most -- including current movement points -- carries over to the revived monster. For the Plane of Water, we can have a troll corpse self-reviving before the eggs; the same works on the Plane of Air if necessary.
An AD_LEGS monster attack can set the wounded-legs time to rnd(60-Dexterity), which can be as low as 1.
[Edit] Doing the Plane of Fire by throwing a heavy iron ball is not as simple as I previously thought, because we have to get it into inventory. So instead, we could read a scroll of punishment as the first action of turn 2002, before hiding on the ceiling and dropping onto the portal. We then need to revert to normal form to autopickup the ball upon arriving at the Plane of Water, which can be done by luck-manipulating one of the air elementals to be in position to attack us on the portal, or by bringing a sufficiently fast covetous monster with us. (Adding another reviving troll corpse for this appears not to work, because the monsters will not be in the right order.) Then, throw the ball to enter the Plane of Water (only northeast works), and polymorph into an air elemental. If we want to use the amulet of life saving here, instead throw the ball, polymorph into an air elemental and "oLS-cancel it, and finally move onto the portal; this gives for the portal 6 acceptable squares from a northeast throw and 3 from a west throw, and we can add 2 more from a northwest throw if we can have the option of reducing strength so that the ball is only thrown 4 squares.
Some more thoughts about how best to do the Plane of Fire:
If we need to get pushed on arrival, it is best to use hostile following monsters, as they have by far the greatest chance of doing so. We can do that by bringing covetous monsters with us from level 1, making sure they are put into the Plane of Earth before the monster that will cause us to fall from the ceiling, so that they go after it. Using faster monsters makes the setup on level 1 easier; the fastest covetous monsters are Vlad the Impaler and Yeenoghu, with speed 18.
One new possible approach is to get a push N/NW/W/SW/S, then move into the lava with command repeat, getting lifesaved and luck-manipulating a position near the portal, and then polymorph into an air elemental, put on the Eyes of the Overworld, and jump into the portal. This method can accept any portal position, but getting the push may be difficult because of RNG jitter from generating the level. The probability of getting a position near enough to the portal is about 1/45. That luch-manipulation can be done by 'g'-moving in the direction of the monster used for the push; if we haven't been forced out of piercer/trapper/lurker-above form, we could also 'g'-move in the direction of the lava (stopped by the check on line 968 of hack.c because those forms are blind, although that part of the check looks like a mistake).
Another possibility is to simply move towards the lava, then move into it with command repeat and get livesaved and appear next to the portal, and then move into the portal, and polymorph into an air elemental (polymorphing first also works). This requires for the level generation no luck-manipulation at all. The probability of appearing next to the portal is on average about 1/200, varying somewhat depending on how many open spaces there are next to the portal.
This isn't compatible with an overflow hurtle because that happens on our own turn; although magic portal level changes are always deferred, deferred_goto() runs before movemon() so the covetous monster wouldn't move to our destination.
Additionally, covetous monsters are very problematic for enexto triggers. The problem is that if the player has something they covet, they always teleport before moving (even if they're in melee range at the time and the teleport would take them further away). This means that the square you land on after the enexto is in practice nearly always going to be the square the covetous monster moved from, and it's very hard to make that the same square as the one you actually want.
These two considerations together imply that using a covetous monster on Earth is problematic, on Air is potentially possible, and on Fire seems very unlikely indeed; each Plane you have to navigate it through adds its own set of problems. (The corpse-with-added-data suggestion you had earlier is likely to be the best solution for Astral; it's much easier than trying to navigate a monster in monster form through all the levels in question.)
Incidentally, the fastest follower in the game is a polymorphed shopkeeper (although those aren't covetous). Faster still is an arbitrary following monster that's been hypercharged by repeatedly allowing it to gain movement points and then changing level before it can spend them (this relies on the fact that monsters can't move until the next player action if the player entered the level as a result of a monster action on a different level; you can sneak a turn boundary in between).
Thank you so much for this tip. That's likely to make the planes orders of magnitude more watchable, as it's a message-free turn-free method of luck manipulation. It works on pets too, and although we could do that anyway, it's so much faster in realtime that it opens up possibilities for extreme luck manipulations without making the run unwatchable. (It should even be able to be hexed in in cases where we used pet-attack-cancel previously, if any of them exist in the run.)