We just released a Feb. 5 '89 prototype of DuckTales for the NES!
If you'd like to support our preservation efforts (and this wasn't cheap), please consider donating or supporting us on Patreon. Thank you!
If you'd like to support our preservation efforts (and this wasn't cheap), please consider donating or supporting us on Patreon. Thank you!
Bugi:Super Mario Bros.
Jump to navigation
Jump to search
This page details bugs of Super Mario Bros..
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.
To fix this bug, simply move the "jsr SmallBBox" to after the dey opcode.
(Source: doppelganger's SMBDis)