このページは Super Mario Bros.のバグページです。
パイポのバグ#
トゲゾーのスピードがどのように計算され、保存されるか説明します。
DifLoop: lda PRDiffAdjustData,y ;3 つの値を取得して保存します
sta $01,x ;to $01-$03
iny
iny ;値ごとに Y を 4 バイト増加します
iny
iny
dex ;1つごとにXをデクリメントします
bpl DifLoop ;3 つすべてが書き込まれるまでループします
ldx ObjectOffset ;敵オブジェクトのバッファオフセットを取得
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
...
これまでのところうまくいっている。 A レジスタには、適切な速度値が格納されます。
SmallBBox: lda #$09 ;set specific bounding box size control A=09
bne SetBBox ;unconditional branch A=09
おっと、境界ボックスへのジャンプ サブルーチンが A を上書きしてしまいました。これらはすべて無駄に機能します。
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
ここで、A は 00 になります。ゲームは 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.
...速度は0に設定されています。移動方向は右方向に設定されていますが、卵には水平方向の移動がなく、トゲトゲの敵がスポーンすると方向がリセットされるため、これはあまり意味がありません。
このバグを修正するには、「jsr SmallBBox」を dey'' オペコードの後に移動するだけです。これがこのパッチの動作です:
|
File: SMBSpinyEggPatch.ips (25 B) (info) |
(出典: doppelganger's SMBDis)