After SRC’s 2023 redesign, I (@GFD, EHF’s sole super moderator on SRC) could no longer edit several guides I had written for EHF because of newly‐imposed text length limits. They are now hosted here instead, along with all other rules and guides for completeness.


Maintainer
cohost.org/GFD

If you time your runs with LiveSplit, using the auto‐splitter script I created (available in the Resources section) is highly recommended. It will generate a proper save file, launch the game, send LiveSplit the in‐game time, and perform splits for you. It will also log split times and IL times to the terminal.

This script sends commands to the LiveSplit Server component. In LiveSplit, make sure to set your comparison to “Game Time” and add a “LiveSplit Server” control to your layout. Before running the script, remember to start the server by right‐clicking LiveSplit and selecting “Control” → “Start Server”.

You can open the auto‐splitter script in a text editor to change some settings at the beginning of the file, including where the Speedrunning Edition executable is located, whether you’re doing full‐game runs or IL runs, whether VSync should be enabled, and what IP and port to use for connecting to the LiveSplit Server. The default settings will work for full‐game runs if you run the script from the same directory that the Speedrunning Edition executable is in.

Running the auto‐splitter script requires Python 3. It also requires the win32gui library to read from the game window, which you can install by running python.exe -m pip install pywin32 from CMD/Powershell. Then simply open the .py file with python.exe, and it will start the game and connect to the LiveSplit Server. When the game is closed, the script will terminate. (Sometimes running the script again doesn’t seem to restart the timer in LiveSplit unless you also restart LiveSplit. I don’t know what causes this; it could be LiveSplit’s fault.)

Version changelogs:

Version 2

  • Fixed splits without IL times logging the last IL time anyway.
  • The final IGT sent to the LiveSplit Server now matches the in‐game IGT, rather than the sum of the run’s split times. This was sometimes resulting in a variation of ±0.02s on the final time between the game and the script due to rounding errors, so this variation now applies to the final split time instead.
  • When completing a full‐game run, the script now terminates and logs the final IGT.

Version 3

  • Fixed several logic issues, including one where sometimes all splits would be set to the second split time immediately after said split.
  • Compatible with Speedrunning Edition version 3’s window title formatting.
  • Added a configuration option to not use LiveSplit at all (just set up the game and log times to the terminal).
  • Disabled VSync by default.
  • Reformatted the way times are printed to the terminal.
  • Pauses after the script terminates, so the terminal remains open for review afterwards when using python.exe directly.


This guide has some information and explanations about strats for the individual chapters. It is meant to be a sort of companion to watching the speedrun strats directly. See also the level leaderboard.

Intro

Press escape right as the game engine starts to skip through the logo as fast as possible (0.33s). There’s a little window where this buffers, so you can usually get this if you’re just mashing it.

In general, I think you want to maximize tire contact with the ground in order to maintain the acceleration you get from them.

It doesn’t technically matter how fast you’re going during the text crawls, as the terrain generation will generate the next section of the level after it finishes.

Braking before the loop‐de‐loop to skip going through the whole thing can save a few seconds when done well. You can anticipate this because the terrain generation becomes fixed (that is, it stops being random) a couple seconds before the loop.

Dream

When the terrain is shifting in the first and last rooms to reveal the dream door, it takes a little bit longer than you might expect before spin‐dashing into the door will actually work, as the terrain in front of the door finishes recessing pretty slowly. This is easier to observe with the collisions viewer in debug mode.

Cabin

Past a specific point (shortly after the Tornado scrolls off‐screen), control of Sonic will be lost and he will skid to a stop, after which Tails starts up the Tornado and drives past. The next part of the cutscene doesn’t start until they get a certain distance past Sonic, and their starting position is always from where they were standing. So, it is optimal to stop as close as possible to the spot where you lose control, as not only does stopping more quickly make Tails start driving sooner, but Tails driving past Sonic also happens earlier because Sonic’s closer to him. From a fully‐charged spin‐dash, a good visual cue of when to switch from holding right to holding left is immediately after you pass the middle of the bush.

Panjan

In Any%, intentionally take damage from Panjan as soon as the Tornado starts descending at the start of each phase to skip having to ride on it.

