From 8c6d2ac26dad62b155cb451e7353e08540194d3a Mon Sep 17 00:00:00 2001 From: Kara Alexandra Date: Wed, 22 Dec 2021 00:28:27 -0800 Subject: [PATCH] Fix moldorm/somaria issue and add both-canes mode --- hooks.asm | 4 +++ inventory.asm | 9 +++++ itemdowngrade.asm | 12 +++++++ special_weapons.asm | 82 ++++++++++++++++++++++++++++++++------------- swordswap.asm | 6 ++-- tables.asm | 2 +- 6 files changed, 88 insertions(+), 27 deletions(-) diff --git a/hooks.asm b/hooks.asm index b17ffc4..1f6ae78 100755 --- a/hooks.asm +++ b/hooks.asm @@ -2816,6 +2816,10 @@ org $088DB1 ; Bank08.asm@1207 (PHY : PHX : TYX : ... ) JSL Utility_CheckAncillaOverlapWithSprite BRA + : NOP #7 : + ;-------------------------------------------------------------------------------- +org $08E252 ; Bank08.asm@1770 (PHY : PHX : TYX : ... ) +JSL Utility_CheckAncillaOverlapWithSprite +BRA + : NOP #7 : + +;-------------------------------------------------------------------------------- org $0882E8 ; Bank08.asm@456 (LDA $0DB0, Y : CMP.b #$03) JSL Utility_CheckHelmasaurKingCollision NOP diff --git a/inventory.asm b/inventory.asm index 7cdaa52..e90ea00 100644 --- a/inventory.asm +++ b/inventory.asm @@ -548,6 +548,10 @@ AddInventory: CPY.b #$B7 : !BGE + JSR .incrementBombLevel JMP .done + + CPY.b #$B7 : !BLT + ; Items $B7 - $BC - Cane Upgrades + CPY.b #$BD : !BGE + + JSR .incrementCaneLevel + JMP .done + .done PLP : PLX : PLA @@ -621,6 +625,10 @@ RTS JSR .stampSword ; update "first bomb" timestamp RTS +.incrementCaneLevel + JSR .stampSword ; update "first cane" timestamp +RTS + .incrementShield ; CHECK FOR DUPLICATE SHIELDS LDA $7EF422 : !ADD #$08 : AND #$18 : TAX @@ -720,6 +728,7 @@ RTL LDA SpecialWeapons : CMP #$01 : BEQ + CMP #$03 : BEQ + CMP #$04 : BEQ + + CMP #$05 : BEQ + LDA $7EF359 : BRA ++ + : LDA !WEAPON_LEVEL ++ diff --git a/itemdowngrade.asm b/itemdowngrade.asm index ec0b097..3a611f3 100644 --- a/itemdowngrade.asm +++ b/itemdowngrade.asm @@ -30,6 +30,7 @@ ItemDowngradeFixMain: CPY.b #$29 : BEQ .isMushroom ; Mushroom CPY.b #$B1 : !BLT + : CPY.b #$B6 : !BLT .isBombUpgrade : + + CPY.b #$B7 : !BLT + : CPY.b #$BC : !BLT .isCaneUpgrade : + .done STA [$00] ; thing we wrote over part 2 @@ -82,5 +83,16 @@ JMP .done JMP .done + PLA +JMP .done + .isCaneUpgrade + PHA + TYA ; load cane upgrade item + !SUB #$B6 ; convert to cane level + CMP.l !WEAPON_LEVEL : !BGE + ; skip if highest is lower (this is an upgrade) + LDA.l !WEAPON_LEVEL : !ADD #$B6 ; convert to item id + TAY : PLA : LDA.l !WEAPON_LEVEL ; put cane level into the thing to write + JMP .done + + + PLA JMP .done ;================================================================================ diff --git a/special_weapons.asm b/special_weapons.asm index 99cf1ae..a067500 100644 --- a/special_weapons.asm +++ b/special_weapons.asm @@ -19,14 +19,16 @@ DamageClassCalc: .red_cane PHA LDA SpecialWeapons : CMP #$01 : BEQ .cane_immune - LDA SpecialWeapons : CMP #$03 : BEQ .cane_immune - LDA SpecialWeapons : CMP #$04 : BEQ .special_cane + CMP #$03 : BEQ .cane_immune + CMP #$04 : BEQ .special_cane + CMP #$05 : BEQ .special_cane BRA .normal .blue_cane PHA LDA SpecialWeapons : CMP #$01 : BEQ .cane_immune - LDA SpecialWeapons : CMP #$03 : BEQ .special_cane - LDA SpecialWeapons : CMP #$04 : BEQ .cane_immune + CMP #$03 : BEQ .special_cane + CMP #$04 : BEQ .cane_immune + CMP #$05 : BEQ .special_cane BRA .normal .cane_immune LDA $0E20, X : CMP.b #$1E : BEQ .normal ; crystal switch @@ -121,9 +123,6 @@ Utility_CheckAncillaOverlapWithSprite: PLX : PLY JSL !UTILITY_CHECK_IF_HIT_BOXES_OVERLAP_LONG RTL -.ignore_collision - CLC - RTL .giant_moldorm LDA $0E10, Y : BNE .ignore_collision ; Moldy can have little a I-Frames, as a treat LDA.l SpecialWeapons : CMP #$01 : BNE ++ @@ -132,26 +131,41 @@ Utility_CheckAncillaOverlapWithSprite: ++ : LDA.l SpecialWeapons : CMP #$03 : BNE ++ LDA $0C4A, X : CMP #$31 : BEQ .check_collision_moldorm BRA .ignore_collision ; don't collide with non-byrna -++ : LDA.l SpecialWeapons : CMP #$04 : BNE .ignore_collision +++ : LDA.l SpecialWeapons : CMP #$04 : BNE ++ LDA $0C4A, X : CMP #$01 : BEQ .check_collision_moldorm - LDA $0C4A, X : CMP #$2C : BEQ .check_collision_moldorm + CMP #$2C : BEQ .check_collision_moldorm BRA .ignore_collision ; don't collide with non-somaria +++ : LDA.l SpecialWeapons : CMP #$05 : BNE .ignore_collision + LDA $0C4A, X : CMP #$01 : BEQ .check_collision_moldorm + CMP #$2C : BEQ .check_collision_moldorm + CMP #$31 : BEQ .check_collision_moldorm + BRA .ignore_collision ; don't collide with non-canes .check_collision_moldorm JSR SetUpMoldormHitbox JSL !UTILITY_CHECK_IF_HIT_BOXES_OVERLAP_LONG RTL + +.ignore_collision + CLC + RTL + .trinexx LDA.l SpecialWeapons : CMP #$01 : BNE ++ LDA $0C4A, X : CMP #$07 : BEQ .check_collision_trinexx BRA .ignore_collision ; don't collide with non-bombs ++ : LDA.l SpecialWeapons : CMP #$03 : BNE ++ LDA $0C4A, X : CMP #$31 : BEQ .check_collision_trinexx - BRA .ignore_collision ; don't collide with non-byrna -++ : LDA.l SpecialWeapons : CMP #$04 : BNE .ignore_collision + JMP .ignore_collision ; don't collide with non-byrna +++ : LDA.l SpecialWeapons : CMP #$04 : BNE ++ LDA $0C4A, X : CMP #$01 : BEQ .check_collision_trinexx - LDA $0C4A, X : CMP #$2C : BEQ .check_collision_trinexx + CMP #$2C : BEQ .check_collision_trinexx JMP .ignore_collision ; don't collide with non-somaria +++ : LDA.l SpecialWeapons : CMP #$05 : BNE .ignore_collision + LDA $0C4A, X : CMP #$01 : BEQ .check_collision_trinexx + CMP #$2C : BEQ .check_collision_trinexx + CMP #$31 : BEQ .check_collision_trinexx + JMP .ignore_collision ; don't collide with non-canes .check_collision_trinexx JSR SetUpTrinexxHitbox @@ -233,10 +247,15 @@ Utility_CheckHelmasaurKingCollision: ++ : LDA.l SpecialWeapons : CMP #$03 : BNE ++ LDA $0C4A, X : CMP #$31 : BEQ .collide BRA .normal ; normal behavior with non-byrna -++ : LDA.l SpecialWeapons : CMP #$04 : BNE .normal +++ : LDA.l SpecialWeapons : CMP #$04 : BNE ++ LDA $0C4A, X : CMP #$01 : BEQ .collide - LDA $0C4A, X : CMP #$2C : BEQ .collide + CMP #$2C : BEQ .collide BRA .normal ; normal behavior with non-somaria +++ : LDA.l SpecialWeapons : CMP #$05 : BNE .normal + LDA $0C4A, X : CMP #$01 : BEQ .collide + CMP #$2C : BEQ .collide + CMP #$31 : BEQ .collide + BRA .normal ; normal behavior with non-canes .collide CLC RTL @@ -256,7 +275,10 @@ Utility_CheckHammerHelmasaurKingMask: Utility_CheckImpervious: LDA $0E20, X : CMP.b #$CB : BNE .normal .trinexx - LDA SpecialWeapons : CMP #$01 : BEQ + : CMP #$03 : BEQ + : CMP #$04 : BEQ + + LDA SpecialWeapons : CMP #$01 : BEQ + + CMP #$03 : BEQ + + CMP #$04 : BEQ + + CMP #$05 : BEQ + BRA .normal + LDA $0301 : AND.b #$0A : BNE .impervious ; impervious to hammer @@ -267,7 +289,10 @@ Utility_CheckImpervious: LDA $0E20, X : CMP.b #$CC : BEQ .sidenexx : CMP.b #$CD : BEQ .sidenexx LDA $0301 : AND.b #$0A : BEQ .not_impervious ; normal behavior if not hammer JSL Ganon_CheckHammerVulnerability : BCS .not_impervious - LDA SpecialWeapons : CMP #$01 : BEQ + : CMP #$03 : BEQ + : CMP #$04 : BEQ + + LDA SpecialWeapons : CMP #$01 : BEQ + + CMP #$03 : BEQ + + CMP #$04 : BEQ + + CMP #$05 : BEQ + BRA .not_impervious + LDA $0E20, X : CMP.b #$1E : BEQ .not_impervious ; crystal switch @@ -279,13 +304,19 @@ Utility_CheckImpervious: LDA #$01 : RTL .sidenexx LDA $0CAA, X : AND.b #$04 : BEQ .vulnerable - LDA SpecialWeapons : CMP #$01 : BEQ + : CMP #$03 : BEQ + : CMP #$04 : BEQ + + LDA SpecialWeapons : CMP #$01 : BEQ + + CMP #$03 : BEQ + + CMP #$04 : BEQ + + CMP #$05 : BEQ + BRA .not_impervious + LDA $0CF2 : CMP #$06 : !BLT .impervious ; swords are ineffective BRA .not_impervious .vulnerable - LDA SpecialWeapons : CMP #$01 : BEQ + : CMP #$03 : BEQ + : CMP #$04 : BEQ + + LDA SpecialWeapons : CMP #$01 : BEQ + + CMP #$03 : BEQ + + CMP #$04 : BEQ + + CMP #$05 : BEQ + BRA .not_impervious + LDA $0CF2 : CMP #$06 : !BGE .impervious ; non-swords are ineffective @@ -297,8 +328,9 @@ Utility_CheckImpervious: ;-------------------------------------------------------------------------------- AllowBombingMoldorm: LDA SpecialWeapons : CMP #$01 : BEQ .no_disable_projectiles - LDA SpecialWeapons : CMP #$03 : BEQ .no_disable_projectiles - LDA SpecialWeapons : CMP #$04 : BEQ .no_disable_projectiles + CMP #$03 : BEQ .no_disable_projectiles + CMP #$04 : BEQ .no_disable_projectiles + CMP #$05 : BEQ .no_disable_projectiles INC $0BA0, X .no_disable_projectiles JSL !SPRITE_INITIALIZED_SEGMENTED @@ -309,8 +341,9 @@ AllowBombingBarrier: LDA $0D00, X : !SUB.b #$0C : STA $0D00, X LDA $0E20, X : CMP #$40 : BNE .disable_projectiles LDA SpecialWeapons : CMP #$01 : BEQ .no_disable_projectiles - LDA SpecialWeapons : CMP #$03 : BEQ .no_disable_projectiles - LDA SpecialWeapons : CMP #$04 : BEQ .no_disable_projectiles + CMP #$03 : BEQ .no_disable_projectiles + CMP #$04 : BEQ .no_disable_projectiles + CMP #$05 : BEQ .no_disable_projectiles .disable_projectiles INC $0BA0, X .no_disable_projectiles @@ -334,8 +367,9 @@ DrawBombInMenu: ;-------------------------------------------------------------------------------- DrawSwordInMenu: LDA SpecialWeapons : AND.w #$00FF : CMP.w #$0001 : BEQ .specialSword - LDA SpecialWeapons : AND.w #$00FF : CMP.w #$0003 : BEQ .specialSword - LDA SpecialWeapons : AND.w #$00FF : CMP.w #$0004 : BEQ .specialSword + CMP.w #$0003 : BEQ .specialSword + CMP.w #$0004 : BEQ .specialSword + CMP.w #$0005 : BEQ .specialSword LDA $7EF359 : AND.w #$00FF : CMP.w #$00FF : BEQ .noSword .hasSword STA $02 diff --git a/swordswap.asm b/swordswap.asm index 9581276..6fe141a 100644 --- a/swordswap.asm +++ b/swordswap.asm @@ -64,6 +64,7 @@ LookupDamageLevel: CMP #$02 : BEQ .pseudo_table CMP #$03 : BEQ .bomb_table CMP #$04 : BEQ .bomb_table + CMP #$05 : BEQ .bomb_table %LookupDamageSubclass(Damage_Table) : RTL .bomb_table %LookupDamageSubclass(Damage_Table_Bombs) : RTL @@ -131,8 +132,9 @@ CheckTabletSword: LDA.b #$02 : RTL + LDA.l SpecialWeapons : CMP #$01 : BEQ .check_special - LDA.l SpecialWeapons : CMP #$03 : BEQ .check_special - LDA.l SpecialWeapons : CMP #$04 : BEQ .check_special + CMP #$03 : BEQ .check_special + CMP #$04 : BEQ .check_special + CMP #$05 : BEQ .check_special BRA .normal .check_special LDA !WEAPON_LEVEL : CMP #$02 : !BLT + ; check for master bombs diff --git a/tables.asm b/tables.asm index 79df259..900c56c 100644 --- a/tables.asm +++ b/tables.asm @@ -106,7 +106,7 @@ db #$00 ; #$00 = Default behavior (silver arrows) ;-------------------------------------------------------------------------------- org $30802F ; PC 0x18003F SpecialWeapons: -db #$00 ; #$00 = Off (default) - #$01 = Bomb-Only mode - #$02 = Pseudosword mode +db #$00 ; #$00 = Off (default) - #$01 = Bomb-Only mode - #$02 = Pseudosword mode - #$03 = Byrna-Only mode - #$04 = Somaria-Only mode - #$05 = Canes-Only mode ;-------------------------------------------------------------------------------- org $308030 ; PC 0x180030 EnableSRAMTrace: