Once upon a time, there was a peaceful world called Sarasaland. In this world there were 4 kingdoms named Birabuto, Muda, Easton and Chai. One day, the skies of Sarasaland were suddenly covered by a huge black cloud. From a crack in this cloud, the unknown space monster Tatanga emerged to try to conquer Sarasaland. Tatanga hypnotized the people of all the kingdoms so that he could control them in any way he liked. In this way he took over Sarasaland. Now, he wants to marry Princess Daisy of Sarasaland and make her his queen. Mario came to know of these events, and he has started on a journey to the Chai Kingdom where Princess Daisy is held captive, in order to restore peace to Sarasaland. Can Mario defeat Tatanga, release people from his interstellar hypnosis, and rescue Princess Daisy? It's all up to you and Mario's skill. Go for it Mario!
Objectives
- Aims for highest score without wasting time
- Uses hardest difficulty
- Uses a game-restart sequence (2nd quest playthrough)
- Takes intentional damage
- Starts from a savestate
- Bizhawk 2.9.1 (Gambatte core)
About this run
Finally I gathered up motivation to work on a long overdue improvement to the ancient
published run.
This saves about
00:07.40 seconds, disregarding any LCD lag differences. Actually it seems to be less maybe due to the cyclecount impacting the actual time.
Please note that the previous run was played on
VBA-rr v21 at 60 FPS. At the more correct console-accurate ~59.7275 FPS, the previous time would be around
12:18.12.
Improvements include:
- Entering bonus games as Superball Mario to end the bonus game quicker.
- Wraparound bug at the end of 2-3 (only possible on game version 1.0).
- Scroll bug in 4-2
- Better optimization in many places
- Unlike the previous run, this run makes use of "shooting without slowing down" to gain more points
GBC mode
GBC mode was used as a habit of using it now for all Game Boy projects because it has the fastest BIOS screen. But it is inconsequential here since this run starts from a savestate and the BIOS screen is not part of the run. But it's still nice to have some colors.
Starting from a savestate
Like the previous run, this starts from a savestate directly after pressing Start at the "The End" screen. The full movie file can be found
here.
I used input from the
published normal mode run and added some (not very optimal) idle frames or pauses throughout the playthrough to make the bonus games sync.
Before starting the 2nd playthrough, I idled at the "The End" screen before pressing Start in order to get optimal bonus game luck so no time had to be wasted by adding lots of idle frames. This was a tedious process but I eventually found a very good scenario that only required 1 idle frame in 2-3.
About the use of a ROM hack in the future
There exists a ROM hack with the hard mode already unlocked, but I hadn't considered this possibility until I was already far into the run. I also didn't think about the previous run's judgement comment which suggests the use of a ROM hack for future runs. So I would like to request that TASvideos makes an exception again. Since there is a verification movie and the starting point can't really be altered other than for the bonus game luck, there shouldn't be a problem.
Advantages of using a ROM hack:
- Makes runs directly comparable with one another. No need to play through the 1st quest or manipulate luck before the run's actual starting point.
Disadvantages of using a ROM hack:
- Using a ROM hack is akin to using illegitimate means. It's not a version of the game that was distributed by Nintendo.
- Adds a BIOS screen since the run starts from power-on. Inconsequential but still adds to the total time and is lame.
Level by level
1-1
2 frames saved since the previous run had to idle and this run didn't.
200 points gained, because I hit two additional coin blocks.
Upcoming levels will use big Mario so the whole score route is different and I will not point out every difference.
1-2
It looks like entering this level as Big Mario and going through the beginning section without delay yielded slightly more lag (5 frames) compared to getting the Mushroom at the start first (3 frames). Going through as Small Mario yields even less lag (1 frame) but there is only one powerup possible to get after the beginning section.
I planned carefully where to get the Mushroom and Fireflower. A simple test yielded that getting the Mushroom at the beginning produces slightly less lag (3f) than if I had entered the level as Big Mario already and gone through the beginning without delay (5f). Going through as Small Mario produces even less lag (1f) but there is only 1 powerup up ahead so this wasn't an option. Based on this, I got the Mushroom at the beginning of the level.
The second Goomba at the pyramid staircase is killable at only 1f loss - just mentioning this here for future reference.
1-3
The normal mode run uses some idle frames to get more points (e.g. by getting the coins under the pyramid and killing the boss). But this run has no idle frames to spend so we are not getting the coins or the boss kill (the boss kill would have required 2 frames delay).
I'm shooting before the breakable blocks section since I have to let go of B briefly and I can't shoot enemies directly since it would create lag.
At the double row of breakable blocks, I can't get below it to hit a breakable block because killing the enemy right before that would create lag.
2-1 & 2-2
Lag management was annoying. It might be possible to reduce another 2~3 frames of lag here but it really comes down to luck since less lag here can mean more lag in other levels and vice-versa.
2-3
All the idling before pressing Start at the "The End" screen was to manipulate 1-3's bonus game luck, but ultimately, this level's bonus game luck, too. I eventually found a scenario with Fireflower in both bonus games at only 1 delay frame in 2-3.
As usual, I played through the level as fast as possible without minding enemies or coins, since all that matters for the bonus game is timing. Then I tried adding different amounts of idle frames in this and the previous two levels (either by waiting or by pause and unpause). If I find a scenario with 1 or 2 idle frames, good. Otherwise rinse and repeat with other scenarios that have made it past 1-3. After finding the best scenario, I played through 2-3 at TAS precision.
I decided to play this level from anew rather than copying over input in order to create something new interesting to look at.
3-1
By using "shooting without slowing down", I got some additional kills that the previous run didn't.
About 1 frame saved due to very slightly better rock jumping.
Later on, I managed to save another 1 frame by delaying one pixel before the lag frame in a spot before the spikes which allowed the boulder to spawn 1 frame earlier. This scenario had more lag in 3-2 than before, but I managed to get rid of that and keep the saved frame.
3-2
About 2 frames saved, by using a walljump at the spider section and optimized Mushroom grab.
3-3
Going the lower section before the vertical walls was 1 frame faster.
When I arrived at the bonus game and noted down all the possible scenarios and results, I noted that if I arrived 2 frames earlier I would get a Fireflower. At first, this didn't matter since I assumed the gameplay was optimized as is and I went ahead with noting down all the possible combinations of idle frames in 3-1, 3-2, 3-3 and bonus games those combinations yielded. But then I actually managed to save the two frames at grabbing the fireflower. My notes say:
I saved 2 frames on flower grab in 3-3 and got the -2 scenario. I'm amazing.
What's also very amazing is the discovery I made while testing the combinations of idle frames. I found that pausing & unpausing while time is converted to points at the end of a level can yield different bonus game luck depending on when you do the pausing & unpausing. This is interesting to know should I ever make another Super Mario Land run. Since I only had 1 idle frame to use in 2-3, I didn't have to re-test or redo anything, luckily.
3-3 Bonus game testing table
Here is the testing table from 3-3 which includes some of the "pausing & unpausing during the score tallying", just to give an impression.
- Numbers under "fade into bonus game" denote the framecount without thousands and ten-thousands.
- 3H1 2 >F means the items in the bonus game are aligned top to bottom as such: 3-up - (ladder) - 1-up - 2-up - Flower (Mario on the same floor).
- 3-2(2 idle) means Mario reached the goal 2 frames later, either by pausing-idle-unpausing or by slowing down briefly.
- 3-3(2 idle during score (101~052)) denotes that pause-idle-unpause was used in 3-3 while the score was being tallied and the timer read between 101 to 052 left.
- 3-2(2 idle during score ~102) denotes same as above but the timer read "whatever it was when Mario reached the goal" until 102 left.
- Several different combinations in one row means that any of them results in the same outcome.
- Waiting for items to swap in the bonus game takes 8 frames. Which is way too much to consider.
| fade into bonus game | outcome | |
-2 (theoretically) | 751 | 3H1 2 >F | (Fireflower!) - This is the scenario that ended up being used. |
no idles | 753 | 1H2 F >3 | |
3-3(2 idle during score (101~052)) | 755 | >1 H 2 F 3 | |
3-2(2 idle) 3-2(2 idle during score ~102) 3-2(1 idle), 3-3(1 idle) 3-3(2 idle) | 755 | 3 H 1 >2 F | |
3-3(2 idle after score) 3-3(2 idle during score (051~000)) 3-1(2 idle after score) 3-2(2 idle during score(100~000)) 3-1(1 idle), 3-3(1 idle) 3-1(1 idle), 3-2(1 idle) | 755 | >2 H F 3 1 | |
3-2(2 idle), 3-3(2 idle) 3-2(1 idle), 3-3(3 idle) 3-3(4 idle) | 757 | F H >3 1 2 | |
3-2(2 idle during score(110), 2 idle during score (101)) 3-2(3 idle after score), 3-3(1 idle) 3-1(1 idle), 3 idle after score | 757 | 3 H 1 2 >F | (Fireflower!) |
3-2(3 idle), 3-3(1 idle) 3-2(1 idle), 3-3(3 idle after score) 3-3(1 idle, 3 idle after score) | 757 | 2 H >F 3 1 | |
3-2(2 idle after score), 3-3(2 idle) 3-2(2 idle), 3-3(2 idle after score) 3-2(1 idle), 3-3(1 idle, 2 idle after score) 3-3(2 idle, 2 idle after score) | 757 | 3 H 1 >2 F | |
3-1(1 idle), 3-2(1 idle), 3-3(2 idle) | 757 | 1 H 2 F >3 | |
3-1(1 idle), 3-2(1 idle), 3-3(2 idle after score) | 757 | 2 H F 3 >1 | |
3-1(1 idle), 3-2(1 idle), 3-3(2 idle after score(077)) | 757 | 2 H 1 2 >F | (Fireflower!) |
3-3(6 idle) | 759 | F H >3 1 2 | |
3-3(8 idle) | 761 | F H 3 >1 2 | |
3-3(10 idle) | 763 | F H 1 2 >F | (Fireflower!) |
3-2(1 idle) 3-3(1 idle) | 765 | 1 H 2 F >3 | (bad monster pattern) |
3-3(3 idle) | 767 | F H 3 >1 2 | (bad monster pattern) |
3-1(2 idle) | Did not finish, massive lag in 3-2 | | |
... | ... | ... | ... |
4-1
Some points had to be omitted due to lag or due to a different pixel oscillation. But lots of points were gotten by using "shooting without slowing down".
The mid section with the pipes has been improved a lot. Now I can breeze through with almost no slowdown.
At the three asians section, got 5 lag frames (previous run got 6 lag frames).
4-2
Near the first cannon I got 2 lag frames (previous run got only 1) but the pipe sections have been slightly improved.
Over the years, more and more people have encountered a rare thing in this level: Scroll bug. Normally, the map keeps getting loaded 1 column of 8 pixels at a time as you proceed to the right. But when the bug happens, a column is omitted and the map gets shifted to the left while any enemies or objects still get spawned in their original position. This bug comes in handy since you don't have to wait for the falling platform at the end so it saves about 0.6 seconds.
ais523 posted a detailed explanation of the bug
here. A video of the bug can be found
here.
The bug is extremely rare and triggering it depends on lots of things going on on the screen at once so the game is near the point of lagging. I created a
luascript which could detect if the bug has happened. Eventually I developed it to be a simple brute-forcing script which I let run overnight a few times at different points in the level, trying different inputs. You can find more information about the luascript and my attempts at finding good bug scenarios
here. I got a scenario with 0 lag frames and 7 delay frames quickly and didn't manage to improve it so I moved on.
It might someday be possible to abuse this bug to remove the vertical wall at the end of the level. Mario can jump to the other side and it would save about 66 frames compared to the no-bug version. But creating lag at the correct spot is difficult. Shooting before the missile and jumping off the missile (so the missile falls to the right) can sometimes - in conjunction with the fireball shot to the right by the snake - create lag in the correct spot but I haven't been able to trigger the bug, even while running the script overnight. Creating too much lag would also nullify the timesave. The bug this run got already saves 38 frames so it is only possible to save another 28.
Theoretically the bug could be used to save time in other levels, such as at the end of 2-1 or 3-3 but it looks unlikely. 2-1 only loses very little time from having to jump up the breakable blocks. The vertical walls in 3-3 doesn't have enough objects on the screen so there is no way to create lag.
You could use the bug in the narrow pipes section of 4-2 to maybe remove the wall and take the upper path. I tried for it but have had no success with that either. The bug is extremely rare and I have only triggered it few times, even with the script. But my script is very simplistic and there might be more thought-out and efficient ways of brute-forcing for it.
4-3
Like with 2-3, I decided to create a new version of this level. Only a few sections were copied over.
I took a while to progress in this level because I was dissatisfied with my work over and over but I managed to work something out eventually.
Saved 1 frame on the cloud boss. Somehow, shooting while moving towards it causes the shot to hit sooner.
Some additional things of interest
Lag
While adding idle frames before the starting point and then checking for the bonus game luck repeatedly, I noticed lag behavior would be different in a few places: At the start of 1-2, at the end of 1-2, near the end of 2-1, in the center row of blocks in 2-2 and the end of 2-2. So additionally to adding idle frames, I had to resync the run every time. I neglected attempts that had too many lag frames. There is also a spot before the spikes in 3-1 and a spot near the first cannon in 4-2 where the game would lag more or less, largely without the possibility of reducing it.
If lag can be reduced, usually a good way to do so is having Mario jump up. However, holding the A button can also possibly create new lag even when nothing actually happens from holding the A button. Another good way to possibly reduce lag is by delaying for a pixel (let go to Right for one frame).
Down jump
When running and letting go of Right + pressing Down, then jumping, Mario will perform a funny looking jump. This is used in some places where I had a pixel to spare such as in 3-1 (rock jumps) and 3-3 (ending section).
Frame rules
The frame rules I'm aware of:
- In the sequence where Daisy transforms into a monster and jumps away, the monster will move to the right quicker or slower at an "every other frame" chance.
- In autoscroller levels, the screen scrolls "every other frame" independent of when the level actually started.
Possible improvements
This run has achieved quite a high level of optimization and I'm very satisfied. But it might still be possible to use the scroll bug even more efficiently in 4-2. But other than that, it's just shaving off single lag frames here and there which is not a sane thing to try to do.
Comparison video
Shoutouts and Thanks
- ais523 special thanks for their research on Super Mario Land bugs, especially the scroll bug
- The Super Mario Land speedrun scene and anyone who contributed for example by posting videos of the scroll bug
- Oh_DeeR because I treasure the good memories
- Bizhawk and Gambatte emulator creators