Submission #6748: Lobsterzelda, feos's NES Battletoads "warpless, 2 players" in 19:26.21

Nintendo Entertainment System
warpless, 2 players
BizHawk 2.4.0
70088
60.0988138974405
100000
Unknown
Battletoads (USA).nes
Submitted by Lobsterzelda on 5/15/2020 11:16:47 AM
Submission Comments

Prologue

On June 7th of 2005, a TAS of Battletoads using 2 players and with no warps created by FODA was published on TASVideos, which beat the game in 24 minutes and 57 seconds. As new TASes for the other categories of Battletoads continued to be published over the years, most people thought that a new 2 player warpless TAS was coming soon. Even more promising, in the early 2010’s, several people who had worked on other Battletoads TASes began working on creating a new 2 player warpless TAS. However, these plans all ultimately fizzled out before any TAS of the category could ever be completed.
Seasons changed, years passed. FODA changed his name to NESRocks. A glitch was found to beat Battletoads in under a minute. A new decade arrived. Coronavirus shut down the entire world. After all of these changes, the Battletoads TAS had remained the same! Eventually, after 15 years of lying in wait, FODA’s TAS became the third oldest published TAS on TASVideos to have not yet been obsoleted.
The question has always remained: how much longer do we have to wait to see this TAS get obsoleted? And the answer: no more! The future is now, and this new TAS finally obsoletes FODA’s now-teenaged TAS!

Why the Long Wait?

Many a TASer has been puzzled by FODA’s TAS remaining unchallenged: Battletoads is one of the most popular games to TAS, and huge possible improvements have been known about for the 2 players warpless category for many years now. Surely, there would be TASers falling over themselves for the chance to obsolete this run!
The reason for this delay is a little complicated. On the one hand, due to random chance, many of the Battletoads TASers started working on TASes for the category but then got sidetracked by other projects over the years. On the other hand, when a game is really popular, or a TAS is really old, it gives off an impression that only the very best and most experienced TASers are up to the task of obsoleting the published movie.
This in turn has the effect of intimidating the TASer who lacks Battletoads TASing experience away from working on obsoleting the category, and sets up a situation where only the handful of TASers with a published Battletoads TAS feel confident enough to work on a new movie. If the few with the necessary experience don’t get around to making this new movie, however, then the old movie can stand unchallenged for quite some time…
For my own part, I (Lobsterzelda) know firsthand how this sort of unconscious intimidation can discourage newcomers to a game from trying to work on obsoleting famous TASes. When I saw the list of TASes from 2005 that had yet to be obsoleted last summer (in 2019), the idea of making a TAS of the 2 players warpless category of Battletoads intrigued me. However, I figured that with how long the movie had stood unchallenged, I would be unlikely to be able to improve upon the TAS at all. I figured that if I TASed the game, I would probably get through all 24 minutes and 57 seconds only to find that I had tied the published TAS to the frame, and failed to find any improvements.
A few months later, I noticed that the 2 players warpless TAS did not make use of the level-end glitch in the turbo tunnel level, which would be able to cut over a minute off the runtime of the TAS. Upon realizing this, I thought to myself, “With this huge potential for timesaves, can I really not improve on this published movie by even 1 frame?”
I knew that the answer to this question was no, and I set out to do just that: to create a movie which was at least 1 frame faster than FODA’s movie, with the goal of ultimately finishing the TAS with the lowest completion time.
With all of this said and done, you’re probably wondering why I’ve written this whole short story, and why I’m putting it here before my description for the actual TAS. The reason for this is that I want to make an important point: you shouldn’t worry about not being good enough to make a TAS. If everybody thought that way, movies would never get obsoleted, and the site would look how it did in 2004 (minus the addition of TASes on newer consoles). Everybody has something they can contribute to TASing, and every movie longer than a few seconds is improvable by at least 1 frame.
So don’t focus on trying to make every TAS that you work on perfect. Just try to do each section of your TAS 1 frame faster than the fastest you could do it before, and keep doing this until you have no ideas left for how to improve things further. If you are willing to do that, then anyone, regardless of skill level, is capable of making a high-quality TAS!

The TASing Process

I started work on this TAS in January of 2020, shortly after finishing my TAS of Battletoads for the Game Boy. I used Alyosha’s WIP of the first 8 levels of the 2 players warpless TAS as my starting input to work with.
After AIVV73 pointed out to me that Alyosha’s WIP didn’t include a void jump in level 3 that would save about 3 seconds, I decided to go back to the beginning, and look for more places to make improvements.
From this, I was able to eventually complete the first 8 levels 7 seconds faster than Alyosha’s WIP did. For the levels that came after that, I copied over the 2 players warps TAS into my tasproject to start with, but then replaced almost all input except for autoscroller sections with my own input. I asked Alyosha if he would like to be a coauthor of this movie, but he declined, since he said his WIP was mostly based on the 2 players warps TAS. As such, I have included feos as a coauthor on this TAS, since input from his 2 players warps TAS appears directly in multiple spots throughout this TAS, most notably at the start of level 8.

Timesave Table

