Submission #7071: Masterjun's SNES Super Mario World "repeated input" in 02:22.93

Console Super NES Emulator BizHawk 2.6.1
Game Version USA Frame Count 8590
ROM Filename Super Mario World (U) [!].smc Frame Rate 60.0988138974405
Branch repeated input Rerecord Count 6474
Unknown Authors Masterjun
Game Super Mario World
Submitted by Masterjun on 4/1/2021 7:00:05 AM

Submission Comments
For my 11th year and 11th entry into April Fools Day submissions, I decided to complete 11 exits of Super Mario World using 11 inputs... or something like that.
Huh, why is the encode so much longer than the submission time?

Repeated Input?

Yes! This run is especially compression-friendly because it just repeats the same 2-minute input over and over again. Just enable the emulator option "On Movie End -> Repeat Input"... Wait that option doesn't exist? Truly a sad day. Don't worry, I'll have a manually extended version somewhere in this submission text, I just don't know where I'm going to put it yet.
You know, for all the difficult and technical submission texts I write to explain how it works, it's really refreshing to have an explanation be "just play it again lol". On the other hand, explaining how it was made will be a bit more challenging.

Game Objectives?

  • Win the game without ultimate glitches and insane crash abuse.
  • Except winning a game in that way takes too long for me.
  • So I decided to compromise: I only have to TAS ~2 minutes, but you have to watch ~26 minutes.
  • But me using BizHawk over lsnes? Craziness!


Remember those submissions where multiple different games are being played at the same time with the same input? I wanted to do that too, except playing multiple games requires knowing multiple games. Now what are the chances of me knowing multiple games? Let me give you a hint: This is my 11th year featuring SMW in an April Fools submission.
Instead of playing multiple games at the same time, I'm playing the same game at multiple times... with the same input... you know this sentence worked out better in my head.
So I thought about splitting the game into 2 equal parts somewhere at the ghost house. But only 2 input loops sounded boring so I didn't even test if it would work. No, I immediately went to splitting the game into 11 parts. How the number 11 comes up here is interesting, because you actually enter 12 levels when using the regular "warps" route in SMW. But for the sake of repeating input, the Front Door level and the Bowser fight take too long together and needed to be split up, which gives 13. However two levels (SW1 and SW3) are too short on their own and can be combined with the following one. So we have 12+1-2=11.
It's technically not necessary to split the game at level borders, but if you don't you will have a hard time syncing up the ends of everything. It also looks neat to start almost every level simultaneously.

How was it made?

In Theory?

Before you even start TASing you need a solid plan. You need to choose the number of sections, as well as their starting and endpoint, beforehand. They each need to satisfy certain conditions:
  • Every section (except the first one) can be reached by completing the previous section.
    • This also means all important things that are carried over, such as powerups or a Yoshi, need to be routed out ahead of time and are locked in. Changing things means a complete redo from the very beginning.
  • They can be completed in exactly the same time with exactly the same inputs. This can be reached with these conditions:
    • They can be completed in roughly the same time with exactly the same inputs.
    • The starting and endpoint can be delayed by pressing nothing, so that everything will sync up by waiting.
This last point is why I chose the overworld as the syncpoint because it is possible to simply wait.

In Practice?

For everyone who knows me it might be a surprise to see me create a SMW run in BizHawk instead of lsnes. The reason I chose BizHawk was because of one crucial Lua feature: Sockets. I can open 11 emulator windows and have them all connect and listen to an external main script (which I made in Python for convenience). From there I control inputs, savestates, frameadvance, and read-only toggles, to make sure all windows always do the same thing. Of course, I also needed to disable all inputs and hotkeys in the emulator config, since the script is in control. Luckily BizHawk allows automatically running a game, a movie, and a script, as command line options used in the script. For convenience I also made the script edit BizHawk's config.ini right before starting each instance to avoid every window spawning at the same position on top of each other.

Does this really work?

SMW has quite a big number of framerules everywhere. It was practically impossible to know each of the 11 framecounter values I will end up with, before even starting the TAS. So if you just play back the inputs in an emulator, it won't sync. What is mostly needed for it to sync is adjusting the global framecounter (RAM address $0013) once at each syncpoint. So yes, cheats. There are basically 12 frames where a cheat is necessary: The framecounter at each level entry (11) and then adjusting lagframes in dark room with the Bowser door (1) because it is the most laggy room in the game. To do the exact changes you can use this Lua script. And here is the full movie with 11 input repetitions.

Level names?

YI2 Yoshi's Island 2 popular green first level
YI3 Yoshi's Island 3 high level with the brown rotating platforms
YI4 Yoshi's Island 4 level with platforms on water and spiked mines
1C #1 Iggy's Castle castle level with nets and the autoscroller
DP1 Donut Plains 1 yellow feather level
DS1 Donut Secret 1 first water level with many obstacles
DSH Donut Secret House ghost house with Big Boo
SW1 Star World 1 short spin jump block level
SW2 Star World 2 long flat water level
SW3 Star World 3 small level with lakitu cloud
SW4 Star World 4 blue level with gray rotating platforms
FD Front Door bowser level with number doors


Which levels?

Of course, my plan was to use the "warps" route in SMW. I used my April Fools TAS from 2 years ago, the "one button challenge" run, to check how long each level would take. I saw that I could easily combine SW1 with SW2, and SW3 with SW4. However I also saw that FD needed to be split from the Bowser fight, and more importantly, the Bowser fight would take the longest. So the fight would be the highest priority whenever he spawns mechakoopas.


