Share all your strats, shortcuts and optimizations here!
I will start off by posting this video about the useful shortcuts I found. These are all doable on easy mode, where you have the items at your disposal, but also the lowest vehicle speed.
MANIPULATING ITEMS: You can quite accurately select the item of your choice on the Wheel o' Items through knowing that the wheel if stopped during the first few rotations (before it starts to slow down) will take exactly one rotation to stop. So, if you need a Jump, press 🔴 to stop the wheel when it's in the front position where the wheel will stop. It will stop exactly one rotation later.
The items you get on the Wheel o' Items are dependant on your race position, or more accurately the time difference between you and the race leader. Pandora's Box and Wonder Clock will appear more often if you are nearer the back of the pack. In testing, I found that Jump will not appear when in first place.
Outline of current strats from recent top runs:
RAPTOR & RAPTOR strats (Dilly method) - We have begun focusing on Raptor as our vehicle of choice for several reasons. Because of Raptor's hover characteristics, it is possible to drive off-road without penalty, opening up the possibility for new shortcuts. Raptor also is unaffected by oil slicks and obstacles like the roulette table in Gulliver. Also, Raptor has better steering and braking control in air, making jump shortcuts easier and faster. However, Raptor's top speed is faster in Reverse than driving forward, so it is important to turn around at the start of each race to save the most time. This also stops boost pads from working.
ITEM MANIPULATION - As mentioned in Booskop's post above, we are able to select items we want from the wheel with precise timing. This is crucial for optimizing our route. Jump and Dynamite are the main items to go for in order to perform several skips. Powerup is useful if you can get it first lap for a race-long speed boost, but only if it does not interfere with getting Jumps. Super Shield is a useful speed boost if you don't need the items above. Tiny provides a small speed boost, if you get bad RNG on the other items. Turbo gives a small boost at first, but then slows you down while driving in reverse, so be careful about when you use it, or save it for just before crossing the finish line.
DRAFTING- The rectangle in the middle of the speedometer is a draft indicator (blue -> red -> yellow). Getting a yellow draft by driving directly behind enemy cars gives a moderate speed boost, especially on straights. However, we don't spend much of the run around other cars, so time save is small overall.
TOON ISLAND - Lots of places to drive off-road with Raptor. Cut corners where possible.
Turn left into the mountain after the first "tunnel", jump over the track, and then drive across the yellow path to skip straight to the end of the lap near the waterfalls. Aim between the balloons and the mountain to line up the gap.
Also, the yellow path to the right of the start/finish straight is a minor shortcut if you can avoid the walls and Jump back onto the track when it turns right.
TOON VILLAGE - Several possible skips, but very reliant on getting Jump items.
Drive up the hill toward the windmill for a small off-road shortcut. When the fence to the right ends, cut through the trees to avoid getting stuck in the small river.
Get onto the train tracks and jump around the mountain to skip a large part of the hairpin (we call this Deo Express). You can line this up by aiming along the boost arrow before the train, bump the train and it will line you up with the train track, and then Jump hard right when the track curves away from under you.
If you miss the setup for Deo Express, you can use a Jump or Dynamite to get over the fence at the bottom of the hill as a backup.
Drive through/behind the buildings at the 90-degree corners to save time. Or you can stay on track if you need a coin.
Jump between the buildings to the right of the bridge at the roundabout late in the lap for a big skip. You can also use a Dynamite on the right side of the base of the bridge to jump up to the track above, as a backup.
CRAZY COASTER - Major skips, but definitely needs Jump items.
On the first lap, use a Jump to skip the S-bend a little ways into the lap, and immediately get another Jump item ready.
Just before the track goes transparent and dips down, Jump to the left onto the other section of track to skip the entire transparent track section. On lap 1, make sure you use a Coin while in the air before landing the skip to get another Jump item. Once the game knows you're in 1st, it is very hard to get another Jump for lap 2. Then use all your coins to get a Jump for lap 3.
GULLIVER HOUSE - Only a couple skips here, but important to execute them well to save time.
Hang a left and drive over the roulette wheel to cut the corner and maintain speed.
Use a Jump or Dynamite before the hairpin to skip a long section of track. Best to slow down and do the skip close to where the banister divider ends.
Drive over the base of the martini glass at the end of the lap to cut the last turn. Don't go too far right; aim for the second or third colored polygon over.
HAUNTED CASTLE - Hardest skips to pull off, but necessary to save time as Raptor. There are only a few coins on the track, so use them as early as possible and just go for Jumps.
Going up the hill toward the chicane by the dragons, Jump left and aim straight for the blue dragon head to line up for the skinny bridge toward the skull. Try to get this skip all three laps if possible.
If you have a spare Jump, for example on lap 3, you can Jump hard left at the corkscrew section at the end of the lap to save some time. Don't jump too early because there is an invisible wall on the left at the start of this section. Once the track starts to descend, you should be clear of the wall and can make the sharp jump to the bottom.
I think going around the right of the roulette wheel in Gulliver House II and keeping almost top speed should save time over going around the left side since you lose a lot of speed.
I also think that jumping the hairpin in the same level using Dynamite is faster than using Jump.
Major Update - LAP SKIP / RESPAWN WARP
We have determined that it is possible to abuse the respawn mechanic to traverse larger distances than previously thought.
When you die and the car is reset, the game will respawn you to pre-defined locations around the track based on what area of the track you last touched. This way, if the game determines you went way off track and died somewhere weird, it will put you back to where it thinks your last "in-bounds" location was.
However, it appears that some of the respawn points are near the "end" of the sector of track you can die in. For example, you can fall off at the dragon S-bend section in Haunted Castle and be respawned slightly forward, at the start of the lava area. These respawns usually won't save time over driving normally, but we may find opportunities in the future to use "respawn warping" to skip slow sections of track.
In addition to the small dragon respawn warp, a couple others we currently know of include a possible warp to the finish line in Haunted Castle when falling during a Corkscrew Jump, and another warp in Toon Village where dying during "Bridge Skip Plus" can warp you near the finish line.
LAP SKIP !!!
With the knowledge of respawn warping, DeoChomp was able to find a significant skip in Toon Island that skips about half the course. We are referring to this as Lap Skip, and it is possible to get a double or triple lap skip in a race to save more time.
By leaving the track near the start/finish line and driving off-course, it is possible to drive a large part of the track while "off-course", thereby causing the game to remember your last on-course position as the start/finish straight.
It has been determined that in order for a lap to be considered "complete", you must cross a checkpoint at about the halfway point of each track.
Therefore, if you go "off-course" at the start/finish line, drive the first half of the lap without touching the track, and die immediately after crossing the mid-lap checkpoint, you will be respawn warped all the way to the finish line, and the lap will count as complete.
For Island, this means driving off the left side of the track, driving over the mountain ridge (without falling left into the void or right onto the track), and using a Jump at the midpoint of the lap to jump over the track and die by hitting the waterfall. This will send you straight to the end of the lap, where you can repeat the process, saving a total of about 20 seconds over the old strat.
It is unknown at this time if lap skips will work on the other tracks. For example, it seems possible to drive on the railings in Coaster to be considered off-course, but this would be such a precise trick that it may only work in a TAS.
While what Saffron has said about Lap skip is technically correct, it's a little more complicated than that. I'm not saying I know everything about it, but there's more than meets the eye. For example, I noticed that if I respawn right before the checkpoint, it'll respawn me further into the track even if I haven't touched the track. My theory is because the "chunk" that contains the player's current respawn point is despawned at the time of respawn, it uses the next available respawn point that's in a loaded "chunk". This would put a loophole into lap skip in the first place wouldn't it though? I don't think so. I think the checkpoint reloads the "chunks" leading up to and including the respawn point used for lap skip. This knowledge doesn't really help right now though since you'd probably reset anyway since you didn't reach the checkpoint and didn't skip the lap. Again, this is a theory, do not currently take this as fact as the respawning mechanics are just now being tinkered with. And if my theory is correct, that means there's a chance that lap skip is impossible on other tracks because it's not 100% that the finish line reloads at checkpoint, although I think it's highly likely(implying that we can stay out of bounds enough for that). Although if it is that small chance, it kinda would explain the bizarre "forward respawning" cause the previous respawn point is deloaded and the next one is up ahead. I'd need more examples of "forward respawning" to further prove this. All speculation of course, I don't know everything, like I said at the beginning :P
After hearing about the lap skip I was interested in learning more about the respawn mechanics and took some time over the past few weeks to reverse engineer relevant parts of the code. While I by no means have a perfect understanding of all the underlying mechanics (they are surprisingly complex and have many edge cases), I hope to provide some insight into how these tricks work and formalize the concepts that were previously discovered.
In general, all of the above tricks revolve around controlling a piece of memory I've been calling Respawn Track Progress or respawnTrackProg
. It's not a catchy name, but it'll hopefully make more sense why I picked that name in a bit. It's job is to keep track of the last valid location the players car was at on a given track. Notably, it does not update while the car is off the track. Critically, this includes both off the track **and** in the air *over* the track. When a car needs to be respawned this is the value that is used to determine (indirectly) where the car is suppose to be placed back on the track. While I have not completely decompiled this section of code, the jist of it is respawnTrackProg` is used to lookup the next spawn point in a list of spawn points. This means cases of forward warping are usually just being at the beginning of section/chunk and being placed towards the end, but not always.
This is actually an interesting case of forward warping due to some buggy terrain. While normally driving on a railing wouldn't update the respawn position, that is not the case here. In this specific area, if the car is maneuvered just so, the game thinks the car is on valid terrain and updates the respawn track progress. The car's position (according to the game) is thought to be off to the right just about where the exit off the corkscrew is before the ramp back up. Thus, when the respawn is triggered it uses that bottom of the corkscrew position to calculate where to respawn and moves the car even further along the track.
Now, before I talk about how/why lap skip works. I need to introduce two more pieces of memory:
prevTrackProg. These two values represent the cars current and previous progression on the race track. Their values range from
0 just after the finish line to some high number (that is track specific) right before the finish line. These values are updated whenever the car is on or above the track (unlike
respawnTrackProg). Every time the position of the car is updated (aka every tick)
prevTrackProg gets updated to be what
currTrackProg was and
currTrackProg is then updated to be the newly calculated value. In this way, the game can keep track of how the player is progressing on the track, determine if they are going forwards (
curr > prev), backwards (
curr < prev), and crucially: determine when a lap has been completed.
Before being able to determine if a car has finished a lap, two more additional pieces of information (arguably only one) are needed; the position of the finish line and the halfway point. The finish line is unique to each track and stored in units matching those of
[curr,prev]TrackProg. The halfway point's position is then derived from the finish lines. It is simply the finish line's position divided by two (technically bit shifted right by one). While the finish line's point is helpful to know, the game uses only the halfway point, combined with the cars current and previous track progress, to determine if a lap has been completed. The checkpoint marked in-game is used only for displaying in-progress lap splits (or similar) and not technically needed to be crossed (on the track) to finish a lap.
As mentioned above, every tick the current and previous position of the car are updated and checked, the game then determines if the car is moving forwards or backwards, and if a lap has been completed. Ignoring the edge cases and minutia the critical check for a laps completion is as follows:
Nominal Finish Line Crossing
currTrackProg < prevTrackProg
(currentTrackProg + halfwayPoint) < prevTrackProg
Or in simple/general terms, the car's new position on the track must be much less (more than half a track) than its previous position (in a single tick) for a lap to be counted. However, in opposition to the above check, to cross the finish line the wrong way the following checks must be satisfied:
Wrong-Way Finish Line Crossing
currTrackProg >= prevTrackProg
(prevTrackProg + halfwayPoint) < currTrackProg
Again, put simply this would mean the cars current track position is suddenly much greater (more than half a track) than it's previous position (in a single tick). This flips the internal lap counter negative and the only way to undo this is to complete a nominal finish line crossing. Note, if the internal lap count is
0 no update occurs and the count remains
Using the knowledge and mechanics above, a lap skip can be performed. Lap skips are really just forward warping, or respawning so far forward that the game believes you have crossed the finish line, but not so far as to trigger the games wrong-way detection. The setup for a long forward warp/lap skip is as follows:
- Drive on the road like a normal player
-- This sets the
- Start driving off-road (non-road terrain/jumping in air)
-- This continues to update
prevTrackProg-- This does not update
respawnTrackProg-- The beach on Toon Island II is considered track/road
- Continue driving off-road until the car is more than half a track away from the previously set respawn point
- Trigger a respawn -- Run into the ocean, go out of bounds, etc
This image shows the maximum possible lap skip distance (~half a track) and shows some example of the above calculations.
I hope this proves useful, or at the very least entertaining. I had a lot of fun digging through the code to figure all this out. If anyone is interested in doing some exploit hunting I can post track lengths along with other relevant memory addresses. For map exploration, I've found that freezing the item memory address
0x800DC3CB with the jump item
0x04 makes moving around the map extremely easy. Any questions or suggestions (for this game and others) are welcome!
I've got two new bits of information I'd like to share a (maybe?) new piece of tech and a strat for a near optimal (in terms of distance) lap skip on Toon Village!
Mega Mine Jump Mega mine jumps, as opposed to running over a regular mine, are done by laying all three mines down in the same location aka while stationary. When ran over this provides the player with a crazy amount of height and distance. It costs a bit of time to setup but can be used to skip areas that would otherwise be impossible. In theory, more than 3 mines could be laid down for ever more height/distance but that would require getting mines a second time which seems costly, unlikely, and not super useful.
Toon Village Lap Skip Proof of Concept Using what I've learned about respawning and the new mega mine jump (MMJ) tech I was able to find a possible route to forward respawn almost exactly half a lap on Toon Village. Unfortunately, it requires a somewhat involved setup:
- Setup MMJ on the left side of the road, after the second bridge, before the train
- Continue driving a regular lap
- Collect a jump item
- The next time around start driving on the left side grass after the first bridge
- Drive over the river the second bridge crosses and MMJ onto the train
- Deo Express over the mountain an onto the grass on the far side
- Drive until behind the houses that are near the blocked off road
- Use the road blocks to cross to the other side of the road without updating the respawn point (could use an item instead)
- Drive just off the road (to update track progress) until after the first carousel
- Drive off to the left and into a hill out of bounds that causes the car to explode
If done correctly, this should then respawn the car halfway across the map where the trick was started (just after the first bridge). Admittedly, this trick is a little finicky and item dependent but it does show lap skips are possible on other tracks. Here's a proof of concept video I spliced together using save states:
Fantastic work, Lazycurler! It's really helpful to know that lap skip is just a calculation, and not dependent on the physical locations of the finish line/checkpoints. We might be able to make adjustments to Toon Island's lap skip to make it slightly easier/faster, as well as look for ways to make Village or other tracks work in a run.
Since you've clearly got the technical knowledge, and it sounds like you're decompiling the code, I would just reiterate that another thing we've always wondered is how the item randomization works. Clearly there's a list of predefined wheels that it gives you at different rates based on various conditions like track position, but we don't know enough about it to manipulate the items as much as we want. If you could offer any insights into the item wheel logic, that could be a game changer for making runs more consistent.
Using the idea that the mines explode upon contact, it can be assumed that includes landing after being in the air via Jump, Dynamite... or another mine(s). Now the question needs to be asked, does your respawn location get updated when you come in contact with the mines and being so close to the track? The answer is NO! That's right, you can use 1 set of mines to go an incredible distance, land on another set of mines and go another incredible distance, all without updating the respawn location. Below is a simple demonstration of this, plus a comparison of respawn locations between the double mega mine jump, and the second set of mines. P.S. I highly doubt this can be practical anywhere, just worth documenting :)
Hey guys! I took SaffronCitizen's suggestion and took a look into how item generation works. Without spoiling anything, it's pretty interesting! Below I provide a general outline of how the game selects what items to present to the to player. If you interested in getting a rough outline on how that works start from the top. But, if you are just interested in what that means for players you can skip straight to the analysis section and click the link to look at the graphs.
Disclaimer: The information contained in this post are focused specifically on the "Championship Race" and "Single Race" modes. Item wheel selection differs for other modes and is not covered here. Also, there is obviously the slight chance there is a bug in the item lookup and graph generation, so if you see something that doesn't make sense or doesn't match, please let me know!
As was previously suspected by the community, there exists a list of predefined item wheels in the game. Looking at the code, it appears the specific number of pre-generated item wheels is 228. When an item wheel is requested by the player, the game refines this list down to three specific wheels. It is from these three wheels that the game then ultimately selects the wheel that is displayed to the player. While not the subject of this research (but already known by the community) it is then possible for a skilled player to accurate select one of the eight items in the wheel with a well timed button press. For the sake of this write-up it is assumed the player can execute this selection with 100% accuracy. ;)
On the first pass of item wheel selection, the game reduces the possible number of item wheels from 228 down to 3. Interestingly, this initial refinement process is entirely deterministic! It is based solely only the players position on the track and their position relative to the other cars in the race. The initial refinement process is driven by the following parameters:
- Lap Count
- Checkpoint Crossed
- Race Position*
Before moving on, however, a few details/caveats must be clarified. "Checkpoint Crossed" exists as a "flag" that tracks if the player has completed more than half of a given lap. This parameter is "sticky" meaning that driving backwards back into the first half of the track will not clear it. It will stay set until the finish line is crossed. Given that both this parameter and the lap count parameter both track the players progress through a track, they can be combined into a single parameter where progress is measure in half steps. e.g. The players lap count after completing a single lap (just starting their second) would be 2.0. If a player was over halfway done with their final lap their progress would be 3.5.
The other caveat is "Race Position". In the game, the displayed race position of the player is between 1 (first) and 8 (last). However, there exists a secret 9th position. This 9th position is reserved for a player who is significantly behind the second-to-last player (the one directly in front of them) where "significantly" is defined as >40,001 in game units. To give a practical example, this is roughly the distance from the start/finish line to the apex of the first turn on Toon Island II.
Finally, once the game has narrowed the possible item wheels available down to three, it must make its final selection. While technically still deterministic, from the players perspective this selection is essentially random. This selection is done using a counter that is incremented every tick of the game. On the same frame the wheel refinement occurs, so too does this final wheel selection. The aforementioned counter is divided by the number of wheels (3 in this instance). The remainder of this division is then used to select one of the three wheels. The manipulation of this final wheel selection is almost assuredly a TAS-only trick.
As part of this research, the item list (and corresponding lookup table/functions) were dumped. By reimplementing the calculations and lookups done it is possible to explore any hypothetical situation desired. Furthermore, while any individual scenario may be of interest, analyzing the entirety of the dataset can reveal underlying trends. To this end, 2d heatmaps have been generated that represent the likelihood of a specific item appearing in an item wheel given a players lap and position. e.g. the darkest rectangle means the item will for sure show up in the wheel and a green rectangle means the desired item will only show up in one of the three possible wheels. Assuming the player is perfectly able to select an item from a wheel, the likelihood of an item encounter (the item being in the wheel presented to the player) is the same as the players chance to receive that item.
These heatmaps provide evidence/proof that the initial wheel refinement process is not only deterministic, but was implemented with intent. Item encounter rates frequently strongly correlate with player position. For example, looking at the heatmap for "Pandora's Box" it is clear that players in the back of the pack are most likely to receive this item. If a player in 9th position has completed at least half a lap, they will have a 100% chance of the item appearing.
Another interesting example is the "Bomb" which appears to have a linear trend with race progression. Presumably, the item is intended to be used most frequently in the mid-field, with players in the back never being offered a bomb/mine and players in the front only occasionally being provided the item.
In order to keep this post to a somewhat reasonable length the vast majority of technical details (e.g. memory address, functions, look-up tables, etc) have been left out. If there is interest, these details could be included in a sperate, more technical post. Additionally, if there is interest in a standalone program for looking up the set of wheels that would be encountered under a given circumstance I would be open to cleaning up my code and providing a github link to the relevant data and tools used for analysis.
With that, I hope you've found this writeup entertaining! I really appreciated the suggestion. :) Reverse engineering the code has been a fun, puzzle-like challenge for me and I found the resulting data particularly amusing. I'll be interested to see if anything useful can come of this data with respect to speedruns. As always, any questions, suggestions or recommendations are welcome!
Edit: "Jump" Heatmap
So, the grand question: can we get Jump on every lap while in first?
According to the heat map, we can! (Expect for lap 2 after the checkpoint)
Fantastic write-up! Perhaps most shocking to me is the fact that there are 228 item wheels! I never would've guessed there are even close to that many. Although I imagine many of them are slight variances on one another. Thanks for also editing in the jump heatmap; this confirms why it felt impossible to get a jump the the second half of lap two (it literally was 🤣)
Thanks! That number also seemed odd to me. I will mention that I don't think all 228 item wheels are accessible while playing single race or championship mode. Some of the rings have items only available in two player mode for example.
I figured I'd edit in the jump heatmap since that'd be the most relevant but just incase it was missed in the original post here's a link to all the heatmaps https://imgur.com/a/cbLfGIv
Awesome job! Like Kyle said, this confirmed some of the theories we had about getting certain items, so our strategies for spinning the wheel in midair while performing a skip, or waiting for lap 3 to get a Jump, were right all along.
I'll definitely start thinking about ways to work this info into our routes. And if you wouldn't mind putting anything you have on Github, I might be interested in taking a look as well.
Finally got around to cleaning up the code (every so slightly) and creating a repo for it: https://github.com/lazycurler/MotorToonGrandPrixReseach