Make sense, although I do have another scrolling bug; for whatever reason, going backwards in certain levels (Death Egg or even Hidden Palace if you restored it) causes parts of the background to disappear. Even stranger, it doesn't happen to HPZ in the prototypes.
It's been a long time since I looked into that, but I believe that the solution was to make the background repeat all the way to the right end of the layout file. Levels like Mystic Cave Zone do this, presumably for its single-player variant which uses dynamic background loading. If I remember right, the Sonic 1 level layout format avoids the need for this for some reason. I'll look into this issue when I get a chance. EDIT: Oooooh, I get it: Sonic 1's layout loading code was modified in Sonic 2's prototypes to specifically repeat the layouts to fill the full width of the level. This means that the game automatically repeated the game's backgrounds, and whatever tool Alex Field used to convert Hidden Palace Zone's layout failed to recreate this behaviour, likely because it was emulating Sonic 1's behaviour instead.
I do remember seeing that (mainly when converting HPZ to the final format; trying to extend its background is a nightmare); there's also one last bug, the worst of them all. ... Sonic's arm not appearing fast enough on the title screen.
That appears to be a weird prototype leftover in Sonic's animation script: at the end of 'byte_1368E', there's a reference to sprite 8, which is just an incomplete duplicate of sprite $12, which Sonic is set to when his arm spawns. Because this duplicate sprite is here, it creates an extra frame before Sonic's arm appears where he's using the sprite that should be used after the arms appears. Not only that, but because this earlier frame is incomplete, Sonic ends up missing *both* of his arms during this frame. EDIT: Speaking of buggy sprites: sprite 5 appears to be one pixel too high, causing Sonic's lower half to be visibly cut-off for a few frames.
Not sure what they were going to do there, unless they were going to make a sprite with both the body AND the face. Also, I might've already mentioned this, but the Obj0E never sets Tails' priority during the intro, meaning a few pixels of his hair (fur?) gets covered by Sonic (yet the priority IS set when skipping it...).
Here's a blink-and-you-miss-it bug: the Egg Prison sprite is incomplete: sprites 1 and 2 have their 'total sprite pieces' value set too low, causing part of the sprite to not appear: Vanilla: Fixed: To fix this, hex-edit the file 'mappings/sprite/obj3E.bin' so that bytes $47 and $89 are 08 instead of 07. Issues like this suggest that the mappings were written in assembly (likely macros): they weren't machine-produced binary files like they are in the disassemblies. Other indicators of this are Obj63's mappings, whose frames aren't sorted from first to last, and the unfinished mappings of Marble Zone's sideway spike pistons in Sonic 1, which have a similar bug to this one.
They were indeed written in assembly, whether by hand or by a program; the Sonic 2 Nick Arcade prototype's symbol lists contain names for both the mapping table (suffixed with "pat", as in "pattern") and the mappings themselves (suffixed with "sp" and then the frame number). I've considered requesting that the Sonic 2 disassembly shift to ASM mappings for this reason.
I wouldn't really consider this a bug? The program is just converting the data that is in the file. I guess I could add a hack for LevelConverter with S2NA layouts.
Quick question: has anyone managed to figure out the issue caused by this bug and a fix for it? When Sonic spin-dashes off a see-saw in Hill Top Zone, the spindash isn't cleared, and he spin-dashes when on-ground. So, logically, you should be able to clear the spindash flag before Sonic springs up. First, I tried finding a proper fix here, which did not work. Then, I tried reproducing the same bug in Sonic 1 and tinkered around with its see-saw object to see if I could fit it, but no dice.
The best part about that bug is that something similar still happens in Ice Cap Zone, so Sega never fixed it. I've seen many hacks (of both Sonic 1 and Sonic 2) which fix it, though. Puto even fixed it in my hack.
Indeed quite many Sonic 1 hacks fix this issue. But the way it's handled is by clearing the spindash in mid-air, even though Sonic 2 retains your spindash if you perform it while a platform collapses. So it feels like a feature rather than a bug since you don't lose the spindash, and the way the SCHG guide documents it fixes the see-saw bug but doesn't fix the bug as mentioned earlier/feature Sonic 2 has.
I fixed it in my Fine2uned hack by adding 'clr.b spindash_flag(a2)' to the start of 'Obj14_LaunchCharacter'.
Here is a change to something that some may consider a bug, but is actually more like an oversight. When Sonic jumps and lands from the jump while holding down, for one frame, he is in his walking animation. This is something that also happens in Sonic 1, Sonic 3 and Sonic & Knuckles. As a visual example: https://twitter.com/SonicPhysics/status/1385881293406318596 This is quite easy to fix/change. Navigate to Code (Text): Sonic_ResetOnFloor: As you can see, in all of the code for Sonic to reset on the floor, he is always set to walk. The code for him to roll on the ground is only initiated after this reset, and therefore he is briefly put into the walk animation. To resolve this, we need to add a new supplementary subroutine. Under the aforementioned label, under the branch to Code (Text): Sonic_ResetOnFloor_Part3 And before the line that sets his walk animation add this directional input check Code (Text): btst #1,(Ctrl_1_Held_Logical).w ; is down being pressed? bne.w Sonic_ResetOnFloor_ContRolling ; if yes, branch After this, head to the bottom of Code (Text): Sonic_ResetOnFloor_Part3 And add Code (Text): bra.w return_1B11E Now, after the end of Sonic_ResetOnFloor_Part3, and before the label for return_1B11E, add this chunk of code Code (Text): ;===================================================================================================================== ; (Hitaxas) Fix for awful uncurling frame when a character lands on the ground from a jump ; or if they walked off an object or edge of a floor while holding down. ; this "bug" is present in S1-S3K. ;===================================================================================================================== Sonic_ResetOnFloor_ContRolling: move.b #AniIDSonAni_Roll,anim(a0) ; play rolling animation ;--------------------------------------------------------------------------------------------------------------------- ; check if character was already rolling, used for instances where they roll off one floor to land on another ;--------------------------------------------------------------------------------------------------------------------- btst #2,status(a0) ; was status set to rolling? beq.w Sonic_ResetOnFloor_Part3 ; if it was, branch ;--------------------------------------------------------------------------------------------------------------------- ; force character into rolling status, and play sound. ;--------------------------------------------------------------------------------------------------------------------- bset #2,status(a0) ; otherwise, set roll status move.b #$E,y_radius(a0) ; adjust character's y_radius move.b #7,x_radius(a0) ; same for x_radius addq.w #5,$C(a0) ; move character 5 pixels down, so they aren't floating move.w #SndID_Roll,d0 jsr (PlaySound).l ; play rolling sound - required because this is not part of the normal roll code ;--------------------------------------------------------------------------------------------------------------------- ; clear status flags and act like a true reset on floor. This is nearly identical to part 3 ; but without forcing character into walking animation. ;--------------------------------------------------------------------------------------------------------------------- bclr #1,status(a0) ; clear in air status bclr #5,status(a0) ; clear pushing status bclr #4,status(a0) ; clear rolljump status move.b #0,jumping(a0) ; clear jumping flag move.w #0,(Chain_Bonus_counter).w move.b #0,flip_angle(a0) move.b #0,flips_remaining(a0) move.w #0,(Sonic_Look_delay_counter).w The final results should look like so: