shithub: pokered

ref: 7911bc130943392a9aa901139c924aa9658e015f
dir: /engine/menu/pokedex.asm/

View raw version
DisplayPokedexMenu_: ; 40000 (10:4000)
	call GBPalWhiteOut
	call ClearScreen
	call UpdateSprites ; move sprites
	ld a,[wListScrollOffset]
	push af
	xor a
	ld [wCurrentMenuItem],a
	ld [wListScrollOffset],a
	ld [wLastMenuItem],a
	inc a
	ld [$d11e],a
	ld [$ffb7],a
.setUpGraphics
	ld b,$08
	call GoPAL_SET
	callab LoadPokedexTilePatterns
.doPokemonListMenu
	ld hl,wTopMenuItemY
	ld a,3
	ld [hli],a ; top menu item Y
	xor a
	ld [hli],a ; top menu item X
	inc a
	ld [$cc37],a
	inc hl
	inc hl
	ld a,6
	ld [hli],a ; max menu item ID
	ld [hl],%00110011 ; menu watched keys (Left, Right, B button, A  button)
	call HandlePokedexListMenu
	jr c,.goToSideMenu ; if the player chose a pokemon from the list
.exitPokedex
	xor a
	ld [$cc37],a
	ld [wCurrentMenuItem],a
	ld [wLastMenuItem],a
	ld [$ffb7],a
	ld [$cd3a],a
	ld [$cd3b],a
	pop af
	ld [wListScrollOffset],a
	call GBPalWhiteOutWithDelay3
	call GoPAL_SET_CF1C
	jp ReloadMapData
.goToSideMenu
	call HandlePokedexSideMenu
	dec b
	jr z,.exitPokedex ; if the player chose Quit
	dec b
	jr z,.doPokemonListMenu ; if pokemon not seen or player pressed B button
	jp .setUpGraphics ; if pokemon data or area was shown

; handles the menu on the lower right in the pokedex screen
; OUTPUT:
; b = reason for exiting menu
; 00: showed pokemon data or area
; 01: the player chose Quit
; 02: the pokemon has not been seen yet or the player pressed the B button
HandlePokedexSideMenu: ; 4006d (10:406d)
	call PlaceUnfilledArrowMenuCursor
	ld a,[wCurrentMenuItem]
	push af
	ld b,a
	ld a,[wLastMenuItem]
	push af
	ld a,[wListScrollOffset]
	push af
	add b
	inc a
	ld [$d11e],a
	ld a,[$d11e]
	push af
	ld a,[$cd3d]
	push af
	ld hl,wPokedexSeen
	call IsPokemonBitSet
	ld b,2
	jr z,.exitSideMenu
	call PokedexToIndex
	ld hl,wTopMenuItemY
	ld a,10
	ld [hli],a ; top menu item Y
	ld a,15
	ld [hli],a ; top menu item X
	xor a
	ld [hli],a ; current menu item ID
	inc hl
	ld a,3
	ld [hli],a ; max menu item ID
	ld [hli],a ; menu watched keys (A button and B button)
	xor a
	ld [hli],a ; old menu item ID
	ld [$cc37],a
.handleMenuInput
	call HandleMenuInput
	bit 1,a ; was the B button pressed?
	ld b,2
	jr nz,.buttonBPressed
	ld a,[wCurrentMenuItem]
	and a
	jr z,.choseData
	dec a
	jr z,.choseCry
	dec a
	jr z,.choseArea
.choseQuit
	ld b,1
.exitSideMenu
	pop af
	ld [$cd3d],a
	pop af
	ld [$d11e],a
	pop af
	ld [wListScrollOffset],a
	pop af
	ld [wLastMenuItem],a
	pop af
	ld [wCurrentMenuItem],a
	push bc
	FuncCoord 0,3
	ld hl,Coord
	ld de,20
	ld bc,$7f0d ; 13 blank tiles
	call DrawTileLine ; cover up the menu cursor in the pokemon list
	pop bc
	ret
