Files
alttpr-baserom/rngfixes.asm
cassidoxa 788cceaab9 Continue labeling and documentation in ram.asm, main rando block
Deleted several unused modules and some commented code
Reorganized some routines to clean up modules
Moved some memory into mirrored WRAM
Refactored NMI hook aux routine
Removed old fake flipper fix
2022-11-16 21:38:28 -05:00

149 lines
4.1 KiB
NASM

;================================================================================
; RNG Fixes
;--------------------------------------------------------------------------------
RigDigRNG:
LDA.l $7FFE01 : CMP.l DiggingGameRNG : !BGE .forceHeart
.normalItem
JML GetRandomInt
.forceHeart
LDA.l $7FFE00 : BNE .normalItem
LDA.b #$04
RTL
;--------------------------------------------------------------------------------
RigChestRNG:
JSL.l 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.l DecrementItemCounter
RTL
.forceHeart
LDA.b #$33 : STA.b $C8 ; assure the correct state if player talked to shopkeeper
LDA.w $0403 : AND.b #$40 : BNE .notHeart
LDA.b #$07 ; give prize item
RTL
.notHeart
JSL.l 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.l DecrementItemCounter
JSL.l $0DBA71
RTL
;--------------------------------------------------------------------------------
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.l 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.l 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.l 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.l 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
;--------------------------------------------------------------------------------