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:
Scarica Patch della Velocità dell'Uovo di Koopistrice File: SMBSpinyEggPatch.ips (25 B) (info) |
(Fonte: SMBDis di doppelganger)