.buttonBPressed
	push bc
	FuncCoord 15,10
	ld hl,Coord
	ld de,20
	ld bc,$7f07 ; 7 blank tiles
	call DrawTileLine ; cover up the menu cursor in the side menu
	pop bc
	jr .exitSideMenu
.choseData
	call ShowPokedexDataInternal
	ld b,0
	jr .exitSideMenu
; play pokemon cry
.choseCry
	ld a,[$d11e]
	call GetCryData ; get cry data
	call PlaySound ; play sound
	jr .handleMenuInput
.choseArea
	ld a,$4a
	call Predef ; display pokemon areas
	ld b,0
	jr .exitSideMenu

; handles the list of pokemon on the left of the pokedex screen
; sets carry flag if player presses A, unsets carry flag if player presses B
HandlePokedexListMenu: ; 40111 (10:4111)
	xor a
	ld [H_AUTOBGTRANSFERENABLED],a
; draw the horizontal line separating the seen and owned amounts from the menu
	FuncCoord 15,8
	ld hl,Coord
	ld a,$7a ; horizontal line tile
	ld [hli],a
	ld [hli],a
	ld [hli],a
	ld [hli],a
	ld [hli],a
	FuncCoord 14,0
	ld hl,Coord
	ld [hl],$71 ; vertical line tile
	FuncCoord 14,1
	ld hl,Coord
	call DrawPokedexVerticalLine
	FuncCoord 14,9
	ld hl,Coord
	call DrawPokedexVerticalLine
	ld hl,wPokedexSeen
	ld b,wPokedexSeenEnd - wPokedexSeen
	call CountSetBits
	ld de,$d11e
	FuncCoord 16,3
	ld hl,Coord
	ld bc,$0103
	call PrintNumber ; print number of seen pokemon
	ld hl,wPokedexOwned
	ld b,wPokedexOwnedEnd - wPokedexOwned
	call CountSetBits
	ld de,$d11e
	FuncCoord 16,6
	ld hl,Coord
	ld bc,$0103
	call PrintNumber ; print number of owned pokemon
	FuncCoord 16,2
	ld hl,Coord
	ld de,PokedexSeenText
	call PlaceString
	FuncCoord 16,5
	ld hl,Coord
	ld de,PokedexOwnText
	call PlaceString
	FuncCoord 1,1
	ld hl,Coord
	ld de,PokedexContentsText
	call PlaceString
	FuncCoord 16,10
	ld hl,Coord
	ld de,PokedexMenuItemsText
	call PlaceString
; find the highest pokedex number among the pokemon the player has seen
	ld hl,wPokedexSeenEnd - 1
	ld b,153
.maxSeenPokemonLoop
	ld a,[hld]
	ld c,8
.maxSeenPokemonInnerLoop
	dec b
	sla a
	jr c,.storeMaxSeenPokemon
	dec c
	jr nz,.maxSeenPokemonInnerLoop
	jr .maxSeenPokemonLoop
.storeMaxSeenPokemon
	ld a,b
	ld [$cd3d],a ; max seen pokemon
.loop
	xor a
	ld [H_AUTOBGTRANSFERENABLED],a
	FuncCoord 4,2
	ld hl,Coord
	ld bc,$0e0a
	call ClearScreenArea
	FuncCoord 1,3
	ld hl,Coord
	ld a,[wListScrollOffset]
	ld [$d11e],a
	ld d,7
	ld a,[$cd3d]
	cp a,7
	jr nc,.printPokemonLoop
	ld d,a
	dec a
	ld [wMaxMenuItem],a
; loop to print pokemon pokedex numbers and names
; if the player has owned the pokemon, it puts a pokeball beside the name
.printPokemonLoop
	ld a,[$d11e]
	inc a
	ld [$d11e],a
	push af
	push de
	push hl
	ld de,-20
	add hl,de
	ld de,$d11e
	ld bc,$8103
	call PrintNumber ; print the pokedex number
	ld de,20
	add hl,de
	dec hl
	push hl
	ld hl,wPokedexOwned
	call IsPokemonBitSet
	pop hl
	ld a," "
	jr z,.writeTile
	ld a,$72 ; pokeball tile
