Bug:Super Mario Bros.
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)
|