Below is a table I have made which compares the length of each level in FODA’s TAS to the length of each level in my TAS. This table lists the frame length for each level, which is measured as last frame before the screen fades to black at the end of a level minus first non-all-black frame at the start of a level (the one exception to this is the final level, which ends on the first frame that a bonus combo number is visible on screen from the final hit on the dark queen). In the rightmost column, I list the timesave in the format minutes:seconds + frames/60, where frames is the number of extra frames besides the frames included in the minutes and seconds (note that the USA Battletoads which my TAS was made on runs at 60 frames per second). This table is color-coded, with levels with greater timesaves (as a percentage of total level length) appearing in darker green, and levels with less significant timesaves appearing in lighter green:

Three Videos

Below, I have included 3 encodes of my TAS, each of which is slightly different from one another.
The first video shows a side-by-side comparison of my TAS with FODA’s TAS, with FODA’s TAS cut so that the first frame of each level of FODA’s TAS matches up with the first frame of the corresponding level from my TAS. This allows for level-by-level optimizations to be seen – at the expense of making it harder to see big timesaves. For anyone who has watched Battletoads TASes before, I would recommend watching this video, since the only sections of FODA’s TAS that get substantially cut off are the turbo tunnel and surf city levels, which are skipped via a level-end glitch.
The second video is a side-by-side comparison of my TAS and FODA’s TAS, with the first frame of level 1 synced up for both of our TASes. From there, both TASes play to completion without interruption, which allows for large timesaves to be seen. This video is more helpful for viewers who are less familiar with Battletoads TASes, since this shows off all of the major timesaves used in my TAS.
The third video is just a video of my TAS, with no other video playing next to it. This is the ideal video for anybody who doesn’t like watching videos that have split screens.
1. Comparison Video of my TAS and FODA’s TAS With Level-By-Level Cuts:
2. Comparison Video of my TAS and FODA’s TAS With No Cuts:
3. Video of my TAS alone:

The Plot

In Battletoads, you play as two anthropomorphic toads: Rash, and Zitz. Your goal is to rescue your fellow toad Pimple and the Princess Angelica, who have both been kidnapped by the Dark Queen. Across 13 levels with wildly different gameplay mechanics, you have to defeat all of the Dark Queen’s minions, before you undergo a final showdown with the Dark Queen herself!
This game is known for having comical attack patterns, such as your toads turning into wrecking balls to attack enemies, your toad growing giant fists or boots to punch or kick enemies, and your toad growing rams’ horns when you do a running ram attack into an enemy. This game is also famous (or infamous, to some) for the fact that in 2 player mode, each toad can hurt each other with their attacks. In 2 player mode, Rash is player 1, and Zitz is player 2.
In all of the 3D levels in the game, you have to beat up and kill every enemy on the screen before the screen will scroll. In the game’s 2D levels, some enemies need to be killed for the screen to scroll, while other times enemies don’t need to be killed to keep moving.

Level-By-Level Analysis

From here, I am now going to describe the techniques I used in each level in order to make this TAS as fast as possible!

Level 1: Ragnarok’s Canyon

In level 1, you need to kill every enemy in the level to scroll the screen enough to reach the boss. The boss of this level has a 256-frame timer that controls when he throws his ball at you (which you throw back at him to attack him). This timer is stored in address 0X000B, ticks up by 1 every non-lag frame, and doesn’t change during lag frames.
From all of this, we arrive at our strategy for level 1: kill all the enemies in the level with the least amount of lag possible, while making it to the boss before his timer reaches 256 (if you arrive a frame late, you have to wait an extra 256 frames).
After you kill the boss, you can jump to shorten the amount of time it takes to reach the end of the level by a few frames, which is used here as well.
One trick which is used in level 1 and which will come up frequently in this TAS is super-speed dashing. This is done by pressing right for a frame, releasing right, pressing right again, releasing right, and pressing right again. By doing this, your speed gets set to 192 (whereas 128 is the fastest you can reach by just holding right). Additionally, if you press jump on the same frame that your speed reaches 192, you can carry your speed through your jump as well. It is worth noting that bumping into walls in Battletoads causes your speed to be reset to 0, so it’s important to avoid brushing up against them at any point.
In certain cases, you can also press right, release for a frame, and press right again to start super-speed dashing immediately. Which type of technique works depends on both your previous momentum and whether or not you just performed an attack.
Also of note is that the charged power attacks cause several frames of lag, so they are used sparingly in the level. It is for this reason that the two enemies on the platform right before the level 1 boss are pushed to their death off the platform rather than being headbutted.
Frames Saved: 50

Level 2: Wookie Hole

Whenever you turn your toad into a wrecking ball and hit a wall, you create lag frames. However, if one toad smashes an enemy with a wrecking ball and the other toad punches you before you hit the wall, this will stop your wrecking ball animation, and prevent the lag frames from occurring. An example of this occurring can be seen at 2:04 in any of the encodes of my TAS provided above
Another technique I use to minimize lag in this level is that when I hit the two Venus Fly Trap enemies, I hit them both on the same frame (one plant with each toad). This causes the amount of lag that occurs when the toad hits the plant with a wrecking ball to occur once (instead of twice), and for the amount of lag that occurs from hitting a wall with a wrecking ball to occur only once as well.
Lastly, I save some frames at the end of this level by scrolling the toads slightly farther down before they are frozen from triggering the end of the level.
Frames Saved: 87

