summaryrefslogtreecommitdiff
path: root/engine/pokedex/pokedex.asm
diff options
context:
space:
mode:
Diffstat (limited to 'engine/pokedex/pokedex.asm')
-rw-r--r--engine/pokedex/pokedex.asm2592
1 files changed, 2592 insertions, 0 deletions
diff --git a/engine/pokedex/pokedex.asm b/engine/pokedex/pokedex.asm
new file mode 100644
index 000000000..e96d0a7d7
--- /dev/null
+++ b/engine/pokedex/pokedex.asm
@@ -0,0 +1,2592 @@
+; Pokedex_RunJumptable.Jumptable indexes
+ const_def
+ const DEXSTATE_MAIN_SCR
+ const DEXSTATE_UPDATE_MAIN_SCR
+ const DEXSTATE_DEX_ENTRY_SCR
+ const DEXSTATE_UPDATE_DEX_ENTRY_SCR
+ const DEXSTATE_REINIT_DEX_ENTRY_SCR
+ const DEXSTATE_SEARCH_SCR
+ const DEXSTATE_UPDATE_SEARCH_SCR
+ const DEXSTATE_OPTION_SCR
+ const DEXSTATE_UPDATE_OPTION_SCR
+ const DEXSTATE_SEARCH_RESULTS_SCR
+ const DEXSTATE_UPDATE_SEARCH_RESULTS_SCR
+ const DEXSTATE_UNOWN_MODE
+ const DEXSTATE_UPDATE_UNOWN_MODE
+ const DEXSTATE_EXIT
+
+POKEDEX_SCX EQU 5
+GLOBAL POKEDEX_SCX
+
+Pokedex: ; 40000
+
+ ld a, [hWX]
+ ld l, a
+ ld a, [hWY]
+ ld h, a
+ push hl
+ ld a, [hSCX]
+ push af
+ ld hl, Options
+ ld a, [hl]
+ push af
+ set NO_TEXT_SCROLL, [hl]
+ ld a, [VramState]
+ push af
+ xor a
+ ld [VramState], a
+ ld a, [hInMenu]
+ push af
+ ld a, $1
+ ld [hInMenu], a
+
+ xor a
+ ld [hMapAnims], a
+ call InitPokedex
+ call DelayFrame
+
+.main
+ call JoyTextDelay
+ ld a, [wJumptableIndex]
+ bit 7, a
+ jr nz, .exit
+ call Pokedex_RunJumptable
+ call DelayFrame
+ jr .main
+
+.exit
+ ld de, SFX_READ_TEXT_2
+ call PlaySFX
+ call WaitSFX
+ call ClearSprites
+ ld a, [wCurrentDexMode]
+ ld [wLastDexMode], a
+
+ pop af
+ ld [hInMenu], a
+ pop af
+ ld [VramState], a
+ pop af
+ ld [Options], a
+ pop af
+ ld [hSCX], a
+ pop hl
+ ld a, l
+ ld [hWX], a
+ ld a, h
+ ld [hWY], a
+ ret
+
+InitPokedex: ; 40063
+ call ClearBGPalettes
+ call ClearSprites
+ call ClearTileMap
+ call Pokedex_LoadGFX
+
+ ld hl, wPokedexDataStart
+ ld bc, wPokedexDataEnd - wPokedexDataStart
+ xor a
+ call ByteFill
+
+ xor a
+ ld [wJumptableIndex], a
+ ld [wPrevDexEntryJumptableIndex], a
+ ld [wPrevDexEntryBackup], a
+ ld [wcf66], a
+
+ call Pokedex_CheckUnlockedUnownMode
+
+ ld a, [wLastDexMode]
+ ld [wCurrentDexMode], a
+
+ call Pokedex_OrderMonsByMode
+ call Pokedex_InitCursorPosition
+ call Pokedex_GetLandmark
+ farcall DrawDexEntryScreenRightEdge
+ call Pokedex_ResetBGMapMode
+ ret
+
+Pokedex_CheckUnlockedUnownMode: ; 400a2
+ ld a, [wStatusFlags]
+ bit 1, a
+ jr nz, .unlocked
+
+ xor a
+ ld [wUnlockedUnownMode], a
+ ret
+
+.unlocked
+ ld a, TRUE
+ ld [wUnlockedUnownMode], a
+ ret
+
+Pokedex_InitCursorPosition: ; 400b4
+ ld hl, wPokedexOrder
+ ld a, [wPrevDexEntry]
+ and a
+ jr z, .done
+ cp NUM_POKEMON + 1
+ jr nc, .done
+
+ ld b, a
+ ld a, [wDexListingEnd]
+ cp $8
+ jr c, .only_one_page
+
+ sub $7
+ ld c, a
+.loop1
+ ld a, b
+ cp [hl]
+ jr z, .done
+ inc hl
+ ld a, [wDexListingScrollOffset]
+ inc a
+ ld [wDexListingScrollOffset], a
+ dec c
+ jr nz, .loop1
+
+.only_one_page
+ ld c, $7
+.loop2
+ ld a, b
+ cp [hl]
+ jr z, .done
+ inc hl
+ ld a, [wDexListingCursor]
+ inc a
+ ld [wDexListingCursor], a
+ dec c
+ jr nz, .loop2
+
+.done
+ ret
+
+Pokedex_GetLandmark: ; 400ed
+ ld a, [MapGroup]
+ ld b, a
+ ld a, [MapNumber]
+ ld c, a
+ call GetWorldMapLocation
+
+ cp SPECIAL_MAP
+ jr nz, .load
+
+ ld a, [BackupMapGroup]
+ ld b, a
+ ld a, [BackupMapNumber]
+ ld c, a
+ call GetWorldMapLocation
+
+.load
+ ld [wDexCurrentLocation], a
+ ret
+
+Pokedex_RunJumptable: ; 4010b
+ ld a, [wJumptableIndex]
+ ld hl, .Jumptable
+ call Pokedex_LoadPointer
+ jp hl
+
+.Jumptable: ; 40115 (10:4115)
+; entries correspond to DEXSTATE_* constants
+ dw Pokedex_InitMainScreen
+ dw Pokedex_UpdateMainScreen
+ dw Pokedex_InitDexEntryScreen
+ dw Pokedex_UpdateDexEntryScreen
+ dw Pokedex_ReinitDexEntryScreen
+ dw Pokedex_InitSearchScreen
+ dw Pokedex_UpdateSearchScreen
+ dw Pokedex_InitOptionScreen
+ dw Pokedex_UpdateOptionScreen
+ dw Pokedex_InitSearchResultsScreen
+ dw Pokedex_UpdateSearchResultsScreen
+ dw Pokedex_InitUnownMode
+ dw Pokedex_UpdateUnownMode
+ dw Pokedex_Exit
+
+Pokedex_IncrementDexPointer: ; 40131 (10:4131)
+ ld hl, wJumptableIndex
+ inc [hl]
+ ret
+
+Pokedex_Exit: ; 40136 (10:4136)
+ ld hl, wJumptableIndex
+ set 7, [hl]
+ ret
+
+Pokedex_InitMainScreen: ; 4013c (10:413c)
+ xor a
+ ld [hBGMapMode], a
+ call ClearSprites
+ xor a
+ hlcoord 0, 0, AttrMap
+ ld bc, SCREEN_HEIGHT * SCREEN_WIDTH
+ call ByteFill
+ farcall DrawPokedexListWindow
+ hlcoord 0, 17
+ ld de, String_START_SEARCH
+ call Pokedex_PlaceString
+ ld a, 7
+ ld [wDexListingHeight], a
+ call Pokedex_PrintListing
+ call Pokedex_SetBGMapMode_3ifDMG_4ifCGB
+ call Pokedex_ResetBGMapMode
+ call Pokedex_DrawMainScreenBG
+ ld a, POKEDEX_SCX
+ ld [hSCX], a
+
+ ld a, [wCurrentDexMode]
+ cp DEXMODE_OLD
+ ld a, $4a
+ jr z, .okay
+ ld a, $47
+.okay
+ ld [hWX], a
+ xor a
+ ld [hWY], a
+ call WaitBGMap
+
+ call Pokedex_ResetBGMapMode
+ ld a, -1
+ ld [CurPartySpecies], a
+ ld a, SCGB_POKEDEX
+ call Pokedex_GetSGBLayout
+ call Pokedex_UpdateCursorOAM
+ farcall DrawPokedexListWindow
+ hlcoord 0, 17
+ ld de, String_START_SEARCH
+ call Pokedex_PlaceString
+ ld a, 7
+ ld [wDexListingHeight], a
+ call Pokedex_PrintListing
+ call Pokedex_IncrementDexPointer
+ ret
+
+Pokedex_UpdateMainScreen: ; 401ae (10:41ae)
+ ld hl, hJoyPressed
+ ld a, [hl]
+ and B_BUTTON
+ jr nz, .b
+ ld a, [hl]
+ and A_BUTTON
+ jr nz, .a
+ ld a, [hl]
+ and SELECT
+ jr nz, .select
+ ld a, [hl]
+ and START
+ jr nz, .start
+ call Pokedex_ListingHandleDPadInput
+ ret nc
+ call Pokedex_UpdateCursorOAM
+ xor a
+ ld [hBGMapMode], a
+ call Pokedex_PrintListing
+ call Pokedex_SetBGMapMode3
+ call Pokedex_ResetBGMapMode
+ ret
+
+.a
+ call Pokedex_GetSelectedMon
+ call Pokedex_CheckSeen
+ ret z
+ ld a, DEXSTATE_DEX_ENTRY_SCR
+ ld [wJumptableIndex], a
+ ld a, DEXSTATE_MAIN_SCR
+ ld [wPrevDexEntryJumptableIndex], a
+ ret
+
+.select
+ call Pokedex_BlackOutBG
+ ld a, DEXSTATE_OPTION_SCR
+ ld [wJumptableIndex], a
+ xor a
+ ld [hSCX], a
+ ld a, $a7
+ ld [hWX], a
+ call DelayFrame
+ ret
+
+.start
+ call Pokedex_BlackOutBG
+ ld a, DEXSTATE_SEARCH_SCR
+ ld [wJumptableIndex], a
+ xor a
+ ld [hSCX], a
+ ld a, $a7
+ ld [hWX], a
+ call DelayFrame
+ ret
+
+.b
+ ld a, DEXSTATE_EXIT
+ ld [wJumptableIndex], a
+ ret
+
+Pokedex_InitDexEntryScreen: ; 40217 (10:4217)
+ call LowVolume
+ xor a ; page 1
+ ld [wPokedexStatus], a
+ xor a
+ ld [hBGMapMode], a
+ call ClearSprites
+ call Pokedex_LoadCurrentFootprint
+ call Pokedex_DrawDexEntryScreenBG
+ call Pokedex_InitArrowCursor
+ call Pokedex_GetSelectedMon
+ ld [wPrevDexEntry], a
+ farcall DisplayDexEntry
+ call Pokedex_DrawFootprint
+ call WaitBGMap
+ ld a, $a7
+ ld [hWX], a
+ call Pokedex_GetSelectedMon
+ ld [CurPartySpecies], a
+ ld a, SCGB_POKEDEX
+ call Pokedex_GetSGBLayout
+ ld a, [CurPartySpecies]
+ call PlayMonCry
+ call Pokedex_IncrementDexPointer
+ ret
+
+Pokedex_UpdateDexEntryScreen: ; 40258 (10:4258)
+ ld de, DexEntryScreen_ArrowCursorData
+ call Pokedex_MoveArrowCursor
+ ld hl, hJoyPressed
+ ld a, [hl]
+ and B_BUTTON
+ jr nz, .return_to_prev_screen
+ ld a, [hl]
+ and A_BUTTON
+ jr nz, .do_menu_action
+ call Pokedex_NextOrPreviousDexEntry
+ ret nc
+ call Pokedex_IncrementDexPointer
+ ret
+
+.do_menu_action
+ ld a, [wDexArrowCursorPosIndex]
+ ld hl, DexEntryScreen_MenuActionJumptable
+ call Pokedex_LoadPointer
+ jp hl
+
+.return_to_prev_screen
+ ld a, [LastVolume]
+ and a
+ jr z, .max_volume
+ ld a, $77
+ ld [LastVolume], a
+
+.max_volume
+ call MaxVolume
+ ld a, [wPrevDexEntryJumptableIndex]
+ ld [wJumptableIndex], a
+ ret
+
+Pokedex_Page: ; 40292
+ ld a, [wPokedexStatus]
+ xor 1 ; toggle page
+ ld [wPokedexStatus], a
+ call Pokedex_GetSelectedMon
+ ld [wPrevDexEntry], a
+ farcall DisplayDexEntry
+ call WaitBGMap
+ ret
+
+Pokedex_ReinitDexEntryScreen: ; 402aa (10:42aa)
+; Reinitialize the Pokédex entry screen after changing the selected mon.
+ call Pokedex_BlackOutBG
+ xor a ; page 1
+ ld [wPokedexStatus], a
+ xor a
+ ld [hBGMapMode], a
+ call Pokedex_DrawDexEntryScreenBG
+ call Pokedex_InitArrowCursor
+ call Pokedex_LoadCurrentFootprint
+ call Pokedex_GetSelectedMon
+ ld [wPrevDexEntry], a
+ farcall DisplayDexEntry
+ call Pokedex_DrawFootprint
+ call Pokedex_LoadSelectedMonTiles
+ call WaitBGMap
+ call Pokedex_GetSelectedMon
+ ld [CurPartySpecies], a
+ ld a, SCGB_POKEDEX
+ call Pokedex_GetSGBLayout
+ ld a, [CurPartySpecies]
+ call PlayMonCry
+ ld hl, wJumptableIndex
+ dec [hl]
+ ret
+
+DexEntryScreen_ArrowCursorData: ; 402e8
+ db D_RIGHT | D_LEFT, 4
+ dwcoord 1, 17 ; PAGE
+ dwcoord 6, 17 ; AREA
+ dwcoord 11, 17 ; CRY
+ dwcoord 15, 17 ; PRNT
+
+
+DexEntryScreen_MenuActionJumptable: ; 402f2
+ dw Pokedex_Page
+ dw .Area
+ dw .Cry
+ dw .Print
+
+.Area: ; 402fa
+ call Pokedex_BlackOutBG
+ xor a
+ ld [hSCX], a
+ call DelayFrame
+ ld a, $7
+ ld [hWX], a
+ ld a, $90
+ ld [hWY], a
+ call Pokedex_GetSelectedMon
+ ld a, [wDexCurrentLocation]
+ ld e, a
+ predef Pokedex_GetArea
+ call Pokedex_BlackOutBG
+ call DelayFrame
+ xor a
+ ld [hBGMapMode], a
+ ld a, $90
+ ld [hWY], a
+ ld a, POKEDEX_SCX
+ ld [hSCX], a
+ call DelayFrame
+ call Pokedex_RedisplayDexEntry
+ call Pokedex_LoadSelectedMonTiles
+ call WaitBGMap
+ call Pokedex_GetSelectedMon
+ ld [CurPartySpecies], a
+ ld a, SCGB_POKEDEX
+ call Pokedex_GetSGBLayout
+ ret
+
+.Cry: ; 40340
+ call Pokedex_GetSelectedMon
+ ld a, [wd265]
+ call GetCryIndex
+ ld e, c
+ ld d, b
+ call PlayCry
+ ret
+
+.Print: ; 4034f
+ call Pokedex_ApplyPrintPals
+ xor a
+ ld [hSCX], a
+ ld a, [wPrevDexEntryBackup]
+ push af
+ ld a, [wPrevDexEntryJumptableIndex]
+ push af
+ ld a, [wJumptableIndex]
+ push af
+ farcall PrintDexEntry
+ pop af
+ ld [wJumptableIndex], a
+ pop af
+ ld [wPrevDexEntryJumptableIndex], a
+ pop af
+ ld [wPrevDexEntryBackup], a
+ call ClearBGPalettes
+ call DisableLCD
+ call Pokedex_LoadInvertedFont
+ call Pokedex_RedisplayDexEntry
+ call EnableLCD
+ call WaitBGMap
+ ld a, POKEDEX_SCX
+ ld [hSCX], a
+ call Pokedex_ApplyUsualPals
+ ret
+
+Pokedex_RedisplayDexEntry: ; 4038d
+ call Pokedex_DrawDexEntryScreenBG
+ call Pokedex_GetSelectedMon
+ farcall DisplayDexEntry
+ call Pokedex_DrawFootprint
+ ret
+
+Pokedex_InitOptionScreen: ; 4039d (10:439d)
+ xor a
+ ld [hBGMapMode], a
+ call ClearSprites
+ call Pokedex_DrawOptionScreenBG
+ call Pokedex_InitArrowCursor
+ ld a, [wCurrentDexMode] ; Index of the topmost visible item in a scrolling menu ???
+ ld [wDexArrowCursorPosIndex], a
+ call Pokedex_DisplayModeDescription
+ call WaitBGMap
+ ld a, SCGB_POKEDEX_SEARCH_OPTION
+ call Pokedex_GetSGBLayout
+ call Pokedex_IncrementDexPointer
+ ret
+
+Pokedex_UpdateOptionScreen: ; 403be (10:43be)
+ ld a, [wUnlockedUnownMode]
+ and a
+ jr nz, .okay
+ ld de, .NoUnownModeArrowCursorData
+ jr .okay2
+.okay
+ ld de, .ArrowCursorData
+.okay2
+ call Pokedex_MoveArrowCursor
+ call c, Pokedex_DisplayModeDescription
+ ld hl, hJoyPressed
+ ld a, [hl]
+ and SELECT | B_BUTTON
+ jr nz, .return_to_main_screen
+ ld a, [hl]
+ and A_BUTTON
+ jr nz, .do_menu_action
+ ret
+
+.do_menu_action
+ ld a, [wDexArrowCursorPosIndex]
+ ld hl, .MenuActionJumptable
+ call Pokedex_LoadPointer
+ jp hl
+
+.return_to_main_screen
+ call Pokedex_BlackOutBG
+ ld a, DEXSTATE_MAIN_SCR
+ ld [wJumptableIndex], a
+ ret
+
+.NoUnownModeArrowCursorData: ; 403f3
+ db D_UP | D_DOWN, 3
+ dwcoord 2, 4 ; NEW
+ dwcoord 2, 6 ; OLD
+ dwcoord 2, 8 ; ABC
+
+.ArrowCursorData: ; 403fb
+ db D_UP | D_DOWN, 4
+ dwcoord 2, 4 ; NEW
+ dwcoord 2, 6 ; OLD
+ dwcoord 2, 8 ; ABC
+ dwcoord 2, 10 ; UNOWN
+
+.MenuActionJumptable: ; 40405 (10:4405)
+ dw .MenuAction_NewMode
+ dw .MenuAction_OldMode
+ dw .MenuAction_ABCMode
+ dw .MenuAction_UnownMode
+
+.MenuAction_NewMode: ; 4040d (10:440d)
+ ld b, DEXMODE_NEW
+ jr .ChangeMode
+
+.MenuAction_OldMode: ; 40411 (10:4411)
+ ld b, DEXMODE_OLD
+ jr .ChangeMode
+
+.MenuAction_ABCMode: ; 40415 (10:4415)
+ ld b, DEXMODE_ABC
+
+.ChangeMode: ; 40417 (10:4417)
+ ld a, [wCurrentDexMode]
+ cp b
+ jr z, .skip_changing_mode ; Skip if new mode is same as current.
+
+ ld a, b
+ ld [wCurrentDexMode], a
+ call Pokedex_OrderMonsByMode
+ call Pokedex_DisplayChangingModesMessage
+ xor a
+ ld [wDexListingScrollOffset], a
+ ld [wDexListingCursor], a
+ call Pokedex_InitCursorPosition
+
+.skip_changing_mode
+ call Pokedex_BlackOutBG
+ ld a, DEXSTATE_MAIN_SCR
+ ld [wJumptableIndex], a
+ ret
+
+.MenuAction_UnownMode: ; 4043a (10:443a)
+ call Pokedex_BlackOutBG
+ ld a, DEXSTATE_UNOWN_MODE
+ ld [wJumptableIndex], a
+ ret
+
+Pokedex_InitSearchScreen: ; 40443 (10:4443)
+ xor a
+ ld [hBGMapMode], a
+ call ClearSprites
+ call Pokedex_DrawSearchScreenBG
+ call Pokedex_InitArrowCursor
+ ld a, NORMAL + 1
+ ld [wDexSearchMonType1], a
+ xor a
+ ld [wDexSearchMonType2], a
+ call Pokedex_PlaceSearchScreenTypeStrings
+ xor a
+ ld [wDexSearchSlowpokeFrame], a
+ farcall DoDexSearchSlowpokeFrame
+ call WaitBGMap
+ ld a, SCGB_POKEDEX_SEARCH_OPTION
+ call Pokedex_GetSGBLayout
+ call Pokedex_IncrementDexPointer
+ ret
+
+Pokedex_UpdateSearchScreen: ; 40471 (10:4471)
+ ld de, .ArrowCursorData
+ call Pokedex_MoveArrowCursor
+ call Pokedex_UpdateSearchMonType
+ call c, Pokedex_PlaceSearchScreenTypeStrings
+ ld hl, hJoyPressed
+ ld a, [hl]
+ and START | B_BUTTON
+ jr nz, .cancel
+ ld a, [hl]
+ and A_BUTTON
+ jr nz, .do_menu_action
+ ret
+
+.do_menu_action
+ ld a, [wDexArrowCursorPosIndex]
+ ld hl, .MenuActionJumptable
+ call Pokedex_LoadPointer
+ jp hl
+
+.cancel
+ call Pokedex_BlackOutBG
+ ld a, DEXSTATE_MAIN_SCR
+ ld [wJumptableIndex], a
+ ret
+
+.ArrowCursorData: ; 4049e
+ db D_UP | D_DOWN, 4
+ dwcoord 2, 4 ; TYPE 1
+ dwcoord 2, 6 ; TYPE 2
+ dwcoord 2, 13 ; BEGIN SEARCH
+ dwcoord 2, 15 ; CANCEL
+
+.MenuActionJumptable: ; 404a8
+ dw .MenuAction_MonSearchType
+ dw .MenuAction_MonSearchType
+ dw .MenuAction_BeginSearch
+ dw .MenuAction_Cancel
+
+.MenuAction_MonSearchType: ; 404b0
+ call Pokedex_NextSearchMonType
+ call Pokedex_PlaceSearchScreenTypeStrings
+ ret
+
+.MenuAction_BeginSearch: ; 404b7
+ call Pokedex_SearchForMons
+ farcall AnimateDexSearchSlowpoke
+ ld a, [wDexSearchResultCount]
+ and a
+ jr nz, .show_search_results
+
+; No mon with matching types was found.
+ call Pokedex_OrderMonsByMode
+ call Pokedex_DisplayTypeNotFoundMessage
+ xor a
+ ld [hBGMapMode], a
+ call Pokedex_DrawSearchScreenBG
+ call Pokedex_InitArrowCursor
+ call Pokedex_PlaceSearchScreenTypeStrings
+ call WaitBGMap
+ ret
+
+.show_search_results
+ ld [wDexListingEnd], a
+ ld a, [wDexListingScrollOffset]
+ ld [wDexListingScrollOffsetBackup], a
+ ld a, [wDexListingCursor]
+ ld [wDexListingCursorBackup], a
+ ld a, [wPrevDexEntry]
+ ld [wPrevDexEntryBackup], a
+ xor a
+ ld [wDexListingScrollOffset], a
+ ld [wDexListingCursor], a
+ call Pokedex_BlackOutBG
+ ld a, DEXSTATE_SEARCH_RESULTS_SCR
+ ld [wJumptableIndex], a
+ ret
+
+.MenuAction_Cancel: ; 40501
+ call Pokedex_BlackOutBG
+ ld a, DEXSTATE_MAIN_SCR
+ ld [wJumptableIndex], a
+ ret
+
+Pokedex_InitSearchResultsScreen: ; 4050a (10:450a)
+ xor a
+ ld [hBGMapMode], a
+ xor a
+ hlcoord 0, 0, AttrMap
+ ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
+ call ByteFill
+ call Pokedex_SetBGMapMode4
+ call Pokedex_ResetBGMapMode
+ farcall DrawPokedexSearchResultsWindow
+ call Pokedex_PlaceSearchResultsTypeStrings
+ ld a, 4
+ ld [wDexListingHeight], a
+ call Pokedex_PrintListing
+ call Pokedex_SetBGMapMode3
+ call Pokedex_ResetBGMapMode
+ call Pokedex_DrawSearchResultsScreenBG
+ ld a, POKEDEX_SCX
+ ld [hSCX], a
+ ld a, $4a
+ ld [hWX], a
+ xor a
+ ld [hWY], a
+ call WaitBGMap
+ call Pokedex_ResetBGMapMode
+ farcall DrawPokedexSearchResultsWindow
+ call Pokedex_PlaceSearchResultsTypeStrings
+ call Pokedex_UpdateSearchResultsCursorOAM
+ ld a, -1
+ ld [CurPartySpecies], a
+ ld a, SCGB_POKEDEX
+ call Pokedex_GetSGBLayout
+ call Pokedex_IncrementDexPointer
+ ret
+
+Pokedex_UpdateSearchResultsScreen: ; 40562 (10:4562)
+ ld hl, hJoyPressed
+ ld a, [hl]
+ and B_BUTTON
+ jr nz, .return_to_search_screen
+ ld a, [hl]
+ and A_BUTTON
+ jr nz, .go_to_dex_entry
+ call Pokedex_ListingHandleDPadInput
+ ret nc
+ call Pokedex_UpdateSearchResultsCursorOAM
+ xor a
+ ld [hBGMapMode], a
+ call Pokedex_PrintListing
+ call Pokedex_SetBGMapMode3
+ call Pokedex_ResetBGMapMode
+ ret
+
+.go_to_dex_entry
+ call Pokedex_GetSelectedMon
+ call Pokedex_CheckSeen
+ ret z
+ ld a, DEXSTATE_DEX_ENTRY_SCR
+ ld [wJumptableIndex], a
+ ld a, DEXSTATE_SEARCH_RESULTS_SCR
+ ld [wPrevDexEntryJumptableIndex], a
+ ret
+
+.return_to_search_screen
+ ld a, [wDexListingScrollOffsetBackup]
+ ld [wDexListingScrollOffset], a
+ ld a, [wDexListingCursorBackup]
+ ld [wDexListingCursor], a
+ ld a, [wPrevDexEntryBackup]
+ ld [wPrevDexEntry], a
+ call Pokedex_BlackOutBG
+ call ClearSprites
+ call Pokedex_OrderMonsByMode
+ ld a, DEXSTATE_SEARCH_SCR
+ ld [wJumptableIndex], a
+ xor a
+ ld [hSCX], a
+ ld a, $a7
+ ld [hWX], a
+ ret
+
+Pokedex_InitUnownMode: ; 405bd (10:45bd)
+ call Pokedex_LoadUnownFont
+ call Pokedex_DrawUnownModeBG
+ xor a
+ ld [wDexCurrentUnownIndex], a
+ call Pokedex_LoadUnownFrontpicTiles
+ call Pokedex_UnownModePlaceCursor
+ farcall PrintUnownWord
+ call WaitBGMap
+ ld a, SCGB_POKEDEX_UNOWN_MODE
+ call Pokedex_GetSGBLayout
+ call Pokedex_IncrementDexPointer
+ ret
+
+Pokedex_UpdateUnownMode: ; 405df (10:45df)
+ ld hl, hJoyPressed
+ ld a, [hl]
+ and A_BUTTON | B_BUTTON
+ jr nz, .a_b
+ call Pokedex_UnownModeHandleDPadInput
+ ret
+
+.a_b
+ call Pokedex_BlackOutBG
+ ld a, DEXSTATE_OPTION_SCR
+ ld [wJumptableIndex], a
+ call DelayFrame
+ call Pokedex_CheckSGB
+ jr nz, .decompress
+ farcall LoadSGBPokedexGFX2
+ jr .done
+
+.decompress
+ ld hl, PokedexLZ
+ ld de, vTiles2 tile $31
+ lb bc, BANK(PokedexLZ), 58
+ call DecompressRequest2bpp
+
+.done
+ ret
+
+Pokedex_UnownModeHandleDPadInput: ; 40610 (10:4610)
+ ld hl, hJoyLast
+ ld a, [hl]
+ and D_RIGHT
+ jr nz, .right
+ ld a, [hl]
+ and D_LEFT
+ jr nz, .left
+ ret
+
+.right
+ ld a, [wDexUnownCount]
+ ld e, a
+ ld hl, wDexCurrentUnownIndex
+ ld a, [hl]
+ inc a
+ cp e
+ ret nc
+ ld a, [hl]
+ inc [hl]
+ jr .update
+
+.left
+ ld hl, wDexCurrentUnownIndex
+ ld a, [hl]
+ and a
+ ret z
+ ld a, [hl]
+ dec [hl]
+
+.update
+ push af
+ xor a
+ ld [hBGMapMode], a
+ pop af
+ call Pokedex_UnownModeEraseCursor
+ call Pokedex_LoadUnownFrontpicTiles
+ call Pokedex_UnownModePlaceCursor
+ farcall PrintUnownWord
+ ld a, $1
+ ld [hBGMapMode], a
+ call DelayFrame
+ call DelayFrame
+ ret
+
+Pokedex_UnownModeEraseCursor: ; 40654 (10:4654)
+ ld c, " "
+ jr Pokedex_UnownModeUpdateCursorGfx
+
+Pokedex_UnownModePlaceCursor: ; 40658 (10:4658)
+ ld a, [wDexCurrentUnownIndex]
+ ld c, $5a ; diamond cursor
+
+Pokedex_UnownModeUpdateCursorGfx: ; 4065d (10:465d)
+ ld e, a
+ ld d, 0
+ ld hl, UnownModeLetterAndCursorCoords + 2
+rept 4
+ add hl, de
+endr
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld [hl], c
+ ret
+
+Pokedex_NextOrPreviousDexEntry: ; 4066c (10:466c)
+ ld a, [wDexListingCursor]
+ ld [wBackupDexListingCursor], a
+ ld a, [wDexListingScrollOffset]
+ ld [wBackupDexListingPage], a
+ ld hl, hJoyLast
+ ld a, [hl]
+ and D_UP
+ jr nz, .up
+ ld a, [hl]
+ and D_DOWN
+ jr nz, .down
+ and a
+ ret
+
+.up
+ ld a, [wDexListingHeight]
+ ld d, a
+ ld a, [wDexListingEnd]
+ ld e, a
+ call Pokedex_ListingMoveCursorUp
+ jr nc, .nope
+ call Pokedex_GetSelectedMon
+ call Pokedex_CheckSeen
+ jr nz, .yep
+ jr .up
+
+.down
+ ld a, [wDexListingHeight]
+ ld d, a
+ ld a, [wDexListingEnd]
+ ld e, a
+ call Pokedex_ListingMoveCursorDown
+ jr nc, .nope
+ call Pokedex_GetSelectedMon
+ call Pokedex_CheckSeen
+ jr nz, .yep
+ jr .down
+
+.yep
+ scf
+ ret
+
+.nope
+ ld a, [wBackupDexListingCursor]
+ ld [wDexListingCursor], a
+ ld a, [wBackupDexListingPage]
+ ld [wDexListingScrollOffset], a
+ and a
+ ret
+
+Pokedex_ListingHandleDPadInput: ; 406c5 (10:46c5)
+; Handles D-pad input for a list of Pokémon.
+ ld a, [wDexListingHeight]
+ ld d, a
+ ld a, [wDexListingEnd]
+ ld e, a
+ ld hl, hJoyLast
+ ld a, [hl]
+ and D_UP
+ jr nz, Pokedex_ListingMoveCursorUp
+ ld a, [hl]
+ and D_DOWN
+ jr nz, Pokedex_ListingMoveCursorDown
+ ld a, d
+ cp e
+ jr nc, Pokedex_ListingPosStayedSame
+ ld a, [hl]
+ and D_LEFT
+ jr nz, Pokedex_ListingMoveUpOnePage
+ ld a, [hl]
+ and D_RIGHT
+ jr nz, Pokedex_ListingMoveDownOnePage
+ jr Pokedex_ListingPosStayedSame
+
+Pokedex_ListingMoveCursorUp: ; 406ea (10:46ea)
+ ld hl, wDexListingCursor
+ ld a, [hl]
+ and a
+ jr z, .try_scrolling
+ dec [hl]
+ jr Pokedex_ListingPosChanged
+.try_scrolling
+ ld hl, wDexListingScrollOffset
+ ld a, [hl]
+ and a
+ jr z, Pokedex_ListingPosStayedSame
+ dec [hl]
+ jr Pokedex_ListingPosChanged
+
+Pokedex_ListingMoveCursorDown: ; 406fe (10:46fe)
+ ld hl, wDexListingCursor
+ ld a, [hl]
+ inc a
+ cp e
+ jr nc, Pokedex_ListingPosStayedSame
+ cp d
+ jr nc, .try_scrolling
+ inc [hl]
+ jr Pokedex_ListingPosChanged
+.try_scrolling
+ ld hl, wDexListingScrollOffset
+ add [hl]
+ cp e
+ jr nc, Pokedex_ListingPosStayedSame
+ inc [hl]
+ jr Pokedex_ListingPosChanged
+
+Pokedex_ListingMoveUpOnePage: ; 40716 (10:4716)
+ ld hl, wDexListingScrollOffset
+ ld a, [hl]
+ and a
+ jr z, Pokedex_ListingPosStayedSame
+ cp d
+ jr nc, .not_near_top
+; If we're already less than page away from the top, go to the top.
+ xor a
+ ld [hl], a
+ jr Pokedex_ListingPosChanged
+.not_near_top
+ sub d
+ ld [hl], a
+ jr Pokedex_ListingPosChanged
+
+Pokedex_ListingMoveDownOnePage: ; 40728 (10:4728)
+; When moving down a page, the return value always report a change in position.
+ ld hl, wDexListingScrollOffset
+ ld a, d
+ add a
+ add [hl]
+ jr c, .near_bottom
+ cp e
+ jr c, .not_near_bottom
+.near_bottom
+ ld a, e
+ sub d
+ ld [hl], a
+ jr Pokedex_ListingPosChanged
+.not_near_bottom
+ ld a, [hl]
+ add d
+ ld [hl], a
+ jr Pokedex_ListingPosChanged
+
+Pokedex_ListingPosStayedSame: ; 4073d (10:473d)
+ and a
+ ret
+
+Pokedex_ListingPosChanged: ; 4073f (10:473f)
+ scf
+ ret
+
+Pokedex_FillColumn: ; 40741
+; Fills a column starting at HL, going downwards.
+; B is the height of the column and A is the tile it's filled with.
+ push de
+ ld de, SCREEN_WIDTH
+.loop
+ ld [hl], a
+ add hl, de
+ dec b
+ jr nz, .loop
+ pop de
+ ret
+
+
+Pokedex_DrawMainScreenBG: ; 4074c (10:474c)
+; Draws the left sidebar and the bottom bar on the main screen.
+ hlcoord 0, 17
+ ld de, String_START_SEARCH
+ call Pokedex_PlaceString
+ ld a, $32
+ hlcoord 0, 0
+ ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
+ call ByteFill
+ hlcoord 0, 0
+ lb bc, 7, 7
+ call Pokedex_PlaceBorder
+ hlcoord 0, 9
+ lb bc, 6, 7
+ call Pokedex_PlaceBorder
+ hlcoord 1, 11
+ ld de, String_SEEN
+ call Pokedex_PlaceString
+ ld hl, PokedexSeen
+ ld b, EndPokedexSeen - PokedexSeen
+ call CountSetBits
+ ld de, wd265
+ hlcoord 5, 12
+ lb bc, 1, 3
+ call PrintNum
+ hlcoord 1, 14
+ ld de, String_OWN
+ call Pokedex_PlaceString
+ ld hl, PokedexCaught
+ ld b, EndPokedexCaught - PokedexCaught
+ call CountSetBits
+ ld de, wd265
+ hlcoord 5, 15
+ lb bc, 1, 3
+ call PrintNum
+ hlcoord 1, 17
+ ld de, String_SELECT_OPTION
+ call Pokedex_PlaceString
+ hlcoord 8, 1
+ ld b, 7
+ ld a, $5a
+ call Pokedex_FillColumn
+ hlcoord 8, 10
+ ld b, 6
+ ld a, $5a
+ call Pokedex_FillColumn
+ hlcoord 8, 0
+ ld [hl], $59
+ hlcoord 8, 8
+ ld [hl], $53
+ hlcoord 8, 9
+ ld [hl], $54
+ hlcoord 8, 16
+ ld [hl], $5b
+ call Pokedex_PlaceFrontpicTopLeftCorner
+ ret
+
+String_SEEN: ; 407e1
+ db "SEEN", -1
+String_OWN: ; 407e6
+ db "OWN", -1
+String_SELECT_OPTION: ; 407ea
+ db $3b, $48, $49, $4a, $44, $45, $46, $47 ; SELECT > OPTION
+ ; fallthrough
+String_START_SEARCH: ; 407f2
+ db $3c, $3b, $41, $42, $43, $4b, $4c, $4d, $4e, $3c, -1 ; START > SEARCH
+
+Pokedex_DrawDexEntryScreenBG: ; 407fd
+ call Pokedex_FillBackgroundColor2
+ hlcoord 0, 0
+ lb bc, 15, 18
+ call Pokedex_PlaceBorder
+ hlcoord 19, 0
+ ld [hl], $34
+ hlcoord 19, 1
+ ld a, " "
+ ld b, 15
+ call Pokedex_FillColumn
+ ld [hl], $39
+ hlcoord 1, 10
+ ld bc, 19
+ ld a, $61
+ call ByteFill
+ hlcoord 1, 17
+ ld bc, 18
+ ld a, " "
+ call ByteFill
+ hlcoord 9, 7
+ ld de, .Height
+ call Pokedex_PlaceString
+ hlcoord 9, 9
+ ld de, .Weight
+ call Pokedex_PlaceString
+ hlcoord 0, 17
+ ld de, .MenuItems
+ call Pokedex_PlaceString
+ call Pokedex_PlaceFrontpicTopLeftCorner
+ ret
+
+.Unused: ; 4084f
+ db $5c, $5d, -1 ; No.
+.Height: ; 40852
+ db "HT ?", $5e, "??", $5f, -1 ; HT ?'??"
+.Weight: ; 4085c
+ db "WT ???lb", -1 ; WT ???lb
+.MenuItems: ; 40867
+ db $3b, " PAGE AREA CRY PRNT", -1
+
+Pokedex_DrawOptionScreenBG: ; 4087c (10:487c)
+ call Pokedex_FillBackgroundColor2
+ hlcoord 0, 2
+ lb bc, 8, 18
+ call Pokedex_PlaceBorder
+ hlcoord 0, 12
+ lb bc, 4, 18
+ call Pokedex_PlaceBorder
+ hlcoord 0, 1
+ ld de, .Title
+ call Pokedex_PlaceString
+ hlcoord 3, 4
+ ld de, .Modes
+ call PlaceString
+ ld a, [wUnlockedUnownMode]
+ and a
+ ret z
+ hlcoord 3, 10
+ ld de, .UnownMode
+ call PlaceString
+ ret
+
+.Title: ; 408b2
+ db $3b, " OPTION ", $3c, -1
+
+.Modes: ; 408bd
+ db "NEW #DEX MODE"
+ next "OLD #DEX MODE"
+ next "A to Z MODE"
+ db "@"
+
+.UnownMode: ; 408e5
+ db "UNOWN MODE@"
+
+Pokedex_DrawSearchScreenBG: ; 408f0 (10:48f0)
+ call Pokedex_FillBackgroundColor2
+ hlcoord 0, 2
+ lb bc, 14, 18
+ call Pokedex_PlaceBorder
+ hlcoord 0, 1
+ ld de, .Title
+ call Pokedex_PlaceString
+ hlcoord 8, 4
+ ld de, .TypeLeftRightArrows
+ call Pokedex_PlaceString
+ hlcoord 8, 6
+ ld de, .TypeLeftRightArrows
+ call Pokedex_PlaceString
+ hlcoord 3, 4
+ ld de, .Types
+ call PlaceString
+ hlcoord 3, 13
+ ld de, .Menu
+ call PlaceString
+ ret
+
+.Title: ; 4092a
+ db $3b, " SEARCH ", $3c, -1
+
+.TypeLeftRightArrows: ; 40935
+ db $3d, " ", $3e, -1
+
+.Types: ; 40940
+ db "TYPE1"
+ next "TYPE2"
+ db "@"
+
+.Menu: ; 4094c
+ db "BEGIN SEARCH!!"
+ next "CANCEL"
+ db "@"
+
+Pokedex_DrawSearchResultsScreenBG: ; 40962 (10:4962)
+ call Pokedex_FillBackgroundColor2
+ hlcoord 0, 0
+ lb bc, 7, 7
+ call Pokedex_PlaceBorder
+ hlcoord 0, 11
+ lb bc, 5, 18
+ call Pokedex_PlaceBorder
+ hlcoord 1, 12
+ ld de, .BottomWindowText
+ call PlaceString
+ ld de, wDexSearchResultCount
+ hlcoord 1, 16
+ lb bc, 1, 3
+ call PrintNum
+ hlcoord 8, 0
+ ld [hl], $59
+ hlcoord 8, 1
+ ld b, 7
+ ld a, $5a
+ call Pokedex_FillColumn
+ hlcoord 8, 8
+ ld [hl], $53
+ hlcoord 8, 9
+ ld [hl], $69
+ hlcoord 8, 10
+ ld [hl], $6a
+ call Pokedex_PlaceFrontpicTopLeftCorner
+ ret
+
+.BottomWindowText: ; 409ae
+ db "SEARCH RESULTS"
+ next " TYPE"
+ next " FOUND!"
+ db "@"
+
+Pokedex_PlaceSearchResultsTypeStrings: ; 409cf (10:49cf)
+ ld a, [wDexSearchMonType1]
+ hlcoord 0, 14
+ call Pokedex_PlaceTypeString
+ ld a, [wDexSearchMonType1]
+ ld b, a
+ ld a, [wDexSearchMonType2]
+ and a
+ jr z, .done
+ cp b
+ jr z, .done
+ hlcoord 2, 15
+ call Pokedex_PlaceTypeString
+ hlcoord 1, 15
+ ld [hl], "/"
+.done
+ ret
+
+Pokedex_DrawUnownModeBG: ; 409f1 (10:49f1)
+ call Pokedex_FillBackgroundColor2
+ hlcoord 2, 1
+ lb bc, 10, 13
+ call Pokedex_PlaceBorder
+ hlcoord 2, 14
+ lb bc, 1, 13
+ call Pokedex_PlaceBorder
+ hlcoord 2, 15
+ ld [hl], $3d
+ hlcoord 16, 15
+ ld [hl], $3e
+ hlcoord 6, 5
+ call Pokedex_PlaceFrontpicAtHL
+ ld de, 0
+ ld b, 0
+ ld c, 26
+.loop
+ ld hl, UnownDex
+ add hl, de
+ ld a, [hl]
+ and a
+ jr z, .done
+ push af
+ ld hl, UnownModeLetterAndCursorCoords
+rept 4
+ add hl, de
+endr
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ pop af
+ add $40 - 1 ; Unown A
+ ld [hl], a
+ inc de
+ inc b
+ dec c
+ jr nz, .loop
+.done
+ ld a, b
+ ld [wDexUnownCount], a
+ ret
+
+UnownModeLetterAndCursorCoords: ; 40a3e
+; entries correspond to Unown forms
+; letter, cursor
+ dwcoord 4,11, 3,11 ; A
+ dwcoord 4,10, 3,10 ; B
+ dwcoord 4, 9, 3, 9 ; C
+ dwcoord 4, 8, 3, 8 ; D
+ dwcoord 4, 7, 3, 7 ; E
+ dwcoord 4, 6, 3, 6 ; F
+ dwcoord 4, 5, 3, 5 ; G
+ dwcoord 4, 4, 3, 4 ; H
+ dwcoord 4, 3, 3, 2 ; I
+ dwcoord 5, 3, 5, 2 ; J
+ dwcoord 6, 3, 6, 2 ; K
+ dwcoord 7, 3, 7, 2 ; L
+ dwcoord 8, 3, 8, 2 ; M
+ dwcoord 9, 3, 9, 2 ; N
+ dwcoord 10, 3, 10, 2 ; O
+ dwcoord 11, 3, 11, 2 ; P
+ dwcoord 12, 3, 12, 2 ; Q
+ dwcoord 13, 3, 13, 2 ; R
+ dwcoord 14, 3, 15, 2 ; S
+ dwcoord 14, 4, 15, 4 ; T
+ dwcoord 14, 5, 15, 5 ; U
+ dwcoord 14, 6, 15, 6 ; V
+ dwcoord 14, 7, 15, 7 ; W
+ dwcoord 14, 8, 15, 8 ; X
+ dwcoord 14, 9, 15, 9 ; Y
+ dwcoord 14,10, 15,10 ; Z
+
+Pokedex_FillBackgroundColor2: ; 40aa6
+ hlcoord 0, 0
+ ld a, $32
+ ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
+ call ByteFill
+ ret
+
+Pokedex_PlaceFrontpicTopLeftCorner: ; 40ab2
+ hlcoord 1, 1
+Pokedex_PlaceFrontpicAtHL: ; 40ab5
+ xor a
+ ld b, $7
+.row
+ ld c, $7
+ push af
+ push hl
+.col
+ ld [hli], a
+ add $7
+ dec c
+ jr nz, .col
+ pop hl
+ ld de, SCREEN_WIDTH
+ add hl, de
+ pop af
+ inc a
+ dec b
+ jr nz, .row
+ ret
+
+Pokedex_PlaceString: ; 40acd
+.loop
+ ld a, [de]
+ cp -1
+ ret z
+ inc de
+ ld [hli], a
+ jr .loop
+
+
+Pokedex_PlaceBorder: ; 40ad5
+ push hl
+ ld a, $33
+ ld [hli], a
+ ld d, $34
+ call .FillRow
+ ld a, $35
+ ld [hl], a
+ pop hl
+ ld de, SCREEN_WIDTH
+ add hl, de
+.loop
+ push hl
+ ld a, $36
+ ld [hli], a
+ ld d, $7f
+ call .FillRow
+ ld a, $37
+ ld [hl], a
+ pop hl
+ ld de, SCREEN_WIDTH
+ add hl, de
+ dec b
+ jr nz, .loop
+ ld a, $38
+ ld [hli], a
+ ld d, $39
+ call .FillRow
+ ld a, $3a
+ ld [hl], a
+ ret
+
+.FillRow: ; 40b06
+ ld e, c
+.row_loop
+ ld a, e
+ and a
+ ret z
+ ld a, d
+ ld [hli], a
+ dec e
+ jr .row_loop
+
+
+Pokedex_PrintListing: ; 40b0f (10:4b0f)
+; Prints the list of Pokémon on the main Pokédex screen.
+
+; This check is completely useless.
+ ld a, [wCurrentDexMode]
+ cp DEXMODE_OLD
+ jr z, .okay
+ ld c, 11
+ jr .resume
+.okay
+ ld c, 11
+; End useless check
+
+.resume
+; Clear (2 * [wDexListingHeight] + 1) by 11 box starting at 0,1
+ hlcoord 0, 1
+ ld a, [wDexListingHeight]
+ add a
+ inc a
+ ld b, a
+ ld a, " "
+ call Pokedex_FillBox
+
+; Load de with wPokedexOrder + [wDexListingScrollOffset]
+ ld a, [wDexListingScrollOffset]
+ ld e, a
+ ld d, $0
+ ld hl, wPokedexOrder
+ add hl, de
+ ld e, l
+ ld d, h
+ hlcoord 0, 2
+ ld a, [wDexListingHeight]
+.loop
+ push af
+ ld a, [de]
+ ld [wd265], a
+ push de
+ push hl
+ call .PrintEntry
+ pop hl
+ ld de, 2 * SCREEN_WIDTH
+ add hl, de
+ pop de
+ inc de
+ pop af
+ dec a
+ jr nz, .loop
+ call Pokedex_LoadSelectedMonTiles
+ ret
+
+.PrintEntry: ; 40b55 (10:4b55)
+; Prints one entry in the list of Pokémon on the main Pokédex screen.
+ and a
+ ret z
+ call Pokedex_PrintNumberIfOldMode
+ call Pokedex_PlaceDefaultStringIfNotSeen
+ ret c
+ call Pokedex_PlaceCaughtSymbolIfCaught
+ push hl
+ call GetPokemonName
+ pop hl
+ call PlaceString
+ ret
+
+Pokedex_PrintNumberIfOldMode: ; 40b6a (10:4b6a)
+ ld a, [wCurrentDexMode]
+ cp DEXMODE_OLD
+ jr z, .printnum
+ ret
+
+.printnum
+ push hl
+ ld de, -SCREEN_WIDTH
+ add hl, de
+ ld de, wd265
+ lb bc, PRINTNUM_LEADINGZEROS | 1, 3
+ call PrintNum
+ pop hl
+ ret
+
+Pokedex_PlaceCaughtSymbolIfCaught: ; 40b82 (10:4b82)
+ call Pokedex_CheckCaught
+ jr nz, .place_caught_symbol
+ inc hl
+ ret
+
+.place_caught_symbol
+ ld a, $4f
+ ld [hli], a
+ ret
+
+Pokedex_PlaceDefaultStringIfNotSeen: ; 40b8d (10:4b8d)
+ call Pokedex_CheckSeen
+ ret nz
+ inc hl
+ ld de, .NameNotSeen
+ call PlaceString
+ scf
+ ret
+
+.NameNotSeen: ; 40b9a
+ db "-----@"
+
+Pokedex_DrawFootprint: ; 40ba0
+ hlcoord 18, 1
+ ld a, $62
+ ld [hli], a
+ inc a
+ ld [hl], a
+ hlcoord 18, 2
+ ld a, $64
+ ld [hli], a
+ inc a
+ ld [hl], a
+ ret
+
+
+Pokedex_GetSelectedMon: ; 40bb1
+; Gets the species of the currently selected Pokémon. This corresponds to the
+; position of the cursor in the main listing, but this function can be used
+; on all Pokédex screens.
+ ld a, [wDexListingCursor]
+ ld hl, wDexListingScrollOffset
+ add [hl]
+ ld e, a
+ ld d, $0
+ ld hl, wPokedexOrder
+ add hl, de
+ ld a, [hl]
+ ld [wd265], a
+ ret
+
+
+Pokedex_CheckCaught: ; 40bc4 (10:4bc4)
+ push de
+ push hl
+ ld a, [wd265]
+ dec a
+ call CheckCaughtMon
+ pop hl
+ pop de
+ ret
+
+
+Pokedex_CheckSeen: ; 40bd0
+ push de
+ push hl
+ ld a, [wd265]
+ dec a
+ call CheckSeenMon
+ pop hl
+ pop de
+ ret
+
+
+
+Pokedex_OrderMonsByMode: ; 40bdc
+ ld hl, wPokedexOrder
+ ld bc, wPokedexOrderEnd - wPokedexOrder
+ xor a
+ call ByteFill
+ ld a, [wCurrentDexMode]
+ ld hl, .Jumptable
+ call Pokedex_LoadPointer
+ jp hl
+
+.Jumptable: ; 40bf0 (10:4bf0)
+ dw .NewMode
+ dw .OldMode
+ dw Pokedex_ABCMode
+
+.NewMode: ; 40bf6 (10:4bf6)
+ ld de, NewPokedexOrder
+ ld hl, wPokedexOrder
+ ld c, NUM_POKEMON
+.loopnew
+ ld a, [de]
+ inc de
+ ld [hli], a
+ dec c
+ jr nz, .loopnew
+ call .FindLastSeen
+ ret
+
+.OldMode: ; 40c08 (10:4c08)
+ ld hl, wPokedexOrder
+ ld a, $1
+ ld c, NUM_POKEMON
+.loopold
+ ld [hli], a
+ inc a
+ dec c
+ jr nz, .loopold
+ call .FindLastSeen
+ ret
+
+.FindLastSeen: ; 40c18 (10:4c18)
+ ld hl, wPokedexOrder + NUM_POKEMON - 1
+ ld d, NUM_POKEMON
+ ld e, d
+.loopfindend
+ ld a, [hld]
+ ld [wd265], a
+ call Pokedex_CheckSeen
+ jr nz, .foundend
+ dec d
+ dec e
+ jr nz, .loopfindend
+.foundend
+ ld a, d
+ ld [wDexListingEnd], a
+ ret
+
+Pokedex_ABCMode: ; 40c30
+ xor a
+ ld [wDexListingEnd], a
+ ld hl, wPokedexOrder
+ ld de, AlphabeticalPokedexOrder
+ ld c, NUM_POKEMON
+.loop1abc
+ push bc
+ ld a, [de]
+ ld [wd265], a
+ call Pokedex_CheckSeen
+ jr z, .skipabc
+ ld a, [wd265]
+ ld [hli], a
+ ld a, [wDexListingEnd]
+ inc a
+ ld [wDexListingEnd], a
+
+.skipabc
+ inc de
+ pop bc
+ dec c
+ jr nz, .loop1abc
+ ld a, [wDexListingEnd]
+ ld c, 0
+.loop2abc
+ cp NUM_POKEMON
+ jr z, .doneabc
+ ld [hl], c
+ inc hl
+ inc a
+ jr .loop2abc
+
+.doneabc
+ ret
+
+
+INCLUDE "data/pokemon/dex_order_alpha.asm"
+
+INCLUDE "data/pokemon/dex_order_new.asm"
+
+
+Pokedex_DisplayModeDescription: ; 40e5b
+ xor a
+ ld [hBGMapMode], a
+ hlcoord 0, 12
+ lb bc, 4, 18
+ call Pokedex_PlaceBorder
+ ld a, [wDexArrowCursorPosIndex]
+ ld hl, .Modes
+ call Pokedex_LoadPointer
+ ld e, l
+ ld d, h
+ hlcoord 1, 14
+ call PlaceString
+ ld a, $1
+ ld [hBGMapMode], a
+ ret
+
+.Modes: ; 40e7d
+ dw .NewMode
+ dw .OldMode
+ dw .ABCMode
+ dw .UnownMode
+
+.NewMode: ; 40e85
+ db "<PK><MN> are listed by"
+ next "evolution type.@"
+
+.OldMode: ; 40ea6
+ db "<PK><MN> are listed by"
+ next "official type.@"
+
+.ABCMode: ; 40ec6
+ db "<PK><MN> are listed"
+ next "alphabetically.@"
+
+.UnownMode: ; 40ee4
+ db "UNOWN are listed"
+ next "in catching order.@"
+
+Pokedex_DisplayChangingModesMessage: ; 40f08 (10:4f08)
+ xor a
+ ld [hBGMapMode], a
+ hlcoord 0, 12
+ lb bc, 4, 18
+ call Pokedex_PlaceBorder
+ ld de, String_ChangingModesPleaseWait
+ hlcoord 1, 14
+ call PlaceString
+ ld a, $1
+ ld [hBGMapMode], a
+ ld c, 64
+ call DelayFrames
+ ld de, SFX_CHANGE_DEX_MODE
+ call PlaySFX
+ ld c, 64
+ call DelayFrames
+ ret
+
+String_ChangingModesPleaseWait: ; 40f32
+ db "Changing modes."
+ next "Please wait.@"
+
+Pokedex_UpdateSearchMonType: ; 40f4f (10:4f4f)
+ ld a, [wDexArrowCursorPosIndex]
+ cp 2
+ jr nc, .no_change
+ ld hl, hJoyLast
+ ld a, [hl]
+ and D_LEFT
+ jr nz, Pokedex_PrevSearchMonType
+ ld a, [hl]
+ and D_RIGHT
+ jr nz, Pokedex_NextSearchMonType
+.no_change
+ and a
+ ret
+
+Pokedex_PrevSearchMonType: ; 40f65
+ ld a, [wDexArrowCursorPosIndex]
+ and a
+ jr nz, .type2
+
+ ld hl, wDexSearchMonType1
+ ld a, [hl]
+ cp 1
+ jr z, .wrap_around
+ dec [hl]
+ jr .done
+
+.type2
+ ld hl, wDexSearchMonType2
+ ld a, [hl]
+ and a
+ jr z, .wrap_around
+ dec [hl]
+ jr .done
+
+.wrap_around
+ ld [hl], NUM_TYPES - 1
+
+.done
+ scf
+ ret
+
+Pokedex_NextSearchMonType: ; 40f84
+ ld a, [wDexArrowCursorPosIndex]
+ and a
+ jr nz, .type2
+
+ ld hl, wDexSearchMonType1
+ ld a, [hl]
+ cp NUM_TYPES - 1
+ jr nc, .type1_wrap_around
+ inc [hl]
+ jr .done
+.type1_wrap_around
+ ld [hl], 1
+ jr .done
+
+.type2
+ ld hl, wDexSearchMonType2
+ ld a, [hl]
+ cp NUM_TYPES - 1
+ jr nc, .type2_wrap_around
+ inc [hl]
+ jr .done
+.type2_wrap_around
+ ld [hl], 0
+
+.done
+ scf
+ ret
+
+Pokedex_PlaceSearchScreenTypeStrings: ; 40fa8 (10:4fa8)
+ xor a
+ ld [hBGMapMode], a
+ hlcoord 9, 3
+ lb bc, 4, 8
+ ld a, " "
+ call Pokedex_FillBox
+ ld a, [wDexSearchMonType1]
+ hlcoord 9, 4
+ call Pokedex_PlaceTypeString
+ ld a, [wDexSearchMonType2]
+ hlcoord 9, 6
+ call Pokedex_PlaceTypeString
+ ld a, $1
+ ld [hBGMapMode], a
+ ret
+
+Pokedex_PlaceTypeString: ; 40fcd (10:4fcd)
+ push hl
+ ld e, a
+ ld d, 0
+ ld hl, PokedexTypeSearchStrings
+rept 9
+ add hl, de
+endr
+ ld e, l
+ ld d, h
+ pop hl
+ call PlaceString
+ ret
+
+INCLUDE "data/types/search_strings.asm"
+
+Pokedex_SearchForMons: ; 41086
+ ld a, [wDexSearchMonType2]
+ and a
+ call nz, .Search
+ ld a, [wDexSearchMonType1]
+ and a
+ call nz, .Search
+ ret
+
+.Search: ; 41095
+ dec a
+ ld e, a
+ ld d, 0
+ ld hl, PokedexTypeSearchConversionTable
+ add hl, de
+ ld a, [hl]
+ ld [wDexConvertedMonType], a
+ ld hl, wPokedexOrder
+ ld de, wPokedexOrder
+ ld c, NUM_POKEMON
+ xor a
+ ld [wDexSearchResultCount], a
+.loop
+ push bc
+ ld a, [hl]
+ and a
+ jr z, .next_mon
+ ld [wd265], a
+ ld [CurSpecies], a
+ call Pokedex_CheckCaught
+ jr z, .next_mon
+ push hl
+ push de
+ call GetBaseData
+ pop de
+ pop hl
+ ld a, [wDexConvertedMonType]
+ ld b, a
+ ld a, [BaseType1]
+ cp b
+ jr z, .match_found
+ ld a, [BaseType2]
+ cp b
+ jr nz, .next_mon
+
+.match_found
+ ld a, [wd265]
+ ld [de], a
+ inc de
+ ld a, [wDexSearchResultCount]
+ inc a
+ ld [wDexSearchResultCount], a
+
+.next_mon
+ inc hl
+ pop bc
+ dec c
+ jr nz, .loop
+
+ ld l, e
+ ld h, d
+ ld a, [wDexSearchResultCount]
+ ld c, 0
+
+.zero_remaining_mons
+ cp NUM_POKEMON
+ jr z, .done
+ ld [hl], c
+ inc hl
+ inc a
+ jr .zero_remaining_mons
+
+.done
+ ret
+
+INCLUDE "data/types/search_types.asm"
+
+Pokedex_DisplayTypeNotFoundMessage: ; 41107
+ xor a
+ ld [hBGMapMode], a
+ hlcoord 0, 12
+ lb bc, 4, 18
+ call Pokedex_PlaceBorder
+ ld de, .TypeNotFound
+ hlcoord 1, 14
+ call PlaceString
+ ld a, $1
+ ld [hBGMapMode], a
+ ld c, $80
+ call DelayFrames
+ ret
+
+.TypeNotFound: ; 41126
+ db "The specified type"
+ next "was not found.@"
+
+Pokedex_UpdateCursorOAM: ; 41148 (10:5148)
+ ld a, [wCurrentDexMode]
+ cp DEXMODE_OLD
+ jp z, Pokedex_PutOldModeCursorOAM
+ call Pokedex_PutNewModeABCModeCursorOAM
+ call Pokedex_PutScrollbarOAM
+ ret
+
+Pokedex_PutOldModeCursorOAM: ; 41157 (10:5157)
+ ld hl, .CursorOAM
+ ld a, [wDexListingCursor]
+ or a
+ jr nz, .okay
+ ld hl, .CursorAtTopOAM
+.okay
+ call Pokedex_LoadCursorOAM
+ ret
+
+.CursorOAM: ; 41167
+ dsprite 3, 0, 9, -1, $30, 7
+ dsprite 2, 0, 9, -1, $31, 7
+ dsprite 2, 0, 10, -1, $32, 7
+ dsprite 2, 0, 11, -1, $32, 7
+ dsprite 2, 0, 12, -1, $32, 7
+ dsprite 2, 0, 13, -1, $33, 7
+ dsprite 2, 0, 16, -2, $33, 7 | X_FLIP
+ dsprite 2, 0, 17, -2, $32, 7 | X_FLIP
+ dsprite 2, 0, 18, -2, $32, 7 | X_FLIP
+ dsprite 2, 0, 19, -2, $32, 7 | X_FLIP
+ dsprite 2, 0, 20, -2, $31, 7 | X_FLIP
+ dsprite 3, 0, 20, -2, $30, 7 | X_FLIP
+ dsprite 4, 0, 9, -1, $30, 7 | Y_FLIP
+ dsprite 5, 0, 9, -1, $31, 7 | Y_FLIP
+ dsprite 5, 0, 10, -1, $32, 7 | Y_FLIP
+ dsprite 5, 0, 11, -1, $32, 7 | Y_FLIP
+ dsprite 5, 0, 12, -1, $32, 7 | Y_FLIP
+ dsprite 5, 0, 13, -1, $33, 7 | Y_FLIP
+ dsprite 5, 0, 16, -2, $33, 7 | X_FLIP | Y_FLIP
+ dsprite 5, 0, 17, -2, $32, 7 | X_FLIP | Y_FLIP
+ dsprite 5, 0, 18, -2, $32, 7 | X_FLIP | Y_FLIP
+ dsprite 5, 0, 19, -2, $32, 7 | X_FLIP | Y_FLIP
+ dsprite 5, 0, 20, -2, $31, 7 | X_FLIP | Y_FLIP
+ dsprite 4, 0, 20, -2, $30, 7 | X_FLIP | Y_FLIP
+ db -1
+
+.CursorAtTopOAM: ; 411c8
+; OAM data for when the cursor is at the top of the list. The tiles at the top
+; are cut off so they don't show up outside the list area.
+ dsprite 3, 0, 9, -1, $30, 7
+ dsprite 2, 0, 9, -1, $34, 7
+ dsprite 2, 0, 10, -1, $35, 7
+ dsprite 2, 0, 11, -1, $35, 7
+ dsprite 2, 0, 12, -1, $35, 7
+ dsprite 2, 0, 13, -1, $36, 7
+ dsprite 2, 0, 16, -2, $36, 7 | X_FLIP
+ dsprite 2, 0, 17, -2, $35, 7 | X_FLIP
+ dsprite 2, 0, 18, -2, $35, 7 | X_FLIP
+ dsprite 2, 0, 19, -2, $35, 7 | X_FLIP
+ dsprite 2, 0, 20, -2, $34, 7 | X_FLIP
+ dsprite 3, 0, 20, -2, $30, 7 | X_FLIP
+ dsprite 4, 0, 9, -1, $30, 7 | Y_FLIP
+ dsprite 5, 0, 9, -1, $31, 7 | Y_FLIP
+ dsprite 5, 0, 10, -1, $32, 7 | Y_FLIP
+ dsprite 5, 0, 11, -1, $32, 7 | Y_FLIP
+ dsprite 5, 0, 12, -1, $32, 7 | Y_FLIP
+ dsprite 5, 0, 13, -1, $33, 7 | Y_FLIP
+ dsprite 5, 0, 16, -2, $33, 7 | X_FLIP | Y_FLIP
+ dsprite 5, 0, 17, -2, $32, 7 | X_FLIP | Y_FLIP
+ dsprite 5, 0, 18, -2, $32, 7 | X_FLIP | Y_FLIP
+ dsprite 5, 0, 19, -2, $32, 7 | X_FLIP | Y_FLIP
+ dsprite 5, 0, 20, -2, $31, 7 | X_FLIP | Y_FLIP
+ dsprite 4, 0, 20, -2, $30, 7 | X_FLIP | Y_FLIP
+ db -1
+
+Pokedex_PutNewModeABCModeCursorOAM: ; 41229 (10:5229)
+ ld hl, .CursorOAM
+ call Pokedex_LoadCursorOAM
+ ret
+
+.CursorOAM: ; 41230
+ dsprite 3, 3, 9, -1, $30, 7
+ dsprite 2, 3, 9, -1, $31, 7
+ dsprite 2, 3, 10, -1, $32, 7
+ dsprite 2, 3, 11, -1, $32, 7
+ dsprite 2, 3, 12, -1, $33, 7
+ dsprite 2, 3, 16, 0, $33, 7 | X_FLIP
+ dsprite 2, 3, 17, 0, $32, 7 | X_FLIP
+ dsprite 2, 3, 18, 0, $32, 7 | X_FLIP
+ dsprite 2, 3, 19, 0, $31, 7 | X_FLIP
+ dsprite 3, 3, 19, 0, $30, 7 | X_FLIP
+ dsprite 4, 3, 9, -1, $30, 7 | Y_FLIP
+ dsprite 5, 3, 9, -1, $31, 7 | Y_FLIP
+ dsprite 5, 3, 10, -1, $32, 7 | Y_FLIP
+ dsprite 5, 3, 11, -1, $32, 7 | Y_FLIP
+ dsprite 5, 3, 12, -1, $33, 7 | Y_FLIP
+ dsprite 5, 3, 16, 0, $33, 7 | X_FLIP | Y_FLIP
+ dsprite 5, 3, 17, 0, $32, 7 | X_FLIP | Y_FLIP
+ dsprite 5, 3, 18, 0, $32, 7 | X_FLIP | Y_FLIP
+ dsprite 5, 3, 19, 0, $31, 7 | X_FLIP | Y_FLIP
+ dsprite 4, 3, 19, 0, $30, 7 | X_FLIP | Y_FLIP
+ db -1
+
+Pokedex_UpdateSearchResultsCursorOAM: ; 41281 (10:5281)
+ ld a, [wCurrentDexMode]
+ cp DEXMODE_OLD
+ jp z, Pokedex_PutOldModeCursorOAM
+ ld hl, .CursorOAM
+ call Pokedex_LoadCursorOAM
+ ret
+
+.CursorOAM: ; 41290
+ dsprite 3, 3, 9, -1, $30, 7
+ dsprite 2, 3, 9, -1, $31, 7
+ dsprite 2, 3, 10, -1, $32, 7
+ dsprite 2, 3, 11, -1, $32, 7
+ dsprite 2, 3, 12, -1, $32, 7
+ dsprite 2, 3, 13, -1, $33, 7
+ dsprite 2, 3, 16, -2, $33, 7 | X_FLIP
+ dsprite 2, 3, 17, -2, $32, 7 | X_FLIP
+ dsprite 2, 3, 18, -2, $32, 7 | X_FLIP
+ dsprite 2, 3, 19, -2, $32, 7 | X_FLIP
+ dsprite 2, 3, 20, -2, $31, 7 | X_FLIP
+ dsprite 3, 3, 20, -2, $30, 7 | X_FLIP
+ dsprite 4, 3, 9, -1, $30, 7 | Y_FLIP
+ dsprite 5, 3, 9, -1, $31, 7 | Y_FLIP
+ dsprite 5, 3, 10, -1, $32, 7 | Y_FLIP
+ dsprite 5, 3, 11, -1, $32, 7 | Y_FLIP
+ dsprite 5, 3, 12, -1, $32, 7 | Y_FLIP
+ dsprite 5, 3, 13, -1, $33, 7 | Y_FLIP
+ dsprite 5, 3, 16, -2, $33, 7 | X_FLIP | Y_FLIP
+ dsprite 5, 3, 17, -2, $32, 7 | X_FLIP | Y_FLIP
+ dsprite 5, 3, 18, -2, $32, 7 | X_FLIP | Y_FLIP
+ dsprite 5, 3, 19, -2, $32, 7 | X_FLIP | Y_FLIP
+ dsprite 5, 3, 20, -2, $31, 7 | X_FLIP | Y_FLIP
+ dsprite 4, 3, 20, -2, $30, 7 | X_FLIP | Y_FLIP
+ db -1
+
+Pokedex_LoadCursorOAM: ; 412f1 (10:52f1)
+ ld de, Sprite01
+.loop
+ ld a, [hl]
+ cp -1
+ ret z
+ ld a, [wDexListingCursor]
+ and $7
+ swap a
+ add [hl] ; y
+ inc hl
+ ld [de], a
+ inc de
+ ld a, [hli] ; x
+ ld [de], a
+ inc de
+ ld a, [hli] ; tile id
+ ld [de], a
+ inc de
+ ld a, [hli] ; attributes
+ ld [de], a
+ inc de
+ jr .loop
+
+Pokedex_PutScrollbarOAM: ; 4130e (10:530e)
+; Writes the OAM data for the scrollbar in the new mode and ABC mode.
+ push de
+ ld a, [wDexListingEnd]
+ dec a
+ ld e, a
+ ld a, [wDexListingCursor]
+ ld hl, wDexListingScrollOffset
+ add [hl]
+ cp e
+ jr z, .asm_4133f
+ ld hl, $0
+ ld bc, $79
+ call AddNTimes
+ ld e, l
+ ld d, h
+ ld b, $0
+ ld a, d
+ or e
+ jr z, .asm_41341
+ ld a, [wDexListingEnd]
+ ld c, a
+.asm_41333
+ ld a, e
+ sub c
+ ld e, a
+ ld a, d
+ sbc $0
+ ld d, a
+ jr c, .asm_41341
+ inc b
+ jr .asm_41333
+.asm_4133f
+ ld b, $79
+.asm_41341
+ ld a, $14
+ add b
+ pop hl
+ ld [hli], a
+ ld a, $a1
+ ld [hli], a
+ ld a, $f
+ ld [hli], a
+ ld [hl], $0
+ ret
+
+Pokedex_InitArrowCursor: ; 4134f (10:534f)
+ xor a
+ ld [wDexArrowCursorPosIndex], a
+ ld [wDexArrowCursorDelayCounter], a
+ ld [wDexArrowCursorBlinkCounter], a
+ ret
+
+Pokedex_MoveArrowCursor: ; 4135a (10:535a)
+; bc = [de] - 1
+ ld a, [de]
+ ld b, a
+ inc de
+ ld a, [de]
+ dec a
+ ld c, a
+ inc de
+ call Pokedex_BlinkArrowCursor
+
+ ld hl, hJoyPressed
+ ld a, [hl]
+ and D_LEFT | D_UP
+ and b
+ jr nz, .move_left_or_up
+ ld a, [hl]
+ and D_RIGHT | D_DOWN
+ and b
+ jr nz, .move_right_or_down
+ ld a, [hl]
+ and SELECT
+ and b
+ jr nz, .select
+ call Pokedex_ArrowCursorDelay
+ jr c, .no_action
+ ld hl, hJoyLast
+ ld a, [hl]
+ and D_LEFT | D_UP
+ and b
+ jr nz, .move_left_or_up
+ ld a, [hl]
+ and D_RIGHT | D_DOWN
+ and b
+ jr nz, .move_right_or_down
+ jr .no_action
+
+.move_left_or_up
+ ld a, [wDexArrowCursorPosIndex]
+ and a
+ jr z, .no_action
+ call Pokedex_GetArrowCursorPos
+ ld [hl], " "
+ ld hl, wDexArrowCursorPosIndex
+ dec [hl]
+ jr .update_cursor_pos
+
+.move_right_or_down
+ ld a, [wDexArrowCursorPosIndex]
+ cp c
+ jr nc, .no_action
+ call Pokedex_GetArrowCursorPos
+ ld [hl], " "
+ ld hl, wDexArrowCursorPosIndex
+ inc [hl]
+
+.update_cursor_pos
+ call Pokedex_GetArrowCursorPos
+ ld [hl], "▶"
+ ld a, 12
+ ld [wDexArrowCursorDelayCounter], a
+ xor a
+ ld [wDexArrowCursorBlinkCounter], a
+ scf
+ ret
+
+.no_action
+ and a
+ ret
+
+.select
+ call Pokedex_GetArrowCursorPos
+ ld [hl], " "
+ ld a, [wDexArrowCursorPosIndex]
+ cp c
+ jr c, .update
+ ld a, -1
+.update
+ inc a
+ ld [wDexArrowCursorPosIndex], a
+ jr .update_cursor_pos
+
+Pokedex_GetArrowCursorPos: ; 413d4 (10:53d4)
+ ld a, [wDexArrowCursorPosIndex]
+ add a
+ ld l, a
+ ld h, 0
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ret
+
+Pokedex_BlinkArrowCursor: ; 413e0 (10:53e0)
+ ld hl, wDexArrowCursorBlinkCounter
+ ld a, [hl]
+ inc [hl]
+ and $8
+ jr z, .blink_on
+ call Pokedex_GetArrowCursorPos
+ ld [hl], " "
+ ret
+
+.blink_on
+ call Pokedex_GetArrowCursorPos
+ ld [hl], "▶"
+ ret
+
+Pokedex_ArrowCursorDelay: ; 413f5 (10:53f5)
+; Updates the delay counter set when moving the arrow cursor.
+; Returns whether the delay is active in carry.
+ ld hl, wDexArrowCursorDelayCounter
+ ld a, [hl]
+ and a
+ ret z
+
+ dec [hl]
+ scf
+ ret
+
+Pokedex_FillBox: ; 413fe (10:53fe)
+ jp FillBoxWithByte
+
+Pokedex_BlackOutBG: ; 41401 (10:5401)
+; Make BG palettes black so that the BG becomes all black.
+ ld a, [rSVBK]
+ push af
+ ld a, BANK(wBGPals1)
+ ld [rSVBK], a
+ ld hl, wBGPals1
+ ld bc, 8 palettes
+ xor a
+ call ByteFill
+ pop af
+ ld [rSVBK], a
+
+Pokedex_ApplyPrintPals: ; 41415
+ ld a, $ff
+ call DmgToCgbBGPals
+ ld a, $ff
+ call DmgToCgbObjPal0
+ call DelayFrame
+ ret
+
+Pokedex_GetSGBLayout: ; 41423
+ ld b, a
+ call GetSGBLayout
+
+Pokedex_ApplyUsualPals: ; 41427
+; This applies the palettes used for most Pokédex screens.
+ ld a, $e4
+ call DmgToCgbBGPals
+ ld a, $e0
+ call DmgToCgbObjPal0
+ ret
+
+
+Pokedex_LoadPointer: ; 41432
+ ld e, a
+ ld d, 0
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ret
+
+Pokedex_LoadSelectedMonTiles: ; 4143b
+; Loads the tiles of the currently selected Pokémon.
+ call Pokedex_GetSelectedMon
+ call Pokedex_CheckSeen
+ jr z, .QuestionMark
+ ld a, [wFirstUnownSeen]
+ ld [UnownLetter], a
+ ld a, [wd265]
+ ld [CurPartySpecies], a
+ call GetBaseData
+ ld de, vTiles2
+ predef GetMonFrontpic
+ ret
+
+.QuestionMark:
+ ld a, BANK(sScratch)
+ call GetSRAMBank
+ farcall LoadQuestionMarkPic
+ ld hl, vTiles2
+ ld de, sScratch
+ ld c, 7 * 7
+ ld a, [hROMBank]
+ ld b, a
+ call Get2bpp
+ call CloseSRAM
+ ret
+
+
+Pokedex_LoadCurrentFootprint: ; 41478 (10:5478)
+ call Pokedex_GetSelectedMon
+
+Pokedex_LoadAnyFootprint: ; 4147b
+ ld a, [wd265]
+ dec a
+ and %11111000
+ srl a
+ srl a
+ srl a
+ ld e, 0
+ ld d, a
+ ld a, [wd265]
+ dec a
+ and %111
+ swap a ; * $10
+ ld l, a
+ ld h, 0
+ add hl, de
+ ld de, Footprints
+ add hl, de
+
+ push hl
+ ld e, l
+ ld d, h
+ ld hl, vTiles2 tile $62
+ lb bc, BANK(Footprints), 2
+ call Request1bpp
+ pop hl
+
+ ; Whoever was editing footprints forgot to fix their
+ ; tile editor. Now each bottom half is 8 tiles off.
+ ld de, 8 tiles
+ add hl, de
+
+ ld e, l
+ ld d, h
+ ld hl, vTiles2 tile $64
+ lb bc, BANK(Footprints), 2
+ call Request1bpp
+
+ ret
+
+
+Pokedex_LoadGFX: ; 414b7
+ call DisableLCD
+ ld hl, vTiles2
+ ld bc, $31 tiles
+ xor a
+ call ByteFill
+ call Pokedex_LoadInvertedFont
+ call LoadFontsExtra
+ ld hl, vTiles2 tile $60
+ ld bc, $20 tiles
+ call Pokedex_InvertTiles
+ call Pokedex_CheckSGB
+ jr nz, .LoadPokedexLZ
+ farcall LoadSGBPokedexGFX
+ jr .LoadPokedexSlowpokeLZ
+
+.LoadPokedexLZ:
+ ld hl, PokedexLZ
+ ld de, vTiles2 tile $31
+ call Decompress
+
+.LoadPokedexSlowpokeLZ:
+ ld hl, PokedexSlowpokeLZ
+ ld de, vTiles0
+ call Decompress
+ ld a, 6
+ call SkipMusic
+ call EnableLCD
+ ret
+
+Pokedex_LoadInvertedFont: ; 414fb
+ call LoadStandardFont
+ ld hl, vTiles1
+ ld bc, $80 tiles
+
+Pokedex_InvertTiles: ; 41504
+.loop
+ ld a, [hl]
+ xor $ff
+ ld [hli], a
+ dec bc
+ ld a, b
+ or c
+ jr nz, .loop
+ ret
+
+PokedexLZ: ; 4150e
+INCBIN "gfx/pokedex/pokedex.2bpp.lz"
+
+PokedexSlowpokeLZ: ; 416b0
+INCBIN "gfx/pokedex/slowpoke.2bpp.lz"
+
+Pokedex_CheckSGB: ; 41a24
+ ld a, [hCGB]
+ or a
+ ret nz
+ ld a, [hSGB]
+ dec a
+ ret
+
+Pokedex_LoadUnownFont: ; 41a2c
+ ld a, BANK(sScratch)
+ call GetSRAMBank
+ ld hl, UnownFont
+ ld de, sScratch + $188
+ ld bc, 39 tiles
+ ld a, BANK(UnownFont)
+ call FarCopyBytes
+ ld hl, sScratch + $188
+ ld bc, 27 tiles
+ call Pokedex_InvertTiles
+ ld de, sScratch + $188
+ ld hl, vTiles2 tile $40
+ lb bc, BANK(Pokedex_LoadUnownFont), 27
+ call Request2bpp
+ call CloseSRAM
+ ret
+
+Pokedex_LoadUnownFrontpicTiles: ; 41a58 (10:5a58)
+ ld a, [UnownLetter]
+ push af
+ ld a, [wDexCurrentUnownIndex]
+ ld e, a
+ ld d, 0
+ ld hl, UnownDex
+ add hl, de
+ ld a, [hl]
+ ld [UnownLetter], a
+ ld a, UNOWN
+ ld [CurPartySpecies], a
+ call GetBaseData
+ ld de, vTiles2 tile $00
+ predef GetMonFrontpic
+ pop af
+ ld [UnownLetter], a
+ ret
+
+_NewPokedexEntry: ; 41a7f
+ xor a
+ ld [hBGMapMode], a
+ farcall DrawDexEntryScreenRightEdge
+ call Pokedex_ResetBGMapMode
+ call DisableLCD
+ call LoadStandardFont
+ call LoadFontsExtra
+ call Pokedex_LoadGFX
+ call Pokedex_LoadAnyFootprint
+ ld a, [wd265]
+ ld [CurPartySpecies], a
+ call Pokedex_DrawDexEntryScreenBG
+ call Pokedex_DrawFootprint
+ hlcoord 0, 17
+ ld [hl], $3b
+ inc hl
+ ld bc, 19
+ ld a, " "
+ call ByteFill
+ farcall DisplayDexEntry
+ call EnableLCD
+ call WaitBGMap
+ call GetBaseData
+ ld de, vTiles2
+ predef GetMonFrontpic
+ ld a, SCGB_POKEDEX
+ call Pokedex_GetSGBLayout
+ ld a, [CurPartySpecies]
+ call PlayMonCry
+ ret
+
+
+Pokedex_SetBGMapMode3: ; 41ad7 (10:5ad7)
+ ld a, $3
+ ld [hBGMapMode], a
+ ld c, 4
+ call DelayFrames
+ ret
+
+Pokedex_SetBGMapMode4: ; 41ae1 (10:5ae1)
+ ld a, $4
+ ld [hBGMapMode], a
+ ld c, 4
+ call DelayFrames
+ ret
+
+Pokedex_SetBGMapMode_3ifDMG_4ifCGB: ; 41aeb (10:5aeb)
+ ld a, [hCGB]
+ and a
+ jr z, .DMG
+ call Pokedex_SetBGMapMode4
+.DMG:
+ call Pokedex_SetBGMapMode3
+ ret
+
+
+Pokedex_ResetBGMapMode: ; 41af7
+ xor a
+ ld [hBGMapMode], a
+ ret