diff options
author | golem galvanize <golemgalvanize@github.com> | 2018-04-30 20:41:17 -0400 |
---|---|---|
committer | golem galvanize <golemgalvanize@github.com> | 2018-04-30 20:41:17 -0400 |
commit | f9331f15ef3db551fb288737d1070adfc79150b2 (patch) | |
tree | b66d5e8ca41fb5b0a03c8e233c06ac60c8ffaa1d /src | |
parent | 6a401b53867de87165f625510624c4a296dba34b (diff) |
decompiled up to sub_80BFCF4
Diffstat (limited to 'src')
-rw-r--r-- | src/pokedex.c | 1272 |
1 files changed, 1268 insertions, 4 deletions
diff --git a/src/pokedex.c b/src/pokedex.c index 3b4f193bb..bef5abbc9 100644 --- a/src/pokedex.c +++ b/src/pokedex.c @@ -22,12 +22,39 @@ #include "text_window.h" #include "data2.h" #include "string_util.h" +#include "trig.h" +#include "pokedex_area_screen.h" +#include "pokedex_cry_screen.h" +#include "strings.h" +#include "m4a.h" +#include "international_string_util.h" extern struct PokedexView *gUnknown_02039B4C; extern u16 gUnknown_02039B50; extern u8 gUnknown_02039B52; +extern struct PokedexListItem *gUnknown_02039B54; extern u8 gUnknown_030060B0; +extern MainCallback gUnknown_030060B4; +extern u8 gUnknown_030061EC; + +struct PokedexEntry +{ + /*0x00*/ u8 categoryName[12]; + /*0x0C*/ u16 height; //in decimeters + /*0x0E*/ u16 weight; //in hectograms + /*0x10*/ const u8 *description; + /*0x14*/ u16 unused; + /*0x16*/ u16 pokemonScale; + /*0x18*/ u16 pokemonOffset; + /*0x1A*/ u16 trainerScale; + /*0x1C*/ u16 trainerOffset; +}; /*size = 0x20*/ + +extern struct BgTemplate gUnknown_0856E630[]; +extern struct WindowTemplate gUnknown_0856E640[]; +extern const u16 gUnknown_0856E610[16]; +extern const struct PokedexEntry gPokedexEntries[]; #define HOENN_DEX_COUNT 202 #define NATIONAL_DEX_COUNT 386 @@ -90,6 +117,14 @@ enum DEX_MODE_NATIONAL }; +enum +{ + AREA_SCREEN, + CRY_SCREEN, + SIZE_SCREEN, + CANCEL_SCREEN, +}; + // this file's functions void sub_80BB774(void); void sub_80BB78C(u8); @@ -121,9 +156,9 @@ bool8 sub_80BD404(u8, u8, u8); u16 sub_80BD69C(u16, u16); void sub_80BD8D0(void); bool8 sub_80BD930(void); -void sub_80BDA40(void); +u8 sub_80BDA40(void); u16 sub_80BDA8C(u16); -u16 sub_80BDACC(u16, u16, u16); +u32 sub_80BDACC(u16, s16, s16); void sub_80BDB7C(u8); void sub_80BE470(struct Sprite *sprite); void sub_80BE604(struct Sprite *sprite); @@ -135,8 +170,31 @@ 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); +u8 sub_80BE9F8(struct PokedexListItem*, u8); +void sub_80BEA24(u8); +void sub_80BEDF4(u8); +void sub_80BEFD0(u8); +void sub_80BF038(u8); +void sub_80BF070(u8); +void sub_80BF0AC(u8); +void sub_80BF1B4(u8); +void sub_80BF1EC(u8); +void sub_80BF250(u8); +void sub_80BF5CC(u8); +void sub_80BF790(u8); +void sub_80BF7FC(u8); +void sub_80BF82C(u8); +void sub_80BFBB0(u8); +void sub_80BFC78(u8); +void sub_80BFCDC(u16); +void sub_80BFCF4(u16); +void sub_80BFD0C(u8, u16); +void sub_80BFD7C(u8, u16); +void sub_80C020C(u16, u8, u8, u8); +void sub_80C09B0(u16); +void sub_80C0B44(u8, u16, u8, u8); +void sub_80C0D30(u8, u16); +u8 sub_80C0EF8(u16, u8, u8, u8); u16 sub_80C0E0C(u8, u16, u16, u16); u8 sub_80C1258(); @@ -1819,3 +1877,1209 @@ u16 sub_80BD69C(u16 a, u16 b) gUnknown_02039B4C->unk638++; return a; } + +void sub_80BD8D0(void) +{ + u16 i; + + for (i = 0; i < 4; i++) + { + u16 spriteId = gUnknown_02039B4C->unk61E[i]; + + if (gSprites[spriteId].pos2.x == 0 && gSprites[spriteId].pos2.y == 0 && spriteId != 0xFFFF) + gUnknown_02039B4C->selectedMonSpriteId = spriteId; + } +} + +u8 sub_80BD930(void) +{ + u16 r2; + u16 r4 = gUnknown_02039B4C->selectedPokemon; + + if ((gMain.newKeys & DPAD_UP) && r4) + { + r2 = r4; + while (r2 != 0) + { + r2 = sub_80C0E0C(1, r2, 0, gUnknown_02039B4C->pokemonListCount - 1); + + if (gUnknown_02039B4C->unk0[r2].seen) + { + r4 = r2; + break; + } + } + + if (gUnknown_02039B4C->selectedPokemon == r4) + return FALSE; + else + { + gUnknown_02039B4C->selectedPokemon = r4; + gUnknown_02039B4C->unk62C -= 16; + return TRUE; + } + } + else if ((gMain.newKeys & DPAD_DOWN) && r4 < gUnknown_02039B4C->pokemonListCount - 1) + { + r2 = r4; + while (r2 < gUnknown_02039B4C->pokemonListCount - 1) + { + r2 = sub_80C0E0C(0, r2, 0, gUnknown_02039B4C->pokemonListCount - 1); + + if (gUnknown_02039B4C->unk0[r2].seen) + { + r4 = r2; + break; + } + } + + if (gUnknown_02039B4C->selectedPokemon == r4) + return FALSE; + else + { + gUnknown_02039B4C->selectedPokemon = r4; + gUnknown_02039B4C->unk62C += 16; + return TRUE; + } + } + return FALSE; +} + +u8 sub_80BDA40(void) +{ + u16 i; + + for (i = 0; i < 4; i++) + { + if (gUnknown_02039B4C->unk61E[i] != 0xFFFF) + { + sub_818D820(gUnknown_02039B4C->unk61E[i]); + gUnknown_02039B4C->unk61E[i] |= 0xFFFF; + } + } + return FALSE; +} + +u16 sub_80BDA8C(u16 a1) +{ + if (a1 >= NATIONAL_DEX_COUNT || gUnknown_02039B4C->unk0[a1].dexNum == 0xFFFF) + return 0xFFFF; + else if (gUnknown_02039B4C->unk0[a1].seen) + return gUnknown_02039B4C->unk0[a1].dexNum; + else + return 0; +} + +u32 sub_80BDACC(u16 a, s16 b, s16 c) +{ + u8 i; + + for (i = 0; i < 4; i++) + { + if (gUnknown_02039B4C->unk61E[i] == 0xFFFF) + { + u8 spriteId = sub_80C0E9C(a, b, c, i); + + gSprites[spriteId].oam.affineMode = 1; + gSprites[spriteId].oam.priority = 3; + gSprites[spriteId].data[0] = 0; + gSprites[spriteId].data[1] = i; + gSprites[spriteId].data[2] = NationalPokedexNumToSpecies(a); + gUnknown_02039B4C->unk61E[i] = spriteId; + return spriteId; + } + } + return 0xFFFF; +} + +void sub_80BDB7C(u8 a) +{ + u8 spriteId; + u16 r5; + + spriteId = CreateSprite(&gUnknown_0855D1AC, 184, 4, 0); + gSprites[spriteId].data[1] = 0; + + spriteId = CreateSprite(&gUnknown_0855D1AC, 184, 156, 0); + gSprites[spriteId].data[1] = 1; + gSprites[spriteId].vFlip = TRUE; + + CreateSprite(&gUnknown_0855D194, 230, 20, 0); + CreateSprite(&gUnknown_0855D1C4, 16, 120, 0); + + spriteId = CreateSprite(&gUnknown_0855D1C4, 48, 120, 0); + StartSpriteAnim(&gSprites[spriteId], 3); + + spriteId = CreateSprite(&gUnknown_0855D1C4, 16, 144, 0); + StartSpriteAnim(&gSprites[spriteId], 2); + gSprites[spriteId].data[2] = 0x80; + + spriteId = CreateSprite(&gUnknown_0855D1C4, 48, 144, 0); + StartSpriteAnim(&gSprites[spriteId], 1); + + spriteId = CreateSprite(&gUnknown_0855D1DC, 0, 80, 2); + gSprites[spriteId].oam.affineMode = 1; + gSprites[spriteId].oam.matrixNum = 30; + gSprites[spriteId].data[0] = 0x1E; + gSprites[spriteId].data[1] = 0; + + spriteId = CreateSprite(&gUnknown_0855D1DC, 0, 80, 2); + gSprites[spriteId].oam.affineMode = 1; + gSprites[spriteId].oam.matrixNum = 31; + gSprites[spriteId].data[0] = 0x1F; + gSprites[spriteId].data[1] = 0x80; + + if (a == 0) + { + u32 _a; + + if (!IsNationalPokedexEnabled()) + { + CreateSprite(&gUnknown_0855D1F4, 32, 40, 1); + + spriteId = CreateSprite(&gUnknown_0855D1F4, 32, 72, 1); + StartSpriteAnim(&gSprites[spriteId], 1); + _a = 0; + + spriteId = CreateSprite(&gUnknown_0855D224, 24, 48, 1); + r5 = gUnknown_02039B4C->unk61A / 100; + StartSpriteAnim(&gSprites[spriteId], r5); + if (r5 != 0) + _a = 1; + else + gSprites[spriteId].invisible = TRUE; + + spriteId = CreateSprite(&gUnknown_0855D224, 32, 48, 1); + r5 = (gUnknown_02039B4C->unk61A % 100) / 10; + if (r5 != 0 || _a != 0) + StartSpriteAnim(&gSprites[spriteId], r5); + else + gSprites[spriteId].invisible = TRUE; + + spriteId = CreateSprite(&gUnknown_0855D224, 40, 48, 1); + r5 = (gUnknown_02039B4C->unk61A % 100) % 10; + StartSpriteAnim(&gSprites[spriteId], r5); + _a = 0; + + spriteId = CreateSprite(&gUnknown_0855D224, 24, 80, 1); + r5 = gUnknown_02039B4C->unk61C / 100; + StartSpriteAnim(&gSprites[spriteId], r5); + if (r5 != 0) + _a = 1; + else + gSprites[spriteId].invisible = TRUE; + + spriteId = CreateSprite(&gUnknown_0855D224, 32, 80, 1); + r5 = (gUnknown_02039B4C->unk61C % 100) / 10; + if (r5 != 0 || _a != 0) + StartSpriteAnim(&gSprites[spriteId], r5); + else + gSprites[spriteId].invisible = TRUE; + + spriteId = CreateSprite(&gUnknown_0855D224, 40, 80, 1); + r5 = (gUnknown_02039B4C->unk61C % 100) % 10; + StartSpriteAnim(&gSprites[spriteId], r5); + } + else + { + u16 r6; + + CreateSprite(&gUnknown_0855D1F4, 32, 40, 1); + + spriteId = CreateSprite(&gUnknown_0855D1F4, 32, 76, 1); + StartSpriteAnim(&gSprites[spriteId], 1); + + CreateSprite(&gUnknown_0855D20C, 17, 45, 1); + + spriteId = CreateSprite(&gUnknown_0855D20C, 17, 55, 1); + StartSpriteAnim(&gSprites[spriteId], 1); + + CreateSprite(&gUnknown_0855D20C, 17, 81, 1); + + spriteId = CreateSprite(&gUnknown_0855D20C, 17, 91, 1); + StartSpriteAnim(&gSprites[spriteId], 1); + + r6 = GetHoennPokedexCount(0); + _a = 0; + + spriteId = CreateSprite(&gUnknown_0855D23C, 40, 45, 1); + r5 = r6 / 100; + StartSpriteAnim(&gSprites[spriteId], r5); + if (r5 != 0) + _a = 1; + else + gSprites[spriteId].invisible = TRUE; + + spriteId = CreateSprite(&gUnknown_0855D23C, 48, 45, 1); + r5 = (r6 % 100) / 10; + if (r5 != 0 || _a != 0) + StartSpriteAnim(&gSprites[spriteId], r5); + else + gSprites[spriteId].invisible = TRUE; + + spriteId = CreateSprite(&gUnknown_0855D23C, 56, 45, 1); + r5 = (r6 % 100) % 10; + StartSpriteAnim(&gSprites[spriteId], r5); + + _a = 0; + + spriteId = CreateSprite(&gUnknown_0855D23C, 40, 55, 1); + r5 = gUnknown_02039B4C->unk61A / 100; + StartSpriteAnim(&gSprites[spriteId], r5); + if (r5 != 0) + _a = 1; + else + gSprites[spriteId].invisible = TRUE; + + spriteId = CreateSprite(&gUnknown_0855D23C, 48, 55, 1); + r5 = (gUnknown_02039B4C->unk61A % 100) / 10; + if (r5 != 0 || _a != 0) + StartSpriteAnim(&gSprites[spriteId], r5); + else + gSprites[spriteId].invisible = TRUE; + + spriteId = CreateSprite(&gUnknown_0855D23C, 56, 55, 1); + r5 = (gUnknown_02039B4C->unk61A % 100) % 10; + StartSpriteAnim(&gSprites[spriteId], r5); + + r6 = GetHoennPokedexCount(1); + _a = 0; + + spriteId = CreateSprite(&gUnknown_0855D23C, 40, 81, 1); + r5 = r6 / 100; + StartSpriteAnim(&gSprites[spriteId], r5); + if (r5 != 0) + _a = 1; + else + gSprites[spriteId].invisible = TRUE; + + spriteId = CreateSprite(&gUnknown_0855D23C, 48, 81, 1); + r5 = (r6 % 100) / 10; + if (r5 != 0 || _a != 0) + StartSpriteAnim(&gSprites[spriteId], r5); + else + gSprites[spriteId].invisible = TRUE; + + spriteId = CreateSprite(&gUnknown_0855D23C, 56, 81, 1); + r5 = (r6 % 100) % 10; + StartSpriteAnim(&gSprites[spriteId], r5); + + _a = 0; + + spriteId = CreateSprite(&gUnknown_0855D23C, 40, 91, 1); + r5 = gUnknown_02039B4C->unk61C / 100; + StartSpriteAnim(&gSprites[spriteId], r5); + if (r5 != 0) + _a = 1; + else + gSprites[spriteId].invisible = TRUE; + + spriteId = CreateSprite(&gUnknown_0855D23C, 48, 91, 1); + r5 = (gUnknown_02039B4C->unk61C % 100) / 10; + if (r5 != 0 || _a != 0) + StartSpriteAnim(&gSprites[spriteId], r5); + else + gSprites[spriteId].invisible = TRUE; + + spriteId = CreateSprite(&gUnknown_0855D23C, 56, 91, 1); + r5 = (gUnknown_02039B4C->unk61C % 100) % 10; + StartSpriteAnim(&gSprites[spriteId], r5); + } + spriteId = CreateSprite(&gUnknown_0855D254, 136, 96, 1); + gSprites[spriteId].invisible = TRUE; + } + else + { + spriteId = CreateSprite(&gUnknown_0855D254, 136, 80, 1); + gSprites[spriteId].invisible = TRUE; + } +} + +void nullsub_38(struct Sprite *sprite) +{ +} + +void sub_80BE44C(struct Sprite *sprite) +{ + if (gUnknown_02039B4C->unk64A != 0) + DestroySprite(sprite); +} + +//Move Pokemon into position for description page +void sub_80BE470(struct Sprite *sprite) +{ + sprite->oam.priority = 0; + sprite->oam.affineMode = 0; + sprite->pos2.x = 0; + sprite->pos2.y = 0; + if (sprite->pos1.x != 48 || sprite->pos1.y != 56) + { + if (sprite->pos1.x > 48) + sprite->pos1.x--; + if (sprite->pos1.x < 48) + sprite->pos1.x++; + + if (sprite->pos1.y > 56) + sprite->pos1.y--; + if (sprite->pos1.y < 56) + sprite->pos1.y++; + } + else + { + sprite->callback = nullsub_38; + } +} + +void sub_80BE4E0(struct Sprite *sprite) +{ + u8 data1 = sprite->data[1]; + + if (gUnknown_02039B4C->unk64A != 0 && gUnknown_02039B4C->unk64A != 3) + { + sub_818D820(gUnknown_02039B4C->unk61E[data1]); + gUnknown_02039B4C->unk61E[data1] = 0xFFFF; + } + else + { + u32 var; + + sprite->pos2.y = gSineTable[(u8)sprite->data[5]] * 76 / 256; + var = 0x10000 / gSineTable[sprite->data[5] + 0x40]; + if (var > 0xFFFF) + var = 0xFFFF; + SetOamMatrix(sprite->data[1] + 1, 0x100, 0, 0, var); + sprite->oam.matrixNum = data1 + 1; + + if (sprite->data[5] > -64 && sprite->data[5] < 64) + { + sprite->invisible = FALSE; + sprite->data[0] = 1; + } + else + { + sprite->invisible = TRUE; + } + + if ((sprite->data[5] <= -64 || sprite->data[5] >= 64) && sprite->data[0] != 0) + { + sub_818D820(gUnknown_02039B4C->unk61E[data1]); + gUnknown_02039B4C->unk61E[data1] = 0xFFFF; + } + } +} + +void sub_80BE604(struct Sprite *sprite) +{ + if (gUnknown_02039B4C->unk64A != 0 && gUnknown_02039B4C->unk64A != 3) + DestroySprite(sprite); + else + sprite->pos2.y = gUnknown_02039B4C->selectedPokemon * 120 / (gUnknown_02039B4C->pokemonListCount - 1); +} + +void sub_80BE658(struct Sprite *sprite) +{ + if (gUnknown_02039B4C->unk64A != 0 && gUnknown_02039B4C->unk64A != 3) + { + DestroySprite(sprite); + } + else + { + u8 r0; + + if (sprite->data[1] != 0) + { + if (gUnknown_02039B4C->selectedPokemon == gUnknown_02039B4C->pokemonListCount - 1) + sprite->invisible = TRUE; + else + sprite->invisible = FALSE; + r0 = sprite->data[2]; + } + else + { + if (gUnknown_02039B4C->selectedPokemon == 0) + sprite->invisible = TRUE; + else + sprite->invisible = FALSE; + r0 = sprite->data[2] - 128; + } + sprite->pos2.y = gSineTable[r0] / 64; + sprite->data[2] = sprite->data[2] + 8; + if (gUnknown_02039B4C->menuIsOpen == 0 && gUnknown_02039B4C->menuY == 0 && sprite->invisible == 0) + sprite->invisible = FALSE; + else + sprite->invisible = TRUE; + } +} + +void sub_80BE758(struct Sprite *sprite) +{ + if (gUnknown_02039B4C->unk64A != 0 && gUnknown_02039B4C->unk64A != 3) + DestroySprite(sprite); +} + +void sub_80BE780(struct Sprite *sprite) +{ + if (gUnknown_02039B4C->unk64A != 0 && gUnknown_02039B4C->unk64A != 3) + { + DestroySprite(sprite); + } + else + { + u8 val; + s16 r3; + s16 r0; + + val = gUnknown_02039B4C->unk62C + sprite->data[1]; + r3 = gSineTable[val]; + r0 = gSineTable[val + 0x40]; + SetOamMatrix(sprite->data[0], r0, r3, -r3, r0); + + val = gUnknown_02039B4C->unk62C + (sprite->data[1] + 0x40); + r3 = gSineTable[val]; + r0 = gSineTable[val + 0x40]; + sprite->pos2.x = r0 * 40 / 256; + sprite->pos2.y = r3 * 40 / 256; + } +} + +void sub_80BE834(struct Sprite *sprite) +{ + if (gUnknown_02039B4C->unk64A != 0 && gUnknown_02039B4C->unk64A != 3) + { + DestroySprite(sprite); + } + else + { + u16 r1 = gUnknown_02039B4C->unk64A == 0 ? 80 : 96; + + if (gUnknown_02039B4C->menuIsOpen != 0 && gUnknown_02039B4C->menuY == r1) + { + sprite->invisible = FALSE; + sprite->pos2.y = gUnknown_02039B4C->menuCursorPos * 16; + sprite->pos2.x = gSineTable[(u8)sprite->data[2]] / 64; + sprite->data[2] += 8; + } + else + { + sprite->invisible = TRUE; + } + } +} + +void sub_80BE8DC(const u8* a, u8 b, u8 c) +{ + u8 sp14[3]; + sp14[0] = 0; + sp14[1] = 15; + sp14[2] = 3; + + AddTextPrinterParameterized2(0, 1, b, c, 0, 0, sp14, -1, a); +} + +u8 sub_80BE91C(struct PokedexListItem* item, u8 b) +{ + u8 taskId; + + gUnknown_02039B54 = item; + taskId = CreateTask(sub_80BEA24, 0); + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = 1; + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[3] = 0; + gTasks[taskId].data[4] = b; + gTasks[taskId].data[5] = 255; + ResetBgsAndClearDma3BusyFlags(0); + InitBgsFromTemplates(0, gUnknown_0856E630, 4); + SetBgTilemapBuffer(3, AllocZeroed(0x800)); + SetBgTilemapBuffer(2, AllocZeroed(0x800)); + SetBgTilemapBuffer(1, AllocZeroed(0x800)); + SetBgTilemapBuffer(0, AllocZeroed(0x800)); + InitWindows(gUnknown_0856E640); + DeactivateAllTextPrinters(); + + return taskId; +} + +bool8 sub_80BE9C4(u8 taskId) +{ + if (gTasks[taskId].data[0] == 0 && gTasks[taskId].func == sub_80BEDF4) + return FALSE; + else + return TRUE; +} + +u8 sub_80BE9F8(struct PokedexListItem *item, u8 b) +{ + gUnknown_02039B54 = item; + gTasks[b].data[0] = 1; + gTasks[b].data[1] = 0; + gTasks[b].data[2] = 0; + gTasks[b].data[3] = 0; + return b; +} + +void sub_80BEA24(u8 taskId) +{ + switch (gMain.state) + { + case 0: + default: + if (!gPaletteFade.active) + { + u16 r2; + + gUnknown_02039B4C->unk64A = 1; + gUnknown_030060B4 = gMain.vblankCallback; + SetVBlankCallback(NULL); + r2 = 0; + if (gTasks[taskId].data[1] != 0) + r2 += 0x1000; + if (gTasks[taskId].data[2] != 0) + r2 |= 0x200; + sub_80C09B0(r2); + gMain.state = 1; + } + break; + case 1: + copy_decompressed_tile_data_to_vram_autofree(3, gPokedexMenu_Gfx, 0x2000, 0, 0); + CopyToBgTilemapBuffer(3, gUnknown_08DC3080, 0, 0); + FillWindowPixelBuffer(0, 0); + PutWindowTilemap(0); + PutWindowTilemap(1); + sub_80C0D30(1, gUnknown_02039B54->dexNum); + CopyWindowToVram(1, 2); + gMain.state++; + break; + case 2: + sub_80BFCDC(0xD); + sub_80BFD0C(gUnknown_02039B4C->selectedScreen, 0xD); + sub_80BC844(gUnknown_02039B4C->unk64C_1); + gMain.state++; + break; + case 3: + gMain.state++; + break; + case 4: + sub_80C020C(gUnknown_02039B54->dexNum, gUnknown_02039B4C->dexMode == 0 ? 0 : 1, gUnknown_02039B54->owned, 0); + if (!gUnknown_02039B54->owned) + LoadPalette(gPlttBufferUnfaded + 1, 0x31, 0x1E); + CopyWindowToVram(0, 3); + CopyBgTilemapBufferToVram(1); + CopyBgTilemapBufferToVram(2); + CopyBgTilemapBufferToVram(3); + gMain.state++; + break; + case 5: + if (gTasks[taskId].data[1] == 0) + { + gTasks[taskId].data[4] = (u16)sub_80C0E9C(gUnknown_02039B54->dexNum, 0x30, 0x38, 0); + gSprites[gTasks[taskId].data[4]].oam.priority = 0; + } + gMain.state++; + break; + case 6: + { + u32 r3 = 0; + + if (gTasks[taskId].data[2] != 0) + r3 = 0x14; + if (gTasks[taskId].data[1] != 0) + r3 |= (1 << (gSprites[gTasks[taskId].data[4]].oam.paletteNum + 16)); + BeginNormalPaletteFade(~r3, 0, 16, 0, 0); + SetVBlankCallback(gUnknown_030060B4); + gMain.state++; + } + break; + case 7: + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); + SetGpuReg(REG_OFFSET_BLDY, 0); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); + HideBg(0); + ShowBg(1); + ShowBg(2); + ShowBg(3); + gMain.state++; + break; + case 8: + if (!gPaletteFade.active) + { + gMain.state++; + if (gTasks[taskId].data[3] == 0) + { + StopCryAndClearCrySongs(); + PlayCry2(NationalPokedexNumToSpecies(gUnknown_02039B54->dexNum), 0, 0x7D, 0xA); + } + else + { + gMain.state++; + } + } + break; + case 9: + if (!IsCryPlayingOrClearCrySongs()) + gMain.state++; + break; + case 10: + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[2] = 1; + gTasks[taskId].data[3] = 1; + gTasks[taskId].func = sub_80BEDF4; + gMain.state = 0; + break; + } +} + +void sub_80BEDB0(void) +{ + void *r0; + FreeAllWindowBuffers(); + r0 = GetBgTilemapBuffer(0); + if (r0) + Free(r0); + r0 = GetBgTilemapBuffer(1); + if (r0) + Free(r0); + r0 = GetBgTilemapBuffer(2); + if (r0) + Free(r0); + r0 = GetBgTilemapBuffer(3); + if (r0) + Free(r0); +} + +void sub_80BEDF4(u8 taskId) +{ + if (gTasks[taskId].data[0] != 0) + { + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gTasks[taskId].func = sub_80BF038; + PlaySE(SE_Z_SCROLL); + return; + } + if (gMain.newKeys & B_BUTTON) + { + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gTasks[taskId].func = sub_80BF070; + PlaySE(SE_PC_OFF); + return; + } + if (gMain.newKeys & A_BUTTON) + { + switch (gUnknown_02039B4C->selectedScreen) + { + case AREA_SCREEN: + BeginNormalPaletteFade(-0x15, 0, 0, 16, 0); + gUnknown_02039B4C->unk64E = 1; + gTasks[taskId].func = sub_80BEFD0; + PlaySE(SE_PIN); + break; + case CRY_SCREEN: + BeginNormalPaletteFade(-0x15, 0, 0, 0x10, 0); + gUnknown_02039B4C->unk64E = 2; + gTasks[taskId].func = sub_80BEFD0; + PlaySE(SE_PIN); + break; + case SIZE_SCREEN: + if (!gUnknown_02039B54->owned) + { + PlaySE(SE_HAZURE); + } + else + { + BeginNormalPaletteFade(-0x15, 0, 0, 0x10, 0); + gUnknown_02039B4C->unk64E = 3; + gTasks[taskId].func = sub_80BEFD0; + PlaySE(SE_PIN); + } + break; + case CANCEL_SCREEN: + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + gTasks[taskId].func = sub_80BF070; + PlaySE(SE_PC_OFF); + break; + } + return; + } + if (((gMain.newKeys & DPAD_LEFT) + || ((gMain.newKeys & L_BUTTON) && gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR)) + && gUnknown_02039B4C->selectedScreen > 0) + { + gUnknown_02039B4C->selectedScreen--; + sub_80BFD0C(gUnknown_02039B4C->selectedScreen, 0xD); + PlaySE(SE_Z_PAGE); + return; + } + if (((gMain.newKeys & DPAD_RIGHT) + || ((gMain.newKeys & R_BUTTON) && gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR)) + && gUnknown_02039B4C->selectedScreen < 3) + { + gUnknown_02039B4C->selectedScreen++; + sub_80BFD0C(gUnknown_02039B4C->selectedScreen, 0xD); + PlaySE(SE_Z_PAGE); + return; + } +} + +void sub_80BEFD0(u8 taskId) +{ + if (!gPaletteFade.active) + { + sub_818D820(gTasks[taskId].data[4]); + switch (gUnknown_02039B4C->unk64E) + { + case 1: + default: + gTasks[taskId].func = sub_80BF0AC; + break; + case 2: + gTasks[taskId].func = sub_80BF250; + break; + case 3: + gTasks[taskId].func = sub_80BF82C; + break; + } + } +} + +void sub_80BF038(u8 taskId) +{ + if (!gPaletteFade.active) + { + sub_818D820(gTasks[taskId].data[4]); + gTasks[taskId].func = sub_80BEA24; + } +} + +void sub_80BF070(u8 taskId) +{ + if (!gPaletteFade.active) + { + sub_818D820(gTasks[taskId].data[4]); + sub_80BEDB0(); + DestroyTask(taskId); + } +} + +void sub_80BF0AC(u8 taskId) +{ + switch (gMain.state) + { + case 0: + default: + if (!gPaletteFade.active) + { + gUnknown_02039B4C->unk64A = 5; + gUnknown_030060B4 = gMain.vblankCallback; + SetVBlankCallback(NULL); + sub_80C09B0(0x200); + gUnknown_02039B4C->selectedScreen = AREA_SCREEN; + gMain.state = 1; + } + break; + case 1: + sub_80BFCF4(0xD); + sub_80BFD7C(0, 0xD); + sub_80BC844(gUnknown_02039B4C->unk64C_1); + SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(13) | BGCNT_16COLOR | BGCNT_TXT256x256); + gMain.state++; + break; + case 2: + sub_813D3D8(NationalPokedexNumToSpecies(gUnknown_02039B54->dexNum), &gUnknown_02039B4C->unk64E); + SetVBlankCallback(gUnknown_030060B4); + gUnknown_02039B4C->unk64E = 0; + gMain.state = 0; + gTasks[taskId].func = sub_80BF1B4; + break; + } +} + +void sub_80BF1B4(u8 taskId) +{ + if (gUnknown_02039B4C->unk64E != 0) + gTasks[taskId].func = sub_80BF1EC; +} + +void sub_80BF1EC(u8 taskId) +{ + if (!gPaletteFade.active) + { + switch (gUnknown_02039B4C->unk64E) + { + case 1: + default: + gTasks[taskId].func = sub_80BEA24; + break; + case 2: + gTasks[taskId].func = sub_80BF250; + break; + } + } +} + +void sub_80BF250(u8 taskId) +{ + switch (gMain.state) + { + case 0: + default: + if (!gPaletteFade.active) + { + m4aMPlayStop(&gMPlayInfo_BGM); + gUnknown_02039B4C->unk64A = 6; + gUnknown_030060B4 = gMain.vblankCallback; + SetVBlankCallback(NULL); + sub_80C09B0(0x200); + gUnknown_02039B4C->selectedScreen = CRY_SCREEN; + gMain.state = 1; + } + break; + case 1: + copy_decompressed_tile_data_to_vram_autofree(3, &gPokedexMenu_Gfx, 0x2000, 0, 0); + CopyToBgTilemapBuffer(3, &gUnknown_08DC3198, 0, 0); + FillWindowPixelBuffer(0, 0); + PutWindowTilemap(0); + PutWindowTilemap(3); + PutWindowTilemap(2); + gMain.state++; + break; + case 2: + sub_80BFCF4(0xD); + sub_80BFD7C(1, 0xD); + sub_80BC844(gUnknown_02039B4C->unk64C_1); + gMain.state++; + break; + case 3: + ResetPaletteFade(); + gMain.state++; + break; + case 4: + sub_80BE8DC(gText_CryOf, 0x52, 33); + sub_80C0B44(0, gUnknown_02039B54->dexNum, 0x52, 49); + gMain.state++; + break; + case 5: + gTasks[taskId].data[4] = sub_80C0E9C(gUnknown_02039B54->dexNum, 48, 56, 0); + gSprites[gTasks[taskId].data[4]].oam.priority = 0; + gUnknown_030061EC = 0; + gMain.state++; + break; + case 6: + { + struct CryRelatedStruct sp4; + + sp4.unk0 = 0x4020; + sp4.unk2 = 0x1F; + sp4.paletteNo = 8; + sp4.yPos = 0x1E; + sp4.xPos = 0xC; + if (sub_8145354(&sp4, 2) != 0) + { + gMain.state++; + gUnknown_030061EC = 0; + } + } + break; + case 7: + { + struct CryRelatedStruct spC; + + spC.paletteNo = 9; + spC.xPos = 0x12; + spC.yPos = 3; + if (sub_8145850(&spC, 3) != 0) + gMain.state++; + CopyWindowToVram(3, 2); + CopyWindowToVram(0, 3); + CopyBgTilemapBufferToVram(0); + CopyBgTilemapBufferToVram(1); + CopyBgTilemapBufferToVram(2); + CopyBgTilemapBufferToVram(3); + } + break; + case 8: + BeginNormalPaletteFade(-0x15, 0, 0x10, 0, 0); + SetVBlankCallback(gUnknown_030060B4); + gMain.state++; + break; + case 9: + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); + SetGpuReg(REG_OFFSET_BLDY, 0); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); + ShowBg(0); + ShowBg(1); + ShowBg(2); + ShowBg(3); + gMain.state++; + break; + case 10: + gUnknown_02039B4C->unk64E = 0; + gMain.state = 0; + gTasks[taskId].func = sub_80BF5CC; + break; + } +} + +void sub_80BF5CC(u8 taskId) +{ + sub_814545C(2); + + if (IsCryPlaying()) + sub_80BF7FC(1); + else + sub_80BF7FC(0); + + if (gMain.newKeys & A_BUTTON) + { + sub_80BF7FC(1); + sub_8145534(NationalPokedexNumToSpecies(gUnknown_02039B54->dexNum)); + return; + } + else if (!gPaletteFade.active) + { + if (gMain.newKeys & B_BUTTON) + { + BeginNormalPaletteFade(-0x15, 0, 0, 0x10, 0); + m4aMPlayContinue(&gMPlayInfo_BGM); + gUnknown_02039B4C->unk64E = 1; + gTasks[taskId].func = sub_80BF790; + PlaySE(SE_PC_OFF); + return; + } + if ((gMain.newKeys & DPAD_LEFT) + || ((gMain.newKeys & L_BUTTON) && gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR)) + { + BeginNormalPaletteFade(-0x15, 0, 0, 0x10, 0); + m4aMPlayContinue(&gMPlayInfo_BGM); + gUnknown_02039B4C->unk64E = 2; + gTasks[taskId].func = sub_80BF790; + PlaySE(SE_Z_PAGE); + return; + } + if ((gMain.newKeys & DPAD_RIGHT) + || ((gMain.newKeys & R_BUTTON) && gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR)) + { + if (!gUnknown_02039B54->owned) + { + PlaySE(SE_HAZURE); + } + else + { + BeginNormalPaletteFade(-0x15, 0, 0, 0x10, 0); + m4aMPlayContinue(&gMPlayInfo_BGM); + gUnknown_02039B4C->unk64E = 3; + gTasks[taskId].func = sub_80BF790; + PlaySE(SE_Z_PAGE); + } + return; + } + } +} + +void sub_80BF790(u8 taskId) +{ + if (!gPaletteFade.active) + { + sub_8145914(); + sub_818D820(gTasks[taskId].data[4]); + switch (gUnknown_02039B4C->unk64E) + { + default: + case 1: + gTasks[taskId].func = sub_80BEA24; + break; + case 2: + gTasks[taskId].func = sub_80BF0AC; + break; + case 3: + gTasks[taskId].func = sub_80BF82C; + break; + } + } +} + +void sub_80BF7FC(u8 a) +{ + u16 unk; + + if (a != 0) + unk = 0x392; + else + unk = 0x2AF; + LoadPalette(&unk, 0x5D, 2); +} + +void sub_80BF82C(u8 taskId) +{ + u8 spriteId; + + switch (gMain.state) + { + default: + case 0: + if (!gPaletteFade.active) + { + gUnknown_02039B4C->unk64A = 7; + gUnknown_030060B4 = gMain.vblankCallback; + SetVBlankCallback(NULL); + sub_80C09B0(0x200); + gUnknown_02039B4C->selectedScreen = SIZE_SCREEN; + gMain.state = 1; + } + break; + case 1: + copy_decompressed_tile_data_to_vram_autofree(3, gPokedexMenu_Gfx, 0x2000, 0, 0); + CopyToBgTilemapBuffer(3, gUnknown_08DC2E6C, 0, 0); + FillWindowPixelBuffer(0, 0); + PutWindowTilemap(0); + gMain.state++; + break; + case 2: + sub_80BFCF4(0xD); + sub_80BFD7C(2, 0xD); + sub_80BC844(gUnknown_02039B4C->unk64C_1); + gMain.state++; + break; + case 3: + { + u8 string[0x40]; //I hope this is the correct size + + StringCopy(string, gText_SizeComparedTo); + StringAppend(string, gSaveBlock2Ptr->playerName); + sub_80BE8DC(string, GetStringCenterAlignXOffset(1, string, 0xF0), 0x79); + gMain.state++; + } + break; + case 4: + ResetPaletteFade(); + gMain.state++; + break; + case 5: + spriteId = sub_80C0EF8(PlayerGenderToFrontTrainerPicId(gSaveBlock2Ptr->playerGender), 152, 56, 0); + gSprites[spriteId].oam.affineMode = 1; + gSprites[spriteId].oam.matrixNum = 1; + gSprites[spriteId].oam.priority = 0; + gSprites[spriteId].pos2.y = gPokedexEntries[gUnknown_02039B54->dexNum].trainerOffset; + SetOamMatrix(1, gPokedexEntries[gUnknown_02039B54->dexNum].trainerScale, 0, 0, gPokedexEntries[gUnknown_02039B54->dexNum].trainerScale); + LoadPalette(gUnknown_0856E610, (gSprites[spriteId].oam.paletteNum + 16) * 16, 0x20); + gTasks[taskId].data[5] = spriteId; + gMain.state++; + break; + case 6: + spriteId = sub_80C0E9C(gUnknown_02039B54->dexNum, 88, 56, 1); + gSprites[spriteId].oam.affineMode = 1; + gSprites[spriteId].oam.matrixNum = 2; + gSprites[spriteId].oam.priority = 0; + gSprites[spriteId].pos2.y = gPokedexEntries[gUnknown_02039B54->dexNum].pokemonOffset; + SetOamMatrix(2, gPokedexEntries[gUnknown_02039B54->dexNum].pokemonScale, 0, 0, gPokedexEntries[gUnknown_02039B54->dexNum].pokemonScale); + LoadPalette(gUnknown_0856E610, (gSprites[spriteId].oam.paletteNum + 16) * 16, 0x20); + gTasks[taskId].data[4] = spriteId; + CopyWindowToVram(0, 3); + CopyBgTilemapBufferToVram(1); + CopyBgTilemapBufferToVram(2); + CopyBgTilemapBufferToVram(3); + gMain.state++; + break; + case 7: + BeginNormalPaletteFade(-0x15, 0, 0x10, 0, 0); + SetVBlankCallback(gUnknown_030060B4); + gMain.state++; + break; + case 8: + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); + SetGpuReg(REG_OFFSET_BLDY, 0); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); + HideBg(0); + ShowBg(1); + ShowBg(2); + ShowBg(3); + gMain.state++; + break; + case 9: + if (!gPaletteFade.active) + { + gUnknown_02039B4C->unk64E = 0; + gMain.state = 0; + gTasks[taskId].func = sub_80BFBB0; + } + break; + } +} + +void sub_80BFBB0(u8 taskId) +{ + if (gMain.newKeys & B_BUTTON) + { + BeginNormalPaletteFade(-0x15, 0, 0, 0x10, 0); + gUnknown_02039B4C->unk64E = 1; + gTasks[taskId].func = sub_80BFC78; + PlaySE(SE_PC_OFF); + } + else if ((gMain.newKeys & DPAD_LEFT) + || ((gMain.newKeys & L_BUTTON) && gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR)) + { + BeginNormalPaletteFade(-0x15, 0, 0, 0x10, 0); + gUnknown_02039B4C->unk64E = 2; + gTasks[taskId].func = sub_80BFC78; + PlaySE(SE_Z_PAGE); + } +} + +void sub_80BFC78(u8 taskId) +{ + if (!gPaletteFade.active) + { + sub_818D820(gTasks[taskId].data[4]); + sub_818D8F0(gTasks[taskId].data[5]); + switch (gUnknown_02039B4C->unk64E) + { + default: + case 1: + gTasks[taskId].func = sub_80BEA24; + break; + case 2: + gTasks[taskId].func = sub_80BF250; + break; + } + } +} + +void sub_80BFCDC(u16 a) +{ + CopyToBgTilemapBuffer(1, gUnknown_08DC2F5C, 0, 0); +} + +void sub_80BFCF4(u16 a) +{ + CopyToBgTilemapBuffer(1, gUnknown_08DC2FEC, 0, 0); +} + +/* void sub_80BFD0C(u8 a, u16 unused) +{ + u8 i; + u8 j; + u16* r7 = GetBgTilemapBuffer(1); + u8 r5; + u16 r3; + + for (i = 0; i < 4; i++) + { + r5 = i * 7 + 1; + if (i == a) + r3 = 0x2000; + else + r3 = 0x4000; + + for (j = 0; j < 7; j++) + { + u32 r1 = (r5 + j); + + *(r7 + r1) = (*(r7 + r1) & 0xFFF) | r3; + *(r7 + 0x40 + r1) = (*(r7 + 0x40 + r1) & 0xFFF) | r3; + } + } + CopyBgTilemapBufferToVram(1); +} */ |