Submission #6807: Lobsterzelda's NES Battletoads "warps, 2 players" in 10:44.74

(Link to video)
Nintendo Entertainment System
warps, 2 players
BizHawk 2.3.2
38748
60.0988138974405
48548
Unknown
Battletoads (USA).nes
Submitted by Lobsterzelda on 7/17/2020 1:05:03 AM
Submission Comments

Introduction:

It’s that special time again! The time when a new Battletoads TAS is submitted to obsolete an old Battletoads movie! After obsoleting the ancient 2005-era 2 Players Warpless TAS of Battletoads earlier this year, I decided to try my hand at optimizing the more modern 2 Players Warps TAS of Battletoads. The result is the submission you see before you! Before we get under way, however, let’s go over a brief summary of what the game’s plot actually is (since we’ll be skipping all between-level cutscenes for the purposes of speed).

Plot:

It was a peaceful day in the galaxy, when the evil dark queen kidnapped Princess Angelica and the Battletoad named Pimple! The two were held captive deep under the surface of the planet known as Ragnarok’s World, with all of the dark queen’s minions helping to guard them. In spite of this, the 2 remaining members of the Battletoads, Rash and Zitz, set out on a daring mission to rescue their fallen comrade and the princess. After being dropped off on the surface of Ragnarok’s World, the 2 toads are going to need to use all of their speed and reflexes if they want to survive the journey to the core of the planet, and to win their final showdown against the dark queen. Will the Battletoads emerge triumphant, or will the dark queen succeed in her nefarious quest? Stay tuned to find out!

Controls and Mechanics:

In Battletoads, each toad is capable of a variety of attacking moves. If a toad is running at full speed and presses B, they will do a “ram attack” (during which the toads grow actual ram horns!). At slower speeds, the toads will do an attack which is determined by random chance, which could include booting an enemy offscreen, doing a downward punch, an upward smash punch, and many more.
If you hold right, your toad will slowly build up speed, until their speed caps out at 128. However, if you press right, release right, and tap right again a frame later, your toad will start running with a speed of 192. This technique is of course used throughout the TAS wherever possible to save time.
Some of the levels in the game are 3D, while other levels are 2D. A large portion of these 3D levels, however, are skipped. These skips occur as a result of touching warp portals, which are objects hidden throughout the game which skip you 2 levels forwards. In this particular TAS, warp portals are activated in levels 1, 4, and 6 in order to skip ahead. After level 6, however, there are no more warp portal locations in the game, so we have to advance level-by-level after that.

Common Tricks:

Across the TAS, there are certain tricks which I use repeatedly to save time. Below, I have compiled a list of these tricks, along with a description of how they work. Note that this list doesn’t include tricks that are only used once in a specific level. Those tricks will be described in the individual level descriptions section down below.
RNG Manipulation
In Battletoads, RNG is stored in 4 memory addresses, which are combined several times with the exclusive or operation every frame. Additionally, certain other memory address values also alter the value of RNG each frame. One of these addresses is the address which stores player 1’s input on the last frame. Each of the 8 buttons is given a value between 1 and 128, which are added together to produce a single value that represents what buttons were last pressed. This value is then used to alter the RNG on each frame. Because of this, by pressing select on random frames and a random number of times, we can alter the game’s RNG to work in our favor! Doing this, we can manipulate favorable outcomes without losing any time whatsoever.
Cutscene Manipulation
The cutscenes between each level can generate a different number of lag frames based on the value of RNG. Thus, by doing the RNG manipulation described above, we can save 1-3 frames off of the number of lag frames between each level.
Combining Lag Hits
Certain finishing moves that the toads execute generate multiple frames of lag. However, if both toads perform their finishing move at the same time, then only 1 finishing move will cause lag, but both finishing moves will damage enemies! (for example, if a move takes up 8 lag frames, if both toads do it on two enemies at the same time, then only 8 lag frames will pass, but both enemies will be hit. This is faster than if the toads hit the enemy on different frames, which would cause 16 lag frames to occur instead).
Jump Boosting
In 2D levels, if you are jumping up and pass a specific spot near the edge of a platform you are jumping towards (while below the platform), then the game’s collision detection will cause you to get boosted up so that on the next frame you are on top of the platform. This is able to save about 3-4 frames per jump in sections where this trick is used, which can add up to some nice timesaves in the long run.
Passing Through Checkpoint-Walls
In levels 4 and 9, if you alternate pressing right and pressing nothing every other frame while a checkpoint-wall is to your right, then you can actually clip right through the wall (the same technique works with pressing left when a wall is to the left of your toad).
Left+Right Simultaneously
In 2D levels, a toad’s x-coordinate determines how far to the left or right they are in the level, and the toad’s z-coordinate determines how far up or down the toad is. The y-coordinate is not used in 2D levels, and instead is a fixed constant which doesn’t change. However, if you hold both left and right on the same frame in a 2D level, then the toad’s y-coordinate will start to increase. This causes the toad’s sprite to rise on the screen. Collision with certain objects rises with the toad, while collision with walls, floors and other objects remains in place. If the toad’s y-coordinate gets past 255, it will wrap around to 0, which will cause the toad’s sprite to suddenly fall back down to a normal level. This trick is often used to force the screen to scroll up, or to reach certain locations sooner than would otherwise be possible.

