I have a question about the PAL-A version of SMB1. I know that the movement for the flying Cheep Cheep animation (MoveFlyingCheepCheep) has been greatly simplified, but unless you also change the related attributes (under FlyCCXSpeedData and InitFlyingCheepCheep) to the PAL-A version, then the Cheep Cheeps will only fly just above the bridge. Even for the original PAL-A release, the Cheep Cheeps never fly near the heads-up display attributes.
Original NTSC version:
https://www.youtube.com/watch?v=Gx5--eK2k6Y&t=462s
(the flying Cheep Cheeps will fly as high as the score display)
Original PAL-A version:
https://www.youtube.com/watch?v=APe83KBXf9M&t=465s
(the flying Cheep Cheeps only fly as high as the bottom of the topmost clouds)
Super Mario Bros. Enhanced (by Dintonen):
https://www.youtube.com/watch?v=dCpvqPC6Gkc&t=454s
(the flying Cheep Cheeps only fly as high as the top of the bridge, when combined with the original NTSC flying Cheep Cheep speed attributes)
Hence I ask: with the simplified animation coding for the flying Cheep Cheeps, may I please find out which attributes should I change under FlyCCXSpeedData and InitFlyingCheepCheep to make them fly as high as touching the score display (as in the NTSC release)?
Here's the PAL-A specific attributes:
Code: Select all
FlyCCXSpeedData:
.byte $0e, $05, $06, $0e ;original NTSC attributes
.byte $1c, $20, $10, $0c
.byte $1e, $22, $18, $14
.byte $11, $07, $08, $0a ;PAL diff: Faster speed to compensate FPS difference
.byte $23, $28, $15, $10
.byte $22, $2c, $1f, $1b
and
Code: Select all
InitFlyingCheepCheep:
lda FrenzyEnemyTimer ;if timer here not expired yet, branch to leave
bne ChpChpEx
jsr SmallBBox ;jump to set bounding box size $09 and init other values
lda PseudoRandomBitReg+1,x
and #%00000011 ;set pseudorandom offset here
tay
lda FlyCCTimerData,y ;load timer with pseudorandom offset
sta FrenzyEnemyTimer
ldy #$03 ;load Y with default value
lda SecondaryHardMode
beq MaxCC ;if secondary hard mode flag not set, do not increment Y
iny ;otherwise, increment Y to allow as many as four onscreen
MaxCC: sty $00 ;store whatever pseudorandom bits are in Y
cpx $00 ;compare enemy object buffer offset with Y
bcs ChpChpEx ;if X => Y, branch to leave
lda PseudoRandomBitReg,x
and #%00000011 ;get last two bits of LSFR, first part
sta $00 ;and store in two places
sta $01
lda #$fa ;set vertical speed for cheep-cheep;PAL diff: Faster speed to compensate FPS difference (was $fb for NTSC)
sta Enemy_Y_Speed,x
lda #$00 ;load default value
ldy Player_X_Speed ;check player's horizontal speed
beq GSeed ;if player not moving left or right, skip this part
lda #$04
cpy #$1d ;PAL diff: Faster speed cutoffs to compensate FPS difference (was $19 for NTSC)
bcc GSeed ;if moving to the right but not very quickly, do not change A
asl ;otherwise, multiply A by 2
Thank you,
Ben