summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/battle_party_menu.c296
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);
}