Timesave Table:

Below, I have included a table which shows the length of each level in my TAS, the length of each level in the old 2 players warps TAS by feos and MESHUGGAH, and the amount of time saved in each level. The length of each level is measured as the first frame of lag from the cutscene after a level ends minus the last frame of lag from the cutscene before the level starts (the Dark Queen fight/level 13 is the one exception to this, with the level length being measured as the last frame of input minus the last lag frame before the level loads). Each time is reported in the format minutes:seconds + frames/60, where frames/60 represents the extra frames that don’t fit into a second or minute (there are 60 frames per second, and 3600 frames per minute). For example, a level that took 3760 frames would be listed as 1:02 + 40/60. The frames saved column, on the other hand, just lists the actual number of frames saved between my TAS and the original TAS. Each row is color-coded, with levels with greater timesaves (as a percentage of total level length) appearing in darker green than other levels.

Encodes:

Much like my 2P Warpless TAS, I have 3 encodes for this TAS.
The first encode is just a stand-alone video of my TAS from start to finish. The second encode syncs up the first frame of level 1 of my TAS and the previously published TAS, and then has both TASes play to completion side-by-side (this is the uncut comparison encode). The third encode syncs up each logical section of the game for each TAS, and plays my TAS to completion. When my TAS finishes a section, it waits for the other TAS to finish that section before both continue. Special thanks to EZGames69 for making this impressive encode!
Small Note:
I made some changes to level 12 of my TAS to reduce lag after the uncut comparison and level-by-level comparison videos were made. As such, these 2 videos have level 12s with 2 more seconds of lag in them. This doesn't really change what gameplay looks like, however, since the movement through the levels is the same. My stand-alone video on the other hand shows my final TAS.
Uncut Comparison Encode (my TAS on the left, and the old TAS on the right):
Section-By-Section Comparison Encode made by EZGames69 (my TAS on the left, and the old TAS on the right):

Level-By-Level Analysis:

From here, I am going to give you a level-by-level analysis explaining what I did to make each level of this TAS as fast and as entertaining as possible!

Level 1: Ragnarok’s Canyon

This is one of the few 3D levels you’ll see in this TAS… but don’t blink, or you just might miss it! In 3D levels, you need to kill all enemies onscreen before the screen will scroll right (just like in Double Dragon). After killing the 2 enemies at the start of the game, we jump right onto the platform and hit the first warp portal, which takes us directly to the start of level 3! This skips all of the rest of level 1, and the long autoscroller level that is level 2. This TAS saves a few frames over the previous movie in level 1 by holding Left+Right at the same time after hitting the first enemy, which makes the toad move up on the screen slightly faster than he would by just pressing up, which lets him hit the warp portal a few frames earlier.
Frames Saved: 3

Level 3: Turbo Tunnel