.writeTile
	ld [hl],a ; put a pokeball next to pokemon that the player has owned
	push hl
	ld hl,wPokedexSeen
	call IsPokemonBitSet
	jr nz,.getPokemonName ; if the player has seen the pokemon
	ld de,.dashedLine ; print a dashed line in place of the name if the player hasn't seen the pokemon
	jr .skipGettingName
.dashedLine ; for unseen pokemon in the list
	db "----------@"
.getPokemonName
	call PokedexToIndex
	call GetMonName
.skipGettingName
	pop hl
	inc hl
	call PlaceString
	pop hl
	ld bc,2 * 20
	add hl,bc
	pop de
	pop af
	ld [$d11e],a
	dec d
	jr nz,.printPokemonLoop
	ld a,01
	ld [H_AUTOBGTRANSFERENABLED],a
	call Delay3
	call GBPalNormal
	call HandleMenuInput
	bit 1,a ; was the B button pressed?
	jp nz,.buttonBPressed
.checkIfUpPressed
	bit 6,a ; was Up pressed?
	jr z,.checkIfDownPressed
.upPressed ; scroll up one row
	ld a,[wListScrollOffset]
	and a
	jp z,.loop
	dec a
	ld [wListScrollOffset],a
	jp .loop
.checkIfDownPressed
	bit 7,a ; was Down pressed?
	jr z,.checkIfRightPressed
.downPressed ; scroll down one row
	ld a,[$cd3d]
	cp a,7
	jp c,.loop
	sub a,7
	ld b,a
	ld a,[wListScrollOffset]
	cp b
	jp z,.loop
	inc a
	ld [wListScrollOffset],a
	jp .loop
.checkIfRightPressed
	bit 4,a ; was Right pressed?
	jr z,.checkIfLeftPressed
.rightPressed ; scroll down 7 rows
	ld a,[$cd3d]
	cp a,7
	jp c,.loop
	sub a,6
	ld b,a
	ld a,[wListScrollOffset]
	add a,7
	ld [wListScrollOffset],a
	cp b
	jp c,.loop
	dec b
	ld a,b
	ld [wListScrollOffset],a
	jp .loop
.checkIfLeftPressed ; scroll up 7 rows
	bit 5,a ; was Left pressed?
	jr z,.buttonAPressed
.leftPressed
	ld a,[wListScrollOffset]
	sub a,7
	ld [wListScrollOffset],a
	jp nc,.loop
	xor a
	ld [wListScrollOffset],a
	jp .loop
.buttonAPressed
	scf
	ret
.buttonBPressed
	and a
	ret

DrawPokedexVerticalLine: ; 4028e (10:428e)
	ld c,9 ; height of line
	ld de,20 ; width of screen
	ld a,$71 ; vertical line tile
.loop
	ld [hl],a
	add hl,de
	xor a,1 ; toggle between vertical line tile and box tile
	dec c
	jr nz,.loop
	ret

PokedexSeenText: ; 4029d (10:429d)
	db "SEEN@"

PokedexOwnText: ; 402a2 (10:42a2)
	db "OWN@"

PokedexContentsText: ; 402a6 (10:42a6)
	db "CONTENTS@"

PokedexMenuItemsText: ; 402af (10:42af)
	db   "DATA"
	next "CRY"
	next "AREA"
	next "QUIT@"

; tests if a pokemon's bit is set in the seen or owned pokemon bit fields
; INPUT:
; [$d11e] = pokedex number
; hl = address of bit field
IsPokemonBitSet: ; 402c2 (10:42c2)
	ld a,[$d11e]
	dec a
	ld c,a
	ld b,2
	ld a,$10
	call Predef
	ld a,c
	and a
	ret

; function to display pokedex data from outside the pokedex
ShowPokedexData: ; 402d1 (10:42d1)
	call GBPalWhiteOutWithDelay3
	call ClearScreen
	call UpdateSprites
	callab LoadPokedexTilePatterns ; load pokedex tiles

