ref: b764a3a84d836768c385e9131ab458e0edfe0716
dir: /engine/pokemon/search_owned.asm/
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 wScriptVar. ld a, RAIKOU ld [wScriptVar], a call CheckOwnMonAnywhere jr nc, .notexist ld a, ENTEI ld [wScriptVar], a call CheckOwnMonAnywhere jr nc, .notexist ld a, SUICUNE ld [wScriptVar], a call CheckOwnMonAnywhere jr nc, .notexist ; they exist ld a, 1 ld [wScriptVar], a ret .notexist xor a ld [wScriptVar], a ret MonCheck: ; Check if the player owns any Pokémon of the species in wScriptVar. ; Return the result in wScriptVar. call CheckOwnMonAnywhere jr c, .exists ; doesn't exist xor a ld [wScriptVar], a ret .exists ld a, 1 ld [wScriptVar], a ret CheckOwnMonAnywhere: ; Check if the player owns any monsters of the species in wScriptVar. ; 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 [wScriptVar] to the species ; we have in [hl]. ; inputs: ; hl, pointer to PartyMonNSpecies ; bc, pointer to PartyMonNOT ; wScriptVar 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 ld a, [wScriptVar] 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 dba sBox1 dba sBox2 dba sBox3 dba sBox4 dba sBox5 dba sBox6 dba sBox7 dba sBox8 dba sBox9 dba sBox10 dba sBox11 dba sBox12 dba sBox13 dba sBox14 assert_table_length NUM_BOXES UpdateOTPointer: push hl ld hl, NAME_LENGTH add hl, bc ld b, h ld c, l pop hl ret