Level 3: Turbo Tunnel

This level starts out normally enough – I save some time over FODA’s run by using a faster combination of attacks to kill the enemies compared to what he does. However, once we reach the infamous turbo tunnel jets, things take an unexpected turn.
First of all, player 1 jumps into the void… and somehow jumps again in midair out of nowhere. Since when can toads double jump in Battletoads?
As it turns out, the toad isn’t jumping again in midair. Rather, there is a spot at the very bottom of the screen, where if your toad falls into a pit, the combination of their y-coordinate and camera position crosses this spot, and you press jump on the frame that you cross this spot, then the game will think that you are on ground, letting you jump out of nowhere. This technique is known as void jump.
By doing this void jump, we are able to grab the jet from underground. This in turn allows us to keep falling after we get on the jet, which lets us die by falling in the pit while riding a jet before we’ve activated any checkpoints.
This sudden turn of events puts the game in a very unfortunate predicament: level 3 is programmed to restart both toads from the start of the level if a toad dies before reaching the first checkpoint after getting on the jets.
However, once a toad gets on a jet and dies, the game wants to put the toad at the last checkpoint they activated (since the game assumes that you couldn’t have died while on the jet before activating the first checkpoint). As a result of this, the game respawns the toads in a corrupt state, where the pointer that specifies where to load level objects from upon restarting the level is pointing to an invalid location. As luck would have it, as part of the game’s attempts to load objects here, the level configuration pointer that spawns objects is eventually set to the address 0X0016, which contains a number representing the last frame’s button presses from player 2.
As such, by pressing a specific combination of buttons on player 2’s controller on a certain frame after entering this corrupt state, we can spawn an object with the ID value of 0X7F. This object is the same object which appears at the end of level 12, which has the effect of displaying fireworks and triggering the end of the level, which causes level 4 to start immediately afterwards. So long, turbo tunnel!
Some of you may feel cheated by this, since this is a warpless category after all. On the other hand, the category only promises not to use the mega warps to skip ahead 2 levels. It doesn’t promise that levels won’t be corrupted and ended early :P
As a result, we obtain this ginormous timesave!
Frames saved: 8,295

Level 4: Arctic Caverns

We now arrive at a level which took over a month for me to complete! Ultimately, this level took me the second-longest amount of time to TAS of any level in the game. Part of the reason for this is that lag is rampant throughout the level, and opportunities for tight movement optimizations exist everywhere, requiring vigilance to obtain the fastest time. Additionally, lag causes inputs that are copied from one TAS to another to desync (even when adding or subtracting the appropriate number of frames to account for lag), which means you can’t even copy input from one TAS of this level to another for the sections of this level where there are no ways to save any time! Only through persistence and patience can this level be TASed…
Before I get into what tricks I used in the level in order, I would like to first explain how this level’s checkpoint system works, as the system is somewhat complicated, and it will explain the route taken in this level:
In this level, you need to activate all checkpoints and reach the end of the level in order to beat the level. If you skip a checkpoint and reach the end of the level, you won’t advance to the next level (the game just increases the value of a variable keeping track of how many checkpoints you’ve hit). Each of the checkpoints in this level is activated via a wall being destroyed and a toad moving over a certain point where the wall used to be after it is destroyed, so each of the walls that triggers a checkpoint when destroyed must be destroyed to beat this level. Furthermore, at least one toad must stay behind/on top of the checkpoint wall when it’s destroyed in order for the checkpoint to actually be activated.
At 4:08 in my encode of my TAS, I perform some jumps on the very edge of each platform. With precise positioning, the game clips me upwards onto the platform a few frames earlier than usual, allowing me to start my next jump faster. Because I scroll the screen upwards so much faster than the game expects, it actually breaks the scrolling function for the level, which causes the graphics to be messed up for the rest of level 4.
At 4:33 in my encode of my TAS, I hold both left and right simultaneously with both toads. In 2D levels (like level 4), normally the x-coordinate is used for horizontal position, the z-coordinate is used for vertical position, and the y-coordinate is a fixed value which remains unchanged during the level. However, when you hold left and right simultaneously in a 2D level, the game gets confused, and starts increasing the value of your toad’s y-coordinate.
The net effect of this is that your toad’s sprite and the onscreen camera is shifted upwards, while the hitbox for your toad for interactions with most objects stays in place. In this particular spot, by shifting your position up high enough, the game eventually thinks that your position should be below the floor, which allows you to clip out of bounds and skip going through the next hallway, which saves some time. Left+right glitches will play a prominent role in several later levels in this TAS, so stay tuned to see more crazy sprite-shifting antics!
At 4:48, I am able to pass through the yellow spike by simply holding down while passing through it. This was an oversight by the game’s developers, as they allow you to pass through the yellow spikes as long as you are holding down (even when you aren’t ducking).
At 4:50, I am able to clip through the next checkpoint-wall by alternating pressing right and holding nothing for several frames in a row. However, as mentioned earlier, we still can’t beat the level without first activating all of the checkpoints. Thus, we have to wait here for the snowman to throw enough snowballs to destroy the wall and activate this checkpoint. In the meantime, I hold both left and right at the same time with both toads, which causes their sprites and the camera to be shifted very far above where the collision for their character is (which stays in the same spot).
As soon as the wall is destroyed, I can immediately fall down the next ledge (being on the other side of the wall saves some frames here). I then proceed to jump up and to the left. In Battletoads, most objects are triggered to spawn when the camera crosses certain points. Since the camera is shifted so high up here, it causes objects to be loaded in an odd order, which causes the spiky shell to load and destroy/activate the last checkpoint immediately, saving 6 seconds!
After this, I fall down to hit the end of level trigger, but not before forcing player 2 to commit suicide on some spikes on the way down. Killing player 2 reduces lag enough to save about 20 frames here, and the level still completes since player 1 activates the level end object to start the countdown to starting the next level before the death-reset from player 2 dying occurs (as a side effect of this, you do briefly see the level get restarted after activating the level end object, but when the level end object finishes counting down its timer to the end of the level, the game advances to level 5 anyways).
Frames Saved: 719

