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!

Bugi:Super Mario Bros.

From The Cutting Room Floor
Jump to navigation Jump to search
This page is a translated version of the page Bugs:Super Mario Bros. and the translation is 75% complete.
Other languages:
Deutsch • ‎English • ‎español • ‎français • ‎polski • ‎한국어
Other languages:
Deutsch • ‎English • ‎español • ‎français • ‎polski • ‎한국어

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)