Как исправить Spike Bug — различия между версиями
Quantum (обсуждение | вклад) м |
NeKit (обсуждение | вклад) |
||
Строка 1: | Строка 1: | ||
{{GuideBy|[[FraGag]]}} | {{GuideBy|[[FraGag]]}} | ||
− | '''Spike Bug''' в первом Сонике заключается в том, что игра не проверяет [[Sonic the Hedgehog| | + | '''Spike Bug''' в [[Sonic the Hedgehog (16-bit)|первом Сонике]] заключается в том, что игра не проверяет [[Sonic the Hedgehog|Cоника]] на неуязвимость после повреждения (когда спрайт Соника мигает). Из-за этого после попадания на спики, тебя ждет верная смерть (если Соника, конечно, не отбросит с их поля), тогда Соник потеряет [[Shield|защитную сферу]], кольца, а потом жизнь. В последующих играх серии этот баг был исправлен. |
− | Убрать '''Spike Bug''' очень просто. | + | == Hivebrain's Sonic 1 disassembly (2005) == |
+ | Убрать '''Spike Bug''' очень просто. Открой исходный код игры и найди в нем суброутину '''Obj36_Hurt'''. Вот начало её первоначального кода: | ||
<asm>Obj36_Hurt: ; XREF: Obj36_SideWays; Obj36_Upright | <asm>Obj36_Hurt: ; XREF: Obj36_SideWays; Obj36_Upright | ||
Строка 11: | Строка 12: | ||
...</asm> | ...</asm> | ||
− | Чтобы исправить баг, нам нужно добавить всего две строчки: | + | Чтобы исправить баг, нам нужно добавить всего две строчки, отмеченные плюсами в комментариях (конечно же, плюсы можно убрать): |
<asm>Obj36_Hurt: ; XREF: Obj36_SideWays; Obj36_Upright | <asm>Obj36_Hurt: ; XREF: Obj36_SideWays; Obj36_Upright | ||
Строка 21: | Строка 22: | ||
...</asm> | ...</asm> | ||
− | Теперь когда Соник касается спик, игра будет проверять, не уязвим ли Соник после повреждения (когда спрайт Соника | + | Теперь когда Соник касается спик, игра будет проверять, не уязвим ли Соник после повреждения (когда спрайт Соника мигает). |
+ | == Sonic 1 disassembly (версия [[Sonic Retro|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> | ||
[[Категория:Как_сделать...]] | [[Категория:Как_сделать...]] |
Версия 17:32, 28 марта 2010
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>