pokecrystal-board/engine/events/lucky_number.asm
2023-09-30 19:12:57 +02:00

216 lines
3.1 KiB
NASM

CheckForLuckyNumberWinners:
xor a
ldh [hScriptVar], a
ld [wTempByteValue], a
ld a, [wPartyCount]
and a
ret z
ld d, a
ld hl, wPartyMon1ID
ld bc, wPartySpecies
.PartyLoop:
ld a, [bc]
inc bc
cp EGG
call nz, .CompareLuckyNumberToMonID
push bc
ld bc, PARTYMON_STRUCT_LENGTH
add hl, bc
pop bc
dec d
jr nz, .PartyLoop
ld a, BANK(sBox)
call OpenSRAM
ld a, [sBoxCount]
and a
jr z, .SkipOpenBox
ld d, a
ld hl, sBoxMon1ID
ld bc, sBoxSpecies
.OpenBoxLoop:
ld a, [bc]
inc bc
cp EGG
jr z, .SkipOpenBoxMon
call .CompareLuckyNumberToMonID
jr nc, .SkipOpenBoxMon
ld a, TRUE
ld [wTempByteValue], a
.SkipOpenBoxMon:
push bc
ld bc, BOXMON_STRUCT_LENGTH
add hl, bc
pop bc
dec d
jr nz, .OpenBoxLoop
.SkipOpenBox:
call CloseSRAM
ld c, $0
.BoxesLoop:
ld a, [wCurBox]
and $f
cp c
jr z, .SkipBox
ld hl, .BoxBankAddresses
ld b, 0
add hl, bc
add hl, bc
add hl, bc
ld a, [hli]
call OpenSRAM
ld a, [hli]
ld h, [hl]
ld l, a ; hl now contains the address of the loaded box in SRAM
ld a, [hl]
and a
jr z, .SkipBox ; no mons in this box
push bc
ld b, h
ld c, l
inc bc
ld de, sBoxMon1ID - sBox
add hl, de
ld d, a
.BoxNLoop:
ld a, [bc]
inc bc
cp EGG
jr z, .SkipBoxMon
call .CompareLuckyNumberToMonID ; sets hScriptVar and wCurPartySpecies appropriately
jr nc, .SkipBoxMon
ld a, TRUE
ld [wTempByteValue], a
.SkipBoxMon:
push bc
ld bc, BOXMON_STRUCT_LENGTH
add hl, bc
pop bc
dec d
jr nz, .BoxNLoop
pop bc
.SkipBox:
inc c
ld a, c
cp NUM_BOXES
jr c, .BoxesLoop
call CloseSRAM
ldh a, [hScriptVar]
and a
ret z ; found nothing
ld a, [wTempByteValue]
and a
push af
ld a, [wCurPartySpecies]
ld [wNamedObjectIndex], a
call GetPokemonName
ld hl, .LuckyNumberMatchPartyText
pop af
jr z, .print
ld hl, .LuckyNumberMatchPCText
.print
jp PrintText2bpp
.CompareLuckyNumberToMonID:
push bc
push de
push hl
ld d, h
ld e, l
ld hl, wMonIDDigitsBuffer
lb bc, PRINTNUM_LEADINGZEROS | 2, 5
call PrintNum
ld hl, wLuckyNumberDigitsBuffer
ld de, wLuckyIDNumber
lb bc, PRINTNUM_LEADINGZEROS | 2, 5
call PrintNum
ld b, 5
ld c, 0
ld hl, wLuckyNumberDigitsBuffer + 4
ld de, wMonIDDigitsBuffer + 4
.loop
ld a, [de]
cp [hl]
jr nz, .done
dec de
dec hl
inc c
dec b
jr nz, .loop
.done
pop hl
push hl
ld de, MON_SPECIES - MON_ID
add hl, de
ld a, [hl]
pop hl
pop de
push af
ld a, c
ld b, 1
cp 5
jr z, .okay
ld b, 2
cp 3
jr nc, .okay
ld b, 3
cp 2
jr nz, .nomatch
.okay
inc b
ldh a, [hScriptVar]
and a
jr z, .bettermatch
cp b
jr c, .nomatch
.bettermatch
dec b
ld a, b
ldh [hScriptVar], a
pop bc
ld a, b
ld [wCurPartySpecies], a
pop bc
scf
ret
.nomatch
pop bc
pop bc
and a
ret
.BoxBankAddresses:
table_width 3, CheckForLuckyNumberWinners.BoxBankAddresses
for n, 1, NUM_BOXES + 1
dba sBox{d:n}
endr
assert_table_length NUM_BOXES
.LuckyNumberMatchPartyText:
text_far _LuckyNumberMatchPartyText
text_end
.LuckyNumberMatchPCText:
text_far _LuckyNumberMatchPCText
text_end
PrintTodaysLuckyNumber:
ld hl, wStringBuffer3
ld de, wLuckyIDNumber
lb bc, PRINTNUM_LEADINGZEROS | 2, 5
call PrintNum
ld a, "@"
ld [wStringBuffer3 + 5], a
ret