;================================================================================
; RNG Fixes
;--------------------------------------------------------------------------------
RigDigRNG:
	LDA.l MiniGameTime+1 : CMP.l DiggingGameRNG : !BGE .forceHeart
	.normalItem
	JML GetRandomInt
	.forceHeart
	LDA.l MiniGameTime : BNE .normalItem
	LDA.b #$04
RTL
;--------------------------------------------------------------------------------
RigChestRNG:
	JSL DecrementChestCounter
	LDA.w $04C4 : CMP.l ChestGameRNG : BEQ .forceHeart
	.normalItem
	JSL GetRandomInt
	AND.b #$07 ; restrict values to 0-7
	CMP.b #$07 : BEQ .notHeart
	JSL DecrementItemCounter
RTL
	.forceHeart
	LDA.b #$33 : STA.b ScrapBufferBD+$0B ; assure the correct state if player talked to shopkeeper
	LDA.w RoomItemsTaken : AND.b #$40 : BNE .notHeart
	LDA.l ChestGameItem_Player : STA.l !MULTIWORLD_ITEM_PLAYER_ID
	LDA.b #$07 ; give prize item
RTL
	.notHeart
	JSL DecrementItemCounter
	
	JSL GetRandomInt ; spam RNG until we stop getting the prize item
	AND.b #$07 ; restrict values to 0-7
	CMP.b #$07 : BNE + ; player got prize item AGAIN
		LDA.b #$00 ; give them money instead
	+
RTL
;--------------------------------------------------------------------------------
FixChestCounterForChestGame:
	JSL DecrementItemCounter
	JML GetRandomInt
;--------------------------------------------------------------------------------
RNG_Lanmolas1:
	LDA.b #$00 : BRA _rng_done
RNG_Moldorm1:
	LDA.b #$01 : BRA _rng_done
RNG_Agahnim1:
	LDA.b RoomIndex : CMP.b #$20 : BNE RNG_Agahnim2 ; Agah 1 and 2 use the same code, check which agah we're fighting and branch
	LDA.b #$02
	JSL GetStaticRNG : PHA
	LDA.l GanonAgahRNG : BEQ + ; check if blue balls are disabled
		PLA
		ORA.b #$01 ; guarantee no blue ball
		RTL
	+
	PLA
	RTL
	
RNG_Helmasaur:
	LDA.b #$03 : BRA _rng_done
RNG_Arrghus:
	LDA.b #$04 : BRA _rng_done
RNG_Mothula:
	LDA.b #$05 : BRA _rng_done
RNG_Kholdstare:
	LDA.b #$06 : BRA _rng_done
RNG_Vitreous:
	LDA.b #$07 : BRA _rng_done
RNG_Trinexx:
	LDA.b #$08 : BRA _rng_done
RNG_Lanmolas2:;x
	LDA.b #$09 : BRA _rng_done
RNG_Moldorm2:;x
	LDA.b #$0A : BRA _rng_done
RNG_Agahnim2:
	LDA.b #$0B
	JSL GetStaticRNG : PHA
	LDA.l GanonAgahRNG : BEQ + ; check if blue balls are disabled
		PLA
		ORA.b #$01 ; guarantee no blue ball
		RTL
	+
	PLA
	RTL
RNG_Agahnim2Phantoms:;x
	LDA.b #$0C : BRA _rng_done
RNG_Ganon:
	LDA.b #$0D : BRA _rng_done
RNG_Ganon_Extra_Warp:
	LDA.b #$0E
	JSL GetStaticRNG : PHA
	LDA.l GanonAgahRNG : BEQ + ; check if warps are disabled
		PLA
		AND.b #$FE ; set least significant bit to 0 to prevent teleport
		RTL
	+
	PLA
	RTL
RNG_Enemy_Drops:
        LDA.l ProgressIndicator : CMP.b #$01 : BEQ + ; drops are static after uncle pickup & before rescuing zelda
                JML GetRandomInt
        +
                LDA.b #$0F
        _rng_done:
        JSL GetStaticRNG
RTL
;--------------------------------------------------------------------------------
; In: A = RNG Index
; Out: A = RNG Result
;--------------------------------------------------------------------------------
GetStaticRNG:
	PHX : PHP
	REP #$30 ; set 16-bit accumulator and index registers
	AND.w #$000F
	ASL : TAX : LDA.l RNGPointers, X : INC : AND.w #$03FF : STA.l RNGPointers, X : TAX ; increment pointer and move value to X
	LDA.l Static_RNG, X ; load RNG value
	PLP : PLX
RTL
;--------------------------------------------------------------------------------
InitRNGPointerTable:
	PHX : PHP
	REP #$30 ; set 16-bit accumulator & index registers
	LDX.w #$0000
	-
		LDA.l .rngDefaults, X : STA.l RNGPointers, X : INX #2
		LDA.l .rngDefaults, X : STA.l RNGPointers, X : INX #2
		LDA.l .rngDefaults, X : STA.l RNGPointers, X : INX #2
		LDA.l .rngDefaults, X : STA.l RNGPointers, X : INX #2
	CPX.w #$001F : !BLT -
	PLP : PLX
RTL
.rngDefaults
dw $0000 ; 00 = Lanmolas 1
dw $0040 ; 01 = Moldorm 1
dw $0080 ; 02 = Agahnim 1
dw $00C0 ; 03 = Helmasaur
dw $0100 ; 04 = Arrghus
dw $0140 ; 05 = Mothula
dw $0180 ; 06 = Kholdstare
dw $01C0 ; 07 = Vitreous
dw $0200 ; 08 = Trinexx
dw $0240 ; 09 = Lanmolas 2
dw $0280 ; 10 = Moldorm 2
dw $02C0 ; 11 = Agahnim 2
dw $0300 ; 12 = Agahnim 2 Phantoms
dw $0340 ; 13 = Ganon
dw $0380 ; 14 = Ganon Extra Warp
dw $03C0 ; 15 = Standard Escape Enemy Drops
;--------------------------------------------------------------------------------
