Metroid is a Metroidvania style game developed and published by Nintendo. The object of the game is to collect lots of useful items and destroy Mother Brain. This TAS beats the game as fast as possible, with the only restriction being no password entry. This is an improvement of 1269 frames (roughly 21 seconds) to #2032: Lord_Tom's NES Metroid "any%" in 08:19.32

Summary of Improvements

While making this TAS I found 3 WIPs by MESHUGGAH that improved upon the published run, but didn’t finish the game (they all stopped after Kraid). As far as I know, the fastest of these 3 was the fastest known TAS to beat Kraid. Below is a summary of improvements to MESHUGGAHs fastest WIP.
SectionFrames SavedCumulative Frames Saved
Title Screen*11
Brinstar 1st room23
Brinstar 2nd room14
Brinstar 3rd room (Elevator)15
Kraid’s Lair 1st Room falling section**-14
Kraid’s Lair 1st Room door glitch navigation59
Kraid’s Lair Room 2&3 up to door glitch**110
Door glitch into Kraid’s room273283
Kraid Fight16299
Below is a summary of improvements to the published TAS by Lord Tom
SectionFrames SavedCumulative Frames Saved
Title Screen*11
Brinstar 1st room34
Brinstar 2nd room3842
Brinstar 3rd room (elevator)143
Kraid’s Lair 1st room falling section245
Kraid’s Lair 1st room door glitch navigation4486
Kraid’s Lair 2nd room**-185
Kraids Lair 3rd room up to door glitch388
Door Glitch into Kraid’s Room331419
Kraid Fight39458
Brinstar 2: Start of 1st climb to start of 2nd climb44502
Brinstar 2: 2nd climb50552
Brinstar 2: End of 2nd climb to room with door glitch for ice beam10562
Brinstar 2: Door Glitch for ice beam10572
Brinstar 2: Room before ice beam25597
Brinstar 2: Ice beam room and reset (10 frame frame rule)4601
Brinstar 3: Up to 1st climb29630
Brinstar 3: 1st climb121751
Brinstar 3: Room before statue room91842
Brinstar 3: Statue room2844
Tourian: Room 1&213857
Tourian: Room 372929
Tourian: Room 435964
Tourian: Zebetites2671231
Tourian: Mother Brain fight301261
Tourian: Escape81269
(*) Bizhawk takes 1 less frame than FCEU and FCEUX to boot the game. This is the only emulation difference that I know of
(**) Time lost/gained due to 2 frame frame rule

Tricks and Techniques

Most of the tricks and techniques used in this TAS are documented here: GameResources/NES/Metroid

Kraid’s Door Without Damage Boost

This glitch is the main timesave in this TAS compared to the published run. I found it while trying to enter Kraid’s room through the missile door, but it can be used on any door. Essentially this glitch allows you to enter a closed door if you are already embedded in a wall from a door glitch. A door on the left of the screen covers x co-ordinates 1400 – 1C00. When starting a door glitch you can be anywhere in this range. Even if you’re at the leftmost x position of 1400 you’ll still fail to enter a closed door if you simply press left. But if you morph, unmorph, wait a frame, then press left for 1 frame them Samus moves slightly to the left and enters the door. I don’t know exactly why it works but my theory is that it abuses the mechanic where the game pushes you out of a door if you’re holding into the door and it’s closed on you. This functions differently to normal walls, which don’t eject you. As far as I know you can’t clip into normal walls using this method. Samus moves 0030 to the left, so any position in the range 1400-142F works for this glitch. This position window is 3/16ths of a pixel. This also works with doors on the right, but the co-ordinates are different to what is described above.

Despawn Rinka

