If you appreciate the work done within the wiki, please consider supporting The Cutting Room Floor on Patreon. Thanks for all your support!

Bug: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 100% complete.

Questa pagina descrive i bug di Super Mario Bros./it.


Bug dell'uovo di Koopistrice

Ecco come la velocità dell'uovo di Koopistrice è calcolata e memorizzata.

DifLoop:  lda PRDiffAdjustData,y     ;ottieni tre valori e salvali
          sta $01,x                  ;A $01-$03
          iny
          iny                        ;Incrementa Y di quattro byte per ogni valore
          iny
          iny
          dex                        ;Decrementa X per ognuno
          bpl DifLoop                ;Rimani in loop finché non sono stati scritti tutti e tre
          ldx ObjectOffset           ;Ottieni l'offset del buffer degli oggetti dei nemici
          jsr PlayerLakituDiff       ;Sposta il nemico, cambia direzione, ottieni il valore - differenza
          ldy Player_X_Speed         ;Controlla la velocità orizzontale del giocatore
          cpy #$08
          bcs SetSpSpd               ;Se si sta muovendo più veloce di una certa quantità, dirama ad un'altra parte
          tay                        ;Altrimenti salva il valore di A in Y per adesso
          lda PseudoRandomBitReg+1,x
          and #%00000011             ;Ottieni una delle parti del registro a scorrimento a retroazione lineare (LSFR) e salva i due bit meno significativi (LSB)
          beq UsePosv                ;Dirama se nessuno dei bit è impostato
          tya
          eor #%11111111             ;Altrimenti ottieni il complemento a due di Y
          tay
          iny
UsePosv:  tya                        ;Metti il contenuto di A in Y di nuovo all'interno di A             A=SpeedVar
SetSpSpd: jsr SmallBBox              ;Imposta il controllo del riquadro di delimitazione, eccetera.      A=SpeedVar
          ...

Sta andando bene per ora. Il registro A contiene memorizzato il valore di velocità appropriato.

SmallBBox: lda #$09               ;Imposta la dimensione specifica del riquadro di delimitazione         A=09
           bne SetBBox            ;Diramazione non condizionale                                          A=09

Oops, il saltare nella subroutine del riquadro di delimitazione ha sovrascritto A! Tutto quel lavoro per nulla.

SetBBox:  sta Enemy_BoundBoxCtrl,x    ;Imposta il controllo del riquadro di delimitazione qui            A=09
          lda #$02                    ;Imposta la direzione del movimento a sinistra                     A=02
          sta Enemy_MovingDir,x                                                                          A=02
InitVStf: lda #$00                    ;Inizializza la velocità verticale                                 A=00
          sta Enemy_Y_Speed,x         ;e forza del movimento                                             A=00
          sta Enemy_Y_MoveForce,x                                                                        A=00
          rts                                                                                            A=00

Ora A finisce con l'essere uguale a 00. Ora il gioco ritorna indietro alla subroutine SetSpSpd ...

          ...
          ldy #$02                   ;Imposta Y a 02 (Verso sinistra)                                    A=00
          sta Enemy_X_Speed,x        ;Imposta la velocità dell'uovo di Koopistrice ad A (00)             A=00
          cmp #$00                   ;Ora controlla se la velocità è negativa ...                        A=00
          bmi SpinyRte               ;... ma A è sempre pari a 00. Nessuna diramazione.                  A=00
          dey                        ;Imposta Y a 01 (Verso destra)
SpinyRte: sty Enemy_MovingDir,x      ;Imposta la direzione del movimento.

... e la velocità è impostata su 0. La direzione del movimento è impostata verso destra, ma siccome l'uovo non ha movimento orizzontale e la direzione è reimpostata quando il Koopistrice viene posizionato, non significa molto.

Per risolvere questo bug, basta semplicemente spostare "jsr SmallBBox" dopo l'opcode dey, che è quello che fa questa patch:

Download.png Scarica Patch della Velocità dell'Uovo di Koopistrice
File: SMBSpinyEggPatch.ips (25 B) (info)


(Fonte: SMBDis di doppelganger)