At the start of this level, I save some frames over the old TAS by using faster patterns to kill enemies. Once I reach the jets, you’d probably think that I’m about to TAS the long turbo tunnel section of the game. However, that is not quite going to be the case…
First things first, I grab the jet from below the screen, which lets me void out really quickly. How do I do this, you may wonder? As it turns out, if you press jump when your onscreen height is exactly 256, then the game will let you jump, even if you are not on solid ground. Using this trick, you can seemingly jump out of midair, which is known as “void jumping.” After pulling off this trick, we grab the jet, and void out before hitting the first checkpoint. This chain of events puts the game in a rather unstable condition…
In NES games, memory which is used for in-game values (ex. position, speed etc.) is stored at the start of RAM, and ROM (the assembly code for the game and the static data) is stored much later in memory. Normally, the config pointer (addresses $B7-$B8) is pointed somewhere in memory which contains ROM data. The config pointer loads a couple of objects whenever you restart a level, and stops at a certain point. The 11 byte sequence of values starting at the address referenced by the config pointer is used to initialize the object’s data values, with the byte stored in the address referenced by the config pointer being used to set the object's ID.
When you die on a jet without hitting the first checkpoint, the game writes 0 to $B7 and $B8, which causes the game to start loading objects based on the values stored in RAM which are manipulatable! After you respawn from dying, the config pointer increases by 11 every frame, loading a new object each time. When the config pointer hits address $16, we are in luck - $16 stores the combination of buttons pressed by player 2 on the last frame. By pressing a specific combination of buttons, we can thus make an object with an ID of $7F spawn.
When an object with an ID of $7F loads, the game automatically makes fireworks spawn, and starts a countdown to the end of the level (this is the same object which produces fireworks at the end of level 12). Once this countdown reaches 0, the level immediately ends, and the next level starts, which takes us directly to level 4 – skipping the lengthy autoscroller turbo tunnel section!
I saved about 3 seconds over the old TAS in this level by using the void jump trick to die faster after grabbing the jet. A direct comparison of the time difference between the ends of the two levels can be seen in the GIF below (my TAS is on the left, the old TAS is on the right, and both videos start on the first frame that the falling rat appears on screen):
Frames Saved: 189

Level 4: Arctic Caverns

In this level, you have to destroy several brick walls, which activate checkpoints when you walk past the spot where they were destroyed. If you look at 1:22 in the level-by-level comparison encode of my TAS, you can see one of the first noticeable differences between the new TAS and the old TAS in this level: The old TAS jumps up the corridor before the second checkpoint so quickly using jump boosting that it breaks the level’s scroll function, which jumbles up the graphics for the rest of the level. In the new TAS, I jump up the corridor using jump boosting as well, but with bigger pauses between each jump. Doing this noticeably reduces lag, which saves me 12 frames over the old TAS, and also prevents the graphics from getting all messed up.
On the fourth checkpoint (1:35 in the encode of my TAS), I clip through the checkpoint-wall without breaking the wall or activating the checkpoint. You might be wondering, if I could do this on any checkpoint, then why didn’t I do it on any of the previous ones? The reason is, that when you activate a checkpoint, a lot of the old objects from the last hallway despawn. If you skip these checkpoints, then the objects don’t get cleared. There are only 15 object slots, so the game will eventually run out of space, and having a lot of objects spawned also generates a lot of lag, which slows things down. Thus, I wait until this point to skip a checkpoint, since I can make it from here to the warp portal at the end of the level with the current number of objects spawned.
In the hallway immediately after the 4th checkpoint, I hold Left+Right at the same time while on a slope which points upwards. Your y-position normally only shifts in this level when you are on an upward slope holding L+R. However, if you stand on the edge of a slope about to fall off and start pressing L+R, then your y-position will keep increasing after you fall, which saves time! When your y-position hits 255, it wraps around to 0. Since you are on an inclined icy slope, this causes you to clip through the floor and get pushed into an out-of-bounds section between two floors. Holding L+R again in midair causes you to get pushed to the right and downwards, which pushes you onto the floor below where you previously were, which skips an entire hallway!
From here, if we don’t get to a certain x-position which is farther to the right, then no objects will spawn from this point on (which includes the warp portal), since the config pointer doesn’t increase until the camera passes certain spots. Once we hit that spot, we move left in such a way that the config pointer starts increasing, but increases slowly enough that we can run past the checkpoint-wall before it spawns (you can see it appears after I run left past it).
From this point on, the lag gets kind of out of control, since there’s a lot of stuff loaded onscreen. However, once I reach the snowman down on the next hallway, a lot of objects despawn, and everything goes back to normal again.
I jump through the yellow spike in this hallway by holding down (the game lets you pass through it as long as you hold down, even if you’re in midair). Then, I clip through the next checkpoint wall. The level 4 warp portal appears once the falling platform falls low enough, and it activates when your sprite touches it. Thus, 1 player falls on the falling platform to spawn the warp portal, and the other toad has their sprite shifted up high enough from holding L+R that when they jump, they immediately hit the warp portal. The warp portal skips us past Surf City, which allows us to go directly to level 6.
Frames Saved: 13

Level 6: Karnath’s Lair