The Rinka (rings in Tourian) can have their spawning delayed by pausing on specific frames. Each pause delays the spawning by 8 frames and by pausing and unpausing every 8 frames you can prevent them from spawning (until you stop pausing). When exactly to pause is when address 002D ends with an 8 or a 0 (in hex) (or 9 and A), although this can sometimes vary.
This can be used to avoid taking damage when passing from the first to second room of Tourian, but this TAS opted to avoid it by morphing through the door instead. However, this was used extensively in the Mother Brain room when destroying the Zebetites. This is because having the rings on screen causes a lot of lag and losing 25% of the frames due to pausing is much faster than getting the lag.

Air Bounce

If you’re in a morph ball underneath a ceiling and your y pixel is a specific value (depends on the height of the ceiling but the y pixel ends with a 0 in hex) then you can press up or A without unmorphing. If there is a floor between 17-1B pixels (hex) lower than you, then pressing the up or A will trigger a bounce. The y velocity of this bounce depends on the y velocity when you pressed up or A. By alternating up and A every frame, you can use this to float in the air. This is used for playaround in the statue room and Tourian room 3. This glitch was used once in the 100% TAS but the cause of the glitch was not well understood at the time.

Pass Through Enemies with Ice Beam

Freezing and unfreezing an enemy causes a few frames where you can pass through it without being damaged.

Vertical to Horizontal Screen Scrolling

If you scroll from a vertical to a horizontal room, the screen needs to line up to the height of the horizontal room first. This is quite slow so it’s often better to adjust the screen height by jumping and morphing so that the game doesn’t have to do adjustments.

General Movement

It’s best to stay on the ground when possible as the jumping speed is only 75% of the walking speed. Samus has a few frames of acceleration before reaching full walking speed. When turning around in certain movement states it is best to let go of the d-pad for a frame which sets the speed to 0, then start holding the desired direction. This is much faster than changing your speed all the way from +/- walking speed to -/+ walking speed. This quick turn around works on the ground and some frames near the start of a jump, but it can work for more frames of the jump if up is held on the dpad.

Enemy Item Drops and Enemy Slots

Enemies can drop energy, missiles or nothing depending on what frame they’re killed. When you enter a room a random number between 0 and 16 is chosen and stored in address 0093, this determines the maximum number of missile drops that can occur in that room. If you have already reached the maximum and an enemy is hit on the right frame to drop a missile, it will instead drop nothing.
Enemies take up object slots and if a slot is occupied, an enemy can’t spawn. This is used a lot in the TAS to get undesirable enemies out of the way or to spawn extra enemies for pickups. If an enemy drops an item, then the slot for that enemy remains occupied by the item.
Koh1fds made a great map which shows which enemies occupy which slots. This was a massive help, especially with the statue room enemy manipulation. The map and description can be found here: https://www.speedrun.com/metroid_nes/thread/m9412

Subpixel Optimization

There are optimizations with x subpixels but the main point of this section is to talk about y subpixels. There are 256 subpixels in a pixel. Usually there’s not much you can do to change your y subpixels without losing time, but there are several points where I’m waiting for something to happen (e.g. for door to close for door glitch). If this is the case then I can use that time to hit precise y subpixel values.
An example of why I bother with this is for climbing sections. Suppose there was a section where I had to jump up a height of 4 blocks and then jump again as soon as possible. Depending on my subpixel the amount of frames in the air for that first jump of 4 blocks can vary by up to 3 frames. I extensively used tables to route out these kind of jumps, which have data from testing in the game. On the left are subpixels before you start the jump, the second column is the number of extra frames in the air for that jump, the third is how the subpixel changes from the jump and the fourth is the subpixel you will have after the jump. To avoid these tables having 256 columns, I group the subpixels into ranges. Here is an example of a 4 block jump:
Subpixel RangeFrames Wasted+subpixelsPredicted Range
00-5722020-77
58-B71A800-5F
B8-FF04800-47
So for example if I had a single 4 jump and needed to jump again as soon as possible, I’d want my y subpixel to be between B8 and FF.
To route long sections I essentially chain several jumps together into a single table. These will be extensively referred to in the individual section comments.
This meant that once I had the data for jumps, I could do a lot of optimization essentially with pen and paper. It was satisfying to spend a few hours scribbling on some paper to discover I could save a frame and actually have it work when I went to TAS it. However, hexadecimal arithmetic is very prone to error and time consuming, so if I TAS another category for this game I’ll most likely automate the calculations to combine tables.

