summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/code_2.c11
-rw-r--r--src/code_80521D0_1.c2
-rw-r--r--src/code_8057824_1.c8
-rw-r--r--src/code_80848F0.c421
-rw-r--r--src/main_menu.c497
-rw-r--r--src/main_menu_1.c216
-rw-r--r--src/memory_mid.c6
-rw-r--r--src/personality_test.c6
-rw-r--r--src/thank_you_wonder_mail.c26
-rw-r--r--src/wonder_mail.c649
-rw-r--r--src/wonder_mail_2.c38
-rw-r--r--src/wonder_mail_3.c192
-rw-r--r--src/wonder_mail_3_mid.c772
-rw-r--r--src/wonder_mail_4.c137
-rw-r--r--src/wonder_mail_pre.c305
15 files changed, 2669 insertions, 617 deletions
diff --git a/src/code_2.c b/src/code_2.c
index 9ed43f9..c26b20b 100644
--- a/src/code_2.c
+++ b/src/code_2.c
@@ -6,6 +6,7 @@
#include "friend_area.h"
#include "input.h"
#include "memory.h"
+#include "main_menu.h"
#include "music.h"
#include "play_time.h"
#include "save.h"
@@ -41,12 +42,6 @@ extern void sub_800CDA8(u32);
extern void LoadTitleScreen(void);
extern void SetBGPaletteBufferColorRGB(s32, u8 *, s32, u8 *);
extern void sub_80095CC(u32, u32);
-extern void InitMainMenu(void);
-extern bool8 sub_80363E0(void);
-extern void SetUpMenu(void);
-extern u32 UpdateMenu(void);
-extern void CleanUpMenu(void);
-extern void DeleteMainMenu(void);
extern s32 sub_80953D4(u32);
extern void sub_8095240(u8);
extern void nullsub_33(void);
@@ -168,7 +163,7 @@ void GameLoop(void)
CleanUpMenu();
if (nextMenu == 2) break;
if (nextMenu == 4) break;
- if (nextMenu == 3) break;
+ if (nextMenu == MENU_NEW_GAME) break;
}
DeleteMainMenu();
while (gUnknown_2000A80 > 0) {
@@ -193,7 +188,7 @@ void GameLoop(void)
case 4:
tmp3 = sub_80009D0(3);
break;
- case 3:
+ case MENU_NEW_GAME:
sub_80122A8();
nullsub_33();
tmp3 = sub_80009D0(0);
diff --git a/src/code_80521D0_1.c b/src/code_80521D0_1.c
index ecb0ec1..fa1c79e 100644
--- a/src/code_80521D0_1.c
+++ b/src/code_80521D0_1.c
@@ -659,7 +659,7 @@ void sub_808C5C0(void)
}
// Dummy Celebi Fight Dialogue??
-void nullsub_100(void)
+void nullsub_100(u32 r0, u32 r1, u32 r2)
{
}
diff --git a/src/code_8057824_1.c b/src/code_8057824_1.c
index d88918f..ec518d7 100644
--- a/src/code_8057824_1.c
+++ b/src/code_8057824_1.c
@@ -259,7 +259,7 @@ extern struct DungeonEntity *sub_8083600();
extern void sub_80421C0(struct DungeonEntity *, u32);
extern void sub_8046D20();
extern void sub_808B1CC(u8);
-extern void sub_80464C8(struct DungeonEntity *, u32, struct ItemSlot *);
+extern void sub_80464C8(struct DungeonEntity *, u32 *, struct ItemSlot *);
extern void sub_8098044(u32);
extern void PlaySoundEffect(u32);
extern void sub_8085C54(u32, u32, u32, u32, u32);
@@ -3092,7 +3092,7 @@ void sub_808ADCC(void)
}
}
-void sub_808AE54(char param_1,char param_2,u32 param_3)
+void sub_808AE54(char param_1,char param_2,u32 *param_3)
{
struct DungeonEntity * uVar3;
u8 auStack24 [4];
@@ -3115,7 +3115,7 @@ void sub_808AE54(char param_1,char param_2,u32 param_3)
}
-void sub_808AEC8(char param_1,char param_2,u32 param_3)
+void sub_808AEC8(char param_1,char param_2,u32 *param_3)
{
struct DungeonEntity * uVar3;
u8 auStack24 [4];
@@ -3137,7 +3137,7 @@ void sub_808AEC8(char param_1,char param_2,u32 param_3)
}
}
-void sub_808AF3C(char param_1,char param_2,u32 param_3)
+void sub_808AF3C(char param_1,char param_2,u32 *param_3)
{
struct DungeonEntity * uVar3;
u8 auStack24 [4];
diff --git a/src/code_80848F0.c b/src/code_80848F0.c
new file mode 100644
index 0000000..f82c4af
--- /dev/null
+++ b/src/code_80848F0.c
@@ -0,0 +1,421 @@
+#include "global.h"
+#include "dungeon_global_data.h"
+
+extern struct DungeonGlobalData *gDungeonGlobalData;
+
+extern void SkarmonyPreFightDialogue();
+extern void SkarmonyReFightDialogue();
+extern void sub_8086E40();
+extern void TeamMeaniePreFightDialogue();
+extern void TeamMeanieReFightDialogue();
+extern void sub_8087130();
+extern void ZapdosPreFightDialogue();
+extern void ZapdosReFightDialogue();
+extern void ZapdosPostStoryPreFightDialogue();
+extern void MoltresPreFightDialogue();
+extern void MoltresReFightDialogue();
+extern void MoltresPostStoryPreFightDialogue();
+extern void ArticunoPreFightDialogue();
+extern void ArticunoReFightDialogue();
+extern void ArticunoPostStoryPreFightDialogue();
+extern void sub_8088608();
+extern void sub_8088618();
+extern void GroudonPreFightDialogue();
+extern void GroudonReFightDialogue();
+extern void GroudonPostStoryPreFightDialogue();
+extern void MagmaCavernMidDialogue();
+extern void sub_8089168();
+extern void RayquazaPreFightDialogue();
+extern void RayquazaReFightDialogue();
+extern void RayquazaPostStoryPreFightDialogue();
+extern void sub_80897F0();
+extern void sub_8089878();
+extern void sub_80898E4();
+extern void MewtwoPreFightDialogue();
+extern void MewtwoPreFightDialogue1();
+extern void EnteiPreFightDialogue();
+extern void EnteiPreFightDialogue1();
+extern void EnteiPreFightDialogue2();
+extern void RaikouPreFightDialogue();
+extern void RaikouPreFightDialogue1();
+extern void RaikouPreFightDialogue2();
+extern void SuicunePreFightDialogue();
+extern void SuicunePreFightDialogue1();
+extern void SuicunePreFightDialogue2();
+extern void HoOhPreFightDialogue();
+extern void HoOhPreFightDialogue1();
+extern void LatiosPreFightDialogue();
+extern void LatiosReFightDialogue();
+extern void sub_808AC3C();
+extern void RegirockPreFightDialogue();
+extern void RegicePreFightDialogue();
+extern void RegisteelPreFightDialogue();
+extern void JirachiPreFightDialogue();
+extern void JirachiPreFightDialogue1();
+extern void LugiaPreFightDialogue();
+extern void KyogrePreFightDialogue();
+extern void DeoxysPreFightDialogue();
+extern void CelebiJoinDialogue();
+extern void sub_808C998();
+extern void MedichamRescueDialogue();
+extern void DummyFightDialogue();
+extern void SmeargleRescueDialogue();
+extern void sub_808CD9C();
+extern void sub_8085764();
+extern void sub_80857B8();
+extern void sub_8097FF8();
+
+extern void sub_8086BDC(u32,u8);
+extern void sub_8086F54(u32,u8);
+extern void sub_8087334(u32,u8);
+extern void sub_80878F4(u32,u8);
+extern void sub_8088088(u32,u8);
+extern void sub_8088818(u32,u8);
+extern void sub_80893B4(u32,u8);
+extern void sub_8089788(struct DungeonEntity *,u32,u8);
+extern void sub_8089A00(u32,u8);
+extern void sub_8089CFC(u32,u8);
+extern void sub_8089FF0(u32,u8);
+extern void sub_808A36C(u32,u8);
+extern void sub_808A6E8(u32,u8);
+extern void sub_808AAF0(u32,u8);
+extern void sub_808AE54(u32,u8,s16 *);
+extern void sub_808AEC8(u32,u8,s16 *);
+extern void sub_808AF3C(u32,u8,s16 *);
+extern void sub_808B3E4(u32,u8,u8);
+extern void sub_808BE70(u32,u8,u8);
+extern void sub_808C1A4(u32,u8,u8);
+extern void sub_808C414(u32,u8,u8);
+extern void nullsub_100(u32,u8,u8);
+extern void sub_808C948(struct DungeonEntity *,u8);
+extern void sub_8083E88(u32);
+
+extern void sub_808AFB0(u8);
+extern void sub_808B030(u8);
+extern void sub_808B0B0(u8);
+
+
+void DisplayPreFightDialogue(void)
+{
+
+ switch(gDungeonGlobalData->unk3A0D) {
+ case 0:
+ break;
+ case 1:
+ SkarmonyPreFightDialogue();
+ break;
+ case 2:
+ SkarmonyReFightDialogue();
+ break;
+ case 3:
+ sub_8086E40();
+ break;
+ case 4:
+ TeamMeaniePreFightDialogue();
+ break;
+ case 5:
+ TeamMeanieReFightDialogue();
+ break;
+ case 6:
+ sub_8087130();
+ break;
+ case 7:
+ ZapdosPreFightDialogue();
+ break;
+ case 8:
+ ZapdosReFightDialogue();
+ break;
+ case 9:
+ ZapdosPostStoryPreFightDialogue();
+ break;
+ case 10:
+ MoltresPreFightDialogue();
+ break;
+ case 0xb:
+ MoltresReFightDialogue();
+ break;
+ case 0xc:
+ MoltresPostStoryPreFightDialogue();
+ break;
+ case 0xd:
+ ArticunoPreFightDialogue();
+ break;
+ case 0xe:
+ ArticunoReFightDialogue();
+ break;
+ case 0xf:
+ ArticunoPostStoryPreFightDialogue();
+ break;
+ case 0x10:
+ sub_8088608();
+ break;
+ case 0x11:
+ sub_8088618();
+ break;
+ case 0x12:
+ GroudonPreFightDialogue();
+ break;
+ case 0x13:
+ GroudonReFightDialogue();
+ break;
+ case 0x14:
+ GroudonPostStoryPreFightDialogue();
+ break;
+ case 0x15:
+ MagmaCavernMidDialogue();
+ break;
+ case 0x16:
+ sub_8089168();
+ break;
+ case 0x17:
+ RayquazaPreFightDialogue();
+ break;
+ case 0x18:
+ RayquazaReFightDialogue();
+ break;
+ case 0x19:
+ RayquazaPostStoryPreFightDialogue();
+ break;
+ case 0x1a:
+ sub_80897F0();
+ break;
+ case 0x1b:
+ sub_8089878();
+ break;
+ case 0x1c:
+ sub_80898E4();
+ break;
+ case 0x1d:
+ case 0x1e:
+ MewtwoPreFightDialogue();
+ break;
+ case 0x1f:
+ MewtwoPreFightDialogue1();
+ break;
+ case 0x20:
+ EnteiPreFightDialogue();
+ break;
+ case 0x21:
+ EnteiPreFightDialogue1();
+ break;
+ case 0x22:
+ EnteiPreFightDialogue2();
+ break;
+ case 0x23:
+ RaikouPreFightDialogue();
+ break;
+ case 0x24:
+ RaikouPreFightDialogue1();
+ break;
+ case 0x25:
+ RaikouPreFightDialogue2();
+ break;
+ case 0x26:
+ SuicunePreFightDialogue();
+ break;
+ case 0x27:
+ SuicunePreFightDialogue1();
+ break;
+ case 0x28:
+ SuicunePreFightDialogue2();
+ break;
+ case 0x29:
+ HoOhPreFightDialogue();
+ break;
+ case 0x2a:
+ HoOhPreFightDialogue1();
+ break;
+ case 0x2b:
+ LatiosPreFightDialogue();
+ break;
+ case 0x2c:
+ LatiosReFightDialogue();
+ break;
+ case 0x2d:
+ sub_808AC3C();
+ break;
+ case 0x2e:
+ RegirockPreFightDialogue();
+ break;
+ case 0x2f:
+ RegicePreFightDialogue();
+ break;
+ case 0x30:
+ RegisteelPreFightDialogue();
+ break;
+ case 0x31:
+ JirachiPreFightDialogue();
+ break;
+ case 0x32:
+ JirachiPreFightDialogue1();
+ break;
+ case 0x33:
+ LugiaPreFightDialogue();
+ break;
+ case 0x34:
+ KyogrePreFightDialogue();
+ break;
+ case 0x35:
+ DeoxysPreFightDialogue();
+ break;
+ case 0x36:
+ CelebiJoinDialogue();
+ break;
+ case 0x37:
+ sub_808C998();
+ break;
+ case 0x38:
+ MedichamRescueDialogue();
+ break;
+ case 0x39:
+ DummyFightDialogue();
+ break;
+ case 0x3a:
+ SmeargleRescueDialogue();
+ break;
+ case 0x3b:
+ sub_808CD9C();
+ break;
+ case 0x3C:
+ break;
+ }
+ sub_8085764();
+ sub_80857B8();
+ gDungeonGlobalData->unk1356C = 0;
+ sub_8097FF8();
+}
+
+void sub_8084E00(struct DungeonEntity *param_1,char param_2,char param_3)
+{
+
+ if (param_2 != '\0') {
+ switch(gDungeonGlobalData->unk3A0D) {
+ case 0:
+ break;
+ case 1:
+ case 2:
+ sub_8086BDC(param_2,gDungeonGlobalData->unk3A0D);
+ break;
+ case 4:
+ case 5:
+ sub_8086F54(param_2,gDungeonGlobalData->unk3A0D);
+ break;
+ case 7:
+ case 8:
+ case 9:
+ sub_8087334(param_2,gDungeonGlobalData->unk3A0D);
+ break;
+ case 10:
+ case 0xb:
+ case 0xc:
+ sub_80878F4(param_2,gDungeonGlobalData->unk3A0D);
+ break;
+ case 0xd:
+ case 0xe:
+ case 0xf:
+ sub_8088088(param_2,gDungeonGlobalData->unk3A0D);
+ break;
+ case 0x12:
+ case 0x13:
+ case 0x14:
+ sub_8088818(param_2,gDungeonGlobalData->unk3A0D);
+ break;
+ case 0x17:
+ case 0x18:
+ case 0x19:
+ sub_80893B4(param_2,gDungeonGlobalData->unk3A0D);
+ break;
+ case 0x1a:
+ case 0x1b:
+ sub_8089788(param_1,param_2,gDungeonGlobalData->unk3A0D);
+ break;
+ case 0x1d:
+ case 0x1e:
+ case 0x1f:
+ sub_8089A00(param_2,gDungeonGlobalData->unk3A0D);
+ break;
+ case 0x20:
+ case 0x21:
+ case 0x22:
+ sub_8089CFC(param_2,gDungeonGlobalData->unk3A0D);
+ break;
+ case 0x23:
+ case 0x24:
+ case 0x25:
+ sub_8089FF0(param_2,gDungeonGlobalData->unk3A0D);
+ break;
+ case 0x26:
+ case 0x27:
+ case 0x28:
+ sub_808A36C(param_2,gDungeonGlobalData->unk3A0D);
+ break;
+ case 0x29:
+ case 0x2a:
+ sub_808A6E8(param_2,gDungeonGlobalData->unk3A0D);
+ break;
+ case 0x2b:
+ case 0x2c:
+ case 0x2d:
+ sub_808AAF0(param_2,gDungeonGlobalData->unk3A0D);
+ break;
+ case 0x2e:
+ sub_808AE54(param_2,gDungeonGlobalData->unk3A0D,&param_1->posWorldX);
+ break;
+ case 0x2f:
+ sub_808AEC8(param_2,gDungeonGlobalData->unk3A0D,&param_1->posWorldX);
+ break;
+ case 0x30:
+ sub_808AF3C(param_2,gDungeonGlobalData->unk3A0D,&param_1->posWorldX);
+ break;
+ case 0x31:
+ case 0x32:
+ sub_808B3E4(param_2,gDungeonGlobalData->unk3A0D,param_3);
+ break;
+ case 0x33:
+ sub_808BE70(param_2,gDungeonGlobalData->unk3A0D,param_3);
+ break;
+ case 0x34:
+ sub_808C1A4(param_2,gDungeonGlobalData->unk3A0D,param_3);
+ break;
+ case 0x35:
+ sub_808C414(param_2,gDungeonGlobalData->unk3A0D,param_3);
+ break;
+ case 0x36:
+ nullsub_100(param_2,gDungeonGlobalData->unk3A0D,param_3);
+ break;
+ case 0x37:
+ sub_808C948(param_1,gDungeonGlobalData->unk3A0D);
+ break;
+ case 0x38:
+ case 0x39:
+ case 0x3A:
+ case 0x3B:
+ case 0x3C:
+ break;
+ }
+ if ((param_3 == '\0') && (gDungeonGlobalData->unk2 != '\0')) {
+ sub_8083E88(999);
+ }
+ }
+}
+
+void sub_8085140(void)
+{
+ switch(gDungeonGlobalData->unk3A0D) {
+ // NOTE: shortcut way to generate all cases from 0 - 0x3C properly
+ default:
+ case 0:
+ case 1:
+ case 0x3C:
+ break;
+ case 0x2e:
+ sub_808AFB0(gDungeonGlobalData->unk3A0D);
+ break;
+ case 0x2f:
+ sub_808B030(gDungeonGlobalData->unk3A0D);
+ break;
+ case 0x30:
+ sub_808B0B0(gDungeonGlobalData->unk3A0D);
+ break;
+ }
+}
diff --git a/src/main_menu.c b/src/main_menu.c
index cf0524a..37cd217 100644
--- a/src/main_menu.c
+++ b/src/main_menu.c
@@ -22,9 +22,6 @@
// Deletes the Save
-extern struct MainMenu *gMainMenu;
-void sub_8035DA0(void);
-
extern void sub_8094C14(void);
extern void sub_8099690(u32);
extern void sub_8036FDC(s32);
@@ -35,7 +32,7 @@ extern void CreateWonderMailMenu(void);
extern void CreateLoadScreen(u32);
extern void CreateRescuePasswordMenu(u32);
extern void CreateSaveMenu(u32);
-extern s32 UpdateMainMenu(void);
+extern u32 UpdateMainMenu(void);
extern s32 UpdateLoadScreenMenu(void);
extern s32 UpdateFriendRescueMenu(void);
extern s32 UpdateWonderMailMenu(void);
@@ -53,38 +50,261 @@ extern void CleanWirelessCommsMenu(void);
extern void CleanRescuePasswordMenu(void);
extern void sub_80383A8(void);
extern void CleanSaveMenu(void);
+extern u8 sub_8012FD8(u32 *);
+extern void sub_8013114(u32 *, s32 *);
+extern u8 sub_803D0D8();
+extern s32 sub_8011C34();
+extern s32 sub_8095324(u32);
void CleanMainMenu(void);
void DrawMainMenu(void);
s32 sub_8035DB4(u32);
-
-struct unkSubStruct
-{
- u32 unk0;
- u32 unk4;
-};
+void sub_803623C(void);
+bool8 SetMainMenuText();
+void SetMainMenuItems();
+void sub_8035DA0(void);
struct unkStruct_203B34C
{
// size: 0x1A8
u32 unk0;
u32 unk4;
- struct unkSubStruct *unk8; // Array of menu choices??
+ struct MenuItem *unk8; // Array of menu choices??
u8 fillC[0x30 - 0xC];
s16 menuIndex;
- u8 fill32[0x144 - 0x32];
+ u8 fill32[0x54 - 0x32];
+
+ u32 unk54;
+ u8 fill58[0xA4 - 0x58];
+
+ u32 unkA4;
+ u32 unkA8;
+ u8 fillAC[0x144 - 0xAC];
struct UnkTextStruct2 unk144[4];
/* 0x1A4 */ u32 currMenuChoice;
};
-extern struct unkStruct_203B34C *gUnknown_203B34C;
+EWRAM_DATA struct MainMenu *gMainMenu;
+EWRAM_DATA struct unkStruct_203B34C *gUnknown_203B34C;
+EWRAM_DATA u32 gUnknown_203B350;
+EWRAM_DATA u32 gUnknown_203B354; // unused everywhere else except here..
+
+
+extern const char NewGame_80E5A20[];
+extern const char AdventureLog_80E5A10[];
+extern const char WonderMail_80E5A54[];
+extern const char Continue_80E5AF0[];
+extern const char DeleteSaveData_80E5ADC[];
+extern const char FriendRescue_80E5ACC[];
+extern const char TradeItems_80E5AC0[];
+extern const char ReviveTeam_80E5C0C[];
+extern const char SendItems_80E5C90[];
+extern const char ReceiveItems_80E5C80[];
+extern const char AwaitingRescue_80E5B7C[];
+
+const struct UnkTextStruct2 gUnknown_80E59A8 = {
+ 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00,
+ 0x00, 0x00,
+ NULL
+};
+
+const char main_menu_fill[] = "pksdir0";
+
+const struct UnkTextStruct2 gUnknown_80E59C8 = {
+ 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00,
+ 0x00, 0x00,
+ NULL
+};
+
+const struct UnkTextStruct2 gUnknown_80E59E0 = {
+ 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x02, 0x00,
+ 0x0A, 0x03,
+ 0x03, 0x00,
+ NULL
+};
+
+const struct MenuItem gUnknown_80E59F8[] =
+{
+ {NewGame_80E5A20, MENU_NEW_GAME},
+ {AdventureLog_80E5A10, MENU_ADVENTURE_LOG},
+ {NULL, 0xffdd},
+};
+
+const char AdventureLog_80E5A10[] = "Adventure Log";
+const char NewGame_80E5A20[] = "New Game";
+
+const struct UnkTextStruct2 gUnknown_80E5A29 = {
+ 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x02, 0x00,
+ 0x0A, 0x02,
+ 0x02, 0x00,
+ NULL
+};
+
+const struct MenuItem gUnknown_80E5A44[] =
+{
+ {WonderMail_80E5A54, MENU_WONDER_MAIL},
+ {NULL, 0xffdd},
+};
+
+const char WonderMail_80E5A54[] = "Wonder Mail";
+
+const struct UnkTextStruct2 gUnknown_80E5A60 = {
+ 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x02, 0x00,
+ 0x0A, 0x08,
+ 0x08, 0x00,
+ NULL
+};
+
+const struct UnkTextStruct2 gUnknown_80E5A78 = {
+ 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x02, 0x00,
+ 0x0B, 0x09,
+ 0x09, 0x00,
+ NULL
+};
+
+const struct MenuItem gUnknown_80E5A90[] =
+{
+ {Continue_80E5AF0, MENU_CONTINUE},
+ {DeleteSaveData_80E5ADC, MENU_DELETE_SAVE_PROMPT},
+ {AdventureLog_80E5A10, MENU_ADVENTURE_LOG},
+ {FriendRescue_80E5ACC, MENU_FRIEND_RESCUE},
+ {TradeItems_80E5AC0, MENU_TRADE_ITEMS},
+ {NULL, 0xffdd},
+};
+
+const char TradeItems_80E5AC0[] = "Trade Items";
+const char FriendRescue_80E5ACC[] = "Friend Rescue";
+const char DeleteSaveData_80E5ADC[] = "Delete Save Data";
+const char Continue_80E5AF0[] = "Continue";
+
+
+const struct MenuItem gUnknown_80E5AFC[] =
+{
+ {Continue_80E5AF0, MENU_CONTINUE},
+ {DeleteSaveData_80E5ADC, MENU_DELETE_SAVE_PROMPT},
+ {AdventureLog_80E5A10, MENU_ADVENTURE_LOG},
+ {FriendRescue_80E5ACC, MENU_FRIEND_RESCUE},
+ {TradeItems_80E5AC0, MENU_TRADE_ITEMS},
+ {WonderMail_80E5A54, MENU_WONDER_MAIL},
+ {NULL, 0xffdd},
+};
+
+const struct UnkTextStruct2 gUnknown_80E5B34 = {
+ 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x02, 0x00,
+ 0x0A, 0x08,
+ 0x08, 0x00,
+ NULL
+};
+
+const struct MenuItem gUnknown_80E5B4C[] =
+{
+ {AwaitingRescue_80E5B7C, MENU_AWAITING_RESCUE},
+ {DeleteSaveData_80E5ADC, MENU_DELETE_SAVE_PROMPT},
+ {AdventureLog_80E5A10, MENU_ADVENTURE_LOG},
+ {FriendRescue_80E5ACC, MENU_FRIEND_RESCUE},
+ {TradeItems_80E5AC0, MENU_TRADE_ITEMS},
+ {NULL, 0xffdd},
+};
+const char AwaitingRescue_80E5B7C[] = "Awaiting Rescue";
+
+const struct MenuItem gUnknown_80E5B8C[] =
+{
+ {AwaitingRescue_80E5B7C, MENU_AWAITING_RESCUE},
+ {DeleteSaveData_80E5ADC, MENU_DELETE_SAVE_PROMPT},
+ {AdventureLog_80E5A10, MENU_ADVENTURE_LOG},
+ {FriendRescue_80E5ACC, MENU_FRIEND_RESCUE},
+ {TradeItems_80E5AC0, MENU_TRADE_ITEMS},
+ {WonderMail_80E5A54, MENU_WONDER_MAIL},
+ {NULL, 0xffdd},
+};
+
+const struct UnkTextStruct2 gUnknown_80E5BC4 = {
+ 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x02, 0x00,
+ 0x0A, 0x08,
+ 0x08, 0x00,
+ NULL
+};
+
+const struct MenuItem gUnknown_80E5BDC[] =
+{
+ {ReviveTeam_80E5C0C, MENU_CONTINUE},
+ {DeleteSaveData_80E5ADC, MENU_DELETE_SAVE_PROMPT},
+ {AdventureLog_80E5A10, MENU_ADVENTURE_LOG},
+ {FriendRescue_80E5ACC, MENU_FRIEND_RESCUE},
+ {TradeItems_80E5AC0, MENU_TRADE_ITEMS},
+ {NULL, 0xffdd},
+};
+const char ReviveTeam_80E5C0C[] = "Revive Team";
+
+const struct MenuItem gUnknown_80E5C18[] =
+{
+ {ReviveTeam_80E5C0C, MENU_CONTINUE},
+ {DeleteSaveData_80E5ADC, MENU_DELETE_SAVE_PROMPT},
+ {AdventureLog_80E5A10, MENU_ADVENTURE_LOG},
+ {FriendRescue_80E5ACC, MENU_FRIEND_RESCUE},
+ {TradeItems_80E5AC0, MENU_TRADE_ITEMS},
+ {WonderMail_80E5A54, MENU_WONDER_MAIL},
+ {NULL, 0xffdd},
+};
+
+const struct UnkTextStruct2 gUnknown_80E5C50 = {
+ 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x02, 0x00,
+ 0x0A, 0x03,
+ 0x03, 0x00,
+ NULL
+};
+
+const struct MenuItem gUnknown_80E5C68[] =
+{
+ {SendItems_80E5C90, MENU_SEND_ITEMS},
+ {ReceiveItems_80E5C80, MENU_RECEIVE_ITEMS},
+ {NULL, 0xffdd},
+};
+
+const char ReceiveItems_80E5C80[] = "Receive Items";
+const char SendItems_80E5C90[] = "Send Items";
+
+const struct MenuItem gUnknown_80E5C9C[] =
+{
+ {SendItems_80E5C90, -1},
+ {ReceiveItems_80E5C80, MENU_RECEIVE_ITEMS},
+ {NULL, 0xffdd},
+};
+
+extern const struct UnkTextStruct2 gUnknown_80E5CB4;
+extern const struct MenuItem gUnknown_80E5CCC[];
+extern const struct MenuItem gUnknown_80E5D0C[];
+extern const struct MenuItem gUnknown_80E5D48[];
+extern const struct MenuItem gUnknown_80E5DA0[];
+extern const struct MenuItem gUnknown_80E5DF0[];
+extern const struct MenuItem gUnknown_80E5E5C[];
+extern const struct MenuItem gUnknown_80E5EBC[];
+extern const struct MenuItem gUnknown_80E5F1C[];
+extern const struct MenuItem gUnknown_80E5F80[];
+extern const struct MenuItem gUnknown_80E5FCC[];
+extern const struct MenuItem gUnknown_80E6030[];
-extern struct MainMenu *gMainMenu;
-extern struct UnkTextStruct2 gUnknown_80E59A8;
-extern struct UnkTextStruct2 gUnknown_80E59C8;
-extern bool8 SetMainMenuText();
-extern void SetMainMenuItems();
struct unkStruct_Menu
{
@@ -396,6 +616,7 @@ void sub_8035D1C(void)
gMainMenu->unk38 = -1;
}
+// Unused
void sub_8035D30(s32 r0)
{
gMainMenu->unk38 = r0;
@@ -411,11 +632,13 @@ struct MainMenu *GetMainMenu(void)
return gMainMenu;
}
+// Unused
void sub_8035D58(void)
{
gMainMenu->unk3C = -1;
}
+// Unused
void sub_8035D68(s32 r0)
{
gMainMenu->unk3C = r0;
@@ -528,3 +751,241 @@ void CleanMainMenu(void)
}
}
+u32 UpdateMainMenu(void)
+{
+ u32 nextMenu = MENU_NO_SCREEN_CHANGE;
+ switch(gUnknown_203B34C->unk0)
+ {
+ case 1:
+ sub_8012FD8(&gUnknown_203B34C->unkA4);
+ if(!sub_8012FD8(&gUnknown_203B34C->unk4))
+ sub_8013114(&gUnknown_203B34C->unk4, &nextMenu);
+
+ if(SetMainMenuText())
+ {
+ sub_8035CF4(&gUnknown_203B34C->unk4, 0, 1);
+ sub_8035CF4(&gUnknown_203B34C->unk4, 2, 0);
+ }
+ switch(nextMenu)
+ {
+ case MENU_NO_SCREEN_CHANGE:
+ nextMenu = MENU_NO_SCREEN_CHANGE;
+ break;
+ case 0xffdd:
+ gUnknown_203B34C->unk0 = 1;
+ nextMenu = MENU_NO_SCREEN_CHANGE;
+ ResetUnusedInputStruct();
+ sub_8035CF4(&gUnknown_203B34C->unk4, 0, 1);
+ sub_8035CF4(&gUnknown_203B34C->unk4, 2, 0);
+ break;
+ case MENU_TRADE_ITEMS:
+ sub_8035DA0();
+ gUnknown_203B350 = nextMenu;
+ break;
+ case MENU_NEW_GAME:
+ case MENU_AWAITING_RESCUE:
+ case MENU_CONTINUE:
+ case MENU_DELETE_SAVE_PROMPT:
+ case MENU_DELETE_SAVE_CONFIRM:
+ case MENU_ADVENTURE_LOG:
+ case MENU_FRIEND_RESCUE:
+ case MENU_WONDER_MAIL:
+ case MENU_DUAL_SLOT:
+ case MENU_WIRELESS_COMMS:
+ case MENU_DEBUG:
+ gUnknown_203B350 = nextMenu;
+ break;
+
+ }
+ break;
+ case 0xC:
+ if(!sub_8012FD8(&gUnknown_203B34C->unk54))
+ sub_8013114(&gUnknown_203B34C->unk54, &nextMenu);
+ switch(nextMenu)
+ {
+ case 0xffdd:
+ sub_803623C();
+ gUnknown_203B34C->unk0 = 1;
+ nextMenu = MENU_NO_SCREEN_CHANGE;
+ break;
+ case MENU_SEND_ITEMS:
+ gUnknown_203B354 = nextMenu;
+ nextMenu = MENU_TRADE_ITEMS;
+ break;
+ case MENU_RECEIVE_ITEMS:
+ gUnknown_203B354 = nextMenu;
+ nextMenu = MENU_COMMUNICATION_2;
+ break;
+ case MENU_NO_SCREEN_CHANGE:
+ nextMenu = MENU_NO_SCREEN_CHANGE;
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ case 0xD: // forces the bls switch
+ break;
+ }
+ return nextMenu;
+}
+
+bool8 SetMainMenuText(void)
+{
+ u32 menuChoice;
+ struct MenuItem *preload;
+
+ // Have to load the pointer before the index
+ preload = gUnknown_203B34C->unk8;
+ menuChoice = preload[gUnknown_203B34C->menuIndex].menuAction; // chosen menu action?
+ if (gUnknown_203B34C->currMenuChoice == menuChoice) {
+ return FALSE;
+ }
+
+ gUnknown_203B34C->currMenuChoice = menuChoice;
+ sub_8035CC0(gUnknown_203B34C->unk144,2);
+ sub_8035CC0(gUnknown_203B34C->unk144,3);
+ switch(menuChoice) {
+ case MENU_WIRELESS_COMMS:
+ // Using wireless communications, you can go on an adventure to unknown worlds.
+ SetMenuItems((struct unkStruct_Menu *)&gUnknown_203B34C->unk4,gUnknown_203B34C->unk144,2,&gUnknown_80E5CB4,gUnknown_80E6030,0,0,0);
+ break;
+ case MENU_WONDER_MAIL:
+ // Using passwords, you can receive Wonder Mail
+ SetMenuItems((struct unkStruct_Menu *)&gUnknown_203B34C->unk4,gUnknown_203B34C->unk144,2,&gUnknown_80E5CB4,gUnknown_80E5F80,0,0,0);
+ break;
+ case MENU_AWAITING_RESCUE:
+ // You are awaiting resuce by a friend
+ // You can give up waiting for rescue
+ SetMenuItems((struct unkStruct_Menu *)&gUnknown_203B34C->unk4,gUnknown_203B34C->unk144,2,&gUnknown_80E5CB4,gUnknown_80E5F1C,0,0,0);
+ break;
+ case MENU_NEW_GAME:
+ // Start an entirely new adventure
+ SetMenuItems((struct unkStruct_Menu *)&gUnknown_203B34C->unk4,gUnknown_203B34C->unk144,2,&gUnknown_80E5CB4,gUnknown_80E5CCC,0,0,0);
+ break;
+ case MENU_CONTINUE:
+ // Resume your adventure from where you last saved
+ SetMenuItems((struct unkStruct_Menu *)&gUnknown_203B34C->unk4,gUnknown_203B34C->unk144,2,&gUnknown_80E5CB4,gUnknown_80E5DA0,0,0,0);
+ break;
+ case MENU_DELETE_SAVE_PROMPT:
+ // This will delete your saved game data.
+ // Beware! This will delete it forever
+ SetMenuItems((struct unkStruct_Menu *)&gUnknown_203B34C->unk4,gUnknown_203B34C->unk144,2,&gUnknown_80E5CB4,gUnknown_80E5DF0,0,0,0);
+ break;
+ case MENU_ADVENTURE_LOG:
+ // Check your career as an adventurer
+ SetMenuItems((struct unkStruct_Menu *)&gUnknown_203B34C->unk4,gUnknown_203B34C->unk144,2,&gUnknown_80E5CB4,gUnknown_80E5D0C,0,0,0);
+ break;
+ case MENU_FRIEND_RESCUE:
+ // Using a Game Link cable or passwords, friends may rescue each other
+ SetMenuItems((struct unkStruct_Menu *)&gUnknown_203B34C->unk4,gUnknown_203B34C->unk144,2,&gUnknown_80E5CB4,gUnknown_80E5E5C,0,0,0);
+ break;
+ case MENU_TRADE_ITEMS:
+ // Using a Game Link cable you can trade stored items with a friend
+ SetMenuItems((struct unkStruct_Menu *)&gUnknown_203B34C->unk4,gUnknown_203B34C->unk144,2,&gUnknown_80E5CB4,gUnknown_80E5EBC,0,0,0);
+ break;
+ case MENU_DUAL_SLOT:
+ // Using Dual Slot function, you can receive teams from your friends
+ SetMenuItems((struct unkStruct_Menu *)&gUnknown_203B34C->unk4,gUnknown_203B34C->unk144,2,&gUnknown_80E5CB4,gUnknown_80E5FCC,0,0,0);
+ break;
+ case MENU_DEBUG:
+ // This is the Debug Mode.
+ // It won't be in the release version
+ SetMenuItems((struct unkStruct_Menu *)&gUnknown_203B34C->unk4,gUnknown_203B34C->unk144,2,&gUnknown_80E5CB4,gUnknown_80E5D48,0,0,0);
+ break;
+ default:
+ break;
+ }
+ return TRUE;
+}
+
+void sub_803623C(void)
+{
+ sub_8035CC0(gUnknown_203B34C->unk144,1);
+ SetMainMenuItems();
+ gUnknown_203B34C->currMenuChoice = -1;
+ if (SetMainMenuText()) {
+ sub_8035CF4(&gUnknown_203B34C->unk4,2,0);
+ }
+ sub_8035CF4(&gUnknown_203B34C->unk4,0,1);
+}
+
+void SetMainMenuItems(void)
+{
+ if (sub_8011C34() != -1) {
+ if (sub_8095324(1) == 0) {
+ if (sub_8095324(7) != 0) {
+ if (sub_803D0D8() != 0) {
+ // Revive Team
+ // Delete Save Data
+ // Adventure Log
+ // Friend Rescue
+ // Trade Items
+ // Wonder Mail
+ SetMenuItems((struct unkStruct_Menu *)&gUnknown_203B34C->unk4,gUnknown_203B34C->unk144,0,&gUnknown_80E5A78,gUnknown_80E5C18,1,gUnknown_203B350,1);
+ }
+ else {
+ // Revive Team
+ // Delete Save Data
+ // Adventure Log
+ // Friend Rescue
+ // Trade Items
+ SetMenuItems((struct unkStruct_Menu *)&gUnknown_203B34C->unk4,gUnknown_203B34C->unk144,0,&gUnknown_80E5BC4,gUnknown_80E5BDC,1,gUnknown_203B350,1);
+ }
+ }
+ else {
+ if (sub_803D0D8() != 0) {
+ // Continue
+ // Delete Save Data
+ // Adventure Log
+ // Friend Rescue
+ // Trade Items
+ // Wonder Mail
+ SetMenuItems((struct unkStruct_Menu *)&gUnknown_203B34C->unk4,gUnknown_203B34C->unk144,0,&gUnknown_80E5A78,gUnknown_80E5AFC,1,gUnknown_203B350,1);
+ }
+ else {
+ // Continue
+ // Delete Save Data
+ // Adventure Log
+ // Friend Rescue
+ // Trade Items
+ SetMenuItems((struct unkStruct_Menu *)&gUnknown_203B34C->unk4,gUnknown_203B34C->unk144,0,&gUnknown_80E5A60,gUnknown_80E5A90,1,gUnknown_203B350,1);
+ }
+ }
+ }
+ else {
+ if (sub_803D0D8() != 0) {
+ // Awaiting Rescue
+ // Delete Save Data
+ // Adventure Log
+ // Friend Rescue
+ // Trade Items
+ // Wonder Mail
+ SetMenuItems((struct unkStruct_Menu *)&gUnknown_203B34C->unk4,gUnknown_203B34C->unk144,0,&gUnknown_80E5A78,gUnknown_80E5B8C,1,gUnknown_203B350,1);
+ }
+ else {
+ // Awaiting Rescue
+ // Delete Save Data
+ // Adventure Log
+ // Friend Rescue
+ // Trade Items
+ SetMenuItems((struct unkStruct_Menu *)&gUnknown_203B34C->unk4,gUnknown_203B34C->unk144,0,&gUnknown_80E5B34,gUnknown_80E5B4C,1,gUnknown_203B350,1);
+ }
+ }
+ }
+ else
+ {
+ // New Game
+ // Adventure Log
+ SetMenuItems((struct unkStruct_Menu *)&gUnknown_203B34C->unk4,gUnknown_203B34C->unk144,0,&gUnknown_80E59E0,gUnknown_80E59F8,1,gUnknown_203B350,1);
+ }
+}
+
+bool8 sub_80363E0(void)
+{
+ if(gUnknown_203B34C == NULL)
+ return FALSE;
+ if(gUnknown_203B34C->unk0 == 0xC)
+ return FALSE;
+ return TRUE;
+}
diff --git a/src/main_menu_1.c b/src/main_menu_1.c
deleted file mode 100644
index 668df86..0000000
--- a/src/main_menu_1.c
+++ /dev/null
@@ -1,216 +0,0 @@
-#include "global.h"
-#include "main_menu.h"
-#include "menu.h"
-#include "text.h"
-
-struct unkStruct_203B34C
-{
- // size: 0x1A8
- u32 unk0;
- u32 unk4;
- struct MenuItem *unk8; // Array of menu choices??
- u8 fillC[0x30 - 0xC];
- s16 menuIndex;
- u8 fill32[0x144 - 0x32];
- struct UnkTextStruct2 unk144[4];
- /* 0x1A4 */ u32 currMenuChoice;
-};
-
-extern struct unkStruct_203B34C *gUnknown_203B34C;
-extern u32 gUnknown_203B350;
-
-
-extern u32 gUnknown_80E59E0;
-extern u32 gUnknown_80E5A78;
-extern u32 gUnknown_80E5B34;
-extern u32 gUnknown_80E5BC4;
-extern u32 gUnknown_80E5CB4;
-extern u32 gUnknown_80E5A60;
-
-extern const struct MenuItem gUnknown_80E59F8[];
-extern const struct MenuItem gUnknown_80E5A90[];
-extern const struct MenuItem gUnknown_80E5AFC[];
-extern const struct MenuItem gUnknown_80E5B4C[];
-extern const struct MenuItem gUnknown_80E5B8C[];
-extern const struct MenuItem gUnknown_80E5BDC[];
-extern const struct MenuItem gUnknown_80E5C18[];
-extern const struct MenuItem gUnknown_80E5CCC[];
-extern const struct MenuItem gUnknown_80E5D0C[];
-extern const struct MenuItem gUnknown_80E5D48[];
-extern const struct MenuItem gUnknown_80E5DA0[];
-extern const struct MenuItem gUnknown_80E5DF0[];
-extern const struct MenuItem gUnknown_80E5E5C[];
-extern const struct MenuItem gUnknown_80E5EBC[];
-extern const struct MenuItem gUnknown_80E5F1C[];
-extern const struct MenuItem gUnknown_80E5F80[];
-extern const struct MenuItem gUnknown_80E5FCC[];
-extern const struct MenuItem gUnknown_80E6030[];
-
-extern u8 sub_803D0D8();
-extern s32 sub_8011C34();
-extern s32 sub_8095324(u32);
-extern void SetMenuItems(u32 *, struct UnkTextStruct2 *, u32, u32 *, const struct MenuItem *, u32, u32, u32);
-void SetMainMenuItems(void);
-extern bool8 SetMainMenuText();
-extern void sub_8035CF4(u32 *, u32, u32);
-extern void sub_8035CC0(struct UnkTextStruct2 *, u32);
-
-bool8 SetMainMenuText(void)
-{
- u32 menuChoice;
- struct MenuItem *preload;
-
- // Have to load the pointer before the index
- preload = gUnknown_203B34C->unk8;
- menuChoice = preload[gUnknown_203B34C->menuIndex].menuAction; // chosen menu action?
- if (gUnknown_203B34C->currMenuChoice == menuChoice) {
- return FALSE;
- }
-
- gUnknown_203B34C->currMenuChoice = menuChoice;
- sub_8035CC0(gUnknown_203B34C->unk144,2);
- sub_8035CC0(gUnknown_203B34C->unk144,3);
- switch(menuChoice) {
- case MENU_WIRELESS_COMMS:
- // Using wireless communications, you can go on an adventure to unknown worlds.
- SetMenuItems(&gUnknown_203B34C->unk4,gUnknown_203B34C->unk144,2,&gUnknown_80E5CB4,gUnknown_80E6030,0,0,0);
- break;
- case MENU_WONDER_MAIL:
- // Using passwords, you can receive Wonder Mail
- SetMenuItems(&gUnknown_203B34C->unk4,gUnknown_203B34C->unk144,2,&gUnknown_80E5CB4,gUnknown_80E5F80,0,0,0);
- break;
- case MENU_AWAITING_RESCUE:
- // You are awaiting resuce by a friend
- // You can give up waiting for rescue
- SetMenuItems(&gUnknown_203B34C->unk4,gUnknown_203B34C->unk144,2,&gUnknown_80E5CB4,gUnknown_80E5F1C,0,0,0);
- break;
- case MENU_NEW_GAME:
- // Start an entirely new adventure
- SetMenuItems(&gUnknown_203B34C->unk4,gUnknown_203B34C->unk144,2,&gUnknown_80E5CB4,gUnknown_80E5CCC,0,0,0);
- break;
- case MENU_CONTINUE:
- // Resume your adventure from where you last saved
- SetMenuItems(&gUnknown_203B34C->unk4,gUnknown_203B34C->unk144,2,&gUnknown_80E5CB4,gUnknown_80E5DA0,0,0,0);
- break;
- case MENU_DELETE_SAVE_PROMPT:
- // This will delete your saved game data.
- // Beware! This will delete it forever
- SetMenuItems(&gUnknown_203B34C->unk4,gUnknown_203B34C->unk144,2,&gUnknown_80E5CB4,gUnknown_80E5DF0,0,0,0);
- break;
- case MENU_ADVENTURE_LOG:
- // Check your career as an adventurer
- SetMenuItems(&gUnknown_203B34C->unk4,gUnknown_203B34C->unk144,2,&gUnknown_80E5CB4,gUnknown_80E5D0C,0,0,0);
- break;
- case MENU_FRIEND_RESCUE:
- // Using a Game Link cable or passwords, friends may rescue each other
- SetMenuItems(&gUnknown_203B34C->unk4,gUnknown_203B34C->unk144,2,&gUnknown_80E5CB4,gUnknown_80E5E5C,0,0,0);
- break;
- case MENU_TRADE_ITEMS:
- // Using a Game Link cable you can trade stored items with a friend
- SetMenuItems(&gUnknown_203B34C->unk4,gUnknown_203B34C->unk144,2,&gUnknown_80E5CB4,gUnknown_80E5EBC,0,0,0);
- break;
- case MENU_DUAL_SLOT:
- // Using Dual Slot function, you can receive teams from your friends
- SetMenuItems(&gUnknown_203B34C->unk4,gUnknown_203B34C->unk144,2,&gUnknown_80E5CB4,gUnknown_80E5FCC,0,0,0);
- break;
- case MENU_DEBUG:
- // This is the Debug Mode.
- // It won't be in the release version
- SetMenuItems(&gUnknown_203B34C->unk4,gUnknown_203B34C->unk144,2,&gUnknown_80E5CB4,gUnknown_80E5D48,0,0,0);
- break;
- default:
- break;
- }
- return TRUE;
-}
-
-void sub_803623C(void)
-{
- sub_8035CC0(gUnknown_203B34C->unk144,1);
- SetMainMenuItems();
- gUnknown_203B34C->currMenuChoice = -1;
- if (SetMainMenuText()) {
- sub_8035CF4(&gUnknown_203B34C->unk4,2,0);
- }
- sub_8035CF4(&gUnknown_203B34C->unk4,0,1);
-}
-
-void SetMainMenuItems(void)
-{
- if (sub_8011C34() != -1) {
- if (sub_8095324(1) == 0) {
- if (sub_8095324(7) != 0) {
- if (sub_803D0D8() != 0) {
- // Revive Team
- // Delete Save Data
- // Adventure Log
- // Friend Rescue
- // Trade Items
- // Wonder Mail
- SetMenuItems(&gUnknown_203B34C->unk4,gUnknown_203B34C->unk144,0,&gUnknown_80E5A78,gUnknown_80E5C18,1,gUnknown_203B350,1);
- }
- else {
- // Revive Team
- // Delete Save Data
- // Adventure Log
- // Friend Rescue
- // Trade Items
- SetMenuItems(&gUnknown_203B34C->unk4,gUnknown_203B34C->unk144,0,&gUnknown_80E5BC4,gUnknown_80E5BDC,1,gUnknown_203B350,1);
- }
- }
- else {
- if (sub_803D0D8() != 0) {
- // Continue
- // Delete Save Data
- // Adventure Log
- // Friend Rescue
- // Trade Items
- // Wonder Mail
- SetMenuItems(&gUnknown_203B34C->unk4,gUnknown_203B34C->unk144,0,&gUnknown_80E5A78,gUnknown_80E5AFC,1,gUnknown_203B350,1);
- }
- else {
- // Continue
- // Delete Save Data
- // Adventure Log
- // Friend Rescue
- // Trade Items
- SetMenuItems(&gUnknown_203B34C->unk4,gUnknown_203B34C->unk144,0,&gUnknown_80E5A60,gUnknown_80E5A90,1,gUnknown_203B350,1);
- }
- }
- }
- else {
- if (sub_803D0D8() != 0) {
- // Awaiting Rescue
- // Delete Save Data
- // Adventure Log
- // Friend Rescue
- // Trade Items
- // Wonder Mail
- SetMenuItems(&gUnknown_203B34C->unk4,gUnknown_203B34C->unk144,0,&gUnknown_80E5A78,gUnknown_80E5B8C,1,gUnknown_203B350,1);
- }
- else {
- // Awaiting Rescue
- // Delete Save Data
- // Adventure Log
- // Friend Rescue
- // Trade Items
- SetMenuItems(&gUnknown_203B34C->unk4,gUnknown_203B34C->unk144,0,&gUnknown_80E5B34,gUnknown_80E5B4C,1,gUnknown_203B350,1);
- }
- }
- }
- else
- {
- // New Game
- // Adventure Log
- SetMenuItems(&gUnknown_203B34C->unk4,gUnknown_203B34C->unk144,0,&gUnknown_80E59E0,gUnknown_80E59F8,1,gUnknown_203B350,1);
- }
-}
-
-bool8 sub_80363E0(void)
-{
- if(gUnknown_203B34C == NULL)
- return FALSE;
- if(gUnknown_203B34C->unk0 == 0xC)
- return FALSE;
- return TRUE;
-}
diff --git a/src/memory_mid.c b/src/memory_mid.c
index 1eb707c..51c927a 100644
--- a/src/memory_mid.c
+++ b/src/memory_mid.c
@@ -2,7 +2,7 @@
#include "memory.h"
extern u32 gUnknown_80B7F14;
-extern u32 gUnknown_80B7F20;
+extern const char gLocateSetErrorMessage[];
extern struct HeapDescriptor gMainHeapDescriptor;
extern s32 MemorySearchFromBack(struct HeapDescriptor *heap, s32, s32);
@@ -12,7 +12,7 @@ extern struct HeapDescriptor * _LocateSetFront(struct HeapDescriptor *, u32, u32
void DoFree(struct HeapDescriptor *, void *);
void *DoAlloc(struct HeapDescriptor *, s32, u32);
-void FatalError(u32 *, u32 *, ...) __attribute__((noreturn));
+void FatalError(u32 *, const char *, ...) __attribute__((noreturn));
s32 _LocateSet(struct HeapDescriptor *heap, s32 size, s32 group)
@@ -48,7 +48,7 @@ error:
// LocateSet [%p] buffer %8x size can't locate
// atb %02x grp %3d
FatalError(&gUnknown_80B7F14,
- &gUnknown_80B7F20,
+ gLocateSetErrorMessage,
heap,size,atb,group);
}
diff --git a/src/personality_test.c b/src/personality_test.c
index 2034b7b..d129d8c 100644
--- a/src/personality_test.c
+++ b/src/personality_test.c
@@ -56,7 +56,6 @@ extern struct UnkSaveStruct1 *gUnknown_203B46C;
extern const char gStarterReveal[];
extern const char gGenderText[];
extern struct MenuItem gGenderMenu[];
-extern const char gPartnerSelectionHeaderText;
extern u8 gNatureQuestionTable[NUM_QUIZ_QUESTIONS];
extern u8 gAvailablePokemonNames[0x50];
@@ -170,7 +169,8 @@ const struct UnkTextStruct2 gUnknown_80F42A8 =
NULL
};
-
+const char gPartnerSelectionHeaderText[] = _("Pokémon");
+const char personality_test_fill[] = "pksdir0";
u8 CreateTestTracker(void)
{
@@ -712,7 +712,7 @@ void RedrawPartnerSelectionMenu(void)
sub_800641C(gUnknown_203B404->unk54,1,1);
sub_8008C54(gUnknown_203B404->unk4C);
sub_80073B8(gUnknown_203B404->unk4C);
- xxx_call_draw_string(0xc, 0, &gPartnerSelectionHeaderText, gUnknown_203B404->unk4C, 0);
+ xxx_call_draw_string(0xc, 0, gPartnerSelectionHeaderText, gUnknown_203B404->unk4C, 0);
monCounter = 0;
while (monCounter < gUnknown_203B404->unk32) {
diff --git a/src/thank_you_wonder_mail.c b/src/thank_you_wonder_mail.c
index 745d682..536c9d9 100644
--- a/src/thank_you_wonder_mail.c
+++ b/src/thank_you_wonder_mail.c
@@ -424,7 +424,7 @@ extern struct PokemonStruct *sub_808D33C(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);
-extern void sub_802F204(u8 *, u32);
+extern void sub_802F204(struct unkStruct_802F204 *, u32);
extern void sub_80151C0(u32, u8 *);
extern void xxx_call_start_bg_music(void);
extern void sub_803092C(void);
@@ -1615,23 +1615,23 @@ void UpdateThankYouMailText(void)
break;
case 0x22:
monName = GetMonSpecies(SPECIES_PELIPPER);
- strcpy(gUnknown_203B2C4->unk53C,monName);
- gUnknown_203B2C4->unk550 = 0x130;
- gUnknown_203B2C4->unk552 = 2;
- gUnknown_203B2C4->unk554 = 0;
+ strcpy(gUnknown_203B2C4->unk53C.clientName,monName); // 0x53C
+ gUnknown_203B2C4->unk53C.unk14 = SPECIES_PELIPPER; // 0x550
+ gUnknown_203B2C4->unk53C.unk16 = 2; // 0x552
+ gUnknown_203B2C4->unk53C.moneyReward = 0; // 0x554
uVar2 = sub_809539C(6,gUnknown_203B2C4->unk430);
puVar4 = sub_8095228(uVar2);
cVar1 = puVar4->unk20.itemIndex;
if (cVar1 != '\0')
- gUnknown_203B2C4->unk558 = cVar1;
+ gUnknown_203B2C4->unk53C.itemRewards[0] = cVar1; // unk558
else
- gUnknown_203B2C4->unk558 = 0;
- gUnknown_203B2C4->unk55B = 1;
- gUnknown_203B2C4->unk560 = sub_803C200(&puVar4->unk4, 0);
- gUnknown_203B2C4->unk559 = 0;
- gUnknown_203B2C4->unk55A = 0;
- gUnknown_203B2C4->unk55C = 0;
- sub_802F204(gUnknown_203B2C4->unk53C,0);
+ gUnknown_203B2C4->unk53C.itemRewards[0] = 0; // unk558
+ gUnknown_203B2C4->unk53C.numItems = 1; // unk55B
+ gUnknown_203B2C4->unk53C.teamRankPtsReward = sub_803C200(&puVar4->unk4, 0); // unk560
+ gUnknown_203B2C4->unk53C.itemRewards[1] = 0; // unk559
+ gUnknown_203B2C4->unk53C.itemRewards[2] = 0; // unk55A
+ gUnknown_203B2C4->unk53C.friendAreaReward = 0; // unk55C
+ sub_802F204(&gUnknown_203B2C4->unk53C,0); // unk53C
break;
case COMMUNICATING_THANK_YOU_MAIL:
// Communicating..
diff --git a/src/wonder_mail.c b/src/wonder_mail.c
index 29cd2bc..cae3233 100644
--- a/src/wonder_mail.c
+++ b/src/wonder_mail.c
@@ -34,7 +34,7 @@ extern struct MenuItem gUnknown_80DDA48[];
extern s32 sub_8095190(void);
extern u32 sub_8095324(u32);
-extern void sub_80141B4(const char *r0, u32, u32 *r1, u32);
+extern void sub_80141B4(const char *r0, u32, struct OpenedFile **r1, u32);
extern void nullsub_130(void);
extern void sub_8028348(void);
extern void ResetUnusedInputStruct();
@@ -52,7 +52,7 @@ extern void sub_803092C(void);
extern u32 sub_80154F0();
extern u32 sub_8039068(u32, u8 *r1, u8 *r0);
-extern void sub_8014248(const char *r0, u32, u32, struct MenuItem *r4, u32, u32, u32, u32 *r5, u32);
+extern void sub_8014248(const char *r0, u32, u32, struct MenuItem *r4, u32, u32, u32, void *r5, u32);
extern void sub_8095274(u32);
extern void sub_80155F0();
extern void sub_80951BC(u8 *r0);
@@ -83,6 +83,621 @@ extern void sub_8099690(u32);
extern void sub_8031E10(void);
extern void sub_803084C(void);
extern void sub_8030DE4();
+extern u8 gUnknown_80DDAE4[];
+extern struct MenuItem gUnknown_80DDAA0[];
+extern struct MenuItem gUnknown_80DDA80[];
+extern struct MenuItem gUnknown_80DDAFC[];
+extern struct MenuItem gUnknown_80DDB60[];
+extern struct MenuItem gUnknown_80DDA64[];
+extern struct unkStruct_203B45C *gRecruitedPokemonRef;
+extern struct MenuItem gUnknown_80DDB24[];
+extern struct MenuItem gUnknown_80DD9EC[];
+extern u8 gUnknown_80DDACC[];
+extern struct MenuItem gUnknown_80DD970[];
+
+extern void nullsub_23(u32);
+extern s32 sub_8037D64(u32, void *, void *);
+extern s32 sub_80381F4(u32, void *, void *);
+extern void sub_8023868(u32, u32, u32, u32);
+extern void sub_80306A8(u32, u32, u32, u32);
+extern s32 sub_8037B28(u32);
+extern void sub_8011830(void);
+extern u32 sub_8095350();
+extern void sub_8031D70(u8, u32);
+extern void sub_80151C0(u32, u8 *);
+extern void xxx_call_start_bg_music(void);
+extern u32 sub_8023CE8(void);
+extern u32 sub_8030894(void);
+extern void sub_8030F58(u32);
+extern void sub_8023DA4(void);
+extern void SetMenuItems(void *, struct UnkTextStruct2 *, u32, u8 *, struct MenuItem *, u32, u32, u32);
+extern void sub_8029B34(void);
+extern void sub_8029AD8(void);
+extern void sub_8029AF4(void);
+extern void sub_8029A88(void);
+extern void sub_8029AB0(void);
+extern void sub_80297B8(void);
+extern void sub_80297D4(void);
+extern void sub_8029884(void);
+extern void sub_8029944(void);
+extern void sub_80299AC(void);
+extern void sub_80299D8(void);
+extern void sub_8029A6C(void);
+extern void sub_8028CE0(void);
+extern void sub_8028BF0(void);
+extern void sub_8029A18(void);
+extern void sub_80295A8(void);
+extern void sub_8029668(void);
+extern void sub_8029684(void);
+extern void sub_8029740(void);
+extern void sub_80295D8(void);
+extern void sub_802979C(void);
+extern void sub_8029358(void);
+extern void sub_8029374(void);
+extern void sub_802939C(void);
+extern void sub_8028F58(void);
+extern void sub_8028F30(void);
+extern void sub_8028F04(void);
+extern void sub_8028ED4(void);
+extern void sub_80293D8(void);
+extern void sub_80293F4(void);
+extern void sub_8028DE8(u32);
+extern void sub_8028EAC(void);
+extern void sub_802955C(void);
+extern void sub_80292A4(void);
+extern void sub_80292EC(void);
+extern void sub_802933C(void);
+extern void sub_802958C(void);
+extern void sub_8029208(void);
+extern void sub_8028E84(void);
+extern void sub_8028F80(void);
+extern void sub_8028FC0(void);
+extern void sub_8028FDC(void);
+extern void sub_8028E54(void);
+extern void sub_8028E24(void);
+extern void sub_8028E08(void);
+extern void sub_80290D4(void);
+extern void sub_80290F0(void);
+extern void sub_80291AC(void);
+extern void sub_8029044(void);
+extern void sub_8028CFC(void);
+extern void sub_8028D4C(void);
+extern void sub_8031E10(void);
+extern void sub_8023C60(void);
+extern void sub_803084C(void);
+extern void sub_80155F0(void);
+extern void sub_80310B4(void);
+extern void sub_8030DE4(void);
+extern void sub_802453C(void);
+
+
+
+u32 sub_8027F88(void)
+{
+ char *monName;
+ struct OpenedFile *faceFile;
+ s32 counter;
+
+ ResetUnusedInputStruct();
+ sub_800641C(0, 1, 1);
+ gUnknown_203B2C0 = MemoryAlloc(sizeof(struct WonderMailStruct_203B2C0), 8);
+ MemoryFill8((u8 *)gUnknown_203B2C0, 0, sizeof(struct WonderMailStruct_203B2C0));
+ gUnknown_203B2C0->unk53C = 0;
+ gUnknown_203B2C0->unk218 = -1;
+ gUnknown_203B2C0->unk544 = -1;
+ CopyYellowSpeciesNametoBuffer(gUnknown_202E5D8, SPECIES_PELIPPER);
+ monName = GetMonSpecies(SPECIES_PELIPPER);
+ strcpy(gAvailablePokemonNames, monName);
+ faceFile = GetDialogueSpriteDataPtr(SPECIES_PELIPPER);
+ gUnknown_203B2C0->faceFile = faceFile;
+ gUnknown_203B2C0->faceData = faceFile->data;
+ gUnknown_203B2C0->unk42C = 0;
+ gUnknown_203B2C0->unk42D = 0;
+ gUnknown_203B2C0->unk42E = 0;
+ gUnknown_203B2C0->unk428 = 2;
+ gUnknown_203B2C0->unk42A = 8;
+ for(counter = 0; counter < PASSWORD_BUFFER_SIZE; counter++){
+ gUnknown_203B2C0->passwordBuffer[counter] = 0;
+ }
+ gUnknown_203B2C0->unk0 = 0x3D;
+ sub_8028B04(0); // Set initial state to 0?
+ return 1;
+}
+
+u32 sub_8028078(void)
+{
+
+ switch(gUnknown_203B2C0->state) {
+ case 0x3c:
+ sub_8029B34();
+ break;
+ case 0x3a:
+ sub_8029AD8();
+ break;
+ case 0x3b:
+ sub_8029AF4();
+ break;
+ case 0x38:
+ sub_8029A88();
+ break;
+ case 0x37:
+ sub_8029AB0();
+ break;
+ case 0x32:
+ sub_80297B8();
+ break;
+ case 0x33:
+ sub_80297D4();
+ break;
+ case 0x34:
+ sub_8029884();
+ break;
+ case 0x35:
+ sub_8029944();
+ break;
+ case 0x31:
+ sub_80299AC();
+ break;
+ case 0x36:
+ sub_80299D8();
+ break;
+ case 0x30:
+ sub_8029A6C();
+ break;
+ case 0x2e:
+ sub_8029A18();
+ break;
+ case 0x2d:
+ sub_80295A8();
+ break;
+ case 0x29:
+ sub_8029668();
+ break;
+ case 0x2b:
+ sub_8029684();
+ break;
+ case 0x2c:
+ sub_8029740();
+ break;
+ case 0x2a:
+ sub_80295D8();
+ break;
+ case 0x2f:
+ sub_802979C();
+ break;
+ case 9:
+ sub_8029358();
+ break;
+ case 0x23:
+ sub_8029374();
+ break;
+ case 0x24:
+ sub_802939C();
+ break;
+ case 0x26:
+ sub_80293D8();
+ break;
+ case 0x27:
+ sub_80293F4();
+ break;
+ case 0x28:
+ sub_802955C();
+ break;
+ case 4:
+ sub_80292A4();
+ break;
+ case 6:
+ sub_80292EC();
+ break;
+ case 7:
+ sub_802933C();
+ break;
+ case 5:
+ sub_802958C();
+ break;
+ case 8:
+ sub_8029208();
+ break;
+ case 0x1a:
+ sub_8028DE8(1);
+ break;
+ case 0x1b:
+ sub_8028F80();
+ break;
+ case 0x1c:
+ case 0x1d:
+ sub_8028FC0();
+ break;
+ case 0x22:
+ sub_8028FDC();
+ break;
+ case 0x1e:
+ sub_80290D4();
+ break;
+ case 0x20:
+ sub_80290F0();
+ break;
+ case 0x21:
+ sub_80291AC();
+ break;
+ case 0x1f:
+ sub_8029044();
+ break;
+ case 10:
+ sub_8028CFC();
+ break;
+ case 0xb:
+ sub_8028D4C();
+ break;
+ case 0xd:
+ case 0xf:
+ sub_8028DE8(10);
+ break;
+ case 0x11:
+ sub_8028E08();
+ break;
+ case 0xc:
+ case 0xe:
+ case 0x10:
+ sub_8028DE8(0x19);
+ break;
+ case 0x12:
+ sub_8028E24();
+ break;
+ case 0x13:
+ sub_8028E54();
+ break;
+ case 0x17:
+ sub_8028E84();
+ break;
+ case 0x18:
+ sub_8028EAC();
+ break;
+ case 0x19:
+ sub_8028ED4();
+ break;
+ case 0x14:
+ sub_8028F04();
+ break;
+ case 0x15:
+ sub_8028F30();
+ break;
+ case 0x16:
+ sub_8028F58();
+ break;
+ case 0:
+ case 1:
+ sub_8028BF0();
+ break;
+ case 2:
+ case 0x25:
+ case 0x39:
+ sub_8028CE0();
+ break;
+ case 3:
+ return 3;
+ }
+ return 0;
+}
+
+s32 sub_80282DC(u8 *r0)
+{
+ *r0 = gUnknown_203B2C0->unk218;
+ return gUnknown_203B2C0->unk53C;
+}
+
+void sub_80282FC(void)
+{
+ if (gUnknown_203B2C0 != NULL) {
+ CloseFile(gUnknown_203B2C0->faceFile);
+ MemoryFree(gUnknown_203B2C0);
+ gUnknown_203B2C0 = NULL;
+ sub_8031E10();
+ sub_8023C60();
+ sub_803084C();
+ sub_80155F0();
+ sub_80310B4();
+ sub_8030DE4();
+ sub_802453C();
+ }
+}
+
+void nullsub_130(void)
+{
+}
+
+void sub_8028348(void)
+{
+ s32 linkError;
+ switch(gUnknown_203B2C0->state)
+ {
+ case 0x3B:
+ sub_8006518(gUnknown_203B2C0->unk3BC);
+ ResetUnusedInputStruct();
+ sub_800641C(0, 1, 1);
+ sub_8031D70(gUnknown_203B2C0->unk218, 0);
+ break;
+ case 0x3C:
+ sub_80141B4(gUnknown_80DDBA8, 0, &gUnknown_203B2C0->faceFile,0x10d);
+ break;
+ case 0x3A:
+ sub_80141B4(gUnknown_80DDBFC, 0, &gUnknown_203B2C0->faceFile,0x10d);
+ break;
+ case 0x38:
+ sub_80141B4(gUnknown_80DDC30, 0, &gUnknown_203B2C0->faceFile,0x10d);
+ break;
+ case 0x37:
+ switch(gUnknown_203B2C0->unk534)
+ {
+ // 0x0 - 0x9 included here too...
+ case 0x10:
+ case 0xF:
+ case 0xD:
+ sub_80141B4(gUnknown_80DDC70, 0, &gUnknown_203B2C0->faceFile,0x10d);
+ break;
+ case 0xE:
+ break;
+ }
+ break;
+ case 0x39:
+ sub_80141B4(gUnknown_80DDC30, 0, &gUnknown_203B2C0->faceFile,0x10d);
+ break;
+ case 0x32:
+ sub_80141B4(gUnknown_80DDCBC, 0, 0,0x101);
+ break;
+ case 0x33:
+ if(sub_8023CE8() != 0)
+ {
+ break;
+ }
+ else
+ {
+ ResetUnusedInputStruct();
+ sub_800641C(0, 1, 1);
+ sub_8023868(3, 0, 0, 9);
+ }
+ break;
+ case 0x34:
+ sub_8006518(gUnknown_203B2C0->unk35C);
+ SetMenuItems(&gUnknown_203B2C0->unk21C, gUnknown_203B2C0->unk35C, 3, gUnknown_80DDAE4, gUnknown_80DDAFC, 1, 0, 0);
+ sub_8023DA4();
+ sub_8035CF4(&gUnknown_203B2C0->unk21C, 3, 1);
+ break;
+ case 0x31:
+ sub_8014248(gUnknown_80DDD2C, 0, 0xA, gUnknown_80DDAA0, 0, 4, 0, &gUnknown_203B2C0->faceFile,0xC);
+ break;
+ case 0x36:
+ sub_8014248(gUnknown_80DDD88, 0, 8, gUnknown_80DDA80, 0, 4, 0, &gUnknown_203B2C0->faceFile,0xC);
+ break;
+ case 0x2D:
+ sub_8014248(gUnknown_80DDDBC, 0, 8, gUnknown_80DDA64, 0, 4, 0, &gUnknown_203B2C0->faceFile,0xC);
+ break;
+ case 0x29:
+ sub_80141B4(gUnknown_80DDDD8, 0, &gUnknown_203B2C0->faceFile,0x10d);
+ break;
+ case 0x2A:
+ if(sub_8030894() != 0)
+ {
+ break;
+ }
+ else
+ {
+ ResetUnusedInputStruct();
+ sub_800641C(0, 1, 1);
+ sub_80306A8(4, 0, 0, 6);
+ }
+ break;
+ case 0x2F:
+ sub_80141B4(gUnknown_80DDE20, 0, &gUnknown_203B2C0->faceFile,0x10d);
+ break;
+ case 0x30:
+ sub_80141B4(gUnknown_80DDE58, 0, &gUnknown_203B2C0->faceFile,0x10d);
+ break;
+ case 0x2E:
+ sub_8014248(gUnknown_80DDEC0, 0, 0x11, gUnknown_80DDB60, 0, 4, 0, &gUnknown_203B2C0->faceFile,0xC);
+ break;
+ case 9:
+ sub_80141B4(gUnknown_80DDF2C, 0, &gUnknown_203B2C0->faceFile,0x10d);
+ break;
+ case 4:
+ sub_8014248(gUnknown_80DDFB8, 0, 8, gUnknown_80DDA48, 0, 4, 0, &gUnknown_203B2C0->faceFile,0xC);
+ break;
+ case 5:
+ nullsub_23(0);
+ sub_80141B4(gUnknown_80DE01C, 0 , 0, 0);
+ break;
+ case 6:
+ gUnknown_203B2C0->linkError = 0;
+ sub_8011830();
+ linkError = sub_8037B28(gUnknown_203B2C0->unk40);
+ gUnknown_203B2C0->linkError = linkError;
+ if(linkError == 0)
+ {
+ switch(gUnknown_203B2C0->unk40)
+ {
+ case 3:
+ MemoryFill8(gUnknown_203B2C0->unk48, 0, 0x30);
+ MemoryFill8(gUnknown_203B2C0->unk78, 0, 0x30);
+ gUnknown_203B2C0->linkError = sub_8037D64(gUnknown_203B2C0->unk40, gUnknown_203B2C0->unk48, gUnknown_203B2C0->unk78);
+ break;
+ case 4:
+ MemoryFill8((u8 *)&gUnknown_203B2C0->unkA8, 0, 0x88);
+ MemoryFill8(&gUnknown_203B2C0->unk130, 0, 0x88);
+ gUnknown_203B2C0->unkD8.speciesNum = linkError;
+ gUnknown_203B2C0->unk168 = linkError;
+ gUnknown_203B2C0->unkA8 = *sub_8095228(gUnknown_203B2C0->unk218);
+ if(gUnknown_203B2C0->unk544 != -1)
+ {
+ gUnknown_203B2C0->unkD8 = gRecruitedPokemonRef->pokemon[gUnknown_203B2C0->unk544];
+ }
+ gUnknown_203B2C0->linkError = sub_8037D64(gUnknown_203B2C0->unk40, &gUnknown_203B2C0->unkA8, &gUnknown_203B2C0->unk130);
+ break;
+ }
+ if(gUnknown_203B2C0->linkError == 0)
+ {
+ switch(gUnknown_203B2C0->unk40)
+ {
+ case 3:
+ gUnknown_203B2C0->linkError = sub_80381F4(3, gUnknown_203B2C0->unk48, gUnknown_203B2C0->unk78);
+ break;
+ case 4:
+ gUnknown_203B2C0->linkError = sub_80381F4(4, &gUnknown_203B2C0->unkA8, &gUnknown_203B2C0->unk130);
+ break;
+ }
+ }
+ xxx_call_start_bg_music();
+ }
+ else
+ {
+ xxx_call_start_bg_music();
+ }
+ break;
+ case 0x23:
+ switch(gUnknown_203B2C0->unk534)
+ {
+ // 0x0 - 0x9 included here too...
+ case 0x10:
+ case 0xF:
+ case 0xD:
+ sub_80141B4(gUnknown_80DE06C, 0, &gUnknown_203B2C0->faceFile,0x10d);
+ break;
+ case 0xE:
+ break;
+ }
+ break;
+ case 0x25:
+ sub_80141B4(gUnknown_80DE0C0, 0, &gUnknown_203B2C0->faceFile,0x10d);
+ break;
+ case 0x26:
+ sub_80141B4(gUnknown_80DE124, 0, &gUnknown_203B2C0->faceFile,0x10d);
+ break;
+ case 0x27:
+ sub_8006518(gUnknown_203B2C0->unk3BC);
+ ResetUnusedInputStruct();
+ sub_800641C(0, 1, 1);
+ sub_80151C0(4, gUnknown_203B2C0->passwordBuffer);
+ break;
+ case 8:
+ switch(gUnknown_203B2C0->unk538)
+ {
+ case 0:
+ sub_8014248(gUnknown_80DE178, 0, 0xD, gUnknown_80DDB24, 0, 4, 0, &gUnknown_203B2C0->faceFile,0xC);
+ break;
+ case 2:
+ sub_8014248(gUnknown_80DE1B4, 0, 0xD, gUnknown_80DDB24, 0, 4, 0, &gUnknown_203B2C0->faceFile,0xC);
+ break;
+ }
+ break;
+ case 0x1A:
+ sub_80141B4(gUnknown_80DE1E4, 0, &gUnknown_203B2C0->faceFile,0x10d);
+ break;
+ case 0x1B:
+ sub_80141B4(gUnknown_80DE280, 0, &gUnknown_203B2C0->faceFile,0x10d);
+ break;
+ case 0x1C:
+ sub_80141B4(gUnknown_80DE2B0, 0, &gUnknown_203B2C0->faceFile,0x10d);
+ break;
+ case 0x1D:
+ sub_80141B4(gUnknown_80DE368, 0, &gUnknown_203B2C0->faceFile,0x10d);
+ break;
+ case 0x22:
+ sub_8014248(gUnknown_80DDDBC, 0, 8, gUnknown_80DDA64, 0, 4, 0, &gUnknown_203B2C0->faceFile,0xC);
+ break;
+ case 0x1E:
+ sub_80141B4(gUnknown_80DE430, 0, &gUnknown_203B2C0->faceFile,0x10d);
+ break;
+ case 0x1F:
+ if(sub_8030894() != 0)
+ {
+ break;
+ }
+ else
+ {
+ ResetUnusedInputStruct();
+ sub_800641C(0, 1, 1);
+ sub_80306A8(2, 0, 0, 6);
+ }
+ break;
+ case 0x20:
+ case 0x2B:
+ sub_8006518(gUnknown_203B2C0->unk35C);
+ SetMenuItems(&gUnknown_203B2C0->unk21C, gUnknown_203B2C0->unk35C, 3, gUnknown_80DDACC, gUnknown_80DDAFC, 1, 0, 0);
+ sub_803092C();
+ sub_8035CF4(&gUnknown_203B2C0->unk21C, 3, 1);
+ break;
+ case 0xA:
+ gUnknown_203B2C0->unk540 = sub_8095350();
+ switch((u32)gUnknown_203B2C0->unk538)
+ {
+ case 5:
+ sub_8030F58(2);
+ break;
+ case 6:
+ sub_8030F58(4);
+ break;
+ default:
+ case 7:
+ break;
+ }
+ break;
+ case 0xB:
+ sub_8014248(gUnknown_80DE48C, 0, 5, gUnknown_80DD9EC, 0, 4, 0, &gUnknown_203B2C0->faceFile,0xC);
+ break;
+ case 0xD:
+ sub_80141B4(gUnknown_80DE4B8, 0, &gUnknown_203B2C0->faceFile,0x10d);
+ break;
+ case 0xC:
+ sub_80141B4(gUnknown_80DE4F0, 0, &gUnknown_203B2C0->faceFile,0x10d);
+ break;
+ case 0xF:
+ sub_80141B4(gUnknown_80DE524, 0, &gUnknown_203B2C0->faceFile,0x10d);
+ break;
+ case 0xE:
+ sub_80141B4(gUnknown_80DE614, 0, &gUnknown_203B2C0->faceFile,0x10d);
+ break;
+ case 0x11:
+ sub_80141B4(gUnknown_80DE648, 0, &gUnknown_203B2C0->faceFile,0x10d);
+ break;
+ case 0x10:
+ sub_80141B4(gUnknown_80DE694, 0, &gUnknown_203B2C0->faceFile,0x10d);
+ break;
+ case 0x12:
+ sub_8014248(gUnknown_80DE6D4, 0, 8, gUnknown_80DDA48, 0, 4, 0, &gUnknown_203B2C0->faceFile,0xC);
+ break;
+ case 0x13:
+ sub_8014248(gUnknown_80DE754, 0, 8, gUnknown_80DDA48, 0, 4, 0, &gUnknown_203B2C0->faceFile,0xC);
+ break;
+ case 0x17:
+ sub_80141B4(gUnknown_80DE7B8, 0, &gUnknown_203B2C0->faceFile,0x10d);
+ break;
+ case 0x18:
+ sub_80141B4(gUnknown_80DE7E8, 0, &gUnknown_203B2C0->faceFile,0x10d);
+ break;
+ case 0x19:
+ sub_8014248(gUnknown_80DE808, 0, 8, gUnknown_80DDA64, 0, 4, 0, &gUnknown_203B2C0->faceFile,0xC);
+ break;
+ case 0x14:
+ sub_80141B4(gUnknown_80DE830, 0, &gUnknown_203B2C0->faceFile,0x10d);
+ break;
+ case 0x15:
+ sub_80141B4(gUnknown_80DE864, 0, &gUnknown_203B2C0->faceFile,0x10d);
+ break;
+ case 0x16:
+ sub_80141B4(gUnknown_80DE7E8, 0, &gUnknown_203B2C0->faceFile,0x10d);
+ break;
+ case 0:
+ sub_8014248(gUnknown_80DE8B4, 0, 0, gUnknown_80DD970, 0, 4, 0, &gUnknown_203B2C0->faceFile,0xC);
+ break;
+ case 1:
+ sub_8014248(gUnknown_80DE918, 0, 0, gUnknown_80DD970, 0, 4, 0, &gUnknown_203B2C0->faceFile,0xC);
+ break;
+ case 2:
+ sub_80141B4(gUnknown_80DE93C, 0, &gUnknown_203B2C0->faceFile,0x10d);
+ break;
+ case 3:
+ break;
+ }
+}
void sub_8028B04(u32 r0)
@@ -101,43 +716,43 @@ void sub_8028B1C(u32 r0)
break;
case 1:
case 2:
- sub_80141B4(gWonderMailErrorText, 0, (u32 *)&gUnknown_203B2C0->faceFile, 0x10d);
+ sub_80141B4(gWonderMailErrorText, 0, &gUnknown_203B2C0->faceFile, 0x10d);
break;
case 3:
- sub_80141B4(gWonderMailNumGBAsText, 0, (u32 *)&gUnknown_203B2C0->faceFile, 0x10d);
+ sub_80141B4(gWonderMailNumGBAsText, 0, &gUnknown_203B2C0->faceFile, 0x10d);
break;
case 4:
- sub_80141B4(gWonderMailWrongModeText, 0, (u32 *)&gUnknown_203B2C0->faceFile, 0x10d);
+ sub_80141B4(gWonderMailWrongModeText, 0, &gUnknown_203B2C0->faceFile, 0x10d);
break;
case 5:
- sub_80141B4(gWonderMailErrorText, 0, (u32 *)&gUnknown_203B2C0->faceFile, 0x10d);
+ sub_80141B4(gWonderMailErrorText, 0, &gUnknown_203B2C0->faceFile, 0x10d);
break;
case 6:
- sub_80141B4(gWonderMailStorageFullText, 0, (u32 *)&gUnknown_203B2C0->faceFile, 0x10d);
+ sub_80141B4(gWonderMailStorageFullText, 0, &gUnknown_203B2C0->faceFile, 0x10d);
break;
case 7:
- sub_80141B4(gWonderMailDuplicateText, 0, (u32 *)&gUnknown_203B2C0->faceFile, 0x10d);
+ sub_80141B4(gWonderMailDuplicateText, 0, &gUnknown_203B2C0->faceFile, 0x10d);
break;
case 8:
break;
case 9:
- sub_80141B4(gWonderMailNotEligibleReceiveText, 0, (u32 *)&gUnknown_203B2C0->faceFile, 0x10d);
+ sub_80141B4(gWonderMailNotEligibleReceiveText, 0, &gUnknown_203B2C0->faceFile, 0x10d);
break;
case 10:
break;
case 11:
- sub_80141B4(gWonderMailNotEligibleReceiveText, 0, (u32 *)&gUnknown_203B2C0->faceFile, 0x10d);
+ sub_80141B4(gWonderMailNotEligibleReceiveText, 0, &gUnknown_203B2C0->faceFile, 0x10d);
break;
case 12:
break;
case 13:
- sub_80141B4(gWonderMailNoRoomText, 0, (u32 *)&gUnknown_203B2C0->faceFile, 0x10d);
+ sub_80141B4(gWonderMailNoRoomText, 0, &gUnknown_203B2C0->faceFile, 0x10d);
break;
case 14:
- sub_80141B4(gWonderMailErrorText, 0, (u32 *)&gUnknown_203B2C0->faceFile, 0x10d);
+ sub_80141B4(gWonderMailErrorText, 0, &gUnknown_203B2C0->faceFile, 0x10d);
break;
case 15:
- sub_80141B4(gWonderMailFriendErrorText, 0, (u32 *)&gUnknown_203B2C0->faceFile, 0x10d);
+ sub_80141B4(gWonderMailFriendErrorText, 0, &gUnknown_203B2C0->faceFile, 0x10d);
break;
default:
break;
@@ -774,22 +1389,22 @@ void sub_80293F4(void)
switch(sub_8039068(0x1C, (gUnknown_203B2C0->passwordBuffer), &temp.unk0))
{
case 17:
- sub_8014248(gWonderMailPasswordIncorrectText, 0, 8, gUnknown_80DDA48, 0, 4, 0, (u32 *)&gUnknown_203B2C0->faceFile, 0xC);
+ sub_8014248(gWonderMailPasswordIncorrectText, 0, 8, gUnknown_80DDA48, 0, 4, 0, &gUnknown_203B2C0->faceFile, 0xC);
sub_8028B04(40);
break;
case 18:
- sub_80141B4(gWonderMailSOSPasswordIncorrectText, 0, (u32 *)&gUnknown_203B2C0->faceFile, 0x10d);
+ sub_80141B4(gWonderMailSOSPasswordIncorrectText, 0, &gUnknown_203B2C0->faceFile, 0x10d);
sub_8028B04(7);
break;
case 7:
- sub_80141B4(gWonderMailDuplicateText, 0, (u32 *)&gUnknown_203B2C0->faceFile, 0x10d);
+ sub_80141B4(gWonderMailDuplicateText, 0, &gUnknown_203B2C0->faceFile, 0x10d);
sub_8028B04(7);
break;
case 22:
sub_8095274(temp.unk10);
temp.unk0 = 2; // Some sort of Ack?
sub_80951BC(&temp.unk0);
- sub_80141B4(gWonderMailAOKMailReceivedText, 0, (u32 *)&gUnknown_203B2C0->faceFile, 0x101);
+ sub_80141B4(gWonderMailAOKMailReceivedText, 0, &gUnknown_203B2C0->faceFile, 0x101);
sub_8028B04(35);
break;
case 23:
diff --git a/src/wonder_mail_2.c b/src/wonder_mail_2.c
index 285c0d0..21074d6 100644
--- a/src/wonder_mail_2.c
+++ b/src/wonder_mail_2.c
@@ -25,19 +25,7 @@ struct unkStruct_203B2C8
/* 0x13 */ u8 unk13;
/* 0x14 */ u8 teamName[4]; // Figure out size of this buffer
u8 fill18[0x114 - 0x18];
- u8 speciesName[0xA]; // holds species name
- u8 fill118[0x128 - 0x11E];
- u16 unk128;
- u8 unk12A;
- u8 unk12B;
- u32 unk12C;
- u8 unk130;
- u8 unk131;
- u8 unk132;
- u8 unk133;
- u8 unk134;
- u8 fill135[0x3];
- u32 unk138;
+ struct unkStruct_802F204 unk114;
u32 fill13C;
};
@@ -107,7 +95,7 @@ extern void sub_802B5FC(void);
extern void sub_802B624(void);
void ExpandPlaceholdersBuffer(u8 *buffer, const char *text, ...);
-extern void sub_802F204(u8 *, u32);
+extern void sub_802F204(struct unkStruct_802F204 *, u32);
extern void sub_803C37C(u8 *, u32, u8 *);
extern u32 sub_803C200(u8 *, u32);
extern void sub_80141B4(const char *r0, u32, struct OpenedFile **r1, u32);
@@ -233,19 +221,19 @@ void sub_802B3E0(void)
break;
case 1:
monName = GetMonSpecies(SPECIES_PELIPPER);
- strcpy(gUnknown_203B2C8->speciesName, monName);
- gUnknown_203B2C8->unk128 = 0x130;
- gUnknown_203B2C8->unk12A = 2;
- gUnknown_203B2C8->unk12C = 0;
+ strcpy(gUnknown_203B2C8->unk114.clientName, monName);
+ gUnknown_203B2C8->unk114.unk14 = SPECIES_PELIPPER;
+ gUnknown_203B2C8->unk114.unk16 = 2;
+ gUnknown_203B2C8->unk114.moneyReward = 0;
sub_8097790();
iVar3 = sub_8095228(gUnknown_203B2C8->unk1);
- sub_803C37C(&iVar3->unk4, 0, &gUnknown_203B2C8->unk130);
- gUnknown_203B2C8->unk138 = sub_803C200(&iVar3->unk4, 0);
- gUnknown_203B2C8->unk131 = 0;
- gUnknown_203B2C8->unk132 = 0;
- gUnknown_203B2C8->unk133 = 10;
- gUnknown_203B2C8->unk134 = 0;
- sub_802F204(gUnknown_203B2C8->speciesName, 0);
+ sub_803C37C(&iVar3->unk4, 0, gUnknown_203B2C8->unk114.itemRewards);
+ gUnknown_203B2C8->unk114.teamRankPtsReward = sub_803C200(&iVar3->unk4, 0);
+ gUnknown_203B2C8->unk114.itemRewards[1] = 0;
+ gUnknown_203B2C8->unk114.itemRewards[2] = 0;
+ gUnknown_203B2C8->unk114.numItems = 10;
+ gUnknown_203B2C8->unk114.friendAreaReward = 0;
+ sub_802F204(&gUnknown_203B2C8->unk114, 0);
break;
case 2:
// I hope you will keep on rescuing your friends
diff --git a/src/wonder_mail_3.c b/src/wonder_mail_3.c
index e318d26..6cc1e96 100644
--- a/src/wonder_mail_3.c
+++ b/src/wonder_mail_3.c
@@ -3,6 +3,15 @@
#include "text.h"
#include "input.h"
#include "menu.h"
+#include "constants/dungeon.h"
+#include "wonder_mail.h"
+
+struct unkSubStruct_203B2F8
+{
+ struct WonderMail wonderMail;
+ u8 *unk14;
+ u8 *unk18;
+};
struct unkStruct_203B2F8
{
@@ -13,12 +22,21 @@ struct unkStruct_203B2F8
u8 unk9;
u8 unkA;
u8 unkB;
- u32 unkC;
- u8 fill10[0x6C - 0x10];
+ struct unkSubStruct_203B2F8 *unkC;
+ u8 unk10;
+ u8 fill11[0x14 - 0x11];
+ u32 unk14;
+ u8 fill18[0x58 - 0x18];
+ u8 unk58;
+ u8 fill59[0x64 - 0x59];
+ u8 *unk64;
+ u32 unk68;
u32 unk6C;
u32 unk70;
u32 unk74;
- u8 fill78[0x118 - 0x78];
+ u8 unk78[0xC8 - 0x78];
+ u8 unkC8[4];
+ u8 fillCC[0x118 - 0xCC];
struct MenuItem unk118[8];
struct MenuItem unk158[8];
u16 unk198[8];
@@ -47,8 +65,44 @@ extern void sub_802DA84();
extern void sub_802D1B8();
extern void sub_802D2A8();
+extern u8 gUnknown_80E0010[];
+extern u8 gUnknown_80DFFA4[];
+extern u8 gUnknown_80DFF2C[];
+extern u8 gUnknown_80DFED0[];
+extern u8 gUnknown_80DFE9C[];
+extern u8 gUnknown_80DFE4C[];
+extern u8 gUnknown_80E0108[];
+extern u8 gUnknown_80E0094[];
+extern u8 gUnknown_80E0074[];
+
+extern u8 sub_80968B0(void *);
+extern u8 sub_8096F50(void *);
+extern u8 sub_802DAA8(void);
+extern u8 sub_802DADC(void);
+extern u8 *sub_8096DD8(void);
+extern u8 sub_8096C08(u8 *);
+extern void sub_802C750(void);
+extern s32 sub_80969AC(void);
+extern void sub_802D1A0(u32);
+extern void sub_8012EA4(u8 *, u32);
+extern void* sub_8096AB4(u8);
+extern void sub_803B35C(void *, u32*);
+extern void sub_802DE84(u32 *);
+extern void sub_802D73C(void);
+extern void sub_802C640(u32);
+extern void sub_802C4C8(u32, u32, u32);
+extern void sub_8097418(u32, u32);
+extern void sub_802D690(void);
+extern void sub_8096C80(void);
+extern void sub_8096D24(void);
+extern void sub_80141B4(u8 *, u32, u32, u32);
+extern void sub_8012D60(u8 *, struct MenuItem *, u32, u16 *, u32, u32);
+extern u8 *sub_8096DE8(void);
+extern void sub_8096A78(struct unkSubStruct_203B2F8 *);
+extern void sub_8014248(const char *text, u32, u32, struct MenuItem *r0, u32, u32, u32, u32, u32);
-u32 sub_802D098(u32 param_1)
+
+u32 sub_802D098(struct unkSubStruct_203B2F8 *param_1)
{
gUnknown_203B2F8 = MemoryAlloc(0x208,8);
gUnknown_203B2F8->unk6C = 0;
@@ -149,3 +203,133 @@ void sub_802D1B8(void)
ResetUnusedInputStruct();
sub_800641C(gUnknown_203B2F8->unk1A8, 1, 1);
}
+
+void sub_802D2A8(void)
+{
+
+ switch(gUnknown_203B2F8->state) {
+ case 0:
+ if (sub_80968B0(gUnknown_203B2F8->unkC) != 0) {
+ sub_802D1A0(3);
+ }
+ else
+ {
+ if (sub_8096F50(gUnknown_203B2F8->unkC) != 0) {
+ sub_802D1A0(4);
+ }
+ else
+ {
+ if ((gUnknown_203B2F8->unkC->wonderMail.unk2 == 4) && (sub_8096C08(&gUnknown_203B2F8->unk10) != 0)) {
+ if (sub_802DAA8() != 0) {
+ sub_802D1A0(9);
+ }
+ else {
+ sub_802D1A0(5);
+ }
+ }
+ else {
+ if (sub_80969AC() >= 8) {
+ if (sub_802DADC() != 0) {
+ sub_802D1A0(10);
+ }
+ else {
+ sub_802D1A0(6);
+ }
+ }
+ else
+ {
+ sub_802D1A0(8);
+ }
+ }
+ }
+ }
+ break;
+ case 1:
+ sub_802D73C();
+ sub_8014248(gUnknown_80DFE4C,0,gUnknown_203B2F8->unk70,gUnknown_203B2F8->unk158,0,4,0,0,0);
+ break;
+ case 3:
+ gUnknown_203B2F8->unk4 = 2;
+ sub_80141B4(gUnknown_80DFE9C,0,0,0x101);
+ break;
+ case 4:
+ gUnknown_203B2F8->unk4 = 2;
+ sub_80141B4(gUnknown_80DFED0,0,0,0x101);
+ break;
+ case 5:
+ gUnknown_203B2F8->unk4 = 2;
+ sub_80141B4(gUnknown_80DFF2C,0,0,0x101);
+ break;
+ case 6:
+ gUnknown_203B2F8->unk4 = 2;
+ sub_80141B4(gUnknown_80DFFA4,0,0,0x101);
+ break;
+ case 7:
+ gUnknown_203B2F8->unk4 = 0xc;
+ sub_80141B4(gUnknown_80E0010,0,0,0x101);
+ break;
+ case 8:
+ gUnknown_203B2F8->unk8 = 1;
+ sub_8096A78(gUnknown_203B2F8->unkC);
+ sub_8096C80();
+ sub_8096D24();
+ if (gUnknown_203B2F8->unkC->wonderMail.unk2 == 4) {
+ MemoryCopy8(sub_8096DD8(),gUnknown_203B2F8->unkC->unk14,0x28);
+ MemoryCopy8(sub_8096DE8(),gUnknown_203B2F8->unkC->unk18,0x78);
+ }
+ switch(gUnknown_203B2F8->unkC->wonderMail.dungeon)
+ {
+ // NOTE: subtract 1 from each of the case as the input??
+ case DUNGEON_ODDITY_CAVE: // 0x2B
+ sub_8097418(0x2A, 1);
+ break;
+ case DUNGEON_REMAINS_ISLAND:
+ sub_8097418(0x2B, 1);
+ break;
+ case DUNGEON_MARVELOUS_SEA:
+ sub_8097418(0x2C, 1);
+ break;
+ case DUNGEON_FANTASY_STRAIT: // 0x2E
+ sub_8097418(0x2D, 1);
+ break;
+ }
+ gUnknown_203B2F8->unk4 = 2;
+ sub_80141B4(gUnknown_80E0074,0,0,0x101);
+ break;
+ case 9:
+ sub_802D690();
+ sub_8014248(gUnknown_80E0094,0,gUnknown_203B2F8->unk74,gUnknown_203B2F8->unk158,0,4,0,0,0);
+ break;
+ case 10:
+ gUnknown_203B2F8->unk4 = 0xb;
+ sub_80141B4(gUnknown_80E0108,0,0,0x101);
+ break;
+ case 0xb:
+ sub_802C4C8(0,0,4);
+ break;
+ case 0xc:
+ sub_802C640(1);
+ break;
+ case 0xd:
+ sub_802C750();
+ sub_8012D60(gUnknown_203B2F8->unk78,gUnknown_203B2F8->unk118,0,gUnknown_203B2F8->unk198,
+ gUnknown_203B2F8->unk6C,2);
+ break;
+ case 0xe:
+ sub_802C750();
+ sub_8012EA4(gUnknown_203B2F8->unk78,0);
+ sub_8012D60(gUnknown_203B2F8->unkC8,gUnknown_203B2F8->unk158,0,0,4,3);
+ break;
+ case 0xf:
+ sub_803B35C(sub_8096AB4(gUnknown_203B2F8->unk10),&gUnknown_203B2F8->unk14);
+ gUnknown_203B2F8->unk14 = 3;
+ sub_802DE84(&gUnknown_203B2F8->unk14);
+ break;
+ case 0x10:
+ sub_803B35C(gUnknown_203B2F8->unkC,&gUnknown_203B2F8->unk14);
+ gUnknown_203B2F8->unk14 = 3;
+ gUnknown_203B2F8->unk58 = 0;
+ gUnknown_203B2F8->unk64 = gUnknown_203B2F8->unkC->unk18;
+ sub_802DE84(&gUnknown_203B2F8->unk14);
+ }
+}
diff --git a/src/wonder_mail_3_mid.c b/src/wonder_mail_3_mid.c
new file mode 100644
index 0000000..5661d44
--- /dev/null
+++ b/src/wonder_mail_3_mid.c
@@ -0,0 +1,772 @@
+#include "global.h"
+#include "memory.h"
+#include "text.h"
+#include "input.h"
+#include "wonder_mail.h"
+#include "menu.h"
+#include "pokemon.h"
+#include "rescue_team_info.h"
+#include "friend_area.h"
+#include "item.h"
+
+struct unkStruct_803B344
+{
+ // size: 0xB4
+ struct WonderMail unk0;
+ u8* unk14;
+ u8* unk18;
+ u8 fill1C[0x3C - 0x1C];
+ u8 unk3C[0x78];
+};
+
+extern struct unkStruct_803B344 *sub_803B344(u8);
+
+struct unkStruct_203B30C
+{
+ // size: 0x150
+ s32 state;
+ u8 unk4;
+ u8 unk5[3];
+ u32 unk8;
+ u8 fillC[0x4C - 0xC];
+ u8 unk4C;
+ u8 fill4D[0x58 - 0x4D];
+ u8 *unk58;
+ u32 unk5C;
+ u32 unk60;
+ u8 fill64[0xB0 - 0x64];
+ struct MenuItem unkB0[8];
+ struct UnkTextStruct2 unkF0[4];
+};
+extern struct unkStruct_203B30C *gUnknown_203B30C;
+
+struct unkStruct_203B310
+{
+ // size: 0x84
+ /* 0x0 */ u32 state;
+ u32 unk4;
+ u8 unk8;
+ /* 0x9 */ u8 currTeamRank; // team rank
+ u8 unkA;
+ u8 unkB;
+ /* 0xC */ s32 itemRewardIndex;
+ struct unkStruct_802F204 *unk10;
+ /* 0x14 */ struct OpenedFile *faceFile;
+ /* 0x18 */ u8 *faceData;
+ s16 unk1C;
+ s16 unk1E;
+ u8 unk20;
+ u8 unk21;
+ u8 unk22;
+ struct UnkTextStruct2 unk24[4];
+};
+extern struct unkStruct_203B310 *gUnknown_203B310;
+
+// TODO: port to ItemSlot
+struct ItemSlot_Alt
+{
+ // OG struct
+ // u8 itemFlags
+ // u8 numItems
+ // u8 itemIndex
+ union temp {
+ u8 itemFlags;
+ u8 numItems;
+ u8 itemIndex;
+ u32 full_bits;
+ } temp;
+};
+
+struct unkStruct_203B314
+{
+ // size: 0x15C
+ s16 unk0[2];
+ u8 fill4[0xB8 - 0x4];
+ u8 unkB8;
+ u8 unkB9;
+ u8 unkBA;
+ u8 unkBB;
+ u32 unkBC;
+ u8 fillC0[0xD4 - 0xC0];
+ s16 unkD4;
+ s16 unkD6;
+ s16 unkD8;
+ s16 unkDA;
+ s16 unkDC;
+ s16 unkDE;
+ u8 fillDF[0xF0 - 0xE0];
+ u32 unkF0;
+ struct UnkTextStruct2 *unkF4;
+ struct UnkTextStruct2 unkF8[4];
+ u8 unk158[4];
+};
+
+extern struct unkStruct_203B314 *gUnknown_203B314;
+extern struct UnkTextStruct2 gUnknown_80E072C;
+extern struct UnkTextStruct2 gUnknown_80E0714;
+extern struct UnkTextStruct2 gUnknown_80E06FC;
+
+extern u8 sub_802FCF0(u32);
+extern void sub_802F9C0(void);
+extern void sub_802FA50(void);
+extern void sub_8012D08(struct UnkTextStruct2 *, u32);
+extern void sub_8013818(u32 *, u32, u32, u32);
+extern u32 sub_802FBF4(void);
+extern void sub_8013878(u32 *, s32);
+
+extern void AddMenuCursorSprite(u32 *);
+extern void sub_8013984(u32 *);
+extern void sub_802F2E8(u32);
+extern void sub_802EFEC(u32);
+extern void sub_802F148(void);
+extern void sub_802F184(void);
+extern void sub_802F1E8(void);
+extern void sub_802F004();
+extern void sub_802F088();
+extern void sub_801B72C(void);
+extern u32 sub_801B6AC(void);
+extern void sub_802F108(void);
+extern s32 sub_80144A4(s32 *);
+extern void sub_8012CAC(struct UnkTextStruct2 *, struct MenuItem *);
+extern void sub_803B35C(void *, u32 *);
+extern void sub_802DE84(u32 *);
+extern void sub_8012D60(u32 *, struct MenuItem *, u32, u16 *, u32, u32);
+extern void sub_802CDD4(u32);
+extern void sub_802CED8(u32);
+extern void sub_802CFD0(void);
+extern u8 sub_802CEBC(void);
+extern u32 sub_802CE5C(u32);
+extern void sub_802CF14(void);
+extern u8 sub_8012FD8(u32 *r0);
+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 void sub_802F6FC(void);
+extern void sub_802F718(void);
+extern u8 sub_80138B8(u32 *, u32);
+extern void sub_8013660(u32 *);
+extern u32 GetKeyPress(u32 *);
+extern void PlayMenuSoundEffect(u32);
+extern void sub_802F300(void);
+extern void PlaySound(u32);
+extern s32 sub_808D544(u32);
+extern void sub_80141B4(u8 *, u32, struct OpenedFile **, u32);
+extern u32 sub_801B60C(u32, u8, u8);
+extern void sub_8092578(u8 *buffer, u8 index, u8 r2);
+void HandleMissionReward(void);
+
+extern struct UnkTextStruct2 gUnknown_80E03C4;
+extern struct UnkTextStruct2 gUnknown_80E03F4;
+extern struct UnkTextStruct2 gUnknown_80E041C;
+extern u8 gUnknown_80E0434[];
+extern u8 gUnknown_80E045C[];
+extern u8 gUnknown_80E0484[];
+extern u8 gUnknown_80E04F4[];
+extern u8 gUnknown_80E06A8[];
+extern u8 gUnknown_80E0670[];
+extern u8 gUnknown_80E05FC[];
+extern u8 gUnknown_80E04B4[];
+extern u8 gUnknown_80E05C0[];
+extern u8 gUnknown_80E0640[];
+
+extern u8 gUnknown_202E038[];
+extern u8 gUnknown_202E088[];
+extern u8 gUnknown_202E628[];
+extern u8 gUnknown_202DEA8[];
+extern u8 gUnknown_202E5D8[];
+extern u8 gAvailablePokemonNames[];
+extern u32 gUnknown_202DE30;
+extern const char gUnknown_80E040C[];
+extern const char *gUnknown_80D4970[];
+
+
+
+u32 sub_802EF48(void)
+{
+ gUnknown_203B30C = MemoryAlloc(sizeof(struct unkStruct_203B30C), 8);
+ sub_802EFEC(0);
+ return 1;
+}
+
+u32 sub_802EF6C(void)
+{
+ switch(gUnknown_203B30C->state)
+ {
+ case 0:
+ case 1:
+ sub_802F148();
+ break;
+ case 2:
+ sub_802F184();
+ break;
+ case 3:
+ sub_802F1E8();
+ break;
+ case 4:
+ return 3;
+ case 5:
+ default:
+ return 2;
+ }
+ return 0;
+}
+
+u8 sub_802EFC4(void)
+{
+ return gUnknown_203B30C->unk4;
+}
+
+void sub_802EFD0(void)
+{
+ if(gUnknown_203B30C != NULL)
+ {
+ MemoryFree(gUnknown_203B30C);
+ gUnknown_203B30C = NULL;
+ }
+}
+
+void sub_802EFEC(u32 newState)
+{
+ gUnknown_203B30C->state = newState;
+ sub_802F004();
+ sub_802F088();
+}
+
+void sub_802F004(void)
+{
+ s32 iVar3;
+
+ sub_8006518(gUnknown_203B30C->unkF0);
+ switch(gUnknown_203B30C->state)
+ {
+ case 2:
+ sub_802F108();
+ gUnknown_203B30C->unkF0[2] = gUnknown_80E03F4;
+ sub_8012CAC(&gUnknown_203B30C->unkF0[2], gUnknown_203B30C->unkB0);
+ break;
+ default:
+ for(iVar3 = 0; iVar3 < 4; iVar3++)
+ {
+ gUnknown_203B30C->unkF0[iVar3] = gUnknown_80E03C4;
+ }
+ }
+ ResetUnusedInputStruct();
+ sub_800641C(gUnknown_203B30C->unkF0, 1, 1);
+}
+
+void sub_802F088(void)
+{
+ struct unkStruct_803B344 *temp;
+
+ switch(gUnknown_203B30C->state)
+ {
+ case 0:
+ sub_802CDD4(0);
+ break;
+ case 1:
+ sub_802CED8(1);
+ break;
+ case 2:
+ sub_802CFD0();
+ sub_8012D60(&gUnknown_203B30C->unk60, gUnknown_203B30C->unkB0, 0, 0, 3, 2);
+ break;
+ case 3:
+ temp = sub_803B344(gUnknown_203B30C->unk4);
+ sub_803B35C(temp, &gUnknown_203B30C->unk8);
+ gUnknown_203B30C->unk8 = 3;
+ gUnknown_203B30C->unk4C = 0;
+ gUnknown_203B30C->unk58 = temp->unk18;
+ sub_802DE84(&gUnknown_203B30C->unk8);
+ }
+}
+
+void sub_802F108(void)
+{
+ struct unkStruct_203B30C *preload;
+ const char *blankText;
+ s32 action_1;
+
+ preload = gUnknown_203B30C;
+ blankText = NULL;
+ preload->unkB0[0].text = gUnknown_80E040C;
+ preload->unkB0[0].menuAction = 2;
+ action_1 = 1;
+ preload->unkB0[1].text = *gUnknown_80D4970;
+ preload->unkB0[1].menuAction = 3;
+ preload->unkB0[2].text = blankText;
+ preload->unkB0[2].menuAction = action_1;
+}
+
+void sub_802F148(void)
+{
+ switch(sub_802CE5C(1))
+ {
+ case 0:
+ case 1:
+ break;
+ case 3:
+ gUnknown_203B30C->unk4 = sub_802CEBC();
+ sub_802EFEC(2);
+ break;
+ case 2:
+ sub_802CF14();
+ sub_802EFEC(5);
+ break;
+ }
+}
+
+void sub_802F184(void)
+{
+ s32 menuAction;
+
+ menuAction = 0;
+ sub_802CE5C(0);
+
+ if (sub_8012FD8(&gUnknown_203B30C->unk60) == 0) {
+ sub_8013114(&gUnknown_203B30C->unk60, &menuAction);
+ }
+
+ switch(menuAction)
+ {
+ case 2:
+ sub_802CF14();
+ sub_802EFEC(4);
+ break;
+ case 3:
+ sub_802EFEC(3);
+ break;
+ case 1:
+ sub_802EFEC(1);
+ break;
+ }
+}
+
+void sub_802F1E8(void)
+{
+ switch(sub_802DEE0())
+ {
+ case 2:
+ case 3:
+ sub_802DF24();
+ sub_802EFEC(1);
+ break;
+ case 0:
+ case 1:
+ break;
+ }
+}
+
+
+
+u32 sub_802F204(struct unkStruct_802F204 *r0, u8 r1)
+{
+ struct unkStruct_203B310 *preload;
+
+ ResetUnusedInputStruct();
+ sub_800641C(0, 1, 1);
+ gUnknown_203B310 = MemoryAlloc(sizeof(struct unkStruct_203B310), 8);
+ gUnknown_203B310->unk10 = r0;
+ gUnknown_203B310->itemRewardIndex = 0;
+ gUnknown_203B310->unk8 = r1;
+
+ // NOTE: dumb var to get correct ordering
+ preload = gUnknown_203B310;
+ strcpy(gUnknown_202E5D8, preload->unk10->clientName);
+ sub_808DA34(gAvailablePokemonNames, sub_808D33C());
+
+ gUnknown_203B310->faceFile = GetDialogueSpriteDataPtr(gUnknown_203B310->unk10->unk14);
+ gUnknown_203B310->faceData = NULL;
+
+ gUnknown_203B310->unk20 = 0;
+ gUnknown_203B310->unk21 = 0;
+ gUnknown_203B310->unk22 = 0;
+ gUnknown_203B310->unk1C = 2;
+ gUnknown_203B310->unk1E = 8;
+
+ if(gUnknown_203B310->faceFile != NULL)
+ {
+ gUnknown_203B310->faceData = gUnknown_203B310->faceFile->data;
+ }
+
+ sub_802F2E8(0);
+ return 1;
+}
+
+u32 sub_802F298(void)
+{
+ switch(gUnknown_203B310->state)
+ {
+ case 9:
+ return 3;
+ case 5:
+ sub_802F6FC();
+ return 0;
+ default:
+ sub_802F718();
+ return 0;
+ }
+}
+
+void sub_802F2C0(void)
+{
+ if(gUnknown_203B310 != NULL)
+ {
+ if(gUnknown_203B310->faceFile != 0)
+ CloseFile(gUnknown_203B310->faceFile);
+ MemoryFree(gUnknown_203B310);
+ gUnknown_203B310 = NULL;
+ }
+}
+
+void sub_802F2E8(u32 newState)
+{
+ gUnknown_203B310->state = newState;
+ sub_802F300();
+ HandleMissionReward();
+}
+
+void sub_802F300(void)
+{
+ s32 iVar3;
+ switch(gUnknown_203B310->state)
+ {
+ case 0:
+ sub_8006518(gUnknown_203B310->unk24);
+ for(iVar3 = 0; iVar3 < 4; iVar3++)
+ {
+ gUnknown_203B310->unk24[iVar3] = gUnknown_80E041C;
+ }
+ ResetUnusedInputStruct();
+ sub_800641C(gUnknown_203B310->unk24, 1, 1);
+ default:
+ break;
+ }
+}
+
+void HandleMissionReward(void)
+{
+ int moneyReward;
+ const char *rankString;
+ u8 uVar7;
+ struct unkStruct_8090F58 local_20;
+ struct ItemSlot_Alt local_14;
+ u32 numItems;
+ u32 index_cast;
+ u32 index_cast2;
+
+ switch(gUnknown_203B310->state) {
+ case 0:
+ // Reward intro..
+ moneyReward = gUnknown_203B310->unk10->moneyReward;
+ if (moneyReward == 0) {
+ sub_802F2E8(2);
+ }
+ else {
+ gUnknown_202DE30 = moneyReward;
+ if (gUnknown_203B310->unk8 != '\0') {
+ sub_80141B4(gUnknown_80E0434,0,&gUnknown_203B310->faceFile,0x10d);
+ gUnknown_203B310->unk4 = 1;
+ }
+ else {
+ sub_802F2E8(1);
+ }
+ }
+ break;
+ case 1:
+ PlaySound(0xcb);
+ AddToTeamMoney(gUnknown_203B310->unk10->moneyReward);
+ if (sub_808D544(0) < 2) {
+ sub_80141B4(gUnknown_80E045C,0,0,0x101);
+ }
+ else {
+ sub_80141B4(gUnknown_80E0484,0,0,0x101);
+ }
+ gUnknown_203B310->unk4 = 2;
+ break;
+ case 2:
+ if (gUnknown_203B310->unk10->friendAreaReward == '\0') {
+ // No friend area reward.. go to item reward
+ sub_802F2E8(4);
+ }
+ else {
+ sub_8092578(gUnknown_202E628,gUnknown_203B310->unk10->friendAreaReward,0);
+ if (gUnknown_203B310->unk8 != '\0') {
+ sub_80141B4(gUnknown_80E04B4,0,&gUnknown_203B310->faceFile,0x10d);
+ gUnknown_203B310->unk4 = 3;
+ }
+ else {
+ sub_802F2E8(3);
+ }
+ }
+ break;
+ case 3:
+ // Friend area reward
+ if (GetFriendAreaStatus(gUnknown_203B310->unk10->friendAreaReward)) {
+ // We already have the friend area
+ AddToTeamMoney(1000);
+ sub_80141B4(gUnknown_80E04F4,0,0,0x101);
+ }
+ else
+ {
+ if (sub_808D544(0) < 2) {
+ UnlockFriendArea(gUnknown_203B310->unk10->friendAreaReward);
+ PlaySound(0xce);
+ sub_80141B4(gUnknown_80E05C0,0,0,0x101);
+ }
+ else
+ {
+ UnlockFriendArea(gUnknown_203B310->unk10->friendAreaReward);
+ PlaySound(0xce);
+ sub_80141B4(gUnknown_80E05FC,0,0,0x101);
+ }
+ }
+ gUnknown_203B310->unk4 = 4;
+ break;
+ case 4:
+ uVar7 = gUnknown_203B310->unk10->itemRewards[0];
+ if (uVar7 != 0)
+ {
+ if (gUnknown_203B310->unk10->moneyReward == 0) {
+
+ // Cast ItemIndex
+ index_cast = uVar7 << 16;
+ local_14.temp.full_bits = (local_14.temp.full_bits & 0xff00ffff) | index_cast;
+
+ index_cast2 = local_14.temp.full_bits >> 16;
+ if (IsThrowableItem(index_cast2)) {
+ // Cast number items
+ numItems = (gUnknown_203B310->unk10->numItems << 8);
+ local_14.temp.full_bits = (local_14.temp.full_bits & 0xffff00ff) | numItems;
+ }
+ else {
+ local_14.temp.full_bits = (local_14.temp.full_bits & 0xffff00ff) | 0;
+ }
+ local_14.temp.full_bits = (local_14.temp.full_bits & 0xffffff00) | ITEM_FLAG_EXISTS;
+ local_20.unk0 = 0;
+ local_20.unk4 = 0;
+ local_20.unk8 = 1;
+ sub_8090E14(gUnknown_202DEA8,(struct ItemSlot *)&local_14,&local_20);
+ if (gUnknown_203B310->unk8 != '\0') {
+ sub_80141B4(gUnknown_80E0640,0,&gUnknown_203B310->faceFile,0x10d);
+ gUnknown_203B310->unk4 = 5;
+ }
+ else
+ {
+ sub_802F2E8(5);
+ }
+ }
+ else
+ {
+ sub_802F2E8(5);
+ }
+ }
+ else
+ sub_802F2E8(7);
+ break;
+ case 5:
+ // Item reward
+ if ((gUnknown_203B310->unk10->itemRewards[gUnknown_203B310->itemRewardIndex]) == 0) {
+ // No item in this reward slot
+ sub_802F2E8(6);
+ }
+ else {
+ if ((gUnknown_203B310->itemRewardIndex == 0) && (gUnknown_203B310->unk10->moneyReward == 0)) {
+ sub_801B60C(0,gUnknown_203B310->unk10->itemRewards[0],gUnknown_203B310->unk10->numItems);
+ }
+ else {
+ sub_801B60C(1,gUnknown_203B310->unk10->itemRewards[gUnknown_203B310->itemRewardIndex],gUnknown_203B310->unk10->numItems);
+ }
+ }
+ break;
+ case 6:
+ // Increase item reward slot index
+ gUnknown_203B310->itemRewardIndex++;
+ if(gUnknown_203B310->itemRewardIndex < MAX_ITEM_REWARDS)
+ sub_802F2E8(5);
+ else
+ // No more items to check... move to give points
+ sub_802F2E8(7);
+ break;
+ case 7:
+ if (gUnknown_203B310->unk10->teamRankPtsReward == 0) {
+ // No pnts to reward
+ sub_802F2E8(9);
+ }
+ else {
+ gUnknown_203B310->currTeamRank = GetRescueTeamRank();
+ AddToTeamRankPts(gUnknown_203B310->unk10->teamRankPtsReward);
+ PlaySound(0xcb);
+ if (gUnknown_203B310->currTeamRank != GetRescueTeamRank()) {
+ // Rank up time
+ gUnknown_203B310->unk4 = 8;
+ }
+ else {
+ // No rank up.. close out
+ gUnknown_203B310->unk4 = 9;
+ }
+ gUnknown_202DE30 = gUnknown_203B310->unk10->teamRankPtsReward;
+ sub_80141B4(gUnknown_80E0670,0,0,0x101);
+ }
+ break;
+ case 8:
+ // Rank up
+ PlaySound(0xc9);
+ gUnknown_203B310->unk4 = 9;
+ rankString = GetTeamRankString(gUnknown_203B310->currTeamRank);
+ strcpy(gUnknown_202E038,rankString);
+ rankString = GetTeamRankString(GetRescueTeamRank());
+ strcpy(gUnknown_202E038 + 0x50,rankString);
+ sub_80141B4(gUnknown_80E06A8,0,0,0x101);
+ break;
+ case 9:
+ break;
+ }
+}
+
+void sub_802F6FC(void)
+{
+ switch(sub_801B6AC())
+ {
+ case 2:
+ case 3:
+ sub_801B72C();
+ sub_802F2E8(6);
+ break;
+ case 0:
+ case 1:
+ break;
+ }
+}
+
+void sub_802F718(void)
+{
+ s32 temp;
+
+ if (sub_80144A4(&temp) == 0) {
+ sub_802F2E8(gUnknown_203B310->unk4);
+ }
+}
+
+u32 sub_802F73C(u32 r0, struct UnkTextStruct2_sub *r1, u32 r2, u8 r3)
+{
+ if(sub_802FCF0(r0))
+ {
+ return 0;
+ }
+ else
+ {
+ if(gUnknown_203B314 == NULL)
+ gUnknown_203B314 = MemoryAlloc(sizeof(struct unkStruct_203B314), 0x8);
+ gUnknown_203B314->unkB8 = r3;
+ gUnknown_203B314->unkF0 = r0;
+ gUnknown_203B314->unkF4 = &gUnknown_203B314->unkF8[gUnknown_203B314->unkF0];
+ sub_8006518(gUnknown_203B314->unkF8);
+ if(r3 != 0)
+ {
+ gUnknown_203B314->unkF8[gUnknown_203B314->unkF0] = gUnknown_80E072C;
+ }
+ else
+ {
+ gUnknown_203B314->unkF8[gUnknown_203B314->unkF0] = gUnknown_80E0714;
+ }
+
+ gUnknown_203B314->unkF4->unk14 = gUnknown_203B314->unk158;
+ if(r1 != 0)
+ {
+ gUnknown_203B314->unkF8[gUnknown_203B314->unkF0].unk08 = *r1;
+ }
+
+ sub_8012D08(gUnknown_203B314->unkF4, r2);
+ ResetUnusedInputStruct();
+ sub_800641C(gUnknown_203B314->unkF8, 1, 1);
+ sub_8013818(&gUnknown_203B314->unkBC, sub_802FBF4(), r2, r0);
+ sub_802F9C0();
+ sub_802FA50();
+ return 1;
+ }
+}
+
+u32 sub_802F848(s16 param_1)
+{
+ int iVar2;
+ s32 param_1_32;
+
+ param_1_32 = param_1; // cast needed
+
+ for( iVar2 = 0; iVar2 < gUnknown_203B314->unkDE; iVar2++ ) {
+ if (gUnknown_203B314->unk0[iVar2] == param_1_32) {
+ sub_8013878(&gUnknown_203B314->unkBC,iVar2);
+ sub_802F9C0();
+ sub_802FA50();
+ return 1;
+ }
+ }
+ sub_8013878(&gUnknown_203B314->unkBC,0);
+ return 0;
+}
+
+u32 sub_802F8A0(u8 r0)
+{
+ if(r0 == 0)
+ {
+ sub_8013660(&gUnknown_203B314->unkBC);
+ return 0;
+ }
+ else
+ {
+ switch(GetKeyPress(&gUnknown_203B314->unkBC))
+ {
+ case 2:
+ PlayMenuSoundEffect(1);
+ return 2;
+ case 1:
+ PlayMenuSoundEffect(0);
+ return 3;
+ default:
+ if(sub_80138B8(&gUnknown_203B314->unkBC, 1) != 0)
+ {
+ sub_802F9C0();
+ sub_802FA50();
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+ }
+ }
+}
+
+s16 sub_802F90C(void)
+{
+ return gUnknown_203B314->unk0[(gUnknown_203B314->unkDA * gUnknown_203B314->unkD8) + gUnknown_203B314->unkD4];
+}
+
+void sub_802F938(u32 r0)
+{
+ u8 r0_u8;
+
+ r0_u8 = r0;
+
+ gUnknown_203B314->unkDE = sub_802FBF4();
+ sub_8013984(&gUnknown_203B314->unkBC);
+ sub_802F9C0();
+ sub_802FA50();
+
+ if(r0_u8 != 0)
+ AddMenuCursorSprite(&gUnknown_203B314->unkBC);
+}
+
+void sub_802F974(void)
+{
+ if(gUnknown_203B314 != NULL)
+ {
+ gUnknown_203B314->unkF8[gUnknown_203B314->unkF0] = gUnknown_80E06FC;
+ ResetUnusedInputStruct();
+ sub_800641C(gUnknown_203B314->unkF8, 1, 1);
+ MemoryFree(gUnknown_203B314);
+ gUnknown_203B314 = NULL;
+ }
+}
diff --git a/src/wonder_mail_4.c b/src/wonder_mail_4.c
new file mode 100644
index 0000000..873daf4
--- /dev/null
+++ b/src/wonder_mail_4.c
@@ -0,0 +1,137 @@
+#include "global.h"
+#include "text.h"
+#include "input.h"
+#include "memory.h"
+
+struct unkStruct_203B320
+{
+ // size: 0xC4
+ u8 unk0[4];
+ u8 fill4[0x20 - 4];
+ u32 unk20;
+ u8 fill24[0x3C - 0x24];
+ s16 unk3C;
+ s16 unk3E;
+ s16 unk40;
+ s16 unk42;
+ s16 unk44;
+ s16 unk46;
+ u8 fill48[0x58 - 0x48];
+ u32 unk58;
+ struct UnkTextStruct2 *unk5C;
+ struct UnkTextStruct2 unk60[4];
+ u8 unkC0[4];
+};
+extern struct unkStruct_203B320 *gUnknown_203B320;
+extern struct UnkTextStruct2 gUnknown_80E083C;
+extern struct UnkTextStruct2 gUnknown_80E0854;
+
+extern u8 sub_8030C20(u32);
+extern s32 sub_8030A74(void);
+extern void sub_80308A0(void);
+extern void sub_803092C(void);
+extern void sub_8012D08(struct UnkTextStruct2 *, s32);
+extern void sub_8013818(void *, u32, u32, u32);
+
+extern u8 sub_80138B8(u8 *, u32);
+extern void sub_8013660(u8 *);
+extern s32 GetKeyPress(u8 *);
+extern void PlayMenuSoundEffect(u32);
+extern void sub_8013984(u8 *);
+extern void AddMenuCursorSprite(u8 *);
+
+u32 sub_80306A8(u32 r0, u32 r1, struct UnkTextStruct2_sub *r2, u32 r3)
+{
+ if(sub_8030C20(r0))
+ return 0;
+ gUnknown_203B320 = MemoryAlloc(sizeof(struct unkStruct_203B320), 0x8);
+ gUnknown_203B320->unk20 = r0;
+ gUnknown_203B320->unk58 = r1;
+
+ gUnknown_203B320->unk5C = &gUnknown_203B320->unk60[gUnknown_203B320->unk58];
+ sub_8006518(gUnknown_203B320->unk60);
+
+ gUnknown_203B320->unk60[gUnknown_203B320->unk58] = gUnknown_80E0854;
+ gUnknown_203B320->unk5C->unk14 = gUnknown_203B320->unkC0;
+
+ if(r2 != 0)
+ {
+ gUnknown_203B320->unk60[gUnknown_203B320->unk58].unk08 = *r2;
+ }
+
+
+ sub_8012D08(gUnknown_203B320->unk5C, r3);
+ ResetUnusedInputStruct();
+ sub_800641C(gUnknown_203B320->unk60, 1, 1);
+ sub_8013818(gUnknown_203B320->fill24, sub_8030A74(), r3, r1);
+ sub_80308A0();
+ sub_803092C();
+ return 1;
+}
+
+u32 sub_8030768(u8 r0)
+{
+ if(r0 == 0)
+ {
+ sub_8013660(gUnknown_203B320->fill24);
+ return 0;
+ }
+ switch(GetKeyPress(gUnknown_203B320->fill24))
+ {
+ case 4:
+ PlayMenuSoundEffect(4);
+ return 4;
+ case 2:
+ PlayMenuSoundEffect(1);
+ return 2;
+ case 1:
+ PlayMenuSoundEffect(0);
+ return 3;
+ default:
+ if(sub_80138B8(gUnknown_203B320->fill24, 1) != 0)
+ {
+ sub_80308A0();
+ sub_803092C();
+ return 1;
+ }
+ else
+ return 0;
+ }
+}
+
+u8 sub_80307EC(void)
+{
+ return gUnknown_203B320->unk0[(gUnknown_203B320->unk42 * gUnknown_203B320->unk40) + gUnknown_203B320->unk3C];
+}
+
+void sub_8030810(u32 r0)
+{
+ u8 r0_u8;
+
+ r0_u8 = r0; // cast needed..
+
+ gUnknown_203B320->unk46 = sub_8030A74();
+ sub_8013984(gUnknown_203B320->fill24);
+
+ sub_80308A0();
+ sub_803092C();
+ if(r0_u8 != 0)
+ AddMenuCursorSprite(gUnknown_203B320->fill24);
+}
+
+void sub_803084C()
+{
+ if(gUnknown_203B320 != NULL)
+ {
+ gUnknown_203B320->unk60[gUnknown_203B320->unk58] = gUnknown_80E083C;
+ ResetUnusedInputStruct();
+ sub_800641C(gUnknown_203B320->unk60, 1, 1);
+ MemoryFree(gUnknown_203B320);
+ gUnknown_203B320 = NULL;
+ }
+}
+
+u8 *sub_8030894()
+{
+ return gUnknown_203B320->unk0;
+}
diff --git a/src/wonder_mail_pre.c b/src/wonder_mail_pre.c
deleted file mode 100644
index 34cbaea..0000000
--- a/src/wonder_mail_pre.c
+++ /dev/null
@@ -1,305 +0,0 @@
-#include "global.h"
-#include "file_system.h"
-#include "input.h"
-#include "pokemon.h"
-#include "sub_8095228.h"
-#include "wonder_mail.h"
-#include "memory.h"
-
-
-extern struct WonderMailStruct_203B2C0 *gUnknown_203B2C0;
-extern char gUnknown_202E5D8[0x50];
-extern char gAvailablePokemonNames[0x50];
-
-extern void sub_8029B34(void);
-extern void sub_8029AD8(void);
-extern void sub_8029AF4(void);
-extern void sub_8029A88(void);
-extern void sub_8029AB0(void);
-extern void sub_80297B8(void);
-extern void sub_80297D4(void);
-extern void sub_8029884(void);
-extern void sub_8029944(void);
-extern void sub_80299AC(void);
-extern void sub_80299D8(void);
-extern void sub_8029A6C(void);
-extern void sub_8028CE0(void);
-extern void sub_8028BF0(void);
-extern void sub_8029A18(void);
-extern void sub_80295A8(void);
-extern void sub_8029668(void);
-extern void sub_8029684(void);
-extern void sub_8029740(void);
-extern void sub_80295D8(void);
-extern void sub_802979C(void);
-extern void sub_8029358(void);
-extern void sub_8029374(void);
-extern void sub_802939C(void);
-extern void sub_8028F58(void);
-extern void sub_8028F30(void);
-extern void sub_8028F04(void);
-extern void sub_8028ED4(void);
-extern void sub_80293D8(void);
-extern void sub_80293F4(void);
-extern void sub_8028DE8(u32);
-extern void sub_8028EAC(void);
-extern void sub_802955C(void);
-extern void sub_80292A4(void);
-extern void sub_80292EC(void);
-extern void sub_802933C(void);
-extern void sub_802958C(void);
-extern void sub_8029208(void);
-extern void sub_8028E84(void);
-extern void sub_8028F80(void);
-extern void sub_8028FC0(void);
-extern void sub_8028FDC(void);
-extern void sub_8028E54(void);
-extern void sub_8028E24(void);
-extern void sub_8028E08(void);
-extern void sub_80290D4(void);
-extern void sub_80290F0(void);
-extern void sub_80291AC(void);
-extern void sub_8029044(void);
-extern void sub_8028CFC(void);
-extern void sub_8028D4C(void);
-extern void sub_8031E10(void);
-extern void sub_8023C60(void);
-extern void sub_803084C(void);
-extern void sub_80155F0(void);
-extern void sub_80310B4(void);
-extern void sub_8030DE4(void);
-extern void sub_802453C(void);
-
-u32 sub_8027F88(void)
-{
- char *monName;
- struct OpenedFile *faceFile;
- s32 counter;
-
- ResetUnusedInputStruct();
- sub_800641C(0, 1, 1);
- gUnknown_203B2C0 = MemoryAlloc(sizeof(struct WonderMailStruct_203B2C0), 8);
- MemoryFill8((u8 *)gUnknown_203B2C0, 0, sizeof(struct WonderMailStruct_203B2C0));
- gUnknown_203B2C0->unk53C = 0;
- gUnknown_203B2C0->unk218 = -1;
- gUnknown_203B2C0->unk544 = -1;
- CopyYellowSpeciesNametoBuffer(gUnknown_202E5D8, SPECIES_PELIPPER);
- monName = GetMonSpecies(SPECIES_PELIPPER);
- strcpy(gAvailablePokemonNames, monName);
- faceFile = GetDialogueSpriteDataPtr(SPECIES_PELIPPER);
- gUnknown_203B2C0->faceFile = faceFile;
- gUnknown_203B2C0->faceData = faceFile->data;
- gUnknown_203B2C0->unk42C = 0;
- gUnknown_203B2C0->unk42D = 0;
- gUnknown_203B2C0->unk42E = 0;
- gUnknown_203B2C0->unk428 = 2;
- gUnknown_203B2C0->unk42A = 8;
- for(counter = 0; counter < PASSWORD_BUFFER_SIZE; counter++){
- gUnknown_203B2C0->passwordBuffer[counter] = 0;
- }
- gUnknown_203B2C0->unk0 = 0x3D;
- sub_8028B04(0); // Set initial state to 0?
- return 1;
-}
-
-u32 sub_8028078(void)
-{
-
- switch(gUnknown_203B2C0->state) {
- case 0x3c:
- sub_8029B34();
- break;
- case 0x3a:
- sub_8029AD8();
- break;
- case 0x3b:
- sub_8029AF4();
- break;
- case 0x38:
- sub_8029A88();
- break;
- case 0x37:
- sub_8029AB0();
- break;
- case 0x32:
- sub_80297B8();
- break;
- case 0x33:
- sub_80297D4();
- break;
- case 0x34:
- sub_8029884();
- break;
- case 0x35:
- sub_8029944();
- break;
- case 0x31:
- sub_80299AC();
- break;
- case 0x36:
- sub_80299D8();
- break;
- case 0x30:
- sub_8029A6C();
- break;
- case 0x2e:
- sub_8029A18();
- break;
- case 0x2d:
- sub_80295A8();
- break;
- case 0x29:
- sub_8029668();
- break;
- case 0x2b:
- sub_8029684();
- break;
- case 0x2c:
- sub_8029740();
- break;
- case 0x2a:
- sub_80295D8();
- break;
- case 0x2f:
- sub_802979C();
- break;
- case 9:
- sub_8029358();
- break;
- case 0x23:
- sub_8029374();
- break;
- case 0x24:
- sub_802939C();
- break;
- case 0x26:
- sub_80293D8();
- break;
- case 0x27:
- sub_80293F4();
- break;
- case 0x28:
- sub_802955C();
- break;
- case 4:
- sub_80292A4();
- break;
- case 6:
- sub_80292EC();
- break;
- case 7:
- sub_802933C();
- break;
- case 5:
- sub_802958C();
- break;
- case 8:
- sub_8029208();
- break;
- case 0x1a:
- sub_8028DE8(1);
- break;
- case 0x1b:
- sub_8028F80();
- break;
- case 0x1c:
- case 0x1d:
- sub_8028FC0();
- break;
- case 0x22:
- sub_8028FDC();
- break;
- case 0x1e:
- sub_80290D4();
- break;
- case 0x20:
- sub_80290F0();
- break;
- case 0x21:
- sub_80291AC();
- break;
- case 0x1f:
- sub_8029044();
- break;
- case 10:
- sub_8028CFC();
- break;
- case 0xb:
- sub_8028D4C();
- break;
- case 0xd:
- case 0xf:
- sub_8028DE8(10);
- break;
- case 0x11:
- sub_8028E08();
- break;
- case 0xc:
- case 0xe:
- case 0x10:
- sub_8028DE8(0x19);
- break;
- case 0x12:
- sub_8028E24();
- break;
- case 0x13:
- sub_8028E54();
- break;
- case 0x17:
- sub_8028E84();
- break;
- case 0x18:
- sub_8028EAC();
- break;
- case 0x19:
- sub_8028ED4();
- break;
- case 0x14:
- sub_8028F04();
- break;
- case 0x15:
- sub_8028F30();
- break;
- case 0x16:
- sub_8028F58();
- break;
- case 0:
- case 1:
- sub_8028BF0();
- break;
- case 2:
- case 0x25:
- case 0x39:
- sub_8028CE0();
- break;
- case 3:
- return 3;
- }
- return 0;
-}
-
-s32 sub_80282DC(u8 *r0)
-{
- *r0 = gUnknown_203B2C0->unk218;
- return gUnknown_203B2C0->unk53C;
-}
-
-void sub_80282FC(void)
-{
- if (gUnknown_203B2C0 != NULL) {
- CloseFile(gUnknown_203B2C0->faceFile);
- MemoryFree(gUnknown_203B2C0);
- gUnknown_203B2C0 = NULL;
- sub_8031E10();
- sub_8023C60();
- sub_803084C();
- sub_80155F0();
- sub_80310B4();
- sub_8030DE4();
- sub_802453C();
- }
-}
-
-void nullsub_130(void)
-{
-}