pokegold-spaceworld/engine/battle/core.asm
2020-09-22 16:06:05 -04:00

70 lines
1.3 KiB
NASM

INCLUDE "constants.asm"
SECTION "engine/battle/core.asm", ROMX
_BattleRandom:
; If the normal RNG is used in a link battle it'll desync.
; To circumvent this a shared PRNG is used instead.
; But if we're in a non-link battle we're safe to use it
ld a, [wLinkMode]
and a
jp z, Random
; The PRNG operates in streams of 10 values.
; Which value are we trying to pull?
push hl
push bc
ld a, [wLinkBattleRNCount]
ld c, a
ld b, $0
ld hl, wLinkBattleRNs
add hl, bc
inc a
ld [wLinkBattleRNCount], a
; If we haven't hit the end yet, we're good
cp 9 ; number of seeds, including the last one. see comment in pokecrystal
ld a, [hl]
pop bc
pop hl
ret c
; If we have, we have to generate new pseudorandom data
; Instead of having multiple PRNGs, ten seeds are used
push hl
push bc
push af
; Reset count to 0
xor a
ld [wLinkBattleRNCount], a
ld hl, wLinkBattleRNs
ld b, 9 ; number of seeds; in release, this was increased to 10
; Generate next number in the sequence for each seed
; a[n+1] = (a[n] * 5 + 1) % 256
.loop
; get last #
ld a, [hl]
; a * 5 + 1
ld c, a
add a
add a
add c
inc a
; update #
ld [hli], a
dec b
jr nz, .loop
; This has the side effect of pulling the last value first,
; then wrapping around. As a result
pop af
pop bc
pop hl
ret