summaryrefslogtreecommitdiff
path: root/src/luminous_cave.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/luminous_cave.c')
-rw-r--r--src/luminous_cave.c850
1 files changed, 850 insertions, 0 deletions
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;
+}