ref: a1498e63e27d651ef85fdfc7bcc255d67fb04d57
parent: 66d84ff021bf22e607b766867a1a6ce7ce9855ed
author: Rangi <[email protected]>
date: Fri Jun 17 19:27:53 EDT 2022
Rename search.asm and search2.asm
--- a/docs/bugs_and_glitches.md
+++ b/docs/bugs_and_glitches.md
@@ -2354,7 +2354,7 @@
This bug can allow you to talk to Eusine in Celadon City and encounter Ho-Oh with only traded legendary beasts.
-**Fix:** Edit `CheckOwnMon` in [engine/pokemon/search.asm](https://github.com/pret/pokecrystal/blob/master/engine/pokemon/search.asm):
+**Fix:** Edit `CheckOwnMon` in [engine/pokemon/search_owned.asm](https://github.com/pret/pokecrystal/blob/master/engine/pokemon/search_owned.asm):
```diff
; check OT
@@ -2386,7 +2386,7 @@
This bug can prevent you from talking to Eusine in Celadon City or encountering Ho-Oh when a caught legendary beast is in the Day-Care.
-**Fix:** Edit `CheckOwnMonAnywhere` in [engine/pokemon/search.asm](https://github.com/pret/pokecrystal/blob/master/engine/pokemon/search.asm):
+**Fix:** Edit `CheckOwnMonAnywhere` in [engine/pokemon/search_owned.asm](https://github.com/pret/pokecrystal/blob/master/engine/pokemon/search_owned.asm):
```diff
; If there are no monsters in the party,
--- a/engine/pokemon/search.asm
+++ /dev/null
@@ -1,277 +1,0 @@
-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
-
- 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
-
-rept NAME_LENGTH_JAPANESE - 2 ; should be PLAYER_NAME_LENGTH - 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
--- a/engine/pokemon/search2.asm
+++ /dev/null
@@ -1,134 +1,0 @@
-_FindPartyMonAboveLevel:
- ld hl, wPartyMon1Level
- call FindAboveLevel
- ret
-
-_FindPartyMonAtLeastThatHappy:
- ld hl, wPartyMon1Happiness
- call FindAtLeastThatHappy
- ret
-
-_FindPartyMonThatSpecies:
- ld hl, wPartyMon1Species
- jp FindThatSpecies
-
-_FindPartyMonThatSpeciesYourTrainerID:
- ld hl, wPartyMon1Species
- call FindThatSpecies
- ret z
- ld a, c
- ld hl, wPartyMon1ID
- ld bc, PARTYMON_STRUCT_LENGTH
- call AddNTimes
- ld a, [wPlayerID]
- cp [hl]
- jr nz, .nope
- inc hl
- ld a, [wPlayerID + 1]
- cp [hl]
- jr nz, .nope
- ld a, $1
- and a
- ret
-
-.nope
- xor a
- ret
-
-FindAtLeastThatHappy:
-; Sets the bits for the Pokemon that have a happiness greater than or equal to b.
-; The lowest bits are used. Sets z if no Pokemon in your party is at least that happy.
- ld c, $0
- ld a, [wPartyCount]
- ld d, a
-.loop
- ld a, d
- dec a
- push hl
- push bc
- ld bc, PARTYMON_STRUCT_LENGTH
- call AddNTimes
- pop bc
- ld a, b
- cp [hl]
- pop hl
- jr z, .greater_equal
- jr nc, .lower
-
-.greater_equal
- ld a, c
- or $1
- ld c, a
-
-.lower
- sla c
- dec d
- jr nz, .loop
- call RetroactivelyIgnoreEggs
- ld a, c
- and a
- ret
-
-FindAboveLevel:
- ld c, $0
- ld a, [wPartyCount]
- ld d, a
-.loop
- ld a, d
- dec a
- push hl
- push bc
- ld bc, PARTYMON_STRUCT_LENGTH
- call AddNTimes
- pop bc
- ld a, b
- cp [hl]
- pop hl
- jr c, .greater
- ld a, c
- or $1
- ld c, a
-
-.greater
- sla c
- dec d
- jr nz, .loop
- call RetroactivelyIgnoreEggs
- ld a, c
- and a
- ret
-
-FindThatSpecies:
-; Find species b in your party.
-; If you have no Pokemon, returns c = -1 and z.
-; If that species is in your party, returns its location in c, and nz.
-; Otherwise, returns z.
- ld c, -1
- ld hl, wPartySpecies
-.loop
- ld a, [hli]
- cp -1
- ret z
- inc c
- cp b
- jr nz, .loop
- ld a, $1
- and a
- ret
-
-RetroactivelyIgnoreEggs:
- ld e, %11111110
- ld hl, wPartySpecies
-.loop
- ld a, [hli]
- cp -1
- ret z
- cp EGG
- jr nz, .skip_notegg
- ld a, c
- and e
- ld c, a
-
-.skip_notegg
- rlc e
- jr .loop
--- /dev/null
+++ b/engine/pokemon/search_owned.asm
@@ -1,0 +1,277 @@
+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
+
+ 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
+
+rept NAME_LENGTH_JAPANESE - 2 ; should be PLAYER_NAME_LENGTH - 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
--- /dev/null
+++ b/engine/pokemon/search_party.asm
@@ -1,0 +1,134 @@
+_FindPartyMonAboveLevel:
+ ld hl, wPartyMon1Level
+ call FindAboveLevel
+ ret
+
+_FindPartyMonAtLeastThatHappy:
+ ld hl, wPartyMon1Happiness
+ call FindAtLeastThatHappy
+ ret
+
+_FindPartyMonThatSpecies:
+ ld hl, wPartyMon1Species
+ jp FindThatSpecies
+
+_FindPartyMonThatSpeciesYourTrainerID:
+ ld hl, wPartyMon1Species
+ call FindThatSpecies
+ ret z
+ ld a, c
+ ld hl, wPartyMon1ID
+ ld bc, PARTYMON_STRUCT_LENGTH
+ call AddNTimes
+ ld a, [wPlayerID]
+ cp [hl]
+ jr nz, .nope
+ inc hl
+ ld a, [wPlayerID + 1]
+ cp [hl]
+ jr nz, .nope
+ ld a, $1
+ and a
+ ret
+
+.nope
+ xor a
+ ret
+
+FindAtLeastThatHappy:
+; Sets the bits for the Pokemon that have a happiness greater than or equal to b.
+; The lowest bits are used. Sets z if no Pokemon in your party is at least that happy.
+ ld c, $0
+ ld a, [wPartyCount]
+ ld d, a
+.loop
+ ld a, d
+ dec a
+ push hl
+ push bc
+ ld bc, PARTYMON_STRUCT_LENGTH
+ call AddNTimes
+ pop bc
+ ld a, b
+ cp [hl]
+ pop hl
+ jr z, .greater_equal
+ jr nc, .lower
+
+.greater_equal
+ ld a, c
+ or $1
+ ld c, a
+
+.lower
+ sla c
+ dec d
+ jr nz, .loop
+ call RetroactivelyIgnoreEggs
+ ld a, c
+ and a
+ ret
+
+FindAboveLevel:
+ ld c, $0
+ ld a, [wPartyCount]
+ ld d, a
+.loop
+ ld a, d
+ dec a
+ push hl
+ push bc
+ ld bc, PARTYMON_STRUCT_LENGTH
+ call AddNTimes
+ pop bc
+ ld a, b
+ cp [hl]
+ pop hl
+ jr c, .greater
+ ld a, c
+ or $1
+ ld c, a
+
+.greater
+ sla c
+ dec d
+ jr nz, .loop
+ call RetroactivelyIgnoreEggs
+ ld a, c
+ and a
+ ret
+
+FindThatSpecies:
+; Find species b in your party.
+; If you have no Pokemon, returns c = -1 and z.
+; If that species is in your party, returns its location in c, and nz.
+; Otherwise, returns z.
+ ld c, -1
+ ld hl, wPartySpecies
+.loop
+ ld a, [hli]
+ cp -1
+ ret z
+ inc c
+ cp b
+ jr nz, .loop
+ ld a, $1
+ and a
+ ret
+
+RetroactivelyIgnoreEggs:
+ ld e, %11111110
+ ld hl, wPartySpecies
+.loop
+ ld a, [hli]
+ cp -1
+ ret z
+ cp EGG
+ jr nz, .skip_notegg
+ ld a, c
+ and e
+ ld c, a
+
+.skip_notegg
+ rlc e
+ jr .loop
--- a/main.asm
+++ b/main.asm
@@ -188,7 +188,7 @@
INCLUDE "engine/events/celebi.asm"
INCLUDE "engine/menus/main_menu.asm"
INCLUDE "mobile/mobile_menu.asm"
-INCLUDE "engine/pokemon/search.asm"
+INCLUDE "engine/pokemon/search_owned.asm"
INCLUDE "mobile/mobile_12_2.asm"
INCLUDE "engine/events/buena_menu.asm"
@@ -217,7 +217,7 @@
INCLUDE "engine/events/pokerus/check_pokerus.asm"
INCLUDE "engine/events/lucky_number.asm"
INCLUDE "engine/pokemon/caught_data.asm"
-INCLUDE "engine/pokemon/search2.asm"
+INCLUDE "engine/pokemon/search_party.asm"
INCLUDE "engine/pokemon/stats_screen.asm"
INCLUDE "engine/events/catch_tutorial.asm"
INCLUDE "engine/movie/evolution_animation.asm"