Game objectives
Collect helicopter and safe item drops to complete 3 race minigames and 4 cannon minigames to "beat the system"
- Emulator used: fceux-2.0.2
- Aims for fastest time to reach the final "you beat the system" screen
- Manipulates luck
- Makes entertainment and speed tradeoffs
Game Description
High Speed was released on the NES by Rare Inc. in 1991 and is based on a real pinball machine released by Williams pinball in 1985. The core rules of High Speed were ported over fairly faithfully from the original pinball machine although Rare added in two different minigames and a "wizard mode" goal which is reached by completing a total of 8 cannon minigames and 6 race minigames.
Why TAS High Speed?
I had always enjoyed pinball as a kid but High Speed on the NES was what eventually motivated me to purchase several pinball machines, High Speed included. Rare had previously ported Pinbot to the NES in which they opted to do unusual things like changing the ball into a triangle while with High Speed they took a “let's add stuff to the game that would be technically impossible in a real pinball machine” approach. Between the two games I feel High Speed offers more depth and a lot more defined goal, so I decided to do a TAS on it as my first project. This is the first game I've attempted a TAS on so please have grace with me if I've missed something.
Game goals
The game places item drops (I call them tokens) at random on the playfield which can be collected by shooting the ball past them. Collecting three helicopter tokens causes a racing minigame to start and collecting three safe icons causes a pachinko-style cannon shooter minigame to start. Entering the minigames with more than one ball allows for more balls in the race minigagme and a faster shooting rate in the cannon minigame (but always comes at the consequence of a longer bonus countdown). Completing all three races and all four cannon minigames causes a spaceship to appear which displays a message that states "you have beaten the system... for now”; beating another round of three races and four cannon minigames causes a rocket to appear which states “you have beaten the system this time.” and marks the end of the game. Reaching this final “you beat the system” bonus is the goal of this speedrun.
Game start and intro
The first thing you'll notice about this game is the unskippable cutscenes. They're long. They can't be skipped. I'm restating the obvious but they more than double the movie length. I play around with some input animations throughout to pass the time and advance as quickly as it is possible to do so but I'd recommend speeding past them by taking advantage of a Lua script I wrote which can be found at
http://lua.pastey.net/98416. I believe this script makes this game go from a somewhat questionable TAS choice and turns it into something a lot more reasonable from a viewing perspective.
Once the game starts, I immediately turn off the voice option because the game pauses while it's talking (a very annoying trait even outside a TAS run).
Pre-multiball
Once the game starts, I use a series of keypresses to trigger safe item drops to appear on the screen as quickly as I could manipulate them in to showing up. Collecting all three safe items starts the first cannon minigame. I stick with only one ball until the first round of cannon minigames are complete in order to significantly reduce the bonus count time.
The first four cannon minigames
When I first started my TAS on this game I did not realize that the strength of the shot is altered by holding down the fire button AFTER the ball has left the cannon. Equally interesting is the fact that it's possible to slightly alter the path of a ball that's already been launched by moving the cannon. This is even required in order to land the ball in one cup on the last cannon minigame table. I frequently had to wait for several frames before firing another shot to ensure the first ball that was fired still landed in the cup hence what sometimes looks like sub-optimal firing patterns.
Multiball
This is really where things start to get entertaining to watch. The extra balls make for a much more interesting movie and give more balls to collect items with (it's also possible to collect two tokens at once during an “escape bonus” that happens when two balls are locked at once). At one point in this section I let a ball go behind / under the right flipper for a split second before returning it to play.
The first three race minigames
In the race minigame hitting your red car makes it go faster while hitting enemies fouls them up, although the speedup effect is not consistent. There are booster / nitro item drops that appear randomly (but with rules about what frames they can appear on) which also increase the speed of your car. During a couple of the first race minigames I was unable to effectively manipulate the luck in order to get boosters to appear and relied instead on attempting to hit the car as frequently as possible. I got poor boosts off of a few hits in the first couple of races but worked around this more effectively in later race courses.
The spaceship and the next three race minigames
After completing the first four cannon minigames and the first three race minigames, a spaceship appears and abducts the balls. This is *not* the end of the game despite what some game FAQ's may state. The countdown takes a while but can be turbo'ed through automatically using the Lua cutscene skip script.
From here on out, luck manipulation takes on an entirely new meaning. I created a fairly customizable item finder script which I have posted to
http://lua.pastey.net/98417. This script was used extensively for triggering boost item drops and was also used on the main table to trigger exactly the item drop I wanted. This accounts for the sometimes seemingly random flipper action, although I did my best to try to keep this to a minimum. The races switch to being much more oriented on getting boosters with hitting the car is relegated to being a secondary goal.
At the end of this section I do some very fun tricks with one of the more impressive being a point at which two balls drain down the middle but get sent to the sides of the playfield through the outlanes and get shot back into play (in the real High Speed pinball machine only the left outlane has a kickback and the switch is further up the lane). This trick requires a fair amount of nudging and causes a danger warning to flash in the scoring area but no other badness (and I was waiting for the game to allow me to collect a bonus anyway so I had time to kill).
The last four cannon minigames
After all of the races are complete there's regrettably no need for multiball, so I sadly let two fall SDTM before starting the last round of cannon minigames. By this point I created a Lua script which moved the cannon to the far right, fired a shot with a given strength and waited to see if it filled a cup and then tried again with successively higher strength shots up to a limit before moving one position to the left and trying again. This script saved me a LOT of trouble because I could just let it go and then take over when it found a result. I even created a deterministic bot which could complete any table without user input but the code got very messy by the time I got done. In fact, I'm holding off on posting the normal cannon shooter script for now as I still need to clean it up a bit first.
Overall the last four cannon minigames go by fairly quickly (I like how the brown background one looks almost like it has a problem with balls raining down on it). I ran out of creative things to do on the main table with only one ball to play with but I did what I could. After completing the last minnigame a rocket appears and takes the ball to the second and final bonus countdown; after this point the tables repeat and there are no new bonuses.
Future Improvements
Luck manipulation could still be improved to a certain extent, but pinball movement is a very tricky thing to manipulate. This game (and likely Pinbot, High Speed's sister game) uses a small amount of randomization in ball physics, meaning player input can have an impact on how a ball will react when a collision occurs. Quantifying what input produces a given bounce result is nearly impossible but manipulating luck to cause specific item drops on the main playfield is actually fairly straightforward. For this reason the actual ball handling is sometimes a bit loose but the item placement and orbit shots are usually spot on. This area could potentially be improved but I suspect it will still mostly be a matter of, well, luck. :)
Hex / TAS Editor twiddling is typically not a possibility in this game as the score and the frame number after entering or leaving a minigame are both used for randomization. The cannon minigame is somewhat consistent in that once the game starts a given set of input will produce the exact same output but I was unable to copy entire shot sequences en masse.
Overall, future improvements would include tighter times on the first couple of races and more boring but precise ball handling prior to getting into the safe and helicopter.
Memory addresses
Some of these were fairly difficult to track down. On the main table, $064F indicates what item has been dropped (but not where); 64 = a Safe drop, 65 = Helicopter drop, and 66 = a Moneybag drop (which only scores points and can be entirely avoided). $07B0 is the game's universal timer countdown. In the race minigame the address $06A1 indicates the status of boosters on the screen; 255 = no boosters, 0 and 1 = booster on the left or right side of the playfield respectively, and 128 and 129 indicate the booster has been collected on the respective side of the screen. In the cannon minigame, $07AC is the cannon angle where 00 is far right and 95 is far left. $0699 is a counter that generally shows you how many balls you can fire before it requires you to wait for some to drain. $03EE and $07B3 are the number of cups that you've filled and the total number of cups on the table, respectively.
Thanks
I've been a long-time lurker and I'd like to say I never would have attempted an unassisted run without all of the information posted both in the FAQ's and the forums. While there always a few bad eggs in any group I cannot overstate how professional this community conducts itself and how impressed I am at the level of dedication and tenacity on display here. Thanks to everyone who helps make this what it is.
Specific thanks goes to DeHackEd, Alden, qFox, and Xkeeper who all helped with Lua scripting – I appreciate it and look forward to more Lua goodness from everyone in the upcoming Lua contests.
Let me know if you have questions about this submission or if I forgot anything (or anyone). Thanks all!
mmbossman: Thanks to those who provided some additional input, accepting for publication.
ShinyDoofy: Processing...
adelikat: The hash in the movie file does not match the good dump but syncs on it, so I cataloged as the good one.