Как исправить Spike Bug — различия между версиями
Red TF (обсуждение | вклад) м (Замена текста — «bit» на «бит») |
м |
||
Строка 1: | Строка 1: | ||
{{Руководство|[[FraGag]]}} | {{Руководство|[[FraGag]]}} | ||
− | '''Spike Bug''' в [[Sonic the Hedgehog (16-бит)| | + | '''Spike Bug''' в [[Sonic the Hedgehog (16-бит)|самой первой игре про Соника]] заключается в том, что игра не проверяет [[Соник]]а на неуязвимость после повреждения (когда спрайт Соника мигает). Из-за этого после попадания на [[шипы]] Соника ждёт верная смерть (если его, конечно, не отбросит с их поля), тогда Соник потеряет [[Щит|защитную сферу]], [[кольца]], а потом жизнь. В последующих играх серии этот баг был исправлен. |
== Hivebrain's Sonic 1 disassembly (2005) == | == Hivebrain's Sonic 1 disassembly (2005) == | ||
Строка 22: | Строка 22: | ||
...</asm> | ...</asm> | ||
− | Теперь когда Соник касается | + | Теперь когда Соник касается шипов, игра будет проверять, не неуязвим ли Соник после повреждения (когда спрайт Соника мигает). |
− | == Sonic 1 disassembly (версия для [[Sonic Retro | + | == Sonic 1 disassembly (версия для [[Sonic Retro]] svn) == |
− | В svn версии | + | В svn-версии дизассембла код объектов находится в раздельных файлах. Код объекта шипов находится в '''_incObj\36 Spikes.asm'''. Найди это: |
<asm> | <asm> | ||
Spik_Hurt: ; XREF: Spik_SideWays; Spik_Upright | Spik_Hurt: ; XREF: Spik_SideWays; Spik_Upright |
Текущая версия на 03:52, 17 мая 2014
(Оригинальное руководство написано FraGag)
Spike Bug в самой первой игре про Соника заключается в том, что игра не проверяет Соника на неуязвимость после повреждения (когда спрайт Соника мигает). Из-за этого после попадания на шипы Соника ждёт верная смерть (если его, конечно, не отбросит с их поля), тогда Соник потеряет защитную сферу, кольца, а потом жизнь. В последующих играх серии этот баг был исправлен.
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>