Submission Text Full Submission Page
After 9 years, it's time for Shadow to get the spotlight.
Sonic Adventure 2 is a 3D action platformer, consisting of fast-paced action, treasure hunting, and mech shooting in a split narrative story. Sonic is framed for crimes by Shadow the Hedgehog, a mysterious ultimate life-form created 50 years prior by Dr. Eggman’s grandfather. Sonic and his friends must team up to stop Eggman and Shadow from using a space laser to destroy Earth. In Dark Story, you play as the villains, racing to reach the laser before the heroes.
THC98, itsPersonnal, Brian_pso and laze work together to complete the storyline as fast as possible, using glitches, exploits, and strategic routing to push the game to its limits.

Sync info

  • Emulator: Dolphin 4.0-4222
  • Memory Card must be on, regardless of its files.
  • HLE recompiler Audio.
  • Dual Core and Idle Skipping turned off.
Before anything, we'd like to thank a few people for their continued efforts pushing this game to its absolute limit + some special thanks.

About this TAS

  • Because of our TASing methods and the dolphin revision used, the rerecord count is inaccurate. An educated guess would be around ~4m rerecords.
  • Completes Dark Story
  • Aims for real time over in-game time, although we tried to optimize in-game time as much as possible without sacrificing real-time. IL tricks like stopping time were ignored in this TAS.
  • Manipulates RNG for optimal hunting layouts
  • Uses soft resets to save time
  • Abuses glitches
  • GOTTA GO FAST

Timing Method (LRT)

Our timing method was inspired by the standard non-TAS timing “LRT” (Load Removed Time). Although LRT typically includes using the main menu, TASing on the Gamecube version means that we can save RTA with a soft reset at the end of each stage. As a result, soft resets enter the next stage sooner, but have to use the menu to select Dark Story after each reset. We decided that counting this menuing towards the final time would create a scenario where soft resetting to save RTA would be penalized for no real benefit. Thus we exclude the main menu from our timing, treating it identically to a cutscene or load screen. In action, this timing method functions very similarly to IGT, the only difference being that time spent paused (in order to pause buffer some inputs) and wasted respawn time is counted towards the timer. The respawn time wasted is counted by subtracting the time before respawn with the time after respawn. For example, if we collect an emerald piece at 7.20 seconds, and die at 7.40 seconds, we'd respawn with the timer at 7.20 and would have "wasted" 0.20 seconds or 12 frames.

Final time

  • According to the in-game time (sum of all levels and bosses): 15:28.62
  • According to our custom LRT Timing Method: 15:30.17

General Strategies/Glitches

Note: this game uses a Y-Up coordinate system.

All

