Fix moldorm/somaria issue and add both-canes mode

This commit is contained in:
2021-12-22 00:28:27 -08:00
parent 6279f32fe3
commit 265089cedb
6 changed files with 88 additions and 27 deletions

View File

@@ -2748,6 +2748,10 @@ org $088DB1 ; Bank08.asm@1207 (PHY : PHX : TYX : ... )
JSL Utility_CheckAncillaOverlapWithSprite JSL Utility_CheckAncillaOverlapWithSprite
BRA + : NOP #7 : + 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) org $0882E8 ; Bank08.asm@456 (LDA $0DB0, Y : CMP.b #$03)
JSL Utility_CheckHelmasaurKingCollision JSL Utility_CheckHelmasaurKingCollision
NOP NOP

View File

@@ -557,6 +557,10 @@ AddInventory:
CPY.b #$B7 : !BGE + CPY.b #$B7 : !BGE +
JSR .incrementBombLevel JSR .incrementBombLevel
JMP .done JMP .done
+ CPY.b #$B7 : !BLT + ; Items $B7 - $BC - Cane Upgrades
CPY.b #$BD : !BGE +
JSR .incrementCaneLevel
JMP .done
+ +
.done .done
PLP : PLX : PLA PLP : PLX : PLA
@@ -630,6 +634,10 @@ RTS
JSR .stampSword ; update "first bomb" timestamp JSR .stampSword ; update "first bomb" timestamp
RTS RTS
.incrementCaneLevel
JSR .stampSword ; update "first cane" timestamp
RTS
.incrementShield .incrementShield
; CHECK FOR DUPLICATE SHIELDS ; CHECK FOR DUPLICATE SHIELDS
LDA $7EF422 : !ADD #$08 : AND #$18 : TAX LDA $7EF422 : !ADD #$08 : AND #$18 : TAX
@@ -729,6 +737,7 @@ RTL
LDA SpecialWeapons : CMP #$01 : BEQ + LDA SpecialWeapons : CMP #$01 : BEQ +
CMP #$03 : BEQ + CMP #$03 : BEQ +
CMP #$04 : BEQ + CMP #$04 : BEQ +
CMP #$05 : BEQ +
LDA $7EF359 : BRA ++ LDA $7EF359 : BRA ++
+ : LDA !WEAPON_LEVEL + : LDA !WEAPON_LEVEL
++ ++

View File

@@ -30,6 +30,7 @@ ItemDowngradeFixMain:
CPY.b #$29 : BEQ .isMushroom ; Mushroom CPY.b #$29 : BEQ .isMushroom ; Mushroom
CPY.b #$B1 : !BLT + : CPY.b #$B6 : !BLT .isBombUpgrade : + CPY.b #$B1 : !BLT + : CPY.b #$B6 : !BLT .isBombUpgrade : +
CPY.b #$B7 : !BLT + : CPY.b #$BC : !BLT .isCaneUpgrade : +
.done .done
STA [$00] ; thing we wrote over part 2 STA [$00] ; thing we wrote over part 2
@@ -82,5 +83,16 @@ JMP .done
JMP .done JMP .done
+ +
PLA 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 JMP .done
;================================================================================ ;================================================================================

View File