Level 5: Surf City

Ah, Surf City! The waves, the surfing, the Big Blag – what strategies will this TAS use to get through all of these sections as fast as possible? As it turns out, we won’t be using any of these strategies at all. Instead, player 2 can clip out of bounds using some precise positioning after grabbing the surfboard but before hitting the first checkpoint. Due to a similar logic system to how level 3’s level-end glitch works, the game tries to load objects based on player 2’s controller inputs after you respawn. Once again, we can press buttons so that the object with ID 0X7F is loaded into memory, which once again causes the level to end immediately.
As a percentage of time saved, this level had the biggest timesave of any level in the TAS, with the final length for the level in the new TAS being only 6% of the length of this level in FODA’s TAS! Now that’s the kind of massive timesave that doesn’t come around very often!
Frames Saved: 5,654

Level 6: Karnath’s Lair

At first glance, this level appears to consist mostly of autoscroller sections, since you have to ride each snake and wait for the next one to come out of its hole. However, it’s actually possible to manipulate each snake to go into its hole a few frames faster using precise movement! To be honest, I’m not really sure how or why this works. All I know is that I used trial and error to find the fastest pattern of movement to get each snake to go in their hole as fast as possible, which resulted in a lot of time saved!
Besides that, there are some other optimization tricks used at the end of each of the 4 rooms of level 6 in order to save time (I refer to the 4 rooms as 6-1, 6-2, 6-3, and 6-4).
At the end of 6-1, there is a small patch of collision on the center of the snake’s head (while the rest of this section of the head has no collision). By jumping onto this and then jumping to the exit hole, I am able to save some time compared to jumping onto the part of the snake where most of its collision ends. It is worth noting that in 2 player mode, in order to advance to the next room, you need both toads to make it into the exit hole. Additionally, the timer for the next room loading doesn’t start counting down until the second toad enters the hole, so it’s important that both toads make it into the hole as fast as possible. Interestingly enough, though, the game doesn’t check if you are alive or not when you hit the exit hole. More on this mechanic to come later on – and by later on, I mean right now!
At the end of 6-3, I jump up into the spikes to die while running right at full speed. As a result of this, the toads’ momentum keeps them flying right until they hit the exit hole. Even though they are dead, the game loads the next room before restarting the level or decrementing the number of lives left for the toads, which allows me to skip waiting for the last snake to appear to take me to the exit, as FODA does in his TAS.
Lastly, at the end of 6-4, I do a long jump and damage boost off of the spikes near the exit hole to reach the end of the level without having to wait for the snakes to reach that part of the screen. Once again, the level end event happens before the toads lose a life or the level resets, which allows me to continue onwards as though nothing unusual just happened.
Frames Saved: 308

Level 7: Volkmire’s Inferno

In the first half of level 7, I saved a little bit of time over FODA’s TAS using faster/more optimized movement.
In the flying section of the level, the fastest strategy is to be as far to the right as possible for hitting all of the level checkpoints except for the last one. Right before you reach the end-of-level checkpoint, you are moving really fast, and you slow down when you hit the checkpoint. You then move a fixed slower distance until you reach the point where the next level loads. However, if you keep all the way to the left side of the screen here, then you move faster for a longer amount of time, and then after you hit the end of level checkpoint and slow down, you have less distance to cover before reaching the end of the level. Since you cover the same distance with a faster average speed, this saves time, which I use to save about 20 frames over FODA’s run at the end of the level.
Frames Saved: 87

Secret Message

In the flying section of this level, I hid a secret message in my TAS. Watch closely to see if you can figure out both where the message is and what the message is! Here’s a hint to help you though: the message is 3 words long.

Level 8: Intruder Excluder

More left+right shenanigans occur at the start of this level! By holding left+right at the same time, it’s possible to scroll both toads all the way up the screen. By killing one of the toads at the perfect time so that the level-restart action occurs the frame after reaching the mid-level checkpoint, I am able to restart at the mid-point of the level with the toads’ sprites/hitboxes fixed.
I am able to save some time on the rest of the climb up the level by jumping into the edge of platforms, which lets me clip through them to start jumping sooner (the same trick I used in level 4). Additionally, by using this trick on the edge of the moving platforms that shoot out electricity between them on a timer, I am able to clip up to the next floor of the level without taking any damage from the electricity (which skips having to wait for the electricity to go away). After this, we arrive at one of the most formidable and RNG-heavy bosses of the game: Robo-Manus!