Frame Rules

There are 2 frame rules that I know of. One is every 10 frames and is used when starting the game, picking up items, or using an up+a restart sequence. This frame rule depends on 2 bytes: 002C and 0029. This means that when picking up an item for example, it only checks to give you control again every 10 frames, potentially nullifying some time saves or time losses. Generally I can manipulate this frame rule using lag. Pausing then unpausing costs 2 frames, but it can potentially save 2 or more frames of lag. The frame rule ticks up during pauses but not during lag, so I can sometimes swap lag frames for pause frames to line up the frame rule for the least waiting time. This does not always work since there’s a limit to how much you can pause without losing time.
The second frame rule is 2 frames. This is determined by the byte 002D. Many objects only update every 2 frames. Some important ones are the timer used to determine when a door should close again after being shot, and enemy movement. This means that often if a single frame is saved, it is lost due to waiting for enemies or waiting for a door to close for a scroll glitch. But sometimes saving one frame results in saving 2 frames overall due to this frame rule.

Useful RAM Addresses

DescriptionAddress
X Pixel030E
X Subpixel0311
Y Pixel030D
Y Subpixel0310
X Velocity Pixel0309
X Velocity Subpixel0313
Y Velocity Pixel0308
Y Velocity Subpixel0312
HP Tens Digit0107
Screen Y Pixel00FC
Kraid HP040B
Jingle Timer002C
10 frame frame rule0029
X position for one of the enemy slots0451
Global timer and 2 frame frame rule002D
Door closing timer03BF
Freeze Timer042D
Max Missile Drop0093
Statue Room enemy x0421
Statue Room enemy y0420
Door Hits038F
One of the metroids HP044B
Zebetite 1 Hits075B
Zebetite 2 Hits0763
Zebetite 3 Hits076B
Zebetite 4 Hits0773
Zebetite 5 Hits077B
Mother Brain Hits0099
Missile X03DE
To anyone who picks up this game in the future I’d highly recommend using Scripthawk over a RAM watch: https://github.com/Isotarge/ScriptHawk

Individual Section Comments

Brinstar to Kraid’s Lair

First Room

The first improvement is when grabbing the morph ball, I am sure to grab it with the maximum possible velocity to the right and also the rightmost possible x position. This saves 1 frame over the published TAS. Picking up the morph ball (and any other item) is on a 10 frame frame rule, which is enforced at the point of giving back control to Samus after the get item jingle. Optimally, this frame rule is reached with many frames to spare so I actually sacrifice some time beforehand to hit a specific y subpixel. This y subpixel is very precise and I figured it out with testing rather than pre-planning, this is because there aren’t many possible subpixel values that can be made while still making the optimal morph ball frame rule. The reason for a specific y subpixel is so that the jumps in the later part of this room have less frames in the air. The jump back onto the starting platform is heavily dependent on y subpixels. On some subpixels you can’t even jump through that small gap and on others you bonk for a frame (which loses 1 frame of movement). I made sure my subpixel got me through the gap without bonking at all, and furthermore that subpixel allowed me to land very quickly. If I was 4 subpixels higher I would take a frame longer to land, which loses 0.25 frames of x movement and messes up y subpixels for later.
My subpixel is then set up perfectly for the final jump of the room. If I was 8 or more subpixels lower then I would have to hold jump for another frame, which would lose significant time. The final jump of the room has the lowest possible frames in the air for a 5 block jump.
I think it could be possible to spend one less frame in the air on the jump back onto the starting platform, but I’m fairly sure that this would make me lose time on the last jump of the room. Even if I could save a frame of air time overall, this wouldn’t give me enough distance to save a frame.

First Scroll

With reference to the following image, I start on the yellow path, take the red segment and then finish on the yellow path (so did MESHUGGAH), while the published run takes the yellow path the whole way. The red path is faster because the jump off the bottom middle platform is also used for horizontal movement. The yellow path doesn’t use the jumping time to move horizontally.
The goal here is to get Samus on camera by jumping high enough, then falling down again to the door. This means that the metric for optimization is to make the last jump as early as possible. I have to wait for the door to close so I have plenty of time to set up y subpixels. The whole door glitch has: 12x morph/unmorphs, 1x weird morph unmorph kind of thing, 1x 4 jump,1x 3 jump, 1x 5 jump. The tables for each of these sections follow:
12x morph/unmorphs:
Subpixel RangeFrames Wasted+subpixelProjected Subpixel Range
00-7717272-E9
78-FF08800-87
4 jump:
Subpixel RangeFrames Wasted+subpixelsProjected Subpixel Range
00-570.52020-77
58-B70.25A800-5F
B8-FF04800-47
3 jump:
Subpixel RangeFrames Wasted+subpixelsProjected Subpixel Range
00-570.53838-8F
58-EF0.25A800-97
D0-FF03000-2F
5 jump (note morph jumps are different, but slower in this situation):
Subpixel RangeFrames Wasted+subpixelsProjected Subpixel Range
00-1F22828-47
20-4F1E000-2F
50-670B000-17
68-A74B820-5F
A8-EF35800-47
F0-FF21000-0F
I start with a subpixel of B4. Hence I lose 0 frames on the 12 morph unmorphs and and end up with a subpixel of 3C. The weird morph/unmorph, 4 jump and 3 jump all are whilst trying to move horizontally. As a result each frame extra in the air adds up to 0.25 frames of horizontal movement. There is no way to lose 0 frames on everything, but I do get a subpixel of 59 for the 5 jump which means that I lose 0 of the integer frame losses (from the 12 climb and 5 jump). But I do have to sacrifice some fractional frame losses in horizontal movement to achieve this (I minimize this loss of course).
During the fall after getting back on screen I take some damage to reduce lag. Sometimes pausing and unpausing in certain spots can reduce lag on this fall to save overall time but the lag frames are different every time and in this pausing trick didn’t save any overall time.

Kraid’s Lair

First Room

I have to squeeze past the third to last enemy of the fall, but the enemy moves 1 pixel every 2 frames which is based on the 2 frame frame rule. If I got to the enemy optimally it will move on the earliest frame possible rather than the one after. This difference is enough to cause it to be too far to the right and hit me. As a result I have to delay the morph which begins the fall by a frame so that the 2 frame frame rule lines up in such a way that I can make it past the bug while still being left enough not to bonk on any ground.

First Room Door Glitch