@@ -19,14 +19,16 @@ DamageClassCalc:
.red_cane .red_cane
PHA PHA
LDA SpecialWeapons : CMP #$01 : BEQ .cane_immune LDA SpecialWeapons : CMP #$01 : BEQ .cane_immune
LDA SpecialWeapons : CMP #$03 : BEQ .cane_immune CMP #$03 : BEQ .cane_immune
LDA SpecialWeapons : CMP #$04 : BEQ .special_cane CMP #$04 : BEQ .special_cane
CMP #$05 : BEQ .special_cane
BRA .normal BRA .normal
.blue_cane .blue_cane
PHA PHA
LDA SpecialWeapons : CMP #$01 : BEQ .cane_immune LDA SpecialWeapons : CMP #$01 : BEQ .cane_immune
LDA SpecialWeapons : CMP #$03 : BEQ .special_cane CMP #$03 : BEQ .special_cane
LDA SpecialWeapons : CMP #$04 : BEQ .cane_immune CMP #$04 : BEQ .cane_immune
CMP #$05 : BEQ .special_cane
BRA .normal BRA .normal
.cane_immune .cane_immune
LDA $0E20, X : CMP.b #$1E : BEQ .normal ; crystal switch LDA $0E20, X : CMP.b #$1E : BEQ .normal ; crystal switch
@@ -121,9 +123,6 @@ Utility_CheckAncillaOverlapWithSprite:
PLX : PLY PLX : PLY
JSL !UTILITY_CHECK_IF_HIT_BOXES_OVERLAP_LONG JSL !UTILITY_CHECK_IF_HIT_BOXES_OVERLAP_LONG
RTL RTL
.ignore_collision
CLC
RTL
.giant_moldorm .giant_moldorm
LDA $0E10, Y : BNE .ignore_collision ; Moldy can have little a I-Frames, as a treat LDA $0E10, Y : BNE .ignore_collision ; Moldy can have little a I-Frames, as a treat
LDA.l SpecialWeapons : CMP #$01 : BNE ++ LDA.l SpecialWeapons : CMP #$01 : BNE ++
@@ -132,26 +131,41 @@ Utility_CheckAncillaOverlapWithSprite:
++ : LDA.l SpecialWeapons : CMP #$03 : BNE ++ ++ : LDA.l SpecialWeapons : CMP #$03 : BNE ++
LDA $0C4A, X : CMP #$31 : BEQ .check_collision_moldorm LDA $0C4A, X : CMP #$31 : BEQ .check_collision_moldorm
BRA .ignore_collision ; don't collide with non-byrna 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 #$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 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 .check_collision_moldorm
JSR SetUpMoldormHitbox JSR SetUpMoldormHitbox
JSL !UTILITY_CHECK_IF_HIT_BOXES_OVERLAP_LONG JSL !UTILITY_CHECK_IF_HIT_BOXES_OVERLAP_LONG
RTL RTL
.ignore_collision
CLC
RTL
.trinexx .trinexx
LDA.l SpecialWeapons : CMP #$01 : BNE ++ LDA.l SpecialWeapons : CMP #$01 : BNE ++
LDA $0C4A, X : CMP #$07 : BEQ .check_collision_trinexx LDA $0C4A, X : CMP #$07 : BEQ .check_collision_trinexx
BRA .ignore_collision ; don't collide with non-bombs BRA .ignore_collision ; don't collide with non-bombs
++ : LDA.l SpecialWeapons : CMP #$03 : BNE ++ ++ : LDA.l SpecialWeapons : CMP #$03 : BNE ++
LDA $0C4A, X : CMP #$31 : BEQ .check_collision_trinexx LDA $0C4A, X : CMP #$31 : BEQ .check_collision_trinexx
BRA .ignore_collision ; don't collide with non-byrna JMP .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_trinexx 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 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 .check_collision_trinexx
JSR SetUpTrinexxHitbox JSR SetUpTrinexxHitbox
@@ -233,10 +247,15 @@ Utility_CheckHelmasaurKingCollision:
++ : LDA.l SpecialWeapons : CMP #$03 : BNE ++ ++ : LDA.l SpecialWeapons : CMP #$03 : BNE ++
LDA $0C4A, X : CMP #$31 : BEQ .collide LDA $0C4A, X : CMP #$31 : BEQ .collide
BRA .normal ; normal behavior with non-byrna 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 #$01 : BEQ .collide
LDA $0C4A, X : CMP #$2C : BEQ .collide CMP #$2C : BEQ .collide
BRA .normal ; normal behavior with non-somaria 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 .collide
CLC CLC
RTL RTL
@@ -256,7 +275,10 @@ Utility_CheckHammerHelmasaurKingMask:
Utility_CheckImpervious: Utility_CheckImpervious:
LDA $0E20, X : CMP.b #$CB : BNE .normal LDA $0E20, X : CMP.b #$CB : BNE .normal
.trinexx .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 BRA .normal
+ +
LDA $0301 : AND.b #$0A : BNE .impervious ; impervious to hammer 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 $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 LDA $0301 : AND.b #$0A : BEQ .not_impervious ; normal behavior if not hammer
JSL Ganon_CheckHammerVulnerability : BCS .not_impervious 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 BRA .not_impervious
+ +
LDA $0E20, X : CMP.b #$1E : BEQ .not_impervious ; crystal switch LDA $0E20, X : CMP.b #$1E : BEQ .not_impervious ; crystal switch
@@ -279,13 +304,19 @@ Utility_CheckImpervious:
LDA #$01 : RTL LDA #$01 : RTL
.sidenexx .sidenexx
LDA $0CAA, X : AND.b #$04 : BEQ .vulnerable 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 BRA .not_impervious
+ +
LDA $0CF2 : CMP #$06 : !BLT .impervious ; swords are ineffective LDA $0CF2 : CMP #$06 : !BLT .impervious ; swords are ineffective
BRA .not_impervious BRA .not_impervious
.vulnerable .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 BRA .not_impervious
+ +
LDA $0CF2 : CMP #$06 : !BGE .impervious ; non-swords are ineffective LDA $0CF2 : CMP #$06 : !BGE .impervious ; non-swords are ineffective
@@ -297,8 +328,9 @@ Utility_CheckImpervious:
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
AllowBombingMoldorm: AllowBombingMoldorm:
LDA SpecialWeapons : CMP #$01 : BEQ .no_disable_projectiles LDA SpecialWeapons : CMP #$01 : BEQ .no_disable_projectiles
LDA SpecialWeapons : CMP #$03 : BEQ .no_disable_projectiles CMP #$03 : BEQ .no_disable_projectiles
LDA SpecialWeapons : CMP #$04 : BEQ .no_disable_projectiles CMP #$04 : BEQ .no_disable_projectiles
CMP #$05 : BEQ .no_disable_projectiles
INC $0BA0, X INC $0BA0, X
.no_disable_projectiles .no_disable_projectiles
JSL !SPRITE_INITIALIZED_SEGMENTED JSL !SPRITE_INITIALIZED_SEGMENTED
@@ -309,8 +341,9 @@ AllowBombingBarrier:
LDA $0D00, X : !SUB.b #$0C : STA $0D00, X LDA $0D00, X : !SUB.b #$0C : STA $0D00, X
LDA $0E20, X : CMP #$40 : BNE .disable_projectiles LDA $0E20, X : CMP #$40 : BNE .disable_projectiles
LDA SpecialWeapons : CMP #$01 : BEQ .no_disable_projectiles LDA SpecialWeapons : CMP #$01 : BEQ .no_disable_projectiles
LDA SpecialWeapons : CMP #$03 : BEQ .no_disable_projectiles CMP #$03 : BEQ .no_disable_projectiles
LDA SpecialWeapons : CMP #$04 : BEQ .no_disable_projectiles CMP #$04 : BEQ .no_disable_projectiles
CMP #$05 : BEQ .no_disable_projectiles
.disable_projectiles .disable_projectiles
INC $0BA0, X INC $0BA0, X
.no_disable_projectiles .no_disable_projectiles
@@ -334,8 +367,9 @@ DrawBombInMenu:
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
DrawSwordInMenu: DrawSwordInMenu:
LDA SpecialWeapons : AND.w #$00FF : CMP.w #$0001 : BEQ .specialSword LDA SpecialWeapons : AND.w #$00FF : CMP.w #$0001 : BEQ .specialSword
LDA SpecialWeapons : AND.w #$00FF : CMP.w #$0003 : BEQ .specialSword CMP.w #$0003 : BEQ .specialSword
LDA SpecialWeapons : AND.w #$00FF : CMP.w #$0004 : BEQ .specialSword CMP.w #$0004 : BEQ .specialSword
CMP.w #$0005 : BEQ .specialSword
LDA $7EF359 : AND.w #$00FF : CMP.w #$00FF : BEQ .noSword LDA $7EF359 : AND.w #$00FF : CMP.w #$00FF : BEQ .noSword
.hasSword .hasSword
STA $02 STA $02