In the platforming island section, the optimal movement is to jump off the wall into the right‐facing spring, and run down the other wall to reach the ground faster. Once you land on the other side of the wall, Panjan will start moving again, so your goal is just to get there as soon as possible.

It doesn’t really matter how early or late you hit the drone during its vulnerability period; the next island always shows up at the same time.

Water

I’ve found a few OoB clips here, but they just trap you. Avoid doing these.

Every fifth bubble spawned by the bubble spawners will be one that quickly grows large enough to be breathable. If your movement is consistent, the bubble spawns will be too. Missing the first one seems to require good movement following Panjan, as if you’re even a bit slow it’ll get in your way.

Climb

When doing ILs, dying here will erroneously return you to Water. This doesn’t happen during full game runs for whatever reason.

Drill

Every platforming phase that occurs after dealing damage during the mine phases can be skipped by hitting Drill the same frame its shields go down and it becomes vulnerable. This is only feasible in Any% (though it’s not technically impossible in ZRM), where you can abuse invulnerability frames to hug its core and guarantee you hit it on the first frame it’s vulnerable. A technical but fairly reliable way to do this is to spin‐dash into the fifth mine it drops during each phase. The mine drop order is always ↓ ⁠↑ ⁠↓ ⁠↓ ⁠↓ ⁠↑ if you’re close to it, so the fifth one will always be on the ground to be spin‐dashed into. It’s better to hit the first such mine in particular with a 4‐charge spin‐dash rather than the maximum 5‐charge if you can manage it, since the slower speed will help to recover more rings after taking damage. Alternatively, if Drill is at a point in its sinusoidal movement pattern where it’s moving steeply downwards, you can just run into it on the ground and not really go anywhere, which will normally be the second hit if you’ve gotten the first skip.

You don’t need to jump into it to deal damage — running into it or even standing on it works fine.

If Sonic falls too far behind, the Drill will skip dropping some mines.

The autosave occurs three seconds after getting the final hit. Exiting to the menu and starting the just‐unlocked Grass chapter immediately rather than waiting through the boss death slowdown is much faster.

Advancing Drill from phase 0 to phase 2 has these minimum requirements:

  1. Get within horizontal range for it to start tunnelling (phase 1);
  2. Be within range after it’s done tunnelling downwards to start subphase 2;
  3. Wait for the assessment to appear (phase 2), which is on a timer that, for every 0.25 units that Sonic’s speed at the moment this sub‐phase activated deviates from 26, increases by 1 frame.

As a consequence of this, when going down the vertical tunnel to start phase 1.2, you do not want to go fast. Just running down the left side by holding right and following the curve will actually be faster than using jumps on the curve to generate additional speed, because phase 2 starting later is more time loss than you will get in time save by starting phase 1.2 earlier. You can view a demonstration of this here.

Grass

Jumping off of the descending slopes of the hills is faster, as is jumping up the ascending slopes; doing both saves a whole 0.2 seconds across all the hills, so it’s not really noticeable in real‐time.

After the oval lined with boosters, care must be taken to not spin‐dash too close to the downward‐facing booster behind you. The collision radius of boosters (among a couple other objects, like stationary rings) increases with Sonic’s speed, likely in an effort to prevent Sonic from simply passing through their collision radius if he’s moving too quickly, but this also means spin‐dashing close enough to the downward‐facing booster will make its collision radius instantly increase, and it will boost Sonic straight down through the ground. This is easier to observe with the collisions viewer in debug mode.

Robot/Doors

The autosave that unlocks this chapter happens earlier in the cutscene than the point you’re spawned at when reloading it, so it’s a bit faster to select Robot from the menu right after that autosave happens.

Getting an early hit on the hull is simple and fully consistent: hold right when starting the chapter, and then start holding down and left between the two “orchestra hits” in the music (the timing is surprisingly lax). This saves over a minute.

This boss is unique in that it is split up into two chapters. Furthermore, you can damage its 3 limbs in the first chapter, and the damage will carry over into the second chapter. The collisions for the limbs are always active, and so they can always be damaged (unless they are concealed by sawblades like during the lazor attack phase, as those seem to take priority). Every limb hit done in the first chapter will skip one of the three orb attack phase in the second chapter, so it’s much faster to do this, but success hinges partially on Robot’s random movement.

