summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSeth Barberee <seth.barberee@gmail.com>2021-11-10 08:43:51 -0800
committerGitHub <noreply@github.com>2021-11-10 08:43:51 -0800
commit561ea52847f5a88dc6a9a79dbfc5c40f421cace5 (patch)
tree0566b8fe1cf46f027696ac7fc4db9febd739ee39 /src
parent681ca68ac96e8d39f49eb2c9f42e5c1e1041f5e0 (diff)
Luminous cave (#72)
* fully decomp luminous cave * remove header file. this one isn't ready yet * doc few fields and func * doc more of luminous cave
Diffstat (limited to 'src')
-rw-r--r--src/debug_menu_mid.c1
-rw-r--r--src/friend_area.c8
-rw-r--r--src/friend_area_action_menu_1.c77
-rw-r--r--src/friend_list_menu.c446
-rw-r--r--src/items.c2
-rw-r--r--src/kangaskhan_storage_2.c1
-rw-r--r--src/kangaskhan_storage_3.c2
-rw-r--r--src/kecleon_items_1.c541
-rw-r--r--src/kecleon_items_2.c15
-rw-r--r--src/load_screen.c4
-rw-r--r--src/luminous_cave.c850
-rw-r--r--src/thank_you_wonder_mail.c6
-rw-r--r--src/wonder_mail_3_mid.c4
13 files changed, 1934 insertions, 23 deletions
diff --git a/src/debug_menu_mid.c b/src/debug_menu_mid.c
index 31d7bbf..bc67ef6 100644
--- a/src/debug_menu_mid.c
+++ b/src/debug_menu_mid.c
@@ -70,7 +70,6 @@ extern void sub_8012EA4(u32 *, u32);
extern void sub_80073E0(u32);
extern void sub_8013C68(u32 *);
extern void xxx_call_draw_string(s32, u32, const char *, u32, u32);
-extern bool8 IsNotMoneyOrUsedTMItem(u8);
extern u32 sub_801CA08(u32);
extern u8 sub_801CB24();
extern void sub_801CBB8();
diff --git a/src/friend_area.c b/src/friend_area.c
index 4854c23..15a527e 100644
--- a/src/friend_area.c
+++ b/src/friend_area.c
@@ -15,7 +15,7 @@ extern const char gUnknown_81098A4;
extern const char gUnknown_81098AC;
extern void ExpandPlaceholdersBuffer(u8 *buffer, const char *r2, ...);
-extern void sub_8090FEC(u32, u32 *r1, u32);
+extern void sub_8090FEC(u32, u8 *r1, u32);
const struct FriendAreaSettings gFriendAreaSettings[NUM_FRIEND_AREAS] =
{
@@ -605,11 +605,11 @@ void sub_8092558(u8 *buffer, u8 index)
void sub_8092578(u8 *buffer, u8 index, u8 r2)
{
// I think this is when we buy the friend area from wigglytuff
- u32 temp[5];
+ u8 priceBuffer[0x14];
if(r2)
{
- sub_8090FEC(gFriendAreaSettings[index].price, (&temp[0]), 1);
- ExpandPlaceholdersBuffer(buffer, &gUnknown_81098AC, gFriendAreaNames[index], 96, temp);
+ sub_8090FEC(gFriendAreaSettings[index].price, priceBuffer, 1);
+ ExpandPlaceholdersBuffer(buffer, &gUnknown_81098AC, gFriendAreaNames[index], 96, priceBuffer);
}
else
{
diff --git a/src/friend_area_action_menu_1.c b/src/friend_area_action_menu_1.c
index 6856d5f..6c4d40f 100644
--- a/src/friend_area_action_menu_1.c
+++ b/src/friend_area_action_menu_1.c
@@ -10,8 +10,8 @@
extern struct unkStruct_203B2BC *gUnknown_203B2BC;
extern struct TeamInventory *gTeamInventory_203B460;
-u32 sub_801B410();
-void sub_801B450();
+extern u32 sub_801B410();
+extern void sub_801B450();
extern u32 sub_801EF38(u8 r0);
extern void sub_801F214();
@@ -29,9 +29,6 @@ extern u32 sub_801A6E8(u32);
extern s32 sub_80144A4(s32 *);
extern void sub_8027EB8();
extern void sub_808D31C(struct PokemonStruct *);
-u32 sub_8027E18(struct PokemonStruct *);
-bool8 IsNotMoneyOrUsedTMItem(u8 id);
-u8 sub_8027E4C(struct PokemonStruct *r0);
extern u8 sub_80023E4(u32);
extern struct PokemonStruct *sub_808D3F8(void);
extern struct PokemonStruct *sub_808D3BC(void);
@@ -45,6 +42,74 @@ extern void sub_80073E0(u32);
extern u8 gUnknown_202DE58[];
extern u32 sub_801F194(void);
+u32 sub_8027E18(struct PokemonStruct *);
+u8 sub_8027E4C(struct PokemonStruct *r0);
+extern u32 sub_801BF48(void);
+extern void sub_801BF98(void);
+extern u32 sub_80244E4(void);
+extern void sub_802453C(void);
+
+void sub_8027A40(void)
+{
+ switch(sub_80244E4())
+ {
+ case 2:
+ case 3:
+ sub_802453C();
+ SetFriendAreaActionMenuState(2);
+ break;
+ case 0:
+ case 1:
+ break;
+ }
+}
+
+void sub_8027A5C(void)
+{
+ switch(sub_801BF48())
+ {
+ case 2:
+ case 3:
+ sub_801BF98();
+ SetFriendAreaActionMenuState(2);
+ break;
+ case 0:
+ case 1:
+ break;
+ }
+}
+
+static inline bool8 sub_8027A78_sub(void) {
+ if (gUnknown_203B2BC->unk18->unk4.unk4 == 0x44 || gUnknown_203B2BC->unk18->unk4.unk4 == 0x45)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void sub_8027A78(void)
+{
+ s32 temp;
+ if(sub_80144A4(&temp) == 0)
+ {
+ switch(temp)
+ {
+ case 1:
+ case 3:
+ SetFriendAreaActionMenuState(2);
+ break;
+ case 2:
+ if (sub_8027A78_sub())
+ SetFriendAreaActionMenuState(9);
+ else
+ {
+ sub_8027EB8();
+ sub_808D31C(gUnknown_203B2BC->unk18);
+ }
+ break;
+ }
+ }
+}
+
void sub_8027AE4(void)
{
s32 local_8;
@@ -194,7 +259,7 @@ void sub_8027D40(u32 r0, struct HeldItem *heldItem)
a3.unk0 = 0;
a3.unk4 = 0;
a3.unk8 = 1;
- slot.itemFlags = 1;
+ slot.itemFlags = ITEM_FLAG_EXISTS;
sub_8090E14(gUnknown_202DE58, &slot, &a3);
xxx_format_and_draw(4, 3, gUnknown_80DD958, r0, 0);
sub_80073E0(r0);
diff --git a/src/friend_list_menu.c b/src/friend_list_menu.c
new file mode 100644
index 0000000..9fbf686
--- /dev/null
+++ b/src/friend_list_menu.c
@@ -0,0 +1,446 @@
+#include "global.h"
+#include "item.h"
+#include "pokemon.h"
+#include "text.h"
+#include "team_inventory.h"
+#include "constants/move.h"
+
+struct unkStruct_203B2B8
+{
+ // size: 0x280
+ u32 state;
+ u32 unk4;
+ u8 unk8;
+ s16 pokeSpecies;
+ u32 unkC;
+ struct HeldItem unk10;
+ struct HeldItem unk14;
+ struct PokemonStruct *unk18;
+ u8 fill1C[0x4];
+ u32 unk20;
+ u16 unk24;
+ struct PokemonMove unk28[4];
+ u8 fill48[0x70 - 0x48];
+ u32 unk70;
+ u32 unk74;
+ u32 unk78;
+ u32 unk7C;
+ u8 fill80[0xCC - 0x80];
+ u32 unkCC;
+};
+extern struct unkStruct_203B2B8 *gUnknown_203B2B8;
+extern u8 gAvailablePokemonNames[0x58];
+extern u8 gUnknown_202DEA8[0x58];
+extern u8 gUnknown_202DE58[0x58];
+extern u8 gUnknown_80DD6E0[];
+extern u8 gPartyMenuItemPlaceholder[];
+extern struct UnkTextStruct2 gUnknown_80DD370;
+
+extern u32 sub_8026F04(struct PokemonStruct *);
+extern void GivePokemonItem(s16 index_, struct HeldItem* item);
+extern void sub_8026074(u32);
+extern void PlaySound(u32);
+bool8 sub_8026F38(struct PokemonStruct *r0);
+extern u8 sub_80023E4(u8);
+extern struct PokemonStruct *sub_808D3F8(void);
+extern struct PokemonStruct *sub_808D3BC(void);
+extern void sub_801F214(void);
+extern u32 sub_801F194(void);
+extern u32 sub_801EF38(u32);
+
+
+extern void sub_8008C54(u32);
+extern void sub_80073B8(u32);
+extern void sub_80073E0(u32);
+extern void sub_80922B4(u8 *, const u8 *, u32);
+extern void ExpandPlaceholdersBuffer(u8 *buffer, const u8 *text, ...);
+extern void sub_808D930(u8 *, s16);
+extern s32 sub_8008ED0(u8 *);
+extern void xxx_call_draw_string(s32 x, s32 y, u8 *, u32, u32);
+extern void xxx_format_and_draw(s32, s32, u8 *, ...);
+extern s32 sub_80144A4(s32 *);
+
+extern u32 sub_801F890(void);
+extern void sub_801F8D0(void);
+extern u32 sub_801B410(void);
+extern void sub_801B450(void);
+
+extern void nullsub_104(void);
+extern void sub_801A928(void);
+extern void sub_8099690(u32);
+extern u32 sub_801A6E8(u32);
+extern u8 sub_8012FD8(u32 *);
+extern void sub_8013114(u32 *, s32 *);
+
+extern u32 sub_801A8AC(void);
+extern u32 sub_8022860(void);
+extern void sub_8022908(void);
+
+extern void sub_801BF98(void);
+extern u32 sub_801BF48(void);
+extern void sub_802453C(void);
+extern u32 sub_80244E4(void);
+
+
+void sub_8026A78(void)
+{
+ switch(sub_80244E4())
+ {
+ case 2:
+ case 3:
+ sub_802453C();
+ sub_8026074(2);
+ break;
+ case 0:
+ case 1:
+ break;
+ }
+}
+
+void sub_8026A94(void)
+{
+ switch(sub_801BF48())
+ {
+ case 2:
+ case 3:
+ sub_801BF98();
+ sub_8026074(2);
+ break;
+ case 0:
+ case 1:
+ break;
+ }
+}
+
+
+static inline bool8 sub_8026AB0_sub(void) {
+ if (gUnknown_203B2B8->unk18->unk4.unk4 == 0x44 || gUnknown_203B2B8->unk18->unk4.unk4 == 0x45)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void sub_8026AB0(void)
+{
+ s32 temp;
+ if(sub_80144A4(&temp) == 0)
+ {
+ switch(temp)
+ {
+ case 1:
+ case 3:
+ sub_8026074(2);
+ break;
+ case 2:
+ if (sub_8026AB0_sub())
+ sub_8026074(0xD);
+ else
+ sub_8026074(8);
+ break;
+ }
+ }
+}
+
+void sub_8026B10(void)
+{
+ s32 temp;
+ if(sub_80144A4(&temp) == 0)
+ {
+ switch(temp)
+ {
+ case 1:
+ case 3:
+ sub_8026074(2);
+ break;
+ case 2:
+ sub_8026074(8);
+ break;
+ }
+ }
+}
+
+
+void sub_8026B48(void)
+{
+ switch(sub_8022860())
+ {
+ case 2:
+ case 3:
+ sub_8022908();
+ sub_8026074(2);
+ break;
+ case 0:
+ case 1:
+ break;
+ }
+}
+
+
+void sub_8026B64(void)
+{
+ switch(sub_801A6E8(1))
+ {
+ case 3:
+ gUnknown_203B2B8->unkC = sub_801A8AC();
+ gUnknown_203B2B8->unk10.itemIndex = gTeamInventory_203B460->teamItems[gUnknown_203B2B8->unkC].itemIndex;
+ gUnknown_203B2B8->unk10.numItems = gTeamInventory_203B460->teamItems[gUnknown_203B2B8->unkC].numItems;
+ sub_8026074(0x14);
+ break;
+ case 4:
+ gUnknown_203B2B8->unkC = sub_801A8AC();
+ gUnknown_203B2B8->unk10.itemIndex = gTeamInventory_203B460->teamItems[gUnknown_203B2B8->unkC].itemIndex;
+ gUnknown_203B2B8->unk10.numItems = gTeamInventory_203B460->teamItems[gUnknown_203B2B8->unkC].numItems;
+ sub_8099690(0);
+ sub_8026074(0x15);
+ break;
+ case 2:
+ sub_801A928();
+ sub_8026074(2);
+ break;
+ case 0:
+ case 1:
+ break;
+ }
+}
+
+void sub_8026C14(void)
+{
+ u32 nextState;
+ struct unkStruct_8090F58 temp;
+ int menuAction;
+ struct ItemSlot slot;
+
+ menuAction = 0;
+ sub_801A6E8(0);
+ if ((sub_8012FD8(&gUnknown_203B2B8->unkCC) == '\0') && (sub_8013114(&gUnknown_203B2B8->unkCC,&menuAction), menuAction != 1)) {
+ gUnknown_203B2B8->unk74 = menuAction;
+ }
+ switch(menuAction)
+ {
+ case 0xb:
+ nextState = 0xF;
+ PlaySound(0x14d);
+ ShiftItemsDownFrom(gUnknown_203B2B8->unkC);
+ FillInventoryGaps();
+ if (gUnknown_203B2B8->unk14.itemIndex != '\0') {
+ sub_8091274(&gUnknown_203B2B8->unk14);
+ nextState = 0x10;
+ }
+ HeldItemToSlot(&slot,&gUnknown_203B2B8->unk10);
+ temp.unk0 = 0;
+ temp.unk4 = 0;
+ temp.unk8 = 1;
+ slot.itemFlags = ITEM_FLAG_EXISTS;
+ sub_8090E14(gUnknown_202DEA8,&slot,&temp);
+ GivePokemonItem(gUnknown_203B2B8->pokeSpecies,&gUnknown_203B2B8->unk10);
+ sub_801A928();
+ nullsub_104();
+ sub_8026074(nextState);
+ break;
+ case 4:
+ sub_8099690(0);
+ sub_8026074(0x15);
+ break;
+ case 1:
+ sub_8026074(0x13);
+ break;
+ }
+}
+
+void sub_8026CF0(void)
+{
+ switch(sub_801B410())
+ {
+ case 2:
+ case 3:
+ sub_801B450();
+ sub_8026074(0x13);
+ break;
+ case 0:
+ case 1:
+ break;
+ }
+}
+
+
+void sub_8026D0C(void)
+{
+ switch(sub_801EF38(1))
+ {
+ case 0:
+ case 1:
+ break;
+ case 3:
+ case 4:
+ gUnknown_203B2B8->unk20 = sub_801F194();
+ gUnknown_203B2B8->unk24 = gUnknown_203B2B8->unk28[gUnknown_203B2B8->unk20].moveID;
+ sub_8026074(0x18);
+ break;
+ case 2:
+ sub_801F214();
+ sub_8026074(2);
+ break;
+ }
+}
+
+void sub_8026D6C(void)
+{
+ switch(sub_801F890())
+ {
+ case 2:
+ case 3:
+ sub_801F8D0();
+ sub_8026074(0x17);
+ break;
+ case 0:
+ case 1:
+ break;
+ }
+}
+
+void sub_8026D88(void)
+{
+ s32 temp;
+ if(sub_80144A4(&temp) == 0)
+ {
+ sub_8026074(gUnknown_203B2B8->unk4);
+ }
+}
+
+void sub_8026DAC(u32 r0, struct HeldItem *r1)
+{
+ struct ItemSlot slot;
+ struct unkStruct_8090F58 temp;
+
+ sub_8008C54(r0);
+ sub_80073B8(r0);
+ HeldItemToSlot(&slot, r1);
+ temp.unk0 = 0;
+ temp.unk4 = 0;
+ temp.unk8 = 1;
+ slot.itemFlags = ITEM_FLAG_EXISTS;
+ sub_8090E14(gUnknown_202DE58, &slot, &temp);
+ xxx_format_and_draw(4, 3, gPartyMenuItemPlaceholder, r0, 0);
+ sub_80073E0(r0);
+}
+
+void sub_8026E08(u32 r0)
+{
+ u8 buffer1[40];
+ u8 buffer[20];
+ s32 x;
+
+ sub_8008C54(r0);
+ sub_80073B8(r0);
+ sub_80922B4(gAvailablePokemonNames, gUnknown_203B2B8->unk18->name, POKEMON_NAME_LENGTH);
+ sub_808D930(buffer, gUnknown_203B2B8->unk18->speciesNum);
+ ExpandPlaceholdersBuffer(buffer1, gUnknown_80DD6E0, gAvailablePokemonNames);
+ x = sub_8008ED0(buffer1);
+ xxx_call_draw_string(((gUnknown_80DD370.unk0c << 3) - x) / 2, 3, buffer1, r0, 0);
+ sub_80073E0(r0);
+}
+
+u32 sub_8026E88(struct PokemonStruct *r0)
+{
+ u8 iVar3;
+ if(r0->unk2 == 0)
+ {
+ iVar3 = (r0->unk4.unk4 == 0x41);
+ if(iVar3 != 0)
+ if(sub_80023E4(0x8) == 0)
+ return 0;
+ }
+ else
+ return 0;
+ return 1;
+}
+
+u32 sub_8026EB8(struct PokemonStruct *r0)
+{
+ u8 iVar3;
+ if(sub_808D3BC() != r0)
+ if(sub_808D3F8() != r0)
+ if(r0->unk2 == 0)
+ {
+ iVar3 = (r0->unk4.unk4 == 0x41);
+ if(iVar3 != 0)
+ {
+ if(sub_80023E4(0x8) != 0)
+ goto check;
+ }
+ else
+ check:
+ if(sub_8026F04(r0) != 3)
+ return 1;
+ }
+ return 0;
+}
+
+
+u32 sub_8026F04(struct PokemonStruct *r0)
+{
+ if(r0->heldItem.itemIndex == 0)
+ return 0;
+ else if(GetNumberOfFilledInventorySlots() < INVENTORY_SIZE)
+ return 1;
+ else if(sub_8026F38(r0))
+ return 2;
+ else
+ return 3;
+}
+
+bool8 sub_8026F38(struct PokemonStruct *r0)
+{
+ if(IsNotMoneyOrUsedTMItem(r0->heldItem.itemIndex))
+ {
+ if(IsThrowableItem(r0->heldItem.itemIndex))
+ {
+ if((gTeamInventory_203B460->teamStorage[r0->heldItem.itemIndex] + r0->heldItem.numItems) > 999)
+ return FALSE;
+ }
+ else
+ {
+ if(gTeamInventory_203B460->teamStorage[r0->heldItem.itemIndex] > 998)
+ return FALSE;
+ }
+ }
+ else
+ return FALSE;
+ return TRUE;
+}
+
+void sub_8026FA4(void)
+{
+ switch(sub_8026F04(gUnknown_203B2B8->unk18))
+ {
+ case 1:
+ PlaySound(0x14d);
+ sub_8091274(&gUnknown_203B2B8->unk14);
+ FillInventoryGaps();
+ gUnknown_203B2B8->unk14.itemIndex = 0;
+ gUnknown_203B2B8->unk14.numItems = 0;
+ GivePokemonItem(gUnknown_203B2B8->pokeSpecies, &gUnknown_203B2B8->unk14);
+ sub_8026074(0xA);
+ break;
+ case 2:
+ PlaySound(0x14d);
+ if(IsThrowableItem(gUnknown_203B2B8->unk14.itemIndex))
+ {
+ gTeamInventory_203B460->teamStorage[gUnknown_203B2B8->unk14.itemIndex] += gUnknown_203B2B8->unk14.numItems;
+ }
+ else
+ {
+ gTeamInventory_203B460->teamStorage[gUnknown_203B2B8->unk14.itemIndex] += 1;
+ }
+
+ gUnknown_203B2B8->unk14.itemIndex = 0;
+ gUnknown_203B2B8->unk14.numItems = 0;
+ GivePokemonItem(gUnknown_203B2B8->pokeSpecies, &gUnknown_203B2B8->unk14);
+ sub_8026074(0xB);
+ break;
+ case 0:
+ default:
+ sub_8026074(0x19);
+ break;
+ }
+}
diff --git a/src/items.c b/src/items.c
index 86174b9..05033e4 100644
--- a/src/items.c
+++ b/src/items.c
@@ -339,7 +339,7 @@ void sub_8090E14(u8* ext_buffer, struct ItemSlot* slot, struct unkStruct_8090F58
ExpandPlaceholdersBuffer(buffer, gUnknown_8109778, gItemParametersData[slot->itemIndex].namePointer);
}
}
- else if (slot->itemIndex == 105) {
+ else if (slot->itemIndex == ITEM_ID_POKE) {
ExpandPlaceholdersBuffer(buffer, gUnknown_810977C, GetMoneyValue(slot));
}
else {
diff --git a/src/kangaskhan_storage_2.c b/src/kangaskhan_storage_2.c
index 3c5099d..9c50251 100644
--- a/src/kangaskhan_storage_2.c
+++ b/src/kangaskhan_storage_2.c
@@ -33,7 +33,6 @@ extern u8 sub_8012FD8(u32 *r0);
extern void sub_8013114(u32 *, s32 *);
extern void sub_801CBB8();
-extern bool8 IsNotMoneyOrUsedTMItem(u8);
extern bool8 sub_801ADA0(u32);
extern void sub_8099690(u32);
extern u32 sub_8013BBC(u32 *);
diff --git a/src/kangaskhan_storage_3.c b/src/kangaskhan_storage_3.c
index f1ce8ce..1c65da6 100644
--- a/src/kangaskhan_storage_3.c
+++ b/src/kangaskhan_storage_3.c
@@ -1,4 +1,5 @@
#include "global.h"
+#include "item.h"
#include "kangaskhan_storage.h"
#include "team_inventory.h"
@@ -24,7 +25,6 @@ extern void sub_801CBB8(void);
extern void sub_8017F10(u32);
extern void sub_8012EA4(u32 *, u32);
-bool8 IsNotMoneyOrUsedTMItem(u8 id);
extern u8 sub_801ADA0(s32);
extern void sub_801A928(void);
extern void sub_8099690(u32);
diff --git a/src/kecleon_items_1.c b/src/kecleon_items_1.c
index 89cd19f..0dea887 100644
--- a/src/kecleon_items_1.c
+++ b/src/kecleon_items_1.c
@@ -8,6 +8,10 @@
#include "team_inventory.h"
extern struct unkStruct_203B210 *gUnknown_203B210;
+extern u8 gUnknown_80DB8E4[];
+extern u8 gUnknown_80DB8EC[];
+extern u8 gUnknown_80DB92C[];
+extern u8 gUnknown_80DB934[];
extern s32 sub_80144A4(s32 *);
void UpdateKecleonStoreState(u32);
@@ -18,11 +22,27 @@ extern void sub_8099690(u32);
extern u8 sub_8012FD8(u32 *);
extern void sub_8013114(u32 *, u32 *);
extern u32 sub_8019EDC(u8);
-extern void sub_801A2A8(u32);
+extern u32 sub_801A2A8(u8);
extern s32 sub_801A8AC(void);
-extern u32 sub_801A6E8(u32);
+extern u32 sub_801A6E8(u8);
extern void sub_801A928(void);
extern void DrawTeamMoneyBox(u32);
+extern void sub_8008C54(u32);
+extern void sub_80073B8(u32);
+extern void sub_80073E0(u32);
+extern s32 sub_8013800(void *, u32);
+extern void ExpandPlaceholdersBuffer(u8 *, u8 *, ...);
+extern void xxx_call_draw_string(s32 x, s32, u8 *, u32, u32);
+extern void sub_801AE84(void);
+extern void sub_8012D08(void *, u32);
+extern void sub_801A998(void);
+extern void sub_801A9E0(void);
+extern void sub_801AEF8(void);
+extern bool8 sub_801ADA0(u32);
+extern u32 sub_801AEA8(void);
+
+
+extern struct unkStruct_203B224 *gUnknown_203B224;
struct unkStruct_203B214
{;
@@ -47,6 +67,7 @@ struct unkStruct_203B214
};
extern struct unkStruct_203B214 *gUnknown_203B214;
+extern struct unkStruct_203B214 *gUnknown_203B21C;
struct ItemSlot_Alt
{
@@ -67,12 +88,22 @@ extern void sub_8013660(void *);
extern struct UnkTextStruct2 gUnknown_80DB8CC;
extern struct UnkTextStruct2 gUnknown_80DB8B4;
+extern struct UnkTextStruct2 gUnknown_80DB8FC;
+extern struct UnkTextStruct2 gUnknown_80DB944;
+extern const struct UnkTextStruct2 gUnknown_80DB914;
extern u16 gUnknown_203B218;
+extern u16 gUnknown_203B220;
+extern void sub_801A430(void);
+extern void sub_801A4A4(void);
extern void sub_8013984(u8 *);
extern void sub_801A064(void);
extern void sub_801A0D8(void);
extern void AddMenuCursorSprite(void *);
extern s32 xxx_count_inv_unk230();
+extern u8 sub_801A37C(void);
+extern u16 gUnknown_203B228;
+extern u16 gUnknown_203B22A;
+extern struct UnkTextStruct2 gUnknown_80DB95C;
void sub_8019B08(void)
{
@@ -368,3 +399,509 @@ void sub_801A010(void)
gUnknown_203B214 = NULL;
}
}
+
+NAKED
+void sub_801A064(void)
+{
+ asm_unified(
+ "\tpush {r4,lr}\n"
+ "\tldr r4, _0801A0D4\n"
+ "\tldr r0, [r4]\n"
+ "\tldrh r1, [r0, 0x20]\n"
+ "\tadds r0, 0x9C\n"
+ "\tmovs r2, 0\n"
+ "\tstrb r1, [r0]\n"
+ "\tldr r0, [r4]\n"
+ "\tldrh r1, [r0, 0x1E]\n"
+ "\tadds r0, 0x9D\n"
+ "\tstrb r1, [r0]\n"
+ "\tldr r0, [r4]\n"
+ "\tadds r0, 0x9E\n"
+ "\tmovs r1, 0xA\n"
+ "\tstrb r1, [r0]\n"
+ "\tldr r0, [r4]\n"
+ "\tadds r0, 0x9F\n"
+ "\tstrb r2, [r0]\n"
+ "\tldr r0, [r4]\n"
+ "\tmovs r1, 0x1A\n"
+ "\tldrsh r0, [r0, r1]\n"
+ "\tmovs r1, 0xC\n"
+ "\tbl sub_80095E4\n"
+ "\tadds r0, 0x2\n"
+ "\tlsls r0, 16\n"
+ "\tldr r2, [r4]\n"
+ "\tldr r3, [r2, 0x34]\n"
+ "\tlsls r1, r3, 1\n"
+ "\tadds r1, r3\n"
+ "\tlsls r1, 3\n"
+ "\tadds r1, r2, r1\n"
+ "\tadds r1, 0x4A\n"
+ "\tasrs r3, r0, 16\n"
+ "\tlsrs r0, 16\n"
+ "\tstrh r0, [r1]\n"
+ "\tldr r1, [r2, 0x34]\n"
+ "\tlsls r0, r1, 1\n"
+ "\tadds r0, r1\n"
+ "\tlsls r0, 3\n"
+ "\tadds r2, r0\n"
+ "\tadds r3, 0x2\n"
+ "\tadds r2, 0x4C\n"
+ "\tstrh r3, [r2]\n"
+ "\tbl ResetUnusedInputStruct\n"
+ "\tldr r0, [r4]\n"
+ "\tadds r0, 0x3C\n"
+ "\tmovs r1, 0x1\n"
+ "\tmovs r2, 0x1\n"
+ "\tbl sub_800641C\n"
+ "\tpop {r4}\n"
+ "\tpop {r0}\n"
+ "\tbx r0\n"
+ "\t.align 2, 0\n"
+ "_0801A0D4: .4byte gUnknown_203B214");
+}
+
+void sub_801A0D8(void)
+{
+ struct HeldItem *heldItem;
+ s32 iVar2;
+ s32 y;
+ s32 iVar4;
+ u8 auStack204 [80];
+ struct unkStruct_8090F58 local_7c;
+ u8 auStack112 [80];
+ struct ItemSlot_Alt slot;
+ u8 temp_calc;
+
+ // Needed for the shifts..
+ u32 index_shift;
+ u32 numItems_shift;
+
+ sub_8008C54(gUnknown_203B214->unk34);
+ sub_80073B8(gUnknown_203B214->unk34);
+ xxx_call_draw_string(gUnknown_203B214->unk1E * 8 + 10,0,gUnknown_80DB8E4,
+ gUnknown_203B214->unk34,0);
+
+ for(iVar4 = 0; iVar4 < gUnknown_203B214->unk1A; iVar4++)
+ {
+ temp_calc = (gUnknown_203B214->unk1E * gUnknown_203B214->unk1C) + iVar4;
+ heldItem = xxx_get_inv_unk230_at_809185C(temp_calc);
+
+ index_shift = heldItem->itemIndex << 16;
+ slot.temp.full_bits = (slot.temp.full_bits & 0xff00ffff) | index_shift;
+
+ numItems_shift = heldItem->numItems << 8;
+ slot.temp.full_bits = (slot.temp.full_bits & 0xffff00ff) | numItems_shift;
+
+ slot.temp.full_bits = (slot.temp.full_bits & 0xffffff00) | (ITEM_FLAG_EXISTS | ITEM_FLAG_FOR_SALE);
+
+ local_7c.unk0 = 1;
+ local_7c.unk4 = 0;
+ local_7c.unk6 = 0x58;
+ local_7c.unk8 = 1;
+ sub_8090E14(auStack204,(struct ItemSlot *)&slot,&local_7c);
+ iVar2 = GetStackBuyPrice((struct ItemSlot *)&slot);
+ if (iVar2 <= gTeamInventory_203B460->teamMoney) {
+ y = sub_8013800(gUnknown_203B214,iVar4);
+ xxx_call_draw_string(8,y,auStack204,gUnknown_203B214->unk34,0);
+ }
+ else {
+ ExpandPlaceholdersBuffer(auStack112,gUnknown_80DB8EC,auStack204);
+ y = sub_8013800(gUnknown_203B214,iVar4);
+ xxx_call_draw_string(8,y,auStack112,gUnknown_203B214->unk34,0);
+ }
+ }
+ sub_80073E0(gUnknown_203B214->unk34);
+}
+
+u32 sub_801A20C(u32 r0)
+{
+ if(xxx_count_non_empty_inv_unk250_8091A48() == 0)
+ {
+ return 0;
+ }
+ else
+ {
+ gUnknown_203B21C = MemoryAlloc(sizeof(struct unkStruct_203B214), 0x8);
+ gUnknown_203B21C->unk34 = r0;
+ gUnknown_203B21C->unk38 = &gUnknown_203B21C->unk3C[gUnknown_203B21C->unk34];
+ sub_8006518(gUnknown_203B21C->unk3C);
+ gUnknown_203B21C->unk3C[gUnknown_203B21C->unk34] = gUnknown_80DB914;
+ gUnknown_203B21C->unk38->unk14 = gUnknown_203B21C->unk9C;
+ ResetUnusedInputStruct();
+ sub_800641C(gUnknown_203B21C->unk3C, 1, 1);
+ sub_8013818(gUnknown_203B21C, xxx_count_non_empty_inv_unk250_8091A48(), 0xA, r0);
+ gUnknown_203B21C->temp.unk18 = gUnknown_203B220;
+ sub_8013984((u8 *)gUnknown_203B21C);
+ sub_801A430();
+ sub_801A4A4();
+ return 1;
+ }
+}
+
+u32 sub_801A2A8(u8 r0)
+{
+ struct ItemSlot_Alt slot;
+ struct HeldItem *return_var;
+ u32 r2;
+ u32 r3;
+
+ if(r0 == 0)
+ {
+ sub_8013660(gUnknown_203B21C);
+ return 0;
+ }
+ else
+ {
+ switch(GetKeyPress(gUnknown_203B21C))
+ {
+ case 2:
+ PlayMenuSoundEffect(1);
+ return 2;
+ case 1:
+ return_var = xxx_get_unk250_at_8091A90(sub_801A37C());
+
+ // NOTE: needs seperate vars to match
+ r2 = return_var->itemIndex << 16;
+ slot.temp.full_bits = (slot.temp.full_bits & 0xff00ffff) | r2;
+ r3 = return_var->numItems << 8;
+ slot.temp.full_bits = (slot.temp.full_bits & 0xffff00ff) | r3;
+
+ if(GetStackBuyPrice((struct ItemSlot *)&slot) > gTeamInventory_203B460->teamMoney)
+ {
+ PlayMenuSoundEffect(2);
+ }
+ else
+ {
+ PlayMenuSoundEffect(0);
+ }
+ return 3;
+ case 4:
+ PlayMenuSoundEffect(4);
+ return 4;
+ default:
+ if(sub_80138B8(gUnknown_203B21C, 1) != 0)
+ {
+ sub_801A430();
+ sub_801A4A4();
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+ }
+ }
+}
+
+u8 sub_801A37C(void)
+{
+ return (gUnknown_203B21C->unk1E * gUnknown_203B21C->unk1C) + gUnknown_203B21C->temp.unk18_u8;
+}
+
+void sub_801A398(u32 r0)
+{
+ u8 r0_u8;
+
+ r0_u8 = r0;
+
+ ResetUnusedInputStruct();
+ sub_800641C(gUnknown_203B21C->unk3C, 0, 0);
+ gUnknown_203B21C->unk22 = xxx_count_non_empty_inv_unk250_8091A48();
+ sub_8013984((u8 *)gUnknown_203B21C);
+ sub_801A430();
+ sub_801A4A4();
+ if(r0_u8)
+ AddMenuCursorSprite(gUnknown_203B21C);
+}
+
+void sub_801A3DC(void)
+{
+ if(gUnknown_203B21C != NULL)
+ {
+ gUnknown_203B220 = gUnknown_203B21C->temp.unk18;
+ gUnknown_203B21C->unk3C[gUnknown_203B21C->unk34] = gUnknown_80DB8FC;
+ ResetUnusedInputStruct();
+ sub_800641C(gUnknown_203B21C->unk3C, 1, 1);
+ MemoryFree(gUnknown_203B21C);
+ gUnknown_203B21C = NULL;
+ }
+}
+
+NAKED
+void sub_801A430(void)
+{
+ asm_unified("\tpush {r4,lr}\n"
+ "\tldr r4, _0801A4A0\n"
+ "\tldr r0, [r4]\n"
+ "\tldrh r1, [r0, 0x20]\n"
+ "\tadds r0, 0x9C\n"
+ "\tmovs r2, 0\n"
+ "\tstrb r1, [r0]\n"
+ "\tldr r0, [r4]\n"
+ "\tldrh r1, [r0, 0x1E]\n"
+ "\tadds r0, 0x9D\n"
+ "\tstrb r1, [r0]\n"
+ "\tldr r0, [r4]\n"
+ "\tadds r0, 0x9E\n"
+ "\tmovs r1, 0xA\n"
+ "\tstrb r1, [r0]\n"
+ "\tldr r0, [r4]\n"
+ "\tadds r0, 0x9F\n"
+ "\tstrb r2, [r0]\n"
+ "\tldr r0, [r4]\n"
+ "\tmovs r1, 0x1A\n"
+ "\tldrsh r0, [r0, r1]\n"
+ "\tmovs r1, 0xC\n"
+ "\tbl sub_80095E4\n"
+ "\tadds r0, 0x2\n"
+ "\tlsls r0, 16\n"
+ "\tldr r2, [r4]\n"
+ "\tldr r3, [r2, 0x34]\n"
+ "\tlsls r1, r3, 1\n"
+ "\tadds r1, r3\n"
+ "\tlsls r1, 3\n"
+ "\tadds r1, r2, r1\n"
+ "\tadds r1, 0x4A\n"
+ "\tasrs r3, r0, 16\n"
+ "\tlsrs r0, 16\n"
+ "\tstrh r0, [r1]\n"
+ "\tldr r1, [r2, 0x34]\n"
+ "\tlsls r0, r1, 1\n"
+ "\tadds r0, r1\n"
+ "\tlsls r0, 3\n"
+ "\tadds r2, r0\n"
+ "\tadds r3, 0x2\n"
+ "\tadds r2, 0x4C\n"
+ "\tstrh r3, [r2]\n"
+ "\tbl ResetUnusedInputStruct\n"
+ "\tldr r0, [r4]\n"
+ "\tadds r0, 0x3C\n"
+ "\tmovs r1, 0x1\n"
+ "\tmovs r2, 0x1\n"
+ "\tbl sub_800641C\n"
+ "\tpop {r4}\n"
+ "\tpop {r0}\n"
+ "\tbx r0\n"
+ "\t.align 2, 0\n"
+"_0801A4A0: .4byte gUnknown_203B21C");
+}
+
+void sub_801A4A4(void)
+{
+ struct HeldItem *heldItem;
+ s32 iVar2;
+ s32 y;
+ s32 iVar4;
+ u8 auStack204 [80];
+ struct unkStruct_8090F58 local_7c;
+ u8 auStack112 [80];
+ struct ItemSlot_Alt slot;
+ u8 temp_calc;
+
+ // Needed for the shifts..
+ u32 index_shift;
+ u32 numItems_shift;
+
+ sub_8008C54(gUnknown_203B21C->unk34);
+ sub_80073B8(gUnknown_203B21C->unk34);
+ xxx_call_draw_string(gUnknown_203B21C->unk1E * 8 + 10,0,gUnknown_80DB92C,
+ gUnknown_203B21C->unk34,0);
+
+ for(iVar4 = 0; iVar4 < gUnknown_203B21C->unk1A; iVar4++)
+ {
+ temp_calc = (gUnknown_203B21C->unk1E * gUnknown_203B21C->unk1C) + iVar4;
+ heldItem = xxx_get_unk250_at_8091A90(temp_calc);
+
+ index_shift = heldItem->itemIndex << 16;
+ slot.temp.full_bits = (slot.temp.full_bits & 0xff00ffff) | index_shift;
+
+ numItems_shift = heldItem->numItems << 8;
+ slot.temp.full_bits = (slot.temp.full_bits & 0xffff00ff) | numItems_shift;
+
+ slot.temp.full_bits = (slot.temp.full_bits & 0xffffff00) | (ITEM_FLAG_EXISTS | ITEM_FLAG_FOR_SALE);
+
+ local_7c.unk0 = 1;
+ local_7c.unk4 = 0;
+ local_7c.unk6 = 0x58;
+ local_7c.unk8 = 1;
+ sub_8090E14(auStack204,(struct ItemSlot *)&slot,&local_7c);
+ iVar2 = GetStackBuyPrice((struct ItemSlot *)&slot);
+ if (iVar2 <= gTeamInventory_203B460->teamMoney) {
+ y = sub_8013800(gUnknown_203B21C,iVar4);
+ xxx_call_draw_string(8,y,auStack204,gUnknown_203B21C->unk34,0);
+ }
+ else {
+ ExpandPlaceholdersBuffer(auStack112,gUnknown_80DB934,auStack204);
+ y = sub_8013800(gUnknown_203B21C,iVar4);
+ xxx_call_draw_string(8,y,auStack112,gUnknown_203B21C->unk34,0);
+ }
+ }
+ sub_80073E0(gUnknown_203B21C->unk34);
+}
+
+u32 sub_801A5D8(u32 param_1,int param_2,struct UnkTextStruct2_sub *param_3,u32 param_4)
+{
+
+ if (GetNumberOfFilledInventorySlots() == 0) {
+ return 0;
+ }
+ else {
+ if (gUnknown_203B224 == NULL) {
+ gUnknown_203B224 = MemoryAlloc(sizeof(struct unkStruct_203B224),8);
+ }
+ gUnknown_203B224->unk0 = param_1;
+ FillInventoryGaps();
+ sub_801AE84();
+
+ gUnknown_203B224->unk88 = param_2;
+ gUnknown_203B224->unk8C = &gUnknown_203B224->unk90[param_2];
+
+ sub_8006518(gUnknown_203B224->unk90);
+ gUnknown_203B224->unk90[gUnknown_203B224->unk88] = gUnknown_80DB95C;
+
+ gUnknown_203B224->unk8C->unk14 = gUnknown_203B224->unkF0;
+ if (param_3 != NULL) {
+ gUnknown_203B224->unk90[gUnknown_203B224->unk88].unk08 = *param_3;
+ }
+ sub_8012D08(gUnknown_203B224->unk8C,param_4);
+ sub_8099690(1);
+ ResetUnusedInputStruct();
+ sub_800641C(gUnknown_203B224->unk90,1,1);
+ sub_8013818(&gUnknown_203B224->unk54,GetNumberOfFilledInventorySlots(),param_4,param_2);
+ gUnknown_203B224->unk6C = gUnknown_203B228;
+ gUnknown_203B224->unk72 = gUnknown_203B22A;
+ sub_8013984((u8 *)&gUnknown_203B224->unk54);
+ sub_801A998();
+ sub_801A9E0();
+ return 1;
+ }
+}
+
+u32 sub_801A6E8(u8 param_1)
+{
+ s32 iVar5;
+ struct ItemSlot local_10;
+
+ if (param_1 == '\0') {
+ sub_8013660(&gUnknown_203B224->unk54);
+ return 0;
+ }
+ switch(GetKeyPress(&gUnknown_203B224->unk54)) {
+ case 2:
+ PlayMenuSoundEffect(1);
+ return 2;
+ case 1:
+ switch(gUnknown_203B224->unk0) {
+ case 0:
+ case 1:
+ case 2:
+ if (gUnknown_203B224->unk4[sub_801A8AC()] != 0)
+ PlayMenuSoundEffect(2);
+ else
+ PlayMenuSoundEffect(0);
+ break;
+ case 3:
+ if ((sub_801AEA8() != 0) || (sub_801ADA0(sub_801A8AC()) != '\0'))
+ PlayMenuSoundEffect(0);
+ else
+ PlayMenuSoundEffect(2);
+ break;
+ case 4:
+ local_10 = gTeamInventory_203B460->teamItems[sub_801A8AC()];
+ if (CanSellItem(local_10.itemIndex) && (GetStackSellPrice(&local_10) + gTeamInventory_203B460->teamMoney < 100000))
+ PlayMenuSoundEffect(0);
+ else
+ PlayMenuSoundEffect(2);
+ break;
+ case 5:
+ PlayMenuSoundEffect(0);
+ break;
+ }
+ return 3;
+ case 4:
+ PlayMenuSoundEffect(4);
+ return 4;
+ case 5:
+ case 6:
+ if (gUnknown_203B224->unk0 != 3) goto _0801A87C;
+ iVar5 = sub_801A8AC();
+ if ((gUnknown_203B224->unk4[iVar5] != 0) || (sub_801ADA0(iVar5) != '\0')) {
+ PlayMenuSoundEffect(6);
+ gUnknown_203B224->unk4[iVar5] = gUnknown_203B224->unk4[iVar5] ^ 1;
+ sub_80138B8(&gUnknown_203B224->unk54,0);
+ sub_801A9E0();
+ return 1;
+ }
+ else
+ {
+ PlayMenuSoundEffect(2);
+ goto _0801A87C;
+ }
+ case 3:
+ if (gUnknown_203B224->unk0 != 2) {
+ PlayMenuSoundEffect(5);
+ sub_801AEF8();
+ sub_801A9E0();
+ }
+ // NOTE: fallthrough needed here
+ default:
+_0801A87C:
+ if (sub_80138B8(&gUnknown_203B224->unk54,1) != '\0') {
+ sub_801A998();
+ sub_801A9E0();
+ return 1;
+ }
+ else {
+ return 0;
+ }
+ break;
+ }
+}
+
+s32 sub_801A8AC(void)
+{
+ return (gUnknown_203B224->unk72 * gUnknown_203B224->unk70) + gUnknown_203B224->unk6C;
+}
+
+void sub_801A8D0(u32 r0)
+{
+ u8 r0_u8;
+
+ r0_u8 = r0;
+
+ sub_8099690(1);
+ ResetUnusedInputStruct();
+ sub_800641C(gUnknown_203B224->unk90, 0, 0);
+ FillInventoryGaps();
+ gUnknown_203B224->unk76 = GetNumberOfFilledInventorySlots();
+ sub_8013984((u8 *)&gUnknown_203B224->unk54);
+ sub_801A998();
+ sub_801A9E0();
+ if(r0_u8)
+ AddMenuCursorSprite((u8 *)&gUnknown_203B224->unk54);
+}
+
+void sub_801A928(void)
+{
+ if(gUnknown_203B224 != NULL)
+ {
+ gUnknown_203B228 = gUnknown_203B224->unk6C;
+ gUnknown_203B22A = gUnknown_203B224->unk72;
+ gUnknown_203B224->unk90[gUnknown_203B224->unk88] = gUnknown_80DB944;
+ sub_8099690(0);
+ ResetUnusedInputStruct();
+ sub_800641C(gUnknown_203B224->unk90, 1, 1);
+ MemoryFree(gUnknown_203B224);
+ gUnknown_203B224 = NULL;
+ }
+}
+
+void sub_801A998(void)
+{
+ gUnknown_203B224->unkF0[0] = gUnknown_203B224->unk74;
+ gUnknown_203B224->unkF0[1] = gUnknown_203B224->unk72;
+ gUnknown_203B224->unkF0[2] = 0xB;
+ gUnknown_203B224->unkF0[3] = 0;
+ ResetUnusedInputStruct();
+ sub_800641C(gUnknown_203B224->unk90, 1, 1);
+}
diff --git a/src/kecleon_items_2.c b/src/kecleon_items_2.c
new file mode 100644
index 0000000..e9107c9
--- /dev/null
+++ b/src/kecleon_items_2.c
@@ -0,0 +1,15 @@
+#include "global.h"
+#include "file_system.h"
+#include "memory.h"
+#include "pokemon.h"
+#include "input.h"
+#include "item.h"
+#include "kecleon_items.h"
+#include "team_inventory.h"
+
+extern struct unkStruct_203B224 *gUnknown_203B224;
+
+struct unkStruct_203B224 * sub_801AF98(void)
+{
+ return gUnknown_203B224;
+}
diff --git a/src/load_screen.c b/src/load_screen.c
index a4e260a..ab092cc 100644
--- a/src/load_screen.c
+++ b/src/load_screen.c
@@ -98,7 +98,7 @@ extern void sub_8013114(u32 *, u32 *);
extern void sub_8095240(u32);
extern void sub_80920D8(u8 *);
-extern struct PokemonStruct *sub_808D33C(void);
+extern struct PokemonStruct *GetPlayerPokemonStruct(void);
extern u8 sub_80023E4(u32);
extern u8 *sub_8098FB4();
extern void ExpandPlaceholdersBuffer(u8 *buffer, const u8 *text, ...);
@@ -259,7 +259,7 @@ void DrawLoadScreenText(void)
xxx_call_draw_string(64,0,gLoadScreen->formattedTeamName,0,0);
// Draw Player Name
- playerInfo = sub_808D33C();
+ playerInfo = GetPlayerPokemonStruct();
if (playerInfo == NULL)
sub_80922B4(playerName, gNoNamePlaceholder, POKEMON_NAME_LENGTH);
else
diff --git a/src/luminous_cave.c b/src/luminous_cave.c
new file mode 100644
index 0000000..a50e92c
--- /dev/null
+++ b/src/luminous_cave.c
@@ -0,0 +1,850 @@
+#include "global.h"
+#include "constants/bg_music.h"
+#include "input.h"
+#include "item.h"
+#include "memory.h"
+#include "menu.h"
+#include "pokemon.h"
+#include "random.h"
+#include "text.h"
+#include "team_inventory.h"
+
+struct unkStruct_203B2B0
+{
+ // size: 0x174
+ u8 unk0;
+ u8 fill1[0x3];
+ u8 unk4;
+ u8 unk5;
+ u8 unk6;
+ u16 unk8;
+ /* 0xA */ s16 targetSpecies; // species # of the evolved pokemon (what we are evolving to)
+ struct PokemonStruct *pokeStruct;
+ /* 0x10 */ bool8 pokeRenamed;
+ /* 0x14 */ u32 evoItem1_InvIndex; // inventory index of item
+ /* 0x18 */ u32 evoItem2_InvIndex; // inventory index of item
+ struct ItemSlot unk1C;
+ u32 state;
+ u32 fallbackState;
+ u32 unk28;
+ u32 unk2C;
+ u32 unk30;
+ struct MenuItem unk34[8];
+ u16 unk74[0x8];
+ u32 unk84;
+ u8 fill88[0x104 - 0x88];
+ struct OpenedFile *unk104;
+ u8 *unk108;
+ u16 unk10C;
+ u16 unk10E;
+ u8 unk110;
+ u8 unk111;
+ u8 unk112;
+ struct UnkTextStruct2 unk114[4];
+};
+
+extern struct unkStruct_203B2B0 *gUnknown_203B2B0;
+extern struct UnkTextStruct2 gUnknown_80DCA00;
+extern struct UnkTextStruct2 gUnknown_80DC9E8;
+extern u8 gPlayerName[];
+extern u8 gAvailablePokemonNames[];
+extern u8 gUnknown_202DFE8[];
+extern u8 gLuminousCaveSeekAwakening[];
+extern u8 gLuminousCaveEvolutionInfo[];
+extern u8 gLuminousCaveAskEvolution[];
+extern u8 gLuminousCaveYeShallReturn[];
+extern u8 gLuminousCaveGiveItem[];
+extern u8 gLuminousCaveGiveAnotherItem[];
+extern u8 gLuminousCaveLackWhatIsNeeded[];
+extern u8 gLuminousCaveOnlyOneItem[];
+extern u8 gLuminousCaveLetUsBegin[];
+extern u8 gLuminousCaveChangedAppearance[];
+extern u8 gLuminousCaveEvolved[];
+extern u8 gLuminousCaveGiveName[];
+extern u8 gLuminousCaveComeAlone[];
+extern u8 gLuminousCaveLackLevel[];
+extern u8 gLuminousCaveCantEvolveAnymore[];
+extern u8 gLuminousCaveLackFriendArea[];
+extern u8 gLuminousCaveLackRoom[];
+extern u8 gLuminousCaveLackIQ[];
+extern u8 gLuminousCaveLackItem[];
+extern u8 gLuminousCaveCantEvolveYet[];
+extern u8 gUnknown_80DCA18[];
+extern u8 *gUnknown_80D4970[];
+extern u8 *gUnknown_80D4934[];
+extern u8 gUnknown_80DCA24[];
+extern u8 gUnknown_80DCA2C[];
+
+extern bool8 IsPokemonRenamed(struct PokemonStruct* pokemon);
+extern struct PokemonStruct *GetPlayerPokemonStruct(void);
+extern void UpdateLuminousCaveState(u32);
+
+extern void sub_8024E9C(void);
+extern void sub_8024F00(void);
+extern void sub_8024FD4(void);
+extern void sub_80250EC(void);
+extern void sub_80251CC(void);
+extern void sub_8024F70(void);
+extern void sub_8025058(void);
+extern void sub_802515C(void);
+extern void sub_80251E8(void);
+extern void sub_8025204(void);
+extern void LuminousCave_AdvancetoFallbackState(void);
+extern void sub_8024804(void);
+extern void UpdateLuminousCaveDialogue(void);
+
+extern void sub_80141B4(const char *r0, u32, struct OpenedFile **r1, u32);
+extern void sub_8014248(const char *r0, u32, u32, struct MenuItem *r4, u16 *, u32, u32, struct OpenedFile **r5, u32);
+void xxx_call_fade_out_bgm(u16 speed);
+void sub_801199C(u16 songIndex);
+void ClearItemSlotAt(u32 index);
+void xxx_call_fade_in_new_bgm(u16 songIndex, u16 speed);
+void sub_80977D0(void);
+void PlaySound(u32);
+void sub_8024CFC(void);
+void sub_8025254(void);
+void sub_8024D48(void);
+extern void sub_801A5D8(u32, u32, u32, u32);
+extern void sub_801A8D0(u32);
+extern void sub_801A9E0();
+extern void sub_801B3C0(struct ItemSlot *);
+extern void nullsub_104();
+void sub_8024DBC(void);
+void sub_8024E30(void);
+void sub_801AEE4(u32, u32);
+extern void sub_8012D60(u32 *, struct MenuItem *, u32, u16 *, u32, u32);
+void sub_808F734(struct PokemonStruct *, s16);
+void BoundedCopyStringtoBuffer(u8 *buffer, u8 *string, s32 size);
+u32 sub_801602C(u32 r0, u8 *name);
+void sub_808D9AC(u8 *buffer, struct PokemonStruct *pokemon, s32 colorNum);
+extern s32 sub_80144A4(s32 *);
+extern u32 sub_801A6E8(u32);
+extern s32 sub_801A8AC(void);
+extern void sub_8099690(u32);
+extern void sub_801A928(void);
+extern void PlayMenuSoundEffect(u32);
+extern u8 sub_8012FD8(u32 *);
+extern void sub_8013114(u32 *, u32 *);
+extern u32 sub_801B410(void);
+extern void sub_801B450(void);
+extern u32 sub_8016080(void);
+extern void sub_80160D8(void);
+extern void sub_808F468(struct PokemonStruct *, u8 *, u32);
+
+bool8 LuminousCave_HasOnly1Member(void);
+
+enum
+{
+ LUMINOUS_CAVE_ENTRY,
+ LUMINOUS_CAVE_ASK_EVOLVE,
+ LUMINOUS_CAVE_EVOLVE_INFO,
+ LUMINOUS_CAVE_SHALL_RETURN,
+ LUMINOUS_CAVE_GIVE_ITEM_1 = 5,
+ LUMINOUS_CAVE_GIVE_ITEM_2 = 10,
+ LUMINOUS_CAVE_LACK_WHAT_NEEDED = 0xF,
+ LUMINOUS_CAVE_ONLY_ONE_ITEM = 0x10,
+ LUMINOUS_CAVE_LET_US_BEGIN = 0x11,
+ LUMINOUS_CAVE_CHANGED_APPEARANCE = 0x12,
+ LUMINOUS_CAVE_EVOLVED = 0x13,
+ LUMINOUS_CAVE_PROMPT_NAME = 0x14,
+ LUMINOUS_CAVE_FINISH_NAME = 0x15,
+ LUMINOUS_CAVE_COME_ALONE = 0x16,
+ LUMINOUS_CAVE_LACK_LEVEL = 0x17,
+ LUMINOUS_CAVE_CANT_EVOLVE_ANYMORE = 0x18,
+ LUMINOUS_CAVE_LACK_FRIEND_AREA = 0x19,
+ LUMINOUS_CAVE_LACK_ROOM = 0x1A,
+ LUMINOUS_CAVE_LACK_IQ = 0x1B,
+ LUMINOUS_CAVE_LACK_ITEM = 0x1C,
+ LUMINOUS_CAVE_CANT_EVOLVE_YET = 0x1D,
+};
+
+u32 sub_802465C(void)
+{
+ struct OpenedFile *faceFile;
+
+ ResetUnusedInputStruct();
+ sub_800641C(0,1,1);
+ gUnknown_203B2B0 = MemoryAlloc(sizeof(struct unkStruct_203B2B0),8);
+ gUnknown_203B2B0->unk28 = 0;
+ gUnknown_203B2B0->unk2C = 0;
+ gUnknown_203B2B0->unk30 = 0;
+ gUnknown_203B2B0->pokeStruct = GetPlayerPokemonStruct();
+ gUnknown_203B2B0->pokeRenamed = IsPokemonRenamed(gUnknown_203B2B0->pokeStruct);
+ gUnknown_203B2B0->unk0 = 0;
+ faceFile = GetDialogueSpriteDataPtr(SPECIES_GULPIN);
+ gUnknown_203B2B0->unk104 = faceFile;
+ gUnknown_203B2B0->unk108 = faceFile->data;
+ gUnknown_203B2B0->unk110 = 0;
+ gUnknown_203B2B0->unk111 = 0;
+ gUnknown_203B2B0->unk112 = 0;
+ gUnknown_203B2B0->unk10C = 2;
+ gUnknown_203B2B0->unk10E = 8;
+ UpdateLuminousCaveState(LUMINOUS_CAVE_ENTRY);
+ return 1;
+}
+
+u32 sub_80246F0(void)
+{
+ switch(gUnknown_203B2B0->state) {
+ case LUMINOUS_CAVE_ENTRY:
+ case LUMINOUS_CAVE_ASK_EVOLVE:
+ sub_8024E9C();
+ break;
+ case LUMINOUS_CAVE_GIVE_ITEM_1:
+ sub_8024F00();
+ break;
+ case 6:
+ case 7:
+ sub_8024FD4();
+ break;
+ case 8:
+ sub_80250EC();
+ break;
+ case 9:
+ sub_80251CC();
+ break;
+ case LUMINOUS_CAVE_GIVE_ITEM_2:
+ sub_8024F70();
+ break;
+ case 0xb:
+ case 0xc:
+ sub_8025058();
+ break;
+ case 0xd:
+ sub_802515C();
+ break;
+ case 0xe:
+ sub_80251E8();
+ break;
+ case LUMINOUS_CAVE_FINISH_NAME:
+ sub_8025204();
+ break;
+ case 4:
+ return 3;
+ default:
+ LuminousCave_AdvancetoFallbackState();
+ break;
+ }
+ return 0;
+}
+
+u8 sub_80247B4(void)
+{
+ return gUnknown_203B2B0->unk0;
+}
+
+void CleanLuminousCave(void)
+{
+ if(gUnknown_203B2B0 != NULL)
+ {
+ CloseFile(gUnknown_203B2B0->unk104);
+ MemoryFree(gUnknown_203B2B0);
+ gUnknown_203B2B0 = NULL;
+ }
+}
+
+void UpdateLuminousCaveState(u32 newState)
+{
+ gUnknown_203B2B0->state = newState;
+ sub_8024804();
+ UpdateLuminousCaveDialogue();
+}
+
+void sub_8024804(void)
+{
+ s32 iVar4;
+
+ sub_8006518(gUnknown_203B2B0->unk114);
+ switch(gUnknown_203B2B0->state) {
+ case 8:
+ case 0xD:
+ gUnknown_203B2B0->unk114[2] = gUnknown_80DCA00;
+ break;
+ case LUMINOUS_CAVE_LET_US_BEGIN:
+ case LUMINOUS_CAVE_CHANGED_APPEARANCE:
+ case LUMINOUS_CAVE_EVOLVED:
+ case LUMINOUS_CAVE_COME_ALONE:
+ case LUMINOUS_CAVE_LACK_LEVEL:
+ case LUMINOUS_CAVE_CANT_EVOLVE_ANYMORE:
+ case LUMINOUS_CAVE_LACK_FRIEND_AREA:
+ case LUMINOUS_CAVE_LACK_ROOM:
+ case LUMINOUS_CAVE_LACK_IQ:
+ case LUMINOUS_CAVE_LACK_ITEM:
+ break;
+ default:
+ for(iVar4 = 0; iVar4 < 4; iVar4++)
+ {
+ gUnknown_203B2B0->unk114[iVar4] = gUnknown_80DC9E8;
+ }
+ break;
+ }
+ ResetUnusedInputStruct();
+ sub_800641C(gUnknown_203B2B0->unk114, 1, 1);
+}
+
+void UpdateLuminousCaveDialogue(void)
+{
+ char *monName;
+
+ switch(gUnknown_203B2B0->state) {
+ case LUMINOUS_CAVE_ENTRY:
+ if (LuminousCave_HasOnly1Member()) {
+ gUnknown_203B2B0->unk28 = 3;
+ }
+ else {
+ gUnknown_203B2B0->unk28 = 1;
+ }
+ sub_8024CFC();
+ sub_8014248(gLuminousCaveSeekAwakening,0,gUnknown_203B2B0->unk28,gUnknown_203B2B0->unk34,gUnknown_203B2B0->unk74,4,0,0,5);
+ break;
+ case LUMINOUS_CAVE_ASK_EVOLVE:
+ sub_8024CFC();
+ sub_8014248(gLuminousCaveAskEvolution,0,gUnknown_203B2B0->unk28,gUnknown_203B2B0->unk34,gUnknown_203B2B0->unk74,4,0,0,5);
+ break;
+ case LUMINOUS_CAVE_EVOLVE_INFO:
+ gUnknown_203B2B0->fallbackState = LUMINOUS_CAVE_ASK_EVOLVE;
+ sub_80141B4(gLuminousCaveEvolutionInfo,0,0,0x105);
+ break;
+ case LUMINOUS_CAVE_SHALL_RETURN:
+ gUnknown_203B2B0->fallbackState = 4;
+ xxx_call_fade_in_new_bgm(MUS_LOADING_SCREEN,0x3c);
+ sub_80141B4(gLuminousCaveYeShallReturn,0,0,0x305);
+ break;
+
+ case LUMINOUS_CAVE_GIVE_ITEM_1:
+ sub_8024D48();
+ sub_8014248(gLuminousCaveGiveItem,0,gUnknown_203B2B0->unk2C,gUnknown_203B2B0->unk34,gUnknown_203B2B0->unk74,4,0,0,5);
+ break;
+ case 6:
+ sub_801A5D8(2,3,0,10);
+ break;
+ case 7:
+ sub_801A8D0(1);
+ break;
+ case LUMINOUS_CAVE_GIVE_ITEM_2:
+ sub_8024DBC();
+ sub_8014248(gLuminousCaveGiveAnotherItem,0,gUnknown_203B2B0->unk2C,gUnknown_203B2B0->unk34,gUnknown_203B2B0->unk74,4,0,0,5);
+ break;
+ case 0xb:
+ sub_801A5D8(2,3,0,10);
+ sub_801AEE4(gUnknown_203B2B0->evoItem1_InvIndex,1);
+ sub_801A9E0();
+ break;
+ case 0xc:
+ sub_801A8D0(1);
+ sub_801AEE4(gUnknown_203B2B0->evoItem1_InvIndex,1);
+ sub_801A9E0();
+ break;
+ case 8:
+ case 0xd:
+ sub_801A9E0();
+ sub_8024E30();
+ sub_8012D60(&gUnknown_203B2B0->unk84,gUnknown_203B2B0->unk34,0,gUnknown_203B2B0->unk74,
+ gUnknown_203B2B0->unk30,2);
+ break;
+ case 9:
+ case 0xe:
+ sub_801B3C0(&gUnknown_203B2B0->unk1C);
+ break;
+ case LUMINOUS_CAVE_LACK_WHAT_NEEDED:
+ gUnknown_203B2B0->fallbackState = LUMINOUS_CAVE_GIVE_ITEM_1;
+ sub_80141B4(gLuminousCaveLackWhatIsNeeded,0,0,0x105);
+ break;
+ case LUMINOUS_CAVE_ONLY_ONE_ITEM:
+ gUnknown_203B2B0->fallbackState = LUMINOUS_CAVE_GIVE_ITEM_2;
+ sub_80141B4(gLuminousCaveOnlyOneItem,0,0,0x105);
+ break;
+ case LUMINOUS_CAVE_LET_US_BEGIN:
+ sub_8025254();
+
+ if((gUnknown_203B2B0->unk8 & 1) != 0)
+ gUnknown_203B2B0->fallbackState = LUMINOUS_CAVE_CHANGED_APPEARANCE;
+ else if(gUnknown_203B2B0->unk8 == 4)
+ gUnknown_203B2B0->fallbackState = LUMINOUS_CAVE_CANT_EVOLVE_ANYMORE;
+ else if(gUnknown_203B2B0->unk8 == 2)
+ gUnknown_203B2B0->fallbackState = LUMINOUS_CAVE_LACK_LEVEL;
+ else if(gUnknown_203B2B0->unk8 == 0x10)
+ gUnknown_203B2B0->fallbackState = LUMINOUS_CAVE_LACK_IQ;
+ else if(gUnknown_203B2B0->unk8 == 0x20)
+ gUnknown_203B2B0->fallbackState = LUMINOUS_CAVE_LACK_FRIEND_AREA;
+ else if(gUnknown_203B2B0->unk8 == 0x40)
+ gUnknown_203B2B0->fallbackState = LUMINOUS_CAVE_LACK_ROOM;
+ else if(gUnknown_203B2B0->unk8 == 8)
+ gUnknown_203B2B0->fallbackState = LUMINOUS_CAVE_LACK_ITEM;
+ else
+ gUnknown_203B2B0->fallbackState = LUMINOUS_CAVE_CANT_EVOLVE_YET;
+ xxx_call_fade_out_bgm(0x3c);
+ sub_80141B4(gLuminousCaveLetUsBegin,0,0,0x105);
+ break;
+ case LUMINOUS_CAVE_CHANGED_APPEARANCE:
+ sub_808D9AC(gPlayerName,gUnknown_203B2B0->pokeStruct,5);
+ PlaySound(0x1ff);
+ gUnknown_203B2B0->fallbackState = LUMINOUS_CAVE_EVOLVED;
+ sub_80141B4(gLuminousCaveChangedAppearance,0,0,0x105);
+ break;
+ case LUMINOUS_CAVE_EVOLVED:
+ monName = GetMonSpecies(gUnknown_203B2B0->pokeStruct->speciesNum);
+ strcpy(gAvailablePokemonNames,monName);
+ monName = GetMonSpecies(gUnknown_203B2B0->targetSpecies);
+ strcpy(gAvailablePokemonNames + 0x50,monName);
+ gUnknown_203B2B0->unk0 = 1;
+ sub_80977D0();
+ sub_808F734(gUnknown_203B2B0->pokeStruct,gUnknown_203B2B0->targetSpecies);
+ nullsub_104();
+ gUnknown_203B2B0->pokeStruct = GetPlayerPokemonStruct();
+ if (gUnknown_203B2B0->evoItem1_InvIndex != INVENTORY_SIZE) {
+ ClearItemSlotAt(gUnknown_203B2B0->evoItem1_InvIndex);
+ }
+ if (gUnknown_203B2B0->evoItem2_InvIndex != INVENTORY_SIZE) {
+ ClearItemSlotAt(gUnknown_203B2B0->evoItem2_InvIndex);
+ }
+ FillInventoryGaps();
+ sub_801199C(0x1ff);
+ PlaySound(0xd2);
+ if (gUnknown_203B2B0->pokeRenamed) {
+ BoundedCopyStringtoBuffer(gUnknown_203B2B0->pokeStruct->name,GetMonSpecies(gUnknown_203B2B0->pokeStruct->speciesNum),POKEMON_NAME_LENGTH);
+ }
+ gUnknown_203B2B0->fallbackState = LUMINOUS_CAVE_SHALL_RETURN;
+ sub_80141B4(gLuminousCaveEvolved,0,0,0x105);
+ break;
+ case LUMINOUS_CAVE_COME_ALONE:
+ gUnknown_203B2B0->fallbackState = LUMINOUS_CAVE_SHALL_RETURN;
+ sub_80141B4(gLuminousCaveComeAlone,0,0,0x105);
+ break;
+ case LUMINOUS_CAVE_LACK_LEVEL:
+ gUnknown_203B2B0->fallbackState = LUMINOUS_CAVE_SHALL_RETURN;
+ sub_80141B4(gLuminousCaveLackLevel,0,0,0x105);
+ break;
+ case LUMINOUS_CAVE_CANT_EVOLVE_ANYMORE:
+ gUnknown_203B2B0->fallbackState = LUMINOUS_CAVE_SHALL_RETURN;
+ sub_80141B4(gLuminousCaveCantEvolveAnymore,0,0,0x105);
+ break;
+ case LUMINOUS_CAVE_LACK_FRIEND_AREA:
+ gUnknown_203B2B0->fallbackState = LUMINOUS_CAVE_SHALL_RETURN;
+ sub_80141B4(gLuminousCaveLackFriendArea,0,0,0x105);
+ break;
+ case LUMINOUS_CAVE_LACK_ROOM:
+ gUnknown_203B2B0->fallbackState = LUMINOUS_CAVE_SHALL_RETURN;
+ sub_80141B4(gLuminousCaveLackRoom,0,0,0x105);
+ break;
+ case LUMINOUS_CAVE_LACK_IQ:
+ gUnknown_203B2B0->fallbackState = LUMINOUS_CAVE_SHALL_RETURN;
+ sub_80141B4(gLuminousCaveLackIQ,0,0,0x105);
+ break;
+ case LUMINOUS_CAVE_LACK_ITEM:
+ gUnknown_203B2B0->fallbackState = LUMINOUS_CAVE_SHALL_RETURN;
+ sub_80141B4(gLuminousCaveLackItem,0,0,0x105);
+ break;
+ case LUMINOUS_CAVE_CANT_EVOLVE_YET:
+ gUnknown_203B2B0->fallbackState = LUMINOUS_CAVE_SHALL_RETURN;
+ sub_80141B4(gLuminousCaveCantEvolveYet,0,0,0x105);
+ break;
+ case LUMINOUS_CAVE_PROMPT_NAME:
+ xxx_call_fade_in_new_bgm(8,0x3c);
+ gUnknown_203B2B0->fallbackState = LUMINOUS_CAVE_FINISH_NAME;
+ sub_80141B4(gLuminousCaveGiveName,0,0,0x105);
+ break;
+ case LUMINOUS_CAVE_FINISH_NAME:
+ if (gUnknown_203B2B0->pokeRenamed) {
+ BoundedCopyStringtoBuffer(gUnknown_203B2B0->pokeStruct->name,GetMonSpecies(gUnknown_203B2B0->pokeStruct->speciesNum),POKEMON_NAME_LENGTH);
+ }
+ sub_801602C(0,gUnknown_203B2B0->pokeStruct->name);
+ break;
+ default:
+ break;
+ }
+}
+
+void sub_8024CFC(void)
+{
+ u8 *nullString;
+ struct unkStruct_203B2B0 *preload;
+ u32 defaultAction;
+
+ MemoryFill16(gUnknown_203B2B0->unk74, 0, sizeof(gUnknown_203B2B0->unk74));
+ preload = gUnknown_203B2B0;
+ nullString = NULL;
+ preload->unk34[0].text = gUnknown_80DCA18;
+ preload->unk34[0].menuAction = 3;
+ defaultAction = 1;
+ preload->unk34[1].text = *gUnknown_80D4970;
+ preload->unk34[1].menuAction = 2;
+ preload->unk34[2].text = *gUnknown_80D4934;
+ preload->unk34[2].menuAction = defaultAction;
+ preload->unk34[3].text = nullString;
+ preload->unk34[3].menuAction = defaultAction;
+}
+
+void sub_8024D48(void)
+{
+ u8 *nullString;
+ struct unkStruct_203B2B0 *preload;
+ u32 defaultAction;
+ s32 iVar4;
+ s32 loopMax;
+
+ MemoryFill16(gUnknown_203B2B0->unk74, 0, sizeof(gUnknown_203B2B0->unk74));
+ preload = gUnknown_203B2B0;
+ nullString = NULL;
+ preload->unk34[0].text = gUnknown_80DCA24;
+ preload->unk34[0].menuAction = 4;
+ defaultAction = 1;
+ preload->unk34[1].text = gUnknown_80DCA2C;
+ preload->unk34[1].menuAction = 5;
+ preload->unk34[2].text = *gUnknown_80D4934;
+ preload->unk34[2].menuAction = defaultAction;
+
+ loopMax = 3;
+
+ preload->unk34[3].text = nullString;
+ preload->unk34[3].menuAction = defaultAction;
+
+ for(iVar4 = 0; iVar4 < loopMax; iVar4++)
+ {
+ if(gUnknown_203B2B0->unk74[iVar4] == 0)
+ {
+ if(gUnknown_203B2B0->unk34[iVar4].menuAction == gUnknown_203B2B0->unk2C)
+ return;
+ }
+ }
+
+ gUnknown_203B2B0->unk2C = 4;
+}
+
+void sub_8024DBC(void)
+{
+ u8 *nullString;
+ struct unkStruct_203B2B0 *preload;
+ u32 defaultAction;
+ s32 iVar4;
+ s32 loopMax;
+
+ MemoryFill16(gUnknown_203B2B0->unk74, 0, sizeof(gUnknown_203B2B0->unk74));
+ preload = gUnknown_203B2B0;
+ nullString = NULL;
+ preload->unk34[0].text = gUnknown_80DCA24;
+ preload->unk34[0].menuAction = 4;
+ defaultAction = 1;
+ preload->unk34[1].text = gUnknown_80DCA2C;
+ preload->unk34[1].menuAction = 5;
+ preload->unk34[2].text = *gUnknown_80D4934;
+ preload->unk34[2].menuAction = defaultAction;
+
+ loopMax = 3;
+
+ preload->unk34[3].text = nullString;
+ preload->unk34[3].menuAction = defaultAction;
+
+ for(iVar4 = 0; iVar4 < loopMax; iVar4++)
+ {
+ if(gUnknown_203B2B0->unk74[iVar4] == 0)
+ {
+ if(gUnknown_203B2B0->unk34[iVar4].menuAction == gUnknown_203B2B0->unk2C)
+ return;
+ }
+ }
+
+ gUnknown_203B2B0->unk2C = 4;
+}
+
+void sub_8024E30(void)
+{
+ u8 *nullString;
+ struct unkStruct_203B2B0 *preload;
+ u32 defaultAction;
+ s32 iVar4;
+ s32 loopMax;
+
+ MemoryFill16(gUnknown_203B2B0->unk74, 0, sizeof(gUnknown_203B2B0->unk74));
+ preload = gUnknown_203B2B0;
+ nullString = NULL;
+ preload->unk34[0].text = gUnknown_80DCA2C;
+ preload->unk34[0].menuAction = 5;
+ defaultAction = 1;
+ preload->unk34[1].text = *gUnknown_80D4970;
+ preload->unk34[1].menuAction = 2;
+
+ loopMax = 2;
+
+ preload->unk34[2].text = nullString;
+ preload->unk34[2].menuAction = defaultAction;
+
+ for(iVar4 = 0; iVar4 < loopMax; iVar4++)
+ {
+ if(gUnknown_203B2B0->unk74[iVar4] == 0)
+ {
+ if(gUnknown_203B2B0->unk34[iVar4].menuAction == gUnknown_203B2B0->unk30)
+ return;
+ }
+ }
+
+ gUnknown_203B2B0->unk30 = 5;
+}
+
+void sub_8024E9C(void)
+{
+ s32 menuAction;
+ if(sub_80144A4(&menuAction) == 0)
+ {
+ if(menuAction != 1) gUnknown_203B2B0->unk28 = menuAction;
+ switch(menuAction)
+ {
+ case 3:
+ if(LuminousCave_HasOnly1Member())
+ UpdateLuminousCaveState(LUMINOUS_CAVE_GIVE_ITEM_1);
+ else
+ UpdateLuminousCaveState(LUMINOUS_CAVE_COME_ALONE);
+ break;
+ case 2:
+ UpdateLuminousCaveState(LUMINOUS_CAVE_EVOLVE_INFO);
+ break;
+ case 1:
+ UpdateLuminousCaveState(LUMINOUS_CAVE_SHALL_RETURN);
+ break;
+ }
+ }
+}
+
+void sub_8024F00(void)
+{
+ s32 menuAction;
+ if(sub_80144A4(&menuAction) == 0)
+ {
+ if(menuAction != 1) gUnknown_203B2B0->unk2C = menuAction;
+ switch(menuAction)
+ {
+ case 4:
+ gUnknown_203B2B0->evoItem1_InvIndex = INVENTORY_SIZE;
+ gUnknown_203B2B0->evoItem2_InvIndex = INVENTORY_SIZE;
+ UpdateLuminousCaveState(LUMINOUS_CAVE_LET_US_BEGIN);
+ break;
+ case 5:
+ if(GetNumberOfFilledInventorySlots() == 0)
+ UpdateLuminousCaveState(LUMINOUS_CAVE_LACK_WHAT_NEEDED);
+ else
+ UpdateLuminousCaveState(0x6);
+ break;
+ case 1:
+ UpdateLuminousCaveState(LUMINOUS_CAVE_ASK_EVOLVE);
+ break;
+ }
+ }
+}
+
+void sub_8024F70(void)
+{
+ s32 menuAction;
+ if(sub_80144A4(&menuAction) == 0)
+ {
+ if(menuAction != 1) gUnknown_203B2B0->unk2C = menuAction;
+ switch(menuAction)
+ {
+ case 4:
+ UpdateLuminousCaveState(LUMINOUS_CAVE_LET_US_BEGIN);
+ break;
+ case 5:
+ if(GetNumberOfFilledInventorySlots() < 2)
+ UpdateLuminousCaveState(LUMINOUS_CAVE_ONLY_ONE_ITEM);
+ else
+ UpdateLuminousCaveState(0xB);
+ break;
+ case 1:
+ UpdateLuminousCaveState(LUMINOUS_CAVE_ASK_EVOLVE);
+ break;
+ }
+ }
+}
+
+void sub_8024FD4(void)
+{
+ switch(sub_801A6E8(1))
+ {
+ case 3:
+ gUnknown_203B2B0->evoItem1_InvIndex = sub_801A8AC();
+ gUnknown_203B2B0->evoItem2_InvIndex = INVENTORY_SIZE;
+ gUnknown_203B2B0->unk1C = gTeamInventory_203B460->teamItems[gUnknown_203B2B0->evoItem1_InvIndex];
+ UpdateLuminousCaveState(8);
+ break;
+ case 4:
+ gUnknown_203B2B0->unk1C = gTeamInventory_203B460->teamItems[sub_801A8AC()];
+ sub_8099690(0);
+ UpdateLuminousCaveState(9);
+ break;
+ case 2:
+ sub_801A928();
+ UpdateLuminousCaveState(LUMINOUS_CAVE_GIVE_ITEM_1);
+ break;
+ }
+}
+
+void sub_8025058(void)
+{
+ switch(sub_801A6E8(1))
+ {
+ case 3:
+ if(gUnknown_203B2B0->evoItem1_InvIndex != sub_801A8AC())
+ {
+ gUnknown_203B2B0->evoItem2_InvIndex = sub_801A8AC();
+ gUnknown_203B2B0->unk1C = gTeamInventory_203B460->teamItems[gUnknown_203B2B0->evoItem2_InvIndex];
+ UpdateLuminousCaveState(0xD);
+ }
+ else
+ PlayMenuSoundEffect(2);
+ break;
+ case 4:
+ gUnknown_203B2B0->unk1C = gTeamInventory_203B460->teamItems[sub_801A8AC()];
+ sub_8099690(0);
+ UpdateLuminousCaveState(0xE);
+ break;
+ case 2:
+ sub_801A928();
+ UpdateLuminousCaveState(0xA);
+ break;
+ }
+}
+
+void sub_80250EC(void)
+{
+ s32 menuAction;
+ menuAction = 0;
+ sub_801A6E8(0);
+
+ if(!sub_8012FD8(&gUnknown_203B2B0->unk84))
+ {
+ sub_8013114(&gUnknown_203B2B0->unk84, &menuAction);
+ if(menuAction != 1) gUnknown_203B2B0->unk30 = menuAction;
+ }
+ switch(menuAction)
+ {
+ case 5:
+ sub_801A928();
+ UpdateLuminousCaveState(0xA);
+ break;
+ case 2:
+ sub_8099690(0);
+ UpdateLuminousCaveState(0x9);
+ break;
+ case 1:
+ UpdateLuminousCaveState(0x7);
+ break;
+ }
+}
+
+void sub_802515C(void)
+{
+ s32 menuAction;
+ menuAction = 0;
+ sub_801A6E8(0);
+
+ if(!sub_8012FD8(&gUnknown_203B2B0->unk84))
+ {
+ sub_8013114(&gUnknown_203B2B0->unk84, &menuAction);
+ if(menuAction != 1) gUnknown_203B2B0->unk30 = menuAction;
+ }
+ switch(menuAction)
+ {
+ case 5:
+ sub_801A928();
+ UpdateLuminousCaveState(LUMINOUS_CAVE_LET_US_BEGIN);
+ break;
+ case 2:
+ sub_8099690(0);
+ UpdateLuminousCaveState(0xE);
+ break;
+ case 1:
+ UpdateLuminousCaveState(0xC);
+ break;
+ }
+}
+
+void sub_80251CC(void)
+{
+ switch(sub_801B410())
+ {
+ case 2:
+ case 3:
+ sub_801B450();
+ UpdateLuminousCaveState(0x7);
+ break;
+ case 0:
+ case 1:
+ break;
+ }
+}
+
+void sub_80251E8(void)
+{
+ switch(sub_801B410())
+ {
+ case 2:
+ case 3:
+ sub_801B450();
+ UpdateLuminousCaveState(0xC);
+ break;
+ case 0:
+ case 1:
+ break;
+ }
+}
+
+void sub_8025204(void)
+{
+ switch(sub_8016080())
+ {
+ case 3:
+ sub_80160D8();
+ gUnknown_203B2B0->pokeRenamed = IsPokemonRenamed(gUnknown_203B2B0->pokeStruct);
+ UpdateLuminousCaveState(LUMINOUS_CAVE_SHALL_RETURN);
+ break;
+ default:
+ break;
+ }
+}
+
+void LuminousCave_AdvancetoFallbackState(void)
+{
+ s32 temp;
+ if(sub_80144A4(&temp) == 0)
+ {
+ UpdateLuminousCaveState(gUnknown_203B2B0->fallbackState);
+ }
+}
+
+void sub_8025254(void)
+{
+ if(gUnknown_203B2B0->evoItem1_InvIndex == INVENTORY_SIZE)
+ gUnknown_203B2B0->unk4 = 0;
+ else
+ {
+ gUnknown_203B2B0->unk4 = gTeamInventory_203B460->teamItems[gUnknown_203B2B0->evoItem1_InvIndex].itemIndex;
+ }
+ if(gUnknown_203B2B0->evoItem2_InvIndex == INVENTORY_SIZE)
+ gUnknown_203B2B0->unk5 = 0;
+ else
+ {
+ gUnknown_203B2B0->unk5 = gTeamInventory_203B460->teamItems[gUnknown_203B2B0->evoItem2_InvIndex].itemIndex;
+ }
+
+ gUnknown_203B2B0->unk6 = RandomCapped(0xFF);
+ sub_808F468(gUnknown_203B2B0->pokeStruct, &gUnknown_203B2B0->unk4, 1);
+}
+
+bool8 LuminousCave_HasOnly1Member(void)
+{
+ s32 r3;
+ s32 iVar3; // loop index
+ struct PokemonStruct *preload;
+
+ preload = &gRecruitedPokemonRef->pokemon[0];
+ r3 = 0;
+ for(iVar3 = 0; iVar3 < NUM_SPECIES; iVar3++, preload++)
+ {
+ if((preload->unk0 >> 1) & 1)
+ r3++;
+ }
+
+ if(r3 == 1)
+ return TRUE;
+ else
+ return FALSE;
+}
diff --git a/src/thank_you_wonder_mail.c b/src/thank_you_wonder_mail.c
index 501ab15..74a3ca5 100644
--- a/src/thank_you_wonder_mail.c
+++ b/src/thank_you_wonder_mail.c
@@ -419,7 +419,7 @@ extern void sub_8031E10();
extern void sub_802F2C0();
extern u32 sub_80144A4(s32 *r0);
extern void SetThankYouMailMenuState(u32);
-extern struct PokemonStruct *sub_808D33C(void);
+extern struct PokemonStruct *GetPlayerPokemonStruct(void);
extern void ExpandPlaceholdersBuffer(u8 *buffer, const char *text, ...);
extern void SetMenuItems(void *menu, struct UnkTextStruct2 *, u32, const struct UnkTextStruct2 *, const struct MenuItem *entries, u32, u32, u32);
extern void sub_80922B4(u8 *, u8 *, u32);
@@ -1487,7 +1487,7 @@ void UpdateThankYouMailText(void)
switch(gUnknown_203B2C4->state) {
case 5:
- pokeStruct = sub_808D33C();
+ pokeStruct = GetPlayerPokemonStruct();
sub_80922B4(auStack180,pokeStruct->name, POKEMON_NAME_LENGTH);
ExpandPlaceholdersBuffer(gUnknown_203B2C4->formattedString,gUnknown_80DF250,auStack180);
sub_80141B4(gUnknown_203B2C4->formattedString,0,&gUnknown_203B2C4->faceFile,0x10d);
@@ -1646,7 +1646,7 @@ void UpdateThankYouMailText(void)
sub_8014248(gUnknown_80DF5E4,0,7,gUnknown_80DEE44,0,4,0,&gUnknown_203B2C4->faceFile,0xc);
break;
case THANK_YOU_MAIL_COMMS_CLEANUP:
- pokeStruct2 = sub_808D33C();
+ pokeStruct2 = GetPlayerPokemonStruct();
sub_80922B4(auStack100, pokeStruct2->name, POKEMON_NAME_LENGTH);
ExpandPlaceholdersBuffer(gUnknown_203B2C4->formattedString,gUnknown_80DF63C,auStack100);
sub_80141B4(gUnknown_203B2C4->formattedString,0,&gUnknown_203B2C4->faceFile,0x10d);
diff --git a/src/wonder_mail_3_mid.c b/src/wonder_mail_3_mid.c
index f485246..9c54575 100644
--- a/src/wonder_mail_3_mid.c
+++ b/src/wonder_mail_3_mid.c
@@ -136,7 +136,7 @@ extern void sub_8013114(u32 *, s32 *);
extern u32 sub_802DEE0(void);
extern void sub_802DF24(void);
extern void sub_808DA34(u8 *buffer, struct PokemonStruct *pokemon);
-extern struct PokemonStruct *sub_808D33C(void);
+extern struct PokemonStruct *GetPlayerPokemonStruct(void);
extern void sub_802F6FC(void);
extern void sub_802F718(void);
extern u8 sub_80138B8(u32 *, u32);
@@ -368,7 +368,7 @@ u32 sub_802F204(struct unkStruct_802F204 *r0, u8 r1)
// NOTE: dumb var to get correct ordering
preload = gUnknown_203B310;
strcpy(gUnknown_202E5D8, preload->unk10->clientName);
- sub_808DA34(gAvailablePokemonNames, sub_808D33C());
+ sub_808DA34(gAvailablePokemonNames, GetPlayerPokemonStruct());
gUnknown_203B310->faceFile = GetDialogueSpriteDataPtr(gUnknown_203B310->unk10->unk14);
gUnknown_203B310->faceData = NULL;