Not About the Submission
At the time I am submitting this run, there are protests/uprisings of various levels of peaceability all across the United States.
The proximal cause of this is the murder of George Floyd (an unarmed black man) by four officers of the Minneapolis Police Department, but this is not an isolated incident. Although statistics show strong evidence that dark-skinned citizens are targeted by police violence a disproportionate amount of the time, the increased militarization of civilian police authorities, along with the steady decrease in police accountability to the citizens they have sworn to protect, is an issue that affects more than just black America.
Homeless people, trans people, sex workers, the poor, and all people with darker natural skin colors are classes of people that face a heightened risk of being brutalized or murdered by police while simply going about their daily business and committing no crime.
Police have responded to peaceable protests of their excessive use of force by committing literal war crimes against the protesters, driving their cars into peaceful crowds, and refusing to arrest other people who attempt to murder these protesters.
In the 25 days since the inciting incident, police nationwide have killed approximately 200 more people. In the last two weeks, six black men have been found hanging in trees in public, and in all six cases, police summarily ruled the case a suicide and refused to investigate. Additionally, in multiple cities, large swathes of police have resigned, or gone on strike, in response to even a single officer being held accountable for disgusting and inappropriate use of violence against unarmed civilians.
Massive reforms are necessary, and they cannot happen soon enough.
In issues like this, refusal to speak is implicit support of the status quo. Avoiding comment is equivalent to saying "nothing about this needs to change."
There is not much that I have the power to do regarding these issues, but I do have the power to say: Black Lives Matter, and Silence is Violence.
About the Submission
Emulator used: BizHawk 2.4 modified to load external tools, syncs on BizHawk 2.4.1
- Aims for fastest time
- Abuses programming errors
- Takes damage to save time
- Colors a DNA
- Staves off alien invasion using only the power of multi-layered time paradoxes
- Jumps through a bunch of arbitrarily placed hoops
- Gains advantage through the dark power of Dolphin sacrifice
- Reuses existing input
About the Game
Imagine trying to win a Formula 1 race with a steering wheel that only turns in 45 degree increments, and refuses to be turned more than 8 times in a second. Further, imagine that, even though your steering wheel locks in the direction change instantly, the wheels take a sixth of a second to complete that 45 degree. Further, imagine that your vehicle has no brakes.
That's kind of what it's like to speedrun an Ecco game.
In addition, the collision code was written by advanced analytic geometers who have ancient arcane insights into the calculations required to use almost arbitrary polygons as bounding boxes.
The good news is, the coders cut some corners here and there, resulting in a huge variety of bizarre flaws in game logic for a TASer to exploit.
About the Movie
This movie completes the game on hard mode. Hard Mode differs from easy mode in that there are two additional autoscrollers, bosses have more HP, the collection quests are longer, and several levels have additional barriers that slow you down.
Oh also there’s one added level that’s not an autoscroller, but instead requires navigating lots tricky turns in extremely narrow quarters.
This movie uses the Japanese version of the game, because I heard a rumor that the Japanese version has less lag on 3D stages. This turned out not to be true (at least under genesis plus GX emulation), but the Japanese version does have significantly less wait time in between lines of text. The result is that, even though the text is split up into a larger number of lines in Japanese, perfect text advancement saves 336 frames over the US version over the course of the hard mode run.
I began this improvement project by taking the movie file from the prior TAS, and resyncing it to the updated GPGX core in bizhawk 2.4.1, and then to the Japanese ROM. I do not think of this as a new TAS separate from the prior publication, but a continuation of the same TAS, and thus did not reset the rerecord count before starting work on this improvement.
This is just the TAS in the plain way you would normally see it in an unmodified emulator.
Have you ever wondered what it would be like if a Dolphin could see the matrix?
Acceleration in this game is obtuse and complicated.
There are three ways to accelerate in this game:
- Pressing the accelerate button, which increases Ecco’s speed by a varying amount depending on his current speed and how long the button has been held down. The speed gain increases after the 6 frames of being held down, and drops to 0 after 11. The most efficient use of the accelerate button is in 12 frame cycles of 11 frames down 1 frame up.
- Performing a short charge (charging with initial speed of more than 3 pixels per frame), which immediately increases Ecco’s speed by 4 pixels per frame, followed by overriding normal acceleration for 19 frames of charge acceleration (slower than standard swim acceleration at low initial speeds, faster at high initial speeds), then decreasing Ecco’s speed by .5 pixels per frame for 5 frames before ending and allowing a new charge. (Normal acceleration is possible during these final five frames of the charge).
- Performing a long charge (charging with initial speed below 3 pixels per frame), which immediately increases Ecco’s speed by 4 pixels per frame for 1 frame, followed by 23 frames of base 0.15625 pixels per frame (during which 1 frame worth of standard acceleration can apply for speeds of up to 0.65376 pixels per frame), then 2 frames of 4 pixels per frame per frame acceleration, 3 frames of charge acceleration, and then getting the full cycle of a short charge without the initial speed boost.
Additionally, any charge can be cancelled at any point via the sonar button, unleashing a damaging sonar blast, and skipping immediately to the final 8 frames of the charge sequence.
The fastest acceleration pattern turns out to be: accelerate button for 5 frames, then, while continuing to press and release the accelerate button in the most efficient 12-frame cycle, charge, immediately cancel that charge, wait 8 frames, and charge again.
Ecco’s swimming angle can only be changed once every eight frames, and only by intervals of 45 degrees. However, Ecco does not immediately turn to his target angle, but rotates smoothly at 4.21875 degrees per frame until reaching his target angle. As a result, you can achieve average swimming angles in between those 45 degree set-points by alternating directional inputs every 8 frames. In many cases, this results in a shorter distance travelled to navigate around distant obstacles than the old technique of travelling at the nearest 45-degree angle until it’s possible to swim in a straight line past the obstacle.
Because it takes more than 8 frames to turn 45 degrees, hitting a direction once for just eight frames before returning to Ecco’s original angle allows for relatively small position adjustments. Useful for adjusting position in narrow tubes without bumping into walls.
First, some dolphin anatomy:
Ecco’s collision is a composite of two boxes mounted on a spine of five test-points.
- Head box
- Mid-front vertebra
- Blowhole (absolute midpoint)
- Mid-back vertebra
- Tail box
Each collision or detection polygon tests a specific point, box, or subset of these 7 possibilities. With proper information about the shapes and test point of these polygons, it’s possible to swim safely past certain enemies or obstacles in positions that would appear dangerous.
By charging on the exact frame Ecco leaves a body of water, he can exit with a velocity of 4 pixels per frame above maximum swim speed.
When out of the water, if moving upward quickly enough, Ecco can initiate a spin-jump by pressing C. While spin jumping, every frame in which C is held increases Ecco’s height by two pixels versus if C had not been pressed. This allows for very precise control over the timing of re-entering water, so that Ecco can re-enter water at any desired time within the 8-frame steering cycle.
On the Vortex Future stages, and only on the Vortex Future stages, D-pad up can also be used to increase Ecco's height by an addition 2 pixels for each frame that up is pressed.
Similarly, D-pad down can decrease Ecco's height by 2 pixels for each frame it is pressed on the Vortex Future stages only.
When it is necessary to travel long distances horizontally, speed can be gained by traveling along the ocean surface and repeatedly super-breaching with a very low exit angle.
Camera position is based on Ecco’s position, angle, and movement speed. Game objects are loaded and unloaded based on their position relative to the camera, and even when loaded, many objects are not fully processed while off-screen. This can used to reduce lag, propel objects through obstacles, and a whole host of other things too varied to list.
Destroying an enemy immediately ends a charge without going through the end-of-charge deceleration sequence. The most common way of doing this is by colliding with the enemy while charging, but that immediately sets your speed to 0, which is even worse than losing a tiny bit of speed to the charge ending.
However, hitting an enemy with a charge-sonar blast also immediately ends the charge, and doesn’t set your speed to zero. In this way, whenever there’s an enemy in our path, we can gain ~4 pixels by hitting charge to get the single frame 4 pixel speed boost, and then hitting sonar to destroy it before we collide.
Unfortunately, when an enemy is destroyed, it spawns a remnant star object which changes the meaning of the charge button from “perform a charge” to “prevent this enemy from respawning” when you are within its detection radius, so it’s not possible to get 8 pixel boosts from two enemies that are close together.
During a charge, Ecco will home onto enemies in a certain detection area. This allows movement perpendicular to the swim direction without a related reduction in swim speed. Helpful to adjust position slightly without having to go through the slow process of changing angles.
3D Level Lag Reduction
In 3D levels, enemies cause lag. In 3D levels, sonar blasts kill enemies. In 3D levels, sonar blasts cause lag.
The teleport rings in 3D Levels appear in fixed positions. However, their movement type (stationary, slow moving, or fast moving) depends on the random number seed when they are spawned. And the random number seed updates every four frames.
Teleport rings with the highest spawn location are fastest to pass through when they are slow moving, as their vertical position requires a low enough jump that it’s possible to return to water within a single charge cycle.
If the conditions necessary to end a cutscene are already fulfilled when it begins, it will end itself the frame it begins, instead of playing out.
All four level-intro cutscenes have the same end conditions:
- At least 300 frames have been spent in the level.
- Ecco's spin value is below 1536.
- Ecco is facing (almost exactly) straight left after adding the low 16 bits of Ecco's spin value to his angle.
However, of the four intro cutscenes, two begin after the new level begins, and the level timer is reset to 0.
The other two begin slightly before the prior level ends, and thus are possible to skip.
Used in: Two Tides/Trellia's Bay, Lunar Bay/Vortex Future
In certain situations, there are barrier walls composed of a number of smaller objects that check head and tail box collisions. However, within a given frame, the game will stop checking for head collisions after finding a single one, and the game will stop checking for tail collisions after finding a single one. Therefore, depending on the loading order of these objects, it can be possible to swim through these barriers by overlapping the collision box with multiple objects at the same time.
Used in: Crystal Springs, Lunar Bay, and possibly in Four Islands (other stuff is going on and I’m not sure whether this technically happens or not).
Rocket Propelled Rocks
Falling rocks that shield Ecco from currents will assume Ecco’s full vertical speed when his nosehole collides with them closer to their top or bottom than their left or right sides.
In most cases, though, colliding with one of these rocks will kill most or all of Ecco’s downward speed just before it gets transferred to the rock. However, it is possible to avoid this effect somehow through careful approaches that I was not able to determine full boundary conditions on, but seemed somehow related cases involving corners.
Also, turtles are technically rocks.
Used in: Two Tides, Maze of Stone, Four Islands (Entertainment only), Sea of Green, Atlantis
When a barrier glyph is placed to block a mid-air water tube, it is possible to skip around it by exiting the tube with a vertical super-breach, and using mid-air directional control to move left and right around the force-field trigger box, splashing back into the tube above the barrier.
Used in: Trellia’s Bay, Skyway
The game doesn’t seem to test if Ecco has left water if Ecco is in the middle of a quick flip turn when he would leave it.
Used in: Sky Tides, Aqua Tubeway, Gravitorbox
Almost all end of level triggers test against Ecco’s blowhole. In auto scrollers, it’s possible to get this much closer to the leading edge of the screen by turning to be parallel to that edge, which allows for squeezing into the end-of-level trigger a few frames sooner.
Used in: Sky Tides, Dark Sea, New Machine.
When Ecco is a seagull, it is possible to perform a dive-swoop by pressing charge while down is pressed on the D-pad. But once the dive-swoop is initiated, the speed can be directed in any of the eight semi-cardinal directions without concern for gravity. This practically doubles the Seagull’s movement speed, and makes it possible to gain or lose height much, much faster than standard seagull flight, as the seagull cannot normally fly upward or downward at a greater than 45 degree angle. Embarrassingly, for the first TAS I wasn’t even aware that standard downward swooping was possible.
Used in: Fin to Feather, Eagle’s Bay
When Ecco is a seagull, he turns back into a dolphin when he hits the water.
Seagulls and dolphins have different hitboxes.
The difference in hitbox can be used to clip through thin walls
Discovered by Aludra Kijurorin of the real-time Ecco speedrunning community.
Used in: Eagle’s Bay, The Hungry Ones
When Ecco gets caught between the level boundaries (or the camera boundaries during autoscrollers) and a solid obstacle, or a wall and another solid obstacle, he will be crushed to death, which restarts the level.
This is somehow useful.
Accidentally discovered by Dolfinh, of the real-time Ecco speedrunning community.
Used in: Level id 30
If Ecco is caught in a barrier glyph forcefield in the same frame that the game transitions to a dialogue screen, the forcefield will fling him at extremely high speeds (potentially through walls) as soon as normal gameplay resumes.
This was discovered by Aludra Kijurorin, of the real-time Ecco speedrunning community.
Used in: The Eye, Big Water
When Ecco is caught clipping two or more solid walls at the same time, a chaotic system results that can have great impact on Ecco’s speed values.
Used in: Deep Ridge, Vortex Future
Swimming Through Walls
When Ecco would otherwise be crushed, but is near enough to the seam between two wall collision boxes, they simply both eject him to the seam and consider him not to be stuck.
There is more to this that I don’t fully understand, which prevented it from being used in Black Clouds or City of Forever.
Used in: Dark Sea, New Machine
Although the Metasphere in Fish City has a much larger bounding box than it appears, it still only tests against Ecco’s nosehole, making it possible to avoid being transformed into a very slow moving school of fish.
This trick also works on the levels that don’t appear in this TAS because I avoided being carried off by Vortex Drones or swallowed by the Vortex Queen.
Used in: Fish City. Duh.
Level by Level notes:
Except for a frame cloned or deleted due to differences in lag, I have only redone levels where necessary for new tricks.
U-turning sets Ecco's spin value wrong, and it isn't reset between levels.
In the prior TAS, I U-turned twice while dealing with the pushable rock. Without U-turns this takes 7 frames longer.
Had to remove a U-turn here, as well. This one cost a much more painful 16 frames.
You may notice that I'm not facing left as I trigger the ending cutscene. This is because the cutscene turns me to face left no matter what.
Save approximately 450 frames from the intro cutscene not playing, about 100 more frames saved due to a more advantageous start position making it possible to completely avoid getting caught in kelp.
Fin to Feather
Being knocked out of the sky by an eagle is 2 frames faster than diving to the water under the seagull's own power.
The prior TAS used an obsolete trick called Eagle clipping to get out of bounds on the right edge of the level.
It’s much faster to gull-clip out of bounds on the left retaining wall of the end zone instead of eagle-clipping through the right retaining wall. I saved 215 frames this way.
GrimShins, of the real-time Ecco speedrunning community discovered that you can just swim through the rocks the prior TAS uses the worm to eat. My fault for assuming the wall was solid without testing it. Also got a more optimal set-up for the second broken glyph. Put together, these saved 279 frames.
The intro cutscene in the next level doesn't actually get invoked until the time travel sequence in between the two screws with Ecco's angle and spin, thus making it impossible to skip.
The updated GPGX core in BizHawk 2.4 caused there to be 1 less frame of lag in this level.
But then a frame of spurious lag appeared after I improved earlier levels.
Due to time-saves in prior levels, there is 1 less frame of lag here.
The Hungry Ones
The prior TAS actually played the level mostly as intended, instead of flying through the right hand wall and swimming straight down to the exit.
This saves 1417 frames.
There's a cutscene at the end of this level, so I have to reset Ecco's spin value. The easiest way to do that is to catch his tail on a rock as he's re-entering the water after the jump that's necessary in this level. Then I have to redo the rest of the level with no U-turns, and find a way to swim vertically into the ending cutscene trigger while Ecco is facing almost perfectly horizontal
All put together, this costs 83 frames, and it's very difficult to tell what part of the setup is responsible for what part of the time loss.
No cutscene saves 459 frames.
No cutscene means better initial positioning for getting under the gate.
I also managed to find a much more optimal zip route, for a total savings of 522 frames.
A new strategy by GrimShins of the real-time Ecco speedrunning community reduces lag and causes the explosion cutscene to begin sooner, saving 87 frames.
1 frame lost due to spurious lag.
City of Forever
1 frame of lag saved due to the newer GPGX core in bizhawk 2.4
It’s an improvement so there has to be a
Timing Comparison Table
|Level||Level Savings||Total Savings|
|Fin to Feather||2||529|
|The Hungry Ones||1417||2442|
|City of Forever||1||2968|
Total final savings: 3304 frames = 55 seconds and 4 frames.
For finding gull clip, and generally being helpful and supportive.
- For providing an input recording of cutscene skip, so I could analze the mechanisms beneath it.
- For discovering that you don't have to deal with the worm in Asterite's Cave.
- For finding a better strategy on Vortex Queen.
- And for general help and support with the TAS.
For making me feel awesome when I finally figured out cutscene skip.
For assistance on the prior version of this TAS, and just generally being cool.
For assistance on the prior version of this TAS
I did not do any of the complex math required to prove that my steering is optimal. In fact, I did not even bother to figure out how to pose those math problems. Therefore, it is possible that my steering is suboptimal.
It's possible that there's a faster way to get dive-bombed into the ocean by the Eagles in Fin to Feather.
Multiple real time Ecco speedrunners have reported that, in Vortex Future, they were able to get an antigravity ball to push them through a wall. I could not reproduce this, but also see no reason why the same thing shouldn't work in Black Clouds. Or why Vortex Larva wouldn't be able to do it in City of Forever.
Multiple real time speedrunners have video evidence of Ecco "randomly" failing to collide with walls and/or floors in the vortex future levels. I could not reproduce this, but it would allow for significant skips in these levels if the mechanism were determined. (I currently suspect insufficient memory to allocate a new game object when loading the walls in question.)
I have seen a clip of GrimShins swimming through a wall in Black Clouds. There is nothing special about the wall that was swum through. I was unable to replicate this, let alone determine the cause. This potentially implies that all rectangular walls in all levels can be swam through, which would radically alter the run's routing.
It probably indicates that all rectangular walls in Vortex Future levels can be swam through, which would radically alter the routing in Black Clouds and Gravitorbox.
Both Black Clouds and Gravitorbox have the level geometry required to initiate zipping in the way I used in Vortex Future, but due to collision box loading order or other reasons, I was not able to initiate any useful zips in those locations. Again, these would produce significant time saves.