diff --git a/LTTP_RND_GeneralBugfixes.asm b/LTTP_RND_GeneralBugfixes.asm index 7fd6fef..7ad555d 100644 --- a/LTTP_RND_GeneralBugfixes.asm +++ b/LTTP_RND_GeneralBugfixes.asm @@ -185,6 +185,8 @@ incsrc textrenderer.asm incsrc crystalswitchbook.asm incsrc mimicdash.asm incsrc gloom.asm +incsrc special_weapons.asm +incsrc variable_ganon_vulnerability.asm warnpc $A58000 org $A28000 diff --git a/dialog.asm b/dialog.asm index 5cc89a2..a7559f9 100644 --- a/dialog.asm +++ b/dialog.asm @@ -284,28 +284,68 @@ RTL ; s = silver arrow bow ; p = 2nd progressive bow DialogGanon2: - JSL CheckGanonVulnerability + JSL CheckGanonVulnerability - REP #$20 - BCS + - LDA.w #$018D : BRA ++ - + - LDA.l BowTracking + REP #$20 + BCS + + LDA.w #$018D : JMP .done + + + LDA.l GanonVulnerabilityItem : AND.w #$00FF + BEQ .silver_arrows + CMP.w #$0001 : BEQ .silver_arrows + CMP.w #$0004 : BEQ .bombs + CMP.w #$0005 : BEQ .powder + CMP.w #$0010 : BEQ .bee - BIT.w #$0080 : BNE + ; branch if bow - LDA.w #$0192 : BRA ++ - + - BIT.w #$0040 : BEQ + ; branch if no silvers - LDA.w #$0195 : BRA ++ - + - BIT.w #$0020 : BNE + ; branch if p bow - LDA.w #$0194 : BRA ++ - + - LDA.w #$0193 : BRA ++ - ++ - STA.w TextID - SEP #$20 - JSL Sprite_ShowMessageMinimal_Alt + PHX : TAX + LDA.l EquipmentWRAM-1, X + PLX + AND.w #$00FF : BNE .have + BRA .dont_have + +.silver_arrows + LDA.l BowTracking + + BIT.w #$0080 : BEQ .dont_have ; no bow + BIT.w #$0040 : BNE .have ; have silvers + + BIT.w #$0020 : BNE + + LDA.w #$0194 : BRA .done ; have p bow ++ LDA.w #$0193 : BRA .done ; don't have p bow + +.dont_have + LDA.w #$0192 : BRA .done +.have + LDA.w #$0195 : BRA .done + +.bombs + LDA.l BombsEquipment : AND.w #$00FF : BNE .have + LDA.l InfiniteBombs : AND.w #$00FF : BNE .have + BRA .dont_have + +.powder + LDA.l InventoryTracking : BIT.w #$0010 : BNE .have + BRA .dont_have + +.bee + LDA.l BottleContentsOne : AND.w #$00FF + CMP.w #$0007 : BEQ .have + CMP.w #$0008 : BEQ .have + LDA.l BottleContentsTwo : AND.w #$00FF + CMP.w #$0007 : BEQ .have + CMP.w #$0008 : BEQ .have + LDA.l BottleContentsThree : AND.w #$00FF + CMP.w #$0007 : BEQ .have + CMP.w #$0008 : BEQ .have + LDA.l BottleContentsFour : AND.w #$00FF + CMP.w #$0007 : BEQ .have + CMP.w #$0008 : BEQ .have + BRA .dont_have + +.done + STA.w TextID + SEP #$20 + JSL Sprite_ShowMessageMinimal_Alt RTL ;-------------------------------------------------------------------------------- DialogEtherTablet: diff --git a/hooks.asm b/hooks.asm index a43db2a..0ea451f 100755 --- a/hooks.asm +++ b/hooks.asm @@ -2730,16 +2730,48 @@ NOP #2 ; this fixes Link's direction after mirroring and falling after entering org $81B5E6 LDA.b #$30 -;=================================================================================================== +;================================================================================ ;-------------------------------------------------------------------------------- ; Mimic dash changes ;-------------------------------------------------------------------------------- org $9EC7BE JSL MimicDirection -;=================================================================================================== +;================================================================================ ;-------------------------------------------------------------------------------- ; Gloom VRAM overwrite ;-------------------------------------------------------------------------------- org $828068 JSL AdjustDefaultGraphics + +;================================================================================ +; Special Weapons Modes +;-------------------------------------------------------------------------------- +org $86ECC3 ; Bank06.asm@4704 (PHX : TAX : LDA.l .damage_classes, X : PLX) +JSL DamageClassCalc +BRA + : NOP #29 : + +;-------------------------------------------------------------------------------- +org $86ED94 ; Bank06.asm@4866 (LDA $0E60, X : AND.b #$40) +JSL Utility_CheckImpervious +NOP +;-------------------------------------------------------------------------------- + +;================================================================================ +;-------------------------------------------------------------------------------- +; Variable Ganon Vulnerability +;-------------------------------------------------------------------------------- +org $88BBD4 ; ancilla_magic_powder.asm@253 (LDA #$0A : JSL Ancilla_CheckSpriteDamage.preset_class) +JSL Ganon_CheckPowderVulnerability +NOP #2 + +org $1D8F4E ; sprite_ganon.asm@325 (LDA $04C5 : CMP #$02) +JSL Ganon_CheckInvincible +NOP + +org $0DD628 ; Bank0D.asm@1266 (LDA $0B6B, Y : AND #$02) +JSL CheckBeeBoss +NOP + +org $0DD677 ; Bank0D.asm@1303 (JSL Ancilla_CheckSpriteDamage.preset_class) +JSL Ganon_CheckBeeVulnerability +;-------------------------------------------------------------------------------- diff --git a/special_weapons.asm b/special_weapons.asm new file mode 100644 index 0000000..da1847a --- /dev/null +++ b/special_weapons.asm @@ -0,0 +1,126 @@ +DamageClassCalc: + PHA + LDA.l GanonVulnerabilityItem : BEQ + + LDA.w SpriteTypeTable, X : CMP.b #$D7 : BNE + + PLA + JSL Ganon_CheckAncillaVulnerability + RTL ++ + LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$06 : BEQ .cane_immune + PLA + CMP.b #$01 : BEQ .red_cane + CMP.b #$2C : BEQ .red_cane + CMP.b #$31 : BEQ .blue_cane + CMP.b #$0C : BEQ .beam + BRA .not_cane_or_beam + +.red_cane + PHA + LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$04 : BEQ .special_cane + CMP.b #$05 : BEQ .special_cane + LDA.l SpecialWeapons : BIT.b #$80 : BNE .cane_immune + BRA .normal + +.blue_cane + PHA + LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$03 : BEQ .special_cane + CMP.b #$05 : BEQ .special_cane + LDA.l SpecialWeapons : BIT.b #$80 : BNE .cane_immune + BRA .normal + +.cane_immune + LDA.w SpriteTypeTable, X : CMP.b #$1E : BEQ .normal ; crystal switch + PLA + BRA .impervious + +.special_cane + PLA + LDA.w SpriteTypeTable, X : CMP.b #$D6 : BEQ .unstunned_ganon + CMP.b #$88 : BEQ .mothula + BRA .special_level + +.impervious + LDA.b #$FF + RTL + +.beam + PHA + LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$02 : BNE .normal + PLA + LDA.b #$05 + RTL + +.normal + PLA + +.not_cane_or_beam + CMP.b #$07 : BNE .no_change + LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$01 : BNE .normal_bombs + LDA.l SpecialWeaponLevel : BEQ .normal_bombs + LDA.w SpriteTypeTable, X : CMP.b #$D6 : BEQ .unstunned_ganon + CMP.b #$88 : BEQ .mothula + CMP.b #$91 : BEQ .stalfos_knight + CMP.b #$92 : BEQ .helmasaur_king + +.special_level + LDA.l SpecialWeaponLevel + BRA .done + +.mothula + LDA.l SpecialWeaponLevel + CMP.b #$04 : BCS .fix_mothula + BRA .done + +.fix_mothula + LDA.b #$03 + BRA .done + +.stalfos_knight + LDA.l StalfosBombDamage : BEQ .special_level + LDA.b #$08 + BRA .done + +.helmasaur_king + LDA.w $0DB0, X : CMP.b #$03 : BCS .special_level + LDA.b #$08 + BRA .done + +.unstunned_ganon + LDA.w $04C5 : CMP.b #$02 : BNE .impervious + LDA.w $0EE0, X : BNE .impervious + LDA.b #$34 : STA.w $0EE0, X ; give the poor pig some i-frames + BRA .special_level + +.normal_bombs + LDA.b #$07 + +.no_change + PHX : TAX + LDA.l $86EC84, X + PLX + CMP.b #$06 : BNE .done + LDA.l BowEquipment : CMP.b #$03 : BCS .actual_silver_arrows + +.normal_arrows + LDA.b #$06 + +.done + RTL + +.actual_silver_arrows + LDA.w SpriteTypeTable, X : CMP.b #$D7 : BNE + + LDA.b #$20 : STA.w SpriteTimerE, X ++ LDA.b #$09 + RTL +;-------------------------------------------------------------------------------- +Utility_CheckImpervious: + LDA.w SpriteControl, X : AND.b #$40 : BNE .impervious + LDA.w $0CF2 : CMP.b #$FF : BEQ .impervious + LDA.w UseY1 : AND.b #$0A : BEQ .not_impervious ; normal behavior if not hammering + JSL Ganon_CheckHammerVulnerability : BCS .not_impervious + +.not_impervious + LDA.b #$00 : RTL +.impervious + LDA.b #$01 : RTL +;-------------------------------------------------------------------------------- diff --git a/sram.asm b/sram.asm index 0a2df8a..de55c59 100644 --- a/sram.asm +++ b/sram.asm @@ -190,7 +190,9 @@ ItemLimitCounts: skip 16 ; Keeps track of limited non-progressive items s ; See: ItemSubstitutionRules in tables.asm ; Right now this is only used for three items but extra space is ; reserved -skip 37 ; Unused +skip 35 ; Unused +SpecialWeaponLevel: skip 1 ; keeps track of level in special weapon modes +ItemOnB: skip 1 ; NYI ProgressIndicator: skip 1 ; $00 = Pre-Uncle | $01 = Post-Uncle item | $02 = Zelda Rescued ; $03 = Agahnim 1 defeated ; $04 and above don't do anything. $00-$02 used in standard mode diff --git a/swordswap.asm b/swordswap.asm index da1539d..144c891 100644 --- a/swordswap.asm +++ b/swordswap.asm @@ -98,11 +98,20 @@ RTL ;================================================================================ CheckGanonHammerDamage: LDA.l HammerableGanon : BEQ + - LDA.w SpriteTypeTable, X : CMP.b #$D8 ; original behavior except ganon -RTL + LDA.w SpriteTypeTable, X : CMP.b #$D8 ; original behavior except ganon + RTL + + LDA.l GanonVulnerabilityItem : CMP.b #$0C : BEQ .hammer_silvers LDA.w SpriteTypeTable, X : CMP.b #$D6 ; original behavior -RTL + RTL + +.hammer_silvers + LDA.w SpriteTypeTable, X : CMP.b #$D8 : BCC + + RTL ++ CMP.b #$D6 : BNE + + RTL ++ CLC + RTL ;================================================================================ GetSmithSword: JSL ItemCheck_SmithSword : BEQ + : JML Smithy_AlreadyGotSword : + diff --git a/tables.asm b/tables.asm index 76152e1..33d5e89 100644 --- a/tables.asm +++ b/tables.asm @@ -103,9 +103,25 @@ ChallengeModes: ; d - damage modes (0 - normal, 1 - ohko, 2 - gloom) db $00 ;-------------------------------------------------------------------------------- -; 0x18002E (Reserved for Ganon Vulnerability Item) +org $B0802E +GanonVulnerabilityItem: +db $00 ; $00 = default behavior (silver arrows) ;-------------------------------------------------------------------------------- -; 0x18002F (Reserved for Special Weapons) +org $B0902F +SpecialWeapons: +db #$00 +; s - - - m m m m (bitfield) - NYI +; s - only swords damage can hurt enemies +; m - special weapon mode +; $00 = Off (default) +; $01 = Bomb mode +; $02 = Pseudosword +; $03 = Byrna mode +; $04 = Somaria mode +; $05 = Canes mode +; $06 = Bee mode +; $07 = Unused +; $08 = Bugnet mode ;-------------------------------------------------------------------------------- ; 0x180030 (Unused) ;-------------------------------------------------------------------------------- diff --git a/variable_ganon_vulnerability.asm b/variable_ganon_vulnerability.asm new file mode 100644 index 0000000..20acb5d --- /dev/null +++ b/variable_ganon_vulnerability.asm @@ -0,0 +1,130 @@ +Ganon_CheckAncillaVulnerability: + PHA + LDA.w $0EE0, X : BNE .not_vulnerable_pla + PLA + PHX : PHA + LDA.l GanonVulnerabilityItem + BMI .no_weakness + TAX : PLA + CMP.l Ganon_CheckByAncilla, X : BNE + + PLX : BRA .vulnerable ++ PLX : PHA + LDA.l GanonVulnerabilityItem + BEQ .silver_arrows + CMP.b #$01 : BEQ .silver_arrows + CMP.b #$11 : BEQ .somaria + BRA .not_vulnerable_pla + +.no_weakness + PLA : PLX + BRA .not_vulnerable + +.silver_arrows + PLA : CMP.b #$09 : BNE .not_vulnerable + LDA.l BowEquipment : CMP.b #$03 : BCS + + LDA.b #$09 : BRA .not_vulnerable ++ BRA .vulnerable + +.somaria + PLA + CMP.b #$01 : BEQ .vulnerable + CMP.b #$2C : BEQ .vulnerable + BRA .not_vulnerable + +.vulnerable + PHX + LDA.l GanonVulnerabilityItem + TAX + LDA.l Ganon_IFrameDuration, X + PLX + STA.w $0EE0, X ; give the poor pig some iframes + LDA.b #$20 : STA.w SpriteTimerE, X + LDA.b #$09 + RTL +.not_vulnerable_pla_pla + PLA +.not_vulnerable_pla + PLA +.not_vulnerable + PHX : TAX + LDA.l $86EC84, X + PLX + RTL +;-------------------------------------------------------------------------------- +Ganon_CheckPowderVulnerability: + LDA.l GanonVulnerabilityItem : CMP.b #$05 : BNE .normal + LDA.w SpriteTypeTable, X : CMP.b #$D7 : BNE .normal + LDA.w $0EE0, X : BNE .normal ; ganon has i-frames + LDA.l Ganon_IFrameDuration+$05 + STA.w $0EE0, X ; give ganon i-frames + LDA.b #$20 : STA.w SpriteTimerE, X + LDA.b #$09 + BRA .done + +.normal + LDA.b #$0A +.done + JML $86ECE6 +;-------------------------------------------------------------------------------- +Ganon_CheckBeeVulnerability: +; X is bee sprite index +; Y is target sprite index + LDA.l GanonVulnerabilityItem : CMP.b #$10 : BNE .normal + LDA.w SpriteTypeTable, Y : CMP.b #$D7 : BNE .normal + LDA.w $0EE0, Y : BNE .normal ; ganon has i-frames + LDA.l Ganon_IFrameDuration+$10 + STA.w $0EE0, X ; give ganon i-frames + LDA.b #$20 : STA.w SpriteTimerE, X + LDA.b #$09 + BRA .done + +.normal + LDA.b #$01 +.done + TYX + JML $86ECE6 +;-------------------------------------------------------------------------------- +Ganon_CheckInvincible: + LDA.w $04C5 : CMP.b #$02 : BEQ .not_transparent + LDA.w SpriteTypeTable, X : CMP.b #$D7 : BNE .transparent ; non-stunned ganon + LDA.w UseY1 : AND.b #$0A : BEQ .transparent ; normal behavior if not hammering + LDA.l GanonVulnerabilityItem : CMP.b #$0C : BNE .transparent +.not_transparent + LDA.b #$00 : RTL +.transparent + LDA.b #$01 : RTL +;-------------------------------------------------------------------------------- +Ganon_CheckHammerVulnerability: + LDA.l GanonVulnerabilityItem : CMP.b #$0C : BNE .normal + LDA.w SpriteTypeTable, X : CMP.b #$D7 : BNE .normal + LDA.w $0EE0, X : BNE .normal ; ganon has i-frames + LDA.l Ganon_IFrameDuration+$0C + STA.w $0EE0, X ; give ganon i-frames + LDA.b #$20 : STA.w SpriteTimerE, X + LDA.b #$09 : STA.w $0CF2 ; set damage class to silver + SEC : RTL +.normal + CLC : RTL +;-------------------------------------------------------------------------------- +CheckBeeBoss: +; Y is sprite index + LDA.l GanonVulnerabilityItem : CMP.b #$10 : BNE .normal + LDA.w SpriteTypeTable, Y : CMP.b #$D7 : BNE .normal + LDA.b #$00 : RTL +.normal + LDA.w $0B6B, Y : AND.b #$02 + RTL +;-------------------------------------------------------------------------------- +Ganon_CheckByAncilla: + db #$00 ; default behavior + db #$00, #$05, #$1F, #$07, #$00 + db #$02, #$0B, #$19, #$18, #$1C + db #$00, #$00, #$00, #$00, #$00 + db #$00, #$00, #$31, #$00, #$00 +Ganon_IFrameDuration: + db #$00 ; default behavior + db #$00, #$00, #$00, #$34, #$00 + db #$00, #$00, #$00, #$00, #$00 + db #$00, #$00, #$00, #$00, #$00 + db #$00, #$00, #$00, #$00, #$00 +;--------------------------------------------------------------------------------