summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMarcus Huderle <huderlem@gmail.com>2017-09-19 13:47:14 -0700
committerMarcus Huderle <huderlem@gmail.com>2017-09-19 13:47:14 -0700
commit81a0f3b974f5f49e0bc7bf93b873de5dacfe0a01 (patch)
treecf1a6bf6fc6becbc45620e2723fd25b74ad4d079 /src
parenta7fa00901efb9e7e90a78b3e415a56b695588ec3 (diff)
Decompile more party_menu
Diffstat (limited to 'src')
-rw-r--r--src/battle_party_menu.c13
-rw-r--r--src/choose_party.c16
-rw-r--r--src/party_menu.c357
-rw-r--r--src/pokemon_menu.c18
4 files changed, 373 insertions, 31 deletions
diff --git a/src/battle_party_menu.c b/src/battle_party_menu.c
index 49e0b8432..ca883daec 100644
--- a/src/battle_party_menu.c
+++ b/src/battle_party_menu.c
@@ -33,15 +33,11 @@ extern void PartyMenuTryPrintMonsHP(void);
extern void nullsub_13(void);
extern void PartyMenuDrawHPBars(void);
extern u8 sub_806B58C(u8);
-extern u8 GetItemEffectType();
-extern void sub_806E750(u8, const struct PartyPopupMenu *, const struct PartyMenuItem *, int);
extern void sub_806D5A4(void);
extern void sub_802E414(void);
extern void sub_80A6DCC(void);
extern void sub_806AF4C();
extern void sub_806AEDC(void);
-extern TaskFunc PartyMenuGetPopupMenuFunc(u8, const struct PartyPopupMenu *, const struct PartyMenuItem *, u8);
-extern void sub_806E7D0(u8, const struct PartyPopupMenu *);
extern u8 *sub_8040D08();
extern void sub_8040B8C(void);
extern void sub_806E6F0();
@@ -79,7 +75,7 @@ static void Task_BattlePartyMenuSummary(u8 taskId);
static void Task_BattlePartyMenuShift(u8 taskId);
static void Task_BattlePartyMenuCancel(u8 taskId);
-static const struct PartyMenuItem sBattlePartyMenuActions[] =
+static const struct MenuAction2 sBattlePartyMenuActions[] =
{
{OtherText_Summary, Task_BattlePartyMenuSummary},
{gOtherText_CancelNoTerminator, Task_BattlePartyMenuCancel},
@@ -475,7 +471,8 @@ static 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], sBattlePartyPopupMenus, sBattlePartyMenuActions, 0);
+
+ ShowPartyPopupMenu(gTasks[a].data[4], sBattlePartyPopupMenus, sBattlePartyMenuActions, 0);
}
void SetUpBattlePokemonMenu(u8 a)
@@ -660,7 +657,7 @@ static void Task_BattlePartyMenuShift(u8 taskId)
u8 i;
u8 r4;
- sub_806E7D0(gTasks[taskId].data[4], sBattlePartyPopupMenus);
+ ClosePartyPopupMenu(gTasks[taskId].data[4], sBattlePartyPopupMenus);
partySelection = sub_806CA38(taskId);
if (IsLinkDoubleBattle() == TRUE && (partySelection == 1 || partySelection == 4 || partySelection == 5))
{
@@ -742,7 +739,7 @@ static void Task_BattlePartyMenuShift(u8 taskId)
static void Task_BattlePartyMenuCancel(u8 taskId)
{
HandleDestroyMenuCursors();
- sub_806E7D0(gTasks[taskId].data[4], sBattlePartyPopupMenus);
+ ClosePartyPopupMenu(gTasks[taskId].data[4], sBattlePartyPopupMenus);
gTasks[taskId].data[4] = gTasks[taskId].data[5];
sub_806D538(0, 0);
SwitchTaskToFollowupFunc(taskId);
diff --git a/src/choose_party.c b/src/choose_party.c
index 9cdf63fc8..38533ba02 100644
--- a/src/choose_party.c
+++ b/src/choose_party.c
@@ -53,7 +53,6 @@ extern void sub_806BC3C(u8, u8);
extern u8 sub_806B58C(u8);
extern u16 sub_806BE38();
extern u8 sub_806CA38();
-extern TaskFunc PartyMenuGetPopupMenuFunc(u8, const struct PartyPopupMenu *, const struct PartyMenuItem *, u8);
extern u8 sub_806B124();
extern void sub_806C994();
extern void sub_806C658();
@@ -82,7 +81,6 @@ extern void PartyMenuDoDrawHPBar(u8, u8, u16, u16);
extern void PartyMenuDoPutNicknameTilemap(u16, u8, u8, u8, const u8 *);
extern void box_print(u8, int, const u8 *);
extern void sub_806BCE8(void);
-extern void sub_806E750(u8, const struct PartyPopupMenu *, const struct PartyMenuItem *, int);
static void ClearPartySelection(void);
static bool8 IsMonAllowedInBattleTower(struct Pokemon *);
@@ -273,7 +271,7 @@ static void BattleTowerEntryMenuCallback_Enter(u8);
static void BattleTowerEntryMenuCallback_NoEntry(u8);
static void BattleTowerEntryMenuCallback_Exit(u8);
-static const struct PartyMenuItem sBattleTowerEntryMenuItems[] =
+static const struct MenuAction2 sBattleTowerEntryMenuItems[] =
{
{OtherText_Summary, BattleTowerEntryMenuCallback_Summary},
{OtherText_Enter2, BattleTowerEntryMenuCallback_Enter},
@@ -313,18 +311,18 @@ static void sub_81221F8(u8 taskId)
if (IsPartyMemberAlreadySelected(gLastFieldPokeMenuOpened + 1) == TRUE)
{
gTasks[taskId].data[4] = 1;
- sub_806E750(1, sBattleTowerEntryMenu, sBattleTowerEntryMenuItems, 0);
+ ShowPartyPopupMenu(1, sBattleTowerEntryMenu, sBattleTowerEntryMenuItems, 0);
}
else
{
gTasks[taskId].data[4] = 0;
- sub_806E750(0, sBattleTowerEntryMenu, sBattleTowerEntryMenuItems, 0);
+ ShowPartyPopupMenu(0, sBattleTowerEntryMenu, sBattleTowerEntryMenuItems, 0);
}
}
else
{
gTasks[taskId].data[4] = 2;
- sub_806E750(2, sBattleTowerEntryMenu, sBattleTowerEntryMenuItems, 0);
+ ShowPartyPopupMenu(2, sBattleTowerEntryMenu, sBattleTowerEntryMenuItems, 0);
}
}
@@ -795,7 +793,7 @@ static void DaycareStorageMenuCallback_Store(u8);
static void DaycareStorageMenuCallback_Summary(u8);
static void DaycareStorageMenuCallback_Exit(u8);
-static const struct PartyMenuItem sDaycareStorageMenuItems[] =
+static const struct MenuAction2 sDaycareStorageMenuItems[] =
{
{OtherText_Store, DaycareStorageMenuCallback_Store},
{OtherText_Summary, DaycareStorageMenuCallback_Summary},
@@ -816,12 +814,12 @@ static void sub_8122D94(u8 taskId)
if (!GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_IS_EGG))
{
gTasks[taskId].data[4] = 0;
- sub_806E750(0, sDaycareStorageMenus, sDaycareStorageMenuItems, 0);
+ ShowPartyPopupMenu(0, sDaycareStorageMenus, sDaycareStorageMenuItems, 0);
}
else
{
gTasks[taskId].data[4] = 1;
- sub_806E750(1, sDaycareStorageMenus, sDaycareStorageMenuItems, 0);
+ ShowPartyPopupMenu(1, sDaycareStorageMenus, sDaycareStorageMenuItems, 0);
}
}
diff --git a/src/party_menu.c b/src/party_menu.c
index e1eb9cdae..7e515462a 100644
--- a/src/party_menu.c
+++ b/src/party_menu.c
@@ -9,6 +9,7 @@
#include "item.h"
#include "item_use.h"
#include "item_menu.h"
+#include "items.h"
#include "mail_data.h"
#include "main.h"
#include "menu.h"
@@ -30,7 +31,6 @@
#include "palette.h"
#include "event_data.h"
#include "main.h"
-#include "item.h"
#include "battle_interface.h"
#include "species.h"
#include "party_menu.h"
@@ -111,6 +111,34 @@ void sub_806AEDC(void)
#define WINDOW_RIGHT (29)
#endif
+void ShowPartyPopupMenu(u8 menuIndex, const struct PartyPopupMenu *menu, const struct MenuAction2 *menuActions, u8 cursorPos)
+{
+ u8 left;
+ u8 top;
+
+ sub_806E720(menuIndex, &left, &top, menu);
+ sub_8089C50(left, top, menu[menuIndex].width, menu[menuIndex].numChoices, menuActions, menu[menuIndex].items);
+
+ InitMenu(0, left + 1, top + 1, menu[menuIndex].numChoices, cursorPos, menu[menuIndex].width - 1);
+}
+
+void ClosePartyPopupMenu(u8 index, const struct PartyPopupMenu *menu)
+{
+ u8 left;
+ u8 top;
+
+ sub_806E720(index, &left, &top, menu);
+
+ MenuZeroFillWindowRect(left, top, left + menu[index].width, menu[index].numChoices * 2 + top + 1);
+ HandleDestroyMenuCursors();
+}
+
+TaskFunc PartyMenuGetPopupMenuFunc(u8 menuIndex, const struct PartyPopupMenu *menus, const struct MenuAction2 *menuActions, u8 itemIndex)
+{
+ u8 action = menus[menuIndex].items[itemIndex];
+ return menuActions[action].func;
+}
+
u8 sub_806E834(const u8 *message, u8 arg1)
{
u8 taskId;
@@ -881,10 +909,10 @@ bool8 IsHPRecoveryItem(u16 item)
{
const u8 *itemEffect;
- if (item == 0xAF)
+ if (item == ITEM_ENIGMA_BERRY)
itemEffect = gSaveBlock1.enigmaBerry.itemEffect;
else
- itemEffect = gItemEffectTable[item - 13];
+ itemEffect = gItemEffectTable[item - ITEM_POTION];
if (itemEffect[4] & 4)
return TRUE;
@@ -1199,10 +1227,10 @@ void DoPPRecoveryItemEffect(u8 taskId, u16 b, TaskFunc c)
const u8 *itemEffect;
u8 taskId2;
- if (b == 0xAF)
+ if (b == ITEM_ENIGMA_BERRY)
itemEffect = gSaveBlock1.enigmaBerry.itemEffect;
else
- itemEffect = gItemEffectTable[b - 13];
+ itemEffect = gItemEffectTable[b - ITEM_POTION];
gTasks[taskId].func = TaskDummy;
taskId2 = CreateTask(TaskDummy, 5);
sub_806E8D0(taskId, b, c);
@@ -1691,3 +1719,322 @@ void DoEvolutionStoneItemEffect(u8 taskId, u16 evolutionStoneItem, TaskFunc c)
RemoveBagItem(evolutionStoneItem, 1);
}
}
+
+// u8 GetItemEffectType(u16 item)
+// {
+// const u8 *itemEffect;
+// register u8 itemEffect0 asm("r1");
+// u8 mask;
+
+// // Read the item's effect properties.
+// if (item == ITEM_ENIGMA_BERRY)
+// {
+// itemEffect = gSaveBlock1.enigmaBerry.itemEffect;
+// }
+// else
+// {
+// itemEffect = gItemEffectTable[item - ITEM_POTION];
+// }
+
+// itemEffect0 = itemEffect[0];
+// mask = 0x3F;
+
+// if ((itemEffect0 & mask) || itemEffect[1] || itemEffect[2] || (itemEffect[3] & 0x80))
+// {
+// return 0;
+// }
+// else if (itemEffect0 & 0x40)
+// {
+// return 10;
+// }
+// else if (itemEffect[3] & 0x40)
+// {
+// return 1;
+// }
+// else if ((itemEffect[3] & mask) || (itemEffect0 >> 7))
+// {
+// if ((itemEffect[3] & mask) == 0x20)
+// {
+// return 4;
+// }
+// else if ((itemEffect[3] & mask) == 0x10)
+// {
+// return 3;
+// }
+// else if ((itemEffect[3] & mask) == 0x8)
+// {
+// return 5;
+// }
+// else if ((itemEffect[3] & mask) == 0x4)
+// {
+// return 6;
+// }
+// else if ((itemEffect[3] & mask) == 0x2)
+// {
+// return 7;
+// }
+// else if ((itemEffect[3] & mask) == 0x1)
+// {
+// return 8;
+// }
+// else if ((itemEffect0 >> 7) != 0 && (itemEffect[3] & mask) == 0)
+// {
+// return 9;
+// }
+// else
+// {
+// return 11;
+// }
+// }
+// else if (itemEffect[4] & 0x44)
+// {
+// return 2;
+// }
+// else if (itemEffect[4] & 0x2)
+// {
+// return 12;
+// }
+// else if (itemEffect[4] & 0x1)
+// {
+// return 13;
+// }
+// else if (itemEffect[5] & 0x8)
+// {
+// return 14;
+// }
+// else if (itemEffect[5] & 0x4)
+// {
+// return 15;
+// }
+// else if (itemEffect[5] & 0x2)
+// {
+// return 16;
+// }
+// else if (itemEffect[5] & 0x1)
+// {
+// return 17;
+// }
+// else if (itemEffect[4] & 0x80)
+// {
+// return 18;
+// }
+// else if (itemEffect[4] & 0x20)
+// {
+// return 19;
+// }
+// else if (itemEffect[5] & 0x10)
+// {
+// return 20;
+// }
+// else if (itemEffect[4] & 0x18)
+// {
+// return 21;
+// }
+// else
+// {
+// return 22;
+// }
+// }
+__attribute__((naked))
+u8 GetItemEffectType(u16 item)
+{
+ asm(".syntax unified\n\
+ push {r4,r5,lr}\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ cmp r0, 0xAF\n\
+ bne _08070E5C\n\
+ ldr r4, _08070E58 @ =gSaveBlock1 + 0x3676\n\
+ b _08070E66\n\
+ .align 2, 0\n\
+_08070E58: .4byte gSaveBlock1 + 0x3676\n\
+_08070E5C:\n\
+ ldr r1, _08070E8C @ =gItemEffectTable\n\
+ subs r0, 0xD\n\
+ lsls r0, 2\n\
+ adds r0, r1\n\
+ ldr r4, [r0]\n\
+_08070E66:\n\
+ ldrb r1, [r4]\n\
+ movs r5, 0x3F\n\
+ adds r0, r5, 0\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _08070E88\n\
+ ldrb r0, [r4, 0x1]\n\
+ cmp r0, 0\n\
+ bne _08070E88\n\
+ ldrb r0, [r4, 0x2]\n\
+ cmp r0, 0\n\
+ bne _08070E88\n\
+ ldrb r3, [r4, 0x3]\n\
+ movs r0, 0x80\n\
+ ands r0, r3\n\
+ cmp r0, 0\n\
+ beq _08070E90\n\
+_08070E88:\n\
+ movs r0, 0\n\
+ b _08070F8A\n\
+ .align 2, 0\n\
+_08070E8C: .4byte gItemEffectTable\n\
+_08070E90:\n\
+ movs r2, 0x40\n\
+ adds r0, r2, 0\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _08070E9E\n\
+ movs r0, 0xA\n\
+ b _08070F8A\n\
+_08070E9E:\n\
+ adds r0, r2, 0\n\
+ ands r0, r3\n\
+ cmp r0, 0\n\
+ beq _08070EAA\n\
+ movs r0, 0x1\n\
+ b _08070F8A\n\
+_08070EAA:\n\
+ adds r2, r5, 0\n\
+ ands r2, r3\n\
+ cmp r2, 0\n\
+ bne _08070EB8\n\
+ lsrs r0, r1, 7\n\
+ cmp r0, 0\n\
+ beq _08070EFA\n\
+_08070EB8:\n\
+ cmp r2, 0x20\n\
+ bne _08070EC0\n\
+ movs r0, 0x4\n\
+ b _08070F8A\n\
+_08070EC0:\n\
+ cmp r2, 0x10\n\
+ bne _08070EC8\n\
+ movs r0, 0x3\n\
+ b _08070F8A\n\
+_08070EC8:\n\
+ cmp r2, 0x8\n\
+ bne _08070ED0\n\
+ movs r0, 0x5\n\
+ b _08070F8A\n\
+_08070ED0:\n\
+ cmp r2, 0x4\n\
+ bne _08070ED8\n\
+ movs r0, 0x6\n\
+ b _08070F8A\n\
+_08070ED8:\n\
+ cmp r2, 0x2\n\
+ bne _08070EE0\n\
+ movs r0, 0x7\n\
+ b _08070F8A\n\
+_08070EE0:\n\
+ cmp r2, 0x1\n\
+ bne _08070EE8\n\
+ movs r0, 0x8\n\
+ b _08070F8A\n\
+_08070EE8:\n\
+ lsrs r0, r1, 7\n\
+ cmp r0, 0\n\
+ beq _08070EF6\n\
+ cmp r2, 0\n\
+ bne _08070EF6\n\
+ movs r0, 0x9\n\
+ b _08070F8A\n\
+_08070EF6:\n\
+ movs r0, 0xB\n\
+ b _08070F8A\n\
+_08070EFA:\n\
+ ldrb r1, [r4, 0x4]\n\
+ movs r0, 0x44\n\
+ ands r0, r1\n\
+ adds r2, r1, 0\n\
+ cmp r0, 0\n\
+ beq _08070F0A\n\
+ movs r0, 0x2\n\
+ b _08070F8A\n\
+_08070F0A:\n\
+ movs r5, 0x2\n\
+ adds r0, r5, 0\n\
+ ands r0, r2\n\
+ cmp r0, 0\n\
+ beq _08070F18\n\
+ movs r0, 0xC\n\
+ b _08070F8A\n\
+_08070F18:\n\
+ movs r3, 0x1\n\
+ adds r0, r3, 0\n\
+ ands r0, r2\n\
+ cmp r0, 0\n\
+ beq _08070F26\n\
+ movs r0, 0xD\n\
+ b _08070F8A\n\
+_08070F26:\n\
+ ldrb r1, [r4, 0x5]\n\
+ movs r0, 0x8\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _08070F34\n\
+ movs r0, 0xE\n\
+ b _08070F8A\n\
+_08070F34:\n\
+ movs r0, 0x4\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _08070F40\n\
+ movs r0, 0xF\n\
+ b _08070F8A\n\
+_08070F40:\n\
+ adds r0, r5, 0\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _08070F4C\n\
+ movs r0, 0x10\n\
+ b _08070F8A\n\
+_08070F4C:\n\
+ adds r0, r3, 0\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _08070F58\n\
+ movs r0, 0x11\n\
+ b _08070F8A\n\
+_08070F58:\n\
+ movs r0, 0x80\n\
+ ands r0, r2\n\
+ cmp r0, 0\n\
+ beq _08070F64\n\
+ movs r0, 0x12\n\
+ b _08070F8A\n\
+_08070F64:\n\
+ movs r0, 0x20\n\
+ ands r0, r2\n\
+ cmp r0, 0\n\
+ beq _08070F70\n\
+ movs r0, 0x13\n\
+ b _08070F8A\n\
+_08070F70:\n\
+ movs r0, 0x10\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _08070F7C\n\
+ movs r0, 0x14\n\
+ b _08070F8A\n\
+_08070F7C:\n\
+ movs r0, 0x18\n\
+ ands r0, r2\n\
+ cmp r0, 0\n\
+ bne _08070F88\n\
+ movs r0, 0x16\n\
+ b _08070F8A\n\
+_08070F88:\n\
+ movs r0, 0x15\n\
+_08070F8A:\n\
+ pop {r4,r5}\n\
+ pop {r1}\n\
+ bx r1\n\
+ .syntax divided\n");
+}
+
+void unref_sub_8070F90()
+{
+ FlagSet(SYS_POKEDEX_GET);
+ FlagSet(SYS_POKEMON_GET);
+ FlagSet(SYS_POKENAV_GET);
+}
diff --git a/src/pokemon_menu.c b/src/pokemon_menu.c
index dd6b576a3..dc5d018d4 100644
--- a/src/pokemon_menu.c
+++ b/src/pokemon_menu.c
@@ -389,18 +389,18 @@ static void sub_808A060(u8 taskID)
if (gMain.newKeys & A_BUTTON)
{
PlaySE(SE_SELECT);
- PartyMenuGetPopupMenuFunc(0, &sUnknown_0839F578, (void *)sPokemonMenuActions, sPokeMenuCursorPos)(taskID);
+ PartyMenuGetPopupMenuFunc(0, &sUnknown_0839F578, sPokemonMenuActions, sPokeMenuCursorPos)(taskID);
}
else if (gMain.newKeys & B_BUTTON)
{
- sub_806E7D0(0, &sUnknown_0839F578);
+ ClosePartyPopupMenu(0, &sUnknown_0839F578);
PokemonMenu_CancelSubmenu(taskID);
}
}
static void sub_808A100(u8 taskID)
{
- sub_806E750(0, &sUnknown_0839F578, (void*)(sPokemonMenuActions), 0);
+ ShowPartyPopupMenu(0, &sUnknown_0839F578, (void*)(sPokemonMenuActions), 0);
sub_806D538(0xD, 2);
gTasks[taskID].func = sub_808A060;
}
@@ -619,7 +619,7 @@ static void PokemonMenu_Mail(u8 taskID)
HandleDestroyMenuCursors();
sPokeMenuCursorPos = 0;
MenuZeroFillWindowRect(19, 0, 29, 19);
- sub_806E750(0, &sUnknown_0839F584, (void*) sPokemonMenuActions, 0);
+ ShowPartyPopupMenu(0, &sUnknown_0839F584, (void*) sPokemonMenuActions, 0);
gTasks[taskID].func = sub_808A73C;
}
@@ -629,26 +629,26 @@ static void sub_808A73C(u8 taskID)
{
PlaySE(SE_SELECT);
if (sPokeMenuCursorPos == 0)
- sPokeMenuCursorPos = MoveMenuCursor(sUnknown_0839F584.unk0 - 1);
+ sPokeMenuCursorPos = MoveMenuCursor(sUnknown_0839F584.numChoices - 1);
else
sPokeMenuCursorPos = MoveMenuCursor(-1);
}
if (gMain.newAndRepeatedKeys == DPAD_DOWN)
{
PlaySE(SE_SELECT);
- if (sPokeMenuCursorPos == sUnknown_0839F584.unk0 - 1)
- sPokeMenuCursorPos = MoveMenuCursor(1 - sUnknown_0839F584.unk0);
+ if (sPokeMenuCursorPos == sUnknown_0839F584.numChoices - 1)
+ sPokeMenuCursorPos = MoveMenuCursor(1 - sUnknown_0839F584.numChoices);
else
sPokeMenuCursorPos = MoveMenuCursor(1);
}
if (gMain.newKeys & A_BUTTON)
{
PlaySE(SE_SELECT);
- PartyMenuGetPopupMenuFunc(0, &sUnknown_0839F584, (void*) sPokemonMenuActions, sPokeMenuCursorPos)(taskID);
+ PartyMenuGetPopupMenuFunc(0, &sUnknown_0839F584, sPokemonMenuActions, sPokeMenuCursorPos)(taskID);
}
else if (gMain.newKeys & B_BUTTON)
{
- sub_806E7D0(0, &sUnknown_0839F584);
+ ClosePartyPopupMenu(0, &sUnknown_0839F584);
PokemonMenu_Cancel(taskID);
}
}