TASVideos

Tool-assisted game movies
When human skills are just not enough

Submission #6822: Lobsterzelda's NES Battletoads "warpless, 2 players" in 19:19.76

Console: Nintendo Entertainment System
Game name: Battletoads
Game version: USA
ROM filename: Battletoads (USA).nes
Branch: warpless, 2 players
Emulator: BizHawk 2.3.2
Movie length: 19:19.76
FrameCount: 69700
Re-record count: 133839
Author's real name:
Author's nickname: Lobsterzelda
Submitter: Lobsterzelda
Submitted at: 2020-07-26 04:32:46
Text last edited at: 2020-08-02 05:17:00
Text last edited by: ThunderAxe31
Download: Download (61407 bytes)
Status: decision: delayed
Submission instructions
Discuss this submission (also rating / voting)
List all submissions by this submitter
List pages on this site that refer to this submission
View submission text history
Back to the submission list
Author's comments and explanations:

Introduction:

Judging by the average length of time between obsoletions, the next improvement to the Battletoads 2P Warpless category is not expected to be published until June 2035. However, we can surely make a new movie faster than that! With this logic in mind, I present to you a new 2P Warpless TAS of Battletoads which beats the game in 19 minutes and 19 seconds, and more to the point, is submitted 15 years ahead of schedule!!! Now, wouldn’t it be great if that could happen with video game releases in the real world?

Submission Format:

The submission notes I made for my last 2P Warpless TAS were extremely long and comprehensive, and basically explained every glitch and route used throughout the TAS. If I tried to include the same level of detail here, then this submission text would be more or less the same length as my old submission notes, with 95% of my explanations copied word-for-word from my previous submission. As such, I have decided to recommend that viewers seeking an explanation of the tricks and routes used in each level should check out my old submission notes from the last movie, which can be found here: http://tasvideos.org/6758S.html

Normally, I don’t like to tell viewers to look at an older movie for an explanation of tricks used in a new TAS, since this often leads to a wild goose chase where one TAS says to look at a second TAS for info, the second TAS says to look at a third TAS for some more info, and the third TAS says to look at a fourth TAS etc. etc… However, since all the information about glitches and routes in this TAS can be found there, (minus the new improvements in this TAS) and since it cuts out a massive amount of redundancy, I have decided that this is the better option here…

Personally, I recommend that if you didn’t read my submission notes for the last movie and don’t understand something in this movie, that you go back and read my old submission notes first, and THEN read these submission notes. If you’ve already read the old submission notes, however, then you can skip this step.

Timesave Table:

Once again, I have included a table which shows the relative time difference between levels in the old TAS and levels in the new TAS. Each row of the table measures the length of a level as the first frame of lag from the end-of-level cutscene minus the last frame of lag from the cutscenes that play before the level starts (the one exception to this is level 13/the dark queen fight, which ends timing on the last input, and starts timing on the last lag frame before the player gains control of their toads).

Each time is reported in the format Minutes:Seconds + frames/60, where frames/60 is the extra frames that don’t fit into a minute or second (there are 60 frames in a second, and 3600 frames per minute). For example, a level with a length of 310 would be listed as 0:05 + 10/60, since the level takes 5 seconds plus 10 extra frames. The frames saved column, however, just lists the total frame difference between each level, with no mention of seconds or any other unit of time. Each row is color-coded, with levels in darker shades of green representing greater timesaves (as a percentage of total level length). Furthermore, levels in white represent levels with no time gain or losses, and levels in pink represents levels where I lost time (more explanation on that down below).

TASing Process:

  • The first 3 levels were copied from my original 2P Warpless TAS.
  • The first half of level 4 was copied from my 2P Warps TAS. I then re-did, the next third of the level, and ended this by using the input from my 2P Warpless TAS to end the level.
  • Levels 5, 6 and 7 were copied from my 2P Warpless TAS.
  • Levels 9, 10 and 11 were copied from my 2P Warps TAS
  • Level 12 was mostly copied from my 2P Warps TAS, but was also changed to save time.
  • Level 13 was copied from my 2P Warpless TAS

Encode:

For this particular TAS, I have only made 1 encode of my movie, which shows my new movie alone. The reason for this is that only 2 levels (levels 4 and 12) have timesaves which are visible to a viewer. Don’t worry – in the sections where I describe the timesaves in each of those levels, there will be individual level comparison encodes!


(Link to video)

Level-By-Level Improvements

From here, I am going to describe what I did in each level to improve upon my previous movie.

“Hidden Timesaves”

There is a timesave of a few frames which doesn’t occur during any of the levels. The reason why is that this timesave occurs from getting less lag from the cutscenes between levels. How much lag you get is based on RNG, which can be altered by pressing select at random points before the cutscenes start to save a frame or two between each level. This technique is used to save time on almost all transitions between levels in this TAS.

Level 1: Ragnarok’s Cavern

There is no change in this level compared to my original TAS.

Frames Saved: 0

Level 2: Wookie Hole

There is no change in this level compared to my original TAS.

Frames Saved: 0

Level 3: Turbo Tunnel

There is no change in this level compared to my original TAS.

Frames Saved: 0

Level 4: Arctic Caverns

Finally – a level with some time saved in it! I hope you didn’t get so bored reading about the first 3 levels that you skipped the rest of this section entirely!

To start things off, here is a comparison video which shows the level 4 from my new TAS on the left, and the level 4 from my old TAS on the right:


(Link to video)

In the first section of this level (the first 3 checkpoints), I save about 12 frames by moving in a way that reduces lag. This also has the effect of not messing up the level’s scroll function, so unlike my old level 4 TAS, the graphics aren’t corrupted in the second half of this level.

At 0:31 in my level 4 comparison video, I use a new strategy to save about 15 more frames. What I do here is that I hold right at full speed while I jump against a wall, and keep holding right after I hit the wall. Then, once I’ve fallen far enough, I pause, switch to holding left on the next frame, and unpause on the frame after that. The result of all of this is that I go from moving right with max-speed to moving left at max-speed in a handful of frames, which lets me land past the first ice pillar when I land from this fall (which I couldn’t do in the old TAS). Additionally, I bonk my head on a specific point on the ceiling of this section which allows me to start falling faster than I normally could otherwise (the ceiling here is a series of zig-zag lines like a zipper, and only one specific spot pushes me down really quickly after I jump).

The next spot where I save time occurs at 0:40 in my level 4 comparison video. In my old TAS, I held Left+Right at the same time until my y-position wrapped around past 255, at which point I fell down through the floor. I then held L+R again after landing out of bounds to clip further down into the next hallway. In this new TAS, I start holding L+R while I’m sliding backwards on the slippery slope. As a result, I fall off of the slope while my y-position is increasing, which causes it to keep increasing while I’m falling! (normally, your y-position only changes in level 4 when holding L+R while standing on the ground). Additionally, once I clip through the floor, I hold L+R to clip further down into the next hallway without landing on the out-of-bounds platform first. As a side effect of all of this, my y-position is too low to be able to pick up the upcoming ice-block, so I have to hold L+R a little longer to rise up high enough to grab the next block. I also save a little bit of time in this hallway by alternating pressing right and neutral to clip through the invisible walls, which is faster than what the old TAS did of holding down to clip through the walls (which also reduces your speed by a lot). These invisible walls seem to exist because the room was loaded in a bizarre way, and the checkpoint-walls haven't had time to correctly load into place, but truth be told, I'm not really sure what creates the two of them. All told, this segment finishes with me gaining another 20 frames over the old TAS.

In the final section of the TAS (1:08 in my level 4 comparison video), I save about 15-20 frames over my old TAS by hitting the end-of-level marker slightly faster using better lag reduction.

After all of this, we finish level 4 almost a second faster than the old TAS did!

Frames Saved: 59

Level 5: Surf City

There is no change in this level compared to my – hey wait a minute! How did I save time here? As it turns out, by holding left at a slightly different time, I am able to fall out-of-bounds 1 frame faster, which accounts for this level’s timesave. If you’re curious why this level ends after voiding out, however, then you should check my original submission notes for level 5 for a detailed explanation of what’s going on here.

Frames Saved: 1

Level 6: Karnath’s Lair

There is no change in this level compared to my original TAS.

Frames Saved: 0

Level 7: Volkmire’s Inferno

There is no change in this level compared to my original TAS. It’s worth noting that the sections with the fireballs and the falling missiles are determined completely by RNG, which can be altered by player 1 pressing select a random number of times. As a result, I was able to easily resync this level without changing any of my inputs (besides pressing select, of course).

Frames Saved: 0

Level 8: Intruder Excluder

I don’t save or lose any time on the section up to Robomanus on this level. At Robomanus, however, I did lose 2 frames compared to my old TAS. Robomanus fires his weapon and jumps based on a global timer which can’t be manipulated. As such, based on when I reached the start of the fight, a little more lag happens during the fight. Well, you can’t win them all!

Frames Lost: 2

Level 9: Terra Tubes

I saved 4 frames in this level from better lag reduction during the long underwater swimming section.

Frames Saved: 4

Level 10: Rat Race

I saved some time on this level by cutting out an unnecessary delay in time before kicking the bomb (you have to delay a little to be able to kick the rat when you’re pressed up against the wall, but my old TAS delayed more frames than was necessary).

Frames Saved: 2

Level 11: Clinger Winger

There is no change in this level compared to my original TAS.

Frames Saved: 0

Level 12: The Revolution:

Finally! We’ve arrived at the meat of the timesave from this TAS! To start things off, here’s a comparison video between level 12 in my new TAS (on the left) and level 12 in my old TAS (on the right).


(Link to video)

In this level, I’m able to save a nice chunk of time by using faster jumps off of the springs. Normally, you jump off the springs with a speed of 64, but if you press and release right frame-perfectly, then you can jump with a speed of 192, which speeds things up quite a bit.

