Как исправить Spike Bug — различия между версиями
Quantum (обсуждение | вклад) м |
м |
||
(не показано 5 промежуточных версий 3 участников) | |||
Строка 1: | Строка 1: | ||
− | {{ | + | {{Руководство|[[FraGag]]}} |
− | '''Spike Bug''' в | + | '''Spike Bug''' в [[Sonic the Hedgehog (16-бит)|самой первой игре про Соника]] заключается в том, что игра не проверяет [[Соник]]а на неуязвимость после повреждения (когда спрайт Соника мигает). Из-за этого после попадания на [[шипы]] Соника ждёт верная смерть (если его, конечно, не отбросит с их поля), тогда Соник потеряет [[Щит|защитную сферу]], [[кольца]], а потом жизнь. В последующих играх серии этот баг был исправлен. |
− | Убрать '''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]] 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> | ||
+ | [[Категория:Руководства]] |
Текущая версия на 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>