Game objectives
- Emulator used: lsnes rr2-β20
- Aims for fastest time
- Takes damage to save time
- Abuses programming errors
- Executes arbitrary code
- Surely the animals will die this time?
This is an improvement over the previous any% TAS of Super Metroid, it beats the old run by 20359 frames, or about 5.5 minutes, and brining the ingame clock down to 00:02 and the item collection to 2%
total's comments:
So this run is made possible by some more recent discoveries regarding OoB travel and new ways to get OoB without needing the X-ray scope, and I'll try to give a brief history about what was found.
One of the major glitches that makes this all possible was something discovered by Cpadolf a while ago. He noticed that during the last frame of unpausing, when the game changes game mode, it will not trigger door transitions. This made it possible for example to pause and time a shinespark to fly through door transitions where there was no solid blocks behind.
Later on Sniq found out that by pausing over and over and moving one frame at the time with the morph ball it is possible to slowly pass through door transitions without triggering them and then falling OoB. This made a lot of interesting things possible, like being able to skip bombs completely in favour of power bombs using OoB movement and a lot of other interesting things.
After some more research it was also found that it is possible to jump up through doors if you can get close enough to the door without triggering it, for example by standing on an enemy close to the door.
So finally me and Sniq figured that if it's possible to go up through doors, of course it has to be possible to also go down through doors. This turned out to be true and by using some precise hitbox manipulation it's possible to just fall right through.
The last discovery enabled us to get OoB without any items at all, and we looked for ways to exploit this to end the game quickly with 0%. Sadly we could not find any way to end the game under these conditions, there was simply not enough blocks with the right properties to make anything happen.
After this we found out that by saving and restarting the game, it would leave a lot more interesting data which is translated into different blocks when going OoB. I should mention that in many cases what shows up OoB is leftover data from previous rooms visited that did not get overwritten when loading the current room. so essentially by going from a larger room to a smaller room there will be data still left from the bigger room.
The problem with this was of course that when loading a save from the ship, anything left over from the intro will be overwritten since the landing site is a very large room, so this was solved by going down and getting morph ball so we could save at the early Crateria save room.
Finally this led us to be able to explore the OoB so we could find a block that would crash the game in just the right way so we could convince the game to run code from the controller registers and from there end the game.
One type of blocks were found after me and Sniq had been looking for a while that looked promising, it would jump to the SNES Open Bus and almost get all the way to the controller registers but crash just before.
So I did some more research and found out that one way of affecting the execution through open bus was simply to connect two multitaps, this changes two bits in $4016 and that changed the opcode ran just enough to offset the program counter and making the execution get to $4216 which is only two bytes away from the controller registers.
Interestingly enough $4216 is the result of the last multiplication made using the multiplication registers. By tracing the code to check where this multiplication was last used, it was found that it is the result of a multiplication using Samus Y-position.
By taking this into account we found a block that would jump to open bus at just the right Y-position to have the execution go straight into $4218 and from there on it was business as usual :)
The last three frames of input ends up executing the following code:
LDA #4216 STA $0A5C RTS
LDA #0026 STA $0998 RTS
DEC A STA $7ED821 JMP $D315
Cpadolf's comments:
Could this finally be the limit of Super Metoid? Maybe, maybe not but either way sniq and total definitely deserve medals for this run. Even with everything that has happened with this game in the last months, this goes so far beyond anything I could have imagined. Skipping things like bombs, super missiles and powerbombs always semed to be an absolute imposibilty, and then, even with being able to get out of bounds without having any particular items to help you (using a pause glitch I found curious but ultimately worthless when I first ran across it in my 100% run), breaking the game into a ACE-state by simply touching a block OoB seems like pure magic.
While I provided the opening input up until the point were this run started to deviate from the old ones, and helped with the final last stage of polish for the end leading up to the ACE, this run definitely belongs entirely to total and sniq. It's too bad that this run basically skips over almost anything interesting at this point, but I guess Super Metroid already has more than enough runs to show of the rest of the game!
sniq's comments:
This is a perfect example of when you want to make something happen no matter what it takes. My research of new methods to enter OoB with pause abuse combined with total's coding knowledge and cpadolf's tas optimization experience led to this awesome new tas, which makes Super Metroid look like a completely different game than it ever was before!
Thanks to
- amaurea for a lot of help with researching, tracing and debugging the game to make this all happen.
- The Super Metroid speedrunning and TAS communities for pushing this game further and further.
Noxxa: It is a bit of a shame that these runs are cut short so much, there is very little of the actual gameplay or creative routing left to appreciate. Nevertheless, accepting to Moons as an improvement to the
current game end glitch publication of the game.
feos: Publication underwater.