Сайт Влада

Как убрать 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