At first glance, it may seem like this level is just an autoscroller with nothing you can do to finish the level any quicker. However, this is not quite the case – by moving the camera at specific times in the level, you can make the snakes turn their heads slightly faster. Using this, I am able to save a few frames over the old run.
In the meantime, however, the toads still have plenty of downtime while they wait for the snakes to move – downtime which they spend playing leapfrog and punching each other!
Unfortunately, if you shift your y-position in this room with L+R, then you can’t touch the exit hole at the end. This prevented me from making a much more entertaining TAS of this room. Nevertheless, I have included a video of this attempt here, so you can see what could have been…
At the end of this first room, I do a precise jump onto the edge of the blue snake’s head, and then quickly jump from there to the exit hole. Almost all of the snake’s collision occurs behind the top of its head, but there’s one tiny patch near the end of its head that you can stand on. Landing on this spot thus lets me reach the exit hole a little faster.
In the next room, Rash head butts Zitz to push him past the spikes without waiting for the snake to reach that section of the room. From there, Zitz runs into the warp portal, which skips us past Volmkire’s inferno, and takes us to level 8.
Frames Saved: 13

Level 8: Intruder Excluder

We start this level off by holding L+R to force the camera to scroll up. Once the camera reaches a certain point on the level, we activate the mid-level checkpoint. A toad then dies to make us respawn at the actual mid-level checkpoint, which skips having to slowly climb up the level using the platforms.
After this, we use some jump boosting to climb up each of the platforms faster. We eventually reach the section with moving holes in platforms with electricity in between them that flashes on and off. Fortunately, we can jump through these holes while the electricity is still active by jumping through the very edge of the platform, which boosts us up, and skips having to wait for the electricity to stop. Once we reach the top of this level, we are confronted with our first boss of the TAS: the dreaded Robomanus!

Robomanus:

Robomanus jumps and fires his gun at times which are determined based on a global timer, which means we can’t really manipulate this (Robomanus firing his gun generates lag, so ideally, we would want to minimize the number of shots he fires).
Nevertheless, there’s plenty that we still CAN manipulate in this fight. Rash and Zitz start this fight off by running forward and repeatedly doing down-smash attacks on Robomanus. The down-smash attack generates the least lag of any attacking move, so we manipulate RNG here by pressing random buttons to ensure that every attack is a downsmash.
When Robomanus is about to jump away, we use a well-timed downsmash to knock him back to the ground, at which point he starts firing his gun. However, both toads are far enough to the right that they are past the spot where the bullets appear at the end of Robomanus’s gun, so they can keep attacking him without having to move out of the way. Once his health is low enough, we use a ram attack, and knock Robomanus off the stage!
This TAS saves about half a second on the Robomanus fight by not getting crushed during the fight (the old TAS had a toad get crushed by Robomanus as a speed/entertainment tradeoff).
Frames Saved: 35

Level 9: Terra Tubes

Up to the First Checkpoint:

To start this level off, we clip out-of-bounds to the left. As it turns out, this trick is not TAS-only: If you reach this level of the game and hold jump and left as the level starts, then you too will jump in midair and land in the out-of-bounds water at the start of the level.
You might be wondering at this point, “if you’re already out-of-bounds, why not just swim straight to the exit and end the level?” To that I answer, that you’re correct – we can swim to the level exit from here. But, there’s a catch: unless you’ve activated all of the checkpoints in the level, then the level exit won’t work. As such, we need to activate all 4 checkpoints (by breaking a checkpoint wall and walking past the spot where the wall used to be) in order to beat the level (The spots in my encode where I activate a checkpoint occur at 3:42, 4:21, 4:54, and 5:27).
But in any event, let’s get back to discussing the out-of-bounds water at the start of level 9. From here, we swim downwards to skip past a hallway we would normally have to go through. This section is one of the most lag-heavy sections of the entire game, so careful movement through the out-of-bounds water is needed to save time. After a little bit of swimming, one toad then clips back in-bounds to die, which reduces the amount of lag per second by a lot. However, we now enter into a race against the clock: the living toad needs to make it to the checkpoint before the level-reset occurs as a result of the other toad dying. After swimming through some out-of-bounds water, we reach the spot on the screen where the first checkpoint is activated (which conveniently doesn’t require breaking a wall to activate – you just have to walk past a certain spot on the floor). After this, the toad dying forces the level to restart, and since we have activated the first checkpoint, both toads respawn at this checkpoint, which actually pushes both toads a bit further to the right on the screen. Note that we can’t kill the first toad any earlier, since the screen locks horizontally when a toad dies (but not vertically). As such, we have to keep the toad that dies far enough to the right that we can reach the first checkpoint, which means we can’t get hit by the laser any sooner than we actually do. This whole sequence of events also skips the slow climb up to the first checkpoint using spinning tops, which also saves a nice chunk of time!
This TAS uses a different path through the out-of-bounds water than the old TAS, which reduces lag by a lot, and saves almost a second! To see a side-by-side comparison of how my TAS saves time in this section, check out the GIF below (my TAS on the left, the old TAS on the right):

