diff options
Diffstat (limited to 'src/pokedex_cry_screen.c')
-rw-r--r-- | src/pokedex_cry_screen.c | 879 |
1 files changed, 248 insertions, 631 deletions
diff --git a/src/pokedex_cry_screen.c b/src/pokedex_cry_screen.c index 9abea27a1..914febd9c 100644 --- a/src/pokedex_cry_screen.c +++ b/src/pokedex_cry_screen.c @@ -11,37 +11,37 @@ extern struct SoundInfo gSoundInfo; extern struct MusicPlayerInfo gMPlayInfo_BGM; -struct Unk201C800 { - s8 unk_0; - s8 unk_1; - u8 unk_2; - u16 unk_4; +struct PokedexCryMeterNeedle { + s8 rotation; + s8 targetRotation; + u8 moveIncrement; + u16 spriteId; }; -struct PokedexCryScreen_201C000 +struct PokedexCryScreen { - u8 unk0000[0x10]; - u8 unk0010; - u8 unk0011; - u8 unk0012; - u16 unk0014; - u8 unk0016; + u8 cryWaveformBuffer[0x10]; + u8 cryState; + u8 playhead; + u8 waveformPreviousY; + u16 charBase; + u8 playStartPos; u16 species; - u8 unk001A; - u8 unk001B; + u8 cryOverrideCountdown; + u8 cryRepeatDelay; }; -void sub_811A0A0(u16 species); -void sub_811A0C0(void); -void sub_811A124(void); -void sub_811A15C(u8); -void sub_811A1C8(u8, u8); -void sub_811A324(void); -void sub_811A350(u8, u16, u8); -void sub_811A534(struct Sprite *); -void sub_811A6D8(s8); +void PlayCryScreenCry(u16 species); +void BufferCryWaveformSegment(void); +void DrawWaveformFlatline(void); +void AdvancePlayhead(u8 bgId); +void DrawWaveformSegment(u8 position, u8 amplitude); +void DrawWaveformWindow(void); +void ShiftWaveformOver(u8 bgId, s16 pos, u8 axis); +void SpriteCB_CryMeterNeedle(struct Sprite *); +void SetCryMeterNeedleTarget(s8); -u8 gUnknown_03005E98; +u8 gDexCryScreenState; // data/pokedex_cry_screen.o @@ -49,16 +49,16 @@ const u16 CryMeterNeedlePalette[] = INCBIN_U16("graphics/pokedex/cry_meter_needl const u8 CryMeterNeedleTiles[] = INCBIN_U8("graphics/pokedex/cry_meter_needle.4bpp"); #if ENGLISH -const u16 gUnknown_083FAE7C[] = INCBIN_U16("graphics/pokedex/cry_meter_map.bin"); -const u16 gUnknown_083FAF1C[] = INCBIN_U16("graphics/pokedex/cry_meter.gbapal"); -const u8 gUnknown_083FAF3C[] = INCBIN_U8("graphics/pokedex/cry_meter.4bpp.lz"); +const u16 sCryMeter_Tilemap[] = INCBIN_U16("graphics/pokedex/cry_meter_map.bin"); +const u16 sCryMeter_Pal[] = INCBIN_U16("graphics/pokedex/cry_meter.gbapal"); +const u8 sCryMeter_Gfx[] = INCBIN_U8("graphics/pokedex/cry_meter.4bpp.lz"); #else -extern const u16 gUnknown_083FAE7C[]; -extern const u16 gUnknown_083FAF1C[]; -extern const u8 gUnknown_083FAF3C[]; +extern const u16 sCryMeter_Tilemap[]; +extern const u16 sCryMeter_Pal[]; +extern const u8 sCryMeter_Gfx[]; #endif // ENGLISH -const u16 gUnknown_083FB274[][72] = { +const u16 sWaveformOffsets[][72] = { { 0x0000, 0x0004, 0x0008, 0x000C, 0x0010, 0x0014, 0x0018, 0x001C, 0x0400, 0x0404, 0x0408, 0x040C, 0x0410, 0x0414, 0x0418, 0x041C, @@ -142,13 +142,16 @@ const u16 gUnknown_083FB274[][72] = { } }; -struct PokedexCryScreen_201C000 * const gPokedexCryScreenPtr = (struct PokedexCryScreen_201C000 *)(gSharedMem + 0x1c000); +struct PokedexCryScreen * const gPokedexCryScreenPtr = &ePokedexCryScreen; -const u16 gUnknown_083FB6F8[] = INCBIN_U16("graphics/pokedex/83FB6F8.gbapal"); -const u16 gUnknown_083FB718[] = INCBIN_U16("graphics/pokedex/83FB718.4bpp"); +const u16 sCryScreenBg_Pal[] = INCBIN_U16("graphics/pokedex/83FB6F8.gbapal"); +const u16 sCryScreenBg_Gfx[] = INCBIN_U16("graphics/pokedex/83FB718.4bpp"); -const u8 gUnknown_083FB738[] = {0xF0, 0x0F}; -const u8 gUnknown_083FB73A[][16] = { +const u8 sWaveformTileDataNybbleMasks[] = {0xF0, 0x0F}; + +// Waveform is blue in the middle (8) grading to white at peaks (15) +// Split into two arrays for the two vertical slice halves +const u8 sWaveformColor[][16] = { { 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F @@ -158,32 +161,30 @@ const u8 gUnknown_083FB73A[][16] = { } }; -struct Unk201C800 * const gPokedexCryScreenPtr2 = (struct Unk201C800 *)(gSharedMem + 0x1c800); +struct PokedexCryMeterNeedle * const gPokedexCryScreenPtr2 = &ePokedexCryScreen2; -union AnimCmd gSpriteAnim_83FB760[] = { +union AnimCmd sAnim_CryMeterNeedle_0[] = { ANIMCMD_FRAME(0, 30), ANIMCMD_END }; -const union AnimCmd * gSpriteAnimTable_83FB768[] = { - gSpriteAnim_83FB760 -}; +const union AnimCmd *sAnimTable_CryMeterNeedle[] = { sAnim_CryMeterNeedle_0 }; -struct OamData gOamData_83FB76C = { +struct OamData sOamData_CryMeterNeedle = { .y = 160, .affineMode = ST_OAM_AFFINE_NORMAL, .size = 3, .priority = 1 }; -struct SpriteTemplate gSpriteTemplate_83FB774 = { +struct SpriteTemplate sSpriteTemplate_CryMeterNeedle = { 0x2000, 0x2000, - &gOamData_83FB76C, - gSpriteAnimTable_83FB768, + &sOamData_CryMeterNeedle, + sAnimTable_CryMeterNeedle, NULL, gDummySpriteAffineAnimTable, - sub_811A534 + SpriteCB_CryMeterNeedle }; struct SpriteSheet gCryMeterNeedleSpriteSheets[] = { @@ -202,640 +203,254 @@ struct SpritePalette gCryMeterNeedleSpritePalettes[] = { #define CRY_METER_MAP_WIDTH 32 #endif -#ifdef NONMATCHING -// caused by some switch branch weirdness -u8 sub_8119E3C(struct CryRelatedStruct *cry, u8 arg1) +bool8 LoadCryWaveformWindow(struct CryScreenWindow *cry, u8 bgId) { u8 i; u8 j; - u16 r6; - u16 r7; - u8 r9 = FALSE; - u32 offset; + u8 position; + u16 tileNum; + u16 screenBase; + bool8 finished = FALSE; - switch (gUnknown_03005E98) + switch (gDexCryScreenState) { - case 0: - gPokedexCryScreenPtr->unk0014 = cry->unk0; - gPokedexCryScreenPtr->unk0016 = cry->yPos; - gPokedexCryScreenPtr->unk001A = 0; - gPokedexCryScreenPtr->unk001B = 0; - gPokedexCryScreenPtr->unk0010 = 0; - gPokedexCryScreenPtr->unk0012 = 28; - gPokedexCryScreenPtr->unk0011 = 0; - sub_811A350(arg1, -8 * cry->xPos, 0); - for (i = 0; i < 7; i++) - { - for (j = 0; j < 32; j++) - { - DmaCopy16(3, gUnknown_083FB718, gSharedMem[32 * i + j], 32); - } - } - gUnknown_03005E98++; - break; - case 1: - r7 = cry->unk2 << 11; - r6 = (cry->paletteNo << 12) + ((unsigned)(cry->unk0 << 18) >> 23); - for (i = 0; i < 7; i++) + case 0: + gPokedexCryScreenPtr->charBase = cry->charBase; + gPokedexCryScreenPtr->playStartPos = cry->yPos; + gPokedexCryScreenPtr->cryOverrideCountdown = 0; + gPokedexCryScreenPtr->cryRepeatDelay = 0; + gPokedexCryScreenPtr->cryState = 0; + gPokedexCryScreenPtr->waveformPreviousY = 28; + gPokedexCryScreenPtr->playhead = 0; + ShiftWaveformOver(bgId, -8 * cry->xPos, 1); + for (i = 0; i < 7; i++) + { + for (j = 0; j < 32; j++) { - for (j = 0; j < 32; j++) - { - offset = j << 1; - offset += i << 6; - offset += r7; - *((u16 *)(VRAM + offset)) = r6++; - } + DmaCopy16(3, sCryScreenBg_Gfx, &sCryWaveformWindowTiledata[((32 * i) + j) * 32], 32); } - for (i = 0; i < gPokedexCryScreenPtr->unk0016 * 8; i++) + } + gDexCryScreenState++; + break; + case 1: + screenBase = cry->screenBase * 0x800; + tileNum = (cry->paletteNo << 12) + ((cry->charBase >> 5) & 0x1FF); + for (i = 0; i < 7; i++) + { + for (j = 0; j < 32; j++) { - sub_811A1C8(i, 0); + *((u16 *)(VRAM + (2 * j) + (64 * i) + screenBase)) = tileNum++; } - gUnknown_03005E98++; - break; - case 2: - sub_811A324(); - LoadPalette(gUnknown_083FB6F8, cry->paletteNo * 16, 32); - r9 = TRUE; - break; + } + for (position = 0; position < gPokedexCryScreenPtr->playStartPos * 8; position++) + { + DrawWaveformSegment(position, 0); + } + gDexCryScreenState++; + break; + case 2: + DrawWaveformWindow(); + LoadPalette(sCryScreenBg_Pal, cry->paletteNo * 16, 32); + finished = TRUE; + break; } - return r9; + return finished; } -#else -NAKED u8 sub_8119E3C(struct CryRelatedStruct *cry, u8 arg1) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r9\n" - "\tmov r6, r8\n" - "\tpush {r6,r7}\n" - "\tadds r5, r0, 0\n" - "\tlsls r1, 24\n" - "\tlsrs r2, r1, 24\n" - "\tmovs r0, 0\n" - "\tmov r9, r0\n" - "\tldr r6, _08119E60 @ =gUnknown_03005E98\n" - "\tldrb r0, [r6]\n" - "\tcmp r0, 0x1\n" - "\tbeq _08119EE0\n" - "\tcmp r0, 0x1\n" - "\tbgt _08119E64\n" - "\tcmp r0, 0\n" - "\tbeq _08119E6A\n" - "\tb _08119F74\n" - "\t.align 2, 0\n" - "_08119E60: .4byte gUnknown_03005E98\n" - "_08119E64:\n" - "\tcmp r0, 0x2\n" - "\tbeq _08119F60\n" - "\tb _08119F74\n" - "_08119E6A:\n" - "\tldr r4, _08119ECC @ =gSharedMem + 0x1C000\n" - "\tldrh r0, [r5]\n" - "\tmovs r1, 0\n" - "\tstrh r0, [r4, 0x14]\n" - "\tldrb r0, [r5, 0x5]\n" - "\tstrb r0, [r4, 0x16]\n" - "\tstrb r1, [r4, 0x1A]\n" - "\tstrb r1, [r4, 0x1B]\n" - "\tstrb r1, [r4, 0x10]\n" - "\tmovs r0, 0x1C\n" - "\tstrb r0, [r4, 0x12]\n" - "\tstrb r1, [r4, 0x11]\n" - "\tldrb r1, [r5, 0x4]\n" - "\tlsls r1, 19\n" - "\tnegs r1, r1\n" - "\tasrs r1, 16\n" - "\tadds r0, r2, 0\n" - "\tmovs r2, 0x1\n" - "\tbl sub_811A350\n" - "\tmovs r0, 0\n" - "\tmov r12, r6\n" - "\tldr r1, _08119ED0 @ =0x040000d4\n" - "\tldr r7, _08119ED4 @ =gUnknown_083FB718\n" - "\tldr r2, _08119ED8 @ =0xfffe4000\n" - "\tadds r6, r4, r2\n" - "\tldr r5, _08119EDC @ =0x80000010\n" - "_08119EA0:\n" - "\tmovs r3, 0\n" - "\tadds r4, r0, 0x1\n" - "\tlsls r2, r0, 5\n" - "_08119EA6:\n" - "\tstr r7, [r1]\n" - "\tadds r0, r2, r3\n" - "\tlsls r0, 5\n" - "\tadds r0, r6\n" - "\tstr r0, [r1, 0x4]\n" - "\tstr r5, [r1, 0x8]\n" - "\tldr r0, [r1, 0x8]\n" - "\tadds r0, r3, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r3, r0, 24\n" - "\tcmp r3, 0x1F\n" - "\tbls _08119EA6\n" - "\tlsls r0, r4, 24\n" - "\tlsrs r0, 24\n" - "\tcmp r0, 0x6\n" - "\tbls _08119EA0\n" - "\tmov r1, r12\n" - "\tb _08119F50\n" - "\t.align 2, 0\n" - "_08119ECC: .4byte gSharedMem + 0x1C000\n" - "_08119ED0: .4byte 0x040000d4\n" - "_08119ED4: .4byte gUnknown_083FB718\n" - "_08119ED8: .4byte 0xfffe4000\n" - "_08119EDC: .4byte 0x80000010\n" - "_08119EE0:\n" - "\tldrb r0, [r5, 0x2]\n" - "\tlsls r0, 27\n" - "\tlsrs r7, r0, 16\n" - "\tldrb r1, [r5, 0x3]\n" - "\tlsls r1, 12\n" - "\tldrh r0, [r5]\n" - "\tlsls r0, 18\n" - "\tlsrs r0, 23\n" - "\tadds r1, r0\n" - "\tlsls r1, 16\n" - "\tlsrs r6, r1, 16\n" - "\tmovs r0, 0\n" - "\tldr r2, _08119F58 @ =gSharedMem + 0x1C000\n" - "\tmov r8, r2\n" - "\tmovs r1, 0xC0\n" - "\tlsls r1, 19\n" - "\tmov r12, r1\n" - "_08119F02:\n" - "\tmovs r3, 0\n" - "\tadds r4, r0, 0x1\n" - "\tlsls r5, r0, 6\n" - "_08119F08:\n" - "\tlsls r1, r3, 1\n" - "\tadds r1, r5\n" - "\tadds r1, r7\n" - "\tadd r1, r12\n" - "\tadds r2, r6, 0\n" - "\tadds r0, r2, 0x1\n" - "\tlsls r0, 16\n" - "\tlsrs r6, r0, 16\n" - "\tstrh r2, [r1]\n" - "\tadds r0, r3, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r3, r0, 24\n" - "\tcmp r3, 0x1F\n" - "\tbls _08119F08\n" - "\tlsls r0, r4, 24\n" - "\tlsrs r0, 24\n" - "\tcmp r0, 0x6\n" - "\tbls _08119F02\n" - "\tmov r2, r8\n" - "\tldrb r0, [r2, 0x16]\n" - "\tmovs r4, 0\n" - "\tcmp r0, 0\n" - "\tbeq _08119F4E\n" - "\tmov r5, r8\n" - "_08119F38:\n" - "\tadds r0, r4, 0\n" - "\tmovs r1, 0\n" - "\tbl sub_811A1C8\n" - "\tadds r0, r4, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r4, r0, 24\n" - "\tldrb r0, [r5, 0x16]\n" - "\tlsls r0, 3\n" - "\tcmp r4, r0\n" - "\tblt _08119F38\n" - "_08119F4E:\n" - "\tldr r1, _08119F5C @ =gUnknown_03005E98\n" - "_08119F50:\n" - "\tldrb r0, [r1]\n" - "\tadds r0, 0x1\n" - "\tstrb r0, [r1]\n" - "\tb _08119F74\n" - "\t.align 2, 0\n" - "_08119F58: .4byte gSharedMem + 0x1C000\n" - "_08119F5C: .4byte gUnknown_03005E98\n" - "_08119F60:\n" - "\tbl sub_811A324\n" - "\tldr r0, _08119F84 @ =gUnknown_083FB6F8\n" - "\tldrb r1, [r5, 0x3]\n" - "\tlsls r1, 4\n" - "\tmovs r2, 0x20\n" - "\tbl LoadPalette\n" - "\tmovs r0, 0x1\n" - "\tmov r9, r0\n" - "_08119F74:\n" - "\tmov r0, r9\n" - "\tpop {r3,r4}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tpop {r4-r7}\n" - "\tpop {r1}\n" - "\tbx r1\n" - "\t.align 2, 0\n" - "_08119F84: .4byte gUnknown_083FB6F8"); -} -#endif // NONMATCHING -void sub_8119F88(u8 a0) +void UpdateCryWaveformWindow(u8 bgId) { u8 r4; - sub_811A324(); - sub_811A15C(a0); - if (gPokedexCryScreenPtr->unk001B) - gPokedexCryScreenPtr->unk001B--; - if (gPokedexCryScreenPtr->unk001A && !--gPokedexCryScreenPtr->unk001A) + DrawWaveformWindow(); + AdvancePlayhead(bgId); + if (gPokedexCryScreenPtr->cryRepeatDelay) + gPokedexCryScreenPtr->cryRepeatDelay--; + if (gPokedexCryScreenPtr->cryOverrideCountdown && !--gPokedexCryScreenPtr->cryOverrideCountdown) { - sub_811A0A0(gPokedexCryScreenPtr->species); - sub_811A124(); + PlayCryScreenCry(gPokedexCryScreenPtr->species); + DrawWaveformFlatline(); return; } - if (gPokedexCryScreenPtr->unk0010 == 0) + if (gPokedexCryScreenPtr->cryState == 0) { - sub_811A124(); + DrawWaveformFlatline(); return; } - if (gPokedexCryScreenPtr->unk0010 == 1) + if (gPokedexCryScreenPtr->cryState == 1) { - sub_811A0C0(); + BufferCryWaveformSegment(); } - else if (gPokedexCryScreenPtr->unk0010 > 8) + else if (gPokedexCryScreenPtr->cryState > 8) { if (!IsCryPlaying()) { - sub_811A124(); - gPokedexCryScreenPtr->unk0010 = 0; + DrawWaveformFlatline(); + gPokedexCryScreenPtr->cryState = 0; return; } - sub_811A0C0(); - gPokedexCryScreenPtr->unk0010 = 1; + BufferCryWaveformSegment(); + gPokedexCryScreenPtr->cryState = 1; } - r4 = 2 * (gPokedexCryScreenPtr->unk0010 - 1); - sub_811A1C8(gPokedexCryScreenPtr->unk0016 * 8 + gPokedexCryScreenPtr->unk0011 - 2, gPokedexCryScreenPtr->unk0000[r4]); - sub_811A1C8(gPokedexCryScreenPtr->unk0016 * 8 + gPokedexCryScreenPtr->unk0011 - 1, gPokedexCryScreenPtr->unk0000[r4 + 1]); - gPokedexCryScreenPtr->unk0010++; + r4 = 2 * (gPokedexCryScreenPtr->cryState - 1); + DrawWaveformSegment(gPokedexCryScreenPtr->playStartPos * 8 + gPokedexCryScreenPtr->playhead - 2, + gPokedexCryScreenPtr->cryWaveformBuffer[r4]); + DrawWaveformSegment(gPokedexCryScreenPtr->playStartPos * 8 + gPokedexCryScreenPtr->playhead - 1, + gPokedexCryScreenPtr->cryWaveformBuffer[r4 + 1]); + gPokedexCryScreenPtr->cryState++; } -void sub_811A050(u16 species) +void CryScreenPlayButton(u16 species) { - if (gMPlayInfo_BGM.status & MUSICPLAYER_STATUS_PAUSE && !gPokedexCryScreenPtr->unk001A) + if (gMPlayInfo_BGM.status & MUSICPLAYER_STATUS_PAUSE && !gPokedexCryScreenPtr->cryOverrideCountdown) { - if (!gPokedexCryScreenPtr->unk001B) + if (!gPokedexCryScreenPtr->cryRepeatDelay) { - gPokedexCryScreenPtr->unk001B = 4; + gPokedexCryScreenPtr->cryRepeatDelay = 4; if (IsCryPlaying() == TRUE) { StopCry(); gPokedexCryScreenPtr->species = species; - gPokedexCryScreenPtr->unk001A = 2; + gPokedexCryScreenPtr->cryOverrideCountdown = 2; } else - sub_811A0A0(species); + PlayCryScreenCry(species); } } } -void sub_811A0A0(u16 species) +void PlayCryScreenCry(u16 species) { - PlayCry2(species, 0, 0x7d, 10); - gPokedexCryScreenPtr->unk0010 = 1; + PlayCry2(species, 0, 125, 10); + gPokedexCryScreenPtr->cryState = 1; } -// compiler refuses to put src into r0. this can't be solved with greg asm hacks -#ifdef NONMATCHING -void sub_811A0C0(void) +#define GetSrcBufferForCryWaveformSegment(counter) ({ \ + const s8 * p; \ + if ((counter) < 2) \ + p = gSoundInfo.pcmBuffer; \ + else \ + p = gSoundInfo.pcmBuffer + (gSoundInfo.pcmDmaPeriod + 1 - gPcmDmaCounter) * gSoundInfo.pcmSamplesPerVBlank; \ + p + PCM_DMA_BUF_SIZE; \ +}) + +void BufferCryWaveformSegment(void) { const s8 * src; u8 i; - if (gPcmDmaCounter < 2) - src = gSoundInfo.pcmBuffer; - else - src = gSoundInfo.pcmBuffer + (gSoundInfo.pcmDmaPeriod + 1 - gPcmDmaCounter) * gSoundInfo.pcmSamplesPerVBlank; - - src += PCM_DMA_BUF_SIZE; + src = GetSrcBufferForCryWaveformSegment(gPcmDmaCounter); for (i = 0; i < 16; i++) - gPokedexCryScreenPtr->unk0000[i] = src[i * 2] * 2; - -} -#else -NAKED void sub_811A0C0(void) -{ - asm_unified("\tpush {r4,lr}\n" - "\tldr r3, _0811A0D0 @ =gPcmDmaCounter\n" - "\tmovs r0, 0\n" - "\tldrsb r0, [r3, r0]\n" - "\tcmp r0, 0x1\n" - "\tbgt _0811A0D8\n" - "\tldr r0, _0811A0D4 @ =gSoundInfo + 0x350\n" - "\tb _0811A0F0\n" - "\t.align 2, 0\n" - "_0811A0D0: .4byte gPcmDmaCounter\n" - "_0811A0D4: .4byte gSoundInfo + 0x350\n" - "_0811A0D8:\n" - "\tldr r2, _0811A11C @ =gSoundInfo\n" - "\tldrb r1, [r2, 0xB]\n" - "\tmovs r0, 0\n" - "\tldrsb r0, [r3, r0]\n" - "\tsubs r0, 0x1\n" - "\tsubs r1, r0\n" - "\tldr r0, [r2, 0x10]\n" - "\tmuls r0, r1\n" - "\tmovs r1, 0xD4\n" - "\tlsls r1, 2\n" - "\tadds r2, r1\n" - "\tadds r0, r2\n" - "_0811A0F0:\n" - "\tmovs r1, 0xC6\n" - "\tlsls r1, 3\n" - "\tadds r3, r0, r1\n" - "\tmovs r2, 0\n" - "\tldr r4, _0811A120 @ =gSharedMem + 0x1C000\n" - "_0811A0FA:\n" - "\tadds r1, r2, r4\n" - "\tlsls r0, r2, 1\n" - "\tadds r0, r3\n" - "\tldrb r0, [r0]\n" - "\tlsls r0, 24\n" - "\tasrs r0, 24\n" - "\tlsls r0, 1\n" - "\tstrb r0, [r1]\n" - "\tadds r0, r2, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r2, r0, 24\n" - "\tcmp r2, 0xF\n" - "\tbls _0811A0FA\n" - "\tpop {r4}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_0811A11C: .4byte gSoundInfo\n" - "_0811A120: .4byte gSharedMem + 0x1C000"); + gPokedexCryScreenPtr->cryWaveformBuffer[i] = src[i * 2] * 2; + } -#endif // NONMATCHING -void sub_811A124(void) +void DrawWaveformFlatline(void) { - sub_811A1C8(gPokedexCryScreenPtr->unk0016 * 8 + gPokedexCryScreenPtr->unk0011 - 2, 0); - sub_811A1C8(gPokedexCryScreenPtr->unk0016 * 8 + gPokedexCryScreenPtr->unk0011 - 1, 0); + DrawWaveformSegment(gPokedexCryScreenPtr->playStartPos * 8 + gPokedexCryScreenPtr->playhead - 2, 0); + DrawWaveformSegment(gPokedexCryScreenPtr->playStartPos * 8 + gPokedexCryScreenPtr->playhead - 1, 0); } -void sub_811A15C(u8 a0) +void AdvancePlayhead(u8 bgId) { u8 i; - u16 r3; - sub_811A350(a0, gPokedexCryScreenPtr->unk0011, 0); - gPokedexCryScreenPtr->unk0011 += 2; - r3 = (gPokedexCryScreenPtr->unk0011 / 8 + gPokedexCryScreenPtr->unk0016 + 1) % 32; + u16 offset; + + ShiftWaveformOver(bgId, gPokedexCryScreenPtr->playhead, 0); + gPokedexCryScreenPtr->playhead += 2; + offset = (gPokedexCryScreenPtr->playhead / 8 + gPokedexCryScreenPtr->playStartPos + 1) % 32; for (i = 0; i < 7; i++) { - DmaCopy16(3, gUnknown_083FB718, &gSharedMem[32 * (32 * i + r3)], 32); + DmaCopy16(3, sCryScreenBg_Gfx, &sCryWaveformWindowTiledata[32 * (32 * i + offset)], 32); } } -#ifdef NONMATCHING -void sub_811A1C8(u8 a0, u8 a1) +void DrawWaveformSegment(u8 position, u8 amplitude) { - u8 sp0; - u8 r7; - u8 r8; - u16 r1 = (a1 + 127) << 8; - u8 i = r1 / 1152.0; - if (i > 71 - 16) - i = 71 - 16; - sp0 = i; - r7 = a0 % 2; - r8 = a0 / 8; - if (i > gPokedexCryScreenPtr->unk0012) +#define PLAY_START_POS (position >> 3) +#define PLAYHEAD_POS (position & ((1 << 3) - 1)) +#define VERT_SLICE (position & 1) + u8 currentPointY; + u8 nybble; + u16 offset; + u16 temp; + u8 y; + + temp = (amplitude + 127) * 256; + y = temp / 1152.0; + if (y > 71 - 16) + y = 71 - 16; + currentPointY = y; + nybble = VERT_SLICE; + if (y > gPokedexCryScreenPtr->waveformPreviousY) { do { - gSharedMem[(u16)(r8 * 32 + gUnknown_083FB274[a0 % 8][i])] &= gUnknown_083FB738[r7]; - gSharedMem[(u16)(r8 * 32 + gUnknown_083FB274[a0 % 8][i])] |= gUnknown_083FB73A[r7][((i / 3) - 1) & 0x0F]; - i--; - } while (i > gPokedexCryScreenPtr->unk0012); + offset = sWaveformOffsets[PLAYHEAD_POS][y] + PLAY_START_POS * TILE_SIZE_4BPP; + sCryWaveformWindowTiledata[offset] &= sWaveformTileDataNybbleMasks[nybble]; + sCryWaveformWindowTiledata[offset] |= sWaveformColor[nybble][((y / 3) - 1) & 0x0F]; + y--; + } while (y > gPokedexCryScreenPtr->waveformPreviousY); } else { do { - gSharedMem[(u16)(r8 * 32 + gUnknown_083FB274[a0 % 8][i])] &= gUnknown_083FB738[r7]; - gSharedMem[(u16)(r8 * 32 + gUnknown_083FB274[a0 % 8][i])] |= gUnknown_083FB73A[r7][((i / 3) - 1) & 0x0F]; - i++; - } while (i < gPokedexCryScreenPtr->unk0012); + offset = sWaveformOffsets[PLAYHEAD_POS][y] + PLAY_START_POS * TILE_SIZE_4BPP; + sCryWaveformWindowTiledata[offset] &= sWaveformTileDataNybbleMasks[nybble]; + sCryWaveformWindowTiledata[offset] |= sWaveformColor[nybble][((y / 3) - 1) & 0x0F]; + y++; + } while (y < gPokedexCryScreenPtr->waveformPreviousY); } - gPokedexCryScreenPtr->unk0012 = sp0; -} -#else -NAKED void sub_811A1C8(u8 a0, u8 a1) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r10\n" - "\tmov r6, r9\n" - "\tmov r5, r8\n" - "\tpush {r5-r7}\n" - "\tsub sp, 0xC\n" - "\tlsls r5, r0, 24\n" - "\tlsrs r4, r5, 24\n" - "\tlsls r1, 24\n" - "\tmovs r0, 0xFE\n" - "\tlsls r0, 23\n" - "\tadds r1, r0\n" - "\tlsrs r1, 16\n" - "\tadds r0, r1, 0\n" - "\tbl __floatsidf\n" - "\tldr r3, _0811A280 @ =0x00000000\n" - "\tldr r2, _0811A27C @ =0x40920000\n" - "\tbl __divdf3\n" - "\tbl __fixunsdfsi\n" - "\tlsls r0, 24\n" - "\tlsrs r6, r0, 24\n" - "\tcmp r6, 0x37\n" - "\tbls _0811A1FE\n" - "\tmovs r6, 0x37\n" - "_0811A1FE:\n" - "\tstr r6, [sp]\n" - "\tmovs r7, 0x1\n" - "\tands r7, r4\n" - "\tldr r0, _0811A284 @ =gSharedMem + 0x1C000\n" - "\tmov r10, r0\n" - "\tlsrs r5, 27\n" - "\tmov r8, r5\n" - "\tldr r0, _0811A288 @ =gUnknown_083FB738\n" - "\tmov r1, r10\n" - "\tldrb r1, [r1, 0x12]\n" - "\tcmp r6, r1\n" - "\tbls _0811A298\n" - "\tadds r0, r7, r0\n" - "\tldrb r0, [r0]\n" - "\tmov r9, r0\n" - "\tmovs r2, 0x7\n" - "\tands r2, r4\n" - "_0811A220:\n" - "\tlsls r1, r6, 1\n" - "\tlsls r0, r2, 3\n" - "\tadds r0, r2\n" - "\tlsls r0, 4\n" - "\tadds r1, r0\n" - "\tldr r3, _0811A28C @ =gUnknown_083FB274\n" - "\tadds r1, r3\n" - "\tmov r3, r8\n" - "\tlsls r0, r3, 5\n" - "\tldrh r1, [r1]\n" - "\tadds r0, r1\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tldr r1, _0811A290 @ =gSharedMem\n" - "\tadds r5, r0, r1\n" - "\tldrb r4, [r5]\n" - "\tmov r3, r9\n" - "\tands r4, r3\n" - "\tstrb r4, [r5]\n" - "\tadds r0, r6, 0\n" - "\tmovs r1, 0x3\n" - "\tstr r2, [sp, 0x8]\n" - "\tbl __udivsi3\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tsubs r0, 0x1\n" - "\tmovs r1, 0xF\n" - "\tands r0, r1\n" - "\tlsls r1, r7, 4\n" - "\tadds r0, r1\n" - "\tldr r1, _0811A294 @ =gUnknown_083FB73A\n" - "\tadds r0, r1\n" - "\tldrb r0, [r0]\n" - "\torrs r4, r0\n" - "\tstrb r4, [r5]\n" - "\tsubs r0, r6, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r6, r0, 24\n" - "\tldr r2, [sp, 0x8]\n" - "\tldr r3, _0811A284 @ =gSharedMem + 0x1C000\n" - "\tldrb r3, [r3, 0x12]\n" - "\tcmp r6, r3\n" - "\tbhi _0811A220\n" - "\tb _0811A2FA\n" - "\t.align 2, 0\n" - "_0811A27C: .4byte 0x40920000\n" - "_0811A280: .4byte 0x00000000\n" - "_0811A284: .4byte gSharedMem + 0x1C000\n" - "_0811A288: .4byte gUnknown_083FB738\n" - "_0811A28C: .4byte gUnknown_083FB274\n" - "_0811A290: .4byte gSharedMem\n" - "_0811A294: .4byte gUnknown_083FB73A\n" - "_0811A298:\n" - "\tlsls r1, r7, 4\n" - "\tstr r1, [sp, 0x4]\n" - "\tadds r0, r7, r0\n" - "\tldrb r0, [r0]\n" - "\tmov r9, r0\n" - "\tmovs r7, 0x7\n" - "\tands r7, r4\n" - "_0811A2A6:\n" - "\tlsls r1, r6, 1\n" - "\tlsls r0, r7, 3\n" - "\tadds r0, r7\n" - "\tlsls r0, 4\n" - "\tadds r1, r0\n" - "\tldr r2, _0811A314 @ =gUnknown_083FB274\n" - "\tadds r1, r2\n" - "\tmov r3, r8\n" - "\tlsls r0, r3, 5\n" - "\tldrh r1, [r1]\n" - "\tadds r0, r1\n" - "\tlsls r0, 16\n" - "\tlsrs r0, 16\n" - "\tldr r1, _0811A318 @ =gSharedMem\n" - "\tadds r5, r0, r1\n" - "\tldrb r4, [r5]\n" - "\tmov r2, r9\n" - "\tands r4, r2\n" - "\tstrb r4, [r5]\n" - "\tadds r0, r6, 0\n" - "\tmovs r1, 0x3\n" - "\tbl __udivsi3\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tsubs r0, 0x1\n" - "\tmovs r1, 0xF\n" - "\tands r0, r1\n" - "\tldr r3, [sp, 0x4]\n" - "\tadds r0, r3\n" - "\tldr r1, _0811A31C @ =gUnknown_083FB73A\n" - "\tadds r0, r1\n" - "\tldrb r0, [r0]\n" - "\torrs r4, r0\n" - "\tstrb r4, [r5]\n" - "\tadds r0, r6, 0x1\n" - "\tlsls r0, 24\n" - "\tlsrs r6, r0, 24\n" - "\tldr r2, _0811A320 @ =gSharedMem + 0x1C000\n" - "\tldrb r2, [r2, 0x12]\n" - "\tcmp r6, r2\n" - "\tbcc _0811A2A6\n" - "_0811A2FA:\n" - "\tmov r3, sp\n" - "\tldrb r0, [r3]\n" - "\tmov r3, r10\n" - "\tstrb r0, [r3, 0x12]\n" - "\tadd sp, 0xC\n" - "\tpop {r3-r5}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tmov r10, r5\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_0811A314: .4byte gUnknown_083FB274\n" - "_0811A318: .4byte gSharedMem\n" - "_0811A31C: .4byte gUnknown_083FB73A\n" - "_0811A320: .4byte gSharedMem + 0x1C000"); + gPokedexCryScreenPtr->waveformPreviousY = currentPointY; + #undef PLAYHEAD_POS + #undef PLAY_START_POS + #undef VERT_SLICE } -#endif // NONMATCHING -void sub_811A324(void) +void DrawWaveformWindow(void) { - DmaCopy16(3, gSharedMem, VRAM + gPokedexCryScreenPtr->unk0014, 0x1c00); + DmaCopy16(3, sCryWaveformWindowTiledata, VRAM + gPokedexCryScreenPtr->charBase, 0x1c00); } -void sub_811A350(u8 a0, u16 a1, u8 a2) +void ShiftWaveformOver(u8 bgId, s16 pos, u8 axis) { - switch (a0) + switch (bgId) { case 0: - if (a2) - REG_BG0VOFS = a1; + if (axis) + REG_BG0VOFS = pos; else - REG_BG0HOFS = a1; + REG_BG0HOFS = pos; break; case 1: - if (a2) - REG_BG1VOFS = a1; + if (axis) + REG_BG1VOFS = pos; else - REG_BG1HOFS = a1; + REG_BG1HOFS = pos; break; case 2: - if (a2) - REG_BG2VOFS = a1; + if (axis) + REG_BG2VOFS = pos; else - REG_BG2HOFS = a1; + REG_BG2HOFS = pos; break; case 3: - if (a2) - REG_BG3VOFS = a1; + if (axis) + REG_BG3VOFS = pos; else - REG_BG3HOFS = a1; + REG_BG3HOFS = pos; break; } } -u8 ShowPokedexCryScreen(struct CryRelatedStruct *cry, u8 arg1) { +bool8 ShowPokedexCryScreen(struct CryScreenWindow *cry, UNUSED u8 arg1) { int returnVal = FALSE; - switch (gUnknown_03005E98) + switch (gDexCryScreenState) { case 0: - LZ77UnCompVram(gUnknown_083FAF3C, (void *) (VRAM + cry->unk0)); - LoadPalette(&gUnknown_083FAF1C, cry->paletteNo * 16, 0x20); - gUnknown_03005E98 += 1; + LZ77UnCompVram(sCryMeter_Gfx, (void *) (VRAM + cry->charBase)); + LoadPalette(sCryMeter_Pal, cry->paletteNo * 16, 0x20); + gDexCryScreenState++; break; case 1: @@ -845,9 +460,9 @@ u8 ShowPokedexCryScreen(struct CryRelatedStruct *cry, u8 arg1) { u32 r12; int x, y; - vram = BG_SCREEN_ADDR(cry->unk2); + vram = BG_SCREEN_ADDR(cry->screenBase); - r12 = (u32) (cry->unk0 << 18) >> 23; + r12 = (cry->charBase >> 5) & 0x1FF; for (row = 0; row < 8; row++) { @@ -855,11 +470,11 @@ u8 ShowPokedexCryScreen(struct CryRelatedStruct *cry, u8 arg1) { { y = row + cry->yPos; x = col + cry->xPos; - *(u16 *) (vram + (y * 64 + x * 2)) = (gUnknown_083FAE7C[row * CRY_METER_MAP_WIDTH + col] | (cry->paletteNo << 12)) + r12; + *(u16 *) (vram + (y * 64 + x * 2)) = (sCryMeter_Tilemap[row * CRY_METER_MAP_WIDTH + col] | (cry->paletteNo << 12)) + r12; } } - gUnknown_03005E98 += 1; + gDexCryScreenState += 1; break; } @@ -867,10 +482,10 @@ u8 ShowPokedexCryScreen(struct CryRelatedStruct *cry, u8 arg1) { { LoadSpriteSheets(gCryMeterNeedleSpriteSheets); LoadSpritePalettes(gCryMeterNeedleSpritePalettes); - gPokedexCryScreenPtr2->unk_4 = CreateSprite(&gSpriteTemplate_83FB774, 40 + cry->xPos * 8, 56 + cry->yPos * 8, 1); - gPokedexCryScreenPtr2->unk_0 = 0x20; - gPokedexCryScreenPtr2->unk_1 = 0x20; - gPokedexCryScreenPtr2->unk_2 = 0; + gPokedexCryScreenPtr2->spriteId = CreateSprite(&sSpriteTemplate_CryMeterNeedle, 40 + cry->xPos * 8, 56 + cry->yPos * 8, 1); + gPokedexCryScreenPtr2->rotation = 0x20; + gPokedexCryScreenPtr2->targetRotation = 0x20; + gPokedexCryScreenPtr2->moveIncrement = 0; returnVal = TRUE; break; @@ -882,82 +497,84 @@ u8 ShowPokedexCryScreen(struct CryRelatedStruct *cry, u8 arg1) { void DestroyCryMeterNeedleSprite(void) { - FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(gSprites[gPokedexCryScreenPtr2->unk_4].oam.paletteNum)); - DestroySprite(gSprites + gPokedexCryScreenPtr2->unk_4); + FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(gSprites[gPokedexCryScreenPtr2->spriteId].oam.paletteNum)); + DestroySprite(gSprites + gPokedexCryScreenPtr2->spriteId); } -void sub_811A534(struct Sprite * sprite) +void SpriteCB_CryMeterNeedle(struct Sprite * sprite) { u16 i; - s8 r3; + s8 peakAmplitude; s16 x; s16 y; - struct ObjAffineSrcData sp04; - struct OamMatrix sp0c; + struct ObjAffineSrcData affine; + struct OamMatrix matrix; u8 * r0; - gSprites[gPokedexCryScreenPtr2->unk_4].oam.affineMode = ST_OAM_AFFINE_NORMAL; - gSprites[gPokedexCryScreenPtr2->unk_4].oam.affineParam = 0; - switch (gPokedexCryScreenPtr->unk0010) + gSprites[gPokedexCryScreenPtr2->spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; + gSprites[gPokedexCryScreenPtr2->spriteId].oam.affineParam = 0; + switch (gPokedexCryScreenPtr->cryState) { case 0: - gPokedexCryScreenPtr2->unk_1 = 0x20; - if (gPokedexCryScreenPtr2->unk_0 > 0) + gPokedexCryScreenPtr2->targetRotation = 0x20; + if (gPokedexCryScreenPtr2->rotation > 0) { - if (gPokedexCryScreenPtr2->unk_2 != 1) - gPokedexCryScreenPtr2->unk_2--; + if (gPokedexCryScreenPtr2->moveIncrement != 1) + gPokedexCryScreenPtr2->moveIncrement--; } else - gPokedexCryScreenPtr2->unk_2 = 5; + gPokedexCryScreenPtr2->moveIncrement = 5; break; case 2: - r3 = 0; + peakAmplitude = 0; for (i = 0; i < 16; i++) { - if (r3 < gPokedexCryScreenPtr->unk0000[i]) - r3 = gPokedexCryScreenPtr->unk0000[i]; + if (peakAmplitude < gPokedexCryScreenPtr->cryWaveformBuffer[i]) + peakAmplitude = gPokedexCryScreenPtr->cryWaveformBuffer[i]; } - sub_811A6D8(r3 * 0xd0 / 0x100); + SetCryMeterNeedleTarget(peakAmplitude * 0xd0 / 0x100); break; case 6: - r0 = &gPokedexCryScreenPtr->unk0000[10]; - sub_811A6D8(*r0 * 0xd0 / 0x100); + r0 = &gPokedexCryScreenPtr->cryWaveformBuffer[10]; + SetCryMeterNeedleTarget(*r0 * 0xd0 / 0x100); break; } - if (gPokedexCryScreenPtr2->unk_0 == gPokedexCryScreenPtr2->unk_1) - ; - else if (gPokedexCryScreenPtr2->unk_0 < gPokedexCryScreenPtr2->unk_1) + if (gPokedexCryScreenPtr2->rotation == gPokedexCryScreenPtr2->targetRotation) + ; // Empty, needle has reached target + else if (gPokedexCryScreenPtr2->rotation < gPokedexCryScreenPtr2->targetRotation) { - if ((gPokedexCryScreenPtr2->unk_0 += gPokedexCryScreenPtr2->unk_2) > gPokedexCryScreenPtr2->unk_1) + // Rotate needle left + if ((gPokedexCryScreenPtr2->rotation += gPokedexCryScreenPtr2->moveIncrement) > gPokedexCryScreenPtr2->targetRotation) { - gPokedexCryScreenPtr2->unk_0 = gPokedexCryScreenPtr2->unk_1; - gPokedexCryScreenPtr2->unk_1 = 0; + gPokedexCryScreenPtr2->rotation = gPokedexCryScreenPtr2->targetRotation; + gPokedexCryScreenPtr2->targetRotation = 0; } } else { - if ((gPokedexCryScreenPtr2->unk_0 -= gPokedexCryScreenPtr2->unk_2) < gPokedexCryScreenPtr2->unk_1) + // Rotate needle right + if ((gPokedexCryScreenPtr2->rotation -= gPokedexCryScreenPtr2->moveIncrement) < gPokedexCryScreenPtr2->targetRotation) { - gPokedexCryScreenPtr2->unk_0 = gPokedexCryScreenPtr2->unk_1; - gPokedexCryScreenPtr2->unk_1 = 0; + gPokedexCryScreenPtr2->rotation = gPokedexCryScreenPtr2->targetRotation; + gPokedexCryScreenPtr2->targetRotation = 0; } } - sp04.xScale = 0x100; - sp04.yScale = 0x100; - sp04.rotation = gPokedexCryScreenPtr2->unk_0 * 256; - ObjAffineSet(&sp04, &sp0c, 1, 2); - SetOamMatrix(0, sp0c.a, sp0c.b, sp0c.c, sp0c.d); - x = gSineTable[((gPokedexCryScreenPtr2->unk_0 + 0x7F) & 0xFF)]; - y = gSineTable[((gPokedexCryScreenPtr2->unk_0 + 0x7F) & 0xFF) + 0x40]; + affine.xScale = 0x100; + affine.yScale = 0x100; + affine.rotation = gPokedexCryScreenPtr2->rotation * 256; + ObjAffineSet(&affine, &matrix, 1, 2); + SetOamMatrix(0, matrix.a, matrix.b, matrix.c, matrix.d); + x = gSineTable[((gPokedexCryScreenPtr2->rotation + 0x7F) & 0xFF)]; + y = gSineTable[((gPokedexCryScreenPtr2->rotation + 0x7F) & 0xFF) + 0x40]; sprite->pos2.x = x * 24 / 256; sprite->pos2.y = y * 24 / 256; } -void sub_811A6D8(s8 a0) +void SetCryMeterNeedleTarget(s8 offset) { - u16 r2 = (0x20 - a0) & 0xff; - if (r2 > 0x20 && r2 < 0xe0) - r2 = 0xe0; - gPokedexCryScreenPtr2->unk_1 = r2; - gPokedexCryScreenPtr2->unk_2 = 5; + u16 rotation = (0x20 - offset) & 0xff; + if (rotation > 0x20 && rotation < 0xe0) + rotation = 0xe0; + gPokedexCryScreenPtr2->targetRotation = rotation; + gPokedexCryScreenPtr2->moveIncrement = 5; } |