At certain points, you can roll and hold back to slow down and get close enough to hit one of the limbs. This includes after the first early hull hit, right after any red wave attack phase, and right after Robot crashes through the Doors at the start of that chapter. Note that if you hit a limb right as the shaft straightens out for starting the lazor attack phase, that phase will be skipped entirely, and you will have to sit through another two red wave attack phases before getting another lazor attack phase, adding a lot of extra time.

As the early hull hit demonstrates, hitting the hull does not require a spin‐dash — it is sufficient to jump or roll into the hull at high speed. Hull hits in lazor attack phases can rarely be chained into limb hits, which is also fast but inconsistent.

It’s also possible to speed up the lazor attack phases by slowing down right as/before it starts charging such to make it turn so far that the coil is sticking through the side of the infinite shaft after you are behind the coil; this lets you spin‐dash on the coil and get a hit on the hull without having to wait until after the lazor is fired. This is a lot more risky to do in Zero Ring Mode as getting stuck behind the coil and failing to spin‐dash to get a hull hit in time (which can happen if Sonic refuses to face the correct direction) will almost certainly result in death. Also, be sure never to hit the hull while the lazor is out or it will never go away, making the boss impossible to beat.

You can clip out‐of‐bounds with this boss by getting squished between it and the wall. You can also greatly outrun it or fall too far behind after hitting it. Doing either of these will activate a failsafe to kill Sonic when he gets too far away from Robot, which also throws up a Game Maker error dialogue. Clicking “✗ Abort” on the error dialogue will quit the game, but clicking “✓ Ignore” will resume it without any issues. (These errors are from the Robot’s code trying to access Sonic’s variables after the instance for Sonic was destroyed.)

The red wave attacks only hurt you after they’ve hit the wall, and their hitbox lags behind their sprites slightly. This is easier to observe with the collisions viewer in debug mode.

Hell

Thankfully, all the Hellish “autoscrollers” in this chapter can be skipped.

There are several ways to get past the first contraption without operating it. A fast and consistent way is to charge a spin‐dash facing right on the floater platform at the beginning of the chapter, and release it when the platform drifts under the girder and Sonic is left stuck against the girder facing upwards. (You can release this spin‐dash earlier if you can time it well, as Sonic’s facing sometimes briefly changes to upwards while Sonic is against the girder and the floater is moving downwards, but this is much less consistent.) Then you run along the ceiling to the right until you can jump down into the pipe. For extra speed, you can jump off the girder right as you release the spin‐dash on it and then jump off the left wall to give you more rightward momentum.

In the next section, push the switch to the left 5–7 notches and quickly spin‐dash ×2/3 to the right. (Using a faster spin‐dash will tend to send Sonic careening past the next switch and into the jumping blobs further to the right.)

Push the next switch left 3–4 notches, and spin‐dash ×5 to the right off the upper platform to make sure you go over the jumping blobs. Sometimes the jumping blobs will rarely still manage to hit you, so it’s good to have some rings as a safety. This chapter, like most, puts you back down to 0 rings at the start, so you can either try to grab rings at the start before spin‐dashing on the floater platform, or you can do an extra jump off the upper platform to grab the rings there. If you can, jump over the lava when you reach it; even if you press space too late, you should still trigger the autosave for the ZigZag chapter, but jumping across lets you reach the next section without having to deathwarp, which saves a few seconds.

ZigZag

While it’s possible to skip pushing the first switch, you do need to push it to advance the game state so that the Doll boss will spawn.

Running up the wall to reach the hallway to Doll rather than going to the left to use the floater and spring and pipe is such a simple speed strat that I’ve even seen a few casual playthroughs end up doing it since it can be easier to figure out.

Doll

Doll’s attack phase loop is:

  1. Sweep ×2
  2. Eyebeams
  3. Sweep ×2
  4. Ooze
  5. Sweep ×3
  6. Sunshine
  7. Sweep ×2
  8. Entangle

It takes 9 hits. Its body will not hurt you during its invulnerability period.

