Made it so the minecart sprite to follower to sprite hand off is much smoother by telling the old sprite cart not to draw after the follower spawns, adjusting the positioning of the follower draw itself, and also made it so it won't always be vertical

Fixed the bug that made it so the minecart would auto grab you sometimes after getting off
and then there was another bug that had accidently been introduced that made carts on track 00 not work
This commit is contained in:
Jared_Brian_
2025-02-01 19:08:57 -07:00
parent ed439e28ed
commit e112bed264
2 changed files with 95 additions and 54 deletions

View File

@@ -98,13 +98,13 @@ ZoraBaby_RevertToSprite:
PHX PHX
TAX TAX
LDA.w $1A64, X : AND.b #$03 : STA.w SprMiscE,Y : STA.w SprMiscC,Y LDA.w $1A64, X : AND.b #$03 : STA.w SprMiscE, Y : STA.w SprMiscC, Y
LDA.w $1A00, X : CLC : ADC.b #$02 : STA.w SprY,Y LDA.w $1A00, X : CLC : ADC.b #$02 : STA.w SprY, Y
LDA.w $1A14, X : ADC.b #$00 : STA.w SprYH,Y LDA.w $1A14, X : ADC.b #$00 : STA.w SprYH, Y
LDA.w $1A28, X : CLC : ADC.b #$10 : STA.w SprX,Y LDA.w $1A28, X : CLC : ADC.b #$10 : STA.w SprX, Y
LDA.w $1A3C, X : ADC.b #$00 : STA.w SprXH,Y LDA.w $1A3C, X : ADC.b #$00 : STA.w SprXH, Y
LDA.b $EE : STA.w $0F20,Y LDA.b $EE : STA.w $0F20, Y
LDA.b #$01 : STA.w SprBulletproof,Y : STA.w $0E80,Y LDA.b #$01 : STA.w SprBulletproof, Y : STA.w $0E80, Y
LDA.b #$04 : STA.w SprAction, Y LDA.b #$04 : STA.w SprAction, Y
LDA.b #$FF : STA.w SprTimerB, Y LDA.b #$FF : STA.w SprTimerB, Y
PLX PLX
@@ -168,8 +168,8 @@ ZoraBaby_CheckForWaterSwitchSprite:
PHX PHX
LDX #$10 LDX #$10
- -
LDA.w SprType, X LDA.w SprType, X
CMP #$21 : BEQ ZoraBaby_CheckForWaterGateSwitch_found_switch CMP #$21 : BEQ ZoraBaby_CheckForWaterGateSwitch_found_switch
DEX : BPL - DEX : BPL -
; Water gate switch not found ; Water gate switch not found
PLX PLX
@@ -185,9 +185,9 @@ ZoraBaby_CheckForWaterGateSwitch:
LDX #$10 LDX #$10
- -
LDA.w SprType, X : CMP #$04 : BEQ .found_switch LDA.w SprType, X : CMP #$04 : BEQ .found_switch
DEX : BPL - DEX : BPL -
; Water gate switch not found ; Water gate switch not found
PLX PLX
.not_on_switch .not_on_switch
CLC CLC
RTS RTS
@@ -203,8 +203,8 @@ ZoraBaby_CheckForWaterGateSwitch:
LDA.w SprX, X : SEC : SBC #$09 : CMP.w SprX, Y : BCS .not_on_switch LDA.w SprX, X : SEC : SBC #$09 : CMP.w SprX, Y : BCS .not_on_switch
LDA.w SprY, X : CLC : ADC #$12 : CMP.w SprY, Y : BCC .not_on_switch LDA.w SprY, X : CLC : ADC #$12 : CMP.w SprY, Y : BCC .not_on_switch
LDA.w SprY, X : SEC : SBC #$12 : CMP.w SprY, Y : BCS .not_on_switch LDA.w SprY, X : SEC : SBC #$12 : CMP.w SprY, Y : BCS .not_on_switch
SEC SEC
RTS RTS
} }
ZoraBaby_GlobalBehavior: ZoraBaby_GlobalBehavior:
@@ -295,9 +295,9 @@ Sprite_39_ZoraBaby:
JSL JumpTableLocal JSL JumpTableLocal
dw LockSmith_Chillin dw LockSmith_Chillin
dw ZoraBaby_FollowLink ; Becomes Follower dw ZoraBaby_FollowLink ; Becomes Follower
dw ZoraBaby_OfferService ; I can help! (Follow/Stay) dw ZoraBaby_OfferService ; I can help! (Follow/Stay)
dw ZoraBaby_RespondToAnswer ; Goto FollowLink or JustPromiseOkay dw ZoraBaby_RespondToAnswer ; Goto FollowLink or JustPromiseOkay
dw ZoraBaby_AgreeToWait dw ZoraBaby_AgreeToWait
dw ZoraBaby_PullSwitch dw ZoraBaby_PullSwitch
dw ZoraBaby_PostSwitch dw ZoraBaby_PostSwitch
@@ -609,17 +609,17 @@ pullpc
FollowerDraw_CalculateOAMCoords: FollowerDraw_CalculateOAMCoords:
{ {
REP #$20 REP #$20
LDA.b $02 : STA.b ($90),Y LDA.b $02 : STA.b ($90), Y
INY INY
CLC : ADC.w #$0080 : CMP.w #$0180 : BCS .off_screen CLC : ADC.w #$0080 : CMP.w #$0180 : BCS .off_screen
LDA.b $02 : AND.w #$0100 : STA.b $74 LDA.b $02 : AND.w #$0100 : STA.b $74
LDA.b $00 : STA.b ($90),Y LDA.b $00 : STA.b ($90), Y
CLC : ADC.w #$0010 : CMP.w #$0100 : BCC .on_screen CLC : ADC.w #$0010 : CMP.w #$0100 : BCC .on_screen
.off_screen: .off_screen:
LDA.w #$00F0 : STA.b ($90),Y LDA.w #$00F0 : STA.b ($90), Y
.on_screen: .on_screen:
SEP #$20 SEP #$20
@@ -784,7 +784,8 @@ MinecartFollower_TransitionToSprite:
JSL Sprite_SpawnDynamically JSL Sprite_SpawnDynamically
TYX TYX
JSL Sprite_SetSpawnedCoords JSL Sprite_SetSpawnedCoords
LDA.w !MinecartDirection, X : CMP.b #$00 : BEQ .vert_adjust LDA.w !MinecartDirectionCache : STA.w !MinecartDirection, X
CMP.b #$00 : BEQ .vert_adjust
CMP.b #$02 : BEQ .vert_adjust CMP.b #$02 : BEQ .vert_adjust
LDA.w POSY : CLC : ADC #$08 : STA.w SprY, X LDA.w POSY : CLC : ADC #$08 : STA.w SprY, X
LDA.w POSX : STA.w SprX, X LDA.w POSX : STA.w SprX, X
@@ -802,6 +803,7 @@ MinecartFollower_TransitionToSprite:
LDA.w !MinecartTrackCache : STA.w SprSubtype, X LDA.w !MinecartTrackCache : STA.w SprSubtype, X
LDA Minecart_AnimDirection, X : STA $0D90, X LDA Minecart_AnimDirection, X : STA $0D90, X
JSL Sprite_Minecart_Prep JSL Sprite_Minecart_Prep
LDA.b #$00 : STA.l $7EF3CC LDA.b #$00 : STA.l $7EF3CC
RTL RTL
@@ -812,7 +814,7 @@ DrawMinecartFollower:
{ {
JSL $099EFC ; Follower_Initialize JSL $099EFC ; Follower_Initialize
LDA.w !MinecartDirection, X : TAX LDA.w !MinecartDirectionCache : TAX
LDA Minecart_AnimDirection, X : STA $02CF LDA Minecart_AnimDirection, X : STA $02CF
JSR FollowerDraw_CachePosition JSR FollowerDraw_CachePosition
@@ -838,6 +840,13 @@ FollowerDraw_CachePosition:
LDA.w $1A3C, X : STA.b $03 LDA.w $1A3C, X : STA.b $03
LDA.w $1A64, X : STA.b $05 LDA.w $1A64, X : STA.b $05
; Adjust the coordinate a bit to place it more in line where the
; minecart should be relative to Link.
REP #$20
LDA.b $00 : SEC : SBC.w #$0008 : STA.b $00
LDA.b $02 : CLC : ADC.w #$0002 : STA.b $02
SEP #$20
; ------------------------- ; -------------------------
AND.b #$20 AND.b #$20
LSR A LSR A
@@ -853,7 +862,7 @@ FollowerDraw_CachePosition:
; variables based on the follower here and manipulate $72 ; variables based on the follower here and manipulate $72
; if the player was immobile. ; if the player was immobile.
CLC : ADC $04 : STA $04 CLC : ADC $04 : STA $04
TYA : CLC : ADC $04 : STA $04 TYA : CLC : ADC $04 : STA $04
; ------------------------- ; -------------------------
@@ -929,6 +938,12 @@ CheckForFollowerInterroomTransition:
{ {
LDA.w !LinkInCart : BEQ .not_in_cart LDA.w !LinkInCart : BEQ .not_in_cart
LDA.b #$0B : STA $7EF3CC LDA.b #$0B : STA $7EF3CC
; Pause the current cart so that it doesn't draw anymore
PHX
LDX.w !MinecartCurrent
LDA.b #$01 : STA $0F00, X
PLX
.not_in_cart .not_in_cart
JSL $01873A ; Underworld_LoadRoom JSL $01873A ; Underworld_LoadRoom
RTL RTL

View File

@@ -114,13 +114,23 @@ Right = $03
; the cart. We can only use one cart at a time so this is only 1 byte. ; the cart. We can only use one cart at a time so this is only 1 byte.
!MinecartTrackCache = $07E8 !MinecartTrackCache = $07E8
; This is used to keep track of which direction we are going during room
; transitions. We can only use one cart at a time so this is only 1 byte.
!MinecartDirectionCache = $07E9
; This is used to keep track of which cart in a room we are riding. This
; is based of the X value used to index sprite arrays.
!MinecartCurrent = $07EA
; ========================================================= ; =========================================================
Sprite_Minecart_Long: Sprite_Minecart_Long:
{ {
PHB : PHK : PLB PHB : PHK : PLB
JSR Sprite_Minecart_DrawTop ; Draw behind Link JSR Sprite_Minecart_DrawTop ; Draw behind Link
JSR Sprite_Minecart_DrawBottom ; Draw in front of Link JSR Sprite_Minecart_DrawBottom ; Draw in front of Link
JSL Sprite_CheckActive : BCC .SpriteIsNotActive JSL Sprite_CheckActive : BCC .SpriteIsNotActive
JSR Sprite_Minecart_Main JSR Sprite_Minecart_Main
.SpriteIsNotActive .SpriteIsNotActive
@@ -140,12 +150,15 @@ Sprite_Minecart_Prep:
JSR UpdateCachedCoords JSR UpdateCachedCoords
LDA.w SprSubtype, X : ASL : TAY LDA.w SprSubtype, X : ASL : TAY
; If Link is in a cart AND he is on the same track as this cart's ; If Link is on the same track as this cart's track AND this cart is
; track, kill the cart. ; not the active cart, kill the cart.
CMP.w !MinecartTrackCache : BNE .notSameTrack LDA.w SprSubtype, X : CMP.w !MinecartTrackCache : BNE .notSameTrack
LDA.b !LinkInCart : BEQ .notInCart LDA.b !LinkInCart : BEQ .notInCart
BRA .killMinecart ; If the SprMiscB is > 4, then it's an active cart. This should only
; be the case when transitioning from a follower.
LDA.w SprMiscB, X : CMP.b #$04 : BCS .active1
BRA .killMinecart
.notInCart .notInCart
.notSameTrack .notSameTrack
@@ -173,7 +186,8 @@ Sprite_Minecart_Prep:
LDA.w !MinecartTrackY, Y : CMP.w SprCachedY : BNE .killMinecart LDA.w !MinecartTrackY, Y : CMP.w SprCachedY : BNE .killMinecart
SEP #$20 SEP #$20
STZ.w SprMiscF, X ; Clear the auto-move flag .active1
STZ.w SprMiscG, X ; Clear the active tossing flag STZ.w SprMiscG, X ; Clear the active tossing flag
LDA.b #$04 : STA.w SprNbrOAM, X ; Nbr Oam Entries LDA.b #$04 : STA.w SprNbrOAM, X ; Nbr Oam Entries
@@ -189,10 +203,13 @@ Sprite_Minecart_Prep:
; If the SprMiscB is > 4, then it's an active cart. This should only ; If the SprMiscB is > 4, then it's an active cart. This should only
; be the case when transitioning from a follower. ; be the case when transitioning from a follower.
LDA.w SprMiscB, X : CMP.b #$04 : BCC .notActive LDA.w SprMiscB, X : CMP.b #$04 : BCC .notActive
LDA.w SprMiscB, X : SEC : SBC.b #$04 : STA.w SprMiscB, X SEC : SBC.b #$04 : STA.w SprMiscB, X
LDA.b #$01 : STA.w SprMiscF, X ; Set the auto-move flag
BRA .active ; Go directly to the direction action we are facing. We add 2 to
; skip the Minecart_WaitHoriz and Minecart_WaitVert actions.
CLC : ADC.b #$02 : STA.w SprAction, X
BRA .active2
.notActive .notActive
; Setup Minecart position to look for tile IDs ; Setup Minecart position to look for tile IDs
; We use AND #$F8 to clamp to a 8x8 grid. ; We use AND #$F8 to clamp to a 8x8 grid.
@@ -214,17 +231,21 @@ Sprite_Minecart_Prep:
CMP.b #$BA : BEQ .goWest CMP.b #$BA : BEQ .goWest
.goNorth .goNorth
LDA.b #North : STA.w SprMiscB, X LDA.b #North : STA.w SprMiscB, X
%GotoAction(1) ; Minecart_WaitVert
JMP .done2 JMP .done2
.goEast .goEast
LDA.b #East : STA.w SprMiscB, X LDA.b #East : STA.w SprMiscB, X
%GotoAction(0) ; Minecart_WaitHoriz
JMP .done2 JMP .done2
.goSouth .goSouth
LDA.b #South : STA.w SprMiscB, X LDA.b #South : STA.w SprMiscB, X
%GotoAction(1) ; Minecart_WaitVert
JMP .done2 JMP .done2
.goWest .goWest
LDA.b #West : STA.w SprMiscB, X LDA.b #West : STA.w SprMiscB, X
%GotoAction(0) ; Minecart_WaitHoriz
.done2 .done2
.active .active2
STZ.w SprTimerB, X STZ.w SprTimerB, X
@@ -244,8 +265,6 @@ Sprite_Minecart_Prep:
%PlayAnimation(2,3,8) %PlayAnimation(2,3,8)
LDA.b #$02 : STA.w $0D90, X LDA.b #$02 : STA.w $0D90, X
%GotoAction(1) ; Minecart_WaitVert
BRA .done BRA .done
.east .east
LDA.b #East : STA !MinecartDirection, X LDA.b #East : STA !MinecartDirection, X
@@ -260,8 +279,6 @@ Sprite_Minecart_Prep:
.horz .horz
%PlayAnimation(0,1,8) %PlayAnimation(0,1,8)
LDA.b #$00 : STA.w $0D90, X LDA.b #$00 : STA.w $0D90, X
%GotoAction(0) ; Minecart_WaitHoriz
.done .done
PLB PLB
@@ -270,7 +287,7 @@ Sprite_Minecart_Prep:
; This is which room each track should start in if it hasn't already ; This is which room each track should start in if it hasn't already
; been given a track. ; been given a track.
.TrackStartingRooms .TrackStartingRooms
dw $0089, $0089, $0089, $0089, $0089, $0089, $0089, $0089 dw $0089, $0089, $0089, $0088, $0089, $0089, $0089, $0089
dw $0089, $0089, $0089, $0089, $0089, $0089, $0089, $0089 dw $0089, $0089, $0089, $0089, $0089, $0089, $0089, $0089
dw $0089, $0089, $0089, $0089, $0089, $0089, $0089, $0089 dw $0089, $0089, $0089, $0089, $0089, $0089, $0089, $0089
dw $0089, $0089, $0089, $0089, $0089, $0089, $0089, $0089 dw $0089, $0089, $0089, $0089, $0089, $0089, $0089, $0089
@@ -279,13 +296,13 @@ Sprite_Minecart_Prep:
; already been given a position. This is necessary to allow for more ; already been given a position. This is necessary to allow for more
; than one stopping point to be in one room. ; than one stopping point to be in one room.
.TrackStartingX .TrackStartingX
dw $1320, $12D0, $1300, $1300, $1300, $1300, $1300, $1300 dw $1320, $12D0, $1300, $1100, $1300, $1300, $1300, $1300
dw $1300, $1300, $1300, $1300, $1300, $1300, $1300, $1300 dw $1300, $1300, $1300, $1300, $1300, $1300, $1300, $1300
dw $1300, $1300, $1300, $1300, $1300, $1300, $1300, $1300 dw $1300, $1300, $1300, $1300, $1300, $1300, $1300, $1300
dw $1300, $1300, $1300, $1300, $1300, $1300, $1300, $1300 dw $1300, $1300, $1300, $1300, $1300, $1300, $1300, $1300
.TrackStartingY .TrackStartingY
dw $11C0, $1120, $1100, $1100, $1100, $1100, $1100, $1100 dw $11C0, $1120, $1100, $10D0, $1100, $1100, $1100, $1100
dw $1100, $1100, $1100, $1100, $1100, $1100, $1100, $1100 dw $1100, $1100, $1100, $1100, $1100, $1100, $1100, $1100
dw $1100, $1100, $1100, $1100, $1100, $1100, $1100, $1100 dw $1100, $1100, $1100, $1100, $1100, $1100, $1100, $1100
dw $1100, $1100, $1100, $1100, $1100, $1100, $1100, $1100 dw $1100, $1100, $1100, $1100, $1100, $1100, $1100, $1100
@@ -319,11 +336,8 @@ Sprite_Minecart_Main:
LDA.w LinkCarryOrToss : AND #$03 : BNE .lifting LDA.w LinkCarryOrToss : AND #$03 : BNE .lifting
LDA.w SprTimerA, X : BNE .not_ready LDA.w SprTimerA, X : BNE .not_ready
JSR CheckIfPlayerIsOn : BCC .not_ready JSR CheckIfPlayerIsOn : BCC .not_ready
; If the cart is active, we move immediately ; Check for B button
LDA.w SprMiscF, X : BNE .active_cart LDA $F4 : AND.b #$80 : BEQ .not_ready
; Check for B button
LDA $F4 : AND.b #$80 : BEQ .not_ready
.active_cart
; Save what track we are currently riding. ; Save what track we are currently riding.
LDA.w SprSubtype, X : STA.w !MinecartTrackCache LDA.w SprSubtype, X : STA.w !MinecartTrackCache
@@ -359,11 +373,8 @@ Sprite_Minecart_Main:
LDA.w LinkCarryOrToss : AND #$03 : BNE .lifting LDA.w LinkCarryOrToss : AND #$03 : BNE .lifting
LDA.w SprTimerA, X : BNE .not_ready LDA.w SprTimerA, X : BNE .not_ready
JSR CheckIfPlayerIsOn : BCC .not_ready JSR CheckIfPlayerIsOn : BCC .not_ready
; If the cart is active, we move immediately ; Check for B button
LDA.w SprMiscF, X : BNE .active_cart LDA $F4 : AND.b #$80 : BEQ .not_ready
; Check for B button
LDA $F4 : AND.b #$80 : BEQ .not_ready
.active_cart
; Save what track we are currently riding. ; Save what track we are currently riding.
LDA.w SprSubtype, X : STA.w !MinecartTrackCache LDA.w SprSubtype, X : STA.w !MinecartTrackCache
@@ -555,6 +566,8 @@ StopCart:
LDA.w $A0 : STA.w !MinecartTrackRoom, Y LDA.w $A0 : STA.w !MinecartTrackRoom, Y
SEP #$20 SEP #$20
STZ.w !MinecartCurrent
RTS RTS
} }
@@ -574,8 +587,11 @@ Minecart_SetDirectionNorth:
STZ.w SprTimerB, X STZ.w SprTimerB, X
%PlayAnimation(2,3,8) %PlayAnimation(2,3,8)
LDA.b #North : STA.w SprMiscB, X : STZ.w !MinecartDirection, X LDA.b #North : STA.w SprMiscB, X
STA.w !MinecartDirection, X : STA.w !MinecartDirectionCache
LDA.b #Up : STA !SpriteDirection, X LDA.b #Up : STA !SpriteDirection, X
TXA : STA.w !MinecartCurrent
RTS RTS
} }
@@ -586,8 +602,11 @@ Minecart_SetDirectionEast:
STZ.w SprTimerB, X STZ.w SprTimerB, X
%PlayAnimation(0,1,8) %PlayAnimation(0,1,8)
LDA.b #East : STA.w SprMiscB, X : STA.w !MinecartDirection, X LDA.b #East : STA.w SprMiscB, X
STA.w !MinecartDirection, X : STA.w !MinecartDirectionCache
LDA.b #Right : STA !SpriteDirection, X LDA.b #Right : STA !SpriteDirection, X
TXA : STA.w !MinecartCurrent
RTS RTS
} }
@@ -598,8 +617,11 @@ Minecart_SetDirectionSouth:
STZ.w SprTimerB, X STZ.w SprTimerB, X
%PlayAnimation(2,3,8) %PlayAnimation(2,3,8)
LDA.b #South : STA.w SprMiscB, X : STA.w !MinecartDirection, X LDA.b #South : STA.w SprMiscB, X
STA.w !MinecartDirection, X : STA.w !MinecartDirectionCache
LDA.b #Down : STA.w !SpriteDirection, X LDA.b #Down : STA.w !SpriteDirection, X
TXA : STA.w !MinecartCurrent
RTS RTS
} }
@@ -610,8 +632,11 @@ Minecart_SetDirectionWest:
STZ.w SprTimerB, X STZ.w SprTimerB, X
%PlayAnimation(0,1,8) %PlayAnimation(0,1,8)
LDA.b #West : STA.w SprMiscB, X : STA.w !MinecartDirection, X LDA.b #West : STA.w SprMiscB, X
STA.w !MinecartDirection, X : STA.w !MinecartDirectionCache
LDA.b #Left : STA.w !SpriteDirection, X LDA.b #Left : STA.w !SpriteDirection, X
TXA : STA.w !MinecartCurrent
RTS RTS
} }
@@ -785,6 +810,7 @@ CheckForCornerTiles:
} }
} }
; Unused?
CheckForTrackTiles: CheckForTrackTiles:
{ {
CMP.b #$B0 : BEQ .horiz CMP.b #$B0 : BEQ .horiz