diff --git a/LTTP_RND_GeneralBugfixes.asm b/LTTP_RND_GeneralBugfixes.asm index d6db661..bff389a 100644 --- a/LTTP_RND_GeneralBugfixes.asm +++ b/LTTP_RND_GeneralBugfixes.asm @@ -183,6 +183,7 @@ incsrc multiworld.asm incsrc textrenderer.asm incsrc crystalswitchbook.asm incsrc mimicdash.asm +incsrc souls.asm warnpc $A58000 org $A28000 diff --git a/enemizer/hooks.asm b/enemizer/hooks.asm index 189b01e..3bbb56a 100644 --- a/enemizer/hooks.asm +++ b/enemizer/hooks.asm @@ -14,4 +14,4 @@ incsrc hooks/damage_hooks.asm incsrc hooks/overworld_sprite_hooks.asm -incsrc hooks/underworld_sprite_hooks.asm \ No newline at end of file +incsrc hooks/underworld_sprite_hooks.asm diff --git a/enemizer/mimic_fixes.asm b/enemizer/mimic_fixes.asm index 76b5e98..6dbbb02 100644 --- a/enemizer/mimic_fixes.asm +++ b/enemizer/mimic_fixes.asm @@ -26,7 +26,7 @@ SpritePrep_Eyegore_become_mimic: ;JSL resetSprite_Mimic : NOP org $86ED9E ; Sprite_ApplyCalculatedDamage, skip high sprite id early exit -JSL IsItReallyAMimic : NOP +; JSL IsItReallyAMimic : NOP ; now hooked into from souls.asm org $86EDA6 ; Sprite_ApplyCalculatedDamage .not_absorbable JSL notItemSprite_Mimic @@ -108,4 +108,4 @@ notItemSprite_Mimic: .continue ; restore code REP #$20 : ASL #2 -RTL \ No newline at end of file +RTL diff --git a/hooks.asm b/hooks.asm index ad25e68..78e2378 100755 --- a/hooks.asm +++ b/hooks.asm @@ -2747,3 +2747,31 @@ LDA.b #$30 ;-------------------------------------------------------------------------------- org $9EC7BE JSL MimicDirection + +;=================================================================================================== +;-------------------------------------------------------------------------------- +; Boss souls changes +;-------------------------------------------------------------------------------- +org $8DB866 +JSL CheckBossSoul : BRA + : NOP #2 : + + +org $86ED9E +JSL CheckInvincibleFlag : NOP + +org $85DFFE +JSL SoulPaletteSet : BRA + : NOP #5 : + + +org $85DFB7 +JSL SoulPaletteApply : NOP #2 + +org $9E8086 +JSL HelmasaurPaletteFix : BRA + : NOP #2 : + + +org $9E838C +JSL HelmasaurHammerFix : NOP + +org $9DD884 +JSL MoldormPaletteFix_b : NOP + +org $9DDB2E +JSL MoldormPaletteFix_d : NOP diff --git a/owrando.asm b/owrando.asm index 3c0c022..cce3c04 100644 --- a/owrando.asm +++ b/owrando.asm @@ -1818,4 +1818,4 @@ db $18, $0A, $D8 ; yx:{ 0x180, 0x0A0 } db $18, $0F, $45 ; yx:{ 0x180, 0x0F0 } db $FF ; END org $89CA55 -dw Overworld_Sprites_Screen1A_2&$FFFF \ No newline at end of file +dw Overworld_Sprites_Screen1A_2&$FFFF diff --git a/ram.asm b/ram.asm index 79a0dfc..a4fddb4 100644 --- a/ram.asm +++ b/ram.asm @@ -687,7 +687,8 @@ MapTotalsWRAM: skip $10 ; / on boot for tracking. skip $20 ; Reserved for general dungeon tracking data. May have over ; allocated here. Feel free to reassign. MapCompassFlag: skip 2 ; Used to flag overworld map drawing. -skip $3E ; Unused +SpriteInvincibilityFlag: skip $10 ; Used for boss soul shuffle +skip $2E ; Unused skip $260 ; Unused DialogBuffer: skip $100 ; Dialog Buffer ; diff --git a/souls.asm b/souls.asm new file mode 100644 index 0000000..0f787ee --- /dev/null +++ b/souls.asm @@ -0,0 +1,152 @@ +;================================================================================ +; Boss Souls +;================================================================================ +SoulPaletteSet: + LDA.l SpriteInvincibilityFlag, X + BEQ .normal + LDA.b #$FF + STA.w $0CFE + RTL +.normal + CMP.b #$08 + BNE + + LDA.l $7FFA3C, X + STA.w $0CFE + + + RTL +;================================================================================ +SoulPaletteApply: + AND.w #$F1FF + PHA + LDA.w $0CFE + AND.w #$00FF + CMP.w #$00FF + BEQ .blackout +.ice + PLA + ORA.w #$0400 + RTL +.blackout + PLA + ORA.w #$0600 + RTL +;================================================================================ +HelmasaurPaletteFix: + LDA.w $0B89, X + AND.b #$F1 + PHA + LDA.l SpriteInvincibilityFlag, X + BEQ .normal +.blackout + PLA + ORA.b #$0A + STA.w $0B89, X + RTL +.normal + PLA + STA.w $0B89, X + RTL +;================================================================================ +HelmasaurHammerFix: + LDA.l SpriteInvincibilityFlag, X + BEQ .normal + LDA.b #$00 + RTL +.normal + LDA.w $0301 + AND.b #$0A + RTL +;================================================================================ +MoldormPaletteFix: +.b + LDA.b #$0B + BRA .apply +.d + LDA.b #$0D +.apply + PHA + LDA.l SpriteInvincibilityFlag, X + BEQ .normal + PLA + LDA.b #$07 + BRA .write +.normal + PLA +.write + STA.w $0F50, X + RTL +;================================================================================ +CheckInvincibleFlag: + LDA.l SpriteInvincibilityFlag, X + BEQ .normal + LDA.w $0E20, X + SEC + RTL +.normal + JML.l IsItReallyAMimic +;================================================================================ +CheckBossSoul: + PHA : PHX + LDA.b #$00 + STA.l SpriteInvincibilityFlag, X + ; check if boss id + LDX.b #.boss_ids_end-.boss_ids-1 + TYA + +- CMP.l .boss_ids, X + BEQ .match + + DEX + BPL - + +.normal + PLX : PLA + STA.w $0E60, X + AND.b #$0F + STA.w $0F50, X + RTL + +.match + ; X is boss index + + ; make palette black + LDA.b #$00 + LDX.b #$1D +- STA.l $7EC462, X + STA.l $7EC662, X + DEX + BPL - + LDA.b #$01 + STA.b $15 ; update palette + + PLX + LDA.b #$01 + STA.l SpriteInvincibilityFlag, X + + PLA + + ORA.b #$40 + STA.w $06E0, X + AND.b #$01 + ORA.b #$06 + STA.w $0F50, X + RTL + +.boss_ids: + db $53 ; armos + db $54 ; lanmolas + db $09 ; moldorm + db $92 ; helma king + db $8C ; arrghus + db $8D ; arrghus puff + db $88 ; mothula + db $CE ; blind + db $A2 ; khold + db $A3 ; khold shell + db $BD ; vitreous big eye + db $BE ; vitreous small eye + db $CB ; trinexx + db $CC ; trinexx + db $CD ; trinexx + db $7A ; agahnim +..end diff --git a/sram.asm b/sram.asm index 23fc67d..30c45c9 100644 --- a/sram.asm +++ b/sram.asm @@ -237,7 +237,9 @@ CompassCountDisplay: skip 2 ; Compass count display flags (bitfield) ; High Byte: x c e d a s p m ; x = Sewers | c = Hyrule Castle | e = Eastern Palace | d = Desert Palace ; a = Castle Tower | s = Swamp Palace | p = PoD | m = Mire -skip 10 ; +BossSoulMissing: skip 2 ; bitfield for boss soul acquisition + ; 0 = has soul, 1 = soul missing +skip 8 ; Aga2Duck: skip 1 ; Used in lieu of pyramid hole for checking if the duck should come ; 0 = Haven't called post-Aga 2 bird | 1 = Have called post-Aga 2 bird NpcFlags: skip 2 ; l - c s t k z o (bitfield)