; function to display pokedex data from inside the pokedex
ShowPokedexDataInternal: ; 402e2 (10:42e2)
	ld hl,$d72c
	set 1,[hl]
	ld a,$33 ; 3/7 volume
	ld [$ff24],a
	call GBPalWhiteOut ; zero all palettes
	call ClearScreen
	ld a,[$d11e] ; pokemon ID
	ld [$cf91],a
	push af
	ld b,04
	call GoPAL_SET
	pop af
	ld [$d11e],a
	ld a,[$ffd7]
	push af
	xor a
	ld [$ffd7],a
	FuncCoord 0,0
	ld hl,Coord
	ld de,1
	ld bc,$6414
	call DrawTileLine ; draw top border
	FuncCoord 0,17
	ld hl,Coord
	ld b,$6f
	call DrawTileLine ; draw bottom border
	FuncCoord 0,1
	ld hl,Coord
	ld de,20
	ld bc,$6610
	call DrawTileLine ; draw left border
	FuncCoord 19,1
	ld hl,Coord
	ld b,$67
	call DrawTileLine ; draw right border
	FuncCoord 0,0
	ld a,$63 ; upper left corner tile
	ld [Coord],a
	FuncCoord 19,0
	ld a,$65 ; upper right corner tile
	ld [Coord],a
	FuncCoord 0,17
	ld a,$6c ; lower left corner tile
	ld [Coord],a
	FuncCoord 19,17
	ld a,$6e ; lower right corner tile
	ld [Coord],a
	FuncCoord 0,9
	ld hl,Coord
	ld de,PokedexDataDividerLine
	call PlaceString ; draw horizontal divider line
	FuncCoord 9,6
	ld hl,Coord
	ld de,HeightWeightText
	call PlaceString
	call GetMonName
	FuncCoord 9,2
	ld hl,Coord
	call PlaceString
	ld hl,PokedexEntryPointers
	ld a,[$d11e]
	dec a
	ld e,a
	ld d,0
	add hl,de
	add hl,de
	ld a,[hli]
	ld e,a
	ld d,[hl] ; de = address of pokedex entry
	FuncCoord 9,4
	ld hl,Coord
	call PlaceString ; print species name
	ld h,b
	ld l,c
	push de
	ld a,[$d11e]
	push af
	call IndexToPokedex
	FuncCoord 2,8
	ld hl,Coord
	ld a, "№"
	ld [hli],a
	ld a,$f2
	ld [hli],a
	ld de,$d11e
	ld bc,$8103
	call PrintNumber ; print pokedex number
	ld hl,wPokedexOwned
	call IsPokemonBitSet
	pop af
	ld [$d11e],a
	ld a,[$cf91]
	ld [$d0b5],a
	pop de
	push af
	push bc
	push de
	push hl
	call Delay3
	call GBPalNormal
	call GetMonHeader ; load pokemon picture location
	FuncCoord 1,1
	ld hl,Coord
	call LoadFlippedFrontSpriteByMonIndex ; draw pokemon picture
	ld a,[$cf91]
	call PlayCry ; play pokemon cry
	pop hl
	pop de
	pop bc
	pop af
	ld a,c
	and a
	jp z,.waitForButtonPress ; if the pokemon has not been owned, don't print the height, weight, or description
	inc de ; de = address of feet (height)
	ld a,[de] ; reads feet, but a is overwritten without being used
	FuncCoord 12,6
	ld hl,Coord
	ld bc,$0102
	call PrintNumber ; print feet (height)
	ld a,$60 ; feet symbol tile (one tick)
	ld [hl],a
	inc de
	inc de ; de = address of inches (height)
	FuncCoord 15,6
	ld hl,Coord
	ld bc,$8102
	call PrintNumber ; print inches (height)
	ld a,$61 ; inches symbol tile (two ticks)
	ld [hl],a
; now print the weight (note that weight is stored in tenths of pounds internally)
	inc de
	inc de
	inc de ; de = address of upper byte of weight
	push de
