diff options
author | YamaArashi <YamaArashi@users.noreply.github.com> | 2017-01-21 13:55:10 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-01-21 13:55:10 -0800 |
commit | 07b268c400a7bc883a9192daa14d7a76760c7265 (patch) | |
tree | 5bd4c47bf3fe1c236736c11f1cafd135289d04a8 /src | |
parent | 7a3c8e275185cb72e81f5dd30821427647ec26e0 (diff) | |
parent | 8a5ada74a110cead46fbd1b090f4e925d7f3f66d (diff) |
Merge pull request #210 from camthesaxman/battle_party_menu
finish decompiling battle_party_menu
Diffstat (limited to 'src')
-rw-r--r-- | src/battle_party_menu.c | 296 |
1 files changed, 257 insertions, 39 deletions
diff --git a/src/battle_party_menu.c b/src/battle_party_menu.c index d8b5b48f3..2d6399b8a 100644 --- a/src/battle_party_menu.c +++ b/src/battle_party_menu.c @@ -1,20 +1,22 @@ #include "global.h" #include "asm.h" #include "main.h" +#include "menu.h" #include "palette.h" #include "pokemon.h" #include "songs.h" #include "sound.h" +#include "string_util.h" #include "task.h" #include "text.h" struct PartyMenuItem { const u8 *text; - void (*func)(void); + TaskFunc func; }; -struct UnknownStruct2 +struct PartyPopupMenu { u8 unk0; u8 unk1; @@ -33,7 +35,7 @@ extern void nullsub_13(void); extern void PartyMenuDrawHPBars(void); extern u8 sub_806B58C(u8); extern u8 GetItemEffectType(); -extern void sub_806E750(u8, const struct UnknownStruct2 *, const struct PartyMenuItem *, int); +extern void sub_806E750(u8, const struct PartyPopupMenu *, const struct PartyMenuItem *, int); extern u16 sub_806BD80(); extern u8 sub_806CA38(); extern void sub_806D5A4(void); @@ -41,6 +43,22 @@ extern void sub_802E414(void); extern void sub_8094D60(void); extern void sub_80A6DCC(void); extern void sub_806AF4C(); +extern u8 sub_80F9344(void); +extern u8 sub_806B124(void); +extern void sub_806C994(); +extern void sub_806BF74(); +extern void sub_806AEDC(void); +extern TaskFunc PartyMenuGetPopupMenuFunc(u8, const struct PartyPopupMenu *, const struct PartyMenuItem *, u8); +extern void ShowPokemonSummaryScreen(struct Pokemon *, u8, u8, void (*)(u8), int); +extern void sub_806E7D0(u8, const struct PartyPopupMenu *); +extern u8 *sub_8040D08(); +extern void sub_806E834(); +extern u8 sub_8094C20(); +extern void sub_8040B8C(void); +extern u8 pokemon_order_func(u8); +extern void sub_8094C98(u8, u8); +extern void sub_806E6F0(); +extern void sub_806D538(); struct UnknownStruct1 { @@ -48,28 +66,65 @@ struct UnknownStruct1 u8 unk259; u8 filler25A[6]; u8 unk260; - u8 filler261[3]; + u8 filler261[1]; + u8 unk262; s16 unk264; s16 unk266; }; extern u8 unk_2000000[]; +#define EWRAM_1609D unk_2000000[0x1609D] #define EWRAM_1B000 (*(struct UnknownStruct1 *)(unk_2000000 + 0x1B000)) extern u16 gScriptItemId; +extern u8 gPlayerPartyCount; +extern u8 gUnknown_02024A68; +extern u16 gUnknown_02024A6A[]; +extern u8 gUnknown_02024E6C; extern u8 gUnknown_0202E8F4; +extern u8 gUnknown_0202E8F5; +extern u8 gUnknown_0202E8F6; extern u8 gUnknown_02038473; +extern u8 gUnknown_020384F0; extern void (*gUnknown_03004AE4)(); //don't know types yet -extern const struct PartyMenuItem gUnknown_083B5FCC[]; -extern const struct UnknownStruct2 gUnknown_083B5FF4[]; +extern const u8 gOtherText_CantSwitchPokeWithYours[]; +extern const u8 gOtherText_NoEnergyLeft[]; +extern const u8 gOtherText_EGGCantBattle[]; +extern const u8 gOtherText_AlreadySelected[]; +extern const u8 gOtherText_CantBeSwitched[]; +extern const u8 gOtherText_AlreadyBattle[]; +extern const u8 OtherText_Summary[]; +extern const u8 gOtherText_CancelNoTerminator[]; +extern const u8 OtherText_Shift[]; +extern const u8 OtherText_SendOut[]; -void sub_80952E4(u8); -void sub_8095408(u8); -void sub_809527C(u8); -void sub_80952B4(u8); -void sub_8095330(u8); -void sub_809538C(void); +static void Task_809527C(u8); +static void Task_80952B4(u8); +static void Task_80952E4(u8); +static void Task_8095330(u8); +static void Task_809538C(void); +static void Task_HandlePopupMenuInput(u8); +static void Task_BattlePartyMenuSummary(u8 taskId); +static void Task_BattlePartyMenuShift(u8 taskId); +static void Task_BattlePartyMenuCancel(u8 taskId); + +static const struct PartyMenuItem sBattlePartyMenuActions[] = +{ + {OtherText_Summary, Task_BattlePartyMenuSummary}, + {gOtherText_CancelNoTerminator, Task_BattlePartyMenuCancel}, + {OtherText_Shift, Task_BattlePartyMenuShift}, + {OtherText_SendOut, Task_BattlePartyMenuShift}, +}; +static const u8 Unknown_83B5FEC[] = {2, 0, 1}; //SHIFT, SUMMARY, CANCEL +static const u8 Unknown_83B5FEF[] = {3, 0, 1}; //SEND OUT, SUMMARY, CANCEL +static const u8 Unknown_83B5FF2[] = {0, 1}; //SUMMARY, CANCEL +static const struct PartyPopupMenu sBattlePartyPopupMenus[] = +{ + {ARRAY_COUNT(Unknown_83B5FEC), 9, Unknown_83B5FEC}, + {ARRAY_COUNT(Unknown_83B5FEF), 9, Unknown_83B5FEF}, + {ARRAY_COUNT(Unknown_83B5FF2), 9, Unknown_83B5FF2}, +}; int SetUpBattlePartyMenu(void) { @@ -92,7 +147,7 @@ int SetUpBattlePartyMenu(void) } else { - if (EWRAM_1B000.unk266 <= 5) + if (EWRAM_1B000.unk266 < 6) { TryCreatePartyMenuMonIcon(EWRAM_1B000.unk260, EWRAM_1B000.unk266, &gPlayerParty[EWRAM_1B000.unk266]); EWRAM_1B000.unk266++; @@ -119,9 +174,7 @@ int SetUpBattlePartyMenu(void) EWRAM_1B000.unk264++; } else - { EWRAM_1B000.unk266++; - } break; case 4: PartyMenuPrintMonsLevelOrStatus(); @@ -150,9 +203,7 @@ int SetUpBattlePartyMenu(void) EWRAM_1B000.unk264++; } else - { EWRAM_1B000.unk266++; - } break; case 10: if (gUnknown_02038473 == 3) @@ -167,7 +218,7 @@ int SetUpBattlePartyMenu(void) return FALSE; } -void sub_8095050(u8 a, u8 b) +static void sub_8095050(u8 a, u8 b) { if (!GetMonData(&gPlayerParty[b], MON_DATA_IS_EGG)) { @@ -187,7 +238,7 @@ void sub_8095050(u8 a, u8 b) gTasks[EWRAM_1B000.unk260].data[4] = 2; gTasks[EWRAM_1B000.unk260].data[5] = 2; } - sub_806E750(gTasks[a].data[4], gUnknown_083B5FF4, gUnknown_083B5FCC, 0); + sub_806E750(gTasks[a].data[4], sBattlePartyPopupMenus, sBattlePartyMenuActions, 0); } void SetUpBattlePokemonMenu(u8 a) @@ -196,7 +247,7 @@ void SetUpBattlePokemonMenu(u8 a) { if (gUnknown_02038473 == 3 && GetItemEffectType(gScriptItemId) == 10) { - gUnknown_03004AE4(a, gScriptItemId, sub_80952E4); + gUnknown_03004AE4(a, gScriptItemId, Task_80952E4); return; } @@ -206,13 +257,11 @@ void SetUpBattlePokemonMenu(u8 a) if (gUnknown_02038473 == 3) { if (GetMonData(&gPlayerParty[sub_806CA38(a)], MON_DATA_IS_EGG)) - { PlaySE(SE_HAZURE); - } else { sub_806D5A4(); - gUnknown_03004AE4(a, gScriptItemId, sub_80952E4); + gUnknown_03004AE4(a, gScriptItemId, Task_80952E4); } } else @@ -220,26 +269,24 @@ void SetUpBattlePokemonMenu(u8 a) PlaySE(SE_SELECT); GetMonNickname(&gPlayerParty[sub_806CA38(a)], gStringVar1); sub_8095050(a, sub_806CA38(a)); - SetTaskFuncWithFollowupFunc(a, sub_8095408, SetUpBattlePokemonMenu); + SetTaskFuncWithFollowupFunc(a, Task_HandlePopupMenuInput, SetUpBattlePokemonMenu); } break; case 2: if (gUnknown_02038473 == 1) - { PlaySE(SE_HAZURE); - } else { PlaySE(SE_SELECT); if (gUnknown_02038473 == 3) { gUnknown_0202E8F4 = 0; - gTasks[a].func = sub_80952E4; + gTasks[a].func = Task_80952E4; } else { gUnknown_0202E8F4 = 0; - gTasks[a].func = sub_809527C; + gTasks[a].func = Task_809527C; } } break; @@ -247,13 +294,13 @@ void SetUpBattlePokemonMenu(u8 a) } } -void sub_809527C(u8 taskId) +static void Task_809527C(u8 taskId) { BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - gTasks[taskId].func = sub_80952B4; + gTasks[taskId].func = Task_80952B4; } -void sub_80952B4(u8 taskId) +static void Task_80952B4(u8 taskId) { if (!gPaletteFade.active) { @@ -263,20 +310,18 @@ void sub_80952B4(u8 taskId) } } -void sub_80952E4(u8 taskId) +static void Task_80952E4(u8 taskId) { if (gUnknown_0202E8F4 != 0) - { - sub_809527C(taskId); - } + Task_809527C(taskId); else { BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - gTasks[taskId].func = sub_8095330; + gTasks[taskId].func = Task_8095330; } } -void sub_8095330(u8 taskId) +static void Task_8095330(u8 taskId) { if (!gPaletteFade.active) { @@ -286,9 +331,182 @@ void sub_8095330(u8 taskId) } } -void sub_809535C(u8 taskId) +static void Task_809535C(u8 taskId) { gPaletteFade.bufferTransferDisabled = TRUE; sub_806AF4C(1, 0xFF, SetUpBattlePokemonMenu, 5); - SetMainCallback2(sub_809538C); + SetMainCallback2(Task_809538C); +} + +static void Task_809538C(void) +{ + do + { + if (sub_806B124() == 1) + { + sub_806C994(EWRAM_1B000.unk260, gUnknown_020384F0); + sub_806BF74(EWRAM_1B000.unk260, 0); + GetMonNickname(&gPlayerParty[gUnknown_020384F0], gStringVar1); + sub_8095050(EWRAM_1B000.unk260, gUnknown_020384F0); + SetTaskFuncWithFollowupFunc(EWRAM_1B000.unk260, Task_HandlePopupMenuInput, SetUpBattlePokemonMenu); + SetMainCallback2(sub_806AEDC); + return; + } + } while(sub_80F9344() != 1); +} + +static void Task_HandlePopupMenuInput(u8 taskId) +{ + TaskFunc func; + + if (!gPaletteFade.active) + { + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + MoveMenuCursor(-1); + return; + } + if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + MoveMenuCursor(1); + return; + } + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + func = PartyMenuGetPopupMenuFunc(gTasks[taskId].data[4], + sBattlePartyPopupMenus, + sBattlePartyMenuActions, + GetMenuCursorPos()); + func(taskId); + return; + } + if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + Task_BattlePartyMenuCancel(taskId); + return; + } + } +} + +static void Task_80954C0(u8 taskId) +{ + if (gUnknown_0202E8F6 == 0) + Task_BattlePartyMenuCancel(taskId); +} + +static void Task_ShowSummaryScreen(u8 taskId) +{ + u8 partySelection = sub_806CA38(taskId); + + if (!gPaletteFade.active) + { + DestroyTask(taskId); + EWRAM_1B000.unk262 = 1; + ShowPokemonSummaryScreen(gPlayerParty, partySelection, gPlayerPartyCount - 1, Task_809535C, 4); + } +} + +static void Task_BattlePartyMenuSummary(u8 taskId) +{ + sub_806CA38(taskId); //an unused variable was probably set with this. + gTasks[taskId].func = Task_ShowSummaryScreen; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); +} + +static void Task_BattlePartyMenuShift(u8 taskId) +{ + u8 partySelection; + u8 i; + u8 r4; + + sub_806E7D0(gTasks[taskId].data[4], sBattlePartyPopupMenus); + partySelection = sub_806CA38(taskId); + if (IsLinkDoubleBattle() == TRUE && (partySelection == 1 || partySelection == 4 || partySelection == 5)) + { + sub_806D5A4(); + StringCopy(gStringVar1, sub_8040D08()); + StringExpandPlaceholders(gStringVar4, gOtherText_CantSwitchPokeWithYours); + sub_806E834(gStringVar4, 0); + gTasks[taskId].func = Task_80954C0; + return; + } + if (GetMonData(&gPlayerParty[partySelection], MON_DATA_HP) == 0) + { + sub_806D5A4(); + GetMonNickname(&gPlayerParty[partySelection], gStringVar1); + StringExpandPlaceholders(gStringVar4, gOtherText_NoEnergyLeft); + sub_806E834(gStringVar4, 0); + gTasks[taskId].func = Task_80954C0; + return; + } + for (i = 0; i < gUnknown_02024A68; i++) + { + if (battle_side_get_owner(i) == 0 + && sub_8094C20(partySelection) == gUnknown_02024A6A[i]) + { + sub_806D5A4(); + GetMonNickname(&gPlayerParty[partySelection], gStringVar1); + StringExpandPlaceholders(gStringVar4, gOtherText_AlreadyBattle); + sub_806E834(gStringVar4, 0); + gTasks[taskId].func = Task_80954C0; + return; + } + } + if (GetMonData(&gPlayerParty[partySelection], MON_DATA_IS_EGG)) + { + sub_806D5A4(); + StringExpandPlaceholders(gStringVar4, gOtherText_EGGCantBattle); + sub_806E834(gStringVar4, 0); + gTasks[taskId].func = Task_80954C0; + return; + } + if (sub_8094C20(partySelection) == EWRAM_1609D) + { + sub_806D5A4(); + GetMonNickname(&gPlayerParty[partySelection], gStringVar1); + StringExpandPlaceholders(gStringVar4, gOtherText_AlreadySelected); + sub_806E834(gStringVar4, 0); + gTasks[taskId].func = Task_80954C0; + return; + } + if (gUnknown_02038473 == 4) + { + sub_806D5A4(); + sub_8040B8C(); + sub_806E834(gStringVar4, 0); + gTasks[taskId].func = Task_80954C0; + return; + } + if (gUnknown_02038473 == 2) + { + u8 r0; + u8 r4 = gUnknown_02024E6C; + + sub_806D5A4(); + r0 = pokemon_order_func(gUnknown_02024A6A[r4]); + GetMonNickname(&gPlayerParty[r0], gStringVar1); + StringExpandPlaceholders(gStringVar4, gOtherText_CantBeSwitched); + sub_806E834(gStringVar4, 0); + gTasks[taskId].func = Task_80954C0; + return; + } + gUnknown_0202E8F5 = sub_8094C20(partySelection); + gUnknown_0202E8F4 = 1; + r4 = pokemon_order_func(gUnknown_02024A6A[gUnknown_02024E6C]); + sub_8094C98(r4, partySelection); + sub_806E6F0(&gPlayerParty[r4], &gPlayerParty[partySelection]); + gTasks[taskId].func = Task_809527C; +} + +static void Task_BattlePartyMenuCancel(u8 taskId) +{ + sub_8072DEC(); + sub_806E7D0(gTasks[taskId].data[4], sBattlePartyPopupMenus); + gTasks[taskId].data[4] = gTasks[taskId].data[5]; + sub_806D538(0, 0); + SwitchTaskToFollowupFunc(taskId); } |