BeastsCheck: ; Check if the player owns all three legendary beasts. ; They must exist in either party or PC, and have the player's OT and ID. ; Return the result in hScriptVar. ld a, RAIKOU ldh [hScriptVar], a call CheckOwnMonAnywhere jr nc, .notexist ld a, ENTEI ldh [hScriptVar], a call CheckOwnMonAnywhere jr nc, .notexist ld a, SUICUNE ldh [hScriptVar], a call CheckOwnMonAnywhere jr nc, .notexist ; they exist ld a, 1 ldh [hScriptVar], a ret .notexist xor a ldh [hScriptVar], a ret MonCheck: ; Check if the player owns any Pokémon of the species in hScriptVar. ; Return the result in hScriptVar. call CheckOwnMonAnywhere jr c, .exists ; doesn't exist xor a ldh [hScriptVar], a ret .exists ld a, 1 ldh [hScriptVar], a ret CheckOwnMonAnywhere: ; Check if the player owns any monsters of the species in hScriptVar. ; It must exist in either party or PC, and have the player's OT and ID. ; If there are no monsters in the party, ; the player must not own any yet. ld a, [wPartyCount] and a ret z ; BUG: CheckOwnMon does not check the Day-Care (see docs/bugs_and_glitches.md) ld d, a ld e, 0 ld hl, wPartyMon1Species ld bc, wPartyMonOTs ; Run CheckOwnMon on each Pokémon in the party. .partymon call CheckOwnMon ret c push bc ld bc, PARTYMON_STRUCT_LENGTH add hl, bc pop bc call UpdateOTPointer dec d jr nz, .partymon ; Run CheckOwnMon on each Pokémon in the PC. ld a, BANK(sBoxCount) call OpenSRAM ld a, [sBoxCount] and a jr z, .boxes ld d, a ld hl, sBoxMon1Species ld bc, sBoxMonOTs .openboxmon call CheckOwnMon jr nc, .loop call CloseSRAM ret .loop push bc ld bc, BOXMON_STRUCT_LENGTH add hl, bc pop bc call UpdateOTPointer dec d jr nz, .openboxmon ; Run CheckOwnMon on each monster in the other 13 PC boxes. .boxes call CloseSRAM ld c, 0 .box ; Don't search the current box again. ld a, [wCurBox] and $f cp c jr z, .loopbox ; Load the box. ld hl, SearchBoxAddressTable 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 ; Number of monsters in the box ld a, [hl] and a jr z, .loopbox push bc push hl ld de, sBoxMons - sBoxCount add hl, de ld d, h ld e, l pop hl push de ld de, sBoxMonOTs - sBoxCount add hl, de ld b, h ld c, l pop hl ld d, a .boxmon call CheckOwnMon jr nc, .loopboxmon pop bc call CloseSRAM ret .loopboxmon push bc ld bc, BOXMON_STRUCT_LENGTH add hl, bc pop bc call UpdateOTPointer dec d jr nz, .boxmon pop bc .loopbox inc c ld a, c cp NUM_BOXES jr c, .box call CloseSRAM and a ret CheckOwnMon: ; Check if a Pokémon belongs to the player and is of a specific species. ; We compare the species we are looking for in [hScriptVar] to the species ; we have in [hl]. ; inputs: ; hl, pointer to PartyMonNSpecies ; bc, pointer to PartyMonNOT ; hScriptVar should contain the species we're looking for ; outputs: ; sets carry if monster matches species, ID, and OT name. push bc push hl push de ld d, b ld e, c ; check species ldh a, [hScriptVar] ld b, [hl] cp b jr nz, .notfound ; check ID number ld bc, MON_ID add hl, bc ld a, [wPlayerID] cp [hl] jr nz, .notfound inc hl ld a, [wPlayerID + 1] cp [hl] jr nz, .notfound ; check OT ld hl, wPlayerName ; BUG: CheckOwnMon only checks the first five letters of OT names (see docs/bugs_and_glitches.md) rept NAME_LENGTH_JAPANESE - 2 ld a, [de] cp [hl] jr nz, .notfound cp "@" jr z, .found inc hl inc de endr ld a, [de] cp [hl] jr z, .found .notfound pop de pop hl pop bc and a ret .found pop de pop hl pop bc scf ret SearchBoxAddressTable: table_width 3, SearchBoxAddressTable for n, 1, NUM_BOXES + 1 dba sBox{d:n} endr assert_table_length NUM_BOXES UpdateOTPointer: push hl ld hl, NAME_LENGTH add hl, bc ld b, h ld c, l pop hl ret