After the First Checkpoint:

Rash and Zitz now find themselves being chased by a series of gears. When a gear reaches a wall, it destroys it, although we can just clip through the walls. These walls don’t actually activate checkpoints – they are just regular walls (see the second paragraph of this level description for a list of the spots where each actual checkpoint is). However, we can’t just skip past them altogether, because the next gear won’t spawn until the previous wall is destroyed and the toads walk through a specific position near the next gear. Each gear section in this level ends with an actual checkpoint-wall which must be destroyed to be activated, so this in turn means that we can’t actually skip any of the gears. We can however clip through each wall and move to the leftmost edge of the threshold for activating the next gear while we wait for the previous gear to destroy the previous wall, however.
Since we have some time to wait in this section, I use this extra time to hold L+R at the same time to shift the toads’ sprites up. The reason why I do this isn’t immediately obvious, but it will become clear soon enough. At the end of all of these gear sections, there is a checkpoint wall, which activates the second checkpoint of the level. One toad has to wait for the gear to destroy the wall before falling into the water, since you can only activate the checkpoint by walking on land through the spot where the wall used to be after it was destroyed. However, the other toad can start swimming through the next section. Because we shifted the toads’ y-positions so much with L+R, the other toad can actually reach the hallway to swim to the next room even though the screen is normally too high up for you to reach it until after the checkpoint is destroyed and both toads have fallen in the water. As a result of this, we can get a head start swimming through the next section of the level, which also saves a bit of time over the previously published movie.

After the Second Checkpoint:

At this point, we enter the longest swimming section of the game. In case you were wondering, in Battletoads, you press jump to swim up, and once your previous jump has stopped moving you up as much, you can press jump again. To swim down, you just do nothing. Swimming left and right is exactly how you would imagine it’s done: you just hold left or right. When you punch, you get frozen where you are in the water, which is useful for staying in one spot without falling or swimming up.
Now then, back to the section at hand. We swim through a tiny gap between the spike pillar and the spikey-floor in the next room, although since the toads are shifted up so much, you can hardly tell when it happens (to see this more clearly, you can look at 4:26 in my encode for the moment where Zitz, the yellow toad, passes through this gap).
We soon reach a brief land section containing an enemy. Since collision detection for most enemies moves with the toads' sprites, we can run straight through this enemy without taking any damage – a nice little perk of messing up the toads’ positions!
Once we fall back into the water again, we enter a section where the number of lag frames that occurs is based on the position and attack pattern of the enemies in the water, which in turn is based off of RNG. I save 4 frames in this hallway over my 2P Warpless TAS using RNG manipulation to get less lag in this hallway.
After a few more water rooms, we pass through another tiny gap between a spike and the spikey-floor to save time, and then we activate the third checkpoint (which is activated by swimming through the spot just before where the first underwater wheel starts moving).

After the Third Checkpoint:

For the first gear, we just have to wait around for it to destroy the next wall, since we can’t clip past this wall underwater. After we activate the second gear, however, things get interesting.
Once the toads reach land, one toad picks up the other toad and throws him while jumping, which causes the toad to land out-of-bounds. From there, one toad swims out-of-bounds and one toad swims inbounds through the next section. The out-of-bounds toad can actually swim past the third checkpoint (the next underwater wall). While this happens, the in-bounds toad dies and starts the timer for the level-reset event occurring. On the same frame that the gear destroys the wall, the out-of-bounds toad is standing on the right spot to instantly activate the next checkpoint, and the inbounds toad dies on the perfect frame so that the level restart occurs right now! When both toads respawn, they are significantly further to the right, which saves a nice chunk of time. The reason why this trick requires one toad to clip past the wall is that if I didn’t do that, then the toad would get crushed by the gear before activating the checkpoint, which would prevent the checkpoint from being activated. This would require us to wait in the underwater pit for the gear to pass over us, which would be much slower.
In this particular section, I save 20 frames over the old TAS by making sure the level-restart event happens on the same frame that I activate the checkpoint (the old TAS has the level-restart event happen 20 frames after activating the checkpoint).
From here on out, we’re in the home stretch of level 9!

After the Fourth Checkpoint:

After some brief underwater swimming, we hit another land section. At this point, one toad jumps up and throws the other toad out-of-bounds, similar to what I did to get out-of-bounds before the fourth checkpoint-wall. The other toad then holds L+R until their y-coordinate wraps around to 0, which lets them clip out-of-bounds as well.
Since we’ve now activated all of the level’s checkpoints, you may be wondering once again why we can’t just swim through the out-of-bounds water to the level exit? If only things could be so simple… In order for the level-end object to load properly, the toads must pass through specific points in this section in order to increase the config pointer enough to load this object (the config pointer increases whenever a new object loads). Because of this, we have to take a route where one player falls back in bounds at the start of the last underwater section, and the other player clips directly into the last underwater section. Nevertheless, taking this route skips traveling through an entire hallway, so this still results in a large timesave over the alternative.
From here, we swim through another gap between a spike and the spike-wall, and then one toad kills himself on the spike as the other toad starts falling through the air in the last section of the level. The reason why this toad waits until now to kill himself is that if he dies any earlier, the end-level object won’t spawn, which means the other toad won’t be able to hit the level-end. In case you were wondering, killing one toad reduces lag here, which is why I even do this in the first place.
The toad that’s still alive weaves through the spikes as they fall before headbutting into the level-end trigger at the bottom of the pit. The falling toad actually dies on the spikes to get boosted right into the level-end trigger, but the game doesn’t check if you’re alive when you reach the end of the level, so this still lets us successfully beat the level! (even though the game does make sure you’re alive before you can activate a level checkpoint). The level-reset event from the first toad dying tries to occur after we end the level, which causes the graphics to jumble up for a little bit. This lasts until the level-end timer finishes counting down to 0, at which point we are taken to level 10. Now that level was an ordeal! Luckily for us, the next level will be much simpler!
Frames Saved: 199

Level 10: Rat Race:

The way that level 10 normally goes is as follows: you race a rat to the bottom of a tower in order to kick a bomb before the rat reaches it. If the rat gets there first, you die, and have to try again. After you hit the first bomb, the rat falls down, you fall down to the next floor, and this process repeats 2 more times. After winning the third rat race, you fall down into a pit with the boss General Slaughter. After you kill General Slaughter, you beat level 10, and move on to level 11. However, this is too time-consuming for a TAS to do, so we have some other tricks up our sleeves!
To start off with, player 2 picks up player 1 and jumps up into the air. Due to a glitch in how level 10 was programmed, if you jump up while holding another toad, then you keep scrolling down the screen continuously until you throw the other toad. Once you throw the other toad, however, you start falling normally from the top of the screen. Using this technique, we fall directly to the first bomb and then throw the toad. After this, player 2 kicks the bomb, and the rat starts falling down.
The way level 10’s logic works is as follows: when a boss flag is set to true, the level automatically ends. The boss flag can be set to true by killing a boss (any boss). As it turns out, the rat in this level has both infinite health and a boss flag set on him. If you hit the rat as he’s falling, and then hard hit him with a kick, then the game thinks that you killed the rat, which sets the boss flag to true, and causes the level to end instantly!
When the rat falls, one toad runs right and headbutts him (for some reason, the game won’t let you jump until after the rat has started to fall after being headbutted). Then, the other toad jumps up and kicks the rat as he’s falling on the first frame that the rat is vulnerable, ending the level right away!
The frame that you kick the bomb on determines the rat’s position when he falls, since the rat’s position is constantly moving back and forth as the rat bounces off the level walls. By waiting 1-2 frames after falling, the rat will have an x-position high enough that we can hit him with a kick while pressed up against the wall, which saves time over trying to do a midair kick after the rat falls. The old TAS waited an extra frame that it didn’t need to wait before kicking the bomb, which is why this TAS saves time in level 10.
Frames Saved: 2

Level 11: Clinger Winger

To start this level off, player 2 gets a gameover. Why, you may ask? The answer is that there are two timers which control when players 1 and 2 can start moving. Since the game developers never made it to this level with 2 players, they never noticed that player 2 doesn’t have enough time to move before he gets hit by the BuzzBall and killed. Fortunately, we can continue this level with just player 1, which allows us to finish the TAS off.
After an uneventful autoscroller section, it’s time to fight the BuzzBall. As it turns out, this is a fairly easy boss – you just keep ramming him to the right against the wall until he dies. I saved 2 frames on the boss fight by having a slightly faster first hit than the old TAS. We are able to get player 2 back by pressing start on player 2’s controller during the cutscene before the start of level 12, so the toads can be reunited in the next level. I do always love a happy ending!
Frames Saved: 2

Level 12: The Revolution

