Как исправить Spike Bug
(Оригинальное руководство написано FraGag)
Spike Bug в первом Сонике заключается в том, что игра не проверяет Cоника на неуязвимость после повреждения (когда спрайт Соника мигает). Из-за этого после попадания на спики, тебя ждет верная смерть (если Соника, конечно, не отбросит с их поля), тогда Соник потеряет защитную сферу, кольца, а потом жизнь. В последующих играх серии этот баг был исправлен.
Hivebrain's Sonic 1 disassembly (2005)
Убрать Spike Bug очень просто. Открой исходный код игры и найди в нем суброутину Obj36_Hurt. Вот начало её первоначального кода:
<asm>Obj36_Hurt: ; XREF: Obj36_SideWays; Obj36_Upright tst.b ($FFFFFE2D).w ; is Sonic invincible? bne.s Obj36_Display ; if yes, branch move.l a0,-(sp) ...</asm>
Чтобы исправить баг, нам нужно добавить всего две строчки, отмеченные плюсами в комментариях (конечно же, плюсы можно убрать):
<asm>Obj36_Hurt: ; XREF: Obj36_SideWays; Obj36_Upright tst.b ($FFFFFE2D).w ; is Sonic invincible? bne.s Obj36_Display ; if yes, branch tst.w ($FFFFD030).w ; +++ is Sonic invulnerable? bne.s Obj36_Display ; +++ if yes, branch move.l a0,-(sp) ...</asm>
Теперь когда Соник касается спик, игра будет проверять, не уязвим ли Соник после повреждения (когда спрайт Соника мигает).
Sonic 1 disassembly (версия для Sonic Retro svn)
В svn версии диассембла код объектов находится в раздельных файлах. Код объекта шипов находится в _incObj\36 Spikes.asm. Найди это: <asm> Spik_Hurt: ; XREF: Spik_SideWays; Spik_Upright tst.b (v_invinc).w ; is Sonic invincible? bne.s Spik_Display ; if yes, branch move.l a0,-(sp) </asm>
и замени этим: <asm> Spik_Hurt: ; XREF: Spik_SideWays; Spik_Upright tst.b (v_invinc).w ; is Sonic invincible? bne.s Spik_Display ; if yes, branch tst.w (v_player+$30).w ; +++ is Sonic invulnerable? bne.s Spik_Display ; +++ if yes, branch move.l a0,-(sp) </asm>