Robo-Manus

In this boss fight, you don’t want to use your headbutt attack. Besides creating more lag than other attacks, it also knocks Robo-Manus across the screen. This in turn would waste time, since you would then have to run across the screen before you could deliver the next hit on him.
It is also worth noting that if you hit Robo-Manus on the perfect frame when he is starting to jump off the ground, he will fall back down. Additionally, if you stand in just the right spot, then you can hit Robo-Manus without his cannon being able to hit you (since you are “inside” his cannon).
From all of this, we arrive at a strategy to beat Robo-Manus as fast as possible: by standing inside Robo-Manus’s cannon and repeatedly using a jumping down-smash attack, we can rack up hits on Robo-Manus as fast as possible, without knocking him around the screen. Furthermore, players 1 and 2 coordinate the timing of their jumps so that they don’t hit each other, and so that whenever Robo-Manus is about to jump away, one of their hits knocks him back down.
When all is said and done, Robo-Manus meets his untimely end, and the two toads rush off to the next level: The Terra Tubes!
Frames Saved: 196

Level 9: The Terra Tubes

This level took by FAR the longest of all the levels in this game for me to TAS. I must have spent at least 2-3 months working solely on this level. Besides the annoyingness of TASing underwater sections, this level also took a while to TAS due to the massive amounts of lag in the level, which makes finding optimal movement strategies more difficult than would otherwise be expected. Also, of all the levels which don’t have a level-end glitch in them, this is the level which is most different from FODA’s TAS of the level (be sure to go to 12:00 of the level-by-level comparison encode to be able to clearly see the differences in movement and strategy used in my TAS).

Beginning of Level

To start off the level, we clip out of bounds. This trick is actually not a TAS-only trick: you could do it in a casual playthrough of Battletoads too if you start off level 9 holding jump and left. It seems that this bug occurs for two reasons: the developers allow you to start the level jumping by holding down the jump button (even though you aren’t on solid ground), and the top part of the wall at the start of the level doesn’t have any collision. Once you are out of bounds, you fall into some out-of-bounds water, which you can then swim downwards through to skip the first hallway of the level.
After this, we do things a little differently than FODA did: FODA went back in bounds at this point, climbed up the level using the jets, killed one player while riding the jets to reduce lag and make the next wheel start moving faster, and activated the checkpoint right before the level-reset event could take place.
Instead, in this TAS, we continue swimming in the below-ground out-of-bounds water. Then, we have one toad clip back in bounds and die from a laser enemy before the section with the jets. After this, the remaining toad quickly swims up through the out-of-bounds water, skipping the slow jets section, and hitting the level-checkpoint right before the level-reset event occurs. When one toad dies, it locks horizontal scrolling, but not vertical scrolling. As such, I have to get far enough to the right to be able to load the checkpoint before I kill the toad.
The astute viewer watching this TAS may at this point be wondering: “You’re already out of bounds, so why do you even bother going back in bounds? Why not just swim straight to the exit?” To that question, my attentive viewer, I answer that you can indeed swim through the out-of-bounds water to the end of the level in about 20 seconds. However, there’s a catch: just like in level 4, you can only activate the end of the level if you have previously activated all checkpoints in the level. Otherwise, when you reach the end of the level, the end-of-level object won’t have been loaded into memory yet, so you won’t go to the next level. Additionally, if you skip a checkpoint, then none of the wheels will load when you reach the next area. As a result of this, we unfortunately have to activate all 4 checkpoints in the level before we can reach the exit (to see the points where I hit each of the 4 checkpoints in my TAS, see 12:18, 12:58, 13:31 and 14:03 of my encode).
It is also worth noting that not every wall broken by a wheel indicates a checkpoint (checkpoints are also accompanied by bonus point numbers appearing on screen and a special sound effect). However, if a given wheel is skipped, then the wheels that follow it will not spawn, and each wheel section eventually ends with a checkpoint wall, which must be destroyed by the wheel to be activated. As such, every wheel must be activated as well. The trigger for a given wheel to start moving is to be within a certain distance from it, and (in the case of any wheel besides the first wheel) to have activated the preceding wheel.
Since my TAS uses such a different route to reach the first checkpoint compared to FODA, it is worth comparing how long it takes for my TAS to reach the first checkpoint compared to how long the currently-published 2 players warps TAS takes to reach the first checkpoint, since it uses the same route that I use. This out-of-bounds segment at the start of this level is one of the laggiest sections of the entire game, with 1 out of every 2 frames being lag frames at the peak of the level’s lag! Using movement through the water which better reduces lag, I am able to save almost a second over the 2P warps TAS, as can be seen in the comparison GIF below (my TAS on the left, 2P Warps TAS on the right):

After The First Checkpoint