During the Ooze attack, there is a hitbox around Doll of the same size as the purple circle that’s drawn, but it’s offset vertically from that circle, instead being centred on the weak point.

Free

This is unlocked with the Chopper autosave, even though loading this puts you at the start of the elevator. Since there is no actual autosave trigger between Doll and Free, they are combined in the splits. (I imagine this and Hangar both lack autosave triggers because you can’t die in either of them.)

Spin‐dash can’t be charged without issues until the frame the elevator door opens.

Chopper

Chopper’s attack phase loop is:

  1. Dangle
  2. Sweep
  3. Wind
  4. Flash

It takes 5 hits. Every attack phase can be damaged.

Since its core is solid, it’s possible to get multiple hits in a row by staying on the core after hitting it and jumping back onto its weak point when its invulnerability wears off. Even more difficult but even faster is jumping off of it at just the right time to instantly hit the weak spot again without taking damage from the blades; getting instant hits like this does not advance its attack phase.

In the Flash phase, the time at which chopper lunges towards Sonic is relative to when the flash grenade was thrown, not when it goes off (which is relative to when it hits the ground).

Tails’ grab box is not active until he initially starts moving upwards.

Hangar

Like Free, this is unlocked with the Join me autosave, so this chapter is combined with Chopper in the splits.

The buttons don’t activate unless you’re standing completely still on top of them — this means not rolling or crouching, and not even holding right against the wall.

Egg

The first phase takes 8 hits.

Hitting one of the Gun or Shock weapons near the start of your jump accelerates your ascent, and thus your descent as well. Taking advantage of this makes it possible to get in hits as quickly as the hatches open. This can still be thrown off by the randomness for how long it takes the hatches to open though.

Rarely, a knife will come out of an open hatch that you’re using to get a hit in and damage you. There doesn’t seem to be any way to predict this.

In Any%, there’s no need to wait for the lazors to stop in the second phase. The game is really generous with invulnerability frames here for some reason, so just keep running into them to reach the core.

Even in Zero Ring Mode, you can get a hit before the lazors come out at all during the first 2 cycles.

Roll

There’s no real way to optimize this; extra jumps seem to be slower if anything, and trying to do a fancy spin‐dash strat just kills you. Just hold right and jump once for each of the 4 rocks in your way. Variances in time here are caused by the slightly random generation of the ground terrain, as steeper slopes are faster to jump off of, but you also want to land sooner to resume running acceleration.

Emeralds

As far as I’m aware, nothing you do here will make this chapter any faster. It’s kind of a joke split, since there is technically gameplay in this chapter, but it doesn’t actually matter.

Battle

Super Eggman’s attack phases are:

  1. Lazor
  2. Shockwaves
  3. Lazor + 2 proxies
  4. Shockwaves (fast)
  5. Lazor + 2 proxies + nukes

For the first phase, hold up immediately or his first lazor will always hit you. If you just keep moving right the whole time and avoid both lazors, you can always hit Super Eggman before he can do his shockwave attack this phase. You can also do this on the other two lazor phases if you hang back slightly.

Super Eggman’s defensive shockwave attack comes out 1 second after he starts charging it, and your shield comes out half a second after you start charging it. This makes the optimal time to start charging your shield half a second after Super Eggman starts charging.

The collision detection for when you ram Super Eggman is radial, so your vertical position does matter. This is easier to observe with the collisions viewer in debug mode, but for a general visual indicator, you want to keep Sonic’s nose pointed at where his six‐pack meets the hem of his pants.

The third and fifth phases are easiest to do if you can avoid the first lazor and proxy projectiles by staying at the top of the screen. This isn’t possible if Super Eggman is too far up when he comes back on‐screen, which can happen with bad luck: the explosions that send Super Eggman off‐screen happen randomly and send him at randomized speeds in randomized directions. You can try to prevent this by dragging Super Eggman to the bottom of the screen before hitting him during the shockwave phases. These explosions also influence how far off‐screen he is sent, and so you can gain and lose time at complete random depending on how long it takes him to come back on‐screen. Super Eggman isn’t prevented from charging and firing lazors when coming back on‐screen, so if your luck is especially bad and it takes him more than 180 frames to come back on‐screen, he will fire a lazor. For this reason you should avoid ever staying in front of him during his recovery time.

