Controls
Base game
Most of the game’s controls are explained or reasonably obvious:
- Left/Right:
- Move
- Pitch (“Intro” chapter only)
- Up:
- Prevent crouching
- Accelerate (“Intro” chapter only)
- Move (“Battle” chapter only)
- Change menu selection
- Down:
- Crouch (while standing)
- Roll (while running, “Ultimate” chapter excluded)
- Handbrake (“Intro” chapter only)
- Move (“Battle” chapter only)
- Change menu selection
- Control:
- Boost (“Intro” chapter only)
- Space:
- Jump (while grounded)
- Charge Spin‐Dash (while crouching, “Ultimate” chapter excluded)
- Set up shield (“Battle” chapter only)
- Select menu item
- Tab:
- Toggle “control help” overlay request
- Escape:
- Quit game (menu, “Intro” chapter if not completed)
- Return to menu (gameplay, border menu)
- Unpause
- Enter:
- Toggle pause
- Select menu item
However, some additional controls are effectively hidden:
- F4: switches between fullscreen and windowed mode (common to many Game Maker games).
- F9: takes a screenshot (in BMP format).
- Alt+F12: spawns a dialogue to enter GML (Game Maker Language) code into, which the game then executes. This gives total control over the game; for instance, entering
goToCreds();
warps to the end credits. This is disabled in the non‐debug Speedrunning Edition executables. - Control: in “Ultimate”, makes all existing inert collision lines exhibit a small upwards force on colliding objects. (This is likely a leftover debugging control.) In practice, this makes it far less consistent to jump off affected solid ground, as it lightly pushes Sonic up and away from it. (Some moving collisions will undo this when calculating their own forces.)
I would recommend to keep the game’s “control help” overlay enabled, because it is useful as both an input display and an authoritative source on whether or not you have control over Sonic at any given time (besides his bike and Super Sonic forms, where it does not display).
Speedrunning Edition
As discussed in more detail in Game Versions and the Speedrunning Edition, the Speedrunning Edition has more features with their own controls. The legal version only has one added function:
- Shift+Enter: When using a completed save file, 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.)
Debug mode adds many more controls:
- F1: Toggles collision display
- F2: Toggles instance inspection and displacement
- Left‐click: Locks‐in selected instance on press, and moves to cursor on release (unless shift is held)
- Right‐click: Copy object name (+Shift: Copy id)
- F5: Save state
- Shift+F5: Save state using filename (excluding extension) stored in the clipboard
- F6: Load state
- Shift+F6: Load state using filename (excluding extension) stored in the clipboard
- F7: Restarts the game, toggling “camhack” mode
- = / -, Page Up / Page Down, mouse wheel: Zoom “camhack” view (+Shift: Zoom faster)
- 0: Reset zoom
- Middle mouse button: Pan “camhack” view (+Shift: Pan faster) (Without moving: Reset pan position)
- F3: Switch views between “camhack view” and “game view”
- F8: Toggle frame advance
- Z: Advance frame
Note that none of these controls function during the end credits.
Techniques and physics
Spin‐Dash
Initiating a Spin‐Dash requires Sonic to be crouching in a “grounded” state, and for one of the following conditions to be true (at normal game speed):
- Be moving less than 0.3 pixels per frame, and crouched for more than 14 frames;
- Be crouched for more than 26 frames;
- Be crouched for more than 8 frames while in the “Robot” chapter.
These requirements are the only things preventing Sonic from performing a Spin‐Dash up a wall. The altered physics while underwater actually allow the first condition to be met, although this isn’t really useful anywhere.
The Spin‐Dash speed increases when space is pressed multiple times:
- ×1: 20
- ×2: 24
- ×3: 28
- ×4: 32
- ×5+: 36
So, pressing space 5+ times instead of 1 results in almost twice as much speed.
The state of the space key for Spin‐Dash and Jump is evaluated by whether or not a key press event has been received that frame, rather than if space was not depressed on the previous frame. This makes it possible to charge the Spin‐Dash on every frame. Pressing space on the same frame a Spin‐Dash is executed also charges it one last time instead of jumping.
The velocity achieved with Sonic’s Spin‐Dash scales inversely to the game speed. In other words, when the game is in “slow motion,” Spin‐Dashes will actually be slower than normal even after compensating for the reduced game speed. For example, when the game is running at 1/5th normal speed (the usual “slow motion” speed), Sonic’s Spin‐Dash will only achieve 1/5th of its normal speed.
Jumping
Jump height is fixed; variable jump height cannot be achieved by holding space for varying periods of time. (The only reason to hold space down is for setting up shield in Battle.)
Like most Sonic games, Sonic’s jump trajectory is perpendicular to the angle of the surface he is standing on.
There is always 1 “coyote time” frame where Sonic can still jump after leaving the ground without jumping. This can be difficult to notice casually, given that Sonic doesn’t switch to his airborne sprites until after the coyote time expires. This smooths out some edge cases in the collision detection, like when Sonic technically alternates between grounded and not‐grounded every frame while in sustained contact with a sharp corner.
Engine bugs
Switching away from the user desktop
If the PC switches away from the user desktop running the game (the most common way this happens is by invoking the secure desktop, which is done by inputting a secure attention key/sequence like Ctrl+Alt+Delete to bring up the security screen, through a UAC prompt, or by locking the PC), the Game Maker engine’s event execution loop encounters unexpected behaviour when it tries to poll the operating system for keyboard and mouse inputs, as Windows responds differently when the application’s desktop is not in focus. This activates a failsafe in the Game Maker engine that just terminates the current loop iteration and starts the loop over; however, all changes already made to the game state persist. With most games, this will result in only “begin step” (and possibly applicable “alarm” events) being executed, as the next event types in the execution order are keyboard and mouse input events.
When limited to executing code in “begin step” events, Eggman Hates Furries only does these things:
- The sonic object displaces relative to its velocity and the game speed.
- All logic for the floater (the floating platform in Hell) executes.
- Most logic for the main Egg boss object executes.
- Most logic for the Super Eggman object executes.
- All logic for the rotating blocks and “fragile blocks” in Ultimate executes.
The Speedrunning Edition will force the game to quit if it detects this behaviour to protect the integrity of speedruns, as there are no speedrun categories that permit abusing this behaviour. Doing so requires interacting with the PC’s operating system in a very intrusive way that should not be required by any speed game. Even besides that, though, it adds vanishingly little value for a speedrun. The effects of this are extremely difficult to control (the rate at which these events execute depends on the processor speed of the host PC, and how long it takes for the operating system to switch between desktops is not precisely controllable) and often result in game errors. The uses are also quite minimal, due in part to how the game dynamically generates most of its terrain, so the main uses would be to displace sonic to activate position‐based autosave triggers and skip chapters (specifically Climb, Hell, and ZigZag) or to move ahead or out‐of‐bounds to skip some platforming (particularly in Water, Grass, Lost, and Ultimate). Activating this “trick” is not technical or interesting to watch (indeed, there is nothing to watch at all), and it’s also not serializable behaviour (as in, not something even a TAS could abuse).