; put weight in big-endian order at $ff8b
	ld hl,$ff8b
	ld a,[hl] ; save existing value of [$ff8b]
	push af
	ld a,[de] ; a = upper byte of weight
	ld [hli],a ; store upper byte of weight in [$ff8b]
	ld a,[hl] ; save existing value of [$ff8c]
	push af
	dec de
	ld a,[de] ; a = lower byte of weight
	ld [hl],a ; store lower byte of weight in [$ff8c]
	FuncCoord 11,8
	ld de,$ff8b
	ld hl,Coord
	ld bc,$0205 ; no leading zeroes, right-aligned, 2 bytes, 5 digits
	call PrintNumber ; print weight
	FuncCoord 14,8
	ld hl,Coord
	ld a,[$ff8c]
	sub a,10
	ld a,[$ff8b]
	sbc a,0
	jr nc,.next
	ld [hl],"0" ; if the weight is less than 10, put a 0 before the decimal point
.next
	inc hl
	ld a,[hli]
	ld [hld],a ; make space for the decimal point by moving the last digit forward one tile
	ld [hl],$f2 ; decimal point tile
	pop af
	ld [$ff8c],a ; restore original value of [$ff8c]
	pop af
	ld [$ff8b],a ; restore original value of [$ff8b]
	pop hl
	inc hl ; hl = address of pokedex description text
	FuncCoord 1,11
	ld bc,Coord
	ld a,2
	ld [$fff4],a
	call TextCommandProcessor ; print pokedex description text
	xor a
	ld [$fff4],a
.waitForButtonPress
	call GetJoypadStateLowSensitivity
	ld a,[$ffb5]
	and a,%00000011 ; A button and B button
	jr z,.waitForButtonPress
	pop af
	ld [$ffd7],a
	call GBPalWhiteOut
	call ClearScreen
	call GoPAL_SET_CF1C
	call LoadTextBoxTilePatterns
	call GBPalNormal
	ld hl,$d72c
	res 1,[hl]
	ld a,$77 ; max volume
	ld [$ff24],a
	ret

HeightWeightText: ; 40448 (10:4448)
	db "HT  ?",$60,"??",$61,$4E,"WT   ???lb@"

; XXX does anything point to this?
Unknown_4045D: ; 4045d (10:445d)
	db $54,$50

; horizontal line that divides the pokedex text description from the rest of the data
PokedexDataDividerLine: ; 4045f (10:445f)
	db $68,$69,$6B,$69,$6B
	db $69,$6B,$69,$6B,$6B
	db $6B,$6B,$69,$6B,$69
	db $6B,$69,$6B,$69,$6A
	db $50

; draws a line of tiles
; INPUT:
; b = tile ID
; c = number of tile ID's to write
; de = amount to destination address after each tile (1 for horizontal, 20 for vertical)
; hl = destination address
DrawTileLine: ; 40474 (10:4474)
	push bc
	push de
.loop
	ld [hl],b
	add hl,de
	dec c
	jr nz,.loop
	pop de
	pop bc
	ret

INCLUDE "data/pokedex_entries.asm"

PokedexToIndex: ; 40ff9 (10:4ff9)
	; converts the Pokédex number at $D11E to an index
	push bc
	push hl
	ld a,[$D11E]
	ld b,a
	ld c,0
	ld hl,PokedexOrder

.loop ; go through the list until we find an entry with a matching dex number
	inc c
	ld a,[hli]
	cp b
	jr nz,.loop

	ld a,c
	ld [$D11E],a
	pop hl
	pop bc
	ret

IndexToPokedex: ; 41010 (10:5010)
	; converts the indexédex number at $D11E to a Pokédex number
	push bc
	push hl
	ld a,[$D11E]
	dec a
	ld hl,PokedexOrder
	ld b,0
	ld c,a
	add hl,bc
	ld a,[hl]
	ld [$D11E],a
	pop hl
	pop bc
	ret

INCLUDE "data/pokedex_order.asm"