Ultimate

This chapter has a lot of small movement optimizations throughout. In general, you want to be jumping off downwards slopes to gain speed and jumping over upwards slopes to avoid losing speed. Uniquely for this chapter, when you are above top speed, you want to stay airborne as much as possible to better maintain that speed, as deceleration in the air past top running speed is less than on the ground and top running speed is so low.

There is a “barrier skip” for the very end of this level (video tutorial). It saves ⁓25 seconds, is at the very end of the run, is frame‐perfect and then some, and can’t be attempted more than once or twice. For a mechanical breakdown: Jumps ultimately give additional speed, and the ramp downwards leading up to the “barrier” at the end of the chapter has two separate line collisions, so jumping off of both these lines while running down the ramp gives enough speed to barely clip up onto the rising collision of the barrier later. There is only one frame where Sonic can jump off the first line of the ramp without actually leaving the ground, because he’s clipped into the next line for one frame before he starts running on it. Jumping here gives him the extra speed, but since the game then puts him onto the next line, some of that extra speed transfers into his run forward on the next line. The next two inputs are more lenient, but you want to jump off the second line of the ramp, and then quickly jump off the flat ground to preserve speed. Then run down the now‐downward‐sloping ground until you’re halfway off the edge, jump again, and then jump off the end of the upward slope. If the jump off the descending ground is too early, you’ll jump clean over the upward slope, but if it’s too late, then you’ll land earlier and run along the upward slope for too long and lose too much speed.

(It would be really cool if the in‐game timer could stop when the halo breaks, but it is actually possible to die after that.)



Almost everything you need to compile Eggman Hates Furries from its source project file is available in the “EHF Compiling Kit” tool in the resources section.

Compiling this game requires upgrading the Game Maker 7 installation to the Pro version. The online DRM to do so is no longer functional, but a crack is available, which is usually named “GM70_DrXJ.exe”. I cannot verify the safety of this software, and as such it could have additional malicious payloads. Modern antivirus software WILL quarantine it, either before or after performing the crack. (Consequently, it is not included in the “EHF Compiling Kit”; please contact me privately.) I only recommend executing this file from within a secure, disposable virtual machine. (Windows 10 Professional’s “Windows Sandbox” feature is a dead simple way to do this.)

You should run Game Maker 7 in “Advanced Mode” when opening any EHF project files.

Because Game Maker 7 queries the operating system to render fonts when compiling executables, you will need to install the fonts in the “fonts” folder in order to compile the game with the fonts intact. (There are two versions of “SF Foxboro Script”: “v1” was used in the original release and is the most readable, and “v2” was used in version 2 and is included for completeness.) You will also need to disable the system‐wide “font smoothing” effects when compiling, or else they will be blurry in the compiled executable. You can find this option under Control Panel → System and Security → System → Advanced system settings → “Advanced” tab → “Performance” section “Settings…” button → “Visual Effects” tab → “☐ Smooth edges of screen fonts”.

The current codepage must be set to 1252 for the fonts to render correctly. (Running “chcp.com” in a terminal will tell you the active codepage.) Windows 10 and later may set this to 65001 by default (UTF-8). You can change this at Control Panel → Clock and Region → Region → “Administrative” tab → Change system locale… → “Current system locale” dropdown. Setting this to English (United States) will work. On Windows 10 and later, you must also uncheck “☐ Beta: Use Unicode UTF-8 for worldwide language support”. This requires a restart to take effect (note that this means Windows Sandbox cannot compile an executable with proper extended ASCII support for fonts).

Game Maker does not let you compile a debug mode executable directly to a file, but you can click “Run game in debug mode” and then copy the .exe file from %TEMP% while it’s running (it’ll be in the folder starting with “gm_ttt_” that was created when Game Maker 7 was first opened).

When dealing with the Speedrunning Edition project file, the state of compatibility mode and debug mode are controlled by the first code execution event in the “Game Start” event of the “presentation” object. The feature to log errors to “game_errors.log” is set in Global Game Settings → “Errors” tab → “☑︎ Write error messages to file game_errors.log”.