With this door glitch I go off the top of the screen to reach the room underneath (a horizontal scrolling room). I then use some platforms in this room to jump up. While jumping up the screen scrolls up enough that it focuses completely back on the room where I started the door glitch. As a result, the room that Samus is in becomes unloaded and essentially acts like a room completely of solid wall. Using this, I can morph jump up through this wall to reach the room that I started the door glitch in. The difference now is that I’ve used that time in the lower room to line up for a specific x position which is very close to the left edge of the screen. Using this I can enter the door in such a way that I’m going off the left side of the screen and coming out of the right. The result is the screen scrolls to the right into the small hallway room, but Samus is already on the right side of that hallway.
Once again while waiting for the door to close I can set up my y subpixels. This door glitch has: 14x morph/unmorph, a morph jump 3 jump, then a morph jump 4 jump or a normal 4 jump and finally 22 or 23 morph/unmorphs depending on subpixels. It would seem like 23 morph/unmorphs is slower but the morph 4 jump saves so much time over a normal 4 jump and it forces a 23 morph/unmorph. Furthermore, doing 23 rather than 22 morph/unmorph saves some time when jumping through the door, but this doesn’t completely outweigh the whole extra morph/unmorph. I TASed the optimal method for both the 4 morph jump + 23 morph/unmorph and the 4 normal jump + 22 morph/unmorph and the 4 morph jump + 23 was faster by a frame.
For the 14 morph jumps at the start I used a proof method rather than an exhaustive method to show that I lost 0 frames. Then there was a 3 morph jump and a 4 morph jump.
3 morph jump:
Subpixel RangeFrames Wasted+subpixelsProjected Range
00-2322424-47
24-531DC00-2F
54-630AC00-0F
Note that higher than 64 wastes so many frames that it’s not worth considering.
4 jump with morph:
Subpixel RangeFrames Wasted+subpixelsProjected Range
00-0101616-17
02-0D79A9C-A7
0E-9D6F200-8F
9E-FF56200-61
Yes that’s right, if I can hit a window of 2 subpixels, the 4 jump saves 5 frames over the next fastest subpixel!!! Naturally I want to hit this window, so after the optimal 14 morph/unmorphs I end up at 55. This allows me to hit the optimal 3 jump which leaves me at 01 which gives the optimal 4 jump!
This was the tightest y subpixel window in the run. I have a window of only 2 y subpixels (2/256 of a pixel) when I start in the door if I want the optimal outcome.

Little Hallway After Wrong Way Scroll

The main thing here is to be moving into the door at the rightmost position with the highest velocity possible on the frame that it opens. If I hit the door too soon, I bonk and lose all of my speed.

Door Glitch into Kraid’s Room

As mentioned in the main section I was able to get into Kraid’s room without using an enemy to hit me in. As for the door glitch, there are a few morphs/unmorphs before hitting the sweet spot off the top of the screen. Once here, I can run out and scroll the screen down by falling back down to the door. This is achieved because even though I’m above the screen, the game interprets me as under the screen, so it attempts to scroll down. From here, I do some more scrolling the screen down so that it eventually goes so far down that it scrolls past the room that I am in (where I started the door glitch). As mentioned earlier this deloads the room I’m in, but since I’m bouncing at the time, the screen scrolls up and reloads it. During these deloads and reloads there are lag blocks and if you are about to hit a door, you will clip slightly into it during these lag blocks. This is used to reenter the wall without having to shoot the door open again. The whole point of this is to get the screen to scroll down further so that the room before Kraid’s room loads and hence the door to Kraid’s room loads. Once clipped in the door I then wrap up 2 screens. In this process the screen is scrolled down a bit so that I end up at Kraid’s door offscreen.
If there was a way to scroll the screen down to see the room before Kraid while I was still 2 rooms above it, it would save a lot of time since I would avoid moving up through another 2 screens. Unfortunately I don’t think this is possible due to the nature of the scrolling mechanics.
As for y subpixel optimization this was fairly simple, since there’s a precise subpixel you can be on to make you instantly start morphing and unmorphing after the door clip. Since this window is small, the whole route fell together pretty easily around this door clip.

Kraid’s Door Lag

The method of being hit by the enemy through Kraid’s door reduces a bunch of lag. This is due to the enemy being on the screen less, Samus being in a morph ball, and taking damage which reduces lag. I had none of this since I didn’t use the enemy to get through the door, so I get a lot more lag during this room transition. The damageless strategy is definitely worth it though.
I can tradeoff some of the lag frames for pauses without losing any time overall. I use this to line up the 10 frame frame rule such that I catch it on the last frame possible. I’m able to manipulate this frame rule by trading lag frames for pause frames because the frame rule timer ticks up during pauses but not during lag.

Kraid Fight

Since I have more health due to not damaging to get into the room, this fight plays out very differently. The start of the fight involves getting into position while reducing as much lag as possible. Then it’s just a matter of shooting every 4 frames to hit Kraid as fast as possible. About half way through this Kraid shoots his stomach thingos. The published run had to jump over these due to being low on health, but I have just enough to take the hit without causing any of the shots to land on Kraid suboptimally.