View File

@@ -64,6 +64,7 @@ LookupDamageLevel:
CMP #$02 : BEQ .pseudo_table CMP #$02 : BEQ .pseudo_table
CMP #$03 : BEQ .bomb_table CMP #$03 : BEQ .bomb_table
CMP #$04 : BEQ .bomb_table CMP #$04 : BEQ .bomb_table
CMP #$05 : BEQ .bomb_table
%LookupDamageSubclass(Damage_Table) : RTL %LookupDamageSubclass(Damage_Table) : RTL
.bomb_table .bomb_table
%LookupDamageSubclass(Damage_Table_Bombs) : RTL %LookupDamageSubclass(Damage_Table_Bombs) : RTL
@@ -131,8 +132,9 @@ CheckTabletSword:
LDA.b #$02 : RTL LDA.b #$02 : RTL
+ +
LDA.l SpecialWeapons : CMP #$01 : BEQ .check_special LDA.l SpecialWeapons : CMP #$01 : BEQ .check_special
LDA.l SpecialWeapons : CMP #$03 : BEQ .check_special CMP #$03 : BEQ .check_special
LDA.l SpecialWeapons : CMP #$04 : BEQ .check_special CMP #$04 : BEQ .check_special
CMP #$05 : BEQ .check_special
BRA .normal BRA .normal
.check_special .check_special
LDA !WEAPON_LEVEL : CMP #$02 : !BLT + ; check for master bombs LDA !WEAPON_LEVEL : CMP #$02 : !BLT + ; check for master bombs

View File

@@ -106,7 +106,7 @@ db #$00 ; #$00 = Default behavior (silver arrows)
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
org $30802F ; PC 0x18003F org $30802F ; PC 0x18003F
SpecialWeapons: 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 org $308030 ; PC 0x180030
EnableSRAMTrace: EnableSRAMTrace: