Как убрать Speed Cap
Автор гида: vladikcomperОсновано на гиде: «SCHG How-to:Remove the Speed Cap»
Speed Cap, или скоростной барьер, механизм который жестко ограничивает скорость Соника до заданного лимита при попытке разогнаться. Этот жесткий барьер особенно ощущается, когда Соник ускорился с помощью вертикальной пружины — стоит вам нажать кнопку Влево/вправо, Соник попытается ускорится, и Speed Cap тут же сработает, сурово урезав скорость ежика. Начиная с Соник 2, этот эффект был исправлен, и вместо урезания скорости код просто не позволял Сонику разгонятся дальше, а достигнутая скорость сохранялась.
Удаление скоростного барьера на земле
Вначале позаботимся об удалении Speed Cap'а при перемещении на земле, это самый важный и заметный момент в исправлении неприятного эффекта барьера.
Идите к суброутине Sonic_MoveLeft. В ней, над лейбелом loc_130A6 вы увидите команду:
move.w d1,d0
Прямо перед ней добавьте эти строки:
add.w d5,d0 cmp.w d1,d0 ble.s loc_130A6
Скоростной барьер при движении влево теперь убран!
Теперь перейдите к суброутине Sonic_MoveRight и над лейбелом loc_1310C найдите команду:
move.w d6,d0
Прямо перед ней добавьте эти строки:
add.w d5,d0 cmp.w d6,d0 bge.s loc_1310C
Теперь скоростной барьер на земле полностью убран.
Удаление скоростного барьера в воздухе
Действие скоростного барьера в воздухе почти незаметно, пока в вашем хаке не появился Jump Dash, который задает Сонику скорости, которых он при обычном беге достигнуть не может. Ограничение в воздухе впервые было исправлено только в Соник 3.
Метод удаления барьера точно такой же. Идите к суброутине Sonic_ChgJumpDir и перед командой «move.w d1,d0» добавьте:
add.w d5,d0 ; +++ remove this frame's acceleration change cmp.w d1,d0 ; +++ compare speed with top speed ble.s loc_13278 ; +++ if speed was already greater than the maximum, branch
Опуститесь чуть ниже, пока не увидите команду «move.w d6,d0». Прямо над ней, добавьте:
sub.w d5,d0 ; +++ remove this frame's acceleration change cmp.w d1,d0 ; +++ compare speed with top speed bge.s Obj01_JumpMove ; +++ if speed was already greater than the maximum, branch
Вот так в конечном счете будет выглядеть суброутина после внесения изменений:
Sonic_ChgJumpDir: ; XREF: Obj01_MdJump; Obj01_MdJump2 move.w ($FFFFF760).w,d6 move.w ($FFFFF762).w,d5 asl.w #1,d5 btst #4,$22(a0) bne.s Obj01_ResetScr2 move.w $10(a0),d0 btst #2,($FFFFF602).w; is left being pressed? beq.s loc_13278; if not, branch bset #0,$22(a0) sub.w d5,d0 move.w d6,d1 neg.w d1 cmp.w d1,d0 bgt.s loc_13278 add.w d5,d0 ; +++ remove this frame's acceleration change cmp.w d1,d0 ; +++ compare speed with top speed ble.s loc_13278 ; +++ if speed was already greater than the maximum, branch move.w d1,d0 loc_13278: btst #3,($FFFFF602).w; is right being pressed? beq.s Obj01_JumpMove; if not, branch bclr #0,$22(a0) add.w d5,d0 cmp.w d6,d0 blt.s Obj01_JumpMove sub.w d5,d0 ; +++ remove this frame's acceleration change cmp.w d1,d0 ; +++ compare speed with top speed bge.s Obj01_JumpMove ; +++ if speed was already greater than the maximum, branch move.w d6,d0