So, almost 10 years later, I'm picking this game back up. Sonic 3D Blast was a big part of my childhood and I'm surprised there's still not any published runs for it, especially given the attention that other Sonic titles for the Genesis have gotten.
I started about 2 weeks ago, and 1 week ago started comparing my work against Comicalflop's WIP. The GMV wouldn't play correctly in BizHawk without changes, but once I fixed up the menu navigation to sync up the first gameplay frame, the rest of the movie played fine. BizHawk reported that the ROM hash didn't match. I suspect this is because the GMV is so old that it doesn't have a ROM hash (or maybe BizHawk doesn't import that info? or maybe GMVs don't have it to begin with? or maybe it was a bad ROM?) so I'm chalking this up to changes in emulation accuracy over 10 years, especially since the desync was only during title and menu sequences. I couldn't find a ROM anywhere that either didn't have the hash mismatch warning or could play Comicalflop's work without any changes.
I waited to make this post until I could at least match Comicalflop's Green Grove Act 1 time from scratch. At first I was 40 frames behind, then 9 frames behind, and now I'm 18 frames ahead! Final in-game time is :43, TSC record is :48. (Saving ~15 frames should bring the in-game timer to :42, but I'm at a loss for where I'd find those. I might try at it, but I don't want to spend forever optimizing this level.)
Video:
https://www.youtube.com/watch?v=R2Lku0m5kZA
Comparison video:
https://www.youtube.com/watch?v=OOpa4hL1T-A
It's going to be tough going forward without a reference like this!
Surprisingly, there's not a lot of new information about this game. There's
a disassembly by Sik that I can't read because I don't have IDA Pro, but there are some text files with memory addresses that made setting up RAM watches a bit easier. There's also better maps and better world records, but that's about all I can find.
Some additional things I've learned:
Physics:- Sonic's motion seems controlled primarily by a "direction" variable (2 bytes at 0xff2c18) with values like 0x100 to mean directly left, 0x400 meaning up-right, etc. The direction is modulo 0x800, and changes by 0x40 in the direction the D-pad is pressed. This means, for example, a complete U-turn takes 16 frames. It seems the "force" felt by Sonic in this direction is only affected by whether any D-pad buttons are being pressed, but I haven't tried to confirm this. I made a basic HUD to show this direction and the "actual" direction indicated by Sonic's speed, since certain parts of the physics seem to be controlled by their difference.
- The "direction" variable tends to stick at the 8 main directions. That means if you're facing 0x400 (up-right) and press any of right, down-right, or down for 1 frame, Sonic will rotate toward 0x500 over 4 frames. However, you can cause Sonic to move in between these directions by quickly alternating the held direction. For example, if facing 0x400, you can hold right for 3 frames until the direction is 0x4c0, then alternate between holding up-right and right to cause the direction to flip between 0x480 and 0x4c0, which will cause Sonic to move up and slightly to the right. Sonic can still reach his top speeds when moving this way. This trick is really annoying to pull off sometimes, due to lag frames, but can help when optimizing routes. This doesn't work with spin dashing, unfortunately.
- Since the force on Sonic seems to be affected by whether D-pad buttons are held, but the direction of this force is controlled solely by the direction variable, it's possible to more finely control Sonic's motion during direction changes by letting go of D-pad buttons in situations where the direction variable is otherwise changing on its own. For example, there are a variety of ways to U-turn from 0x100 to 0x500 (left to right). One is to simply hold right. The most minimal option is to only press right every 4 frames to trigger each 45 degree turn. In all cases, the U-turn still requires 16 frames to complete, but Sonic's final position and speed can be manipulated slightly.
Rules:
- Flickies can only be caught 30 frames (depending on how you count) after popping the robot. This doesn't matter a lot of the time, since catching a Flicky optimally isn't always the best choice for the overall route.
- When exiting an area after freeing all the Flickies, it's a small handful of frames faster to spin dash and U-turn into a skid to quickly reduce speed to trigger the transition.
- Lag frames are counted toward the level timer. I haven't found a good way to control lag yet, but I think the main source of lag is loading new sections of the screen.
And no glitches yet, but I have a hunch it might be possible to get Sonic off-screen where objects aren't yet loaded, like in other Sonic games. (You can get to some pretty high speeds by falling far enough.)