diff options
-rw-r--r-- | asm/pokedex_cry_screen.s | 149 | ||||
-rw-r--r-- | include/asm.h | 9 | ||||
-rw-r--r-- | include/asm.inc.h | 7 | ||||
-rw-r--r-- | ld_script.txt | 2 | ||||
-rw-r--r-- | src/pokedex.c | 28 | ||||
-rw-r--r-- | src/pokedex_cry_screen.c | 85 |
6 files changed, 110 insertions, 170 deletions
diff --git a/asm/pokedex_cry_screen.s b/asm/pokedex_cry_screen.s index bded77228..da52c84d4 100644 --- a/asm/pokedex_cry_screen.s +++ b/asm/pokedex_cry_screen.s @@ -737,154 +737,7 @@ _0811A3C4: _0811A3C8: .4byte REG_BG3HOFS thumb_func_end sub_811A350 - thumb_func_start ShowPokedexCryScreen -ShowPokedexCryScreen: @ 811A3CC - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x4 - adds r4, r0, 0 - movs r0, 0 - str r0, [sp] - ldr r0, _0811A3F4 @ =gUnknown_03005E98 - ldrb r1, [r0] - mov r10, r0 - cmp r1, 0x1 - beq _0811A42C - cmp r1, 0x1 - bgt _0811A3F8 - cmp r1, 0 - beq _0811A3FE - b _0811A4D6 - .align 2, 0 -_0811A3F4: .4byte gUnknown_03005E98 -_0811A3F8: - cmp r1, 0x2 - beq _0811A494 - b _0811A4D6 -_0811A3FE: - ldr r0, _0811A424 @ =gUnknown_083FAF3C - ldrh r1, [r4] - movs r2, 0xC0 - lsls r2, 19 - adds r1, r2 - bl LZ77UnCompVram - ldr r0, _0811A428 @ =gUnknown_083FAF1C - ldrb r1, [r4, 0x3] - lsls r1, 4 - movs r2, 0x20 - bl LoadPalette - mov r1, r10 - ldrb r0, [r1] - adds r0, 0x1 - strb r0, [r1] - b _0811A4D6 - .align 2, 0 -_0811A424: .4byte gUnknown_083FAF3C -_0811A428: .4byte gUnknown_083FAF1C -_0811A42C: - ldrb r0, [r4, 0x2] - lsls r0, 11 - movs r1, 0xC0 - lsls r1, 19 - adds r0, r1 - mov r8, r0 - ldrh r0, [r4] - lsls r0, 18 - lsrs r0, 23 - mov r12, r0 - movs r5, 0 - ldr r2, _0811A490 @ =gUnknown_083FAE7C - mov r9, r2 -_0811A446: - movs r3, 0 - lsls r0, r5, 2 - adds r7, r5, 0x1 - adds r0, r5 - lsls r6, r0, 1 -_0811A450: - ldrb r0, [r4, 0x5] - adds r0, r5, r0 - ldrb r2, [r4, 0x4] - adds r2, r3, r2 - lsls r2, 1 - lsls r0, 6 - adds r2, r0 - add r2, r8 - adds r1, r6, r3 - lsls r1, 1 - add r1, r9 - ldrb r0, [r4, 0x3] - lsls r0, 12 - ldrh r1, [r1] - orrs r0, r1 - add r0, r12 - strh r0, [r2] - adds r0, r3, 0x1 - lsls r0, 24 - lsrs r3, r0, 24 - cmp r3, 0x9 - bls _0811A450 - lsls r0, r7, 24 - lsrs r5, r0, 24 - cmp r5, 0x7 - bls _0811A446 - mov r3, r10 - ldrb r0, [r3] - adds r0, 0x1 - strb r0, [r3] - b _0811A4D6 - .align 2, 0 -_0811A490: .4byte gUnknown_083FAE7C -_0811A494: - ldr r0, _0811A4E8 @ =gCryMeterNeedleSpriteSheets - bl LoadSpriteSheets - ldr r0, _0811A4EC @ =gCryMeterNeedleSpritePalettes - bl LoadSpritePalettes - ldr r0, _0811A4F0 @ =gSpriteTemplate_83FB774 - ldrb r1, [r4, 0x4] - lsls r1, 19 - movs r2, 0xA0 - lsls r2, 14 - adds r1, r2 - asrs r1, 16 - ldrb r2, [r4, 0x5] - lsls r2, 19 - movs r3, 0xE0 - lsls r3, 14 - adds r2, r3 - asrs r2, 16 - movs r3, 0x1 - bl CreateSprite - ldr r1, _0811A4F4 @ =0x0201c800 - lsls r0, 24 - lsrs r0, 24 - movs r2, 0 - strh r0, [r1, 0x4] - movs r0, 0x20 - strb r0, [r1] - strb r0, [r1, 0x1] - strb r2, [r1, 0x2] - movs r0, 0x1 - str r0, [sp] -_0811A4D6: - ldr r0, [sp] - add sp, 0x4 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_0811A4E8: .4byte gCryMeterNeedleSpriteSheets -_0811A4EC: .4byte gCryMeterNeedleSpritePalettes -_0811A4F0: .4byte gSpriteTemplate_83FB774 -_0811A4F4: .4byte 0x0201c800 - thumb_func_end ShowPokedexCryScreen +.section .text_811A4F8 thumb_func_start DestroyCryMeterNeedleSprite DestroyCryMeterNeedleSprite: @ 811A4F8 diff --git a/include/asm.h b/include/asm.h index fe1b3139f..e72683e45 100644 --- a/include/asm.h +++ b/include/asm.h @@ -45,6 +45,15 @@ struct UnknownStruct_FPA u16 unk14; }; +struct CryRelatedStruct +{ + u16 unk0; + u8 unk2; + u8 paletteNo; + u8 xPos; + u8 yPos; +}; + #include "asm.inc.h" #endif //PROJECT_ASM_H diff --git a/include/asm.inc.h b/include/asm.inc.h index 582c3ebb7..23156e756 100644 --- a/include/asm.inc.h +++ b/include/asm.inc.h @@ -375,6 +375,13 @@ void sub_810FA54(void); // asm/battle_records.o void InitLinkBattleRecords(void); +// asm/pokedex_cry_screen.o +u8 sub_8119E3C(struct CryRelatedStruct *, u8); +void sub_8119F88(u8 a); +void sub_811A050(u16 species); +u8 ShowPokedexCryScreen(struct CryRelatedStruct *, u8); +void DestroyCryMeterNeedleSprite(); + // asm/battle_transition.o void sub_811AABC(u8); void sub_811AAD8(u8); diff --git a/ld_script.txt b/ld_script.txt index f6a9ade48..dd0f01e97 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -228,6 +228,8 @@ SECTIONS { asm/evolution_scene.o(.text); asm/roulette.o(.text); asm/pokedex_cry_screen.o(.text); + src/pokedex_cry_screen.o(.text); + asm/pokedex_cry_screen.o(.text_811A4F8); src/coins.o(.text); src/landmark.o(.text); src/fldeff_strength.o(.text); diff --git a/src/pokedex.c b/src/pokedex.c index a5dcfe049..3ef1de51e 100644 --- a/src/pokedex.c +++ b/src/pokedex.c @@ -51,15 +51,6 @@ struct PokedexEntry /*0x20*/ u16 trainerOffset; }; /*size = 0x24*/ -struct CryRelatedStruct -{ - u16 unk0; - u8 unk2; - u8 unk3; - u8 unk4; - u8 unk5; -}; - extern struct MusicPlayerInfo gMPlay_BGM; extern u8 gReservedSpritePaletteCount; extern struct PokedexView *gPokedexView; @@ -124,13 +115,6 @@ u16 NationalPokedexNumToSpecies(u16); // asm/pokedex_area_screen void ShowPokedexAreaScreen(u16 species, u8 *string); -// asm/pokedex_cry_screen -u8 sub_8119E3C(struct CryRelatedStruct *, u8); -void sub_8119F88(u8 a); -void sub_811A050(u16 species); -u8 ShowPokedexCryScreen(struct CryRelatedStruct *, u8); -void DestroyCryMeterNeedleSprite(); - void sub_808C02C(void) { u16 i; @@ -2526,9 +2510,9 @@ void Task_InitCryScreenMultistep(u8 taskId) sp8.unk0 = 0x4020; sp8.unk2 = 0x1F; - sp8.unk3 = 8; - sp8.unk5 = 0x1E; - sp8.unk4 = 0xC; + sp8.paletteNo = 8; + sp8.yPos = 0x1E; + sp8.xPos = 0xC; if (sub_8119E3C(&sp8, 0) != 0) { gMain.state++; @@ -2542,9 +2526,9 @@ void Task_InitCryScreenMultistep(u8 taskId) sp10.unk0 = 0x3000; sp10.unk2 = 0xE; - sp10.unk3 = 9; - sp10.unk4 = 0x12; - sp10.unk5 = 3; + sp10.paletteNo = 9; + sp10.xPos = 0x12; + sp10.yPos = 3; if (ShowPokedexCryScreen(&sp10, 1) != 0) { gMain.state++; diff --git a/src/pokedex_cry_screen.c b/src/pokedex_cry_screen.c new file mode 100644 index 000000000..53807befc --- /dev/null +++ b/src/pokedex_cry_screen.c @@ -0,0 +1,85 @@ +#include "global.h" +#include "asm.h" +#include "palette.h" +#include "sprite.h" + +struct Unk201C800 { + u8 unk_0; + u8 unk_1; + u8 unk_2; + u8 filler_3; + u16 unk_4; +}; + +#define EWRAM_1C800 (*(struct Unk201C800 *)(unk_201C000 + 0x800)) + +extern u8 unk_201C000[]; + +extern u8 gUnknown_03005E98; + +// data/pokedex_cry_screen.o +extern const u16 gUnknown_083FAE7C[]; +extern const u16 gUnknown_083FAF1C[]; +extern const u8 gUnknown_083FAF3C[]; +extern struct SpriteTemplate gSpriteTemplate_83FB774; +extern const struct SpriteSheet gCryMeterNeedleSpriteSheets[]; +extern const struct SpritePalette gCryMeterNeedleSpritePalettes[]; + +#if ENGLISH +#define CRY_METER_MAP_WIDTH 10 +#elif GERMAN +#define CRY_METER_MAP_WIDTH 32 +#endif + +u8 ShowPokedexCryScreen(struct CryRelatedStruct *cry, u8 arg1) { + int returnVal = FALSE; + + switch (gUnknown_03005E98) + { + case 0: + LZ77UnCompVram(gUnknown_083FAF3C, (void *) (VRAM + cry->unk0)); + LoadPalette(&gUnknown_083FAF1C, cry->paletteNo * 16, 0x20); + gUnknown_03005E98 += 1; + break; + + case 1: + { + void *vram; + u8 row, col; + u32 r12; + int x, y; + + vram = (void *) BG_SCREEN_ADDR(cry->unk2); + + r12 = (u32) (cry->unk0 << 18) >> 23; + + for (row = 0; row < 8; row++) + { + for (col = 0; col < 10; col++) + { + 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; + } + } + + gUnknown_03005E98 += 1; + break; + } + + case 2: + { + LoadSpriteSheets(gCryMeterNeedleSpriteSheets); + LoadSpritePalettes(gCryMeterNeedleSpritePalettes); + EWRAM_1C800.unk_4 = CreateSprite(&gSpriteTemplate_83FB774, 40 + cry->xPos * 8, 56 + cry->yPos * 8, 1); + EWRAM_1C800.unk_0 = 0x20; + EWRAM_1C800.unk_1 = 0x20; + EWRAM_1C800.unk_2 = 0; + + returnVal = TRUE; + break; + } + } + + return returnVal; +} |