With careful movement, I am able to have no lag in this whole section, even though normally there are a few frames of lag when the wheels destroy walls. I am able to clip through the walls by alternating pressing right and neutral every other frame (just like in level 4). However, since the next wheel won’t spawn if I am too far away from it, I can only go so far ahead into the level before I have to wait.
Using a precise jump, I am able to get my toad to stand on the ledge that has a destroyable-wall pressed right up against it. From there, I can alternate left and neutral to clip through this wall, just like any of the other destroyable walls.
Since I have a lot of downtime in this section, I use this spare time to hold both left+right at the same time, which distorts the toads’ positions on the screen. Why did I do this, you may ask? The answer to that question lies in the next section!

After The Second Checkpoint

By shifting my toads up high enough via left+right, I am able to start swimming in the section right after the second checkpoint with 1 of my toads immediately (normally, if you have 1 toad standing by the checkpoint, the screen won’t be low enough down for you to swim into the next corridor, so you just have to wait until the 2nd checkpoint is destroyed to start swimming in it). Since checkpoints only activate when a toad crosses a point under where a destroyed wall used to be, one toad has to stay up on the platform to wait for the wheel to destroy the wall before they can hop into the water.
After this, we embark on the longest swimming section in the whole game. As such, I will make a brief detour to explain how this game’s swim physics work: when underwater, you move much slower than on land. When holding left (or holding right), you slowly build up speed in the direction that you are holding, which maxes out at a certain value. If you bump into a wall, you lose all of your speed, and have to start over from scratch. To swim upwards, you have to press A on certain key frames (the exact timing seems to vary). The only way to swim downwards is to not press A for a while, at which point you begin to sink at a slowly increasing speed. Since you move about 3X slower in water, movement through the air is always faster than movement through water.
In the section with the 3 giant spike columns, I actually swim in-between the gap between the bottom of the first spike and the spiky floor (it’s hard to see this though since my toads’ sprites and hitboxes are very far apart as a result of left+right).
Whenever I reach a land section, I get onto the land as soon as possible, since I can increase my speed to 192 on land (128 is the max you can get from jumping into the air). Eventually, after a lot of patient swimming, we finally arrive at the third checkpoint.

After The Third Checkpoint

A series of normal swimming sections is followed by a longish section running on land. At the end of this land section, player 2 picks up player 1 and throws him above the wall! As it turns out, you can throw one toad out-of-bounds using this technique, since the devs did a bad job programming wall-collision in this level.
The purpose of 1 toad going out-of-bounds and 1 toad staying in-bounds is as follows: the toad that goes out-of-bounds is able to swim underneath the wall at the end of this wheel section (note that this particular wall is in fact the fourth checkpoint in the level), which allows him to get past the wall boundary before the wheel arrives. The out-of-bounds toad then positions themselves so that they will activate the checkpoint on the same frame that the wheel destroys the wall.
While the out-of-bounds toad is waiting for the wheel to break the barrier, the in-bounds toad dies on the perfect frame, such that on the frame after the wall is broken and the checkpoint is activated, the level-reset event occurs. Both toads then respawn at the checkpoint position, which is substantially farther forward then they would have been if they waited behind the wall for the wheel to destroy the wall (as an odd aside, a toad crossing the checkpoint spot must be alive to activate the checkpoint – even though a toad hitting the end-of-level trigger does not need to be alive to successfully end the level!). With all of this done, we are now ready for the final section of this level:

From The Fourth Checkpoint To The End Of The Level

Although we have activated all of the checkpoints, we unfortunately still can’t swim out of bounds directly to the exit to end the level. The reason for this is that besides needing to activate all 4 checkpoints for the end-of-level object to load, the camera also has to pass through the top of the shaft where the end of the level is before the end-of-level object can load. Of course, that won’t stop us from performing more out-of-bounds shenanigans anyways!
Once we reach land, one toad picks up the other toad and throws him out-of-bounds. In the meantime, the in-bounds toad holds left+right at the same time in order to shift their sprite up far enough that the game gets confused and puts them in an out-of-bounds location as well. From here, the thrown toad is able to swim directly into the final water section before the end of the level, and the toad that shifts their sprite is able to fall into the corridor right before the final underwater section (which skips traveling through an entire hallway that FODA went through in his TAS!).
The toads time their swimming here carefully in order to move upwards as fast as possible. Additionally, careful positioning is used to slide between a gap between a spike and the ceiling which your toads were not meant to go through, which saves some time (this trick is actually used in RTA speedruns of Battletoads, though it’s extremely precise, and requires a careful setup to get it consistently).
Once the higher up toad reaches the top of the shaft at the end of the level (thus loading the level-end object), I kill the other toad. This is done because this section has a huge amount of lag, and the lag decreases by a lot when one toad is dead. Nevertheless, the level-end object won’t spawn if I kill 1 toad before loading it. I manage to kill my toad earlier than FODA did, however, which also saves some time.
From here, the farther ahead toad falls down the shaft, weaving through all of the spikes, before finally headbutting into the spikes at the end of the level. The spikes give me a big speedboost forwards, which quickly pushes my mangled corpse into the end-of-level trigger. Since you don’t need to be alive to end a level successfully, this allows for me to successfully beat the level (along with causing some jumbled graphics to appear on the screen). The level-end occurs after the first player to die loses a life, but before the player that hit the end-of-level trigger can lose a life. As such, this player is able to save an extra life (which is good, because player 2 has no extra lives, and would gameover if they died here).
Frames Saved: 1,747

Level 10: The Rat Race

The way level 10 is supposed to go in casual gameplay is as follows: You race a rat to the bottom of a tower, where a bomb is located. If you destroy the bomb before the rat reaches it, then you continue in the level. Otherwise, you die. After destroying the bomb, you start another rat race to a bomb. There is then a third and final rat race after this. After destroying the third bomb, you go to a boss fight at the bottom of the tower, which ends the level.
In this TAS, however, level 10 is going to look quite a bit different from that…
To start off with, player 2 picks up player 1, and then jumps up. When both players are offscreen in level 10, the game keeps continuously scrolling the screen down, which in this case will continue until player 2 throws player 1. Thus, we scroll the screen all the way down to the first bomb, throw player 1, and then destroy the bomb.
After this, something very odd is going to happen. To explain how this works, let’s look at how the game determines when to end level 10:
The boss at the end of level 10 has a boss flag on it, which is set to true when the boss is killed. When the game sees that the boss flag is true, it immediately ends the level.
However, the falling rat has a boss flag set on it also, for some reason. Additionally, the falling rat has infinite health (since your hits are not supposed to be able to kill him). However, when the rat is falling to the ground after destroying the bomb, if you hard hit him and then use a boot attack on him, the game will consider the rat to have died, and thus set the boss flag to true, which immediately ends the level. This skips the second and third rat races, and also the boss at the end of level 10.
For some reason, I was able to save 8 frames over FODA’s TAS here. This is probably due to tighter movement optimizations, but I’m not really sure how or where this timesave occurred.
Frames Saved: 8

Level 11: The Clinger Winger

In this level we have a simple autoscroller, which the TAS can easily take care o- hey wait a minute? Why did player 2 die at the start of this level?
As it turns out, player 2 can’t move on this level on the American release of Battletoads. The reason for this is that during development, the original USA ROM of the game had a timer for when player 1 could start moving and a separate timer for when player 2 could start moving. Unfortunately, player 2 does not have enough time from when his timer starts ticking down to when he can first start moving to avoid being hit. In the Japanese and PAL versions of the game, this bug was fixed by using one timer for both players, and making it start counting down much earlier. Since the game was too hard for even 1 player to make it to level 11 (let alone 2 players), this glitch was never found during beta testing for the American version, and thus made it into the released game. Fortunately, after we gameover with player 2, we can continue the level with just player 1, which ensures that the game is beatable with 2 players. This gameover is the reason why you may have noticed that I strategically made sure that my number of extra lives left for player 2 was 0 at the start of level 11.
At the end of the level, we do an easy boss fight against the BuzzBall, and then its onto level 12! I saved 2 frames here compared to FODA by doing one of the hits on the boss 2 frames sooner.
Frames Saved: 2

Level 12: The Revolution

Player 2 is reunited with us here on this level! Hooray!
In this level, you are on a circular tower. In reality, your coordinates around the tower are based on your x-coordinate, with your x-coordinate decreasing as you run left, and increasing as you run right. When your x-coordinate reaches a certain point, it wraps around (which is equivalent to reaching the other side of the tower). This effectively simulates the movement of the toads in a circle.
The springs that are placed throughout the level each start in a fixed position when the level begins, and rotate around the tower in a fixed rate in a specific direction (thus, they appear to “move” even when you are standing still).
The disappearing green platforms on the other hand do not actually change their position coordinates in the level – they just appear to change position when the tower rotates from a toad moving far enough towards the edge of the screen. The disappearing platforms appear and disappear based on the values in a timer contained in address 0X000B. This timer is set to 0 when the level starts, ticks up by 1 during every non-lag frame, and is paused during lag frames. When it hits what would be 256, it wraps back around to 0 (since it’s a 1-byte number). There are specific values of the timer in which each of the disappearing platforms is set to appear, and values in which they are supposed to disappear.
To start this level off, I use a different attack pattern than FODA or the 2P Warps TAS uses. This method causes me to lose 4 frames in real time due to increased lag, but lets me save a few frames from the timer counting up in 0X000B. As a result of this, I am able to make a cycle for a disappearing green platform that neither FODA’s TAS nor the current 2P Warps TAS could make. This in turn allows me to make it up the next green platform without waiting either, which adds even more to my timesave.
Since the 2P Warps TAS goes through this section in a more optimized manner, I have made a comparison GIF showing this section in my TAS on the left and in the currently published 2P Warps TAS on the right. As you can see, I save over 2 seconds by beating this timer!
One technique that I use often in this level (which was found by feos) is pressing down for a frame while jumping to switch from jumping right at max speed (192) to jumping left at max speed. Normally, if you just press left, you lose all your speed, but this technique allows you to keep it, allowing for faster turns.
At some of the points in the level where the red faces blowing wind appear, I press left+right at the same time as I am approaching the point where they spawn in in order to force the screen to scroll up, which makes them spawn faster. Your y-coordinates get reset to their normal values after you grab the poles to hang on to during the wind, so this doesn’t affect your sprite for the rest of the level.
On the very last red face (at 18:52 in my encode), I move slower to get to the point where I can spawn the red face than I otherwise could do (in real-time). The reason for this is that the faster movement strategy creates a lot more lag, and after the face stops blowing, you still can’t drop down until the spring is right under you (if you fall elsewhere, you’ll land in the void and die, since the screen has scrolled up high enough that the platform is below the edge of the screen). Since the spring moves on a global timer that doesn’t tick during lag, and since the blowing face resets your position on the screen to a fixed value, I would actually lose time using this faster method, and would not make any gains in in-game time either, since I would still need to wait. Thus, because I have to wait anyways, it’s faster to just go slow through here.
I end the level by pressing left+right at the same time in order to make the screen scroll up to hit the end-of-level trigger faster than FODA did. Finally, we get to see object 0X7F get activated normally, as opposed to the way we activated it to skip parts of levels 3 and 5. And with those fireworks done, we can finally jump into the tower for a final showdown with the Dark Queen!
Frames Saved: 697

