Welcome to ReadySonic!
ReadySonic is a modified split disassembly of Sonic 1, based on Sonic Retro's SVN version.
The intent of ReadySonic is to make starting a new hack of Sonic 1 easier. The original ROM as released by Sega contains a handful of bugs, and lacks some popular features (such as the spin dash) from later games in the series. Every time a hacker wishes to hack the game, they have to solve each of these issues from scratch, which wastes valuable time. In fact, most hackers don't bother to fix all of the original's glitches.
I found this situation unsatisfactory. It's a shame that many good hacks are forced to inherit the flaws from the original. It's equally a shame that hackers, even experienced ones, are required to waste time redoing old work - time that would be better spent working on new and exciting features of their hack.
So, if you want to hack Sonic 1, consider using ReadySonic as your template. Almost all of the changes I've made are voluntary ("Elective Mods"): they can be toggled on and off by setting flags in the "(Mercury) Fixes.asm" file. Some of the changes are obvious bugfixes that I couldn't imagine anyone not wanting the benefit of ("Permanent Mods"); these fixes cannot be easily turned off, but of course reverting to the original code is as easy as copying and pasting from a clean disassembly of the original.
Also, a download is provided for the built ReadySonic ROM. Though the primary goal of this project is to aid hackers, it's also possible you might just want to play an improved version of Sonic 1. If so, go ahead and move the ROM into your games library and have fun. =)
Downloads
Notes:
- While crediting ReadySonic in your hack is not required, it would be appreciated. =)
- A few of the mods were made by following Sonic Retro's excellent How-To Guides, the Spindash one in particular.
- I tried scrupulously to notate wherever I made changes to the code, by wrapping the modified or added section with "Mercury...end Mercury" tags. Where possible, I left the original lines or values as a comment.
Thanks
Special thanks to Rom for playtesting!
Change Log
Below, you will find an exhaustive list of all of my modifications. I was going to write tutorials for each mod, but time was not permitting. However, it's still easy to figure out how I did each mod. Download the source, and search the text for the name of the mod you are interested in. Each line that was changed for a particular mod is tagged with a comment containing its name. Mods that require changes to data or graphics that aren't code will list the modified files.
"Permanent" Mods (bugfixes)
Sega Sound Fix
Thanks to the Sonic Retro How-To Guide by Puto!
When code is added to Sonic 1 the 'Sega!' shout at game start may become garbled. As ReadySonic adds a fair bit of code, this fix has been applied.
Note that this fix also allows the player to skip the Sega screen with the start button, which is nice.
Hidden Bonus Points Fix
Thanks to the Sonic Retro How-To Guide by 1337Rooster!
Makes the 100pt Hidden Bonuses actually give Sonic 100pts.
Sonic Shoe Stripe Fix
In several of Sonic's sprites in Sonic 1, his shoe is missing its trademark stripe; it's entirely red. This is solved in Sonic 2, so I just back-ported its fixed tiles.
The sprites in which the stripe is missing are these: Springing (from hitting a spring), Floating (in the water tunnels in LZ).
Modifies: artunc\Sonic.bin
Continue Sonic Art Fix
Fixes some incorrect pixels in Sonic's Continue screen sprite.
Modifies: artnem\Continue Screen Sonic.bin
GHZ3 Wall Solidity
Fixes a wall object in GHZ3 after the Lamppost that was set to be solid. (It was, of course, solid for a reason: to fix a bug with the platform right next to it. However, the platform could be moved to the right by 16 pixels to solve the problem, too, so that's what I did.)
Modifies: objpos\GHZ3 (JP1).bin
Special Stage Cloud Fix
Fixed the base special stage palette so that the clouds wouldn't flicker when it first fades in, plus altered the fading palette to not have ugly clashing purples.
Modifies: palette\Cycle - Special Stage 1.bin, palette\Special Stage.bin
Roller Art Fix
The Roller, the cute armadillo badnik from SYZ known as Arma in Japan, has one garbled animation frame. The game loads the art for Caterkiller, even though that badnik never appears in the zone, and overwrites part of the Roller's art.
This is easily fixed. We just need to remove the line that loads Caterkiller's art.
Sonic Roll Frame Fix
When Sonic enters an S-tunnel in GHZ, he's forced to roll up. However, it only sets his animation, not his frame, which means he moves down one frame before he actually turns into a ball. This makes an obvious and annoying flicker. It's especially annoying if he comes to a stop while still inside the tunnel, because he'll flicker before he's forced to start rolling again.
Hedgehog E Fix
Very minor pixel edit to "THE HEDGEHOG" on Title Screen to fix the inconsistent E's.
Modifies: artnem\Title Screen Foreground.bin
GHZ2 Spring Fix
Okay, I'll admit: this one is ridiculously minor. In GHZ Act 2, the lowest route at the beginning will eventually lead to a red spring. If Sonic jumps on it, he'll be sprung up by the right side of the loop with the extra life on top of it. Anyway, the spring is backward - it's been flipped improperly. I think it looks dumb to have the shading reversed, so I flipped it back to normal using SonED2.
Modifies: objpos\GHZ2.bin
Top Boundary Fix
Sonic is supposed to die when he falls below the bottom boundary of a level; this is what makes the dreaded "pits of death". The same isn't supposed to happen when Sonic crosses the top boundary, but it does in one circumstance: when Sonic is thrown back by being hit. You can witness this for yourself by jumping on one of the Orbinauts in the highest routes in SLZ. As Sonic flies upward, he'll go offscreen and then immediately die!
It's all because Sonic's "hurt" routine runs an extra (unnecessary) check to see if his Y position is greater than the bottom boundary. The problem is, the check incorrectly interprets a negative Y position as greater. This could be fixed by changing the "bcs" to "blt", but it's not necessary - you can remove the check altogether. It's redundant, as Sonic_LevelBound does the proper check and runs during Sonic's "hurt" routine anyway.
Hurt Splash Fix
If Sonic is hurt by a hazard or enemy, and is flying back, he won't make a splash as he enters the water. This can't be right!
Sonic Team merely forgot to add a branch to the water routines when Sonic is in his hurt state.
Pushing While Walking Fix
Fixes the bug where if Sonic rolls or moves too fast into a wall or solid object and then quickly turns around, he'll often move away from it while using his "push" animation instead of the proper "walk" animation.
Walking In Air Fix
This fixes not one bug, but several related ones:
- If Sonic dies next to a monitor/solid, he'll use the "walk" animation as he falls off the screen.
- Likewise, if Sonic drowns next to a monitor/solid.
- Sonic will change to the "walk" animation as he jumps past monitors/solids, causing a silly looking "airwalk".
- Sonic will fail to spindash if he does so next to a monitor/solid. He'll charge up, but he won't go anywhere.
This fix depends on the "Pushing While Walking Fix" mod!
Screen Scroll While Rolling Fix
When Sonic finishes looking up or down, the screen is supposed to scroll back into the neutral position. However, the programmers neglected to put the code that handles this into Sonic's "roll" routine. So, if Sonic rolls up while the screen is re-centring, the screen will cease scrolling until Sonic uncurls.
Ducking Size Fix
Makes Sonic's hitbox the correct size in regards to solids when he is ducking.
Exit DLE In Special Stage And Title
In Sonic 1, the routine that handles the cool multi-plane background effects also calls the routine that handles the "Dynamic Level Events", or "DLE". The trouble is, some game modes (the Title Screen and the Special Stage) require the background effects, but don't need the DLE.
This doesn't affect anything in the original game - either Sonic Team got lucky or they worked around it. But if you want to make modifications for your hack, such as showing a different level behind the Title Screen or even something as simple as changing the size of a level, the game can behave erratically. Basically, the Title Screen or Special Stage might try to load a Robotnik Boss object, or alter the water level, so we simply need to exit the DLE routine if we're on the Title Screen or in a Special Stage.
Clear Control Lock When Jump
There's a control lock that activates when Sonic hits horizontal springs or slides back down steep surfaces. It prevents the left and right buttons from affecting his speed. Without this, when Sonic runs into horizontal springs, he'd be more likely to brake (the player would likely still be pressing toward the spring a moment after Sonic hit it), and he'd walk in place forever when trying to scale steep slopes instead of sliding back down.
The trouble arises because the lock's timer doesn't decrement while Sonic is in the air. So, if it's active when Sonic jumps, it will remain active when he lands. This is only rarely noticable, but when it happens it's frustrating to not be able to control Sonic properly for a moment after he lands.
The solution is terribly simple. When Sonic jumps, we clear the lock timer byte in Sonic's OST slot.
Debug Improvements
Fixes 3 annoying aspects of the Debug Mode in Sonic 1:
- Sonic's speed isn't cleared when he changes into an item. So, if he's moving quickly when you change him into an item, he'll immediately return to that velocity when you change him back. This can be greatly irritating!
- Sonic's status isn't cleared when he changes into an item. So, if he's standing atop an object when you change him into an item, he'll zoom right back to it when you change him back, even if you've moved him away.
- If you place rings or an item monitor and then collect them, then you can't place more after that.
SBZ3 Obj Fixes
Fixes the missing platform from SBZ3 and also prevents Sonic from falling through the floor near beginning of the level.
Modifies: objpos\SBZ3.bin
SBZ3 Button PLC Fix
Trades the order in which the harpoon and button load their art in order to prevent garbled button art at SBZ3 start.
Demo Playback Fix
Thanks to the Sonic Retro How-To Guide by FraGag!
Fixes an issue that makes demo playback interpret the button being held for more than one frame as continual new presses of the button.
Speed Shoes Work Underwater
Sonic's basic constants - acceleration, deceleration, and friction - are set to special underwater values when he enters the water, and return to normal when he leaves it. Similarly, when he gets speed shoes they are set to special speedy values and return to normal when the shoes run out. This creates a conflict - if he enters the water while he has speed shoes, they'll be nullified. Worse, when the shoes run out, the values will return to normal, even if Sonic's still in the water.
The developers avoided conflict by not putting any speed shoe monitors in the levels that had water in them. However, if you change the layouts or add water to more levels, you'll want this problem fixed.
Remove Speed Shoes At Signpost Fix
It's possible, especially in a layout hack, to have Super Shoes when you pass the end sign. This will make the Level Clear jingle play sped up, which is sort of silly.
Game/Time Over Timing Fix
When Sonic dies, the game waits before showing the "Time Over" or "Game Over" message. How long it waits depends on Sonic's position; it waits until he's fallen past the bottom boundary of the Zone. This isn't ideal, because it means it'll show up almost instantly if he dies near the bottom of the Zone, but take extra long if he dies near the top. It also doesn't check properly; it treats the value as if it were unsigned, meaning the message will appear if Sonic goes off the top of the Zone, too, which is wrong.
Game Over When Drowning Fix
If Sonic gets a Game Over after drowning, the flag that prevents the background from scrolling is set. Since it doesn't reset on the Title Screen, that means the scrolling background will be frozen.
High Speed Camera Fix
Fixes problems with camera not catching up at high speeds, as well preventing Sonic from dying in these situations (notably in the S-tunnels in GHZ1 and GHZ3).
Shield/Invincibility Positioning Fix
Correctly positions the Shield/Invincibility sprites when balancing on ledges.
Eggman Art Fix
Fixes Eggman's mappings so that his moustache isn't cut off.
Lives Over/Underflow Fix
Prevents life count from over-/underflowing when 1 is added/subtracted.
SLZ Solidity Fix
Fixes goofy solidity in SLZ that allows Sonic to fall through the tops of some 256x256 metatiles.
Modifies: map256\SLZ.bin, map256_u\SLZ.bin
SLZ Staircase Fix
Fixes some staircases in SLZ2 to that they aren't 1 pixel higher than the ground, stopping Sonic short.
Modifies: objpos\SLZ2.bin
SLZ Pylons Fix
Removes the SLZ pylons from the object layout files and instead loads them manually when the zone starts. This allows them to appear even when respawning at a Lamppost.
Modifies: objpos\SLZ1.bin, objpos\SLZ2.bin, objpos\SLZ3.bin
FZ Boss Hitcount Fix
It's possible to hit Robotnik an extra time during the Final Zone Boss and cause an underflow glitch, requiring him to be hit 255 more times in order to be defeated! We can't have that.
FZ Falling Fix
Prevents Sonic from falling off after defeating Robotnik by adding an invisible wall.
Modifies: map256\SBZ.bin, map256\SBZ (JP1).bin, map256_u\SBZ.bin, map256_u\SBZ (JP1).bin, map16\SBZ.bin, map16_u\SBZ.bin, collide\SBZ.bin
MZ2 Layout Fix
Moves the End Sign further right so the level won't feel so truncated.
This fix depends on the "Exit DLE In Special Stage And Title" fix!
Modifies: levels\mz2.bin, objpos\mz2.bin, misc\Level Size Array.bin
LZ After End Sign PLC Bugfix
Thanks to the Sonic Retro How-To Guide by FraGag!
Fixes bug that sometimes crashes the game if roll and look down after passing End Sign in LZ1 and LZ2.
Low End Signs Fix
And another minor one. Some of the end Signposts were too low. I'm not sure why, but they don't stick above the ground high enough to look right. It's always seemed to be accidental to me, so I've moved them all using SonED2. I prefer the consistency, especially since future Sonic games don't seem to have the same problem. In fact, Sonic CD includes a wide base on the signposts, so they can't be cavalierly positioned.
Modifies: objpos\SYZ1.bin, objpos\LZ (JP1).bin, objpos\LZ1.bin, objpos\SBZ1 (JP1).bin, objpos\SBZ2.bin
Monitor Art Mod
Fixes Robotnik art and adds stripe to Speed Shoes.
Modifies: artnem\Monitors.bin, artnem\(Mercury) Monitors (optimised).bin
GHZ Mountain Fix
Fixes a tile in the GHZ mountain background that's always bothered me - it makes it looks like there's a hole in the biggest peaks.
Modifies: map256\GHZ.bin, map256_U\GHZ.bin
"Elective" Mods (features)
Wall Jump
Gives Sonic a Wall Jump ability
Move Lamppost VRAM
Moves the Lamppost tiles in VRAM to allow for things like dust or the Insta-Shield to fit instead.
Use DMA Queue
Thanks to the Sonic Retro How-To Guide by shobiz!
Uses a DMA queue to load Sonic's art, freeing RAM and allowing Spin Dash dust or the Insta-Shield to function.
Spin Dash
Thanks to the Sonic Retro How-To Guide by Lightning, Puto, and shobiz!
Enables the Sonic 2 Spin Dash.
Note: You should also apply the following fixes to avoid bugs: Walking In Air Fix, Pushing While Walking Fix, High Speed Camera Fix, Caterkiller Fix.
Dash CD
Enables the Sonic CD Dash (aka Super Peel Out).
Balance CD
Uses the Sonic CD balancing sprites (forward and back) instead of Sonic 1's.
Simple Cheat Entry
Enters Level Select, Debug Mode, Slow Mo, and extended Sound Test cheats automatically upon U,D,L,R,A,Start.
Monitor Art Optimise
Shuffles the Monitor Art in order to free 8 free tiles (useful for modding HUD).
HUD Centiseconds
Adds Sonic CD-style centiseconds to the HUD
Chunks In ROM
Thanks to the Sonic Retro How-To Guide by FraGag!
Loads Chunks (256x256) directly from ROM, freeing a huge amount of RAM ($0000-$A3FF).
Blocks In ROM
Similar to "Chunks In ROM" only with Blocks (16x16), freeing a huge amount of RAM ($B000-$C7FF).
HUD Has Leading Zeroes
Thanks to MarkeyJester!
Gives Rings, Score and Lives leading zeroes (i.e. 001 as opposed to 1).
TIME/RINGS Flash Fix
When Sonic has been in a zone for longer than 9 minutes, the TIME on the HUD is supposed to flash red. Similarly, when Sonic has no rings, RINGS is supposed to flash red. The problem is, Sonic 1 has a bug, so that TIME only flashes at over 9 minutes if Sonic also has no rings. So it won't flash at all if he's carrying rings, and the player might not notice that they're running out of time!
Dynamic Special Stage Walls
Dynamically loads the wall art in the Special Stages to free VRAM (for things like the HUD).
HUD In Special Stage
Adds HUD to Special Stage. Also useful for adding a decreasing time limit to Special Stage.
Time Limit in Special Stage
If HUDInSpecialStage is active, the Special Stage has a working 9:59 time limit anyway, but this makes it a decreasing one with custom values.
Title Screen Palette Fix
Uses the proper GHZ palette on the Title Screen.
Special Stage Jump Fix
Gives Sonic variable jump height in the Special Stage to be more fair and consistent with the rest of the game.
Shield Art Mod
Attempts to improve the look of the shield.
Sonic CD Roll Jump
Makes the Roll Jump work like Sonic CD (Sonic can still control his horizontal trajectory). Frees up a status bit for Sonic.
Rebound Mod
Makes rebounding from enemies/monitors after rolling off a cliff onto them function the same as if they were jumped on - the rebound is cut short if the jump button is released.
Enable Press Start Button Message
Makes the "Press Start Button" message appear correctly on the Title Screen.
Limit LZ Block Rising Speed
Limits the rising speed of blocks in LZ so that Sonic can jump off them more comfortably.
Skip Check Sum Check
Skips the Check Sum check in order to speed up the game booting, plus frees the 4 bytes of RAM with the 'init' string in them.
Speed Up Score Tally
Allows the player to hold a button to speed up the score tally.
Spike SFX Fix
Makes the proper sound effect play when Sonic is harmed by Spikes/LZ Harpoons.
Rolling Turn Around Fix
Prevents Sonic from turning around while rolling (which without this fix could be abused to roll in place forever).
Scroll Delay
Thanks to the Sonic Retro How-To Guide by shobiz!
Adds a delay before the screen begins to scroll when looking up and down. This is essential if adding the Spin Dash or Super Peel Out.
Look Shift Fix
Fixing the looking up/down camera shift so that it stops at zone boundaries, preventing a delay when returning to the neutral position.
Spike Fix
Thanks to the Sonic Retro How-To Guide by FraGag!
Prevents spikes from harming Sonic while he's flashing.
Caterkiller Fix
Makes it safe to roll into the caterkiller from the front at high speeds without fear of being hurt some times and not others.
Custom Demo Delay
Makes it possible to customise how long the Title Screen waits before going to a demo.
Orbinaut Animation Tweak
Makes Orbinaut "notice" Sonic at a closer range so that it's more likely to happen onscreen, and "get angry" quicker.
SLZ Orbinaut Behaviour Mod
Makes the SLZ Orbinauts beatable by giving them behaviour similar to Sonic 4's.
Newtron Behaviour Tweak
Slightly alters the behaviour of Newtrons.
Lost Rings Flash
Makes Lost Rings flash before they disappear.
FZ Boss Invuln Mod
Allows you to customise the number of steps the FZ Boss's invulnerability lasts.
Disable Speed Cap
Disables the speed cap in the air and on the ground.
Giant Ring Art Loads With End Sign
Makes the Giant Ring art load when End Sign's does, avoiding some issues.
Special Stage Index Increases Only If Won
Makes the Special Stage index not increase when you fail the stage, allowing you to practise the stages more easily because next time you enter one it'll be the same one you failed last time.
Special Stages Still Appear With All Emeralds
Makes the Special Stages still accessible even once all emeralds are collected. Of course more emeralds aren't possible to be collected; they are replaced with Continues, making use of the unused 1-up item in the Special Stages.
Giant Rings In SBZ
Adds Giant Rings (and therefore extra shots at the Special Stage) to SBZ1 and SBZ2.
Modifies: levels\sbz2.bin, objpos\sbz1.bin, objpos\sbz1 (JP1).bin, objpos\sbz2.bin
Padding Active
Pads the ROM with a value until it reaches a certain number of megs.
Quarterloop Fix
Makes Sonic behave better when running back down quarterloops by using Sonic 2's code.
Magnetic Rings
Gives Rings ability to be attracted to Sonic while he has a Shield.
Rings Bounce At Zone Bottom
Rings will bounce off of the bottom boundary of the Zone, making SYZ boss more fair.