From be81787446f7a5035c709a09143b17c07087faf7 Mon Sep 17 00:00:00 2001 From: Kara Alexandra Date: Fri, 29 Apr 2022 15:23:47 -0700 Subject: [PATCH] Bee Mode --- hooks.asm | 19 ++++- special_weapons.asm | 134 +++++++++++++++++++++++++++++++ swordswap.asm | 9 ++- tables.asm | 9 ++- variable_ganon_vulnerability.asm | 18 ++++- 5 files changed, 179 insertions(+), 10 deletions(-) diff --git a/hooks.asm b/hooks.asm index 8586ad6..1a498f6 100755 --- a/hooks.asm +++ b/hooks.asm @@ -2936,6 +2936,22 @@ db $B2, $28, $B3, $28, $C2, $28, $C2, $68 org $079CE6 ; Bank07.asm@4632 (LDA #$80 : TSB $3A) JSL CheckDetonateBomb ;-------------------------------------------------------------------------------- +org $1EDCF8 ; bank_1E.asm@16086 (LDX $0202 : ...) +JSL SetBeeType +BRA + : NOP #15 : + +;-------------------------------------------------------------------------------- +org $1EB5E8 ; bank_1E.asm@9387 (LDA #$03 : STA $0D80, X) +JSL ArrghusBoing +;-------------------------------------------------------------------------------- +org $1EDFAF ; bank_1E.asm@16607 (.next_sprite) +JSL BeeCheckTarget +BCS .bee_valid_target +BRA .bee_unsuitable_target +NOP #48 +.bee_unsuitable_target +skip 11 +.bee_valid_target +;-------------------------------------------------------------------------------- ;================================================================================ ; Variable Ganon Vulnerability @@ -2952,8 +2968,9 @@ org $0DD628 ; Bank0D.asm@1266 (LDA $0B6B, Y : AND #$02) JSL CheckBeeBoss NOP ;-------------------------------------------------------------------------------- -org $0DD677 ; Bank0D.asm@1303 (JSL Ancilla_CheckSpriteDamage.preset_class) +org $0DD676 ; Bank0D.asm@1303 (TYX : JSL Ancilla_CheckSpriteDamage.preset_class) JSL Ganon_CheckBeeVulnerability +NOP ;-------------------------------------------------------------------------------- ;================================================================================ diff --git a/special_weapons.asm b/special_weapons.asm index 35b595c..624cce6 100644 --- a/special_weapons.asm +++ b/special_weapons.asm @@ -10,6 +10,7 @@ DamageClassCalc: JSL Ganon_CheckAncillaVulnerability RTL + + LDA SpecialWeapons : CMP #$06 : BEQ .cane_immune ; only crystal switches in bee mode PLA CMP #$01 : BEQ .red_cane CMP #$2C : BEQ .red_cane @@ -279,9 +280,13 @@ Utility_CheckImpervious: CMP #$03 : BEQ + CMP #$04 : BEQ + CMP #$05 : BEQ + + CMP #$06 : BEQ .check_sidenexx BRA .normal + LDA $0301 : AND.b #$0A : BNE .impervious ; impervious to hammer +.check_sidenexx + LDA.w $0DD1 : ORA.w $0DD2 : BNE .impervious ; at least one sidenexx alive + LDA.w $0D80, X : CMP.b #$02 : BCS .impervious ; at least one sidenexx alive BRA .not_impervious .normal LDA $0E60, X : AND.b #$40 : BNE .impervious @@ -331,6 +336,7 @@ AllowBombingMoldorm: CMP #$03 : BEQ .no_disable_projectiles CMP #$04 : BEQ .no_disable_projectiles CMP #$05 : BEQ .no_disable_projectiles + CMP #$06 : BEQ .no_disable_projectiles INC $0BA0, X .no_disable_projectiles JSL !SPRITE_INITIALIZED_SEGMENTED @@ -344,6 +350,7 @@ AllowBombingBarrier: CMP #$03 : BEQ .no_disable_projectiles CMP #$04 : BEQ .no_disable_projectiles CMP #$05 : BEQ .no_disable_projectiles + CMP #$06 : BEQ .no_disable_projectiles .disable_projectiles INC $0BA0, X .no_disable_projectiles @@ -432,6 +439,12 @@ StoreSwordDamage: LDA #$05 RTL ;-------------------------------------------------------------------------------- +BeeDamageClass: + db $FF + db $06, $00, $07, $08, $0A + db $0B, $0C, $0D, $0E, $0F + db $FF, $03, $FF, $FF, $FF + db $FF, $01, $01, $FF, $FF CheckDetonateBomb: LDA.l SpecialWeapons : CMP.b #$01 : BNE .not_bomb_mode .detonate_bombs @@ -445,9 +458,130 @@ CheckDetonateBomb: .next_ancilla DEX BPL .check_ancilla + BRA .done .not_bomb_mode + LDA.l SpecialWeapons : CMP.b #$06 : BNE .done + LDX.w $0202 + LDA.l BeeDamageClass, X : CMP.b #$FF : BEQ .nope + JSL $1EDCC9 + BMI .nope + LDX.w $0202 + LDA.l BeeDamageClass, X + CMP.b #$06 : BNE .set_bee_class + LDA.l $7EF340 : CMP.b #$03 : !BGE .silver_arrows + LDA.b #$06 + BRA .set_bee_class +.silver_arrows + LDA.b #$09 +.set_bee_class + STA.w $0ED0, Y + BRA .done +.nope + LDA.b #$3C + STA.w $0CF8 + JSL $0DBB67 + ORA.w $0CF8 + STA.w $012E +.done ; what we wrote over LDA.b #$80 TSB.b $3A RTL ;-------------------------------------------------------------------------------- +SetBeeType: + LDA.l SpecialWeapons : CMP.b #$06 : BEQ .bee_mode + LDX.w $0202 +.check_bee_type + LDA.l $7EF33F, X + TAX + LDA.l $7EF35B, X + CMP.b #$08 + BNE .regular_bee + LDA.b #$01 + STA.w $0EB0, Y +.regular_bee + LDA.b #$01 + STA.w $0ED0, Y + RTL +.bee_mode + LDX.w $0202 + CPX.b #$10 : BEQ .check_bee_type + BRA .regular_bee +;-------------------------------------------------------------------------------- +ArrghusBoing: + LDA.l SpecialWeapons : CMP.b #$06 : BNE .done + LDA.w $0F60, X : AND.b #$BF : STA.w $0F60, X +.done + ; what we wrote over + LDA.b #$03 + STA.w $0D80, X + RTL +;-------------------------------------------------------------------------------- +BeeCheckTarget: +CPY.w $0FA0 +BEQ .unsuitable_target + +LDA.w $0DD0,Y +CMP.b #$09 +BCC .unsuitable_target + +LDA.w $0F00,Y +BNE .unsuitable_target + +; in bee-mode skip targets that the bee can't hurt +LDA.l SpecialWeapons : CMP.b #$06 : BNE + +JSR BeeCheckDamage +CMP.b #$00 : BEQ .unsuitable_target ++ + +LDA.w $0E40,Y +BMI .potential_target + +LDA.w $0F20,Y +CMP.w $0F20,X +BNE .unsuitable_target + +LDA.w $0F60,Y +AND.b #$40 +BEQ + +LDA.l SpecialWeapons : CMP.b #$06 : BNE .unsuitable_target +; in bee mode, allow targetting anti-fairies, bunny beams, and keese +LDA.w $0E20,Y +CMP.b #$15 : BEQ + ; anti-fairy +CMP.b #$6F : BEQ + ; keese +CMP.b #$D1 : BEQ + ; bunny beam +BRA .unsuitable_target ++ + +LDA.w $0BA0,Y +BEQ .valid_target +BRA .unsuitable_target + +.potential_target +LDA.w $0EB0,X +BEQ .unsuitable_target + +LDA.w $0CD2,Y +AND.b #$40 +BNE .valid_target + +.unsuitable_target +CLC : RTL + +.valid_target +SEC : RTL +;-------------------------------------------------------------------------------- +BeeCheckDamage: +PHX : PHP +REP #$20 +LDA.w $0E20,Y : AND.w #$00FF +ASL #4 +SEP #$20 +ORA.w $0ED0,X +REP #$30 +TAX +SEP #$20 +JSL LookupDamageLevel +SEP #$10 +PLP : PLX +RTS diff --git a/swordswap.asm b/swordswap.asm index b99838f..fdc46fe 100644 --- a/swordswap.asm +++ b/swordswap.asm @@ -128,17 +128,18 @@ LoadModifiedIceFloorValue_a01: ;================================================================================ CheckTabletSword: LDA.l AllowHammerTablets : BEQ + - LDA HammerEquipment : BEQ + ; check for hammer - LDA.b #$02 : RTL + LDA HammerEquipment : BNE .allow ; check for hammer + LDA.l SpecialWeapons : CMP #$01 : BEQ .check_special CMP #$03 : BEQ .check_special CMP #$04 : BEQ .check_special CMP #$05 : BEQ .check_special + CMP #$06 : BEQ .allow BRA .normal - .check_special - LDA SpecialWeaponLevel : CMP #$02 : !BLT + ; check for master bombs + .allow LDA.b #$02 : RTL + .check_special + LDA SpecialWeaponLevel : CMP #$02 : !BGE .allow ; check for master bombs .normal LDA SwordEquipment ; get actual sword value RTL diff --git a/tables.asm b/tables.asm index b549152..8461f72 100644 --- a/tables.asm +++ b/tables.asm @@ -112,7 +112,14 @@ db #$00 ; #$00 = Default behavior (silver arrows) ;-------------------------------------------------------------------------------- org $30802F ; PC 0x18003F SpecialWeapons: -db #$00 ; #$00 = Off (default) - #$01 = Bomb-Only mode - #$02 = Pseudosword mode - #$03 = Byrna-Only mode - #$04 = Somaria-Only mode - #$05 = Canes-Only mode +db #$00 +; $00 = Off (default) +; $01 = Bomb-Only mode +; $02 = Pseudosword +; $03 = Byrna-Only mode +; $04 = Somaria-Only mode +; $05 = Canes-Only mode +; $06 = Bee mode ;-------------------------------------------------------------------------------- org $308030 ; PC 0x180030 EnableSRAMTrace: diff --git a/variable_ganon_vulnerability.asm b/variable_ganon_vulnerability.asm index dca8526..e2a7a4d 100644 --- a/variable_ganon_vulnerability.asm +++ b/variable_ganon_vulnerability.asm @@ -68,17 +68,24 @@ Ganon_CheckPowderVulnerability: ; we know it's powder RTL ;-------------------------------------------------------------------------------- Ganon_CheckBeeVulnerability: ; we know it's a bee +; X is bee sprite index +; Y is target sprite index LDA.l GanonVulnerabilityItem : CMP #$10 : BNE .normal ; ganon not vulnerable to bee - LDA $0E20, X : CMP #$D7 : BNE .normal ; not stunned ganon - LDA $0EE0, X : BNE .normal ; ganon has iframes + LDA $0E20, Y : CMP #$D7 : BNE .normal ; not stunned ganon + LDA $0EE0, Y : BNE .normal ; ganon has iframes LDA.l Ganon_IFrameDuration+$10 - STA $0EE0, X ; give the poor pig some iframes - LDA #$20 : STA $0F10, X + STA $0EE0, Y ; give the poor pig some iframes + LDA #$20 : STA $0F10, Y LDA #$09 BRA .done .normal + LDA.l SpecialWeapons : CMP.b #$06 : BNE .regular_bee + LDA.w $0ED0, X + BRA .done +.regular_bee LDA.b #$01 .done + TYX JSL.l !ANCILLA_CHECK_SPRITE_DAMAGE_PRESET_CLASS RTL ;-------------------------------------------------------------------------------- @@ -108,6 +115,9 @@ Ganon_CheckHammerVulnerability: ; we know it's hammer ;-------------------------------------------------------------------------------- CheckBeeBoss: ; Y is sprite index + LDA.l SpecialWeapons : CMP #$06 : BNE .not_bee_mode + LDA #$00 : RTL +.not_bee_mode LDA.l GanonVulnerabilityItem : CMP #$10 : BNE .normal ; ganon not vulnerable to bee LDA $0E20, Y : CMP #$D7 : BNE .normal ; not stunned ganon LDA #$00 : RTL