This level contains many moving springs and platforms which appear, move and disappear based on a timer which is initialized to 0 when the level starts, and ticks up by 1 for every non-lag frame. Throughout the level, we use a trick discovered by feos that saves time, which is that you can press down while jumping at max-speed and then switch directions in midair without losing any speed. We start this level off by killing the first enemy with a pattern that causes more lag (and thus takes more total frames) but takes up a smaller number of non-lag frames than the old TAS did here.
As a result of this different lag pattern, we make it to the last green disappearing platform a few frames earlier than the old TAS did, which gives us just barely enough time to make it up to the next platform. This in turn also lets us skip waiting on the next section with a disappearing platform, which combines to enable me to save 3 seconds! For a direct comparison of the differences between my TAS and the old TAS in this section, see the comparison GIF below (my TAS on the left, the old TAS on the right):
Once we reach the section with the bouncing springs, we encounter yet another timesave, which is a result of tapping R, releasing R and repressing R on the right frame, which lets us jump off the springs with a horizontal speed of 192, instead of the usual spring speed of 64. Special thanks to PJ for pointing out that this trick could be used throughout level 12 to save time!
Aside from these timesaves, the next few sections of climbing up the level are pretty straightforward – killing enemies and jumping up platforms. However, once we reach the red faces that blow bubbles, we encounter another massive timesave!
The red faces normally generate a massive amount of lag when they blow bubbles. However, I discovered that the number and direction of bubbles that they generate is based on RNG. As such, by pressing select a random number of times before they start blowing, I am able to considerably lessen the total number of lag frames they generate. The faces keep blowing for a fixed number of non-lag frames, so doing this strategy allows me to save a lot of time. In fact, it saved me 3 seconds in lag reduction on my first attempt to TAS this level!
After finishing this TAS, I went back and wrote a brute-force script which would press select a random number of times until it generates the least number of lag frames at each of the red blowing face sections. Using my script, I was able to shave another 79 frames off of my final time for this level!
As an aside, I also hold L+R at the same time when I am near the spot where each of the red faces spawns, since this forces the camera to scroll up, which in turn makes the faces appear sooner. After grabbing the pole, your y-position is reset back to normal, so your sprite is fixed after the faces stop blowing. As a result of a faster spring section, I reach the final red face much faster than I did in my original TAS of the level. After the last face stops blowing, you have to wait for the spring to move under you, since if you fall down anywhere else, you void out. However, with how fast I made it here this time, coupled with holding L+R at the same time to make the last red face appear just a handful of frames sooner, I am able to just barely land on the edge of the spring as it goes around the tower 1 cycle earlier than I could in my original TAS of this level in my 2P Warpless TAS. The spring takes 128 frames to move in a complete circle around the tower, so this in turn saves me an extra 128 frames in this section of the level!
Once I reach the end of the level, I hold L+R at the same time and jump up, which forces the camera to scroll up high enough that the game loads the object with ID 0X7F (which it normally only loads when you actually reach the top platform of the level, as opposed to just shifting your sprite upwards which I’m doing here). Much like in level 3, this generates fireworks, and triggers the end of the level. It also skips the last section of platforming before the end of the level, which allows us to reach the dark queen just that much faster!
Frames Saved: 596

Level 13: Armageddon

At long last we’ve made it to the final showdown with the dark queen! For some reason, player 2 can’t do a downward punch until after player 1 hits the dark queen once. As such, player 2 does a regular punch, and player 1 does a downward punch, which cancels the dark queen’s horizontal momentum, and prevents her from flying horizontally across the screen.
After this, the toads pummel the dark queen with downward punches, since this is the attack which generates the least number of lag frames. Every time one toad does a downward punch on the dark queen, the other toad does a neutral punch on the dark queen’s feet immediately after. This neutral punch doesn’t hurt the queen, but it forces her to fall back to the ground, since she usually rises up a little higher after each time you hit her.
After repeating this pattern for a while, we use a ram attack to finish the dark queen off, and just like that, we’ve beaten the game! The old TAS knocked the dark queen back and forth across the screen with ram attacks for much of the fight, which is why the technique of using alternating downward punches and neutral punches to prevent the dark queen from moving horizontally and vertically respectively are able to save a whopping 2 and a half seconds over what was originally a 13 second fight! Now that’s what I call teamwork!
Frames Saved: 150

The TASing Process:

