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

Bugs: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.
Other languages:
Deutsch • ‎English • ‎español • ‎français • ‎italiano • ‎polski • ‎português do Brasil • ‎한국어

This page details bugs of Super Mario Bros..

Bug do ovo de Spiny

Eis como a velocidade do ovo de Spiny é calculada e armazenada.

DifLoop:  lda PRDiffAdjustData,y     ;get three values and save them
          sta $01,x                  ;to $01-$03
          iny
          iny                        ;increment Y four bytes for each value
          iny
          iny
          dex                        ;decrement X for each one
          bpl DifLoop                ;loop until all three are written
          ldx ObjectOffset           ;get enemy object buffer offset
          jsr PlayerLakituDiff       ;move enemy, change direction, get value - difference
          ldy Player_X_Speed         ;check player's horizontal speed
          cpy #$08
          bcs SetSpSpd               ;if moving faster than a certain amount, branch elsewhere
          tay                        ;otherwise save value in A to Y for now
          lda PseudoRandomBitReg+1,x
          and #%00000011             ;get one of the LSFR parts and save the 2 LSB
          beq UsePosv                ;branch if neither bits are set
          tya
          eor #%11111111             ;otherwise get two's compliment of Y
          tay
          iny
UsePosv:  tya                        ;put value from A in Y back to A     A=SpeedVar
SetSpSpd: jsr SmallBBox              ;set bounding box control, etc.      A=SpeedVar
          ...

Está indo bem até agora. O registro A armazena o valor apropriado da velocidade.

SmallBBox: lda #$09               ;set specific bounding box size control A=09
           bne SetBBox            ;unconditional branch                   A=09

Ops, pular para a sub-rotina da caixa delimitadora sobrescreveu A! Tanto trabalho para nada.

SetBBox:  sta Enemy_BoundBoxCtrl,x    ;set bounding box control here      A=09
          lda #$02                    ;set moving direction for left      A=02
          sta Enemy_MovingDir,x                                           A=02
InitVStf: lda #$00                    ;initialize vertical speed          A=00
          sta Enemy_Y_Speed,x         ;and movement force                 A=00
          sta Enemy_Y_MoveForce,x                                         A=00
          rts                                                             A=00

Agora A acaba sendo igual a 00. Agora o jogo volta para a sub-rotina SetSpSpd...

          ...
          ldy #$02                   ;Set Y to 02 (Leftwards)             A=00
          sta Enemy_X_Speed,x        ;Set Spiny egg speed to A (00)       A=00
          cmp #$00                   ;Now check if speed is negative...   A=00
          bmi SpinyRte               ;...but A is always 00. No branch.   A=00
          dey                        ;Set Y to 01 (Rightwards)
SpinyRte: sty Enemy_MovingDir,x      ;Set moving direction.

...e a velocidade é definida como 0. A direção do movimento é definida para a direita, mas como o ovo não tem movimento horizontal e a direção é redefinida quando o Spiny surge, isso não significa muito.

Para corrigir esse bug, basta mover o "jsr SmallBBox" para depois do opcode dey , que é o que este patch faz:

Download.png Download Spiny Egg Speed Patch
File: SMBSpinyEggPatch.ips (25 B) (info)


(Fonte: doppelganger's SMBDis)