diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/pokedex.c | 1281 |
1 files changed, 1280 insertions, 1 deletions
diff --git a/src/pokedex.c b/src/pokedex.c index a74594865..3b4f193bb 100644 --- a/src/pokedex.c +++ b/src/pokedex.c @@ -6,14 +6,139 @@ #include "decompress.h" #include "bg.h" #include "window.h" +#include "event_data.h" +#include "palette.h" +#include "main.h" +#include "sound.h" +#include "task.h" +#include "battle_dome_cards.h" +#include "scanline_effect.h" +#include "malloc.h" +#include "gpu_regs.h" +#include "constants/songs.h" +#include "constants/rgb.h" +#include "overworld.h" +#include "menu.h" +#include "text_window.h" +#include "data2.h" +#include "string_util.h" + +extern struct PokedexView *gUnknown_02039B4C; +extern u16 gUnknown_02039B50; +extern u8 gUnknown_02039B52; + +extern u8 gUnknown_030060B0; + +#define HOENN_DEX_COUNT 202 +#define NATIONAL_DEX_COUNT 386 + +extern struct MusicPlayerInfo gMPlayInfo_BGM; + +struct PokedexListItem +{ + u16 dexNum; + u16 seen:1; + u16 owned:1; +}; + +struct PokedexView +{ + struct PokedexListItem unk0[NATIONAL_DEX_COUNT]; + u16 unk608; + u8 unk60A_1:1; + u8 unk60A_2:1; + u8 unk60B; + u16 pokemonListCount; + u16 selectedPokemon; + u16 unk610; + u16 dexMode; + u16 unk614; + u16 dexOrder; + u16 unk618; + u16 unk61A; + u16 unk61C; + u16 unk61E[4]; + u16 selectedMonSpriteId; + u16 unk628; + u16 unk62A; + u8 unk62C; + u8 unk62D; + u8 unk62E; + u8 unk62F; + s16 unk630; + s16 unk632; + u16 unk634; + u16 unk636; + u16 unk638; + u16 unk63A[4]; + u8 filler642[8]; + u8 unk64A; + u8 unk64B; + u8 unk64C_1:1; + u8 selectedScreen; + u8 unk64E; + u8 menuIsOpen; //menuIsOpen + u16 menuCursorPos; //Menu cursor position + s16 menuY; //Menu Y position (inverted because we use REG_BG0VOFS for this) + u8 unk654[8]; + u8 unk65C[8]; +}; + +enum +{ + DEX_MODE_HOENN, + DEX_MODE_NATIONAL +}; // this file's functions +void sub_80BB774(void); +void sub_80BB78C(u8); +void sub_80BB7D4(u8); +void sub_80BBA28(u8); +void sub_80BBA78(u8); +void sub_80BBBF4(u8); +void sub_80BBC74(u8); +void sub_80BBD1C(u8); +void sub_80BBDE8(u8); +void sub_80BBE70(u8); +void sub_80BBEB8(u8); +void sub_80BC0A8(u8); +void sub_80BC0F8(u8); +void sub_80BC2D4(u8); +void sub_80BC360(u8); +void sub_80BC3DC(u8); +void sub_80BC47C(u8); +bool8 sub_80BC514(u8); +void sub_80BC844(u8); +void sub_80BC890(void); +void sub_80BC8D4(u8, u8); +void sub_80BD154(u16, u8, u8, u16); +void sub_80BD1F4(u16, u8, u8, u16); +u8 sub_80BD23C(u16, u8, u8); +void sub_80BD28C(u8, u8, u16); +void sub_80BD2B4(u16, u16); +bool8 sub_80BD404(u8, u8, u8); +u16 sub_80BD69C(u16, u16); +void sub_80BD8D0(void); +bool8 sub_80BD930(void); +void sub_80BDA40(void); +u16 sub_80BDA8C(u16); +u16 sub_80BDACC(u16, u16, u16); +void sub_80BDB7C(u8); +void sub_80BE470(struct Sprite *sprite); void sub_80BE604(struct Sprite *sprite); void sub_80BE658(struct Sprite *sprite); void sub_80BE758(struct Sprite *sprite); void sub_80BE780(struct Sprite *sprite); void sub_80BE44C(struct Sprite *sprite); void sub_80BE834(struct Sprite *sprite); +void sub_80BE4E0(struct Sprite *sprite); +u8 sub_80BE91C(struct PokedexListItem*, u8); +bool8 sub_80BE9C4(u8); +void sub_80BE9F8(struct PokedexListItem*, u8); +void sub_80C09B0(u8); +u16 sub_80C0E0C(u8, u16, u16, u16); +u8 sub_80C1258(); // const rom data #include "data/pokedex_orders.h" @@ -485,7 +610,7 @@ const struct CompressedSpriteSheet gSpriteSheets_0855D26C[] = {0} }; -const struct CompressedSpritePalette gSpritePalettes_0855D26C[] = +const struct SpritePalette gSpritePalettes_0855D26C[] = { {gPokedexText_Pal, 4096}, {0} @@ -540,3 +665,1157 @@ const struct WindowTemplate sWindowTemplates_0855D2A8[] = DUMMY_WIN_TEMPLATE }; +const u8 gUnknown_0855D2B8[] = _("{UNK_CTRL_F9 8}000"); +const u8 gUnknown_0855D2BE[] = INCBIN_U8("graphics/pokedex/caught_ball.4bpp"); +const u8 sText_TenDashes[] = _("----------"); + +// .text + +#define DEX_FLAGS_NO ((POKEMON_SLOTS_NUMBER / 8) + ((POKEMON_SLOTS_NUMBER % 8) ? 1 : 0)) + +void ResetPokedex(void) +{ + u16 i; + + gUnknown_02039B50 = 0; + gUnknown_02039B52 = 64; + gUnknown_030060B0 = 0; + gSaveBlock2Ptr->pokedex.unknown1 = 0; + gSaveBlock2Ptr->pokedex.order = 0; + gSaveBlock2Ptr->pokedex.nationalMagic = 0; + gSaveBlock2Ptr->pokedex.unknown2 = 0; + gSaveBlock2Ptr->pokedex.unownPersonality = 0; + gSaveBlock2Ptr->pokedex.spindaPersonality = 0; + gSaveBlock2Ptr->pokedex.unknown3 = 0; + DisableNationalPokedex(); + for (i = 0; i < DEX_FLAGS_NO; i++) + { + gSaveBlock2Ptr->pokedex.owned[i] = 0; + gSaveBlock2Ptr->pokedex.seen[i] = 0; + gSaveBlock1Ptr->seen1[i] = 0; + gSaveBlock1Ptr->seen2[i] = 0; + } +} + +void sub_80BB358(void) +{ + gUnknown_02039B50 = 0; + gUnknown_02039B52 = 64; +} + +void sub_80BB370(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +void sub_80BB384(struct PokedexView *pokedexView) +{ + u16 i; + + for (i = 0; i < NATIONAL_DEX_COUNT; i++) + { + pokedexView->unk0[i].dexNum |= 0xFFFF; + pokedexView->unk0[i].seen = 0; + pokedexView->unk0[i].owned = 0; + } + pokedexView->unk608 = 0; + pokedexView->unk60A_1 = 0; + pokedexView->unk60A_2 = 0; + pokedexView->pokemonListCount = 0; + pokedexView->selectedPokemon = 0; + pokedexView->unk610 = 0; + pokedexView->dexMode = 0; + pokedexView->unk614 = 0; + pokedexView->dexOrder = 0; + pokedexView->unk618 = 0; + pokedexView->unk61A = 0; + pokedexView->unk61C = 0; + for (i = 0; i <= 3; i++) + pokedexView->unk61E[i] |= 0xFFFF; + pokedexView->unk628 = 0; + pokedexView->unk62A = 0; + pokedexView->unk62C = 0; + pokedexView->unk62D = 0; + pokedexView->unk62E = 0; + pokedexView->unk62F = 0; + pokedexView->unk630 = 0; + pokedexView->unk632 = 0; + pokedexView->unk634 = 0; + pokedexView->unk636 = 0; + pokedexView->unk638 = 0; + for (i = 0; i <= 3; i++) + pokedexView->unk63A[i] = 0; + pokedexView->unk64A = 0; + pokedexView->unk64B = 0; + pokedexView->unk64C_1 = 0; + pokedexView->selectedScreen = 0; + pokedexView->unk64E = 0; + pokedexView->menuIsOpen = 0; + pokedexView->menuCursorPos = 0; + pokedexView->menuY = 0; + for (i = 0; i <= 7; i++) + pokedexView->unk654[i] = 0; + for (i = 0; i <= 7; i++) + pokedexView->unk65C[i] = 0; +} + +void sub_80BB534(void) +{ + u8 *addr; + u32 size; + + switch (gMain.state) + { + case 0: + default: + SetVBlankCallback(NULL); + sub_80C09B0(0); + addr = (u8 *)VRAM; + size = VRAM_SIZE; + while (1) + { + DmaFill16(3, 0, addr, 0x1000); + addr += 0x1000; + size -= 0x1000; + if (size <= 0x1000) + { + DmaFill16(3, 0, addr, size); + break; + } + } + DmaClear32(3, OAM, OAM_SIZE); + DmaClear16(3, PLTT, PLTT_SIZE); + gMain.state = 1; + break; + case 1: + ScanlineEffect_Stop(); + ResetTasks(); + ResetSpriteData(); + ResetPaletteFade(); + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = 8; + dp13_810BB8C(); + gMain.state++; + break; + case 2: + gUnknown_02039B4C = AllocZeroed(sizeof(struct PokedexView)); + sub_80BB384(gUnknown_02039B4C); + CreateTask(sub_80BB78C, 0); + gUnknown_02039B4C->dexMode = gSaveBlock2Ptr->pokedex.unknown1; + if (!IsNationalPokedexEnabled()) + gUnknown_02039B4C->dexMode = DEX_MODE_HOENN; + gUnknown_02039B4C->dexOrder = gSaveBlock2Ptr->pokedex.order; + gUnknown_02039B4C->selectedPokemon = gUnknown_02039B50; + gUnknown_02039B4C->unk62C = gUnknown_02039B52; + gUnknown_02039B4C->selectedScreen = 0; + if (!IsNationalPokedexEnabled()) + { + gUnknown_02039B4C->unk61A = GetHoennPokedexCount(0); + gUnknown_02039B4C->unk61C = GetHoennPokedexCount(1); + } + else + { + gUnknown_02039B4C->unk61A = GetNationalPokedexCount(0); + gUnknown_02039B4C->unk61C = GetNationalPokedexCount(1); + } + gUnknown_02039B4C->unk62D = 8; + gMain.state++; + break; + case 3: + EnableInterrupts(1); + SetVBlankCallback(sub_80BB370); + SetMainCallback2(sub_80BB774); + sub_80BC8D4(gUnknown_02039B4C->dexMode, gUnknown_02039B4C->dexOrder); + m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0x80); + break; + } +} + +void sub_80BB774(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +void sub_80BB78C(u8 taskId) +{ + gUnknown_02039B4C->unk64C_1 = FALSE; + if (sub_80BC514(0)) + gTasks[taskId].func = sub_80BB7D4; +} + +void sub_80BB7D4(u8 taskId) +{ + SetGpuReg(REG_OFFSET_BG0VOFS, gUnknown_02039B4C->menuY); + + if (gUnknown_02039B4C->menuY) + { + gUnknown_02039B4C->menuY -= 8; + } + else + { + if ((gMain.newKeys & A_BUTTON) && gUnknown_02039B4C->unk0[gUnknown_02039B4C->selectedPokemon].seen) + { + sub_80BD8D0(); + BeginNormalPaletteFade(~(1 << (gSprites[gUnknown_02039B4C->selectedMonSpriteId].oam.paletteNum + 16)), 0, 0, 0x10, RGB_BLACK); + gSprites[gUnknown_02039B4C->selectedMonSpriteId].callback = sub_80BE470; + gTasks[taskId].func = sub_80BBBF4; + PlaySE(SE_PIN); + sub_80BC890(); + } + else if (gMain.newKeys & START_BUTTON) + { + //Open menu + gUnknown_02039B4C->menuY = 0; + gUnknown_02039B4C->menuIsOpen = 1; + gUnknown_02039B4C->menuCursorPos = 0; + gTasks[taskId].func = sub_80BBA78; + PlaySE(SE_SELECT); + } + else if (gMain.newKeys & SELECT_BUTTON) + { + PlaySE(SE_SELECT); + BeginNormalPaletteFade(-1, 0, 0, 0x10, RGB_BLACK); + gTasks[taskId].data[0] = sub_80C1258(); + gUnknown_02039B4C->unk64E = 0; + gUnknown_02039B4C->unk62A = gUnknown_02039B4C->unk62C; + gUnknown_02039B4C->unk610 = gUnknown_02039B4C->selectedPokemon; + gUnknown_02039B4C->unk614 = gUnknown_02039B4C->dexMode; + gUnknown_02039B4C->unk618 = gUnknown_02039B4C->dexOrder; + gTasks[taskId].func = sub_80BBD1C; + PlaySE(SE_PC_LOGIN); + sub_80BC890(); + } + else if (gMain.newKeys & B_BUTTON) + { + BeginNormalPaletteFade(-1, 0, 0, 0x10, RGB_BLACK); + gTasks[taskId].func = sub_80BBDE8; + PlaySE(SE_PC_OFF); + } + else + { + //Handle D-pad + gUnknown_02039B4C->selectedPokemon = sub_80BD69C(gUnknown_02039B4C->selectedPokemon, 0xE); + if (gUnknown_02039B4C->unk62E) + gTasks[taskId].func = sub_80BBA28; + } + } +} + +void sub_80BBA28(u8 taskId) +{ + if (sub_80BD404(gUnknown_02039B4C->unk62F, gUnknown_02039B4C->unk634, gUnknown_02039B4C->unk636)) + gTasks[taskId].func = sub_80BB7D4; +} + +void sub_80BBA78(u8 taskId) +{ + SetGpuReg(REG_OFFSET_BG0VOFS, gUnknown_02039B4C->menuY); + + //If menu is not open, slide it up, on screen + if (gUnknown_02039B4C->menuY != 80) + gUnknown_02039B4C->menuY += 8; + else + { + if (gMain.newKeys & A_BUTTON) + { + switch (gUnknown_02039B4C->menuCursorPos) + { + case 0: //BACK TO LIST + default: + gMain.newKeys |= START_BUTTON; //Exit menu + break; + case 1: //LIST TOP + gUnknown_02039B4C->selectedPokemon = 0; + gUnknown_02039B4C->unk62C = 0x40; + sub_80BDA40(); + sub_80BD2B4(gUnknown_02039B4C->selectedPokemon, 0xE); + gMain.newKeys |= START_BUTTON; //Exit menu + break; + case 2: //LIST BOTTOM + gUnknown_02039B4C->selectedPokemon = gUnknown_02039B4C->pokemonListCount - 1; + gUnknown_02039B4C->unk62C = gUnknown_02039B4C->pokemonListCount * 16 + 0x30; + sub_80BDA40(); + sub_80BD2B4(gUnknown_02039B4C->selectedPokemon, 0xE); + gMain.newKeys |= START_BUTTON; //Exit menu + break; + case 3: //CLOSE POKEDEX + BeginNormalPaletteFade(-1, 0, 0, 0x10, RGB_BLACK); + gTasks[taskId].func = sub_80BBDE8; + PlaySE(SE_PC_OFF); + break; + } + } + + //Exit menu when Start or B is pressed + if (gMain.newKeys & (START_BUTTON | B_BUTTON)) + { + gUnknown_02039B4C->menuIsOpen = 0; + gTasks[taskId].func = sub_80BB7D4; + PlaySE(SE_SELECT); + } + else if ((gMain.newAndRepeatedKeys & DPAD_UP) && gUnknown_02039B4C->menuCursorPos != 0) + { + gUnknown_02039B4C->menuCursorPos--; + PlaySE(SE_SELECT); + } + else if ((gMain.newAndRepeatedKeys & DPAD_DOWN) && gUnknown_02039B4C->menuCursorPos <= 2) + { + gUnknown_02039B4C->menuCursorPos++; + PlaySE(SE_SELECT); + } + } +} + +void sub_80BBBF4(u8 taskId) +{ + if (gSprites[gUnknown_02039B4C->selectedMonSpriteId].pos1.x == 48 && gSprites[gUnknown_02039B4C->selectedMonSpriteId].pos1.y == 56) + { + gUnknown_02039B4C->unk64B = gUnknown_02039B4C->unk64A; + gTasks[taskId].data[0] = sub_80BE91C(&gUnknown_02039B4C->unk0[gUnknown_02039B4C->selectedPokemon], gUnknown_02039B4C->selectedMonSpriteId); + gTasks[taskId].func = sub_80BBC74; + } +} + +void sub_80BBC74(u8 taskId) +{ + if (gTasks[gTasks[taskId].data[0]].isActive) + { + if (gUnknown_02039B4C->unk64A == 1 && !sub_80BE9C4(gTasks[taskId].data[0]) && sub_80BD930()) + sub_80BE9F8(&gUnknown_02039B4C->unk0[gUnknown_02039B4C->selectedPokemon], gTasks[taskId].data[0]); + } + else + { + gUnknown_02039B50 = gUnknown_02039B4C->selectedPokemon; + gUnknown_02039B52 = gUnknown_02039B4C->unk62C; + gTasks[taskId].func = sub_80BB78C; + } +} + +void sub_80BBD1C(u8 taskId) +{ + if (!gTasks[gTasks[taskId].data[0]].isActive) + { + sub_80BDA40(); + if (gUnknown_02039B4C->unk64E != 0) + { + gUnknown_02039B4C->selectedPokemon = 0; + gUnknown_02039B4C->unk62C = 0x40; + gTasks[taskId].func = sub_80BBE70; + } + else + { + gUnknown_02039B4C->unk62C = gUnknown_02039B4C->unk62A; + gUnknown_02039B4C->selectedPokemon = gUnknown_02039B4C->unk610; + gUnknown_02039B4C->dexMode = gUnknown_02039B4C->unk614; + if (!IsNationalPokedexEnabled()) + gUnknown_02039B4C->dexMode = DEX_MODE_HOENN; + gUnknown_02039B4C->dexOrder = gUnknown_02039B4C->unk618; + gTasks[taskId].func = sub_80BB78C; + } + } +} + +void sub_80BBDE8(u8 taskId) +{ + if (!gPaletteFade.active) + { + gSaveBlock2Ptr->pokedex.unknown1 = gUnknown_02039B4C->dexMode; + if (!IsNationalPokedexEnabled()) + gSaveBlock2Ptr->pokedex.unknown1 = DEX_MODE_HOENN; + gSaveBlock2Ptr->pokedex.order = gUnknown_02039B4C->dexOrder; + sub_80BDA40(); + sub_80BC890(); + DestroyTask(taskId); + SetMainCallback2(CB2_ReturnToFieldWithOpenMenu); + m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0x100); + Free(gUnknown_02039B4C); + } +} + +void sub_80BBE70(u8 taskId) +{ + gUnknown_02039B4C->unk64C_1 = TRUE; + if (sub_80BC514(3)) + gTasks[taskId].func = sub_80BBEB8; +} + +void sub_80BBEB8(u8 taskId) +{ + SetGpuReg(REG_OFFSET_BG0VOFS, gUnknown_02039B4C->menuY); + + if (gUnknown_02039B4C->menuY) + { + gUnknown_02039B4C->menuY -= 8; + } + else + { + if ((gMain.newKeys & A_BUTTON) && gUnknown_02039B4C->unk0[gUnknown_02039B4C->selectedPokemon].seen) + { + u32 a; + + sub_80BD8D0(); + a = (1 << (gSprites[gUnknown_02039B4C->selectedMonSpriteId].oam.paletteNum + 16)); + gSprites[gUnknown_02039B4C->selectedMonSpriteId].callback = sub_80BE470; + BeginNormalPaletteFade(~a, 0, 0, 0x10, RGB_BLACK); + gTasks[taskId].func = sub_80BC2D4; + PlaySE(SE_PIN); + sub_80BC890(); + } + else if (gMain.newKeys & START_BUTTON) + { + gUnknown_02039B4C->menuY = 0; + gUnknown_02039B4C->menuIsOpen = 1; + gUnknown_02039B4C->menuCursorPos = 0; + gTasks[taskId].func = sub_80BC0F8; + PlaySE(SE_SELECT); + } + else if (gMain.newKeys & SELECT_BUTTON) + { + BeginNormalPaletteFade(-1, 0, 0, 0x10, RGB_BLACK); + gTasks[taskId].data[0] = sub_80C1258(); + gUnknown_02039B4C->unk64E = 0; + gTasks[taskId].func = sub_80BBD1C; + PlaySE(SE_PC_LOGIN); + sub_80BC890(); + } + else if (gMain.newKeys & B_BUTTON) + { + BeginNormalPaletteFade(-1, 0, 0, 0x10, RGB_BLACK); + gTasks[taskId].func = sub_80BC3DC; + PlaySE(SE_PC_OFF); + } + else + { + //Handle D-pad + gUnknown_02039B4C->selectedPokemon = sub_80BD69C(gUnknown_02039B4C->selectedPokemon, 0xE); + if (gUnknown_02039B4C->unk62E) + gTasks[taskId].func = sub_80BC0A8; + } + } +} + +void sub_80BC0A8(u8 taskId) +{ + if (sub_80BD404(gUnknown_02039B4C->unk62F, gUnknown_02039B4C->unk634, gUnknown_02039B4C->unk636)) + gTasks[taskId].func = sub_80BBEB8; +} + +void sub_80BC0F8(u8 taskId) +{ + SetGpuReg(REG_OFFSET_BG0VOFS, gUnknown_02039B4C->menuY); + + if (gUnknown_02039B4C->menuY != 96) + { + gUnknown_02039B4C->menuY += 8; + } + else + { + if (gMain.newKeys & A_BUTTON) + { + switch (gUnknown_02039B4C->menuCursorPos) + { + case 0: //BACK TO LIST + default: + gMain.newKeys |= START_BUTTON; + break; + case 1: //LIST TOP + gUnknown_02039B4C->selectedPokemon = 0; + gUnknown_02039B4C->unk62C = 0x40; + sub_80BDA40(); + sub_80BD2B4(gUnknown_02039B4C->selectedPokemon, 0xE); + gMain.newKeys |= START_BUTTON; + break; + case 2: //LIST BOTTOM + gUnknown_02039B4C->selectedPokemon = gUnknown_02039B4C->pokemonListCount - 1; + gUnknown_02039B4C->unk62C = gUnknown_02039B4C->pokemonListCount * 16 + 0x30; + sub_80BDA40(); + sub_80BD2B4(gUnknown_02039B4C->selectedPokemon, 0xE); + gMain.newKeys |= START_BUTTON; + break; + case 3: //BACK TO POKEDEX + BeginNormalPaletteFade(-1, 0, 0, 0x10, RGB_BLACK); + gTasks[taskId].func = sub_80BC3DC; + PlaySE(SE_TRACK_DOOR); + break; + case 4: //CLOSE POKEDEX + BeginNormalPaletteFade(-1, 0, 0, 0x10, RGB_BLACK); + gTasks[taskId].func = sub_80BC47C; + PlaySE(SE_PC_OFF); + break; + } + } + + //Exit menu when Start or B is pressed + if (gMain.newKeys & (START_BUTTON | B_BUTTON)) + { + gUnknown_02039B4C->menuIsOpen = 0; + gTasks[taskId].func = sub_80BBEB8; + PlaySE(SE_SELECT); + } + else if ((gMain.newAndRepeatedKeys & DPAD_UP) && gUnknown_02039B4C->menuCursorPos) + { + gUnknown_02039B4C->menuCursorPos--; + PlaySE(SE_SELECT); + } + else if ((gMain.newAndRepeatedKeys & DPAD_DOWN) && gUnknown_02039B4C->menuCursorPos <= 3) + { + gUnknown_02039B4C->menuCursorPos++; + PlaySE(SE_SELECT); + } + } +} + +void sub_80BC2D4(u8 taskId) +{ + if (gSprites[gUnknown_02039B4C->selectedMonSpriteId].pos1.x == 48 && gSprites[gUnknown_02039B4C->selectedMonSpriteId].pos1.y == 56) + { + gUnknown_02039B4C->unk64B = gUnknown_02039B4C->unk64A; + gTasks[taskId].data[0] = sub_80BE91C(&gUnknown_02039B4C->unk0[gUnknown_02039B4C->selectedPokemon], gUnknown_02039B4C->selectedMonSpriteId); + gUnknown_02039B4C->selectedMonSpriteId = -1; + gTasks[taskId].func = sub_80BC360; + } +} + +void sub_80BC360(u8 taskId) +{ + if (gTasks[gTasks[taskId].data[0]].isActive) + { + if (gUnknown_02039B4C->unk64A == 1 && !sub_80BE9C4(gTasks[taskId].data[0]) && sub_80BD930()) + sub_80BE9F8(&gUnknown_02039B4C->unk0[gUnknown_02039B4C->selectedPokemon], gTasks[taskId].data[0]); + } + else + { + gTasks[taskId].func = sub_80BBE70; + } +} + +void sub_80BC3DC(u8 taskId) +{ + if (!gPaletteFade.active) + { + gUnknown_02039B4C->unk62C = gUnknown_02039B4C->unk62A; + gUnknown_02039B4C->selectedPokemon = gUnknown_02039B4C->unk610; + gUnknown_02039B4C->dexMode = gUnknown_02039B4C->unk614; + if (!IsNationalPokedexEnabled()) + gUnknown_02039B4C->dexMode = DEX_MODE_HOENN; + gUnknown_02039B4C->dexOrder = gUnknown_02039B4C->unk618; + gTasks[taskId].func = sub_80BB78C; + sub_80BDA40(); + sub_80BC890(); + } +} + +void sub_80BC47C(u8 taskId) +{ + if (!gPaletteFade.active) + { + gUnknown_02039B4C->unk62C = gUnknown_02039B4C->unk62A; + gUnknown_02039B4C->selectedPokemon = gUnknown_02039B4C->unk610; + gUnknown_02039B4C->dexMode = gUnknown_02039B4C->unk614; + if (!IsNationalPokedexEnabled()) + gUnknown_02039B4C->dexMode = DEX_MODE_HOENN; + gUnknown_02039B4C->dexOrder = gUnknown_02039B4C->unk618; + gTasks[taskId].func = sub_80BBDE8; + } +} + +bool8 sub_80BC514(u8 a) +{ + switch (gMain.state) + { + case 0: + default: + if (gPaletteFade.active) + return 0; + SetVBlankCallback(NULL); + gUnknown_02039B4C->unk64A = a; + sub_80C09B0(0); + SetGpuReg(REG_OFFSET_BG2VOFS, gUnknown_02039B4C->unk62D); + ResetBgsAndClearDma3BusyFlags(0); + InitBgsFromTemplates(0, gBgTemplates_0855D298, 4); + SetBgTilemapBuffer(3, AllocZeroed(0x800)); + SetBgTilemapBuffer(2, AllocZeroed(0x800)); + SetBgTilemapBuffer(1, AllocZeroed(0x800)); + SetBgTilemapBuffer(0, AllocZeroed(0x800)); + copy_decompressed_tile_data_to_vram_autofree(3, gPokedexMenu_Gfx, 0x2000, 0, 0); + CopyToBgTilemapBuffer(1, gUnknown_08DC2C5C, 0, 0); + CopyToBgTilemapBuffer(3, gUnknown_08DC2DAC, 0, 0); + if (a == 0) + CopyToBgTilemapBuffer(0, gUnknown_08DC2A08, 0, 0x280); + else + CopyToBgTilemapBuffer(0, gUnknown_08DC2B1C, 0, 0x280); + ResetPaletteFade(); + if (a == 0) + gUnknown_02039B4C->unk64C_1 = FALSE; + else + gUnknown_02039B4C->unk64C_1 = TRUE; + sub_80BC844(gUnknown_02039B4C->unk64C_1); + InitWindows(sWindowTemplates_0855D2A8); + DeactivateAllTextPrinters(); + PutWindowTilemap(0); + CopyWindowToVram(0, 3); + gMain.state = 1; + break; + case 1: + ResetSpriteData(); + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = 8; + LoadCompressedObjectPic(&gSpriteSheets_0855D26C[0]); + LoadSpritePalettes(gSpritePalettes_0855D26C); + sub_80BDB7C(a); + gMain.state++; + break; + case 2: + gMain.state++; + break; + case 3: + if (a == 0) + sub_80BC8D4(gUnknown_02039B4C->dexMode, gUnknown_02039B4C->dexOrder); + sub_80BD2B4(gUnknown_02039B4C->selectedPokemon, 0xE); + gUnknown_02039B4C->menuIsOpen = 0; + gUnknown_02039B4C->menuY = 0; + CopyBgTilemapBufferToVram(0); + CopyBgTilemapBufferToVram(1); + CopyBgTilemapBufferToVram(2); + CopyBgTilemapBufferToVram(3); + gMain.state++; + break; + case 4: + BeginNormalPaletteFade(-1, 0, 0x10, 0, RGB_BLACK); + SetVBlankCallback(sub_80BB370); + gMain.state++; + break; + case 5: + SetGpuReg(REG_OFFSET_WININ, 0x3F3F); + SetGpuReg(REG_OFFSET_WINOUT, 0x1D3F); + SetGpuReg(REG_OFFSET_WIN0H, 0); + SetGpuReg(REG_OFFSET_WIN0V, 0); + SetGpuReg(REG_OFFSET_WIN1H, 0); + SetGpuReg(REG_OFFSET_WIN1V, 0); + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); + SetGpuReg(REG_OFFSET_BLDY, 0); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON | DISPCNT_OBJWIN_ON); + ShowBg(0); + ShowBg(1); + ShowBg(2); + ShowBg(3); + gMain.state++; + break; + case 6: + if (!gPaletteFade.active) + { + gMain.state = 0; + return TRUE; + } + break; + } + return FALSE; +} + +void sub_80BC844(u8 a) +{ + if (a == 1) + LoadPalette(gPokedexHoennBg_Pal + 1, 1, 0xBE); + else if (!IsNationalPokedexEnabled()) + LoadPalette(gPokedexText_Pal + 1, 1, 0xBE); + else + LoadPalette(gPokedexNationalBg_Pal + 1, 1, 0xBE); + LoadPalette(GetOverworldTextboxPalettePtr(), 0xF0, 32); +} + +void sub_80BC890(void) +{ + void* tilemapBuffer; + + FreeAllWindowBuffers(); + tilemapBuffer = GetBgTilemapBuffer(0); + if (tilemapBuffer) + Free(tilemapBuffer); + tilemapBuffer = GetBgTilemapBuffer(1); + if (tilemapBuffer) + Free(tilemapBuffer); + tilemapBuffer = GetBgTilemapBuffer(2); + if (tilemapBuffer) + Free(tilemapBuffer); + tilemapBuffer = GetBgTilemapBuffer(3); + if (tilemapBuffer) + Free(tilemapBuffer); +} + +void sub_80BC8D4(u8 dexMode, u8 sortMode) +{ + u16 vars[3]; //I have no idea why three regular variables are stored in an array, but whatever. + s16 i; + + gUnknown_02039B4C->pokemonListCount = 0; + + switch (dexMode) + { + default: + case DEX_MODE_HOENN: + vars[0] = HOENN_DEX_COUNT; + vars[1] = 1; + break; + case DEX_MODE_NATIONAL: + if (IsNationalPokedexEnabled()) + { + vars[0] = NATIONAL_DEX_COUNT; + vars[1] = 0; + } + else + { + vars[0] = HOENN_DEX_COUNT; + vars[1] = 1; + } + break; + } + + switch (sortMode) + { + case 0: + if (vars[1]) + { + for (i = 0; i < vars[0]; i++) + { + vars[2] = HoennToNationalOrder(i + 1); + gUnknown_02039B4C->unk0[i].dexNum = vars[2]; + gUnknown_02039B4C->unk0[i].seen = GetSetPokedexFlag(vars[2], 0); + gUnknown_02039B4C->unk0[i].owned = GetSetPokedexFlag(vars[2], 1); + if (gUnknown_02039B4C->unk0[i].seen) + gUnknown_02039B4C->pokemonListCount = i + 1; + } + } + else + { + bool32 r10; + s16 r5; + + r10 = r5 = i = 0; + for (i = 0; i < vars[0]; i++) + { + vars[2] = i + 1; + if (GetSetPokedexFlag(vars[2], 0)) + r10 = 1; + if (r10) + { + asm(""); //Needed to match for some reason + gUnknown_02039B4C->unk0[r5].dexNum = vars[2]; + gUnknown_02039B4C->unk0[r5].seen = GetSetPokedexFlag(vars[2], 0); + gUnknown_02039B4C->unk0[r5].owned = GetSetPokedexFlag(vars[2], 1); + if (gUnknown_02039B4C->unk0[r5].seen) + gUnknown_02039B4C->pokemonListCount = r5 + 1; + r5++; + } + } + } + break; + case 1: + for (i = 0; i < POKEMON_SLOTS_NUMBER - 1; i++) + { + vars[2] = gPokedexOrder_Alphabetical[i]; + + if (NationalToHoennOrder(vars[2]) <= vars[0] && GetSetPokedexFlag(vars[2], 0)) + { + gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].dexNum = vars[2]; + gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].seen = 1; + gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].owned = GetSetPokedexFlag(vars[2], 1); + gUnknown_02039B4C->pokemonListCount++; + } + } + break; + case 2: + for (i = NATIONAL_DEX_COUNT - 1; i >= 0; i--) + { + vars[2] = gPokedexOrder_Weight[i]; + + if (NationalToHoennOrder(vars[2]) <= vars[0] && GetSetPokedexFlag(vars[2], 1)) + { + gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].dexNum = vars[2]; + gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].seen = 1; + gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].owned = 1; + gUnknown_02039B4C->pokemonListCount++; + } + } + break; + case 3: + for (i = 0; i < NATIONAL_DEX_COUNT; i++) + { + vars[2] = gPokedexOrder_Weight[i]; + + if (NationalToHoennOrder(vars[2]) <= vars[0] && GetSetPokedexFlag(vars[2], 1)) + { + gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].dexNum = vars[2]; + gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].seen = 1; + gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].owned = 1; + gUnknown_02039B4C->pokemonListCount++; + } + } + break; + case 4: + for (i = NATIONAL_DEX_COUNT - 1; i >=0; i--) + { + vars[2] = gPokedexOrder_Height[i]; + + if (NationalToHoennOrder(vars[2]) <= vars[0] && GetSetPokedexFlag(vars[2], 1)) + { + gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].dexNum = vars[2]; + gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].seen = 1; + gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].owned = 1; + gUnknown_02039B4C->pokemonListCount++; + } + } + break; + case 5: + for (i = 0; i < NATIONAL_DEX_COUNT; i++) + { + vars[2] = gPokedexOrder_Height[i]; + + if (NationalToHoennOrder(vars[2]) <= vars[0] && GetSetPokedexFlag(vars[2], 1)) + { + gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].dexNum = vars[2]; + gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].seen = 1; + gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].owned = 1; + gUnknown_02039B4C->pokemonListCount++; + } + } + break; + } + + for (i = gUnknown_02039B4C->pokemonListCount; i < NATIONAL_DEX_COUNT; i++) + { + gUnknown_02039B4C->unk0[i].dexNum |= 0xFFFF; + gUnknown_02039B4C->unk0[i].seen = 0; + gUnknown_02039B4C->unk0[i].owned = 0; + } +} + +void sub_80BCE2C(u8 a, u8 b, const u8* str, u8 c, u8 d) +{ + u8 sp14[3]; + + sp14[0] = 0; + sp14[1] = 15; + sp14[2] = 3; + AddTextPrinterParameterized2(a, b, c * 8, (d * 8) + 1, 0, 0, sp14, -1, str); +} + +void sub_80BCE84(u8 a, u16 b, u16 c) +{ + s16 _b; + u16 i; + u16 r2; + + switch (a) + { + case 0: + default: + _b = b - 5; + for (i = 0; i <= 10; i++) + { + if (_b < 0 || _b >= NATIONAL_DEX_COUNT || gUnknown_02039B4C->unk0[_b].dexNum == 0xFFFF) + { + sub_80BD28C(0x11, i * 2, c); + } + else + { + sub_80BD28C(0x11, i * 2, c); + if (gUnknown_02039B4C->unk0[_b].seen) + { + sub_80BD154(_b, 0x12, i * 2, c); + sub_80BD1F4(gUnknown_02039B4C->unk0[_b].owned, 0x11, i * 2, c); + sub_80BD23C(gUnknown_02039B4C->unk0[_b].dexNum, 0x16, i * 2); + } + else + { + sub_80BD154(_b, 0x12, i * 2, c); + sub_80BD1F4(0, 0x11, i * 2, c); + sub_80BD23C(0, 0x16, i * 2); + } + } + _b++; + } + break; + case 1: + _b = b - 5; + if (_b < 0 || _b >= NATIONAL_DEX_COUNT || gUnknown_02039B4C->unk0[_b].dexNum == 0xFFFF) + { + sub_80BD28C(0x11, gUnknown_02039B4C->unk630 * 2, c); + } + else + { + sub_80BD28C(0x11, gUnknown_02039B4C->unk630 * 2, c); + if (gUnknown_02039B4C->unk0[_b].seen) + { + sub_80BD154(_b, 0x12, gUnknown_02039B4C->unk630 * 2, c); + sub_80BD1F4(gUnknown_02039B4C->unk0[_b].owned, 0x11, gUnknown_02039B4C->unk630 * 2, c); + sub_80BD23C(gUnknown_02039B4C->unk0[_b].dexNum, 0x16, gUnknown_02039B4C->unk630 * 2); + } + else + { + sub_80BD154(_b, 0x12, gUnknown_02039B4C->unk630 * 2, c); + sub_80BD1F4(0, 0x11, gUnknown_02039B4C->unk630 * 2, c); + sub_80BD23C(0, 0x16, gUnknown_02039B4C->unk630 * 2); + } + } + break; + case 2: + _b = b + 5; + r2 = gUnknown_02039B4C->unk630 + 10; + if (r2 > 15) + r2 -= 16; + if (_b < 0 || _b >= NATIONAL_DEX_COUNT || gUnknown_02039B4C->unk0[_b].dexNum == 0xFFFF) + sub_80BD28C(0x11, r2 * 2, c); + else + { + sub_80BD28C(0x11, r2 * 2, c); + if (gUnknown_02039B4C->unk0[_b].seen) + { + sub_80BD154(_b, 0x12, r2 * 2, c); + sub_80BD1F4(gUnknown_02039B4C->unk0[_b].owned, 0x11, r2 * 2, c); + sub_80BD23C(gUnknown_02039B4C->unk0[_b].dexNum, 0x16, r2 * 2); + } + else + { + sub_80BD154(_b, 0x12, r2 * 2, c); + sub_80BD1F4(0, 0x11, r2 * 2, c); + sub_80BD23C(0, 0x16, r2 * 2); + } + } + break; + } + CopyWindowToVram(0, 2); +} + +void sub_80BD154(u16 a, u8 b, u8 c, u16 unused) +{ + u8 text[6]; + u16 r6; + + memcpy(text, gUnknown_0855D2B8, 6); + r6 = gUnknown_02039B4C->unk0[a].dexNum; + if (gUnknown_02039B4C->dexMode == DEX_MODE_HOENN) + r6 = NationalToHoennOrder(r6); + text[2] = CHAR_0 + r6 / 100; + text[3] = CHAR_0 + (r6 % 100) / 10; + text[4] = CHAR_0 + (r6 % 100) % 10; + sub_80BCE2C(0, 7, text, b, c); +} + +void sub_80BD1F4(u16 a, u8 b, u8 c, u16 unused) +{ + if (a) + BlitBitmapToWindow(0, gUnknown_0855D2BE, b * 8, c * 8, 8, 16); + else + FillWindowPixelRect(0, 0, b * 8, c * 8, 8, 16); +} + +u8 sub_80BD23C(u16 num, u8 b, u8 c) +{ + const u8* str; + + num = NationalPokedexNumToSpecies(num); + if (num) + str = gSpeciesNames[num]; + else + str = sText_TenDashes; + sub_80BCE2C(0, 7, str, b, c); + return StringLength(str); +} + +void sub_80BD28C(u8 a, u8 b, u16 unused) +{ + FillWindowPixelRect(0, 0, a * 8, b * 8, 0x60, 16); +} + +void sub_80BD2B4(u16 a, u16 b) +{ + u8 i; + u16 unk; + u8 spriteId; + + gPaletteFade.bufferTransferDisabled = TRUE; + + for (i = 0; i < 4; i++) + gUnknown_02039B4C->unk61E[i] = 0xFFFF; + gUnknown_02039B4C->selectedMonSpriteId = 0xFFFF; + + unk = sub_80BDA8C(a - 1); + if (unk != 0xFFFF) + { + spriteId = sub_80BDACC(unk, 0x60, 0x50); + gSprites[spriteId].callback = sub_80BE4E0; + gSprites[spriteId].data[5] = -32; + } + + unk = sub_80BDA8C(a); + if (unk != 0xFFFF) + { + spriteId = sub_80BDACC(unk, 0x60, 0x50); + gSprites[spriteId].callback = sub_80BE4E0; + gSprites[spriteId].data[5] = 0; + } + + unk = sub_80BDA8C(a + 1); + if (unk != 0xFFFF) + { + spriteId = sub_80BDACC(unk, 0x60, 0x50); + gSprites[spriteId].callback = sub_80BE4E0; + gSprites[spriteId].data[5] = 32; + } + + sub_80BCE84(0, a, b); + SetGpuReg(REG_OFFSET_BG2VOFS, gUnknown_02039B4C->unk62D); + + gUnknown_02039B4C->unk630 = 0; + gUnknown_02039B4C->unk632 = 0; + + gPaletteFade.bufferTransferDisabled = FALSE; +} + +bool8 sub_80BD404(u8 a, u8 b, u8 c) +{ + u16 i; + u8 foo; + + if (gUnknown_02039B4C->unk62E) + { + gUnknown_02039B4C->unk62E--; + switch (a) + { + case 1: + for (i = 0; i < 4; i++) + { + if (gUnknown_02039B4C->unk61E[i] != 0xFFFF) + gSprites[gUnknown_02039B4C->unk61E[i]].data[5] += b; + } + foo = 16 * (c - gUnknown_02039B4C->unk62E) / c; + SetGpuReg(REG_OFFSET_BG2VOFS, gUnknown_02039B4C->unk62D + gUnknown_02039B4C->unk632 * 16 - foo); + gUnknown_02039B4C->unk62C -= gUnknown_02039B4C->unk628; + break; + case 2: + for (i = 0; i < 4; i++) + { + if (gUnknown_02039B4C->unk61E[i] != 0xFFFF) + gSprites[gUnknown_02039B4C->unk61E[i]].data[5] -= b; + } + foo = 16 * (c - gUnknown_02039B4C->unk62E) / c; + SetGpuReg(REG_OFFSET_BG2VOFS, gUnknown_02039B4C->unk62D + gUnknown_02039B4C->unk632 * 16 + foo); + gUnknown_02039B4C->unk62C += gUnknown_02039B4C->unk628; + break; + } + return FALSE; + } + else + { + SetGpuReg(REG_OFFSET_BG2VOFS, gUnknown_02039B4C->unk62D + gUnknown_02039B4C->unk630 * 16); + return TRUE; + } +} + +void sub_80BD5A8(u8 a, u16 b) +{ + u16 unk; + u8 spriteId; + + gUnknown_02039B4C->unk632 = gUnknown_02039B4C->unk630; + switch (a) + { + case 1: + unk = sub_80BDA8C(b - 1); + if (unk != 0xFFFF) + { + spriteId = sub_80BDACC(unk, 0x60, 0x50); + gSprites[spriteId].callback = sub_80BE4E0; + gSprites[spriteId].data[5] = -64; + } + if (gUnknown_02039B4C->unk630 > 0) + gUnknown_02039B4C->unk630--; + else + gUnknown_02039B4C->unk630 = 15; + break; + case 2: + unk = sub_80BDA8C(b + 1); + if (unk != 0xFFFF) + { + spriteId = sub_80BDACC(unk, 0x60, 0x50); + gSprites[spriteId].callback = sub_80BE4E0; + gSprites[spriteId].data[5] = 0x40; + } + if (gUnknown_02039B4C->unk630 <= 0xE) + gUnknown_02039B4C->unk630++; + else + gUnknown_02039B4C->unk630 = 0; + break; + } +} + +u16 sub_80BD69C(u16 a, u16 b) +{ + u8 r3; + u8 r5; + u8 i; + u16 r6; + u8 r10 = 0; + + if ((gMain.heldKeys & DPAD_UP) && (a > 0)) + { + r10 = 1; + a = sub_80C0E0C(1, a, 0, gUnknown_02039B4C->pokemonListCount - 1); + sub_80BD5A8(1, a); + sub_80BCE84(1, a, b); + PlaySE(SE_Z_SCROLL); + } + else if ((gMain.heldKeys & DPAD_DOWN) && (a < gUnknown_02039B4C->pokemonListCount - 1)) + { + r10 = 2; + a = sub_80C0E0C(0, a, 0, gUnknown_02039B4C->pokemonListCount - 1); + sub_80BD5A8(2, a); + sub_80BCE84(2, a, b); + PlaySE(SE_Z_SCROLL); + } + else if ((gMain.newKeys & DPAD_LEFT) && (a > 0)) + { + r6 = a; + + for (i = 0; i < 7; i++) + a = sub_80C0E0C(1, a, 0, gUnknown_02039B4C->pokemonListCount - 1); + gUnknown_02039B4C->unk62C += 16 * (a - r6); + sub_80BDA40(); + sub_80BD2B4(a, 0xE); + PlaySE(SE_Z_PAGE); + } + else if ((gMain.newKeys & DPAD_RIGHT) && (a < gUnknown_02039B4C->pokemonListCount - 1)) + { + r6 = a; + for (i = 0; i < 7; i++) + a = sub_80C0E0C(0, a, 0, gUnknown_02039B4C->pokemonListCount - 1); + gUnknown_02039B4C->unk62C += (a - r6) * 16; + sub_80BDA40(); + sub_80BD2B4(a, 0xE); + PlaySE(SE_Z_PAGE); + } + + if (r10 == 0) + { + gUnknown_02039B4C->unk638 = 0; + return a; + } + + r5 = gUnknown_0855D28C[gUnknown_02039B4C->unk638 / 4]; + r3 = gUnknown_0855D291[gUnknown_02039B4C->unk638 / 4]; + gUnknown_02039B4C->unk62E = r3; + gUnknown_02039B4C->unk636 = r3; + gUnknown_02039B4C->unk634 = r5; + gUnknown_02039B4C->unk62F = r10; + gUnknown_02039B4C->unk628 = r5 / 2; + sub_80BD404(gUnknown_02039B4C->unk62F, gUnknown_02039B4C->unk634, gUnknown_02039B4C->unk636); + if (gUnknown_02039B4C->unk638 <= 0xB) + gUnknown_02039B4C->unk638++; + return a; +} |