The biggest timesave in this level comes about as a result of reducing lag on the 4 sections with red faces that blow bubbles. By pressing select a random number of times, you can alter RNG, which alters the direction and number of bubbles that the faces blow. This in turn alters the number of lag frames that the faces cause. Since the faces blow for a fixed number of non-lag frames, all the lag frames you save translate into frames of real timesave, which saves about 3 seconds-worth of time.

In order to find the fastest pattern of bubbles blowing, I wrote a lua script to help simulate through many possible outcomes. What my script does is that it starts on a specific frame, and then tries pressing select a random number of times until the timer in address 0X0B reaches a specific value that it hits when the faces are done blowing wind (0X0B is a timer which increments by 1 on every non-lag frame, and stays the same on lag-frames, so it acts pretty much the same as counting the number of lag frames). My script would simulate through 100 tries of pressing different combinations, and then report which frames to press select on to get the least number of lag frames. Technically speaking, I made 4 copies of this script, since each one needs a different value for 0X0B, but since they’re all basically the same script, I’m just listing my script for the first red blowing face here:

Red Face Lua Script:

  math.randomseed( os.time() )
  file = io.open("resultsOfScriptFile.txt", "w")
  io.output(file)
  currentBestNum = 370
  tempBest = 600

  for numTrials = 0, 100 do
  	io.write("Try: ", numTrials, "\n")
  	io.flush()
  	savestate.loadslot(1)
  	tempSelectArray = {}
  	for i = 0, 400 do
  		tempSelectArrayi = false
  	end

  	frameNum = 0
  	while memory.readbyte(0XB) ~= 110 and frameNum < 399 do
  		if math.random(0, 7) == 0 then
  			tempSelectArrayframeNum = true
  			joypad.set({Select = true}, 1)
  		end
  	frameNum = frameNum + 1
  	emu.frameadvance()
  	end


  	if frameNum < tempBest then
  		tempBest = frameNum
  		io.write("New best of ", tempBest, "\n\n")
  		io.flush()
  	end

  	if frameNum < 399 and frameNum < currentBestNum then
  		io.write("New best of ", frameNum, ":\n\n")
  		io.flush()
  		currentBestNum = frameNum
  		for i = 0, frameNum do
  			io.write(i + 65400, ": ")
  			io.flush()

  			if tempSelectArrayi == true then
  				io.write("s\n")
  				io.flush()
  			else
  				io.write("_\n")
  				io.flush()
  		end
  	end
  		io.write("End_Of_Sequence\n\n")
  		io.flush()
  	end

  end
  io.close(file)
At the end of this level, because of my faster spring jumps, I make it to the last red face a lot sooner than I did in my old TAS. I also hold L+R when near the last red face to make the camera scroll up so that the last red face spawns a few frames earlier. As a result of all of this, I can just barely make it onto the spring that goes around the tower a cycle earlier than I could in my original TAS (if you don’t land on the spring, then you will void out and die when you hit the bottom of the screen). The spring takes 128 frames to go in a complete circle around the tower, so this in turn lets me save a little more than 2 seconds over my original TAS here.

And with that, we finish off the rest of the level the same as in the original TAS, and head on to level 13.

Frames Saved: 314

Level 13: Armageddon

There is no change in this level compared to my original TAS.

Frames Saved: 0

Possible Improvements:

Level 12 was faster in my 2P Warps TAS by about 30 frames due to less lag on the red faces. However, this is caused by there being different RNG before I reach the red faces. In order to make a script to simulate through this, however, I would have to make a lua script that could play through the last inputs of my bk2 file that are needed to reach the poles that you hold onto, all the while adding random select presses throughout. My lua knowledge isn’t very great, so I don’t actually know how I would do this. As such, I am content with how things turned out in my TAS. Perhaps in the future, somebody with better knowledge of lua scripting could make a script that would find a way to get this extra time save.

Concluding Remarks:

It’s been a long journey of TASing to reach this point. However, this TAS contains everything that I could possibly want a Battletoads NES TAS to have. I am now satisfied enough with the TASes I’ve made of this game that I have no interest in continuing to make new NES Battletoads TASes. As such, I'm announcing my retirement from Battletoads TASing. If somebody discovers a new trick or comes up with a new idea to save more time in Battletoads, then I would consider making a new TAS, but other than that, I think that I’m done now.

It’s been a fun ride learning how to obliterate this game. If there’s one thing that you as the viewer should take away from all of this, it’s that you don’t need to be a good TASer to make a good TAS. For my own part, I consider myself to be an average-skilled TASer (approximately equally as skilled as the average TASer who has had a movie published on the site). However, what I do have is lots of patience and persistence, which enables me to be able to make good TASes. This isn’t to say that my TASes are perfect, mind you. Rather, persistence has enabled me to make TASes that are noticeably better than the movies that existed before I started TASing – which is my ultimate goal when it comes to TASing.

I hope you have enjoyed watching these TASes, and I hope you enjoy my final Battletoads TAS! See you in the next game!


ThunderAxe31: Judging.

ThunderAxe31: Setting to delayed, in view of new improvements.


Similar submissions (by title and categories where applicable):