Add variable ganon vulnerability mode
This commit is contained in:
@@ -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
|
||||
|
||||
80
dialog.asm
80
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:
|
||||
|
||||
36
hooks.asm
36
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
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
126
special_weapons.asm
Normal file
126
special_weapons.asm
Normal file
@@ -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
|
||||
;--------------------------------------------------------------------------------
|
||||
4
sram.asm
4
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
|
||||
|
||||
@@ -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 : +
|
||||
|
||||
20
tables.asm
20
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)
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
130
variable_ganon_vulnerability.asm
Normal file
130
variable_ganon_vulnerability.asm
Normal file
@@ -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
|
||||
;--------------------------------------------------------------------------------
|
||||
Reference in New Issue
Block a user