Exit Kraid’s Lair to Ice Beam

First Climb

As soon as I enter the room I turn around and shoot the door, which reduces lag for the first section. This makes a door appear in a wall further up the climb. This causes some lag when the door appears in the wall, but it doesn’t outweigh what I save at the start of the room. Also it’s funny to see the door in the wall, so I’m glad it was faster.
Due to some optimization with holding up in the air to get quick in air turnarounds, I was able to squeeze past a ripper. The published run had to do some morph ball camera trickery which was 9 frames slower. This situation with the ripper occurs a lot on the climbs so all of those 9 frame saves add up quickly. I take damage on the ripper to both get onto the platform faster and to reduce some lag.
Before the breakable block section at the top, I kill some enemies leaving drops. This is specific manipulation to stop unfavorable enemies spawning in the breakable block section.

Horizontal Room between the 2 Climbs

I lose 5 frames in this room due to subpixels having another enemy spawned that the published run didn’t have. This enemy causes some lag frames. While I did lose this time, that’s because I gained the time back by doing different things in the previous room which saved more than 5 frames. This involved killing different enemies which is why the extra enemy spawned in the horizontal room. This is the first instance of a common theme in this part of the run, where the rooms cannot be treated individually since you might lose some frames in 1 room to save a lot of frames over all of the rooms.

Second Climb

This is essentially the same as the first climb but longer. I have some very limited opportunities to modify my y subpixels by altering the jump before the door into the climb room. Due to the limited options, I was able to essentially test all of the possibilities.

Horizontal Section up to Ice Beam Door Glitch

For the yellow room, I go up rather than down. This allows for an extra missile refill and it’s also faster (depending on subpixels and lag). This whole section is about getting missile refills and reducing lag.

Door Glitch for Ice Beam

This uses a similar thing to the wrong way scroll glitch where you deload the screen that Samus is on which creates a big solid wall which you can then morph/unmorph up.
The climb consists of: 13x morph/unmorphs, 1x morph/unmproh while moving right, 2x 4 jumps, 11x morph/unmorphs, 1 morph/unmorph while moving left.
13 Morph/Unmorphs:
Subpixel RangeFrames Wasted+subpixels
00-CF11A
D0-FF030
Note: You can’t really hit that D0-FF range without losing time since you’re not moving down fast enough when the door closes.
1 morph/unmorph with right:
Subpixel RangeFrames Wasted+subpixelsProjected Range
00-5709292-E9
58-FF0A800-A7
Note: Both are 0 since you are concerned with horizontal movement at this point and speed after an unmorph is the same as walking.
4 jump:
Subpixel RangeFrames Wasted+subpixelsProjected Range
00-5722020-77
58-B71A800-5F
B8-FF04800-47
11 morph/unmorphs:
Subpixel RangeFrames Wasted+subpixels
00-1F1CA
20-590FE
5A-FF0E0
I start with 31 because I can’t hit the range D0-FF due to y velocity. After the 13 climb I end up at 4B and then DD after the morph/unmorph with right. This allows me to lose 0 frames on the first 4 jump and 2 frames on the second 4 jump (note that due to the ranges it’s impossible to get less than 2 frames lost over those 2 jumps). This puts me at 45 which means the 11 morphs/unmorphs are optimal. Although 3 frames are lost over the whole navigation, those 3 frames are impossible to get due to the reasons outlined above. I also line up my subpixels so that they’re good for the next room too, although this only gets a few x subpixels benefit.
After this I take some damage to reduce lag and fall. During this fall I can use pauses to tradeoff lag frames to manipulate the 10 frame frame rule. Also, trading lag for pauses can also manipulate RNG for the next room. But I had really good RNG with no pauses and a good lineup for the frame rule, so I chose not to pause on this fall.

Room Before Ice Beam

