Official versions
Eggman Hates Furries has three official versions. There are no gameplay differences between any versions; they only introduce compatibility changes and accidental regressions.
Version 2 changelog
Released on 2014‐02‐03.
- Playback for all MIDIs except FoxFace and Samwedo was changed to use the Windows Media Player core instead of DirectSound, due to issues with DirectMusic in Windows 8 that caused crashes with most MIDIs. This makes the game freeze when playback of affected MIDIs begins (with a range of about 0.6–1.75 seconds on my PC), and also causes some notes at the very beginning and end of these files to not be played.
- The playback volume of all MIDIs has also been decreased, sometimes very significantly.
- FoxFace.mid was changed in some way (including the copy within the Game Maker project file), possibly to make it playable by DirectMusic in Windows 8.
- The third attack phase of Doll no longer plays a MIDI cover of “Can You Feel the Sunshine?” as the switch to the more limited Windows Media Player core removed the ability to finely control MIDI playback volume, so the game now uses a looping sample lifted from the original song. This also introduces a bug where this sample can play indefinitely.
- Some fonts were altered:
- ringfont and menuFont were changed from LCDMono Ultra and LCDMono2 Ultra to LCDMono, likely in error.
- speechFont’s render changed significantly because SF Foxboro Script’s Bold style was properly installed. This actually results in the intro text becoming significantly more difficult to read.
- foxBoro and speechFont’s renders also changed very slightly due to a minor font version change.
Version 3 changelog
Released on 2018‐07‐22.
- The method for creating the white noise effect used at the end of the final boss was changed from actual randomly‐generated noise to some pre‐generated background images. This fixes a rare crash in some buggy graphics drivers that was triggered by the original method’s utilization of a D3D surface.
- credits.txt was edited to reword the first paragraph, fix a typo in line 127 (it's → its), and update Oddwarg’s email address.
- Several fonts (counterfont, ringfont, foxBoro, speechFont, and menuFont) were changed to Arial, which is almost certainly a result of the font families used (LCDMono and SF Foxboro Script) not being installed at the time of compilation, resulting in Game Maker 7 replacing them with the default of Arial. Besides the aesthetic changes, this notably results in the text in the final cutscene drawing past the edge of the screen.
Speedrunning Edition
I’ve compiled modified executables based on Oddwarg’s released source project file (which itself is based on version 3). They’re available on the resources page. As these modified versions add in‐game timer functionality and eliminate uncontrollable variations in timing without affecting gameplay at all, they must be used for speedruns. Any submitted runs that do not use the Speedrunning Edition will be rejected.
The executables with “compat” in the filename retain the compatibility code changes made in the two updates to the game, while the others revert to the behaviour seen in the initial release. The executables with “debug” in the filename are “debug mode” executables (which are not legal for speedruns), the changes to which are described further down.
These executables can be used in conjunction with a Python script I’ve created that connects with the LiveSplit Server component for automatic in‐game timing and splitting. Read the Using the auto‐splitter script guide for more information.
Speedrunning Edition general changelog
- Reverts fonts to their appearance in version 1.
- Adds an in‐game timer to the top‐left, which stops when the last chapter begins.
- It pauses during the last part of “End” and gains 55.377 seconds. This compensates for the game’s usage of the PC’s system time for controlling the cutscene’s duration to sync to the music, which could otherwise cause random variations in timing as a result of complications with the operating system. (This can be easily observed by clicking and holding the titlebar during this time, which makes the cutscene end earlier relative to the game state.)
- Segment times (yellow) and IL times (green) display in the top‐right at autosaves when valid/applicable.
- Reloading a chapter by dying is not valid for an IL, as this restarts chapters slightly differently.
- The game’s window title shows the current in‐game time, the last segment time, the last IL time, and the number of splits.
- Using a completed save file makes running ILs easier:
- The timer restarts when starting a chapter from the menu.
- Autosave indicators and segment/IL times (when applicable) now always appear, rather than only when reaching an autosave for the first time.
- Pressing shift+enter reloads the last chapter that was selected at the menu in the same way the menu would after a 500ms delay, for attempting ILs. (“Intro” is only reloaded if no chapters have been selected from the menu since starting the game, because of how restarting the intro functionally restarts the game.)
- The “control help” overlay’s up arrow now shows when space is pressed instead of the up key, to make it more useful as a native input display.
- The “LOW FRAMERATE” message now only appears during consistent lag, and the speed threshold to trigger it has been changed to 7⁄8 normal game speed (up from 4⁄5).
- The hidden debugging function is disabled outside of debug mode (see Controls and techniques for more information).
- Shows an error message and forcefully terminates the game when switching away from the user desktop running the game (such as when pressing Ctrl+Alt+Delete, viewing a UAC prompt, or locking the PC) due to a Game Maker engine bug (see the “Engine Bugs” section of Controls and techniques for more information).
- Parts of “Eggman” are reprogrammed to use the game state for timing, rather than using the PC’s system time to sync to the music (similar to “End”). This is the only change which alters the playsim directly, but it just removes the possibility of this cutscene causing random timing variances as a result of complications with the operating system. (Like with “End”, this can be observed in the original game by clicking and holding the titlebar during this cutscene.)
- Fixes a game bug where the menu credits (not the end credits) would use the wrong font if anything else drew text using a different font (i.e. the “LOW FRAMERATE” warning or my timer) after they started.
- Fixes a game bug where, if gameplay is interrupted (e.g. death, returning to menu) while the sample from “Can You Feel the Sunshine” is audible during Doll’s third attack phase, it keeps playing until the Doll boss is spawned again.
Speedrunning Edition “debug mode” general changelog
- These are compiled in Game Maker 7’s “debug mode”, which adds a window with various controls, including:
- Variable watching, including watch list saving and loading;
- Listing of all variables (local or global), instances, and messages;
- Arbitrary GML code execution and room speed control.
- Its controls for save states and frame advance should be disregarded in favour of improved functionalities described below.
- Always draws “DEBUG MODE” in the bottom‐left of the main view area (unless instance inspection and the game view are both active).
- The failsafe that terminates the game when switching away from the user desktop is disabled (though this often crashes the debugger anyway).
- The game window shows the cursor and can be freely resized, to facilitate some of the following features.
- F1 toggles drawing of most types of collision checks.
- Inactive collisions become desaturated.
- Radial collisions with a negative radius are drawn as solid circles, rather than outlines. (A negative radius requires another radius to fully overlap it before the collision check succeeds.)
- Collisions for objDoomKnife, objDoomWave, and objElectricWall (when they have gaps) do not compensate for Sonic’s radius, so a point is drawn at Sonic’s base coordinates when these collision checks are running to properly illustrate them.
- The remaining leniency on objJawCollider objects is visualized as an added blue tint, so they shift from fuchsia and turn red when they are damaging.
- F2 toggles instance inspection. An arrow is drawn from the mouse cursor to the nearest instance, and its id and object name are shown in the bottom‐left of the window. These controls are added:
- The left mouse button locks‐in the selected instance when pressed, and teleports the selected instance to the cursor when released unless shift is held.
- The right mouse button copies the selected instance’s object name to the clipboard, or its id if shift is held.
- Pressing F7 resets the game and toggles “camhack” mode. This increases the draw resolution to the size of the game window when F7 was pressed, and gives a full‐screen view of the room. While active, these controls are added:
- The = equals and - hyphen‐minus keys, the page up and page down keys, and the mouse wheel zoom the view in and out. Holding shift zooms faster. 0 resets the zoom.
- Holding the middle mouse button makes the mouse pan the view. Holding shift pans faster. Tapping the middle mouse button without moving the mouse resets the panning position.
- F3 switches back and forth from displaying the usual “game view”.
- F5 and F6 save state and load state respectively. This stops all playing sounds first, to prevent sound engine crashes and issues like sounds endlessly looping. (These would happen because of the game’s sound being handled by the “Super Sound System”, which is an external DLL, so changes to the game state can make the game lose track of external sound handles.)
- If shift is held and there is text in the clipboard, it will try to use that text as a filename (not including the “.sav” extension) for the savestate. (The default file used otherwise is “_save716750.sav”.)
- Loading a state saved while “camhack” mode is active and switched to “game view” can cause the rendering area to be resized. This appears to be a Game Maker bug; avoid saving states with this view active.
- Other errors when loading states are still possible. For instance, states only work with the current session, and loading a state saved during death will raise errors because the background drawing has since been unloaded, so these should be avoided.
- Pressing F8 toggles frame advance, advanced by pressing Z. (This is different from, and less cumbersome than, the native frame advance from Game Maker’s debug mode, as you don’t have to switch off the main game window to advance frames.) Only F5, F6, and F8 will take effect immediately while frame advance is active. (Be aware that loading a state won’t have any visual effect until the next frame, when the screen is redrawn; for states saved during frame advance, this necessitates advancing a frame manually.)
Note that none of these added features function during the end credits.
Speedrunning Edition revision 1 changelog
Released on 2019‐12‐26 (the same day as the initial release).
- Improved the logic for the routine that autosaves after completing the “Intro” chapter. It now only shows the autosave indicator and split times when clearing the intro for the first time or when using a completed save file, rather than always.
- Removed an unnecessary call to save() in the routine that autosaves for all the other applicable chapters besides “Intro”. (There’s no reason to update the save file when you’re already using a completed save file.)
Speedrunning Edition revision 2 changelog
Released on 2022‐04‐17.
- Added more executables that remove the compatibility changes made in the latter two official versions. On at least my Windows 10 system, there seem to be no issues reverting these changes.
- The use of an actual sample from “Can You Feel the Sunshine?” rather than a MIDI cover (as in the first version) during Doll’s third attack phase was maintained due to stylistic preference and for reduced code complexity. However, a game bug was fixed where it could play indefinitely.
- The window title now shows the current split number at the end.
- An updated auto‐splitter script is required to work with this version’s window title formatting, as such.
- The internal copy of Foxface.mid was changed to match version 1. (This version is used when not in compatibility mode.)
- The timer in the window title now updates while the game is paused.
- The timer no longer resets if “Intro” is chosen from the chapter selection menu during a run.
- The font changes in version 2 were reverted; fonts now match the game’s initial version 1 release.
- The debug mode executables now draw “DEBUG MODE” in the bottom‐left of the main view area.
- The debug mode executables have several added features:
- Collision display
- Instance inspection and displacement
- “Camhack” mode
- Improved save state functionality
- Improved frame advance functionality
Speedrunning Edition revision 3 changelog
Released on 2022‐04‐27.
- Now throws a fatal error when encountering the Game Maker engine bug that manifests when switching away from the user desktop in Windows currently running the game (see the “Engine Bugs” section of Controls and techniques for more information).
- Collision display: some radial collisions are now drawn more accurately; specifically: objring, objfallring, objBoostPad, objbouncer (springs), ult_bouncer (springs in Ultimate), and objPipeInit.
- All of these except objfallring (which just drew the interaction radius too small) now show how their collision size scales with Sonic’s speed. (This was probably done to prevent Sonic from going so fast that he passes over them, but also causes issues like when spin‐dashing near the underwater boost pads in Grass, which can now be properly visualized.)
- Standardized shadow colours on debug mode text.
- The debug mode executables now write error messages to game_errors.log.
Speedrunning Edition revision 4 changelog
Released on 2022‐07‐11.
- The “LOW FRAMERATE” message is no longer triggered by slowdowns from pausing and frame advance, and long pauses that only last a single frame (such as those caused by loading MIDIs when using the compatibility executables) now influence it minimally. It has also been made a bit more sensitive to real slowdown, now using a threshold of 7⁄8 normal game speed rather than 4⁄5.
- Fixed special characters (in particular, the letter Ø as seen in the credits) rendering as ▯ due to the compiling PC’s system locale previously being set to use CP-65001 (UTF-8) rather than CP-1252.
- Minor code cleanup and optimizations.
Debug mode changes
- The failsafe that terminates the game when switching away from the user desktop no longer activates in debug mode (though the Game Maker 7 debugger hates it when you do this anyway).
- Collision display now includes all manual collision checks previously noted as absent: robot_lazor, objLavaFall, doll_eyebeams, objDoomKnife, objDoomWave, objDoomRack (Egg phase 2 lazors), and interruptableLazor (Super Eggman).
- Collision display of movingsector no longer draws an entire circle, just the relevant segment.
- Collision display of objElectricWall objects with gaps now accurately reflect their shape.
- The collisions/drawings for objDoomKnife, objDoomWave, and objElectricWall objects with gaps do not compensate for sonic’s radius, so a point is drawn at sonic’s base coordinates to help show where these collisions are checking against when relevant.
- Collision display now includes all important sprite collisions. Precise collisions (drill, objdollbot, and objJawCollider) draw a silhouette overlay of the mask, and bounding box collisions (objdoll, objJawCollider, and objJawWeakpoint) draw the box.
- sonic’s sprite mask isn’t drawn since it’s not useful in practice (it’s just a pixelated circle the same size as his usual radius).
- The remaining leniency (variable ’timer’) on objJawCollider is visualized as an added blue tint to their collision drawings (so the hue is fuchsia when timer==0).
- Collision display now draws exploding grenades in a somewhat desaturated red, to try and more accurately convey that they are not immediately dangerous when visible (they only cause damage when they explode, which also destroys them immediately).
- Collision display now greys out hurtboxes for Egg and Super Eggman bosses when they’re invulnerable, like other bosses.
- Collision display now shows when the bouncers in Ultimate are inactive right after being used.
- Radial collisions with negative radii are now drawn as solid circles.
- Swapped the instance inspection right mouse button controls, so the object name is copied by default and the id is copied when shift is held.
- When copying an instance id using instance inspection, the number is automatically surrounded by parentheses. (This syntax is needed to refer to a numeric instance id directly within GML code.)
- Instance inspection text now scales to always appear the same size on‐screen when changing the zoom level in camhack mode.
- End: Fixed 3D mode not being disabled when exiting the scene early in any way besides to the menu (eg. shift+enter, F7), which left the screen blank.
- End: Made the aspect ratio for both 3D projection types match the view size when in camhack mode.