diff options
Diffstat (limited to 'engine/menu/pokedex.asm')
-rwxr-xr-x | engine/menu/pokedex.asm | 676 |
1 files changed, 676 insertions, 0 deletions
diff --git a/engine/menu/pokedex.asm b/engine/menu/pokedex.asm new file mode 100755 index 00000000..dbb9f57f --- /dev/null +++ b/engine/menu/pokedex.asm @@ -0,0 +1,676 @@ +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" |