643 lines
18 KiB
NASM
643 lines
18 KiB
NASM
;--------------------------------------------------------------------------------
|
|
!ANCILLA_DAMAGE = "$06EC84"
|
|
; start with X = sprite index, A = ancilla type index
|
|
;--------------------------------------------------------------------------------
|
|
DamageClassCalc:
|
|
PHA
|
|
LDA GanonVulnerabilityItem : BEQ +
|
|
LDA $0E20, X : CMP #$D7 : BNE +
|
|
PLA
|
|
JSL Ganon_CheckAncillaVulnerability
|
|
RTL
|
|
+
|
|
LDA SpecialWeapons : CMP #$06 : BEQ .cane_immune ; only crystal switches in bee mode
|
|
PLA
|
|
CMP #$01 : BEQ .red_cane
|
|
CMP #$2C : BEQ .red_cane
|
|
CMP #$31 : BEQ .blue_cane
|
|
CMP #$0C : BEQ .beam
|
|
BRA .not_cane_or_beam
|
|
.red_cane
|
|
PHA
|
|
LDA SpecialWeapons : CMP #$01 : BEQ .cane_immune
|
|
CMP #$03 : BEQ .cane_immune
|
|
CMP #$04 : BEQ .special_cane
|
|
CMP #$05 : BEQ .special_cane
|
|
CMP #$08 : BEQ .cane_immune
|
|
BRA .normal
|
|
.blue_cane
|
|
PHA
|
|
LDA SpecialWeapons : CMP #$01 : BEQ .cane_immune
|
|
CMP #$03 : BEQ .special_cane
|
|
CMP #$04 : BEQ .cane_immune
|
|
CMP #$05 : BEQ .special_cane
|
|
CMP #$08 : BEQ .cane_immune
|
|
BRA .normal
|
|
.cane_immune
|
|
LDA $0E20, X : CMP.b #$1E : BEQ .normal ; crystal switch
|
|
PLA
|
|
BRA .impervious
|
|
.special_cane
|
|
PLA
|
|
LDA $0E20, X : CMP.b #$D6 : BEQ .unstunned_ganon
|
|
CMP.b #$88 : BEQ .mothula
|
|
BRA .special_level
|
|
.impervious
|
|
LDA #$FF
|
|
RTL
|
|
.beam
|
|
PHA
|
|
LDA SpecialWeapons : CMP #$02 : BNE .normal
|
|
PLA
|
|
LDA #$05
|
|
RTL
|
|
.normal
|
|
PLA
|
|
.not_cane_or_beam
|
|
CMP #$07 : BNE .no_change
|
|
LDA SpecialWeapons : CMP #$01 : BNE .normal_bombs
|
|
LDA SpecialWeaponLevel : BEQ .normal_bombs
|
|
LDA $0E20, X : CMP.b #$D6 : BEQ .unstunned_ganon
|
|
CMP.b #$D7 : BEQ .stunned_ganon
|
|
CMP.b #$88 : BEQ .mothula
|
|
CMP.b #$91 : BEQ .stalfos_knight
|
|
CMP.b #$92 : BEQ .helmasaur_king
|
|
.special_level
|
|
LDA SpecialWeaponLevel
|
|
BRA .done
|
|
.mothula
|
|
LDA SpecialWeaponLevel
|
|
CMP #$04 : !BGE .fix_mothula
|
|
BRA .done
|
|
.fix_mothula
|
|
LDA #$03
|
|
BRA .done
|
|
.stalfos_knight
|
|
LDA !StalfosBombDamage : BEQ .special_level
|
|
LDA #$08
|
|
BRA .done
|
|
.helmasaur_king
|
|
LDA $0DB0, X : CMP #$03 : !BGE .special_level
|
|
LDA #$08
|
|
BRA .done
|
|
.unstunned_ganon
|
|
LDA $04C5 : CMP.b #$02 : BNE .impervious
|
|
LDA $0EE0, X : BNE .impervious
|
|
LDA #$34 : STA $0EE0, X ; give the poor pig some iframes
|
|
BRA .special_level
|
|
.stunned_ganon
|
|
LDA $0EE0, X : BNE .impervious
|
|
LDA #$34 : STA $0EE0, X ; give the poor pig some iframes
|
|
LDA #$20 : STA $0F10, X ; knock ganon back or something? idk
|
|
LDA #$09
|
|
BRA .done
|
|
.normal_bombs
|
|
LDA #$07
|
|
.no_change
|
|
PHX : TAX
|
|
LDA.l !ANCILLA_DAMAGE, X
|
|
PLX
|
|
CMP.b #$06 : BNE .done ; not arrows
|
|
LDA BowEquipment : CMP.b #$03 : !BGE .actual_silver_arrows
|
|
.normal_arrows
|
|
LDA #$06
|
|
.done
|
|
RTL
|
|
.actual_silver_arrows
|
|
LDA $0E20, X : CMP.b #$D7 : BNE +
|
|
LDA SpecialWeapons : CMP #$01 : BEQ .normal_arrows
|
|
LDA #$20 : STA $0F10, X
|
|
+
|
|
LDA #$09
|
|
RTL
|
|
; end with X = sprite index, A = damage class
|
|
;--------------------------------------------------------------------------------
|
|
!SPRITE_SETUP_HIT_BOX_LONG = "$0683EA"
|
|
!UTILITY_CHECK_IF_HIT_BOXES_OVERLAP_LONG = "$0683E6"
|
|
; start with X = ancilla index, Y = sprite index
|
|
;--------------------------------------------------------------------------------
|
|
Utility_CheckAncillaOverlapWithSprite:
|
|
LDA $0E20, Y : CMP #$09 : BEQ .giant_moldorm
|
|
CMP #$CB : BEQ .trinexx
|
|
.not_giant_moldorm ; ordinary collision checking
|
|
PHY : PHX
|
|
TYX
|
|
JSL !SPRITE_SETUP_HIT_BOX_LONG
|
|
PLX : PLY
|
|
JSL !UTILITY_CHECK_IF_HIT_BOXES_OVERLAP_LONG
|
|
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 ++
|
|
LDA $0C4A, X : CMP #$07 : BEQ .check_collision_moldorm
|
|
BRA .ignore_collision ; don't collide with non-bombs
|
|
++ : 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 ++
|
|
LDA $0C4A, X : CMP #$01 : 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
|
|
JMP .ignore_collision ; don't collide with non-byrna
|
|
++ : LDA.l SpecialWeapons : CMP #$04 : BNE ++
|
|
LDA $0C4A, X : CMP #$01 : 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
|
|
JSL !UTILITY_CHECK_IF_HIT_BOXES_OVERLAP_LONG
|
|
RTL
|
|
; returns carry clear if there was no overlap
|
|
;--------------------------------------------------------------------------------
|
|
SetUpTrinexxHitbox:
|
|
; rearrange trinexx's hitbox to be her middle instead of her head
|
|
LDA $0CAA, Y : PHA
|
|
LDA $0E60, Y : PHA
|
|
LDA $0D10, Y : PHA
|
|
LDA $0D30, Y : PHA
|
|
LDA $0D00, Y : PHA
|
|
LDA $0D20, Y : PHA
|
|
|
|
LDA #$80 : STA $0CAA, Y
|
|
|
|
PHX
|
|
LDA $0E80, Y : !SUB.l $1DAF28 : AND.b #$7F : TAX
|
|
|
|
LDA $7FFC00, X : STA $0D10, Y
|
|
LDA $7FFC80, X : STA $0D30, Y
|
|
LDA $7FFD00, X : STA $0D00, Y
|
|
LDA $7FFD80, X : STA $0D20, Y
|
|
|
|
TYX
|
|
STZ $0E60, X
|
|
|
|
JSL !SPRITE_SETUP_HIT_BOX_LONG
|
|
PLX
|
|
|
|
PLA : STA $0D20, Y
|
|
PLA : STA $0D00, Y
|
|
PLA : STA $0D30, Y
|
|
PLA : STA $0D10, Y
|
|
PLA : STA $0E60, Y
|
|
PLA : STA $0CAA, Y
|
|
RTS
|
|
;--------------------------------------------------------------------------------
|
|
SetUpMoldormHitbox:
|
|
; rearrange moldorm's hitbox to be his tail instead of his head
|
|
LDA $0D90, Y : PHA
|
|
LDA $0F60, Y : PHA
|
|
LDA $0D10, Y : PHA
|
|
LDA $0D30, Y : PHA
|
|
LDA $0D00, Y : PHA
|
|
LDA $0D20, Y : PHA
|
|
|
|
PHY : PHX
|
|
LDA $0E80, Y : !SUB.b #$30 : AND.b #$7F : TAX
|
|
|
|
LDA $7FFC00, X : STA $0D10, Y
|
|
LDA $7FFC80, X : STA $0D30, Y
|
|
LDA $7FFD00, X : STA $0D00, Y
|
|
LDA $7FFD80, X : STA $0D20, Y
|
|
LDA #$01 : STA $09D0, Y
|
|
|
|
TYX
|
|
STZ $0F60, X
|
|
|
|
JSL !SPRITE_SETUP_HIT_BOX_LONG
|
|
|
|
PLX : PLY
|
|
|
|
PLA : STA $0D20, Y
|
|
PLA : STA $0D00, Y
|
|
PLA : STA $0D30, Y
|
|
PLA : STA $0D10, Y
|
|
PLA : STA $0F60, Y
|
|
PLA : STA $0D90, Y
|
|
RTS
|
|
;--------------------------------------------------------------------------------
|
|
; start with X = ancilla index, Y = sprite index
|
|
Utility_CheckHelmasaurKingCollision:
|
|
LDA.l SpecialWeapons : CMP #$01 : BNE ++
|
|
LDA $0C4A, X : CMP #$07 : BEQ .collide
|
|
BRA .normal ; normal behavior with non-bombs
|
|
++ : 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 ++
|
|
LDA $0C4A, X : CMP #$01 : 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
|
|
.normal
|
|
LDA $0DB0, Y : CMP.b #$03
|
|
RTL
|
|
; returns carry set if there is collision immunity
|
|
;--------------------------------------------------------------------------------
|
|
Utility_CheckHammerHelmasaurKingMask:
|
|
LDA.l SpecialWeapons : CMP #$01 : BEQ .no_effect
|
|
LDA $0301 : AND #$0A
|
|
RTL
|
|
.no_effect
|
|
LDA #$00
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
Utility_CheckImpervious:
|
|
LDA $0E20, X : CMP.b #$CB : BNE .normal
|
|
.trinexx
|
|
LDA SpecialWeapons : CMP #$01 : BEQ +
|
|
CMP #$03 : BEQ +
|
|
CMP #$04 : BEQ +
|
|
CMP #$05 : BEQ +
|
|
CMP #$06 : BEQ .check_sidenexx
|
|
CMP #$08 : BEQ +
|
|
BRA .normal
|
|
+
|
|
LDA $0301 : AND.b #$0A : BNE .impervious ; impervious to hammer
|
|
.check_sidenexx
|
|
LDA.w $0DD1 : ORA.w $0DD2 : BNE .impervious ; at least one sidenexx alive
|
|
LDA.w $0D80, X : CMP.b #$02 : BCS .impervious ; at least one sidenexx alive
|
|
BRA .not_impervious
|
|
.normal
|
|
LDA $0E60, X : AND.b #$40 : BNE .impervious
|
|
LDA $0CF2 : CMP #$FF : BEQ .impervious ; special "always-impervious" class
|
|
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 +
|
|
CMP #$05 : BEQ +
|
|
CMP #$08 : BEQ +
|
|
BRA .not_impervious
|
|
+
|
|
LDA $0E20, X : CMP.b #$1E : BEQ .not_impervious ; crystal switch
|
|
CMP.b #$40 : BEQ .not_impervious ; aga barrier
|
|
BRA .impervious
|
|
.not_impervious
|
|
LDA #$00 : RTL
|
|
.impervious
|
|
LDA #$01 : RTL
|
|
.sidenexx
|
|
LDA $0CAA, X : AND.b #$04 : BEQ .vulnerable
|
|
LDA SpecialWeapons : CMP #$01 : BEQ +
|
|
CMP #$03 : BEQ +
|
|
CMP #$04 : BEQ +
|
|
CMP #$05 : BEQ +
|
|
CMP #$08 : 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 +
|
|
CMP #$05 : BEQ +
|
|
CMP #$08 : BEQ +
|
|
BRA .not_impervious
|
|
+
|
|
LDA $0CF2 : CMP #$06 : !BGE .impervious ; non-swords are ineffective
|
|
BRA .not_impervious
|
|
; returns nonzero A if impervious
|
|
;--------------------------------------------------------------------------------
|
|
!SPRITE_INITIALIZED_SEGMENTED = "$1DD6D1"
|
|
; start with X = sprite index
|
|
;--------------------------------------------------------------------------------
|
|
AllowBombingMoldorm:
|
|
LDA SpecialWeapons : CMP #$01 : BEQ .no_disable_projectiles
|
|
CMP #$03 : BEQ .no_disable_projectiles
|
|
CMP #$04 : BEQ .no_disable_projectiles
|
|
CMP #$05 : BEQ .no_disable_projectiles
|
|
CMP #$06 : BEQ .no_disable_projectiles
|
|
INC $0BA0, X
|
|
.no_disable_projectiles
|
|
JSL !SPRITE_INITIALIZED_SEGMENTED
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
AllowBombingBarrier:
|
|
; what we wrote over
|
|
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
|
|
CMP #$03 : BEQ .no_disable_projectiles
|
|
CMP #$04 : BEQ .no_disable_projectiles
|
|
CMP #$05 : BEQ .no_disable_projectiles
|
|
CMP #$06 : BEQ .no_disable_projectiles
|
|
.disable_projectiles
|
|
INC $0BA0, X
|
|
.no_disable_projectiles
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
DrawBombInMenu:
|
|
JSL LoadBombCount16 : AND.w #$00FF : BEQ .noBombs
|
|
LDA SpecialWeapons : AND.w #$00FF : CMP.w #$0001 : BNE .vanillaBombs
|
|
LDA.l SpecialWeaponLevel : AND.w #$00FF : BEQ .noBombs : STA $02
|
|
LDA.w #$FC81 : STA $04
|
|
BRA .done
|
|
.vanillaBombs
|
|
LDA.w #$0001 : STA $02
|
|
LDA.w #$F699 : STA $04
|
|
BRA .done
|
|
.noBombs
|
|
LDA.w #$0000 : STA $02
|
|
LDA.w #$F699 : STA $04
|
|
.done
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
DrawSwordInMenu:
|
|
LDA SpecialWeapons : AND.w #$00FF : CMP.w #$0001 : BEQ .specialSword
|
|
CMP.w #$0003 : BEQ .specialSword
|
|
CMP.w #$0004 : BEQ .specialSword
|
|
CMP.w #$0005 : BEQ .specialSword
|
|
CMP.w #$0008 : BEQ .specialSword
|
|
LDA SwordEquipment : AND.w #$00FF : CMP.w #$00FF : BEQ .noSword
|
|
.hasSword
|
|
STA $02
|
|
LDA.w #$F859 : STA $04
|
|
RTL
|
|
.noSword
|
|
LDA.w #$0000 : STA $02
|
|
LDA.w #$F859 : STA $04
|
|
RTL
|
|
.specialSword
|
|
LDA SpecialWeaponLevel : AND.w #$00FF : STA $02
|
|
LDA.w #$FC51 : STA $04
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
DrawBombInYBox:
|
|
CPX.w #$0004 : BNE .done
|
|
LDA SpecialWeapons : AND.w #$00FF : CMP.w #$0001 : BNE .vanilla
|
|
LDA SpecialWeaponLevel : AND.w #$00FF : CLC : ADC.w #$00BD : BRA .done
|
|
.vanilla
|
|
LDA.w #$0001
|
|
.done
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
BombIcon:
|
|
dw $207F, $207F, $3C88, $3C89, $2C88, $2C89, $2488, $2489, $2888, $2889,$2888, $2889
|
|
DrawBombOnHud:
|
|
PHB
|
|
LDA.w #$0149
|
|
LDX.w #$86B0
|
|
LDY.w #$C700
|
|
MVN $7E, $21
|
|
PLB
|
|
|
|
LDA.l SpecialWeapons : AND.w #$00FF : CMP.w #$0001 : BNE .regularBombs
|
|
LDA.l SpecialWeaponLevel : AND.w #$00FF : ASL #2 : TAX
|
|
LDA.l BombIcon, X : STA.l $7EC71A
|
|
LDA.l BombIcon+2, X : STA.l $7EC71C
|
|
.regularBombs
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
BombSpriteColor:
|
|
db $04, $08, $04, $02, $0A, $0A
|
|
SetBombSpriteColor:
|
|
LDA.l SpecialWeapons : CMP.b #$01 : BNE .normal
|
|
PHX
|
|
LDA.l SpecialWeaponLevel
|
|
TAX
|
|
LDA.l BombSpriteColor, X
|
|
STA $0B
|
|
PLX
|
|
RTL
|
|
.normal
|
|
LDA #$04 : STA $0B
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
StoreSwordDamage:
|
|
LDA.l SpecialWeapons : CMP #$02 : BEQ +
|
|
LDA.l $06ED39, X : RTL
|
|
+
|
|
LDA #$05
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
BeeDamageClass:
|
|
db $FF
|
|
db $06, $00, $07, $08, $0A
|
|
db $0B, $0C, $0D, $0E, $0F
|
|
db $FF, $03, $FF, $FF, $FF
|
|
db $FF, $01, $01, $FF, $FF
|
|
;--------------------------------------------------------------------------------
|
|
CheckDetonateBomb:
|
|
LDA.l SpecialWeapons : CMP.b #$01 : BNE .not_bomb_mode
|
|
.detonate_bombs
|
|
LDX.b #09
|
|
.check_ancilla
|
|
LDA.w $0C4A, X
|
|
CMP.b #$07
|
|
BNE .next_ancilla
|
|
LDA.b #03
|
|
STA.w $039F, X
|
|
.next_ancilla
|
|
DEX
|
|
BPL .check_ancilla
|
|
BRA .done
|
|
.not_bomb_mode
|
|
LDA.l SpecialWeapons : CMP.b #$06 : BEQ .release_bee
|
|
CMP.b #$07 : BEQ .hammer
|
|
BRA .done
|
|
.hammer
|
|
LDA.l HammerEquipment : BEQ .done
|
|
LDA.b $3A : ORA.b #$40 : STA.b $3A
|
|
LDA.b #$04 : STA.w $0304
|
|
JSL Link_UseHammerLong
|
|
BRA .done
|
|
.release_bee
|
|
LDX.w $0202
|
|
LDA.l BeeDamageClass, X : CMP.b #$FF : BEQ .nope
|
|
JSL $1EDCC9
|
|
BMI .nope
|
|
LDX.w $0202
|
|
LDA.l BeeDamageClass, X
|
|
CMP.b #$06 : BNE .set_bee_class
|
|
LDA.l $7EF340 : CMP.b #$03 : !BGE .silver_arrows
|
|
LDA.b #$06
|
|
BRA .set_bee_class
|
|
.silver_arrows
|
|
LDA.b #$09
|
|
.set_bee_class
|
|
STA.w $0ED0, Y
|
|
BRA .done
|
|
.nope
|
|
LDA.b #$3C
|
|
STA.w $0CF8
|
|
JSL $0DBB67
|
|
ORA.w $0CF8
|
|
STA.w $012E
|
|
.done
|
|
; what we wrote over
|
|
LDA.b #$80
|
|
TSB.b $3A
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
SetBeeType:
|
|
LDA.l SpecialWeapons : CMP.b #$06 : BEQ .bee_mode
|
|
LDX.w $0202
|
|
.check_bee_type
|
|
LDA.l $7EF33F, X
|
|
TAX
|
|
LDA.l $7EF35B, X
|
|
CMP.b #$08
|
|
BNE .regular_bee
|
|
LDA.b #$01
|
|
STA.w $0EB0, Y
|
|
.regular_bee
|
|
LDA.b #$01
|
|
STA.w $0ED0, Y
|
|
RTL
|
|
.bee_mode
|
|
LDX.w $0202
|
|
CPX.b #$10 : BEQ .check_bee_type
|
|
BRA .regular_bee
|
|
;--------------------------------------------------------------------------------
|
|
ArrghusBoing:
|
|
LDA.l SpecialWeapons : CMP.b #$06 : BNE .done
|
|
LDA.w $0F60, X : AND.b #$BF : STA.w $0F60, X
|
|
.done
|
|
; what we wrote over
|
|
LDA.b #$03
|
|
STA.w $0D80, X
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
BeeCheckTarget:
|
|
CPY.w $0FA0
|
|
BEQ .unsuitable_target
|
|
|
|
LDA.w $0DD0,Y
|
|
CMP.b #$09
|
|
BCC .unsuitable_target
|
|
|
|
LDA.w $0F00,Y
|
|
BNE .unsuitable_target
|
|
|
|
; in bee-mode skip targets that the bee can't hurt
|
|
LDA.l SpecialWeapons : CMP.b #$06 : BNE +
|
|
JSR BeeCheckDamage
|
|
CMP.b #$00 : BEQ .unsuitable_target
|
|
+
|
|
|
|
LDA.w $0E40,Y
|
|
BMI .potential_target
|
|
|
|
LDA.w $0F20,Y
|
|
CMP.w $0F20,X
|
|
BNE .unsuitable_target
|
|
|
|
LDA.w $0F60,Y
|
|
AND.b #$40
|
|
BEQ +
|
|
LDA.l SpecialWeapons : CMP.b #$06 : BNE .unsuitable_target
|
|
; in bee mode, allow targetting anti-fairies, bunny beams, and keese
|
|
LDA.w $0E20,Y
|
|
CMP.b #$15 : BEQ + ; anti-fairy
|
|
CMP.b #$6F : BEQ + ; keese
|
|
CMP.b #$D1 : BEQ + ; bunny beam
|
|
BRA .unsuitable_target
|
|
+
|
|
|
|
LDA.w $0BA0,Y
|
|
BEQ .valid_target
|
|
BRA .unsuitable_target
|
|
|
|
.potential_target
|
|
LDA.w $0EB0,X
|
|
BEQ .unsuitable_target
|
|
|
|
LDA.w $0CD2,Y
|
|
AND.b #$40
|
|
BNE .valid_target
|
|
|
|
.unsuitable_target
|
|
CLC : RTL
|
|
|
|
.valid_target
|
|
SEC : RTL
|
|
;--------------------------------------------------------------------------------
|
|
BeeCheckDamage:
|
|
PHX : PHP
|
|
REP #$20
|
|
LDA.w $0E20,Y : AND.w #$00FF
|
|
ASL #4
|
|
SEP #$20
|
|
ORA.w $0ED0,X
|
|
REP #$30
|
|
TAX
|
|
SEP #$20
|
|
JSL LookupDamageLevel
|
|
SEP #$10
|
|
PLP : PLX
|
|
RTS
|
|
;--------------------------------------------------------------------------------
|
|
NoSwingHammerB:
|
|
LDA.l SpecialWeapons : CMP.b #$07 : BNE .normal
|
|
LDA.l HammerEquipment : BEQ .normal
|
|
SEC : RTL
|
|
.normal ; what we wrote over
|
|
INC.b $3C
|
|
LDA.b $3C
|
|
CMP.b #$09
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
CheckBugNet:
|
|
LDA.w $037A : AND.b #$10 : BEQ .done ; normal behavior if not bugnet
|
|
LDA.l SpecialWeapons : CMP.b #$08 : BNE .return_10 ; normal behavior if not bugnet mode
|
|
.bugnet_mode
|
|
LDA.w $0E20, X : CMP.b #$E3 : BEQ .return_10 ; normal behavior if fairy
|
|
CMP.b #$79 : BEQ .return_10 ; normal behavior if bee
|
|
CMP.b #$B2 : BEQ .return_10 ; normal behavior if bee
|
|
LDA.b #$00 : BRA .done
|
|
.return_10
|
|
LDA.b #$10
|
|
.done
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|
|
SetHammerClass:
|
|
LDA.l SpecialWeapons : CMP.b #$08 : BNE .normal ; normal behavior if not bugnet mode
|
|
LDA.w $037A : AND.b #$10 : BEQ .normal ; normal behavior if not bugnet
|
|
LDA.l SpecialWeaponLevel : STA.w $0CF2
|
|
RTL
|
|
.normal
|
|
LDA.w $0301
|
|
AND.b #$0A
|
|
BEQ .not_hammer
|
|
LDA.b #$03
|
|
STA.w $0CF2
|
|
.not_hammer
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|