Below, I’m going to briefly describe how I created the input for each level in this TAS:
  • I TASed levels 1, 3, 4, 6, 8, and 10 from scratch when I made this TAS.
  • Level 9’s input was mostly copied from input I made when TASing level 9 in my 2P Warpless TAS. However, I alternated where/how many times I pressed select to change RNG to match up to what I wanted, which also allowed me to save 4 frames over my 2P Warpless TAS. Unfortunately, this also required me to completely redo the section between activating the third and fourth checkpoints of the level.
  • Level 11 was copied from input I made in my 2P Warpless TAS with 0 changes.
  • Level 12 was originally copied from my 2P Warpless TAS with minor alterations for RNG manipulation. However, after discovering that faster spring jumps could save time, I pretty much redid the entire level from scratch, which saved me an additional 2 seconds over what I did in my 2P Warpless TAS for this level.
  • Level 13 was completely copied from input I made in my 2P Warpless TAS, although I had to add select presses at random points to manipulate each toads’ attack so that they would do a downward punch for each of their attacks.

Potential Timesaves:

No TAS is perfect and this TAS is no exception.
  1. Level 4 Skip: Theoretically, it should be possible to spawn a warp portal in level 3 instead of the level-end object, which would allow us to warp directly to level 5. In level 5, there is another glitch that works the same as the level 3 jet glitch, which would let us skip to level 6 in just a few seconds. Thus, we could completely skip level 4, and would save over a minute compared to this TAS (which would easily push this TAS to sub 10 minutes)!

    Unfortunately, while I believe I have come close to figuring out a way to get the warp portal to spawn and activate, there are a few things that just barely don’t work, which prevent this trick from being possible. If I were to describe all of the details of how this trick could work and what’s left that I need to discover to actually make this trick work, then this submission could easily be about 50% longer than it currently is. Fortunately for the interested reader, I have included a link to a series of forum posts I made in the Battletoads game thread which describe my findings: Level 4 Skip Information

    It’s worth noting that I have set up a $50 bounty that lasts until the end of 2020 if someone can find a way to get this skip to actually work or if they can provide me with information that leads to me being able to figure this out. Some of the things I need don’t require in-depth knowledge of how the game works, and could be found by doing repeated trial and error. Will you be the one to discover the most elusive glitch in Battletoads history? Only you have the answer to this question!
  2. In the arctic caverns, I could save between 5-7 frames by using a trick where you pause and unpause the game to maintain your speed after changing directions while falling. To see what this trick actually looks like, you can examine the video below:


    The main reason why I didn’t include this trick in this TAS is that I didn’t know about it until after I finished TASing level 4, and in the section right after this trick is used (where you need to clip through the slope), there is a huge amount of lag, and the position for the optimal clip is very difficult to get. Also, the further apart your toads are, the more lag you generate, and the number of lag frames you get here is very hard to manipulate (furthermore, doing this trick seems to make one toad get slightly further ahead than the other toad compared to not doing this). In fact, it took me 2 days just to TAS these 4 seconds of gameplay the first time! As such, I am leaving this as a potential improvement for the next brave spelunker who wants to explore the world of creating Battletoads TASes.

Special Thanks:

This TAS would never have been possible were it not for the help of the following people:
  • feos: For creating many of the original strategies/routes through levels which were used in this TAS, for being the one to discover how the level 3 jet glitch actually works, for creating the old 2P Warps TAS, and for answering any questions I had about Battletoads mechanics while I was making this TAS.
  • MESHUGGAH: For helping to create the old 2P Warps TAS
  • Alyosha: For creating highly-optimized TASes and WIPS of the game which helped me to learn how to TAS Battletoads when I started making my first TAS of Battletoads in January 2020.
  • Koh1fds: For discovering many of the tricks and glitches that made this TAS possible.
  • PJ: For pointing out in the discussion thread for this movie that I could save time using full-speed dashjumps on the springs in level 12, which led to me redoing level 12 and saving an additional 2 seconds!

Concluding Remarks:

This TAS is a continuation of the work I did on my 2 Players Warpless TAS of Battletoads, which means that this TAS is a continuation of the project that I have spent the most time on of any game that I have TASed. I hope that you enjoy the fruits of my labor, and I hope that you enjoy watching this TAS!

Memory: Claiming for judging
Memory: Updating file with 147 frame improvement.
Memory: TASVideos do you have Battletoads?
This is another toadally amazing Battletoads movie from Lobsterzelda, with cool tricks and out of bounds. Audience reception was also great.
fsvgm777: Processing. Note to self: Inherit tier. Delaying publication per this post (improvement pending)
Memory: Replacing file with 79 frame improvement.
fsvgm777: Processing (for real this time). Note to self: Inherit tier.
Last Edited by adelikat on 11/5/2023 2:51 PM
Page History Latest diff List referrers