I try to get the least laggy enemy pattern possible. I swap some lag for pauses in this room to line up the 10 frame frame rule after grabbing the ice beam so that there’s no waiting.

Brinstar to Tourian

First section to start of climb

I was more lucky with my enemy placements than the placements in the published run. The published run was able to get more missiles in this section, but at the cost of a lot of time.

Climb

The ice beam makes this section quicker by occasionally turning 2 jumps into 1 jump. The y subpixel routing was limited since I didn’t have much time to set it up since the reset. As a result I essentially tested all of the possibilities. Halfway up the climb I shoot a door to reduce some lag. This has the fun effect of making a door appear in a wall further up, like on the climb after Kraid’s lair. Shortly after shooting the door I jump over the enemy, which saves time over the method used in the published run.

Room before statue room

The goal of this room is to lure a Rio through the door to the statue room. I found an improvement thanks to the enemy slot manipulation where rather than luring the first Rio, I can spawn the second Rio instead. This makes for much less time waiting for the Rio to move to the left. To achieve this I have to kill the first Rio, but also it needs to not drop anything, otherwise it’s slot will remain full. Unfortunately the Rio always drops either health or missiles. But I got around this by hitting the missile cap for the room and trying to make it drop a missile, so it dropped nothing. All of this needed to happen before the screen scrolled past a certain point. I used the ice beam to make a platform which allowed me to kill the Rio without having to slow down so that the screen didn’t scroll too far.
The missile manipulation was very specific since I needed refills in this room, but also to hit the maximum. Luckily the max number of missiles is determined when Samus enters the door and not when the screen scrolls to the new room. I was able to tradeoff scrolling the screen to the correct height by jumping high with auto adjust before the screen scrolls left. Since this is a trade between before entering the door and after entering the door, I was able to hit heaps of different RNG values without losing much time overall. I ended up sacrificing 1 frame and a few subpixels to hit the maximum missile value that I wanted.

Statue Room

By freezing the Rio you can morph/unmorph and jump to clip through the floor. Depending on how you move, the Rio can be on one of 2 y pixels when you freeze it. I chose the highest of these 2 pixels because it makes it faster to perform the clip.

Tourian

Tourian First Room

Going left or right off of the elevator doesn’t make a difference, except the possibility of +/- 1 lag frame. I chose left in this run since it saved 1 lag frame, but I had a previous WIP that went right and was equal in time to my final TAS.
There is some unavoidable lag, but at the end of that block there’s one lag frame that can be saved. This is achieved by letting go of right 2 frames before the last lag frame, then pressing right again before the lag frame. I also had a previous WIP that had to press left instead of right.

Tourian Second Room Entry

It is very hard to avoid damage when going through this door. The published TAS avoids damage without using the morph ball, but this involves some pausing to delay the rings from spawning for a few frames. I attempted to get through without the morph ball, but due to the ring spawning patterns I couldn’t achieve this without sacrificing a lot of frames to pausing. I opted for using the morph ball which costs roughly 5 frames, but saves 1 frame in the next room. The published run spends 4 frames paused, so my morph ball method is roughly equal.

Tourian Second Room

I use one missile in this room, but it’s in a diffent spot to the published run. The missile that I use is to push a Metroid out of the way, which saves 2 frames in total. The published run uses a missile to kill a ring, but instead I freeze it and jump use it as a platform (costing 1 frame over using a missile). So overall having a missile saves 2 frames in this room (having 2 missiles would save 3 frames).
To freeze the ring that was killed with a missile in the published run, I have to shoot the ice beam, then jump to lure the ring up. Using the unmorph in the air, I can hit a very specific y subpixel which allows me to only do a one frame jump to both lure the ring up and jump on the ring when it’s frozen.

Tourian Third Room

