Ok, I'll explain everything in detail. I'll start with indepth running mechanics.
Samus's normal ("walking") speed is 2.75 fr/px. Pressing dash makes Samus accelerate at a linear rate of 0.0625 px/fr^2 (= her speed increases by 1/16 pixels per frame every frame), stopping at 2 px/fr (I'll call this "part" of her speed her velocity). That means her full speed without any additional factors is 4.75 px/fr. To achieve it from standing still, you need to press forward+dash for 33 frames, travelling a distance of ~105 pixels (less than 7 full tiles).
Situation begins to look really weird when Samus starts moving her arm cannon. Every time its direction changes, her position shifts forward by one pixel. For instance, if you press L on frame
n and release on
n+1, Samus's arm will normally change its direction on frame
n+2 due to the input lag of one frame and the animation lag of one more frame:
n | you press L (aim down)
n+1 | +1 px boost
n+2 | +1 px boost, Samus lowers her arm
n+3 | her arm returns to initial position
Alternating the arm direction, Samus reaches her maximum pre-booster speed of 5.75 px/fr (still not Sonic the Hedgehog, but still nice).
Shooting Samus's cannon has the same effect as aiming up or down, with one notable exception: it doesn't return to the initial position until you change it to something different. Therefore, you have only one pixel of boost when you release the button. And sometimes, it is preferrable to have only one pixel of additional boost.
Now, a bit more explanation (or "Why do I have to shoot the cannon").
The above math fails miserably every time Samus runs up or down the slope, since one very important factor kicks in: the incline angle. I don't know exactly how to calculate everything since I can't measure the angles without using SMILE (actually, I wouldn't bother doing that anyway), but I know for sure that:
- running either uphill or downhill, Samus moves slower (technically, she isn't really moving slower, but rather is travelling more distance);
- depending on the incline angle and your horizontal speed, you have a certain chance of experiencing a collision error. This is the biggest problem in TASing this game.
If the error occurs while Samus is running uphill, she'll get into the ground, then immediately ejected, and as a result come to a full stop. This is a very rare thing, though.
When the error happens while Samus is running downhill, she loses her grip with the ground which sends her flying at the speed equal to her velocity (maximum of 2 px/fr without speedbooster) combined with her momentum (usually 2 px/fr; it builds up to that speed after 11 frames of pressing forward from standing still). It doesn't happen if Samus isn't exceeding certain speed limits, which is why you never see it in conventional play, unless you're both changing the arm's direction on the slope and you're unlucky enough.
Due to Drewseph's [rather cruel] level design, the game is full of considerably steep slopes right from the beginning, so in the TAS it happens
all the fucking time, which was why I had to move the running precision to subpixel level to avoid unwanted collision errors without losing much time. However, since I don't know the indepth calculations well enough, I can't predict when and how will I lose the grip the next time, so it's all a matter of trial and error. You can run down a certain slope fine, but fall off of it if your initial position has an offset of 1/64 px. Yeah, that bad.
That's also the reason why I'm close to 9k of rerecords even though I have Saturn's WIP as a reference and I haven't even crossed the mark of 2 ingame minutes. That's why the progress is rather slow nowadays: I have to manipulate certain refills without losing more than 1-2 frames compared to Saturn, and it seems that changing the room state by entering it later affects the randomness inside, but I won't know that before I pass through several screens of that room. So I'm doing, like, 500—1000 rerecords every day, but the run don't move forward timewise. :)
Also, to answer Tub's question: shooting the air to have a boost doesn't really add to nor detract from the complexity of the run, it's just a method to fine-tune the subpixel position without being slower. I think I'll settle with not doing it unless absolutely necessary, since I myself don't like those "missed" shots too much.