GoalItemGanonCheck:
	LDA.w SpriteTypeTable, X : CMP.b #$D6 : BNE .success ; skip if not ganon
		JSL.l CheckGanonVulnerability
		BCS .success

		.fail
		LDA.w SpriteActivity, X : CMP.b #17 : !BLT .success ; decmial 17 because Acmlm's chart is decimal
		LDA.b #$00
RTL
		.success
		LDA.b OAMOffsetY : CMP.b #$80 ; thing we wrote over
RTL
;--------------------------------------------------------------------------------
;Carry clear = ganon invincible
;Carry set = ganon vulnerable
CheckGanonVulnerability:
	PHX
	LDA.l InvincibleGanon
	ASL
	TAX

	; Carry
	;  0 - invulnerable
	;  1 - vulnerable
	JSR (.goals, X)

	PLX
	RTL


.goals
	dw .vulnerable
	dw .invulnerable
	dw .all_dungeons
	dw .crystals_and_aga
	dw .crystals
	dw .goal_item
	dw .light_speed
	dw .crystals_and_bosses
	dw .bosses_only
	dw .all_dungeons_no_agahnim
	dw .all_items
	dw .completionist

; 00 = always vulnerable
.vulnerable
.success
	SEC
	RTS

; 01 = always invulnerable
.invulnerable
.fail
	CLC
	RTS

; 02 = All dungeons
.all_dungeons
	LDA.l ProgressIndicator : CMP.b #$03 : BCC .fail ; require post-aga world state

; 09 = All dungeons except agahnim
.all_dungeons_no_agahnim
	LDA.l PendantsField : AND.b #$07 : CMP.b #$07 : BNE .fail ; require all pendants
	LDA.l CrystalsField : AND.b #$7F : CMP.b #$7F : BNE .fail ; require all crystals
	LDA.l OverworldEventDataWRAM+$5B : AND.b #$20 : BEQ .fail ; require aga2 defeated (pyramid hole open)
	BRA .success

; 03 = crystals and aga 2
.crystals_and_aga
	LDA.l OverworldEventDataWRAM+$5B : AND.b #$20 : BEQ .fail ; check aga2 first then bleed in

; 04 = crystals only
.crystals
	JSL CheckEnoughCrystalsForGanon
	RTS

; 05 = require goal item
.goal_item
        REP #$20
	LDA.l GoalCounter : CMP.l GoalItemRequirement
        SEP #$20
	RTS

; 06 = light speed
.light_speed
	BRA .fail

; 07 = Crystals and bosses
.crystals_and_bosses
	JSL CheckEnoughCrystalsForGanon ; check crystals first then bleed in to next
	BCC .fail

; 08 = Crystal bosses but no crystals
.bosses_only
	JMP CheckForCrystalBossesDefeated

; 09 = 100% item collection rate
.all_items
        REP #$20
        LDA.l TotalItemCounter : CMP.l TotalItemCount
        SEP #$20
        RTS

; 0A = 100% item collection rate and all dungeons
.completionist
        REP #$20
        LDA.l TotalItemCounter : CMP.l TotalItemCount
        SEP #$20
        BCC .fail
        BRA .all_dungeons

;--------------------------------------------------------------------------------
GetRequiredCrystalsForTower:
	BEQ + : JSL.l BreakTowerSeal_ExecuteSparkles : + ; thing we wrote over
	LDA.l NumberOfCrystalsRequiredForTower : CMP.b #$00 : BNE + : JML.l Ancilla_BreakTowerSeal_stop_spawning_sparkles : +
	LDA.l NumberOfCrystalsRequiredForTower : CMP.b #$01 : BNE + : JML.l Ancilla_BreakTowerSeal_draw_single_crystal : +
	LDA.l NumberOfCrystalsRequiredForTower : DEC #2 : TAX
JML.l GetRequiredCrystalsForTower_continue
;--------------------------------------------------------------------------------
GetRequiredCrystalsInX:
	LDA.l NumberOfCrystalsRequiredForTower : CMP.b #$00 : BNE +
		TAX
		RTL
	+

	TXA

- 	CMP.l NumberOfCrystalsRequiredForTower : BCC +
	SBC.l NumberOfCrystalsRequiredForTower ; carry guaranteed set
	BRA -

	+ INC : CMP.l NumberOfCrystalsRequiredForTower : BNE +
		LDA.b #$08
	+ : DEC : TAX
RTL
;--------------------------------------------------------------------------------
CheckEnoughCrystalsForGanon:
	LDA.l CrystalCounter
	CMP.l NumberOfCrystalsRequiredForGanon
RTL
;--------------------------------------------------------------------------------
CheckEnoughCrystalsForTower:
	LDA.l CrystalCounter
	CMP.l NumberOfCrystalsRequiredForTower
RTL

;---------------------------------------------------------------------------------------------------
CheckAgaForPed:
	LDA.l InvincibleGanon
	CMP.b #$06 : BNE .vanilla

.light_speed
	LDA.l OverworldEventDataWRAM+$80 ; check ped flag
	AND.b #$40
	BEQ .force_blue_ball

.vanilla ; run vanilla check for phase
	LDA.w SpriteAux, X
	CMP.b #$02
	RTL

.force_blue_ball
	LDA.b #$01 : STA.w SpriteAuxTable, Y
	LDA.b #$20 : STA.w SpriteTimer, Y
	CLC ; skip the RNG check
	RTL

;---------------------------------------------------------------------------------------------------

KillGanon:
	STA.l ProgressIndicator ; vanilla game state stuff we overwrote

	LDA.l InvincibleGanon
	CMP.b #$06 : BNE .exit

.light_speed
	LDA.l OverworldEventDataWRAM+$5B : ORA.b #$20 : STA.l OverworldEventDataWRAM+$5B ; pyramid hole
	LDA.b #$08 : STA.l RoomDataWRAM[$00].high ; kill ganon
	LDA.b #$02 : STA.l MoonPearlEquipment ; pearl but invisible in menu

.exit
	RTL

;---------------------------------------------------------------------------------------------------

CheckForCrystalBossesDefeated:
	PHB : PHX : PHY

	LDA.b #CrystalPendantFlags_2>>16
	PHA : PLB

	REP #$30

	; count of number of bosses killed
	STZ.b Scrap00

	LDY.w #10

.next_check
	LDA.w CrystalPendantFlags_2-2,Y
	BIT.w #$0040
	BEQ ++

	TYA
	ASL
	TAX

	LDA.l DrawHUDDungeonItems_boss_room_ids-4,X
	TAX
	LDA.l RoomDataWRAM.l,X

	AND.w #$0800
	BEQ ++

	INC.b Scrap00

++	DEY
	BPL .next_check

	SEP #$30
	PLY : PLX : PLB

	LDA.b Scrap00 : CMP.l NumberOfCrystalsRequiredForGanon


	RTS

