diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/field/choose_party.c | 1 | ||||
-rw-r--r-- | src/pokemon/pokemon_summary_screen.c | 2117 |
2 files changed, 2080 insertions, 38 deletions
diff --git a/src/field/choose_party.c b/src/field/choose_party.c index c3845e48b..bf4d74c96 100644 --- a/src/field/choose_party.c +++ b/src/field/choose_party.c @@ -32,7 +32,6 @@ EWRAM_DATA u8 gSelectedOrderFromParty[3] = {0}; extern u8 sub_806BD58(u8, u8); extern void PartyMenuPrintMonsLevelOrStatus(void); extern void sub_806BC3C(u8, u8); -extern void ShowPokemonSummaryScreen(struct Pokemon *, u8, u8, void (*)(void), int); extern u8 GetMonStatusAndPokerus(); extern void PartyMenuPrintHP(); extern bool8 sub_80F9344(void); diff --git a/src/pokemon/pokemon_summary_screen.c b/src/pokemon/pokemon_summary_screen.c index edbd2998b..7241b24f0 100644 --- a/src/pokemon/pokemon_summary_screen.c +++ b/src/pokemon/pokemon_summary_screen.c @@ -1,13 +1,14 @@ #include "global.h" #include "battle.h" -#include "pokemon_summary_screen.h" #include "data2.h" #include "decompress.h" +#include "event_data.h" #include "ewram.h" #include "item.h" #include "items.h" #include "learn_move.h" #include "link.h" +#include "m4a.h" #include "main.h" #include "menu.h" #include "menu_helpers.h" @@ -16,6 +17,7 @@ #include "party_menu.h" #include "pokeball.h" #include "pokemon.h" +#include "pokemon_summary_screen.h" #include "region_map.h" #include "sound.h" #include "species.h" @@ -25,32 +27,24 @@ #include "strings2.h" #include "task.h" #include "tv.h" - -struct SummaryScreenStruct -{ - /*0x00*/ u8 filler0[8]; - /*0x08*/ u8 unk8; - /*0x09*/ u8 unk9; - /*0x0A*/ u8 fillerA; - /*0x0B*/ u8 unkB; - /*0x0C*/ u8 fillerC; - /*0x0D*/ u8 unkD; - /*0x0E*/ u8 fillerE[0x2]; - /*0x10*/ struct Pokemon unk10; - /*0x74*/ u8 filler74; - /*0x75*/ u8 unk75; - /*0x76*/ u8 unk76; - /*0x77*/ u8 filler77[0x2]; - /*0x79*/ u8 unk79; - /*0x7A*/ u8 unk7A; - /*0x7B*/ u8 filler7B; - /*0x7C*/ u16 unk7C; - /*0x7E*/ u8 unk7E; - /*0x7F*/ u8 unk7F; -}; +#include "unknown_task.h" #define ewramSS (*(struct SummaryScreenStruct *)(gSharedMem + 0x18000)) +static void sub_809DE44(void); +static void sub_809EB40(u8); +static void sub_809EBC4(void); +static void sub_809E044(void); +static void sub_80A1D84(struct Pokemon *); +static void sub_80A18C4(void); +static bool8 LoadPokemonSummaryScreenGraphics(void); +static bool8 MonKnowsMultipleMoves(struct Pokemon *); +extern void PrintSummaryWindowHeaderText(void); +static void sub_80A1DCC(struct Pokemon *); +static void sub_809FE80(void); +static void sub_80A00A4(void); +static void sub_80A0390(void); +extern void sub_80A015C(struct Pokemon *); extern u8 sub_80A1808(struct Pokemon *); extern void sub_80A1F98(s32, u8, u8, u8, u8, u16, s32); static void sub_80A0958(struct Pokemon *); @@ -61,18 +55,64 @@ static void sub_80A1F48(const u8 *, u8, u8, u8, u16); static void PrintHeldItemName(u16, u8, u8); static void PrintNumRibbons(struct Pokemon *); static void DrawExperienceProgressBar(struct Pokemon *, u8, u8); - +static void sub_809E13C(u8 taskId); +static void sub_80A1950(void); +static void sub_809DA1C(void); +static void sub_809D844(void); + +extern void sub_809D85C(void); +extern void sub_809DE64(void); +extern bool8 sub_809DA84(void); +extern void SummaryScreenHandleAButton(u8); +extern void SummaryScreenHandleUpDownInput(u8, s8); +extern bool8 sub_809F7D0(u8); +extern void sub_809F9D0(u8, u8); +extern void sub_809EAC8(u8); +extern void sub_809E534(u8); +extern void sub_809E83C(u8, s8); +extern void sub_809E7F0(u8); +extern void sub_809E6D8(void); +extern void sub_809E5C4(void); +extern void sub_80A1B40(u8); +extern void sub_80A2078(int); +extern void sub_809E3FC(u8); +extern void SummaryScreenHandleKeyInput(u8); +extern void sub_80A1B1C(u8); +extern void sub_80A16CC(u8); +extern void sub_80A1A30(u8); +extern void DrawSummaryScreenNavigationDots(void); +extern void sub_80A00F4(u8); +extern void sub_80A029C(struct Pokemon *); +extern void sub_809EE74(u8); +extern void sub_809EC38(u8); +extern void sub_809FBE4(void); +extern void sub_809F0D0(u8, s8); +extern void sub_80A1500(u8); +extern void sub_80A1334(u8); +extern u8 StorageSystemGetNextMonIndex(struct BoxPokemon *, u8, u8, u8); +extern void sub_809F43C(u8); +extern s8 sub_809F284(s8); +extern s8 sub_809F3CC(s8); +extern bool8 sub_809F310(struct Pokemon *); +extern s8 sub_809F344(u8); +extern s8 sub_809F388(u8); +extern bool8 sub_809F5F8(void); +extern void sub_80A1DE8(struct Pokemon *); +extern u8 sub_809F6B4(struct Pokemon *, u8 *); +extern void DrawPokerusSurvivorDot(struct Pokemon *); +extern void sub_80A12D0(s8); +extern void sub_809FAC8(struct Pokemon *); extern void SummaryScreenHandleLeftRightInput(u8, s8); -extern void sub_809E8F0(u8, s8); +extern void sub_809E8F0(u8, s8, u8*); extern void sub_809E260(u8); extern void sub_809F814(u8); extern void sub_80A1654(s8, u8); extern void sub_80A1488(s8, u8); extern void GetStringCenterAlignXOffsetWithLetterSpacing(u8, u8, u8, u8); extern bool8 sub_809FA94(struct Pokemon *); -extern void sub_809FC34(struct Pokemon *); +static void sub_809FC34(struct Pokemon *); extern void sub_809FC0C(void); -extern void sub_809FF64(struct Pokemon *); +static void sub_809FF64(struct Pokemon *); extern void sub_809FEB8(void); extern void sub_80A1918(u8, u8); extern void sub_80A198C(u8, u8, u8, u8); @@ -95,6 +135,36 @@ extern u8 *sub_80A1E58(u8 *, u8); static void sub_80A0A2C(struct Pokemon *, u8, u8); extern void sub_80A1FF8(const u8 *, u8, u8, u8); +extern struct MusicPlayerInfo gMPlay_BGM; +extern u8 gUnknown_020384F0; +extern u8 gUnknown_08208238[]; +extern u16 gUnknown_030041B8; +extern u16 gUnknown_03004280; +extern u16 gUnknown_030041B4; +extern u16 gUnknown_030042C0; +extern u16 gUnknown_03004288; +extern u16 gUnknown_030041B0; +extern const u16 gSummaryScreenTextTiles[]; +extern const u16 gSummaryScreenButtonTiles[]; +extern const u8 gMoveTypes_Pal[]; +extern const u8 gStatusScreen_Pal[]; +extern const u8 gStatusScreen_Tilemap[]; +extern const struct CompressedSpritePalette gUnknown_083C1278; +extern const struct CompressedSpritePalette gUnknown_083C12FC; +extern const struct CompressedSpriteSheet gUnknown_083C12F4; +extern const struct CompressedSpriteSheet gUnknown_083C1270; +extern const struct CompressedSpriteSheet gUnknown_083C11B8; +extern const u8 gUnknown_08E74688[]; +extern const u8 gUnknown_08E73E88[]; +extern const u8 gUnknown_08E74E88[]; +extern const u8 gUnknown_08E73508[]; +extern const u8 gStatusScreen_Gfx[]; +extern const u8 gFontDefaultPalette[]; +extern const u8 gUnknownPalette_81E6692[]; +extern const u8 gUnknown_083C15A8[]; +extern const void (*gUnknown_083C1580[])(void); +extern const void (*gUnknown_083C1598[])(struct Pokemon *); +extern const void (*gUnknown_083C1588[])(struct Pokemon *); extern const u16 gUnknown_083C157E[]; extern const u16 gUnknown_083C157C[]; extern const u8 gAbilityNames[][13]; @@ -121,6 +191,1979 @@ extern const u8 gUnknown_083C15B4[]; extern const u8 *const gUnknown_083C1068[]; +void sub_809D844(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +void sub_809D85C(void) +{ + REG_BG1HOFS = gUnknown_030042C0; + REG_BG1VOFS = gUnknown_030041B4; + REG_BG2HOFS = gUnknown_03004288; + REG_BG2VOFS = gUnknown_03004280; + REG_BG3HOFS = gUnknown_030041B0; + REG_BG3VOFS = gUnknown_030041B8; + + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +void ShowPokemonSummaryScreen(struct Pokemon *party, u8 partyIndex, u8 partyCount, MainCallback func, u8 e) +{ + gPaletteFade.bufferTransferDisabled = 1; + + ewramSS.unk0.partyMons = party; + ewramSS.unk8 = e; + ewramSS.unk9 = partyIndex; + ewramSS.unkA = partyCount; + ewramSS.unk4 = func; + ewramSS.unk74 = 0; + ewramSS.unk79 = 4; + ewramSS.unk7C = 0; + ewramSS.unk80 = 0; + ewramSS.unk7B = 0; + + if (e > 4) + { + ewramSS.unkE = 1; + } + else + { + ewramSS.unkE = 0; + } + + switch (e) + { + case 0: + case 5: + ewramSS.unk75 = 0; + ewramSS.unk76 = 3; + ewramSS.unk77 = 0; + ewramSS.unk78 = 0; + ewramSS.unk7E = 1; + ewramSS.unk7F = 7; + break; + case 4: + ewramSS.unk75 = 0; + ewramSS.unk76 = 3; + ewramSS.unk77 = 0; + ewramSS.unk78 = 0; + ewramSS.unk7E = 1; + ewramSS.unk7F = 7; + ewramSS.unk7B = 1; + break; + case 2: + ewramSS.unk75 = 2; + ewramSS.unk76 = 3; + ewramSS.unk77 = 1; + ewramSS.unk78 = 1; + ewramSS.unk7E = 3; + ewramSS.unk7F = 0; + ewramSS.unk79 = 0; + break; + case 1: + case 6: + ewramSS.unk75 = 2; + ewramSS.unk76 = 3; + ewramSS.unk77 = 1; + ewramSS.unk78 = 1; + break; + } + + ewramSS.unkB = ewramSS.unk75; + SetMainCallback2(sub_809DE44); +} + +void sub_809D9F0(struct Pokemon *party, u8 partyIndex, u8 partyCount, MainCallback func, u16 e) +{ + ShowPokemonSummaryScreen(party, partyIndex, partyCount, func, 2); + ewramSS.unk7C = e; +} + +void sub_809DA1C(void) +{ + switch (ewramSS.unk8) + { + case 0: + case 5: + ewramSS.unkF = CreateTask(SummaryScreenHandleKeyInput, 0); + break; + case 4: + ewramSS.unkF = CreateTask(SummaryScreenHandleKeyInput, 0); + break; + case 2: + case 3: + ewramSS.unkF = CreateTask(sub_809EB40, 0); + break; + case 1: + case 6: + ewramSS.unkF = CreateTask(sub_809E3FC, 0); + break; + } +} + +bool8 sub_809DA84(void) +{ + const u16 *src; + void *dest; + + switch (gMain.state) + { + case 0: + SetVBlankCallback(NULL); + ResetSpriteData(); + gMain.state++; + break; + case 1: + remove_some_task(); + gMain.state++; + break; + case 2: + FreeAllSpritePalettes(); + gMain.state++; + break; + case 3: + dest = (void *)VRAM; + DmaClearLarge(3, dest, 0x10000, 0x1000, 32); + gMain.state++; + break; + case 4: + sub_809DE64(); + gMain.state++; + break; + case 5: + SetUpWindowConfig(&gWindowConfig_81E6E6C); + gMain.state++; + break; + case 6: + MultistepInitMenuWindowBegin(&gWindowConfig_81E6E6C); + gMain.state++; + break; + case 7: + if (MultistepInitMenuWindowContinue()) + { + gMain.state++; + } + break; + case 8: + sub_809DA1C(); + gMain.state++; + break; + case 9: + src = gSummaryScreenTextTiles; + dest = (void *)VRAM + 0xD000; + DmaCopy16(3, src, dest, 320); + + src = gSummaryScreenButtonTiles; + dest = (void *)VRAM + 0xD140; + DmaCopy16(3, src, dest, 256); + + ewramSS.unk74 = 0; + gMain.state++; + break; + case 10: + if (LoadPokemonSummaryScreenGraphics()) + { + ewramSS.unk74 = 0; + gMain.state++; + } + break; + case 11: + sub_80A18C4(); + gMain.state++; + break; + case 12: + sub_809F678(&ewramSS.unk10); + if (!GetMonStatusAndPokerus(&ewramSS.unk10)) + { + sub_80A12D0(0); + } + else + { + sub_80A12D0(10); + } + + DrawPokerusSurvivorDot(&ewramSS.unk10); + gMain.state++; + break; + case 13: + sub_80A1950(); + sub_80A1D84(&ewramSS.unk10); + gMain.state++; + break; + case 14: + sub_80A1DE8(&ewramSS.unk10); + ewramSS.unk74 = 0; + gMain.state++; + break; + case 15: + if ((ewramSS.unkC = sub_809F6B4(&ewramSS.unk10, &ewramSS.unk74)) != 0xFF) + { + ewramSS.unk74 = 0; + gMain.state++; + } + break; + case 16: + sub_809E044(); + DrawSummaryScreenNavigationDots(); + gMain.state++; + break; + case 17: + if (ewramSS.unkB < 2) + { + gUnknown_083C1580[ewramSS.unkB](); + } + + gMain.state++; + break; + case 18: + sub_809FAC8(&ewramSS.unk10); + gMain.state++; + break; + case 19: + gUnknown_083C1598[ewramSS.unkB](&ewramSS.unk10); + gMain.state++; + break; + case 20: + if (GetMonData(&ewramSS.unk10, MON_DATA_IS_EGG)) + { + gUnknown_030041B0 = 256; + } + else + { + gUnknown_030041B0 = 0; + } + + gMain.state++; + break; + case 21: + sub_809EBC4(); + if (ewramSS.unk79 != 0) + { + sub_80A1488(0, 0); + sub_80A1654(0, 0); + } + else + { + sub_80A1488(10, 0); + sub_80A1654(10, 0); + } + + PrintSummaryWindowHeaderText(); + gMain.state++; + break; + case 22: + if (sub_8055870() != TRUE) + { + gMain.state++; + } + break; + default: + SetVBlankCallback(sub_809D85C); + BeginHardwarePaletteFade(0xFF, 0, 16, 0, 1); + SetMainCallback2(sub_809D844); + gPaletteFade.bufferTransferDisabled = 0; + return TRUE; + break; + } + + return FALSE; +} + +void sub_809DE44(void) +{ + while (sub_809DA84() != TRUE && sub_80F9344() != TRUE); +} + +void sub_809DE64(void) +{ + REG_BG0CNT = 0x1E08; + REG_BG1CNT = 0x4801; + REG_BG2CNT = 0x4A02; + REG_BG3CNT = 0x5C03; + + gUnknown_030042C0 = 0; + gUnknown_030041B4 = 0; + gUnknown_03004288 = 0; + gUnknown_03004280 = 0; + gUnknown_030041B0 = 0; + gUnknown_030041B8 = 0; + + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + + REG_BLDCNT = 0; + REG_DISPCNT = 0x1F40; +} + +bool8 LoadPokemonSummaryScreenGraphics(void) +{ + switch (ewramSS.unk74) + { + case 0: + LZDecompressVram(gStatusScreen_Gfx, (void *)VRAM + 0); + break; + case 1: + CpuSet(gUnknown_08E73508, (void *)VRAM + 0xE000, 0x400); + break; + case 2: + LZDecompressVram(gUnknown_08E74E88, (void *)VRAM + 0xE800); + break; + case 3: + LZDecompressVram(gStatusScreen_Tilemap, (void *)VRAM + 0x4800); + break; + case 4: + CpuSet(gUnknown_08E73E88, (void *)VRAM + 0x5800, 0x400); + break; + case 5: + CpuSet(gUnknown_08E74688, (void *)VRAM + 0x6800, 0x400); + break; + case 6: + LoadCompressedPalette(gStatusScreen_Pal, 0, 160); + break; + case 7: + LoadCompressedObjectPic(&gUnknown_083C11B8); + break; + case 8: + LoadCompressedObjectPic(&gUnknown_083C1270); + break; + case 9: + LoadCompressedObjectPic(&gUnknown_083C12F4); + break; + case 10: + LoadCompressedObjectPalette(&gUnknown_083C12FC); + break; + case 11: + LoadCompressedObjectPalette(&gUnknown_083C1278); + break; + case 12: + LoadCompressedPalette(gMoveTypes_Pal, 464, 96); + ewramSS.unk74 = 0; + return TRUE; + } + + ewramSS.unk74++; + return FALSE; +} + +void sub_809E044(void) +{ + LoadPalette(&gUnknownPalette_81E6692[28], 129, 2); + LoadPalette(&gUnknownPalette_81E6692[30], 136, 2); + LoadPalette(&gUnknownPalette_81E6692[28], 143, 2); + LoadPalette(&gUnknownPalette_81E6692[30], 137, 2); + LoadPalette(&gUnknownPalette_81E6692[12], 209, 4); + LoadPalette(&gUnknownPalette_81E6692[20], 211, 4); + LoadPalette(&gUnknownPalette_81E6692[28], 213, 4); + LoadPalette(&gUnknownPalette_81E6692[12], 215, 4); + LoadPalette(&gUnknownPalette_81E6692[8], 217, 4); + LoadPalette(&gUnknownPalette_81E6692[16], 219, 4); + LoadPalette(&gUnknownPalette_81E6692[4], 221, 2); + LoadPalette(&gUnknownPalette_81E6692[6], 222, 2); + LoadPalette(&gUnknownPalette_81E6692[2], 223, 2); + LoadPalette(gFontDefaultPalette, 240, 32); + LoadPalette(&gUnknownPalette_81E6692[6], 249, 2); +} + +void SummaryScreenExit(u8 taskId) +{ + PlaySE(5); + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gTasks[taskId].func = sub_809E13C; +} + +void sub_809E13C(u8 taskId) +{ + if (sub_8055870() != TRUE && !gPaletteFade.active) + { + gUnknown_020384F0 = ewramSS.unk9; + + ResetSpriteData(); + FreeAllSpritePalettes(); + StopCryAndClearCrySongs(); + m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x100); + SetMainCallback2(ewramSS.unk4); + DestroyTask(taskId); + } +} + +void SummaryScreenHandleKeyInput(u8 taskId) +{ + if (gPaletteFade.active) + return; + + if (gMain.newKeys & DPAD_UP) + { + SummaryScreenHandleUpDownInput(taskId, -1); + } + else if (gMain.newKeys & DPAD_DOWN) + { + SummaryScreenHandleUpDownInput(taskId, 1); + } + else if ((gMain.newKeys & DPAD_LEFT) || sub_80F9284() == 1) + { + SummaryScreenHandleLeftRightInput(taskId, -1); + } + else if ((gMain.newKeys & DPAD_RIGHT) || sub_80F9284() == 2) + { + SummaryScreenHandleLeftRightInput(taskId, 1); + } + else if (gMain.newKeys & A_BUTTON) + { + if (ewramSS.unkB > 1) + { + SummaryScreenHandleAButton(taskId); + } + + if (ewramSS.unkB == 0) + { + SummaryScreenExit(taskId); + } + } + else if (gMain.newKeys & B_BUTTON) + { + SummaryScreenExit(taskId); + } +} + +void sub_809E260(u8 taskId) +{ + if (gPaletteFade.active) + return; + + if (gMain.newKeys & DPAD_UP) + { + gTasks[taskId].data[0] = 4; + sub_809E8F0(taskId, -1, &ewramSS.unk79); + } + else if (gMain.newKeys & DPAD_DOWN) + { + gTasks[taskId].data[0] = 4; + sub_809E8F0(taskId, 1, &ewramSS.unk79); + } + else if ((gMain.newKeys & DPAD_LEFT) || sub_80F9284() == 1) + { + if (ewramSS.unkB == 3 && (ewramSS.unk79 != 4 || ewramSS.unk7C != 0)) + { + MenuZeroFillWindowRect(0, 14, 9, 18); + } + + SummaryScreenHandleLeftRightInput(taskId, -1); + } + else if ((gMain.newKeys & DPAD_RIGHT) || sub_80F9284() == 2) + { + if (ewramSS.unkB != ewramSS.unk76) + { + if (ewramSS.unkB == 2 && (ewramSS.unk79 != 4 || ewramSS.unk7C != 0)) + { + MenuZeroFillWindowRect(0, 14, 9, 18); + } + + SummaryScreenHandleLeftRightInput(taskId, 1); + } + } + else if (gMain.newKeys & A_BUTTON) + { + if (sub_809F7D0(taskId) == 1 || ewramSS.unk79 == 4) + { + ewramSS.unk7A = ewramSS.unk79; + gSpecialVar_0x8005 = ewramSS.unk7A; + SummaryScreenExit(taskId); + } + else + { + PlaySE(32); + sub_809F9D0(taskId, ewramSS.unk79); + } + } + else if (gMain.newKeys & B_BUTTON) + { + ewramSS.unk7A = 4; + gSpecialVar_0x8005 = 4; + SummaryScreenExit(taskId); + } +} + +void sub_809E3FC(u8 taskId) +{ + if (gPaletteFade.active) + return; + + if (gMain.newKeys & DPAD_UP) + { + gTasks[taskId].data[0] = 4; + sub_809E8F0(taskId, -1, &ewramSS.unk79); + } + else if (gMain.newKeys & DPAD_DOWN) + { + gTasks[taskId].data[0] = 4; + sub_809E8F0(taskId, 1, &ewramSS.unk79); + } + else if (gMain.newKeys & A_BUTTON) + { + if (ewramSS.unk79 != 4 && ewramSS.unk7B == 0) + { + if (!MonKnowsMultipleMoves(&ewramSS.unk10)) + { + PlaySE(32); + } + else + { + PlaySE(5); + + ewramSS.unk7A = ewramSS.unk79; + sub_80A1B40(1); + sub_80A1A30(19); + + gTasks[taskId].func = sub_809E534; + } + } + else + { + PlaySE(5); + sub_809EAC8(taskId); + } + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(5); + sub_809EAC8(taskId); + } + +} + +bool8 MonKnowsMultipleMoves(struct Pokemon *mon) +{ + u8 i; + + for (i = 1; i < 4; i++) + { + if (GetMonMove(mon, i)) + { + return TRUE; + } + } + + return FALSE; +} + +void sub_809E534(u8 taskId) +{ + if (gMain.newKeys & DPAD_UP) + { + gTasks[taskId].data[0] = 3; + sub_809E8F0(taskId, -1, &ewramSS.unk7A); + } + else if (gMain.newKeys & DPAD_DOWN) + { + gTasks[taskId].data[0] = 3; + sub_809E8F0(taskId, 1, &ewramSS.unk7A); + } + else if (gMain.newKeys & A_BUTTON) + { + sub_809E83C(taskId, 1); + } + else if (gMain.newKeys & B_BUTTON) + { + sub_809E83C(taskId, -1); + } +} + +__attribute__((naked)) +void sub_809E5C4(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x20\n\ + ldr r1, _0809E6D0 @ =gSharedMem + 0x18000\n\ + ldr r5, [r1]\n\ + ldrb r2, [r1, 0x9]\n\ + movs r0, 0x64\n\ + muls r0, r2\n\ + adds r5, r0\n\ + adds r0, r1, 0\n\ + adds r0, 0x79\n\ + ldrb r0, [r0]\n\ + mov r8, r0\n\ + adds r1, 0x7A\n\ + ldrb r6, [r1]\n\ + adds r0, 0xD\n\ + str r0, [sp, 0x8]\n\ + adds r0, r5, 0\n\ + ldr r1, [sp, 0x8]\n\ + bl GetMonData\n\ + mov r1, sp\n\ + adds r1, 0x2\n\ + str r1, [sp, 0x14]\n\ + strh r0, [r1]\n\ + adds r2, r6, 0\n\ + adds r2, 0xD\n\ + str r2, [sp, 0xC]\n\ + adds r0, r5, 0\n\ + adds r1, r2, 0\n\ + bl GetMonData\n\ + mov r1, sp\n\ + strh r0, [r1]\n\ + mov r3, r8\n\ + adds r3, 0x11\n\ + str r3, [sp, 0x10]\n\ + adds r0, r5, 0\n\ + adds r1, r3, 0\n\ + bl GetMonData\n\ + mov r7, sp\n\ + adds r7, 0x5\n\ + str r7, [sp, 0x18]\n\ + strb r0, [r7]\n\ + adds r0, r6, 0\n\ + adds r0, 0x11\n\ + str r0, [sp, 0x1C]\n\ + adds r0, r5, 0\n\ + ldr r1, [sp, 0x1C]\n\ + bl GetMonData\n\ + add r1, sp, 0x4\n\ + mov r10, r1\n\ + strb r0, [r1]\n\ + adds r0, r5, 0\n\ + movs r1, 0x15\n\ + bl GetMonData\n\ + mov r4, sp\n\ + adds r4, 0x6\n\ + strb r0, [r4]\n\ + ldr r1, _0809E6D4 @ =gUnknown_08208238\n\ + mov r2, r8\n\ + adds r0, r2, r1\n\ + ldrb r0, [r0]\n\ + mov r9, r0\n\ + ldrb r0, [r4]\n\ + adds r2, r0, 0\n\ + mov r3, r9\n\ + ands r2, r3\n\ + mov r7, r8\n\ + lsls r7, 1\n\ + mov r8, r7\n\ + asrs r2, r7\n\ + lsls r2, 24\n\ + lsrs r2, 24\n\ + adds r1, r6, r1\n\ + ldrb r3, [r1]\n\ + adds r1, r0, 0\n\ + ands r1, r3\n\ + lsls r6, 1\n\ + asrs r1, r6\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ + mov r7, r9\n\ + bics r0, r7\n\ + strb r0, [r4]\n\ + ldrb r0, [r4]\n\ + bics r0, r3\n\ + strb r0, [r4]\n\ + lsls r2, r6\n\ + mov r0, r8\n\ + lsls r1, r0\n\ + adds r2, r1\n\ + ldrb r0, [r4]\n\ + orrs r0, r2\n\ + strb r0, [r4]\n\ + adds r0, r5, 0\n\ + ldr r1, [sp, 0x8]\n\ + mov r2, sp\n\ + bl SetMonData\n\ + adds r0, r5, 0\n\ + ldr r1, [sp, 0xC]\n\ + ldr r2, [sp, 0x14]\n\ + bl SetMonData\n\ + adds r0, r5, 0\n\ + ldr r1, [sp, 0x10]\n\ + mov r2, r10\n\ + bl SetMonData\n\ + adds r0, r5, 0\n\ + ldr r1, [sp, 0x1C]\n\ + ldr r2, [sp, 0x18]\n\ + bl SetMonData\n\ + adds r0, r5, 0\n\ + movs r1, 0x15\n\ + adds r2, r4, 0\n\ + bl SetMonData\n\ + add sp, 0x20\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0809E6D0: .4byte gSharedMem + 0x18000\n\ +_0809E6D4: .4byte gUnknown_08208238\n\ + .syntax divided\n"); +} + +__attribute__((naked)) +void sub_809E6D8(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x20\n\ + ldr r2, _0809E7E8 @ =gSharedMem + 0x18000\n\ + ldr r5, [r2]\n\ + ldrb r1, [r2, 0x9]\n\ + lsls r0, r1, 2\n\ + adds r0, r1\n\ + lsls r0, 4\n\ + adds r5, r0\n\ + adds r0, r2, 0\n\ + adds r0, 0x79\n\ + ldrb r0, [r0]\n\ + mov r8, r0\n\ + adds r2, 0x7A\n\ + ldrb r6, [r2]\n\ + adds r0, 0xD\n\ + str r0, [sp, 0x8]\n\ + adds r0, r5, 0\n\ + ldr r1, [sp, 0x8]\n\ + bl GetBoxMonData\n\ + mov r1, sp\n\ + adds r1, 0x2\n\ + str r1, [sp, 0x14]\n\ + strh r0, [r1]\n\ + adds r2, r6, 0\n\ + adds r2, 0xD\n\ + str r2, [sp, 0xC]\n\ + adds r0, r5, 0\n\ + adds r1, r2, 0\n\ + bl GetBoxMonData\n\ + mov r1, sp\n\ + strh r0, [r1]\n\ + mov r3, r8\n\ + adds r3, 0x11\n\ + str r3, [sp, 0x10]\n\ + adds r0, r5, 0\n\ + adds r1, r3, 0\n\ + bl GetBoxMonData\n\ + mov r7, sp\n\ + adds r7, 0x5\n\ + str r7, [sp, 0x18]\n\ + strb r0, [r7]\n\ + adds r0, r6, 0\n\ + adds r0, 0x11\n\ + str r0, [sp, 0x1C]\n\ + adds r0, r5, 0\n\ + ldr r1, [sp, 0x1C]\n\ + bl GetBoxMonData\n\ + add r1, sp, 0x4\n\ + mov r10, r1\n\ + strb r0, [r1]\n\ + adds r0, r5, 0\n\ + movs r1, 0x15\n\ + bl GetBoxMonData\n\ + mov r4, sp\n\ + adds r4, 0x6\n\ + strb r0, [r4]\n\ + ldr r1, _0809E7EC @ =gUnknown_08208238\n\ + mov r2, r8\n\ + adds r0, r2, r1\n\ + ldrb r0, [r0]\n\ + mov r9, r0\n\ + ldrb r0, [r4]\n\ + adds r2, r0, 0\n\ + mov r3, r9\n\ + ands r2, r3\n\ + mov r7, r8\n\ + lsls r7, 1\n\ + mov r8, r7\n\ + asrs r2, r7\n\ + lsls r2, 24\n\ + lsrs r2, 24\n\ + adds r1, r6, r1\n\ + ldrb r3, [r1]\n\ + adds r1, r0, 0\n\ + ands r1, r3\n\ + lsls r6, 1\n\ + asrs r1, r6\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ + mov r7, r9\n\ + bics r0, r7\n\ + strb r0, [r4]\n\ + ldrb r0, [r4]\n\ + bics r0, r3\n\ + strb r0, [r4]\n\ + lsls r2, r6\n\ + mov r0, r8\n\ + lsls r1, r0\n\ + adds r2, r1\n\ + ldrb r0, [r4]\n\ + orrs r0, r2\n\ + strb r0, [r4]\n\ + adds r0, r5, 0\n\ + ldr r1, [sp, 0x8]\n\ + mov r2, sp\n\ + bl SetBoxMonData\n\ + adds r0, r5, 0\n\ + ldr r1, [sp, 0xC]\n\ + ldr r2, [sp, 0x14]\n\ + bl SetBoxMonData\n\ + adds r0, r5, 0\n\ + ldr r1, [sp, 0x10]\n\ + mov r2, r10\n\ + bl SetBoxMonData\n\ + adds r0, r5, 0\n\ + ldr r1, [sp, 0x1C]\n\ + ldr r2, [sp, 0x18]\n\ + bl SetBoxMonData\n\ + adds r0, r5, 0\n\ + movs r1, 0x15\n\ + adds r2, r4, 0\n\ + bl SetBoxMonData\n\ + add sp, 0x20\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0809E7E8: .4byte gSharedMem + 0x18000\n\ +_0809E7EC: .4byte gUnknown_08208238\n\ + .syntax divided\n"); +} + +void sub_809E7F0(u8 taskId) +{ + if (sub_809F5F8()) + { + ewramSS.unk74 = 0; + sub_80A0428(&ewramSS.unk10, &ewramSS.unk79); + gTasks[taskId].func = sub_809E3FC; + sub_80A2078(taskId); + } +} + +void sub_809E83C(u8 taskId, s8 b) +{ + PlaySE(5); + + sub_80A1B1C(19); + sub_80A1B40(0); + + if (b == 1) + { + if (ewramSS.unk79 != ewramSS.unk7A) + { + if (ewramSS.unkE == 0) + { + sub_809E5C4(); + } + else + { + sub_809E6D8(); + } + + ewramSS.unk79 = ewramSS.unk7A; + sub_809F678(&ewramSS.unk10); + ewramSS.unk74 = 1; + + gTasks[taskId].func = sub_809E7F0; + return; + } + } + else + { + sub_80A0428(&ewramSS.unk10, &ewramSS.unk79); + } + + gTasks[taskId].func = sub_809E3FC; + sub_80A2078(taskId); +} + +__attribute__((naked)) +void sub_809E8F0(u8 taskId, s8 direction, u8 *c) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x8\n\ + adds r4, r1, 0\n\ + mov r9, r2\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r8, r0\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + movs r0, 0x1\n\ + str r0, [sp]\n\ + movs r0, 0x5\n\ + bl PlaySE\n\ + mov r1, r9\n\ + ldrb r6, [r1]\n\ + ldr r1, _0809E944 @ =gTasks\n\ + mov r2, r8\n\ + lsls r0, r2, 2\n\ + add r0, r8\n\ + lsls r0, 3\n\ + adds r0, r1\n\ + ldrb r0, [r0, 0x8]\n\ + movs r2, 0\n\ + lsls r4, 24\n\ + asrs r4, 24\n\ + mov r10, r4\n\ + lsls r7, r0, 24\n\ +_0809E930:\n\ + lsls r0, r6, 24\n\ + asrs r0, 24\n\ + add r0, r10\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ + asrs r1, r0, 24\n\ + cmp r0, r7\n\ + ble _0809E948\n\ + movs r6, 0\n\ + b _0809E94E\n\ + .align 2, 0\n\ +_0809E944: .4byte gTasks\n\ +_0809E948:\n\ + cmp r1, 0\n\ + bge _0809E94E\n\ + lsrs r6, r7, 24\n\ +_0809E94E:\n\ + lsls r4, r6, 24\n\ + lsrs r1, r4, 24\n\ + ldr r0, _0809EA10 @ =gSharedMem + 0x18010\n\ + str r2, [sp, 0x4]\n\ + bl GetMonMove\n\ + lsls r0, 16\n\ + adds r5, r4, 0\n\ + ldr r2, [sp, 0x4]\n\ + cmp r0, 0\n\ + bne _0809E97A\n\ + asrs r0, r5, 24\n\ + cmp r0, 0x4\n\ + beq _0809E97A\n\ + lsls r0, r2, 24\n\ + movs r3, 0x80\n\ + lsls r3, 17\n\ + adds r0, r3\n\ + lsrs r2, r0, 24\n\ + asrs r0, 24\n\ + cmp r0, 0x3\n\ + ble _0809E930\n\ +_0809E97A:\n\ + mov r1, r9\n\ + ldrb r0, [r1]\n\ + cmp r0, 0x4\n\ + bne _0809E996\n\ + asrs r0, r5, 24\n\ + cmp r0, 0x4\n\ + beq _0809E996\n\ + ldr r0, _0809EA14 @ =gSharedMem + 0x18000\n\ + adds r0, 0x7C\n\ + ldrh r0, [r0]\n\ + mov r2, r8\n\ + lsls r7, r2, 2\n\ + cmp r0, 0\n\ + beq _0809E9AC\n\ +_0809E996:\n\ + ldr r2, _0809EA18 @ =gTasks\n\ + mov r3, r8\n\ + lsls r1, r3, 2\n\ + adds r0, r1, r3\n\ + lsls r0, 3\n\ + adds r0, r2\n\ + movs r2, 0x22\n\ + ldrsh r0, [r0, r2]\n\ + adds r7, r1, 0\n\ + cmp r0, 0x1\n\ + bne _0809E9D0\n\ +_0809E9AC:\n\ + lsrs r4, r5, 24\n\ + movs r0, 0x2\n\ + adds r1, r4, 0\n\ + bl sub_80A1488\n\ + movs r0, 0x2\n\ + adds r1, r4, 0\n\ + bl sub_80A1654\n\ + ldr r1, _0809EA18 @ =gTasks\n\ + mov r3, r8\n\ + adds r0, r7, r3\n\ + lsls r0, 3\n\ + adds r0, r1\n\ + movs r1, 0\n\ + strh r1, [r0, 0x22]\n\ + movs r0, 0\n\ + str r0, [sp]\n\ +_0809E9D0:\n\ + mov r1, r9\n\ + ldrb r0, [r1]\n\ + cmp r0, 0x4\n\ + beq _0809E9FE\n\ + asrs r0, r5, 24\n\ + cmp r0, 0x4\n\ + bne _0809E9FE\n\ + ldr r0, _0809EA14 @ =gSharedMem + 0x18000\n\ + adds r0, 0x7C\n\ + ldrh r0, [r0]\n\ + cmp r0, 0\n\ + bne _0809E9FE\n\ + movs r4, 0x2\n\ + negs r4, r4\n\ + lsrs r5, 24\n\ + adds r0, r4, 0\n\ + adds r1, r5, 0\n\ + bl sub_80A1488\n\ + adds r0, r4, 0\n\ + adds r1, r5, 0\n\ + bl sub_80A1654\n\ +_0809E9FE:\n\ + mov r2, r9\n\ + strb r6, [r2]\n\ + ldr r0, _0809EA1C @ =gSharedMem + 0x18079\n\ + cmp r9, r0\n\ + bne _0809EA20\n\ + movs r0, 0\n\ + bl sub_80A1C30\n\ + b _0809EA26\n\ + .align 2, 0\n\ +_0809EA10: .4byte gSharedMem + 0x18010\n\ +_0809EA14: .4byte gSharedMem + 0x18000\n\ +_0809EA18: .4byte gTasks\n\ +_0809EA1C: .4byte gSharedMem + 0x18079\n\ +_0809EA20:\n\ + movs r0, 0x1\n\ + bl sub_80A1C30\n\ +_0809EA26:\n\ + ldr r3, [sp]\n\ + cmp r3, 0\n\ + beq _0809EA34\n\ + ldr r0, _0809EA4C @ =gSharedMem + 0x18010\n\ + mov r1, r9\n\ + bl sub_80A0428\n\ +_0809EA34:\n\ + mov r0, r8\n\ + bl sub_80A2078\n\ + add sp, 0x8\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0809EA4C: .4byte gSharedMem + 0x18010\n\ + .syntax divided\n"); +} + +void SummaryScreenHandleAButton(u8 taskId) +{ + PlaySE(5); + + ewramSS.unk79 = 0; + sub_80A1488(2, 0); + sub_80A1654(2, 0); + + if (ewramSS.unk7B == 0) + { + ewramSS.unk7F = 5; + PrintSummaryWindowHeaderText(); + } + + sub_80A16CC(0); + sub_80A029C(&ewramSS.unk10); + sub_80A1A30(9); + + gTasks[taskId].func = sub_809E3FC; + sub_80A2078(taskId); +} + +void sub_809EAC8(u8 taskId) +{ + if (ewramSS.unk79 != 4) + { + sub_80A1488(-2, 0); + sub_80A1654(-2, 0); + } + + sub_80A1B1C(9); + sub_80A16CC(1); + + MenuZeroFillWindowRect(15, 12, 28, 13); + MenuZeroFillWindowRect(11, 15, 28, 18); + + ewramSS.unk7F = 6; + PrintSummaryWindowHeaderText(); + + gTasks[taskId].func = SummaryScreenHandleKeyInput; +} + +void sub_809EB40(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + case 5: + sub_80A1A30(9); + gTasks[taskId].data[0] = 0; + gTasks[taskId].func = sub_809E260; + break; + case 0: + ewramSS.unk79 = 0; + if (ewramSS.unk7C != 0) + { + sub_80A1488(10, 0); + sub_80A1654(10, ewramSS.unk79); + } + + sub_80A16CC(0); + sub_80A029C(&ewramSS.unk10); + // fall through + default: + gTasks[taskId].data[0]++; + break; + } +} + +void sub_809EBC4(void) +{ + if (ewramSS.unkB != 0) + { + DrawSummaryScreenNavigationDots(); + gUnknown_030042C0 = 0x100; + + if (ewramSS.unkB == 1) + REG_BG1CNT = (REG_BG1CNT & 0xE0FF) + 0x800; + + if (ewramSS.unkB == 2) + REG_BG1CNT = (REG_BG1CNT & 0xE0FF) + 0xA00; + + if (ewramSS.unkB == 3) + REG_BG1CNT = (REG_BG1CNT & 0xE0FF) + 0xC00; + } +} + +void sub_809EC38(u8 taskId) +{ + u8 minus2; + s16 *taskData = gTasks[taskId].data; + + switch (taskData[0]) + { + case 0: + if (ewramSS.unk80 == 0) + { + if (ewramSS.unkB != 0) + { + gUnknown_03004288 = 0x100; + } + + if (ewramSS.unkB == 1) + { + REG_BG2CNT = (REG_BG2CNT & 0xE0FF) + 0x800; + } + + if (ewramSS.unkB == 2) + { + REG_BG2CNT = (REG_BG2CNT & 0xE0FF) + 0xA00; + } + } + else + { + if (ewramSS.unkB != 0) + { + gUnknown_030042C0 = 0x100; + } + + if (ewramSS.unkB == 1) + { + REG_BG1CNT = (REG_BG1CNT & 0xE0FF) + 0x800; + } + + if (ewramSS.unkB == 2) + { + REG_BG1CNT = (REG_BG1CNT & 0xE0FF) + 0xA00; + } + } + + taskData[0]++; + break; + case 1: + if (ewramSS.unk80 == 0) + { + int var2 = gUnknown_030042C0 - 0x20; + gUnknown_030042C0 = var2; + if (var2 << 16 == 0) + { + REG_BG1CNT = (REG_BG1CNT & 0xFFFC) + 2; + REG_BG2CNT = (REG_BG2CNT & 0xFFFC) + 1; + taskData[0]++; + } + } + else + { + int var2 = gUnknown_03004288 - 0x20; + gUnknown_03004288 = var2; + if (var2 << 16 == 0) + { + REG_BG1CNT = (REG_BG1CNT & 0xFFFC) + 1; + REG_BG2CNT = (REG_BG2CNT & 0xFFFC) + 2; + taskData[0]++; + } + } + break; + case 2: + ewramSS.unk7E = ewramSS.unkB + 1; + minus2 = ewramSS.unk8 - 2; + if (minus2 < 2) + { + ewramSS.unk7F = 0; + sub_80A029C(&ewramSS.unk10); + sub_80A0428(&ewramSS.unk10, &ewramSS.unk79); + sub_80A00F4(ewramSS.unk79); + } + else + { + if (ewramSS.unkB > 1 && (ewramSS.unk7B == 0 || ewramSS.unk8 == 4)) + { + ewramSS.unk7F = 6; + } + else if (ewramSS.unkB == 0) + { + ewramSS.unk7F = 7; + } + else + { + ewramSS.unk7F = 0; + } + } + + taskData[0]++; + break; + case 3: + DrawSummaryScreenNavigationDots(); + PrintSummaryWindowHeaderText(); + taskData[0]++; + break; + case 4: + gUnknown_083C1598[ewramSS.unkB](&ewramSS.unk10); + ewramSS.unk80 ^= 1; + taskData[0]++; + break; + case 5: + if (sub_8055870() != TRUE) + { + gTasks[taskId].func = gUnknown_03005CF0; + } + break; + } +} + +void sub_809EE74(u8 taskId) +{ + int var1; + u8 minus2; + s16 *taskData = gTasks[taskId].data; + + switch (taskData[0]) + { + case 0: + var1 = ewramSS.unk80; + if (var1 == 0) + { + gUnknown_03004288 = ewramSS.unk80; + taskData[0]++; + } + else + { + gUnknown_030042C0 = 0; + taskData[0]++; + } + break; + case 1: + if (ewramSS.unk80 == 0) + { + if (ewramSS.unkB == 1) + REG_BG2CNT = (REG_BG2CNT & 0xE0FC) + 0x801; + + if (ewramSS.unkB == 2) + REG_BG2CNT = (REG_BG2CNT & 0xE0FC) + 0xA01; + + if (ewramSS.unkB == 3) + REG_BG2CNT = (REG_BG2CNT & 0xE0FC) + 0xC01; + + REG_BG1CNT = (REG_BG1CNT & 0xFFFC) + 2; + } + else + { + if (ewramSS.unkB == 1) + REG_BG1CNT = (REG_BG1CNT & 0xE0FC) + 0x801; + + if (ewramSS.unkB == 2) + REG_BG1CNT = (REG_BG1CNT & 0xE0FC) + 0xA01; + + if (ewramSS.unkB == 3) + REG_BG1CNT = (REG_BG1CNT & 0xE0FC) + 0xC01; + + REG_BG2CNT = (REG_BG2CNT & 0xFFFC) + 2; + } + + taskData[0]++; + break; + case 2: + if (ewramSS.unk80 == 0) + { + int var2 = gUnknown_03004288 + 0x20; + gUnknown_03004288 = var2; + if ((var2 << 16) == 0x1000000) + { + taskData[0]++; + } + } + else + { + int var2 = gUnknown_030042C0 + 0x20; + gUnknown_030042C0 = var2; + if ((var2 << 16) == 0x1000000) + { + taskData[0]++; + } + } + break; + case 3: + ewramSS.unk7E = ewramSS.unkB + 1; + minus2 = ewramSS.unk8 - 2; + if (minus2 < 2) + { + ewramSS.unk7F = 0; + sub_80A029C(&ewramSS.unk10); + sub_80A0428(&ewramSS.unk10, &ewramSS.unk79); + sub_80A00F4(ewramSS.unk79); + } + else + { + if (ewramSS.unkB > 1 && (ewramSS.unk7B == 0 || ewramSS.unk8 == 4)) + { + ewramSS.unk7F = 6; + } + else if (ewramSS.unkB == 0) + { + ewramSS.unk7F = 7; + } + else + { + ewramSS.unk7F = 0; + } + } + + taskData[0]++; + break; + case 4: + DrawSummaryScreenNavigationDots(); + PrintSummaryWindowHeaderText(); + taskData[0]++; + break; + case 5: + gUnknown_083C1598[ewramSS.unkB](&ewramSS.unk10); + ewramSS.unk80 ^= 1; + taskData[0]++; + break; + case 6: + if (sub_8055870() != TRUE) + { + gTasks[taskId].func = gUnknown_03005CF0; + } + break; + } +} + +void sub_809F0D0(u8 taskId, s8 direction) +{ + ewramSS.unkB += direction; + gUnknown_03005CF0 = gTasks[taskId].func; + sub_809FBE4(); + gTasks[taskId].data[0] = 0; + + if (direction == -1) + { + gTasks[taskId].func = sub_809EC38; + } + else + { + gTasks[taskId].func = sub_809EE74; + gTasks[taskId].func(taskId); + } +} + +void SummaryScreenHandleLeftRightInput(u8 taskId, s8 direction) +{ + if (!GetMonData(&ewramSS.unk10, MON_DATA_IS_EGG)) + { + if (direction == -1 && ewramSS.unkB == ewramSS.unk75) return; + if (direction == 1 && ewramSS.unkB == ewramSS.unk76) return; + + if (FindTaskIdByFunc(sub_80A1334) == 0xFF && FindTaskIdByFunc(sub_80A1500) == 0xFF) + { + PlaySE(5); + sub_809F0D0(taskId, direction); + } + } +} + +#ifdef NONMATCHING +void SummaryScreenHandleUpDownInput(u8 taskId, s8 direction) +{ + s8 var3; + u8 var1 = direction; + + if (ewramSS.unkE == 1) + { + if (ewramSS.unkB != 0) + { + var1 = (direction == 1) ? 0 : 1; + } + else + { + var1 = (direction == 1) ? 2 : 3; + } + + var3 = StorageSystemGetNextMonIndex(ewramSS.unk0.boxMons, ewramSS.unk9, ewramSS.unkA, var1); + } + else + { + if (sub_80F9344() == TRUE && IsLinkDoubleBattle() == TRUE) + { + var3 = sub_809F3CC(var1); + } + else + { + var3 = sub_809F284(var1); + } + } + + if (var3 != -1) + { + PlaySE(5); + if (GetMonStatusAndPokerus(&ewramSS.unk10)) + { + sub_80A12D0(-2); + } + + ewramSS.unk9 = var3; + ewramSS.unk84 = gTasks[taskId].func; + gTasks[taskId].func = sub_809F43C; + } +} +#else +__attribute__((naked)) +void SummaryScreenHandleUpDownInput(u8 taskId, s8 direction) +{ + asm(".syntax unified\n\ + push {r4-r6,lr}\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ + lsls r1, 24\n\ + lsrs r4, r1, 24\n\ + ldr r0, _0809F1E4 @ =gSharedMem + 0x18000\n\ + ldrb r1, [r0, 0xE]\n\ + adds r2, r0, 0\n\ + cmp r1, 0x1\n\ + bne _0809F202\n\ + ldrb r0, [r2, 0xB]\n\ + cmp r0, 0\n\ + beq _0809F1E8\n\ + lsls r1, r4, 24\n\ + asrs r1, 24\n\ + movs r4, 0x1\n\ + eors r1, r4\n\ + negs r0, r1\n\ + orrs r0, r1\n\ + lsrs r4, r0, 31\n\ + b _0809F1F4\n\ + .align 2, 0\n\ +_0809F1E4: .4byte gSharedMem + 0x18000\n\ +_0809F1E8:\n\ + lsls r0, r4, 24\n\ + asrs r0, 24\n\ + movs r4, 0x3\n\ + cmp r0, 0x1\n\ + bne _0809F1F4\n\ + movs r4, 0x2\n\ +_0809F1F4:\n\ + ldr r0, [r2]\n\ + ldrb r1, [r2, 0x9]\n\ + ldrb r2, [r2, 0xA]\n\ + adds r3, r4, 0\n\ + bl StorageSystemGetNextMonIndex\n\ + b _0809F22C\n\ +_0809F202:\n\ + bl sub_80F9344\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + bne _0809F224\n\ + bl IsLinkDoubleBattle\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + bne _0809F224\n\ + lsls r0, r4, 24\n\ + asrs r0, 24\n\ + bl sub_809F3CC\n\ + b _0809F22C\n\ +_0809F224:\n\ + lsls r0, r4, 24\n\ + asrs r0, 24\n\ + bl sub_809F284\n\ +_0809F22C:\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + lsls r0, r4, 24\n\ + asrs r0, 24\n\ + movs r1, 0x1\n\ + negs r1, r1\n\ + cmp r0, r1\n\ + beq _0809F270\n\ + movs r0, 0x5\n\ + bl PlaySE\n\ + ldr r5, _0809F278 @ =gSharedMem + 0x18010\n\ + adds r0, r5, 0\n\ + bl GetMonStatusAndPokerus\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _0809F258\n\ + movs r0, 0x2\n\ + negs r0, r0\n\ + bl sub_80A12D0\n\ +_0809F258:\n\ + adds r0, r5, 0\n\ + subs r0, 0x10\n\ + strb r4, [r0, 0x9]\n\ + ldr r1, _0809F27C @ =gTasks\n\ + lsls r0, r6, 2\n\ + adds r0, r6\n\ + lsls r0, 3\n\ + adds r0, r1\n\ + ldr r1, [r0]\n\ + str r1, [r5, 0x74]\n\ + ldr r1, _0809F280 @ =sub_809F43C\n\ + str r1, [r0]\n\ +_0809F270:\n\ + pop {r4-r6}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0809F278: .4byte gSharedMem + 0x18010\n\ +_0809F27C: .4byte gTasks\n\ +_0809F280: .4byte sub_809F43C\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +// s8 sub_809F284(s8 a) +// { +// struct Pokemon *mons = ewramSS.unk0.partyMons; +// u8 var1 = 0; + +// if (ewramSS.unkB == 0) +// { +// if ((s8)a == -1 || ewramSS.unk9 != 0) +// { +// if ((s8)a == 1 || ewramSS.unk9 < ewramSS.unkA) +// { +// return ewramSS.unk9 + a; +// } +// } + +// return -1; +// } +// else +// { +// while (1) +// { +// var1 += a; + +// if (ewramSS.unk9 + var1 >= 0 || ewramSS.unk9 + var1 > ewramSS.unkA) +// { +// return -1; +// } + +// if (!GetMonData(&mons[ewramSS.unk9 + var1], MON_DATA_IS_EGG)) +// { +// break; +// } +// } + +// return ewramSS.unk9 + var1; +// } + +// } +__attribute__((naked)) +s8 sub_809F284(s8 a) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + lsls r0, 24\n\ + lsrs r3, r0, 24\n\ + ldr r0, _0809F2C0 @ =gSharedMem + 0x18000\n\ + ldr r7, [r0]\n\ + movs r6, 0\n\ + ldrb r1, [r0, 0xB]\n\ + adds r4, r0, 0\n\ + cmp r1, 0\n\ + bne _0809F2C4\n\ + lsls r0, r3, 24\n\ + asrs r2, r0, 24\n\ + movs r1, 0x1\n\ + negs r1, r1\n\ + adds r5, r0, 0\n\ + cmp r2, r1\n\ + bne _0809F2AC\n\ + ldrb r0, [r4, 0x9]\n\ + cmp r0, 0\n\ + beq _0809F2E4\n\ +_0809F2AC:\n\ + asrs r0, r5, 24\n\ + cmp r0, 0x1\n\ + bne _0809F2BA\n\ + ldrb r0, [r4, 0x9]\n\ + ldrb r1, [r4, 0xA]\n\ + cmp r0, r1\n\ + bcs _0809F2E4\n\ +_0809F2BA:\n\ + ldrb r0, [r4, 0x9]\n\ + adds r0, r3\n\ + b _0809F304\n\ + .align 2, 0\n\ +_0809F2C0: .4byte gSharedMem + 0x18000\n\ +_0809F2C4:\n\ + lsls r5, r3, 24\n\ +_0809F2C6:\n\ + lsls r0, r6, 24\n\ + asrs r0, 24\n\ + asrs r1, r5, 24\n\ + adds r0, r1\n\ + lsls r0, 24\n\ + ldr r4, _0809F2EC @ =gSharedMem + 0x18000\n\ + lsrs r6, r0, 24\n\ + asrs r0, 24\n\ + ldrb r2, [r4, 0x9]\n\ + adds r1, r0, r2\n\ + cmp r1, 0\n\ + blt _0809F2E4\n\ + ldrb r0, [r4, 0xA]\n\ + cmp r1, r0\n\ + ble _0809F2F0\n\ +_0809F2E4:\n\ + movs r0, 0x1\n\ + negs r0, r0\n\ + b _0809F308\n\ + .align 2, 0\n\ +_0809F2EC: .4byte gSharedMem + 0x18000\n\ +_0809F2F0:\n\ + movs r0, 0x64\n\ + muls r0, r1\n\ + adds r0, r7, r0\n\ + movs r1, 0x2D\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + bne _0809F2C6\n\ + ldrb r0, [r4, 0x9]\n\ + adds r0, r6\n\ +_0809F304:\n\ + lsls r0, 24\n\ + asrs r0, 24\n\ +_0809F308:\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1\n\ + .syntax divided\n"); +} + +bool8 sub_809F310(struct Pokemon *mon) +{ + if (GetMonData(mon, MON_DATA_SPECIES)) + { + if (ewramSS.unkB != 0 || !GetMonData(mon, MON_DATA_IS_EGG)) + { + return TRUE; + } + } + + return FALSE; +} + +s8 sub_809F344(u8 partyIndex) +{ + while (1) + { + partyIndex++; + if (partyIndex == PARTY_SIZE) + { + return -1; + } + + if (sub_809F310(&gPlayerParty[gUnknown_083C15A8[partyIndex]]) == TRUE) + { + return gUnknown_083C15A8[partyIndex]; + } + } +} + +s8 sub_809F388(u8 partyIndex) +{ + while (1) + { + if (partyIndex == 0) + { + return -1; + } + + partyIndex--; + if (sub_809F310(&gPlayerParty[gUnknown_083C15A8[partyIndex]]) == TRUE) + { + return gUnknown_083C15A8[partyIndex]; + } + } +} + +#ifdef NONMATCHING // The nested if statements at the end are not matching. +s8 sub_809F3CC(s8 a) +{ + u8 var1 = 0; + u8 i = 0; + + for (i = 0; i < 6; i++) + { + if (gUnknown_083C15A8[i] == ewramSS.unk9) + { + var1 = i; + break; + } + } + + if ((s8)a != -1 || var1 != 0) + { + if ((s8)a != 1) + { + return sub_809F388(var1); + } + else if (var1 != 5) + { + return sub_809F344(var1); + } + } + + return -1; +} +#else +__attribute__((naked)) +s8 sub_809F3CC(s8 a) +{ + asm(".syntax unified\n\ + push {r4-r6,lr}\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ + movs r2, 0\n\ + movs r1, 0\n\ + ldr r3, _0809F41C @ =gUnknown_083C15A8\n\ + ldr r4, _0809F420 @ =gSharedMem + 0x18000\n\ + ldrb r0, [r3]\n\ + ldrb r5, [r4, 0x9]\n\ + cmp r0, r5\n\ + beq _0809F3FC\n\ + adds r5, r3, 0\n\ + adds r3, r4, 0\n\ +_0809F3E6:\n\ + adds r0, r1, 0x1\n\ + lsls r0, 24\n\ + lsrs r1, r0, 24\n\ + cmp r1, 0x5\n\ + bhi _0809F3FC\n\ + adds r0, r1, r5\n\ + ldrb r0, [r0]\n\ + ldrb r4, [r3, 0x9]\n\ + cmp r0, r4\n\ + bne _0809F3E6\n\ + adds r2, r1, 0\n\ +_0809F3FC:\n\ + lsls r0, r6, 24\n\ + asrs r1, r0, 24\n\ + movs r0, 0x1\n\ + negs r0, r0\n\ + cmp r1, r0\n\ + bne _0809F40C\n\ + cmp r2, 0\n\ + beq _0809F414\n\ +_0809F40C:\n\ + cmp r1, 0x1\n\ + bne _0809F424\n\ + cmp r2, 0x5\n\ + bne _0809F42C\n\ +_0809F414:\n\ + movs r0, 0x1\n\ + negs r0, r0\n\ + b _0809F436\n\ + .align 2, 0\n\ +_0809F41C: .4byte gUnknown_083C15A8\n\ +_0809F420: .4byte gSharedMem + 0x18000\n\ +_0809F424:\n\ + adds r0, r2, 0\n\ + bl sub_809F388\n\ + b _0809F432\n\ +_0809F42C:\n\ + adds r0, r2, 0\n\ + bl sub_809F344\n\ +_0809F432:\n\ + lsls r0, 24\n\ + asrs r0, 24\n\ +_0809F436:\n\ + pop {r4-r6}\n\ + pop {r1}\n\ + bx r1\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +void sub_809F43C(u8 taskId) +{ + switch (gMain.state) + { + case 0: + StopCryAndClearCrySongs(); + gMain.state++; + break; + case 1: + DestroySpriteAndFreeResources(&gSprites[ewramSS.unkC]); + gMain.state++; + break; + case 2: + DestroySpriteAndFreeResources(&gSprites[ewramSS.unkD]); + gMain.state++; + break; + case 3: + ewramSS.unk74 = 0; + ewramSS.unk79 = 0; + gMain.state++; + break; + case 4: + sub_809F678(&ewramSS.unk10); + if (GetMonStatusAndPokerus(&ewramSS.unk10)) + { + sub_80A12D0(2); + } + + DrawPokerusSurvivorDot(&ewramSS.unk10); + gMain.state++; + break; + case 5: + if ((ewramSS.unkC = sub_809F6B4(&ewramSS.unk10, &ewramSS.unk74)) != 0xFF) + { + ewramSS.unk74 = 0; + if (GetMonData(&ewramSS.unk10, MON_DATA_IS_EGG)) + { + gUnknown_030041B0 = 256; + } + else + { + gUnknown_030041B0 = 0; + } + + gMain.state++; + } + break; + case 6: + sub_80A1DCC(&ewramSS.unk10); + gMain.state++; + break; + case 7: + sub_80A1DE8(&ewramSS.unk10); + gMain.state++; + break; + case 8: + if (sub_809F5F8()) + { + ewramSS.unk74 = 0; + gMain.state++; + } + break; + default: + if (sub_8055870() != TRUE) + { + gMain.state = 0; + gTasks[taskId].func = ewramSS.unk84; + } + break; + } +} + +bool8 sub_809F5F8(void) +{ + if (ewramSS.unk74 == 0) + { + sub_809FAC8(&ewramSS.unk10); + ewramSS.unk74++; + return FALSE; + } + else + { + gUnknown_083C1588[ewramSS.unkB](&ewramSS.unk10); + return TRUE; + } +} + +void sub_809F63C(struct Pokemon *mon) +{ + sub_809FE80(); + sub_809FC34(mon); +} + +void sub_809F650(struct Pokemon *mon) +{ + sub_80A00A4(); + sub_809FF64(mon); +} + +void sub_809F664(struct Pokemon *mon) +{ + sub_80A0390(); + sub_80A015C(mon); +} + +void sub_809F678(struct Pokemon *mon) +{ + if (ewramSS.unkE == 0) + { + struct Pokemon *mons = ewramSS.unk0.partyMons; + *mon = mons[ewramSS.unk9]; + } + else + { + struct BoxPokemon *mons = ewramSS.unk0.boxMons; + sub_803B4B4(&mons[ewramSS.unk9], mon); + } +} + u8 sub_809F6B4(struct Pokemon *mon, u8 *b) { u16 species; @@ -189,7 +2232,7 @@ static u16 GetMonMovePP(struct Pokemon *mon, u8 moveId) } } -bool8 sub_809F7D0() +bool8 sub_809F7D0(u8 taskId) { struct Pokemon mon; u16 move; @@ -222,7 +2265,7 @@ void sub_809F814(u8 taskId) taskData[0] = 4; taskData[13] = 1; ewramSS.unk79 = taskData[15]; - sub_809E8F0(taskId, -1); + sub_809E8F0(taskId, -1, NULL); } else if (gMain.newKeys & DPAD_DOWN) { @@ -230,7 +2273,7 @@ void sub_809F814(u8 taskId) taskData[0] = 4; taskData[13] = 1; ewramSS.unk79 = taskData[15]; - sub_809E8F0(taskId, 1); + sub_809E8F0(taskId, 1, NULL); } else if ((gMain.newKeys & DPAD_LEFT) || sub_80F9284() == 1) { @@ -625,7 +2668,7 @@ void sub_809FAC8(struct Pokemon *mon) } } -void sub_809FBE4() +void sub_809FBE4(void) { u8 i; @@ -887,7 +2930,7 @@ void sub_80A015C(struct Pokemon *mon) } } -void sub_80A029C(void) +void sub_80A029C(struct Pokemon *mon) { u8 *buffer; u16 move; @@ -2223,7 +4266,7 @@ _080A12CC: .4byte gOtherText_Status\n\ .syntax divided\n"); } -void sub_80A12D0(u8 taskId) +void sub_80A12D0(s8 a) { u8 newTaskId; @@ -2231,9 +4274,9 @@ void sub_80A12D0(u8 taskId) sub_80A18E4(29); newTaskId = CreateTask(sub_80A1048, 0); - gTasks[newTaskId].data[0] = (s8)taskId; + gTasks[newTaskId].data[0] = a; - if ((s8)taskId < 0) + if (a < 0) { gTasks[newTaskId].data[1] = 10; } @@ -3493,7 +5536,7 @@ u8 *PokemonSummaryScreen_CopyPokemonLevel(u8 *dest, u8 level) return dest; } -void sub_80A2078(u32 taskId) +void sub_80A2078(int taskId) { gUnknown_03005CF0 = gTasks[taskId].func; gTasks[taskId].func = sub_80A20A8; |