80 rings for speedshoes
If we have between 80 and 90 rings, hitting a checkpoint gives us speedshoes.
Stacking Speedshoes
If we collect a second speedshoes item before the speedshoes effect runs out, their effects are stacked and the character's base speed gets multiplied by 4 instead of 2. When the first speedshoes effect runs out, the base speed multiplier is set back to 1, and when the second one runs out, the base speed multiplier is set back to 2. This causes a counterintuitive side-effect where the character's base speed multiplier remains at 2 after both speedshoes effects run out.
Soft Reset
Since the game saves when the score finishes calculating, we can soft reset on that frame and skip waiting for the rank and emblems animation. This is only faster RTA and makes no difference in LRT.
Pause Buffering
Allows us to press the same button on 2 consecutive frames. For example, for pressing A in two consecutive frames, the inputs are A + Start -> None -> Start -> A.
Pause Hover
Whenever A is held while a character is in the air, the character's gravity force gets set to a lower value, causing the character to hover in the air. This consumes what we call hover frames, which is a counter that resets when we jump and allows us to hover for up to 60 frames before we jump again (except for Eggman, which only can hover for 16 frames). This is typically used during the initial motion of a jump, by jumping and holding A for longer, but it is also possible to initiate a hover in mid-air with a pause hover:
By pausing, and then unpausing with the A button mid-air, instead of a homing attack, mech hover, or glide, you can use your available hover frames (if you hadn’t burned them all prior). This lets us disperse our hovering for more precise control over our jumps, and lets us cover larger distances.
VHC/HVC
Vertical Horizontal Conversion (VHC) or Horizontal Vertical Conversion (HVC) are performed when a character interaction with a wall and/or an object converts part of our vertical speed into horizontal speed or vice-versa. VHCs are usually useful for building forward speed and are typically done by colliding with objects while landing, and HVCs are usually useful for gaining height and are typically done by colliding with slanted collision (see Shadow's mock bounces). The actual conditions for a VHC to happen are still somewhat mysterious, and are done with a lot of trial and error.
Animation Timer optimization
Some animations are effectively on “cycles” dictated by a global Animation Timer variable which counts up from 0 for a few frames before resetting. Certain actions’ animations can be cut short by abusing this variable by performing prior actions with shorter animations.
Moonwalking
We conserve more speed and have more traction by walking backwards. It is very desirable for every character but mech to walk backwards. It is very easy to achieve by moving close parallel to a wall and simply pressing backwards on the stick, which instantly reverses us and our speed. It is also very easy and usually the correct choice for landing from a zip.
Sip
A push of 2 vertical speed that you receive when having too little forward speed on a wallrun, in an effort to push you out/off the wall.
Zip
You can get stuck in a corner of 2 90 degree walls which do not share a mesh, the game then tries using Sips to push you out, but is not able to. This lets you farm max speed in a matter of frames and is the most broken tech for hunting characters because of its wide range of applications.
-Zip
By applying Z rotation storage and jumping to certain +Zrot walls with -Zrot stored, you can zip backwards relative to your wallrun orientation. Since Sips normally add +2 speed in the XZ plane perpendicular to the front face of the collision triangle, entering the wallrun from the back effectively rotates the player 180 degrees relative to that normal without also rotating the sip vector.
51% Clip
Objects with spherical/cylindrical hitboxes can push you about halfway into a wall. You can retain this push while midair, but will always get put back inbounds unless you reach the end of the wall while clipped more than halfway into it, at which point you are able to leave and go out of bounds.

Gravity specific

Gravity Control
Above a certain speed threshold, you can keep your gravity skewed. This speed threshold is applied in the value of the forward, vertical and side speed vectors combined.
Wallrunning
If our gravity angle (i.e. the angle we are "falling down" relative to the global axes) is sufficiently close to a wall and we have enough speed, we can snap to it and run on it.
Wallrun Transfer
Once wallrunning, we are able to snap to other walls and continue wallrunning. Sometimes a speed threshold must be met because the transfer eats some speed.
>90° Wallruns and “Good Triangles”
On triangles which are >90 degrees in rotation, we build speed way faster running on them. Because of approximate floating point imprecisions, some visually 90 degree triangles can effectively be 89.99999 or 90.00001 degrees. The 90.00001 degree ones have the faster speed building effect.
Side Speed Resets
When we are in the air we constantly build side speed which ends up in us falling towards global down faster. By doing precise sets of inputs we are able to reset side speed back to 0 every few frames, in turn letting us keep more height and point lower towards the goal to move with more fspd. This is the jittering you see eggman do in the air often.
PGR
Falling below the speed threshold for gravity resets it smoothly by subtracting 2k rotation units on both axes over the course of a few frames. If we fall under the threshold and then go back in, we can effectively change our gravity skew and how we are pointed.
Z Rotation Storage
Because of this game's usage of Euler Rotation, we are able to store a -90 degree Z rotation onto a +90 degree Z rotation wall by running along a +90 degree X rotation wall. Storing this Z rotation allows for us to get misplaced on our -90 degree Z rotation wallrun and get placed on the backface of the wall. This works because for any combo of X and Z rotation values (outside of gimbal lock), you can get the same gravity angle if you flip both values. As Xrot increases, Zrot's influence on our gravity angle lessens, becoming non-existent at 90 degrees Xrot, an occurrence otherwise known as gimbal lock. When said Zrot influence on our angle is non-existent, the Z rotation picked up can be stored onto another wall. It should be noted that despite the example being given is of storing negative Zrot, it is also possible to store positive Zrot, but as is currently understood, it isn’t nearly as broken, not allowing us to snap onto walls’ backfaces.

Axis related

Axis speed limit & optimizing movement at >16spd
SA2B applies a 16 hard cap in X, Y and Z speeds. Since this cap is applied on the speeds relative to the global axes, we can achieve and maintain >16 relative speed by moving diagonally wrt the global axes.

Eggman

Animation Timer Abused Turnaround Boost
When a turnaround is performed, a boost is given to your FSpd at the end of the animation. By abusing the Animation Timer, we are able to extend the turnaround animation and get given the boost later on in our acceleration, bypassing the running speed cap of 2.68, going all the way to 2.74 forward as a result.
Double Turnaround Boost
By doing a turnaround, letting mech reach 0 speed for at least 2 frames and doing another turnaround, you'll gain an instant boost from the first turnaround, lose some speed due to turning, but keep more than 0.4 when you do the second turnaround. Additionally, the second turnaround's animation will only start after that small glitched first turnaround animation ends so you'll have more frames to accelerate before you get the boost from the second one.
4096 Turns
Mechs have a range of 4096 control stick angle units away from their facing angle that they can turn without losing speed. Being exactly on unit 4096 lets them turn 2x as sharp, with no speed loss. This is extremely precise and impossible in most frames due to camera angle, thus we manipulate the camera (if the game allows it in the section) and/or prior analog inputs in order to get more 4096 turns during tight curves. This is an extremely strong tech. (Note: This tech is applicable to all characters, but eggman is the only one to heavily benefit from it)
Mech Pause Hover
Uses pause buffering to get a higher mech hover. This is because hovering as fast as possible after jumping is how you get the most height.
Cannon Shots Chaining
When shooting at a large density of targets, instead of comboing all of them at once, we aim and shoot them sequentially. This is because the cannon shoots every target in a combo one by one, and as long as there is a locked in target 5 frames after a shot, the cannon shoots the next one immediately.
Wall Boost
When being on a sufficiently sloped wall with very low speed and holding a neutral stick angle, you get boosted with a lot of speed proportional to how close your facing angle is to straight down. If you’re facing upwards you won’t get boosted.

Rouge

Slope Boost
When drilling onto a relatively down tilted surface, your VSpd from the drill is converted into FSpd (based on how relatively tilted down it is)
Layout RNG manip (1024 set)
Entering levels on certain frames allows us to pick our emeralds in hunting stages from a list of 1024 possible sets. There are “only” 1024 possible sets because the RNG seed gets reset before a hunting stage, and the game advances RNG (frame counter % 1024) times before generating the pieces.
Piece 1-2 RNG manip
Dying in a hunting stage shuffles the emeralds around. Picking up an emerald or two and then dying allows us to get a different emerald outside of our original set which may be faster. Since when restarting a stage the game does not reset the RNG seed, we can manipulate the generated pieces by ensuring we call the RNG a certain number of times.
Dismount Wallrun
During a wall climb, the game actually sets Rouge’s gravity angle towards the wall despite her animation not being slanted. This is normally immediately reset when jumping or climbing up the wall, but another option is to instead dismount by going close to a floor. In this case, Rouge’s gravity angle is not immediately reset, and instead does so over the course of a few frames. In that timespan, you can drill onto the wall and start a wallrun.
Glitchy Dismount
Usually dismounting a wall takes at least 2 frames from starting a wallclimb, but in very specific situations you can cut that down to 1 frame. In short, it involves climbing on a wall seam that keeps our surface tilt variable at a value of 1, and at the same time the animation timer variable being 0.75, at which point on the next frame you will dismount the wall and get put in the freefall action a frame faster than a normal dismount (which first gives you the standing still action).
Dismount Boost
Using the same dismounting feature, instead of boosting onto a wall, we can slope boost on the floor, because at our dismount gravity angle, it is tilted down relative to the floor
Drill VHC
Drilling into some objects or walls converts our drill VSpd into Fspd, effectively giving us a forward boost
Brake Rebound
Doing a complex set of braking inputs into a wall lets us instantly reverse our direction and keep all of our speed.

Shadow

10.39 Spindash
Spindashes charge at 0.4 Stored Speed per frame until stopping after it passes 10. By manipulating our speed before charging a spindash, the fastest spindash speed we are able to get is 10.3999.
Side Speed Boosted Spindash (SBS)
When charging a spindash, if you have any side speed, you can capture it and turn it into Fspd when releasing the spindash. This is most applicable on tilted walls, because they are very prone to giving side speed (in order to push you down a wall)
Mock Bounce (as a type of HVC)
Mock bounces are collision interactions which convert our Horizontal Speed (usually from a spindash) into Vertical Speed and allow us to go very high very fast.
Mock Extension
When you enter the air from a spindash (as in when mock bouncing), when you homing attack you still have ball state on, allowing you to do a faux super bounce by homing attacking into a wall, turning its fspd into vspd.
Rail Optimization
While on a rail and holding B to crouch and gain speed, it is optimal to hold a specific analog angle that tilts Shadow in a way that exactly negates the rail tilt. Finding such input isn’t trivial as it depends on float precise calculations, and despite our past efforts we didn’t manage to write a script that computes it in real time. For this TAS, we used a brute force script that first tests sparsely distributed analog inputs, and refines the search around best candidates until we find an analog input that yields the highest forward speed on the rail.
Loop Speed
Loops have triggers that give a lot of speed and lock us into on-rails movement to make the loops work smoothly. We are able to abuse these triggers by hitting them in multiple unexpected ways, triggering only the speed given (sometimes multiple times) without the movement lock. With this tech we are able to cross extremely large distances through the air.
Bbounce
A unique scenario when touching certain objects with gravity skew. Effectively an HVC. Converts forwards speed to upwards speed and keeps gravity angle.
Storage
When holding B, before charging a spindash we are in a property called storage, it turns our attacking hitbox on and moves our hitbox down as if we were somersaulting.
Storage Clipping
The aforementioned somersaulting hitbox lets us get under some collision made for somersaults without losing speed actually doing the action.
Moonwalk Clipping
Walking into collision backwards doesn’t work too well and lets us, with enough speed, clip through some thinner collision

Stage by stage comments

Iron Gate
  • Time: 0:39.25 [v2]
    • Tricks: Turnaround boost, Wall boost, ZRot Storage + clipout, Side Speed Resetting
    • Fun fact: Wall boosts, Zrot Storage and Backface wallruns were all found in the TASing process of this stage.
Hot Shot
  • Time: 0:19.80 [v1]
    • Tricks: N/A
Dry Lagoon
  • Time: 0:07.34 [v2]
    • Tricks: glitchy dismount, zip, brake rebound, backwards water current push
    • Fun fact: The improvement of the TAS up to Dry Lagoon compared to the 2019 WIP was greater than 1024 frames. This allowed us to get the same layout in Dry Lagoon in an earlier 1024 cycle
Sand Ocean
  • Time: 0:47.24 [v3]
    • Tricks: bomb juggling into VHC, insta warp, pot clip, cannon rotation freeze
    • Fun fact: This stage was TASed 3 times.
Radical Highway
  • Time: 1:04.02 (1:03.85 IGT) [v2.5]
    • Pause Frames: 10
    • Tricks: rail optimisation, moonwalks, moonwalk clip, loop speed
    • Fun fact: This stage was also TASed 3 times.
Egg Quarters
  • Time: 0:06.40 (0:05.92 IGT) [v2.5]
    • Pause Frames: 4
    • Respawn Frames: 25
    • Tricks: zip, death abuse + upgrade
    • Fun fact: This stage was also also TASed 3 times.
Lost Colony
  • Time: 1:59.32 (1:59.15 IGT) [v2]
    • Pause Frames: 10
    • Tricks: bullet snipe (ring box), stacked speedshoes
Weapons Bed
  • Time: 0:57.82 (0:57.72 IGT) [v2]
    • Pause Frames: 6
    • Tricks: heavy wallrun abuse, mech zip, speed conservation with hover, death to stop timer
Tails 1
  • Time: 0:10.62 [v1]
    • Tricks: death to stop timer
Security Hall
  • Time: 0:04.75 (0:04.67 IGT) [v2]
    • Pause Frames: 4
    • Tricks: clipping in-between geometry, death abuse, wallrun drill boosting, spring animation extension
Flying Dog
  • Time: 0:30.99 [v1]
    • Tricks: heavy RNG manipulation
    • Fun fact: With some recent research into boss movement manipulation, the time for this stage can go down! Because of hunting sets being a limiting factor for reducing the final time, it would not affect it.
White Jungle
  • Time: 0:58.15 (0:58.09 IGT) [v1]
    • Pause Frames: 4
    • Tricks: loop speed, mock bounces, moonwalks
Sonic 1
  • Time: 0:10.94 [v1]
    • Tricks: N/A
Route 280
  • Time: 2:31.74 [v1.5]
    • Tricks: drift extension, air time reduction, rail boosting, sideways driving, backwards driving
Sky Rail
  • Time: 0:30.04 (29.99 IGT) [v2.5]
    • Pause Frames: 3
    • Tricks: bbounce, gravity homing attack boost, rail optimization
    • Fun fact: This stage was also also also TASed 3 times.
Egg Golem
  • Time: 0:09.70 (0:09.67 IGT) [v1]
    • Pause Frames: 2
    • Tricks: boss movement manip, precise bullet sniping, death to stop timer
Mad Space
  • Time: 0:08.00 (0:07.77 IGT) [v1.5]
    • Respawn Frames: 14
    • Tricks: clipping in-between geometry, death abuse, warp glitch
Knuckles
  • Time: 0:14.32 (0:14.29 IGT) [v1]
    • Pause Frames: 2
    • Tricks: N/A, JUST SWAG
Cosmic Wall
  • Time: 2:56.07 (2:55.94 IGT) [v1.5]
    • Pause Frames: 8
    • Tricks: platform clip upsnap, 51% clip, wallrun
Tails 2
  • Time: 0:13.95 [v1]
    • Tricks: boss movement manip
Final Chase
  • Time: 0:34.87 [v1]
    • Tricks: rail optimisation, gravity abuse, killlplane avoidance
Sonic 2
  • Time: 0:14.90 (last input at 0:14.62) [v1]
    • Tricks: boss movement manip

Other comments

Screenshot suggestions:

VI 17870



TASVideoAgent
They/Them
Moderator
Location: 127.0.0.1
Joined: 8/3/2004
Posts: 18099
Location: 127.0.0.1
JankRusty
Any
Location: International
Joined: 4/24/2026
Posts: 36
Location: International
Somebody needs to combine this with the Hero Story TAS for an All Stories TAS.
d-feather
He/Him
Location: Everett, WA
Joined: 2/12/2015
Posts: 160
Location: Everett, WA
That sounds like a good idea, but from what I know, nobody's done a proper Last Story TAS yet.
:shrug: I'm more active on Twitter nowadays: @HunterCoates5
Joined: 3/15/2020
Posts: 4
d-feather wrote:
That sounds like a good idea, but from what I know, nobody's done a proper Last Story TAS yet.
Firebow59 has one!
JankRusty
Any
Location: International
Joined: 4/24/2026
Posts: 36
Location: International
Then anyone could make an All Stories TAS now if they have the skills to do so. Although you would need to change the RNG for Knuckles and Rouge's stages. Overall it shouldn't be too hard. Maybe I'll make one myself.

1791577655