This page details bugs of Super Mario Bros./pl.
Błąd zachowania jaj Spiny#
Oto jak prędkości jaj Spiny'ch są kalkulowane i przechowywane.
DifLoop: lda PRDiffAdjustData,y ;zdobądź trzy wartości i je zapisz
sta $01,x ;do $01-$03
iny
iny ;powiększ Y o 4 bajty dla każdej wartości
iny
iny
dex ;zmniejsz X dla każdej z nich
bpl DifLoop ;powtórz, dopóki wszystkie 3 są zapisane
ldx ObjectOffset ;zdobądź przesunięcie bufora obiektu przeciwnika
jsr PlayerLakituDiff ;porusz przeciwnikiem, zmień kierunek, zdobądź wartość - różnica
ldy Player_X_Speed ;sprawdź prędkość horyzontalną gracza
cpy #$08
bcs SetSpSpd ;jeśli rusza się szybciej niż dana wartość, odgałęziaj wszędzie indziej
tay ;w innym wypadku zapisz wartość A do Y na teraz
lda PseudoRandomBitReg+1,x
and #%00000011 ;wejdź do jednego z części LSFR i zapisz dwa LSB
beq UsePosv ;odgałęziaj jeżeli żaden z bitów nie jest ustalonych
tya
eor #%11111111 ;w przeciwnym wypadku zdobądź dwa argumenty Y
tay
iny
UsePosv: tya ;wstaw spowrotem wartość z A w Y do A A=SpeedVar
SetSpSpd: jsr SmallBBox ;ustaw kontrolę granic hitboxa, itp. A=SpeedVar
...
Jak narazie idzie to w miarę sprawnie. Rejestr A zapisuje poprawnie prędkość.
SmallBBox: lda #$09 ;ustaw kontrolę specyficznej wielkości granic hitboxa A=09
bne SetBBox ;bezwarunkowy przeskok A=09
Ups, przeskok do podprogramu granic hitboxa nadpisało rejestr A! Cała ta robota poszła w p... yyy... na nic!
SetBBox: sta Enemy_BoundBoxCtrl,x ;ustaw kontrolę granic boxa tutaj A=09
lda #$02 ;ustaw kierunek ruchu na lewy A=02
sta Enemy_MovingDir,x A=02
InitVStf: lda #$00 ;inicjalizuj prędkość wertykalną A=00
sta Enemy_Y_Speed,x ;i siłę ruchu A=00
sta Enemy_Y_MoveForce,x A=00
rts A=00
No i teraz A się znajduje na zerze. Teraz gra wraca do funkcji SetSpSpd...
...
ldy #$02 ;Ustaw Y do 02 (w lewo) A=00
sta Enemy_X_Speed,x ;Ustaw prędkość wyrzutu jaja Spiny równego A (00) A=00
cmp #$00 ;Teraz sprawdź, czy prędkość jest poniżej zera... A=00
bmi SpinyRte ;...ale A jest zawsze równe. Nie przeskakuj. A=00
dey ;Ustaw Y do 01 (w prawo)
SpinyRte: sty Enemy_MovingDir,x ;Ustaw kierunek ruchu.
...no i prędkość jest równa 0. Kierunek ruchu jest ustawiony w prawo, ale skoro jajo nie ma żadnego ruchu horyzontalnego i kierunek ruchu się resetuje, kiedy Spiny się pojawia, nie znaczy to właściwie wiele.
Aby naprawić błąd, po prostu przesuń "jsr SmallBBox" za kod operacji dey, co robi ta łatka:
Pobierz Jajka Spiny Poprawka Prędkości Plik: SMBSpinyEggPatch.ips (25B) (info) |
(Źródło: doppelganger's SMBDis)