Level 13: Armageddon

Time for the final boss!
For some reason, if you do a downwards punch for your first hit with the second toad, it won’t register as a hit. For that reason, for my first two hits on the Dark Queen, player 1 does a down punch and player 2 does an outwards punch. I need for player 2’s punch to hit first, because that way, the downward punch will lock the Dark Queen’s vertical position (otherwise, she would go flying to the right).
After this, I use a strategy which saves quite a bit of time compared to FODA and the currently published 2P warps TAS:
One toad jumps up to do a down punch on the queen. Then, the other toad jumps up and punches the Dark Queen’s feet right after she takes damage from the first toad’s punch. This hit on her feet does no damage to the Dark Queen, but what it does do is that it forces her to fall back down to being pretty close to the ground. If I didn’t do this, the Dark Queen would eventually rise up to the top of the screen, and I would have to wait for her to come down before I could hit her again.
The reason why I need to use the downward punch against her is that it has less lag than other attacks, and it doesn’t knock her across the screen like the other attacks do. Taken as a whole, this strategy saves a lot of time, since it forces the Dark Queen to stay in one spot at the center of the screen close to the floor while the other player racks up hit after hit on her without any interruptions.
When her health is low enough, I perform a headbutt simultaneously with both toads to finish her off and beat the game. This is done at the same time because the move creates a lot of lag when it hits, and TAS-timing stops on the final input. As such, if one hit landed first and then I attacked with the other toad, this would be slower than having both attack at the same moment.
With all of that taken care of, Pimple and Princess Angelica are saved, the Dark Queen and her evil minions are defeated, and peace is restored to the galaxy. Hooray!
Frames Saved: 191

Level-By-Level Attribution

(Note: for the purposes of this list, when I say “I,” I mean Lobsterzelda)
  1. I copied the input for level 1 of this TAS from input done by feos. However, I did TAS the level 1 boss, since his input desynced at the boss.
  2. The input for the first half of level 2 is copied from feos. However, I TASed the second half of this level, since it desynced about halfway through.
  3. I TASed all of level 3.
  4. I TASed the majority of level 4. There were one or two hallways where I used input for feos, but there weren’t many chances to do that, since copying input on this level caused immediate desyncs in most locations due to heavy lag.
  5. I TASed all of level 5.
  6. I TASed all of level 6.
  7. I TASed all of level 7.
  8. I used feos’s input for the first 2/3 of level 8. feos’s input desynced near the platforms that shoot out electrical beams right before Robo-Manus, so I had to redo that section. I also TASed all of the Robo-Manus fight.
  9. I TASed all of level 9.
  10. Level 10 was an exact copy of feos’s input.
  11. Level 11 was an exact copy of feos’s input for the autoscroller part. For the boss fight, I TASed it myself.
  12. I TASed all of level 12.
  13. I TASed all of level 13.

Special Thanks

Before I conclude these very long submission notes, I have some people that I would like to thank for their contributions to the completion of this TAS:
• Alyosha – For compiling a WIP of the first eight levels from various other TASes of the game, which acted as a backbone for me to figure out strategies for how to TAS the first 8 levels when I first started my TAS.
• AIVV73 – For pointing out that I could save 3 seconds over Alyosha’s WIP in level 3 by using the void jump to grab the jet faster. Also, this realization prompted me to go back and look more closely at possible earlier timesaves for each of the first 8 levels, which eventually led to me saving 7 seconds over Alyosha’s WIP!

Concluding Remarks

This TAS has been a long time coming. I would like to also thank feos, MESSHUGGAH, and koh1fds for their work in hunting for glitches in the game. Had it not been for their efforts, many of the timesaves used in this TAS would not have been found. I would also like to thank the TASVideos community as a whole for being supportive and encouraging towards me while I was making this project. A single group of people may be able to make a TAS, but it takes a village to make a TASing community. And now, after all of the help that I have received to make this TAS, I hope that I am able to return the favor to the community by giving them back this completed TAS. This TAS has ultimately been the project which I have spent by far the most time on of any project that I’ve worked on (over 4 months!). I hope you enjoy watching it!

Emulator Settings

This TAS was made on BizHawk V. 2.4. The core NESHawk was used.
Last Edited by Lobsterzelda on 5/22/2020 9:09 AM
Page History Latest diff List referrers