From b999c1adf8d7c98a94221f5c980db8dbbbc1c792 Mon Sep 17 00:00:00 2001 From: scawful Date: Fri, 23 Dec 2022 19:12:59 -0500 Subject: [PATCH] deku mask mode, link handler routines --- Masks/deku_mask.asm | 156 ++++++++++++++++++- Masks/link_handler.asm | 339 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 492 insertions(+), 3 deletions(-) create mode 100644 Masks/link_handler.asm diff --git a/Masks/deku_mask.asm b/Masks/deku_mask.asm index 0492803..9dc2ed4 100644 --- a/Masks/deku_mask.asm +++ b/Masks/deku_mask.asm @@ -5,11 +5,31 @@ incsrc "../Sprites/sprite_functions_hooks.asm" org $008A01 LDA $BC +org $07983A + Player_ResetSwimState: + +org $079873 + Player_ResetSwimCollision: + +org $07E8F0 + HandleIndoorCameraAndDoors: + +org $0ED6C0 + LoadActualGearPalettes: + +org $07B64F + Link_HandleDiagonalCollision: +org $07E245 + Link_HandleVelocity: +org $07B7C7 + Link_HandleCardinalCollision: +org $07E6A6 + Link_HandleMovingAnimation_FullLongEntry: ; ============================================================================= -org $07A64B -LinkItem_Quake: +org $07A64B ; formerly Quake +LinkItem_DekuMask: { JSR Link_CheckNewY_ButtonPress : BCC .return LDA $3A : AND.b #$BF : STA $3A ; clear the Y button state @@ -22,12 +42,14 @@ LinkItem_Quake: LDA.b #$14 : JSR Player_DoSfx2 LDA $02B2 : CMP #$01 : BEQ .unequip ; is the deku mask on? - JSL Palette_ArmorAndGloves + JSL Palette_ArmorAndGloves ; set the palette + LDA #$0A : STA $5D ; set control handler to mode "using quake" LDA #$35 : STA $BC ; put the mask on LDA #$01 : STA $02B2 BRA .return .unequip JSL Palette_ArmorAndGloves + STZ $5D LDA #$10 : STA $BC : STZ $02B2 ; take the mask off .return @@ -35,6 +57,134 @@ LinkItem_Quake: RTS } +org $07A6D6 +JML LinkItem_UsingDekuMask + + +org $228000 +incsrc "link_handler.asm" +LinkItem_UsingDekuMask: +{ + ; SEP #$20 + + JSL $07F514 ; $3F514 IN ROM + + LDA $0345 : BNE .recache + LDA $4D : BEQ .recoiling + LDA $7EF357 : BEQ .recache + + STZ $02E0 + +; *$383C7 LONG BRANCH LOCATION LinkState_Bunny_recache +.recache + + STZ $03F7 + STZ $03F5 + STZ $03F6 + + LDA $7EF357 : BEQ .no_pearl_a + + STZ $56 + STZ $4D + +.no_pearl_a + + STZ $2E + STZ $02E1 + STZ $50 + + JSL Player_ResetSwimState + + ; Link hit a wall or an enemy hit him, making him go backwards. + LDA.b #$02 : STA $5D + + LDA $7EF357 : BEQ .no_pearl_b + + ; this resets link to default state. + LDA.b #$00 : STA $5D + + JSL LoadActualGearPalettes + +.no_pearl_b + + BRL .exit + +.recoiling + + LDA $46 : BEQ .wait_maybe_not_recoiling + + BRL $83A1 ; Permabunny mode. + +.wait_maybe_not_recoiling + + LDA.b #$FF : STA $24 : STA $25 : STA $29 + + STZ $02C6 + + LDA $034A : BEQ .not_moving + + LDA.b #$01 : STA $0335 : STA $0337 + + LDA.b #$80 : STA $0334 : STA $0336 + + BRL $9715 + +.not_moving + + JSL Player_ResetSwimCollision + JSL $9B0E ; $39B0E IN ROM + + LDA $49 : AND.b #$0F : BNE .movement + + LDA $F0 : AND.b #$0F : BNE .movement + + STA $30 : STA $31 : STA $67 : STA $26 + + STZ $2E + + LDA $48 : AND.b #$F6 : STA $48 + + LDX.b #$20 : STX $0371 + + ; Ledge timer is reset here the same way as for normal link (unbunny). + LDX.b #$13 : STX $0375 + + BRA .finish_up + +.movement + + STA $67 : CMP $26 : BEQ .directions_match + + STZ $2A + STZ $2B + STZ $6B + STZ $4B + + LDX.b #$20 : STX $0371 + + ; Ledge timer is reset here the same way as for normal link (unbunny). + LDX.b #$13 : STX $0375 + +.directions_match + + STA $26 + +.finish_up + + JSL Link_HandleDiagonalCollision ; $3B64F IN ROM + JSL Link_HandleVelocity ; $3E245 IN ROM + JSL Link_HandleCardinalCollision ; $3B7C7 IN ROM + JSL Link_HandleMovingAnimation_FullLongEntry ; $3E6A6 IN ROM + + STZ $0302 + + JSL HandleIndoorCameraAndDoors ; $3E8F0 IN ROM + +.exit: + + RTL +} + ; ============================================================================= org $358000 diff --git a/Masks/link_handler.asm b/Masks/link_handler.asm new file mode 100644 index 0000000..f0faf03 --- /dev/null +++ b/Masks/link_handler.asm @@ -0,0 +1,339 @@ + +org $07983A + Player_ResetSwimState: + +org $079873 + Player_ResetSwimCollision: + +org $07E8F0 + HandleIndoorCameraAndDoors: + +org $0ED6C0 + LoadActualGearPalettes: + +org $07B64F + Link_HandleDiagonalCollision: + +org $07E245 + Link_HandleVelocity: + +org $07B7C7 + Link_HandleCardinalCollision: + +org $07E6A6 + Link_HandleMovingAnimation_FullLongEntry: + +; *$3CEC9-$3CF09 LOCAL +Collision_Detection: +{ + REP #$20 + + JSR TileDetect_ResetState + + STZ $59 + + LDA $22 : ADD $CDA3, Y : AND $EC : LSR #3 : STA $02 + + LDA $20 : ADD $CDAB, Y : AND $EC : STA $00 + + LDA $20 : ADD $CDB3, Y : AND $EC : STA $04 + + REP #$10 + + LDA.w #$0001 : STA $0A + + JSR TileDetect_Execute + + LDA $04 : STA $00 + + LDA.w #$0002 : STA $0A + + JSR TileDetect_Execute + + SEP #$30 + + RTS +} + +; *$3B9B3-$3B9F6 LOCAL +Collision_Uncategorized: +{ + LDA $046C : CMP.b #$01 : BEQ .BRANCH_ALPHA + + REP #$20 + + LDA $20 : SUB $0318 : STA $00 + LDA $22 : SUB $031A : STA $02 + + LDA $E8 : SUB $E6 : ADD $20 : STA $20 + LDA $E2 : SUB $E0 : ADD $22 : STA $22 + + SEP #$20 + + LDA $67 : BEQ .BRANCH_ALPHA + + LDA $30 : ADD $00 : STA $30 + LDA $31 : ADD $02 : STA $31 + + .BRANCH_ALPHA: + + STZ $EE + + RTS +} + + +Collision_Settings: +{ + ; Collision settings + LDA $046C : BEQ .oneBg + CMP.b #$04 : BEQ .oneBg ; moving water collision setting + CMP.b #$02 : BCC .twoBgs + CMP.b #$03 : BNE .uselessBranch + + ; No code here, just us mice! + +.uselessBranch + + REP #$20 + + LDA $E6 : SUB $E8 : ADD $20 : STA $20 : STA $0318 + LDA $E0 : SUB $E2 : ADD $22 : STA $22 : STA $031A + + SEP #$20 + +.twoBgs + + LDA.b #$01 : STA $EE + + SEC + + RTS + +.oneBg + + CLC + + RTS +} + +Link_HandleDiagonalCollision: +{ + ; $3B97C IN ROM + JSR Collision_Settings : BCC .onlyOneBg + + JSR .alt_entry ; $3B660 IN ROM + JSR Collision_Uncategorized ; $3B9B3 IN ROM + +.onlyOneBg + + LDA $67 : AND.b #$0F : STA $67 + +; *$3B660 ALTERNATE ENTRY POINT +.alt_entry + + LDA.b #$0F : STA $42 : STA $43 + + STZ $6A + + ; Checking to see if either up or down was pressed. + ; Yeah, one of them was. + LDA $67 : AND.b #$0C : BNE .verticalWalking + + ; Neither up nor down was pressed. + BRL .BRANCH_ULTIMA + +.verticalWalking + + INC $6A + + LDY.b #$00 + + ; Walking in the up direction? + AND.b #$08 : BNE .walkingUp + + ; Walking in the down direction + LDY.b #$02 + +.walkingUp + + ; $66 = #$0 or #$1. #$1 if the down button, #$0 if the up button was pushed. + TYA : LSR A : STA $66 + + JSR Collision_Uncategorized ; $3CE85 IN ROM + + LDA $0E : AND.b #$30 : BEQ .BRANCH_DELTA + + LDA $62 : AND.b #$02 : BNE .BRANCH_DELTA + + LDA $0E : AND.b #$30 : LSR #4 : AND $67 : BNE .BRANCH_DELTA + + LDY.b #$02 + + LDA $67 + + AND.b #$03 : BEQ .BRANCH_DELTA + AND.b #$02 : BNE .BRANCH_EPSILON + + LDY.b #$03 + + BRA .BRANCH_EPSILON + +.BRANCH_DELTA: + + LDA $046C : BEQ .BRANCH_ZETA + + LDA $0E : AND.b #$03 : BNE .BRANCH_THETA + + BRA .BRANCH_IOTA + +.BRANCH_ZETA: + + ; If Link is in the ground state, then branch. + LDA $4D : BEQ .BRANCH_THETA + + LDA $0C : AND.b #$03 : BEQ .BRANCH_THETA + + BRA .BRANCH_MU + +.BRANCH_THETA: + + LDA $0E : AND.b #$03 : BEQ .BRANCH_IOTA + + STZ $6B + + LDA $034A : BEQ .BRANCH_MU + + LDA $02E8 : AND.b #$03 : BNE .BRANCH_MU + + LDA $67 : AND.b #$03 : BEQ .BRANCH_MU + + STZ $033C + STZ $033D + STZ $032F + STZ $0330 + STZ $032B + STZ $032C + STZ $0334 + STZ $0335 + +.BRANCH_MU: + + LDA.b #$01 : STA $0302 + + LDY $66 + +.BRANCH_EPSILON: + + LDA $B64B, Y : STA $42 + +.BRANCH_IOTA: + + LDA $67 : AND.b #$03 : BNE .BRANCH_LAMBDA + + BRL .BRANCH_ULTIMA + +.BRANCH_LAMBDA: + + INC $6A + LDY.b #$04 + AND.b #$02 : BNE .BRANCH_NU + LDY.b #$06 + +.BRANCH_NU: + + TYA : LSR A : STA $66 + JSR Collision_Detection ; $3CEC9 IN ROM + + LDA $0E : AND.b #$30 : BEQ .BRANCH_XI + LDA $62 : AND.b #$02 : BEQ .BRANCH_XI + LDA $0E : AND.b #$30 : LSR #2 : AND $67 : BNE .BRANCH_XI + + LDY.b #$00 + + LDA $67 + + AND.b #$0C : BEQ .BRANCH_XI + AND.b #$08 : BNE .BRANCH_OMICRON + + LDY.b #$01 + + BRA .BRANCH_OMICRON + +.BRANCH_XI: + + ; One BG collision + LDA $046C : BEQ .BRANCH_PI + + LDA $0E : AND.b #$03 : BNE .BRANCH_RHO + + BRA .BRANCH_SIGMA + +.BRANCH_PI: + + LDA $4D : BEQ .BRANCH_RHO + LDA $0C : AND.b #$03 : BEQ .BRANCH_RHO + + BRA .BRANCH_UPSILON + +.BRANCH_RHO: + + LDA $0E : AND.b #$03 : BEQ .BRANCH_SIGMA + STZ $6B + + LDA $034A : BEQ .BRANCH_UPSILON + LDA $02E8 : AND.b #$03 : BNE .BRANCH_UPSILON + + ; Check if Link is walking in an vertical direction + LDA $67 : AND.b #$0C : BEQ .BRANCH_UPSILON + + STZ $033E + STZ $033F + STZ $0331 + STZ $0332 + STZ $032D + STZ $032E + STZ $0336 + STZ $0337 + +.BRANCH_UPSILON: + + LDA.b #$01 : STA $0302 + + LDY $66 + +.BRANCH_OMICRON: + + LDA $B64B, Y : STA $43 + +.BRANCH_SIGMA: + + LDA $67 : AND $42 : AND $43 : STA $67 + +.BRANCH_ULTIMA: + + LDA $67 : AND.b #$0F : BEQ .BRANCH_PHI + + LDA $6B : AND.b #$0F : BEQ .BRANCH_PHI + + STA $67 + +.BRANCH_PHI: + + ; Is this checking if Link is moving diagonally? + LDA $6A : STZ $6A : CMP.b #$02 : BNE .BRANCH_OMEGA + + LDY.b #$01 + + LDA $2F : AND.b #$04 : BEQ .BRANCH_ALIF + + LDY.b #$02 + +.BRANCH_ALIF: + + STY $6A + +.BRANCH_OMEGA: + + RTS +}