I could enter this room in morph ball without losing any time, but morphing while in the room is faster since it can start you falling off the first edge earlier. This room benefits massively from the air bounce glitch. Using this I can stay in the morph ball for most of the room and also start falling sooner, rather than starting to fall only when I walk off the edge. I can also use the air bounce to slightly tweak y subpixels, but the possibilities are very limited. However I did use this slight tweaking of subpixels to save a frame or 2. I would like to stay in morph ball for the whole room but I occasionally have to unmorph to freeze metroids.

Tourian Fourth Room

I need to enter from the previous room in a morph ball because otherwise I’m higher which lures the Metroid up which kills me in the doorway. I am able to use the unmorph in the air to line up my y subpixels. I use it to optimize the last 2 jumps of the room.

Zebetites

I enter the room in a morph ball to avoid damage from the bullet after going through the door. Each zebetite takes 8 hits with missiles. Ideally I shoot them from as close as possible to reduce wasted time of missiles flying through the air. Some time is saved at the beginning by shooting the door open to reduce lag.
I save significant time here by using the pause abuse to stop the rings from spawning. This is purely to reduce lag since with rings on the screen this room can have up to 50% lag frames! Pausing wastes 2 frames and you need to pause every 8 frames, so I reduce the wasted frames to only 25%. This means that the pause strategy is almost 1.5x faster than letting the rings spawn and lag the room. This is less than 1.5x since it’s not always 50% lag frames with the rings on screen.
With no rings on screen there is usually no lag, but sometimes I have to adjust my movement to eliminate a lag frame.

Mother Brain

Mother Brain can be damaged every 17 frames, so sometimes you can fire a missile too early and it doesn’t damage mother brain. This means that I don’t have to be as close as possible to hit Mother Brain as fast as possible (unlike the zebetites). For reference, when I’m standing on the right of the frozen ring and shooting mother brain is about the furthest away that you can be while still dealing optimal damage. I manage to get most hits in as soon as possible, except for when the cannons fire at inconvenient times.

Escape

To get through the door, I press right just before hitting the wall. I don’t know exactly why this works, but it was the method used in the published run and I couldn’t find any faster alternatives. After passing through the door, your y velocity resets and you fall to the ground. Since you want to move left at the same time, spending more time in the air costs time of horizontal movement. This can make a difference of up to 3 frames.
After defeating Mother Brain I have a huge amount of time to set up y subpixels for the climb. Below is a table of the frames wasted based on the y subpixel that you have before the first jump after passing through the door. It takes into account all of the jumps up until you land on the last blue platform before jumping onto the lift platform.
Subpixel RangeFrames Wasted
00-074
08-0F2
10-175
18-1F4
20-273
28-2F2
30-372
38-3F2
40-475
48-573
58-5F5
60-6F3
70-771
78-7F3
80-871
88-8F4
90-973
98-9F2
A0-A71
A8-AF1
B0-B71
B8-BF4
C0-CF2
D0-D70
D8-DF1
E0-E70
E8-EF3
F0-FF2
Naturally I wanted to go for the 0 frames wasted, but that cost 3 frames due to the air time after passing through the door (you need lots of air time to hit a high subpixel because your velocity needs to at least match that subpixel worth of magnitude). The 1 frame wasted option had a similar problem, so I opted for the 2 frames wasted option, and got a subpixel of 0D. There is the small complication of the last jump, but even when factoring in this horizontal movement difference, the subpixel that I chose was still the best.

Thanks

Lord Tom: For making 3 great TASes of this game, which were extremely helpful for making this TAS.
MESHUGGAH: For making WIPs of this category which helped me to learn more about optimization techniques
Koh1fds: For making an extremely useful map with enemy slot numbers: https://www.speedrun.com/metroid_nes/thread/m9412
The Metroid Speedrunning Community: For being really helpful and friendly and providing advice

Masterjun: Judging.
Masterjun: Very entertaining run that improves upon the previous movie. I don't think I can add anything that wasn't already said. Great job! Accepting to Moons as an improvement to the previous run.
fsvgm777: Processing.