SMW has a pause feature by pressing Start. It would be possible to pause only certain levels by pressing it during transitions or during lagframes. However, I personally dislike this strategy.
1. It's difficult to pull off. You will have to eventually unpause every level again which requires a lot of sync.
2. I already knew the framerules would not allow this to be a properly syncing run. However, relying on lagframes of all things felt like I was abusing emulator errors for new techniques, which feels wrong.
3. For me, it kind of ruins the idea behind the run that every little input matters. It also makes the run less exciting when watching it in sequence.
With that I decided not to use it.


Using Yoshi doesn't sound like such a bad idea at first. Yoshi can help with maneuvering, and when mounting him your speed is set to 0 which can be very useful. Sadly, the most difficult part is actually keeping him. There are a lot of instances where you need to jump in one level while already jumping in another one. You won't get around eventually pressing A to get the extra jumps in. Pressing A dismounts Yoshi, so to keep him you need to remount him and regain your speed. Overall, it isn't worth it to keep Yoshi around.

Route by Masterjun?

To start off, the first priority is SW3. In most levels you go right to make progess, but in SW3 going right will lead you directly into the wrong goal. Luckily, pressing A in a cloud does not make you jump, so the other levels can be maneuvered with jumps while SW3 is floating upwards. The biggest difficulties in this section were dodging the ghost circle in DSH and the large pits in YI3.
Once SW3 is cleared, the focus shifts towards making progress. This is interrupted by DP1 having to collect a feather. The ability to descend slowly is quite useful to desync jumps from levels without a feather. The spin attack is also vital in water levels, and of course it is required to reach the keyhole in DP1. Stopping for the feather is also helpful for DS1, as all the jumping caused the swimming to get stuck at the top of the screen. Also, due to the difficulty of keeping YI3 from falling off, I decided to take the underground route. This will be important later on.
The simple levels not needing much focus here were YI2, YI4, SW1, and FD. More challenging was 1C due to being stuck on the net. This was due to Up inputs of the cloud-movement in SW3 and jumps out of the water in YI4.
Next, the Bowser fight needs to hit Bowser twice to clear the 1st of 3 phases. We know of a ~20s faster way to beat the Bowser fight by delaying the second throw. We wait until he throws another mechakoopa before hitting him again, and then keep around this third mechakoopa for the 2nd phase, where we time the next hit to skip the ball throwing phase. However, I decided against this method because it required too much. Keeping a mechakoopa alive for 30s, without destroying it with a spinjump or throwing it offscreen in addition to avoiding the flames until finally hitting Bowser with proper timing, all while also making significant progress in the other levels, was too big of a task during the first attempt at a run.
Following the two hits on Bowser, we come to a quite interesting part of the run. To progress in DSH we need to proceed left for a considerable amount of time. Instead of making every level go left as well, we make use of momentum being preserved in the air: You avoid losing speed when jumping on the first frame you touch the ground. We let everything come to a stop on the ground, but preserve the speed in DSH. Still, a bit of left-movement everywhere is required but this posed no big risk, in part thanks to YI3 being in the underground section.
Reaching the P-Switch in DSH, we can finally make more progress. At this point we have entered the difficult SW4, with dangers of falling off similar to YI3. We always want to minimize the amount of simultaneous things needing to be controlled, so we usually take pipes with their helpful transition times. This happens here with DP1, YI3, and DS1. Now we are quite behind in 1C and FD because of nets stopping movement, so the priority shifts to those.
Somehow avoiding falling off in YI3 and SW4, we finally reach the autoscroller in 1C and can make good progress everwhere. On the other hand we also have to avoid overshooting and clearing a level too early. After all, everything needs to sync up at the end. More and more levels get dangerously close to the goal while SW2 and FD are still behind. In fact, FD is so far behind that the hits on the 2nd Bowser phase have to be delayed a bit.
After clearing the 2nd Bowser phase, Iggy in 1C needs to be defeated as well. This happens relatively early because the castle clearing scene takes quite a long time. The wait for that and for the final Bowser phase can be perfectly used to catch up in SW2 which fell behind significantly. Switching left and right inputs every frame preserves momentum in the water while stopping movement on the ground. It is also useful for dodging the flames in the Bowser fight and the ghosts in the Big Boo fight.
With SW2 caught up and having reached the final Bowser phase, we can finally move towards the goalposts in YI2, YI3, and YI4. That right-movement is also used to fly up to the keyhole in DP1. While dodging Bowser in his most challenging phase, we deliver the final hit on Big Boo. We then quickly position SW4 closer to the keyhole, which happens so late because that area is small and has no walls, limiting movement everywhere. Now we can finally finish the Bowser fight with the last two hits, and simultaneously clear all four keyhole exits. The final task is positioning FD in front of the door while advancing through the title screen to complete the loop.

Simultaneous Screenshots?

Indeed, all the screenshots embedded into this submission text happen on the same frame.

Samsara: In the spirit of this submission, I will be delivering my judgement with repeated input as well.
Okay, I do wanna be serious about this one too, because it's one of the most technically impressive TASes I've ever seen. I watched this run 66 times by watching the encode once and it never got old to me, and I can't say I've done that with many TASes, if any at all... Okay, that was obviously still a little tongue-in-cheek, but it's hard to pass up an opportunity like that and there's likely never going to be another TAS that presents said opportunity. The fact that this is possible, even with the incredibly mild amount of hacking it took for sync is insane, not to mention the effort that was put into planning it, optimizing it, and even down to encoding it and documenting everything in the submission text. I know AFD is supposed to be the big day of "haha let's do a speedrun BUT IT IS TO A BAD THING!!!", but you've been consistently upping the ante every year with your AFD submissions and holy hell I hope that continues going into the future. Excellent work, genuinely, and, uh, sorry for copping out on the "repeated input" part of the judgement. I do kinda have 20+ others to get to.
Rejecting to Stars.

Last Edited by Samsara on 4/5/2021 4:41 AM
Page History Latest diff