summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSeth Barberee <seth.barberee@gmail.com>2021-03-23 12:11:10 -0500
committerGitHub <noreply@github.com>2021-03-23 12:11:10 -0500
commit2fd4f339b42c010191c199772b09ac34c580de94 (patch)
treee562899f35861ece70c292602fe6aac2f50906bf /src
parent7b142311a7294c4c7a943870fa5f24f0fbea604a (diff)
Miscellaneous Work (Again) (#31)
* move some personality data from asm to C * combine personality_test files and add my close attempt at RedrawPartnerSelectionMenu * decomp some more wonder mail funcs and label some more data * lots of data splitting and move some to src * split out more dungeon data * continue splitting out more dungeon data * doc rescue team rank/pts funcs/data and exclusive pokemon ewram * doc more sound things and decomp a func * decomp LoadTeamRankBadge and label some data members * split out rescue team and text util stuff * forgot a constant * match a few funcs and clean up a few * cleaned up sub_80A28B4
Diffstat (limited to 'src')
-rw-r--r--src/code_2.c4
-rw-r--r--src/code_80118A4.c16
-rw-r--r--src/code_801D760.c102
-rw-r--r--src/code_803D0D8.c25
-rw-r--r--src/code_8040094.c46
-rw-r--r--src/code_809017C.c322
-rw-r--r--src/code_8098BDC.c4
-rw-r--r--src/code_80A26CC.c112
-rw-r--r--src/data/nature_description.h232
-rw-r--r--src/data/unformatted_type_names.h18
-rw-r--r--src/data/wonder_mail_1.h141
-rw-r--r--src/debug.c6
-rw-r--r--src/exclusive_pokemon.c42
-rw-r--r--src/friend_area.c3
-rw-r--r--src/music.c4
-rw-r--r--src/music_pre.c28
-rw-r--r--src/personality_test.c978
-rw-r--r--src/personality_test_pre.c768
-rw-r--r--src/rescue_team_info.c175
-rw-r--r--src/save.c62
-rw-r--r--src/text_util.c148
-rw-r--r--src/wonder_mail.c106
-rw-r--r--src/wonder_mail_main_menu_pre.c433
-rw-r--r--src/wonder_mail_mid.c53
24 files changed, 2472 insertions, 1356 deletions
diff --git a/src/code_2.c b/src/code_2.c
index 2b42b58..3cc18e9 100644
--- a/src/code_2.c
+++ b/src/code_2.c
@@ -19,7 +19,7 @@ extern void sub_8094980(void);
extern void sub_8094C14(void);
extern void LoadExclusivePokemon(void);
extern void LoadItemParameters(void);
-extern void sub_809207C(void);
+extern void LoadRescueTeamInfo(void);
extern void LoadWazaParameters(void);
extern void sub_80950BC(void);
extern void sub_80958E8(void);
@@ -97,7 +97,7 @@ void GameLoop(void)
LoadExclusivePokemon();
LoadFriendAreas();
LoadItemParameters();
- sub_809207C();
+ LoadRescueTeamInfo();
LoadWazaParameters();
sub_80950BC();
sub_80958E8();
diff --git a/src/code_80118A4.c b/src/code_80118A4.c
index e8c4aad..a427dea 100644
--- a/src/code_80118A4.c
+++ b/src/code_80118A4.c
@@ -35,8 +35,8 @@ struct UnkBgStruct
u8 padding2[0x17A];
u32 *unk4dcc;
u32 unk4dd0;
- s16 unk4dd4;
- s16 unk4dd6;
+ s16 xoffset;
+ s16 yoffset;
};
extern struct UnkBgStruct *gUnknown_203B0E4;
@@ -68,8 +68,8 @@ void sub_801169C(void)
{
u8 return_var;
- SetBG2RegOffsets(gUnknown_203B0E4->unk4dd4, gUnknown_203B0E4->unk4dd6);
- SetBG3RegOffsets(gUnknown_203B0E4->unk4dd4, gUnknown_203B0E4->unk4dd6);
+ SetBG2RegOffsets(gUnknown_203B0E4->xoffset, gUnknown_203B0E4->yoffset);
+ SetBG3RegOffsets(gUnknown_203B0E4->xoffset, gUnknown_203B0E4->yoffset);
sub_8010F28();
return_var = sub_80111C4();
sub_8004AF0(return_var, &(gUnknown_203B0E4->unk4c4c), 0xB0, 0x10, (gUnknown_203B0E4->unk4dcc), 0);
@@ -109,12 +109,12 @@ void sub_801178C(void)
void sub_80117AC(void)
{
if(sub_80023E4(0xD) == 0)
- sub_800BFD0(0x1E);
+ FadeOutBGM(0x1E);
}
void sub_80117C4(void)
{
- sub_800BFD0(0x1E);
+ FadeOutBGM(0x1E);
}
// Some sound effect
@@ -181,7 +181,7 @@ void sub_80118A4(void)
void sub_80118C4(u16 r0)
{
- sub_800BFD0(r0);
+ FadeOutBGM(r0);
sub_800C3F8(0x3e6, r0);
sub_800C3F8(0x3e5, r0);
}
@@ -208,7 +208,7 @@ void sub_8011924()
void sub_8011930(u16 speed)
{
- sub_800BFD0(speed);
+ FadeOutBGM(speed);
}
u32 IsEqualtoBGTrack(u16 songIndex)
diff --git a/src/code_801D760.c b/src/code_801D760.c
index 28c4071..5577b86 100644
--- a/src/code_801D760.c
+++ b/src/code_801D760.c
@@ -1,4 +1,6 @@
#include "global.h"
+#include "constants/friend_area.h"
+#include "file_system.h"
extern u32 sub_801BF48(void);
extern void sub_801BF98(void);
@@ -24,12 +26,40 @@ extern void sub_802C8F4(void);
extern u8 sub_8012FD8(u32 *);
extern void sub_8013114(u32 *, s32 *);
+extern const char *sub_8098FB4();
+extern void xxx_format_string(const char *, u8 *, u32 **, u32);
+extern const char *GetFriendAreaName(u8);
+extern s32 sub_8008ED0(u8 *);
+extern void xxx_call_draw_string(s32 size, u32, u8 *, u32, u32);
+extern const char *GetFriendAreaName(u8);
+extern u8 GetRescueTeamRank();
+extern const char *GetTeamRankString(u8);
+extern s32 GetTeamRankPts();
+extern void sub_8008C54(u32);
+extern void sub_80073B8(u32);
+extern void sub_80073E0(u32);
+void LoadTeamRankBadge(u32, u32, u32);
+extern void sub_800D158(u8 *, u32 *, ...);
+extern void SetBGPaletteBufferColorArray(s32 index, u8 *colorArray);
+extern void sub_8007E20(u32, u32, u32, u32, u32, u8 *, u32);
+
+extern struct FileArchive gTitleMenuFileArchive;
+extern const char gTeamRankBadgeFileName;
+
+extern u32 gUnknown_80DBF3C;
+extern u32 gUnknown_80DBF4C;
+
+struct TeamBadgeData
+{
+ /* 0x0 */ u8 *pics; // probably a pointer to an arrays of pixels?
+ /* 0x4 */ u8 *pallete; // Pics share common pallete
+};
struct unk_203B250
{
u32 unk0;
u16 unk4;
- u8 unk6;
+ /* 0x6 */ u8 currFriendAreaLocation; // 0 when not in a friend area
u8 unk7;
u8 unk8;
u8 unk9;
@@ -40,6 +70,14 @@ struct unk_203B250
struct unk_203B250 *gUnknown_203B250;
+struct unkStruct_203B460
+{
+ u8 padding[0x260];
+ /* 0x260 */ u32 teamMoney;
+};
+
+extern struct unkStruct_203B460 *gUnknown_203B460;
+
void sub_801D680(void)
{
int local_c;
@@ -121,7 +159,7 @@ void sub_801D798(void)
if (temp > 3)
return;
if(sub_802604C() != 0)
- gUnknown_203B250->unk7 = gUnknown_203B250->unk6;
+ gUnknown_203B250->unk7 = gUnknown_203B250->currFriendAreaLocation;
sub_8026058();
sub_801D208(2);
}
@@ -213,3 +251,63 @@ void sub_801D878(void)
sub_801DD50();
sub_801D208(1);
}
+
+void sub_801D894(void)
+{
+ u8 uVar1;
+ const char *location;
+ int iVar3;
+ s32 size_var;
+
+ // Stored on stack
+ u32 *preload_string;
+ u32 *r5; // R5
+ u8 auStack116 [96]; // sp +4
+
+ if (gUnknown_203B250->currFriendAreaLocation == NONE) {
+ location = sub_8098FB4();
+ }
+ else {
+ location = GetFriendAreaName(gUnknown_203B250->currFriendAreaLocation);
+ }
+ // TODO this is def a hack
+ xxx_format_string(location, auStack116, &preload_string + 1, 0);
+ iVar3 = sub_8008ED0(auStack116);
+ size_var = (0x80 - iVar3) / 2; // have to calculate here
+ sub_8008C54(1);
+ sub_80073B8(1);
+ xxx_call_draw_string(size_var, 4, auStack116, 1, 0);
+ sub_80073E0(1);
+ sub_8008C54(2);
+ sub_80073B8(2);
+ LoadTeamRankBadge(2, 8, 6);
+
+ r5 = &gUnknown_80DBF3C; // Have to load before TeamRank funcs
+ uVar1 = GetRescueTeamRank();
+ sub_800D158(auStack116, r5, GetTeamRankString(uVar1), GetTeamRankPts());
+ xxx_call_draw_string(0x20, 4, auStack116, 2, 0);
+ sub_800D158(auStack116, &gUnknown_80DBF4C, gUnknown_203B460->teamMoney);
+ xxx_call_draw_string(0x20, 0x12, auStack116, 2, 0);
+ sub_80073E0(2);
+}
+
+void LoadTeamRankBadge(u32 param_1, u32 param_2, u32 param_3)
+{
+ struct OpenedFile *teamBadgeFile;
+ s32 palleteIndex;
+ u8 rank;
+ u8 *colorArray;
+ u8 *teamBadgePic;
+
+ teamBadgeFile = OpenFileAndGetFileDataPtr(&gTeamRankBadgeFileName, &gTitleMenuFileArchive);
+ teamBadgePic = ((struct TeamBadgeData *)(teamBadgeFile->data))->pics;
+ colorArray = ((struct TeamBadgeData *)(teamBadgeFile->data))->pallete;
+ for(palleteIndex = 0; palleteIndex < 16; palleteIndex++){
+ SetBGPaletteBufferColorArray(palleteIndex + 224,colorArray);
+ colorArray = colorArray + 4;
+ }
+ rank = GetRescueTeamRank();
+ teamBadgePic = &teamBadgePic[rank << 7]; // TODO figure out why the lft shft 7 is needed
+ sub_8007E20(param_1, param_2, param_3, 16, 16, teamBadgePic, 14);
+ CloseFile(teamBadgeFile);
+}
diff --git a/src/code_803D0D8.c b/src/code_803D0D8.c
new file mode 100644
index 0000000..082f86c
--- /dev/null
+++ b/src/code_803D0D8.c
@@ -0,0 +1,25 @@
+#include "global.h"
+
+extern u8 gUnknown_203B408;
+extern u8 gUnknown_80F42D0[];
+extern u8 gUnknown_80F42F0[];
+
+u8 sub_803D0D8()
+{
+ return gUnknown_203B408;
+}
+
+void sub_803D0E4(u8 r0)
+{
+ gUnknown_203B408 = r0;
+}
+
+u8 sub_803D0F0(u8 r0)
+{
+ return gUnknown_80F42F0[r0];
+}
+
+u8 sub_803D100(u8 r0)
+{
+ return gUnknown_80F42D0[r0];
+}
diff --git a/src/code_8040094.c b/src/code_8040094.c
index a62671f..691f2df 100644
--- a/src/code_8040094.c
+++ b/src/code_8040094.c
@@ -4,11 +4,12 @@
struct unkStruct_203B418
{
- u8 padding[0x181FB];
+ u8 fill0[0x181FC];
u32 unk181FC;
u32 unk18200;
u32 unk18204;
- u32 unk18208;
+ u8 unk18208[3];
+ u8 unk1820B;
u32 unk1820C;
u32 unk18210;
u8 padding2[3];
@@ -31,6 +32,47 @@ extern void xxx_call_update_bg_sound_input(void);
extern void sub_8083F58(void);
extern void sub_8011860(void);
+extern void sub_803F580(u32);
+extern void sub_8049ED4();
+extern void sub_8040A84();
+extern void sub_80522A8(u32, const char *);
+
+extern const char *gUnknown_80FD040; // It became brighter on the floor
+
+struct unk8049590
+{
+ u32 unk0;
+ u16 unk4;
+};
+
+extern struct unk8049590 *sub_8049590(u32, u32);
+
+// Luminous Orb???
+void sub_804002C(u32 param_1)
+{
+ struct unk8049590 *iVar1;
+ int innerCounter;
+ int iVar3;
+ int iVar4;
+
+ gUnknown_203B418->unk1820B = 1;
+ iVar3 = 0;
+ do {
+ innerCounter = 0;
+ iVar4 = iVar3 + 1;
+ do {
+ iVar1 = sub_8049590(innerCounter, iVar3);
+ iVar1->unk4 = iVar1->unk4 | 1;
+ innerCounter++;
+ } while (innerCounter < 0x38);
+ iVar3 = iVar4;
+ } while (iVar4 < 0x20);
+ sub_803F580(0);
+ sub_8049ED4();
+ sub_8040A84();
+ sub_80522A8(param_1, gUnknown_80FD040);
+}
+
void sub_8040094(u8 r0)
{
gUnknown_203B418->unk18217 = r0;
diff --git a/src/code_809017C.c b/src/code_809017C.c
deleted file mode 100644
index c274241..0000000
--- a/src/code_809017C.c
+++ /dev/null
@@ -1,322 +0,0 @@
-#include "global.h"
-
-extern u32 gUnformattedTypeStrings[]; // unformatted type names
-extern u32 gFormattedTypeStrings[]; // formatted type names
-
-extern u8 gUnknown_810AC7C[];
-extern u8 gUnknown_810AC6A[];
-
-extern u8 *gAbilityNames[];
-extern u8 *AbilityDescriptions[];
-
-extern u32 gUnknown_810983C[26]; // TODO: verify size later
-
-struct unkStruct_203B464
-{
- u8 unk0[0xA]; // some string of sorts
- s32 unkC;
- u8 unk10;
-};
-extern struct unkStruct_203B464 *gUnknown_203B464;
-extern struct unkStruct_203B464 gUnknown_2038C10;
-
-extern void sub_809485C(u32 *r0, u8 *r1, u32 r2);
-extern void sub_809486C(u32 *r0, u8 *r1, u32 r2);
-extern void sub_809488C(u32 *r0, u8 *r1, u32 r2);
-extern void sub_8094924(u32 *r0, u8 *r1, u32);
-extern void nullsub_102(u32 *r0);
-extern u8 sub_80023E4(u32);
-
-extern const char *gRescueTeamRanks[];
-extern s32 gUnknown_8109810[7];
-extern u8 gUnknown_810982C[0x8]; // Pokemon
-extern u8 gUnknown_810A35B[0x10];
-
-// Forward declaration
-void sub_80922B4(u8 *buffer, u8 *string, s32 size);
-void BoundedCopyStringtoBuffer(u8 *buffer, u8 *string, s32 size);
-
-bool32 sub_8092040(u8 param_1)
-{
- s32 index;
-
- if (param_1 >= 0xF0)
- return TRUE;
- else {
- index = 0;
- while (gUnknown_810A35B[index] != 0xF0){
- if (gUnknown_810A35B[index] == param_1)
- return TRUE;
- index++;
- };
- return FALSE;
- }
-}
-
-void sub_809207C(void)
-{
- gUnknown_203B464 = &gUnknown_2038C10;
-}
-
-struct unkStruct_203B464 *sub_809208C(void)
-{
- return &gUnknown_2038C10;
-}
-
-void sub_8092094(void)
-{
- BoundedCopyStringtoBuffer(gUnknown_203B464->unk0, gUnknown_810982C, 0xA);
- gUnknown_203B464->unkC = 0;
- gUnknown_203B464->unk10 = 0;
-}
-
-void sub_80920B8(u8 *buffer)
-{
- s32 counter;
- for(counter = 0; counter < 0xA; counter++)
- {
- *buffer++ = gUnknown_203B464->unk0[counter];
- }
-}
-
-void sub_80920D8(u8 *buffer)
-{
- sub_80922B4(buffer, gUnknown_203B464->unk0, 0xA);
-}
-
-void sub_80920EC(u8 *r0)
-{
- s32 counter;
- for(counter = 0; counter < 0xA; counter++)
- {
- gUnknown_203B464->unk0[counter] = *r0++;
- }
-}
-
-s32 sub_8092110(void)
-{
- return gUnknown_203B464->unkC;
-}
-
-
-#ifdef NONMATCHING
-s32 sub_809211C(void)
-{
- u8 uVar1;
- s32 iVar2;
-
- uVar1 = sub_8092178();
- if (uVar1 != 6) {
- // Goes to R2 instead of R1 but matches aside from that
- iVar2 = gUnknown_8109810[uVar1] - gUnknown_203B464->unkC;
- }
- else
- {
- iVar2 = 0;
- }
- return iVar2;
-}
-#else
-NAKED
-s32 sub_809211C(void)
-{
- asm_unified(
- "\tpush {lr}\n"
- "\tbl sub_8092178\n"
- "\tlsls r0, 24\n"
- "\tlsrs r0, 24\n"
- "\tcmp r0, 0x6\n"
- "\tbeq _08092144\n"
- "\tldr r1, _0809213C\n"
- "\tlsls r0, 2\n"
- "\tadds r0, r1\n"
- "\tldr r1, _08092140\n"
- "\tldr r1, [r1]\n"
- "\tldr r0, [r0]\n"
- "\tldr r1, [r1, 0xC]\n"
- "\tsubs r0, r1\n"
- "\tb _08092146\n"
- "\t.align 2, 0\n"
-"_0809213C: .4byte gUnknown_8109810\n"
-"_08092140: .4byte gUnknown_203B464\n"
-"_08092144:\n"
- "\tmovs r0, 0\n"
-"_08092146:\n"
- "\tpop {r1}\n"
- "\tbx r1");
-}
-#endif
-
-
-// Unused
-void sub_809214C(s32 param_1)
-{
- gUnknown_203B464->unkC = param_1;
-}
-
-void sub_8092158(s32 param_1)
-{
- gUnknown_203B464->unkC += param_1;
- if (gUnknown_203B464->unkC > 99999999) {
- gUnknown_203B464->unkC = 99999999;
- }
-}
-
-u8 sub_8092178(void)
-{
- s32 index;
-
- for(index = 0; index < 7; index++){
- if (gUnknown_203B464->unkC < gUnknown_8109810[index]) {
- return index;
- }
- }
- return 6;
-}
-
-const char *GetTeamRankString(u8 index)
-{
- return gRescueTeamRanks[index];
-}
-
-// Unused
-u8 sub_80921B8(void)
-{
- return gUnknown_203B464->unk10;
-}
-
-u32 sub_80921C4(u8 *param_1,u32 param_2)
-
-{
- u32 auStack36[4];
- u8 neg1;
- u8 zero;
- u8 *puVar2;
-
- neg1 = -1;
- zero = 0;
-
- sub_809486C(auStack36, param_1, param_2);
- sub_809488C(auStack36, gUnknown_203B464->unk0, 0x58);
- sub_809488C(auStack36, (u8 *)&gUnknown_203B464->unkC, 0x20);
- gUnknown_203B464->unk10 = sub_80023E4(0);
-
- if (gUnknown_203B464->unk10 != 0)
- {
- puVar2 = &neg1;
- }
- else
- {
- puVar2 = &zero;
- }
- sub_809488C(auStack36,puVar2,1);
- nullsub_102(auStack36);
- return auStack36[2];
-}
-
-u32 sub_809222C(u8 *param_1, u32 param_2)
-{
- u32 auStack32 [4];
- u8 byteArray[4];
-
- sub_809485C(auStack32, param_1, param_2);
- sub_8094924(auStack32, gUnknown_203B464->unk0, 0x58);
- sub_8094924(auStack32, (u8 *)&gUnknown_203B464->unkC, 0x20);
- sub_8094924(auStack32, byteArray, 1);
- gUnknown_203B464->unk10 = byteArray[0] & 1;
- nullsub_102(auStack32);
- return auStack32[2];
-}
-
-u32 ReturnIntFromChar(u8 r0)
-{
- return r0;
-}
-
-u32 ReturnIntFromChar2(u8 r0)
-{
- return r0;
-}
-
-// Unused
-void sub_8092290(u8 *buffer, u8 *string)
-{
- while( *string != '\0' ) {
- *buffer++ = ReturnIntFromChar2(*string++);
- }
- *buffer = 0; // append a 0
-}
-
-void sub_80922B4(u8 *buffer, u8 *string, s32 size)
-{
- while(1)
- {
- if(size-- < 1 || *string == '\0')
- {
- break;
- }
- *buffer++ = ReturnIntFromChar2(*string++);
- }
- *buffer = 0; // append a 0
-}
-
-u32 sub_80922E4(u32 r0)
-{
- return gUnknown_810983C[r0];
-}
-
-void CopyStringtoBuffer(u8 *buffer, u8 *string)
-{
- while( *string != '\0' ) {
- *buffer++ = *string++;
- }
- *buffer = 0; // append a 0
-}
-
-void BoundedCopyStringtoBuffer(u8 *buffer, u8 *string, s32 size)
-{
- while( 1 ) {
- if (size-- < 1) {
- break;
- }
- if (*string == '\0') {
- *buffer = 0; // append a 0 and break
- break;
- }
- // NOTE: *buffer++ = *string++ cases register flip
- *buffer = *string;
- buffer++;
- string++;
- }
-}
-
-u32 GetUnformattedTypeString(u8 type)
-{
- return gUnformattedTypeStrings[type];
-}
-
-u32 GetFormattedTypeString(u8 type)
-{
- return gFormattedTypeStrings[type];
-}
-
-u8 sub_8092354(u8 index)
-{
- return gUnknown_810AC7C[index];
-}
-
-u8 sub_8092364(u8 index)
-{
- return gUnknown_810AC6A[index];
-}
-
-void sub_8092374(char *buffer, u8 index)
-{
- strncpy(buffer, gAbilityNames[index], 0x50);
-}
-
-u8 *GetAbilityDescription(u8 index)
-{
- return AbilityDescriptions[index];
-}
-
diff --git a/src/code_8098BDC.c b/src/code_8098BDC.c
index 6469b57..66bb85a 100644
--- a/src/code_8098BDC.c
+++ b/src/code_8098BDC.c
@@ -60,7 +60,7 @@ extern void sub_8098CC8();
extern void sub_809674C();
extern void sub_80961B4();
extern void sub_8091FB4();
-extern s32 sub_80A2B18(s16);
+extern const char *sub_80A2B18(s16);
extern u8 sub_8001CC4(u8, u8, u8);
extern void sub_8091980(u32);
@@ -317,7 +317,7 @@ s16 sub_8098FA0(void)
return sub_8001658(0, 0x11);
}
-s32 sub_8098FB4(void)
+const char *sub_8098FB4(void)
{
return sub_80A2B18(sub_8001658(0, 0x11));
}
diff --git a/src/code_80A26CC.c b/src/code_80A26CC.c
index 0217d51..110c278 100644
--- a/src/code_80A26CC.c
+++ b/src/code_80A26CC.c
@@ -14,12 +14,80 @@ struct unkStruct_80A2608
/* 0x11 */ u8 unk11;
};
-extern struct unkStruct_80A2608 *sub_80A2608(s32);
-extern struct unkStruct_80A2608 *sub_80A2620(u32);
extern u8 sub_80023E4(u32);
extern u8 sub_80973F4(s16);
extern u8 sub_8097384(s16);
+s16 sub_80A26B8(s16);
extern s16 gUnknown_8116F9A[];
+extern s16 gUnknown_8116F24[];
+extern struct unkStruct_80A2608 gUnknown_81168A8[];
+
+struct unkStruct_80A2608 *sub_80A2608(s16 r0)
+{
+ return &gUnknown_81168A8[r0];
+}
+
+struct unkStruct_80A2608 *sub_80A2620(s16 r0)
+{
+ u32 temp;
+ temp = sub_80A26B8(r0);
+ return &gUnknown_81168A8[temp];
+}
+
+s16 sub_80A2644(u32 r0)
+{
+ return gUnknown_8116F24[r0];
+}
+
+s16 sub_80A2654(s16 r0)
+{
+ struct unkStruct_80A2608 *temp;
+ temp = sub_80A2608(r0);
+ return temp->unkE;
+}
+
+// This is very ugly
+s32 sub_80A2668(u32 r0)
+{
+ u32 temp;
+ temp = 0xffc90000 + (r0 << 16);
+ if(temp >> 16 < 0x19)
+ {
+ return ((s32)temp >> 16);
+ }
+ else
+ {
+ return -1;
+ }
+}
+
+u32 sub_80A2688(u8 r0, u32 r1)
+{
+ u32 uVar1;
+
+ uVar1 = r0 - 0x4B;
+
+ // u8 cast is needed for only this compare
+ if ((u8)uVar1 < 0x17)
+ {
+ return uVar1;
+ }
+ else
+ {
+ if(r0 == 0x2F)
+ {
+ return 0x17;
+ }
+ else if (r0 == 0x30)
+ {
+ return 0x18;
+ }
+ else
+ {
+ return -1;
+ }
+ }
+}
s16 sub_80A26B8(s16 r0)
{
@@ -143,8 +211,6 @@ u32 sub_80A27CC(s16 r0)
u32 sub_80A2824(u8 r0)
{
s32 counter;
- s32 counter2;
- s32 temp2;
struct unkStruct_80A2608 *temp;
if(sub_80023E4(5) != 0)
@@ -155,18 +221,16 @@ u32 sub_80A2824(u8 r0)
{
for(counter = 0; counter <= 0x2D; counter++)
{
- temp2 = counter << 0x10;
- counter2 = temp2 >> 0x10;
- temp = sub_80A2620(counter2);
+ temp = sub_80A2620(counter);
if(temp->unk11 != 0)
{
if(temp->unkC == r0)
{
- if(sub_8097384(counter2) != 0)
+ if(sub_8097384(counter) != 0)
{
return 1;
}
- if(sub_80973F4(counter2) != 0)
+ if(sub_80973F4(counter) != 0)
{
return 1;
}
@@ -178,14 +242,12 @@ u32 sub_80A2824(u8 r0)
{
for(counter = 0; counter <= 0x2D; counter++)
{
- temp2 = counter << 0x10;
- counter2 = temp2 >> 0x10;
- temp = sub_80A2620(counter2);
+ temp = sub_80A2620(counter);
if(temp->unk11 != 0)
{
if(temp->unkC == r0)
{
- if(sub_8097384(counter2) != 0)
+ if(sub_8097384(counter) != 0)
{
return 1;
}
@@ -199,27 +261,19 @@ u32 sub_80A2824(u8 r0)
u32 sub_80A28B4(s16 r0)
{
- s32 counter2;
- s32 temp2;
struct unkStruct_80A2608 *temp;
- temp2 = r0 << 0x10;
- counter2 = temp2 >> 0x10;
- temp = sub_80A2620(counter2);
+ temp = sub_80A2620(r0);
if(temp->unk0 != -1)
{
- if(sub_8097384(counter2) == 0)
+ if(sub_8097384(r0) == 0 && sub_80973F4(r0) == 0)
{
- if(sub_80973F4(counter2) == 0)
- {
- return 0;
- }
+ return 0;
}
else
{
return 1;
}
- return 1;
}
return 0;
}
@@ -227,24 +281,20 @@ u32 sub_80A28B4(s16 r0)
u32 sub_80A28F0(u8 r0)
{
s32 counter;
- s32 counter2;
- s32 temp2;
struct unkStruct_80A2608 *temp;
for(counter = 0; counter <= 0x2D; counter++)
{
- temp2 = counter << 0x10;
- counter2 = temp2 >> 0x10;
- temp = sub_80A2620(counter2);
+ temp = sub_80A2620(counter);
if(temp->unk11 != 0)
{
if(temp->unkC == r0)
{
- if(sub_8097384(counter2) != 0)
+ if(sub_8097384(counter) != 0)
{
return 1;
}
- if(sub_80973F4(counter2) != 0)
+ if(sub_80973F4(counter) != 0)
{
return 1;
}
diff --git a/src/data/nature_description.h b/src/data/nature_description.h
new file mode 100644
index 0000000..a8b396f
--- /dev/null
+++ b/src/data/nature_description.h
@@ -0,0 +1,232 @@
+ALIGNED(4) const char gQuirkyDescription[] =
+ "#+You appear to be...#W\n"
+ "#+The quirky type.#P"
+ "#+People consider you an eccentric\n"
+ "#+who does things at your own pace.#P"
+ "#+You never break tempo.#P"
+ "#+Your carefree nature makes you\n"
+ "#+attractive. But you also happen\n"
+ "#+to be somewhat childish...#P"
+ "#+You are fickle and cause problems for the\n"
+ "#+people who have to go along with you.#P"
+ "#+Maybe people are even upset\n"
+ "#+with you for being so fickle?#P"
+ "#+If you realize how selfishly\n"
+ "#+you~27re behaving~2c try to think\n"
+ "#+before you do anything rash.#P"
+ "#+A quirky person like you should be...";
+
+ALIGNED(4) const char gLonelyDescription[] =
+ "#+You appear to be...#W\n"
+ "#+The lonely type.#P"
+ "#+You always act cheerful and\n"
+ "#+jocular around other people.#P"
+ "#+But that~27s only because\n"
+ "#+you are with other people.#P"
+ "#+However~2c when you get alone...#P"
+ "#+Do you find yourself\n"
+ "#+feeling oddly depressed?#P"
+ "#+That~27s why you always\n"
+ "#+want to be with others.#P"
+ "#+But if you go around feeling\n"
+ "#+depressed too much...#P"
+ "#+Your nutritional balance goes out\n"
+ "#+of wack. Eat more vegetables!#P"
+ "#+However...#W\n"
+ "#+It~27s not a bad thing\n"
+ "#+to feel lonely.#P"
+ "#+You know what it~27s like when you aren~27t\n"
+ "#+alone~2c so that~27s why you feel lonesome.#P"
+ "#+And that~27s why you aren~27t really alone.#P"
+ "#+A lonely person like you should be...";
+
+ALIGNED(4) const char gRelaxedDescription[] =
+ "#+You appear to be...#W\n"
+ "#+The relaxed type.#P"
+ "#+Do you occasionally\n"
+ "#+zone out and miss a bus?#P"
+ "#+Or do you find yourself dozing off?#P"
+ "#+Or is your reaction time\n"
+ "#+a little slower than others?#P"
+ "#+But that~27s not necessarily\n"
+ "#+a bad thing.#P"
+ "#+You can do things at your own\n"
+ "#+tempo without feeling pressured.#P"
+ "#+You can live in a relaxed and\n"
+ "#+unhurried manner without worries.#P"
+ "#+I think that~27s a happy\n"
+ "#+lifestyle to be envied~2c even.#P"
+ "#+You~27re also surprisingly popular.#P"
+ "#+The way you vacantly stare\n"
+ "#+off into the distance...#P"
+ "#+It should make that someone\n"
+ "#+special~27s pulse race.#P"
+ "#+A relaxed person like you should be...";
+
+ALIGNED(4) const char gCalmDescription[] =
+ "#+You appear to be...#W\n"
+ "#+The calm type.#P"
+ "#+You~27re capable of giving advice\n"
+ "#+to friends with worries.#P"
+ "#+You don~27t like to fight.#P"
+ "#+You~27re a warm~2c kindhearted\n"
+ "#+person who cares.#P"
+ "#+You must have many friends\n"
+ "#+who look up to you.#P"
+ "#+However...#W\n"
+ "#+You may also be somewhat gullible...#P"
+ "#+As well as a little careless...#P"
+ "#+And even a little sloppy.#P"
+ "#+You might want to keep\n"
+ "#+those points in mind.#P"
+ "#+A calm person like you should be...";
+
+ALIGNED(4) const char gSassyDescription[] =
+ "#+You appear to be...#W\n"
+ "#+The sassy type.#P"
+ "#+You tend to be somewhat cynical.#P"
+ "#+Despite that~2c there is something\n"
+ "#+appealing and lovable about you.#P"
+ "#+But do you occasionally say something\n"
+ "#+arrogant that angers others?#P"
+ "#+Do you make that mistake?#P"
+ "#+Or have people called you\n"
+ "#+conceited~2c vain~2c or selfish?#P"
+ "#+Have people said that about you?#P"
+ "#+Huh?#W You~27re telling me to get lost?#P"
+ "#+Why~2c you... Come here and say that!#W\n"
+ "#+......Gasp!#P"
+ "#+...I~27m sorry.\n"
+ "#+I let my feelings run away.\n"
+ "#+I truly regret this~2c really.#P"
+ "#+Anyway~2c your cool and aloof\n"
+ "#+attitude is what defines you.#P"
+ "#+It makes you exasperating and\n"
+ "#+appealing at the same time.#P"
+ "#+A sassy person like you should be...";
+
+ALIGNED(4) const char gHastyDescription[] =
+ "#+You appear to be...#W\n"
+ "#+The hasty type.#P"
+ "#+You like to take charge\n"
+ "#+and get things done.#P"
+ "#+You~27re a real go-getter.#P"
+ "#+But are you also stressed out?#P"
+ "#+You get irritated when your\n"
+ "#+friends don~27t show up on time.#P"
+ "#+You get frustrated when things\n"
+ "#+don~27t turn out the way you expect.#P"
+ "#+Maybe you jab the elevator button\n"
+ "#+if the elevator is slow to arrive.#P"
+ "#+...Maybe you~27re already jabbing\n"
+ "#+the A Button repeatedly now.#P"
+ "#+Beware--getting too easily irritated\n"
+ "#+just isn~27t good for your well-being.#P"
+ "#+A hasty person like you should be...";
+
+ALIGNED(4) const char gTimidDescription[] =
+ "#+You appear to be...#W\n"
+ "#+The timid type.#P"
+ "#+You may find it hard to go\n"
+ "#+to the washroom at night.#P"
+ "#+You may also find it too frightening\n"
+ "#+to go back to school to get something\n"
+ "#+you left behind in class.#P"
+ "#+If you~27re ever walking on a dark\n"
+ "#+street at night~2c you probably turn\n"
+ "#+around often to check behind you.#P"
+ "#+But your timid nature is\n"
+ "#+also your good point!#P"
+ "#+Because those who know fear are\n"
+ "#+those who know true courage.#P"
+ "#+A timid person like you should be...";
+
+ALIGNED(4) const char gNaiveDescription[] =
+ "#+You appear to be...#W\n"
+ "#+The naive type.#P"
+ "#+You are highly curious~2c\n"
+ "#+and you love rare things.#P"
+ "#+Your cheerful and carefree\n"
+ "#+attitude should make things fun\n"
+ "#+for the people around you.#P"
+ "#+But you do have one flaw.\n"
+ "#+You can be childish.#P"
+ "#+You can never sit still.\n"
+ "#+You~27re always on the move.#P"
+ "#+You can also be selfish~2c\n"
+ "#+so you should watch yourself.#P"
+ "#+A naive person like you should be...";
+
+ALIGNED(4) const char gImpishDescription[] =
+ "#+You appear to be...#W\n"
+ "#+The impish type.#P"
+ "#+You~27re playful~2c cheerful~2c\n"
+ "#+and you love pranks.#P"
+ "#+You~27re also kindhearted.#P"
+ "#+That~27s why the people around\n"
+ "#+you find you so irresistible.#P"
+ "#+You must be the most\n"
+ "#+popular person around!#P"
+ "#+Oh?#W You~27re not that popular?#W\n"
+ "#+You~27re either being modest...\n"
+ "#+or you just don~27t notice it.#P"
+ "#+I bet people are just too shy\n"
+ "#+to let their feelings be known.#P"
+ "#+There~27s someone out there who~27s\n"
+ "#+afraid to declare their love for you!#P"
+ "#+An impish person like you should be...";
+
+ALIGNED(4) const char gJollyDescription[] =
+ "#+You appear to be...#W\n"
+ "#+The jolly type.#P"
+ "#+Always laughing and smiling~2c\n"
+ "#+you uplift everyone around you.#P"
+ "#+You love jokes!#P"
+ "#+You have lots of friends~2c and\n"
+ "#+you~27re popular wherever you go.#P"
+ "#+But sometimes you get carried away\n"
+ "#+and say things that get you in trouble.#P"
+ "#+You should learn to think before\n"
+ "#+saying or doing anything.#P"
+ "#+A jolly person like you should be...";
+
+ALIGNED(4) const char gBraveDescription[] =
+ "#+You appear to be...#W\n"
+ "#+The brave type.#P"
+ "#+You have a strong sense of justice.#W\n"
+ "#+You hate evil.#W\n"
+ "#+You will take on any opponent.#P"
+ "#+You are truly a hero!#P"
+ "#+Go forth!#P"
+ "#+For justice...#W\n"
+ "#+For peace on earth...#W\n"
+ "#+Fight the forces of evil!#P"
+ "#+......#WIf I~27m wrong...#W\n"
+ "#+Work at becoming a true hero!#P"
+ "#+A brave person like you should be...";
+
+ALIGNED(4) const char gDocileDescription[] =
+ "#+You appear to be...#W\n"
+ "#+The docile type.#P"
+ "#+You~27re very kindhearted.#W\n"
+ "#+Very helpful.#W\n"
+ "#+You can make friends with anyone.#P"
+ "#+You~27re a wonderful person.#P"
+ "#+......#WIs that going overboard?#W\n"
+ "#+I don~27t think so.#P"
+ "#+You yourself should be\n"
+ "#+the best judge of that.#P"
+ "#+A docile person like you should be...";
+
+
+ALIGNED(4) const char gHardyDescription[] =
+ "#+You appear to be...#W\n"
+ "#+The hardy type.#P#+You do your homework diligently~2c\n"
+ "#+and you know to eat properly.#P"
+ "#+You have strong willpower that lets\n"
+ "#+you complete tasks~2c however tough.#P"
+ "#+But~2c you can also be stubborn to the\n"
+ "#+point of even feuding with friends...#P"
+ "#+Nothing will go right for you when you~27re\n"
+ "#+irritated~2c so learn to laugh it off.#P"
+ "#+A hardy person like you should be...";
diff --git a/src/data/unformatted_type_names.h b/src/data/unformatted_type_names.h
new file mode 100644
index 0000000..1693626
--- /dev/null
+++ b/src/data/unformatted_type_names.h
@@ -0,0 +1,18 @@
+ALIGNED(4) const char gSteelText[] = "Steel";
+ALIGNED(4) const char gDarkText[] = "Dark";
+ALIGNED(4) const char gDragonText[] = "Dragon";
+ALIGNED(4) const char gGhostText[] = "Ghost";
+ALIGNED(4) const char gRockText[] = "Rock";
+ALIGNED(4) const char gBugText[] = "Bug";
+ALIGNED(4) const char gPsychicText[] = "Psychic";
+ALIGNED(4) const char gFlyingText[] = "Flying";
+ALIGNED(4) const char gGroundText[] = "Ground";
+ALIGNED(4) const char gPoisonText[] = "Poison";
+ALIGNED(4) const char gFightingText[] = "Fighting";
+ALIGNED(4) const char gIceText[] = "Ice";
+ALIGNED(4) const char gElectricText[] = "Electric";
+ALIGNED(4) const char gGrassText[] = "Grass";
+ALIGNED(4) const char gWaterText[] = "Water";
+ALIGNED(4) const char gFireText[] = "Fire";
+ALIGNED(4) const char gNormalText[] = "Normal";
+ALIGNED(4) const char gNoneText[] = "None";
diff --git a/src/data/wonder_mail_1.h b/src/data/wonder_mail_1.h
new file mode 100644
index 0000000..7b840d6
--- /dev/null
+++ b/src/data/wonder_mail_1.h
@@ -0,0 +1,141 @@
+ALIGNED(4) const char gUnknown_80DE1E4[] =
+ " ...Uh~2c no?\n"
+ "You don~27t have an #CGSOS Mail#R.#P"
+ " You~27ll need to arrange\n"
+ "to receive your friend~27s #CGSOS Mail#R first.\n"
+ "That~27s what you need to do.";
+
+ALIGNED(4) const char gUnknown_80DE280[] =
+ " Okeydoke!\n"
+ "Let me show you to the rescue site.";
+
+ALIGNED(4) const char gUnknown_80DE2B0[] =
+ " ...Uh~2c no?\n"
+ "Doesn~27t look like you can go to the dungeon\n"
+ "named in this #CGSOS Mail#R.#P"
+ " Come see me about doing\n"
+ "this rescue when you can actually go\n"
+ "to that dungeon~2c all right?";
+
+ALIGNED(4) const char gUnknown_80DE368[] =
+ " ...Uh~2c no?\n"
+ "You~27ve blown this rescue mission too\n"
+ "often. Your friend~27s team is beyond help.#P"
+ " I~27m sorry to say this~2c\n"
+ "but you~27ll have to tell your friend that\n"
+ "your rescue attempts failed.";
+
+ALIGNED(4) const char gUnknown_80DE430[] =
+ " Okeydoke.\n"
+ "I~27ll need you to choose the #CGSOS Mail#R\n"
+ "for you to go on a rescue mission.";
+
+ALIGNED(4) const char gUnknown_80DE48C[] =
+ " What kind of mail do you\n"
+ "want to delete?";
+
+ALIGNED(4) const char gUnknown_80DE4B8[] =
+ " All righty. Choose\n"
+ "the #CGSOS Mail#R you don~27t need.";
+
+ALIGNED(4) const char gUnknown_80DE4F0[] =
+ " ...Uh~2c no?\n"
+ "You don~27t have any #CGSOS Mail#R.";
+
+ALIGNED(4) const char gUnknown_80DE524[] =
+ " If you want a reward~2c #C2don~27t\n"
+ "delete an A-OK Mail#R before getting a\n"
+ "#CGThank-You Mail#R back for it.#P"
+ " #C2Be careful#R if you~27re going\n"
+ "to delete any #CGA-OK Mail#R.#P"
+ " Okeydoke.\n"
+ "Choose an #CGA-OK Mail#R\n"
+ "you don~27t need anymore.";
+ALIGNED(4) const char gUnknown_80DE614[] =
+ " ...Uh~2c no?\n"
+ "You don~27t have any #CGA-OK Mail#R.";
+ALIGNED(4) const char gUnknown_80DE648[] =
+ " Uh~2c OK.\n"
+ "So~2c you want me to delete every piece\n"
+ "of mail that you have.";
+ALIGNED(4) const char gUnknown_80DE694[] =
+ " ...Uh~2c no?\n"
+ "You don~27t have a single piece of\n"
+ "mail on you!";
+ALIGNED(4) const char gUnknown_80DE6D4[] =
+ " So~2c delete all your #CGSOS Mail#R~2c\n"
+ "#CGA-OK Mail#R~2c and your #CGThank-You Mail#R?\n"
+ "You~27re absolutely~2c positively sure?";
+ALIGNED(4) const char gUnknown_80DE754[] =
+ " If I delete any mail~2c it~27s\n"
+ "gone forever and ever. Bye-bye.\n"
+ "You~27re really~2c really sure now?";
+ALIGNED(4) const char gUnknown_80DE7B8[] =
+ " OK~2c then.\n"
+ "Let me save your adventure now.";
+ALIGNED(4) const char gUnknown_80DE7E8[] =
+ " Okeydoke. That~27s all done.";
+ALIGNED(4) const char gUnknown_80DE808[] =
+ " Do you want to delete\n"
+ "any other mail?";
+ALIGNED(4) const char gUnknown_80DE830[] =
+ " Okeydoke.\n"
+ "I~27ll delete #CGevery piece of mail#R.";
+ALIGNED(4) const char gUnknown_80DE864[] =
+ " Okeydoke.\n"
+ "Every bit of mail has been deleted.#P"
+ " Let me save your adventure.";
+ALIGNED(4) const char gUnknown_80DE8B4[] =
+ " Well~2c hello~2c there!\n"
+ "This is the #CGFriend Rescue#R counter.\n"
+ "What can I help you with today?";
+ALIGNED(4) const char gUnknown_80DE918[] =
+ " Help you with anything\n"
+ "else today?";
+ALIGNED(4) const char gUnknown_80DE93C[] =
+ " Come again anytime!";
+
+ALIGNED(4) const char gWonderMailErrorText[] =
+ " ...Uh~2c no?\n"
+ "Something~27s not working right here...";
+ALIGNED(4) const char gWonderMailNumGBAsText[] =
+ " ...Uh~2c no?\n"
+ "The number of GBA systems isn~27t right.\n"
+ "You~27d better try this again from the top.";
+ALIGNED(4) const char gWonderMailWrongModeText[] =
+ " ...Uh~2c no? You~27re not in the\n"
+ "same mode as your friend.\n"
+ "You~27d better try this again from the top.";
+ALIGNED(4) const char gWonderMailStorageFullText[] =
+ " ...Uh~2c no?\n"
+ "Your storage space is stuffed full.\n"
+ "You~27d better make room and try again.";
+ALIGNED(4) const char gWonderMailDuplicateText[] =
+ " ...Uh~2c no? It looks like\n"
+ "you received this mail before.\n"
+ "You can~27t get the same mail twice. ";
+ALIGNED(4) const char gWonderMailNotEligibleReceiveText[] =
+ " ...Uh~2c no?\n"
+ "You~27re not eligible to receive this mail.";
+ALIGNED(4) const char gWonderMailNoRoomText[] =
+ " ...Uh~2c no?\n"
+ "There~27s no room for you to \n"
+ "receive any more mail.#P"
+ " You~27d better delete some\n"
+ "mail and make room before you come see\n"
+ "me again about receiving new mail.";
+ALIGNED(4) const char gWonderMailFriendErrorText[] =
+ " ...Uh~2c no? Looks like your\n"
+ "friend didn~27t do what needed doing.\n"
+ "You~27d better do this again from the top.";
+ALIGNED(4) const char gWonderMailPasswordIncorrectText[] =
+ " ...Uh~2c no?\n"
+ "This here password looks wrong.\n"
+ "Do you want to try that again?";
+ALIGNED(4) const char gWonderMailSOSPasswordIncorrectText[] =
+ " ...Uh~2c no? This password~27s\n"
+ "not for any #CGSOS Mail#R.";
+ALIGNED(4) const char gWonderMailAOKMailReceivedText[] =
+ ": I received the #CGSOS Mail#R.\n"
+ "Your adventure will be saved.";
+ALIGNED(4) const char mail_filler[] = "pksdir0";
diff --git a/src/debug.c b/src/debug.c
index 4482df1..b6f4ee7 100644
--- a/src/debug.c
+++ b/src/debug.c
@@ -6,9 +6,8 @@
extern void Hang();
-extern u8 gUnknown_203B150;
-
extern bool32 gNDS_DebugEnabled;
+extern u8 gUnknown_203B150;
extern const char gUnknown_80D421C[];
extern const char gNotMountText[];
@@ -75,16 +74,19 @@ void nullsub_27(void)
{
}
+// Unused
void sub_8011B08(void)
{
gUnknown_203B150 = 1;
}
+// Unused
void sub_8011B14(void)
{
gUnknown_203B150 = 0;
}
+// Unused
u8 sub_8011B20(void)
{
gUnknown_203B150 = !gUnknown_203B150;
diff --git a/src/exclusive_pokemon.c b/src/exclusive_pokemon.c
index cf64724..cbcdf0c 100644
--- a/src/exclusive_pokemon.c
+++ b/src/exclusive_pokemon.c
@@ -1,28 +1,6 @@
#include "global.h"
#include "constants/species.h"
-#define NUM_EXCLUSIVE_POKEMON 12
-
-#define RED_EXCLUSIVE(species) \
-{ \
- .poke_id = species, \
- .in_rrt = TRUE, \
- .in_brt = FALSE, \
-}
-
-#define BLUE_EXCLUSIVE(species) \
-{ \
- .poke_id = species, \
- .in_rrt = FALSE, \
- .in_brt = TRUE, \
-}
-
-
-struct ExclusivePokemon
-{
- u16 poke_id;
- bool8 in_rrt; // red rescue team
- bool8 in_brt; // blue rescue team
-};
+#include "exclusive_pokemon.h"
const struct ExclusivePokemon gExclusivePokemon[NUM_EXCLUSIVE_POKEMON] = {
@@ -49,30 +27,24 @@ const u8 filler_ex1[8] =
'p', 'k', 's', 'd', 'i', 'r', '0', 0
};
-
-struct unkStruct_203B498
-{
- u8 fill0[0x58];
- bool8 Exclusives[NUM_EXCLUSIVE_POKEMON];
-};
-extern struct unkStruct_203B498 *gUnknown_203B498;
-extern struct unkStruct_203B498 gUnknown_2039840;
+extern struct ExclusivePokemonData *gUnknown_203B498;
+extern struct ExclusivePokemonData gExclusivePokemonInfo;
void LoadExclusivePokemon(void)
{
- gUnknown_203B498 = &gUnknown_2039840;
+ gUnknown_203B498 = &gExclusivePokemonInfo;
}
-struct unkStruct_203B498 *GetExclusivePokemon(void)
+struct ExclusivePokemonData *GetExclusivePokemon(void)
{
- return &gUnknown_2039840;
+ return &gExclusivePokemonInfo;
}
void InitializeExclusivePokemon(void)
{
s32 counter;
- memset(gUnknown_203B498, 0, sizeof(struct unkStruct_203B498));
+ memset(gUnknown_203B498, 0, sizeof(struct ExclusivePokemonData));
for(counter = 0; counter < NUM_EXCLUSIVE_POKEMON; counter++)
{
gUnknown_203B498->Exclusives[counter] = gExclusivePokemon[counter].in_rrt;
diff --git a/src/friend_area.c b/src/friend_area.c
index 8435bb1..4288720 100644
--- a/src/friend_area.c
+++ b/src/friend_area.c
@@ -31,8 +31,7 @@ extern void sub_800D158(u8 *buffer, const char *r2, ...);
extern void sub_8090FEC(u32, u32 *r1, u32);
-// TODO uncomment when all references have been moved
-//static struct FriendAreaSettings gFriendAreaSettings[NUM_FRIEND_AREAS] =
+//const struct FriendAreaSettings gFriendAreaSettings[NUM_FRIEND_AREAS] =
//{
// [NONE] = {
// .num_pokemon = 0,
diff --git a/src/music.c b/src/music.c
index 701fd3f..896bd5b 100644
--- a/src/music.c
+++ b/src/music.c
@@ -60,7 +60,7 @@ void StopBGMusicVSync(void)
}
}
}
- m4aMPlayStop(&gUnknown_20008F0);
+ m4aMPlayStop(&gMPlayInfo_BGM);
m4aSoundVSyncOff();
if(interrupt_flag)
{
@@ -85,7 +85,7 @@ void StartBGMusicVSync(void)
}
else
{
- m4aMPlayContinue(&gUnknown_20008F0);
+ m4aMPlayContinue(&gMPlayInfo_BGM);
}
}
}
diff --git a/src/music_pre.c b/src/music_pre.c
index e7b962e..a325be6 100644
--- a/src/music_pre.c
+++ b/src/music_pre.c
@@ -28,7 +28,7 @@ struct unkStruct_202D648
extern struct unkStruct_202D648 gUnknown_202D648[8];
extern struct unkStruct_202D648 gUnknown_202D608[8];
-extern struct MusicPlayerInfo gUnknown_20008F0; // BGM??
+extern struct MusicPlayerInfo gMPlayInfo_BGM; // BGM??
extern u32 gUnknown_203B0A0;
extern u32 gUnknown_203B0A4;
extern u16 gBGMusicPlayerState;
@@ -511,10 +511,10 @@ void FadeInNewBGM(u16 SongIndex, u16 speed)
{
gBGMusicPlayerState = 1;
m4aSongNumStart(SongIndex);
- m4aMPlayImmInit(&gUnknown_20008F0);
- m4aMPlayVolumeControl(&gUnknown_20008F0, 0xFF, 0);
+ m4aMPlayImmInit(&gMPlayInfo_BGM);
+ m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFF, 0);
m4aSongNumStop(SongIndex);
- m4aMPlayFadeIn(&gUnknown_20008F0, speed);
+ m4aMPlayFadeIn(&gMPlayInfo_BGM, speed);
}
if(interrupt_flag)
EnableInterrupts();
@@ -539,7 +539,7 @@ void sub_800BF80(void)
{
if(gCurrentBGSong != 999)
{
- m4aMPlayStop(&gUnknown_20008F0);
+ m4aMPlayStop(&gMPlayInfo_BGM);
}
}
gCurrentBGSong = 999;
@@ -548,7 +548,7 @@ void sub_800BF80(void)
EnableInterrupts();
}
-void sub_800BFD0(u16 speed)
+void FadeOutBGM(u16 speed)
{
u32 comparison;
@@ -575,12 +575,12 @@ void sub_800BFD0(u16 speed)
if(gBGMusicPlayerState == 2)
{
gBGMusicPlayerState = 3;
- m4aMPlayFadeOut(&gUnknown_20008F0, speed);
+ m4aMPlayFadeOut(&gMPlayInfo_BGM, speed);
}
else
{
gCurrentBGSong = 999;
- m4aMPlayStop(&gUnknown_20008F0);
+ m4aMPlayStop(&gMPlayInfo_BGM);
}
}
}
@@ -626,7 +626,7 @@ void sub_800C074(u16 SongIndex, u16 param_2)
gUnknown_202D690 = msVar;
gUnknown_202D692 = 16;
gUnknown_202D694 = 0;
- m4aMPlayFadeOutTemporarily(&gUnknown_20008F0,1);
+ m4aMPlayFadeOutTemporarily(&gMPlayInfo_BGM,1);
}
else
{
@@ -635,7 +635,7 @@ void sub_800C074(u16 SongIndex, u16 param_2)
else
{
gUnknown_202D690 = 3;
- m4aMPlayStop(&gUnknown_20008F0);
+ m4aMPlayStop(&gMPlayInfo_BGM);
m4aSongNumStart(gUnknown_202D68E);
}
}
@@ -645,7 +645,7 @@ void sub_800C074(u16 SongIndex, u16 param_2)
{
if (1 < (u16)(gUnknown_202D690 - 1U))
{
- m4aMPlayStop(&gUnknown_20008F0);
+ m4aMPlayStop(&gMPlayInfo_BGM);
m4aSongNumStart(gUnknown_202D68E);
gUnknown_202D690 = 3;
}
@@ -788,7 +788,7 @@ void sub_800C074(u16 SongIndex, u16 param_2)
"_0800C110: .4byte gBGMusicPlayerState\n"
"_0800C114: .4byte gUnknown_202D692\n"
"_0800C118: .4byte gUnknown_202D694\n"
-"_0800C11C: .4byte gUnknown_20008F0\n"
+"_0800C11C: .4byte gMPlayInfo_BGM\n"
"_0800C120:\n"
"\tlsls r0, r1, 16\n"
"\tlsrs r0, 16\n"
@@ -805,7 +805,7 @@ void sub_800C074(u16 SongIndex, u16 param_2)
"\tbl m4aSongNumStart\n"
"\tb _0800C15E\n"
"\t.align 2, 0\n"
-"_0800C140: .4byte gUnknown_20008F0\n"
+"_0800C140: .4byte gMPlayInfo_BGM\n"
"_0800C144:\n"
"\tsubs r0, 0x1\n"
"\tlsls r0, 16\n"
@@ -836,7 +836,7 @@ void sub_800C074(u16 SongIndex, u16 param_2)
"\tblt _0800C1A0\n"
"\tb _0800C19A\n"
"\t.align 2, 0\n"
-"_0800C17C: .4byte gUnknown_20008F0\n"
+"_0800C17C: .4byte gMPlayInfo_BGM\n"
"_0800C180: .4byte gCurrentBGSong\n"
"_0800C184:\n"
"\tcmp r0, 0x7A\n"
diff --git a/src/personality_test.c b/src/personality_test.c
index 41fbfed..3f5bfa6 100644
--- a/src/personality_test.c
+++ b/src/personality_test.c
@@ -1,15 +1,151 @@
#include "global.h"
+#include "personality_test.h"
#include "constants/emotions.h"
#include "constants/species.h"
-#include "personality_test.h"
+#include "random.h"
+#include "file_system.h"
#include "pokemon.h"
+#include "input.h"
+#include "save.h"
+
+extern void* MemoryAlloc(u32, u32);
+extern void MemoryFree(void *);
+extern void sub_801317C(u32 *);
+extern void sub_8099690(u32);
+extern void sub_8001024(u32 *);
+extern s32 sub_8094E4C(void);
+extern void sub_8094D28(s32);
+extern void sub_8001044(u32 *);
+
+extern void sub_80141B4(const char *text, u32 r1, u32 r2, u16 r3);
+extern void sub_8014248(const char *text, u32, u32, u32 *r0, u32, u32, u32, u32, u32);
+
+extern u32 sub_80144A4(s32 *);
+
+extern char* GetMonSpecies(u32);
+extern void CopyStringtoBuffer(char *r0, char *r1);
+extern void sub_801602C(u32, char *r0);
+
+extern u32 sub_8016080(void);
+extern void sub_80160D8(void);
+extern void sub_8099690(u32);
+extern void CopySpeciesNametoBuffer(char *r0, u32);
+extern void sub_8006518(void *);
+extern void sub_800641C(void *, u32, u32);
extern void sub_80073E0(u32);
extern void sub_80073B8(u32);
extern void sub_8008C54(u32);
extern void sub_800836C(u32, u8 *r0, u32);
extern void SetBGPaletteBufferColorArray(s32 index, u8 *colorArray);
+extern void RedrawPartnerSelectionMenu(void);
+extern void sub_8013818(u32 *r0, s32, u32, u32);
+
+extern u32 GetKeyPress(struct UnkInputStruct **r0);
+extern u8 sub_80138B8(struct UnkInputStruct **r0, u32);
+extern void PlayMenuSoundEffect(u32);
+
+
+extern void sub_8013984(struct UnkInputStruct **r0);
+u32 sub_8013800(struct UnkInputStruct **r0, u32);
+extern void AddMenuCursorSprite(struct UnkInputStruct **r0);
+extern void xxx_call_draw_string(u32 size, u32, const char *text, u32, u32);
+extern u32 sub_80095E4(s16, u32);
+
+
+struct PersonalityAnswer
+{
+ const char * text;
+ int effect;
+};
+
+struct PersonalityQuestion
+{
+ const char * question;
+ const struct PersonalityAnswer * answers;
+ const u8 (*effects[16]);
+};
+
+extern struct PersonalityQuestion *gPersonalityQuestionPointerTable[NUM_QUIZ_QUESTIONS];
+
+struct UnkSaveStruct1
+{
+ /* 0x0 */ u32 unk0;
+ /* 0x4 */ u32 unk4;
+ /* 0x8 */ u16 unk8;
+ /* 0xA */ u8 unkA;
+ /* 0xB */ u8 playerGender;
+};
+extern struct UnkSaveStruct1 *gUnknown_203B46C;
+
+struct stack_PartnerSprite
+{
+ // size: 0x60
+ u32 unk0;
+ u8 padding[0x18 - 4];
+ struct unkData data;
+ u32 padding2[12];
+};
+
+extern const char gStarterReveal[];
+extern const char gPartnerPrompt[];
+extern const char gPartnerNickPrompt[];
+extern const char gGenderText[];
+extern const char gEndIntroText[];
+extern u32 gGenderMenu;
+extern const char gUnknown_80F42C0;
+
+extern u8 gNatureQuestionTable[NUM_QUIZ_QUESTIONS];
+extern char gAvailablePokemonNames[0x50];
+
+extern const char gHardyDescription[];
+extern const char gDocileDescription[];
+extern const char gBraveDescription[];
+extern const char gJollyDescription[];
+extern const char gImpishDescription[];
+extern const char gNaiveDescription[];
+extern const char gTimidDescription[];
+extern const char gHastyDescription[];
+extern const char gSassyDescription[];
+extern const char gCalmDescription[];
+extern const char gRelaxedDescription[];
+extern const char gLonelyDescription[];
+extern const char gQuirkyDescription[];
+
+
+const char * const gEndIntroTextPtr = gEndIntroText;
+
+const char * const gPersonalityTypeDescriptionTable[NUM_PERSONALITIES] =
+{
+ gHardyDescription,
+ gDocileDescription,
+ gBraveDescription,
+ gJollyDescription,
+ gImpishDescription,
+ gNaiveDescription,
+ gTimidDescription,
+ gHastyDescription,
+ gSassyDescription,
+ gCalmDescription,
+ gRelaxedDescription,
+ gLonelyDescription,
+ gQuirkyDescription
+};
+
+#include "data/nature_description.h"
+
+struct unkData gUnknown_80F4244 =
+{
+ 0, 0,
+ 5, 0,
+ 0xC, 6,
+ 5, 5,
+ 5,0,
+ 0, 0
+};
+
+const char filler[] = "pksdir0"; // CHUNSOFT inserted for aligning data
const s16 gPartners[NUM_PARTNERS] =
{
@@ -25,16 +161,816 @@ const s16 gPartners[NUM_PARTNERS] =
SPECIES_MUDKIP
};
-extern u8 gUnknown_80F42D0[];
-extern u8 gUnknown_80F42F0[];
-extern u8 gUnknown_203B408;
+const struct unkData gUnknown_80F4278 =
+{
+ 0x00, 0x00,
+ 0x03, 0x00,
+ 0x00, 0x00,
+ 0x00, 0x00,
+ 0x00, 0x00,
+ 0x00, 0x00
+};
+
+const struct unkData gUnknown_80F4290 =
+{
+ 0x00, 0x00,
+ 0x06, 0x00,
+ 0x02, 0x02,
+ 0x09, 0x0B,
+ 0x0D, 0x00,
+ 0x00, 0x00
+};
-// Definitely wrong but need to figure out better structure later
-struct FaceData
+const struct unkData gUnknown_80F42A8 =
{
- /* 0x0 */ u8 *unk0[5];
+ 0x00, 0x00,
+ 0x05, 0x00,
+ 0x0E, 0x04,
+ 0x05, 0x05,
+ 0x05, 0x00,
+ 0x00, 0x00
};
+
+
+u8 CreateTestTracker(void)
+{
+ gUnknown_203B400 = MemoryAlloc(sizeof(struct PersonalityStruct_203B400),8);
+ sub_801317C(&gUnknown_203B400->unkb4);
+ InitializeTestStats();
+ sub_8099690(1);
+ return 1;
+}
+
+void InitializeTestStats(void)
+{
+ s32 counter;
+
+ sub_8001024(&gUnknown_203B400->unk4);
+ gUnknown_203B400->FrameCounter = 0;
+ gUnknown_203B400->TestState = 0;
+ gUnknown_203B400->QuestionCounter = 0;
+ for(counter = 0; counter < NUM_PERSONALITIES; counter++){
+ gUnknown_203B400->NatureTotals[counter] = 0;
+ }
+ gUnknown_203B400->currQuestionIndex = 0;
+ for(counter = 0; counter < NUM_QUIZ_QUESTIONS; counter++){
+ gUnknown_203B400->QuestionTracker[counter] = 0;
+ }
+ gUnknown_203B400->playerNature = 0;
+ gUnknown_203B400->playerGender = 0;
+}
+
+u8 HandleTestTrackerState(void)
+{
+ s32 counter;
+
+ s32 iVar1;
+
+ gUnknown_203B400->FrameCounter++;
+ switch(gUnknown_203B400->TestState)
+ {
+ case 0:
+ GenerateNewQuestionOrGender();
+ break;
+ case 1:
+ CallPromptNewQuestion();
+ break;
+ case 2:
+ UpdateNatureTotals();
+ break;
+ case 3:
+ SetPlayerGender();
+ break;
+ case 4:
+ RevealPersonality();
+ break;
+ case 5:
+ RevealStarter();
+ break;
+ case 6:
+ sub_803CA8C();
+ break;
+ case 7:
+ PromptPickPartner();
+ break;
+ case 8:
+ sub_803CAD4();
+ break;
+ case 9:
+ CallCreatePartnerSelectionMenu();
+ break;
+ case 10:
+ PromptForPartnerNickname();
+ break;
+ case 11:
+ sub_803CB5C();
+ break;
+ case 12:
+ sub_803CB7C();
+ break;
+ case 13:
+ PrintEndIntroText();
+ break;
+ case 14:
+ sub_803CBE4();
+ break;
+ case 15:
+ iVar1 = Random() * gUnknown_203B400->FrameCounter;
+ sub_8094D28(Random());
+
+ for(counter = 0; counter < NUM_PERSONALITIES; counter++){
+ iVar1 *= (gUnknown_203B400->NatureTotals[counter] + counter + 3);
+ }
+
+ iVar1 += sub_8094E4C();
+ while (iVar1 == -1) {
+ iVar1 += sub_8094E4C();
+ }
+ sub_8011C40(iVar1);
+ return 3;
+ default:
+ break;
+ }
+ return 0;
+}
+
+void DeleteTestTracker(void)
+{
+ sub_8001044(&gUnknown_203B400->unk4);
+ MemoryFree(gUnknown_203B400);
+ gUnknown_203B400 = NULL;
+}
+
+void GenerateNewQuestionOrGender(void)
+{
+ u8 category;
+ int counter;
+ int newQuestion;
+
+ gUnknown_203B400->QuestionCounter++;
+ if (gUnknown_203B400->QuestionCounter > MAX_ASKED_QUESTIONS) {
+ // We've asked enough questions
+ sub_8014248(gGenderText, 0, 0, &gGenderMenu, 0, 3, 0, 0, 257);
+ gUnknown_203B400->TestState = 3;
+ }
+ else
+ {
+ do {
+ // Generate new question number and make sure we haven't done it
+ newQuestion = RandomCapped(NUM_QUIZ_QUESTIONS);
+ gUnknown_203B400->currQuestionIndex = newQuestion;
+ } while (gUnknown_203B400->QuestionTracker[newQuestion] == 1);
+
+ // Found one so let's get the category
+ category = gNatureQuestionTable[gUnknown_203B400->currQuestionIndex];
+
+ // Mark all of the questions in the category as used
+ for(counter = 0; counter < NUM_QUIZ_QUESTIONS; counter++){
+ if (gNatureQuestionTable[counter] == category)
+ gUnknown_203B400->QuestionTracker[counter] = 1;
+ }
+ gUnknown_203B400->TestState = 1;
+ }
+}
+
+void CallPromptNewQuestion(void)
+{
+ PromptNewQuestion();
+ gUnknown_203B400->TestState = 2;
+}
+
+NAKED
+void UpdateNatureTotals(void)
+{
+ asm_unified(
+ "\tpush {r4-r6,lr}\n"
+ "\tsub sp, 0x4\n"
+ "\tmov r0, sp\n"
+ "\tbl sub_80144A4\n"
+ "\tcmp r0, 0\n"
+ "\tbne _0803C97C\n"
+ "\tldr r3, [sp]\n"
+ "\tcmp r3, 0x63\n"
+ "\tbne _0803C944\n"
+ "\tldr r0, _0803C940\n"
+ "\tldr r1, [r0]\n"
+ "\tmovs r0, 0x37\n"
+ "\tstr r0, [r1, 0x3C]\n"
+ "\tmovs r0, 0x1\n"
+ "\tb _0803C97A\n"
+ "\t.align 2, 0\n"
+"_0803C940: .4byte gUnknown_203B400\n"
+"_0803C944:\n"
+ "\tldr r1, _0803C984\n"
+ "\tldr r2, _0803C988\n"
+ "\tldr r0, [r2]\n"
+ "\tldr r0, [r0, 0x3C]\n"
+ "\tlsls r0, 2\n"
+ "\tadds r0, r1\n"
+ "\tldr r0, [r0]\n"
+ "\tldr r4, [r0, 0x8]\n"
+ "\tlsls r0, r3, 4\n"
+ "\tadds r4, r0\n"
+ "\tmovs r3, 0\n"
+ "\tadds r6, r2, 0\n"
+ "\tadds r5, r6, 0\n"
+"_0803C95E:\n"
+ "\tldr r1, [r5]\n"
+ "\tlsls r0, r3, 2\n"
+ "\tadds r1, 0x44\n"
+ "\tadds r1, r0\n"
+ "\tadds r0, r4, r3\n"
+ "\tldrb r2, [r0]\n"
+ "\tldr r0, [r1]\n"
+ "\tadds r0, r2\n"
+ "\tstr r0, [r1]\n"
+ "\tadds r3, 0x1\n"
+ "\tcmp r3, 0xC\n"
+ "\tble _0803C95E\n"
+ "\tldr r1, [r6]\n"
+ "\tmovs r0, 0\n"
+"_0803C97A:\n"
+ "\tstr r0, [r1, 0x34]\n"
+"_0803C97C:\n"
+ "\tadd sp, 0x4\n"
+ "\tpop {r4-r6}\n"
+ "\tpop {r0}\n"
+ "\tbx r0\n"
+ "\t.align 2, 0\n"
+"_0803C984: .4byte gPersonalityQuestionPointerTable\n"
+"_0803C988: .4byte gUnknown_203B400"
+ );
+}
+
+void SetPlayerGender(void)
+{
+
+ int gender;
+
+ if (sub_80144A4(&gender) == 0) {
+ if (gender == MALE) {
+ gUnknown_203B400->playerGender = MALE;
+ gUnknown_203B46C->playerGender = MALE;
+ }
+ else
+ {
+ gUnknown_203B400->playerGender = FEMALE;
+ gUnknown_203B46C->playerGender = FEMALE;
+ }
+ sub_8099690(0);
+ gUnknown_203B400->TestState = 4;
+ }
+}
+
+#ifdef NONMATCHING
+void RevealPersonality(void)
+{
+ s32 currentNature;
+ s32 counter;
+
+ gUnknown_203B400->playerNature = RandomCapped(NUM_PERSONALITIES);
+ currentNature = gUnknown_203B400->playerNature;
+
+ // 2 Statements flip-flop but is functionaly equivalent
+ // Struct saving into register and intialize of the counter
+ for(counter = NUM_PERSONALITIES - 2; counter >= 0; counter--){
+ currentNature = currentNature++;
+
+ // Wraparound check
+ if (currentNature > NUM_PERSONALITIES - 1) {
+ currentNature = 0;
+ }
+
+ if (gUnknown_203B400->NatureTotals[currentNature] > gUnknown_203B400->NatureTotals[gUnknown_203B400->playerNature]) {
+ gUnknown_203B400->playerNature = currentNature;
+ }
+ }
+ gUnknown_203B400->StarterID = gStarters[gUnknown_203B400->playerNature][gUnknown_203B400->playerGender];
+ PrintPersonalityTypeDescription();
+ gUnknown_203B400->TestState = 5;
+}
+#else
+NAKED
+void RevealPersonality(void)
+{
+ asm_unified("\tpush {r4-r7,lr}\n"
+ "\tmovs r0, 0xD\n"
+ "\tbl RandomCapped\n"
+ "\tldr r2, _0803CA4C\n"
+ "\tldr r1, [r2]\n"
+ "\tadds r1, 0x40\n"
+ "\tstrb r0, [r1]\n"
+ "\tldr r0, [r2]\n"
+ "\tadds r0, 0x40\n"
+ "\tldrb r3, [r0]\n"
+ "\tadds r7, r2, 0\n"
+ "\tmovs r5, 0xB\n"
+"_0803C9F2:\n"
+ "\tadds r3, 0x1\n"
+ "\tcmp r3, 0xC\n"
+ "\tble _0803C9FA\n"
+ "\tmovs r3, 0\n"
+"_0803C9FA:\n"
+ "\tldr r0, [r7]\n"
+ "\tlsls r2, r3, 2\n"
+ "\tadds r1, r0, 0\n"
+ "\tadds r1, 0x44\n"
+ "\tadds r2, r1, r2\n"
+ "\tadds r4, r0, 0\n"
+ "\tadds r4, 0x40\n"
+ "\tldrb r0, [r4]\n"
+ "\tlsls r0, 2\n"
+ "\tadds r1, r0\n"
+ "\tldr r2, [r2]\n"
+ "\tldr r0, [r1]\n"
+ "\tldr r6, _0803CA4C\n"
+ "\tcmp r2, r0\n"
+ "\tble _0803CA1A\n"
+ "\tstrb r3, [r4]\n"
+"_0803CA1A:\n"
+ "\tsubs r5, 0x1\n"
+ "\tcmp r5, 0\n"
+ "\tbge _0803C9F2\n"
+ "\tldr r3, [r6]\n"
+ "\tldr r2, _0803CA50\n"
+ "\tadds r0, r3, 0\n"
+ "\tadds r0, 0xB0\n"
+ "\tldr r1, [r0]\n"
+ "\tlsls r1, 1\n"
+ "\tsubs r0, 0x70\n"
+ "\tldrb r0, [r0]\n"
+ "\tlsls r0, 2\n"
+ "\tadds r1, r0\n"
+ "\tadds r1, r2\n"
+ "\tldrh r0, [r1]\n"
+ "\tstrh r0, [r3, 0x8]\n"
+ "\tbl PrintPersonalityTypeDescription\n"
+ "\tldr r1, [r6]\n"
+ "\tmovs r0, 0x5\n"
+ "\tstr r0, [r1, 0x34]\n"
+ "\tpop {r4-r7}\n"
+ "\tpop {r0}\n"
+ "\tbx r0\n"
+ "\t.align 2, 0\n"
+"_0803CA4C: .4byte gUnknown_203B400\n"
+"_0803CA50: .4byte gStarters");
+}
+#endif
+
+void RevealStarter(void)
+{
+ s32 temp;
+
+ if (sub_80144A4(&temp) == 0) {
+ sub_80141B4(gStarterReveal,0,0,0x101);
+ PersonalityTest_DisplayStarterSprite();
+ gUnknown_203B400->TestState = 6;
+ }
+}
+
+void sub_803CA8C(void)
+{
+ s32 temp;
+
+ if (sub_80144A4(&temp) == 0) {
+ gUnknown_203B400->TestState = 7;
+ }
+}
+
+void PromptPickPartner(void)
+{
+ sub_80141B4(gPartnerPrompt, 0, 0, 0x301);
+ gUnknown_203B400->TestState = 8;
+}
+
+void sub_803CAD4(void)
+{
+ s32 temp;
+
+ if (sub_80144A4(&temp) == 0) {
+ gUnknown_203B400->TestState = 9;
+ }
+}
+
+void CallCreatePartnerSelectionMenu(void)
+{
+ CreatePartnerSelectionMenu(gUnknown_203B400->StarterID);
+ gUnknown_203B400->TestState = 10;
+}
+
+void PromptForPartnerNickname(void)
+{
+ u16 selectedPartner;
+
+ selectedPartner = HandlePartnerSelectionInput();
+ if (selectedPartner != 0xffff)
+ {
+ if(selectedPartner != 0xfffe) {
+ sub_803CE6C();
+ gUnknown_203B400->PartnerID = selectedPartner;
+ sub_80141B4(gPartnerNickPrompt, 0, 0, 0x301);
+ gUnknown_203B400->TestState = 11;
+ }
+ }
+}
+
+void sub_803CB5C(void)
+{
+ s32 temp;
+
+ if (sub_80144A4(&temp) == 0) {
+ gUnknown_203B400->TestState = 12;
+ }
+}
+
+void sub_803CB7C(void)
+{
+
+ CopyStringtoBuffer(gUnknown_203B400->PartnerNick, GetMonSpecies(gUnknown_203B400->PartnerID));
+ sub_801602C(3, gUnknown_203B400->PartnerNick);
+ gUnknown_203B400->TestState = 13;
+}
+
+void PrintEndIntroText(void)
+{
+ if (sub_8016080() != 0) {
+ sub_80160D8();
+ sub_80141B4(gEndIntroText, 0, 0, 0x301);
+ gUnknown_203B400->TestState = 14;
+ }
+}
+
+void sub_803CBE4(void)
+{
+ s32 temp;
+
+ if (sub_80144A4(&temp) == 0) {
+ gUnknown_203B400->TestState = 15;
+ }
+}
+
+void PromptNewQuestion(void)
+{
+ sub_8014248(gPersonalityQuestionPointerTable[gUnknown_203B400->currQuestionIndex]->question,
+ 0, 0,
+ (void *)gPersonalityQuestionPointerTable[gUnknown_203B400->currQuestionIndex]->answers,
+ 0, 3, 0, 0, 0x101);
+}
+
+void PrintPersonalityTypeDescription(void)
+{
+ CopySpeciesNametoBuffer(gAvailablePokemonNames, gUnknown_203B400->StarterID);
+ sub_80141B4(gPersonalityTypeDescriptionTable[gUnknown_203B400->playerNature],0,
+ 0,0x101);
+}
+
+void PersonalityTest_DisplayStarterSprite(void)
+{
+ s32 starterID;
+ struct OpenedFile *faceFile;
+ int palleteIndex;
+ u8 *r6;
+ u32 faceIndex;
+ struct stack_PartnerSprite stackArray;
+
+ starterID = gUnknown_203B400->StarterID;
+ sub_8006518(&stackArray);
+ stackArray.data = gUnknown_80F4244;
+ ResetUnusedInputStruct();
+ sub_800641C(&stackArray, 1, 0);
+ sub_8008C54(1);
+ sub_80073B8(1);
+ faceFile = GetDialogueSpriteDataPtr(starterID);
+ r6 = ((struct FaceData *)(faceFile->data))->unk0[1 + EMOTION_HAPPY];
+ faceIndex = EMOTION_HAPPY;
+ for(palleteIndex = 0; palleteIndex < 16; palleteIndex++){
+ SetBGPaletteBufferColorArray(palleteIndex + 224, &((struct FaceData *)(faceFile->data))->unk0[faceIndex][palleteIndex << 2]);
+ }
+ sub_800836C(1, r6, 0xe);
+ CloseFile(faceFile);
+ sub_80073E0(1);
+}
+
+#ifdef NONMATCHING
+void CreatePartnerSelectionMenu(s16 starterID)
+{
+ s32 starterID_s32;
+ starterID_s32 = starterID; // force an asr shift.. does lsr without it
+
+ sub_803CEAC(); // creates 203B404
+ gUnknown_203B404->StarterID = starterID_s32;
+ gUnknown_203B404->unk4C = 0;
+ gUnknown_203B404->unk50 = &gUnknown_203B404->unk54;
+
+ gUnknown_203B404->unk54[0] = gUnknown_80F4290;
+ gUnknown_203B404->unk54[1] = gUnknown_80F42A8;
+ gUnknown_203B404->unk54[2] = gUnknown_80F4278;
+ gUnknown_203B404->unk54[3] = gUnknown_80F4278;
+
+ // TODO this is the problem area
+ //gUnknown_203B404->unk50[5] = (u32 *) &gUnknown_203B404->sub; // so weird but think they store the substruct
+
+ gUnknown_203B404->sub.unkb4 = 1;
+ gUnknown_203B404->sub.unkb5 = 0;
+ gUnknown_203B404->sub.unkb6 = 6;
+ gUnknown_203B404->sub.unkb7 = 0;
+ ResetUnusedInputStruct();
+ sub_800641C(gUnknown_203B404->unk54, 1, 1);
+ sub_8013818(&gUnknown_203B404->unk18, GetValidPartners(), 0xA, gUnknown_203B404->unk4C);
+ RedrawPartnerSelectionMenu();
+ PersonalityTest_DisplayPartnerSprite();
+}
+#else
+NAKED
+void CreatePartnerSelectionMenu(s16 starterID)
+{
+ asm_unified("\tpush {r4-r7,lr}\n"
+ "\tadds r4, r0, 0\n"
+ "\tlsls r4, 16\n"
+ "\tasrs r4, 16\n"
+ "\tbl sub_803CEAC\n"
+ "\tldr r5, _0803CDB0\n"
+ "\tldr r0, [r5]\n"
+ "\tmovs r3, 0\n"
+ "\tmovs r1, 0\n"
+ "\tstrh r4, [r0]\n"
+ "\tstr r1, [r0, 0x4C]\n"
+ "\tadds r1, r0, 0\n"
+ "\tadds r1, 0x54\n"
+ "\tstr r1, [r0, 0x50]\n"
+ "\tldr r0, _0803CDB4\n"
+ "\tldm r0!, {r2,r4,r6}\n"
+ "\tstm r1!, {r2,r4,r6}\n"
+ "\tldm r0!, {r2,r4,r7}\n"
+ "\tstm r1!, {r2,r4,r7}\n"
+ "\tldr r1, [r5]\n"
+ "\tadds r1, 0x6C\n"
+ "\tldr r0, _0803CDB8\n"
+ "\tldm r0!, {r2,r6,r7}\n"
+ "\tstm r1!, {r2,r6,r7}\n"
+ "\tldm r0!, {r4,r6,r7}\n"
+ "\tstm r1!, {r4,r6,r7}\n"
+ "\tldr r1, [r5]\n"
+ "\tldr r2, _0803CDBC\n"
+ "\tadds r1, 0x84\n"
+ "\tadds r0, r2, 0\n"
+ "\tldm r0!, {r4,r6,r7}\n"
+ "\tstm r1!, {r4,r6,r7}\n"
+ "\tldm r0!, {r4,r6,r7}\n"
+ "\tstm r1!, {r4,r6,r7}\n"
+ "\tldr r0, [r5]\n"
+ "\tadds r0, 0x9C\n"
+ "\tldm r2!, {r1,r4,r6}\n"
+ "\tstm r0!, {r1,r4,r6}\n"
+ "\tldm r2!, {r1,r4,r7}\n"
+ "\tstm r0!, {r1,r4,r7}\n"
+ "\tldr r0, [r5]\n"
+ "\tldr r1, [r0, 0x50]\n"
+ "\tadds r0, 0xB4\n"
+ "\tstr r0, [r1, 0x14]\n"
+ "\tmovs r1, 0x1\n"
+ "\tstrb r1, [r0]\n"
+ "\tldr r0, [r5]\n"
+ "\tadds r0, 0xB5\n"
+ "\tstrb r3, [r0]\n"
+ "\tldr r0, [r5]\n"
+ "\tadds r0, 0xB6\n"
+ "\tmovs r1, 0x6\n"
+ "\tstrb r1, [r0]\n"
+ "\tldr r0, [r5]\n"
+ "\tadds r0, 0xB7\n"
+ "\tstrb r3, [r0]\n"
+ "\tbl ResetUnusedInputStruct\n"
+ "\tldr r0, [r5]\n"
+ "\tadds r0, 0x54\n"
+ "\tmovs r1, 0x1\n"
+ "\tmovs r2, 0x1\n"
+ "\tbl sub_800641C\n"
+ "\tldr r4, [r5]\n"
+ "\tadds r4, 0x18\n"
+ "\tbl GetValidPartners\n"
+ "\tadds r1, r0, 0\n"
+ "\tldr r0, [r5]\n"
+ "\tldr r3, [r0, 0x4C]\n"
+ "\tadds r0, r4, 0\n"
+ "\tmovs r2, 0xA\n"
+ "\tbl sub_8013818\n"
+ "\tbl RedrawPartnerSelectionMenu\n"
+ "\tbl PersonalityTest_DisplayPartnerSprite\n"
+ "\tpop {r4-r7}\n"
+ "\tpop {r0}\n"
+ "\tbx r0\n"
+ "\t.align 2, 0\n"
+"_0803CDB0: .4byte gUnknown_203B404\n"
+"_0803CDB4: .4byte gUnknown_80F4290\n"
+"_0803CDB8: .4byte gUnknown_80F42A8\n"
+"_0803CDBC: .4byte gUnknown_80F4278");
+}
+
+#endif
+
+u16 HandlePartnerSelectionInput(void)
+{
+ s32 sVar1;
+
+ sVar1 = gUnknown_203B404->currPartnerSelection;
+ gUnknown_203B404->unk16 = 0;
+ if (GetKeyPress(&gUnknown_203B404->unk18) == A_BUTTON) {
+ PlayMenuSoundEffect(0);
+ return gUnknown_203B404->PartnerArray[gUnknown_203B404->currPartnerSelection];
+ }
+ else {
+ if (sub_80138B8(&gUnknown_203B404->unk18, 1) != '\0') {
+ RedrawPartnerSelectionMenu();
+ }
+ if (sVar1 != gUnknown_203B404->currPartnerSelection) {
+ PersonalityTest_DisplayPartnerSprite();
+ }
+ if (gUnknown_203B404->unk16 != '\0') {
+ return -2;
+ }
+ else {
+ return -1;
+ }
+ }
+}
+
+void sub_803CE34(u8 param_1)
+{
+ gUnknown_203B404->numPartners = GetValidPartners();
+ sub_8013984(&gUnknown_203B404->unk18);
+ RedrawPartnerSelectionMenu();
+ PersonalityTest_DisplayPartnerSprite();
+ if (param_1 != 0) {
+ AddMenuCursorSprite(&gUnknown_203B404->unk18);
+ }
+}
+
+void sub_803CE6C()
+{
+ gUnknown_203B404->unk54[gUnknown_203B404->unk4C] = gUnknown_80F4278;
+ ResetUnusedInputStruct();
+ sub_800641C(gUnknown_203B404->unk54, 1, 1);
+ sub_803CECC(); // Free 203B404
+}
+
+void sub_803CEAC(void)
+{
+ gUnknown_203B404 = MemoryAlloc(sizeof(struct PersonalityStruct_203B404), 8);
+ nullsub_135();
+}
+
+void nullsub_135(void)
+{
+}
+
+
+void sub_803CECC(void)
+{
+ if(gUnknown_203B404 != NULL){
+ nullsub_135();
+ MemoryFree(gUnknown_203B404);
+ gUnknown_203B404 = NULL;
+ }
+}
+
+#ifdef NONMATCHING
+void RedrawPartnerSelectionMenu(void)
+{
+ s32 sVar1;
+ u32 uVar2;
+ const char *monName;
+ s32 monCounter;
+
+ sVar1 = sub_80095E4(gUnknown_203B404->unk32, 0xc);
+
+ // Have a feeling this is some graphical thing but
+ // still not sure structure so it's not matching yet bc of that
+ // and some casting stuff
+ sVar1 += 2;
+ sVar1 <<= 16;
+ gUnknown_203B404->unk54[gUnknown_203B404->unk4C].unk0[7] = sVar1;
+ gUnknown_203B404->unk54[gUnknown_203B404->unk4C].unk0[8] = sVar1 + 2;
+
+ // Everything after this matches
+ ResetUnusedInputStruct();
+ sub_800641C(gUnknown_203B404->unk54,1,1);
+ sub_8008C54(gUnknown_203B404->unk4C);
+ sub_80073B8(gUnknown_203B404->unk4C);
+ xxx_call_draw_string(0xc, 0, &gUnknown_80F42C0, gUnknown_203B404->unk4C, 0);
+
+ monCounter = 0;
+ while (monCounter < gUnknown_203B404->unk32) {
+ uVar2 = sub_8013800(&gUnknown_203B404->unk18, monCounter);
+ monName = GetMonSpecies(gUnknown_203B404->PartnerArray[monCounter]);
+ xxx_call_draw_string(8, uVar2, monName, gUnknown_203B404->unk4C, 0);
+ monCounter++;
+ }
+ sub_80073E0(gUnknown_203B404->unk4C);
+ gUnknown_203B404->unk16 = 1;
+}
+#else
+NAKED
+void RedrawPartnerSelectionMenu(void)
+{
+ asm_unified("\tpush {r4-r6,lr}\n"
+ "\tsub sp, 0x4\n"
+ "\tldr r6, _0803CF60\n"
+ "\tldr r0, [r6]\n"
+ "\tmovs r1, 0x32\n"
+ "\tldrsh r0, [r0, r1]\n"
+ "\tmovs r1, 0xC\n"
+ "\tbl sub_80095E4\n"
+ "\tadds r0, 0x2\n"
+ "\tlsls r0, 16\n"
+ "\tldr r2, [r6]\n"
+ "\tldr r3, [r2, 0x4C]\n"
+ "\tlsls r1, r3, 1\n"
+ "\tadds r1, r3\n"
+ "\tlsls r1, 3\n"
+ "\tadds r1, r2, r1\n"
+ "\tadds r1, 0x62\n"
+ "\tmovs r4, 0\n"
+ "\tasrs r3, r0, 16\n"
+ "\tlsrs r0, 16\n"
+ "\tstrh r0, [r1]\n"
+ "\tldr r1, [r2, 0x4C]\n"
+ "\tlsls r0, r1, 1\n"
+ "\tadds r0, r1\n"
+ "\tlsls r0, 3\n"
+ "\tadds r2, r0\n"
+ "\tadds r3, 0x2\n"
+ "\tadds r2, 0x64\n"
+ "\tstrh r3, [r2]\n"
+ "\tbl ResetUnusedInputStruct\n"
+ "\tldr r0, [r6]\n"
+ "\tadds r0, 0x54\n"
+ "\tmovs r1, 0x1\n"
+ "\tmovs r2, 0x1\n"
+ "\tbl sub_800641C\n"
+ "\tldr r0, [r6]\n"
+ "\tldr r0, [r0, 0x4C]\n"
+ "\tbl sub_8008C54\n"
+ "\tldr r0, [r6]\n"
+ "\tldr r0, [r0, 0x4C]\n"
+ "\tbl sub_80073B8\n"
+ "\tldr r2, _0803CF64\n"
+ "\tldr r0, [r6]\n"
+ "\tldr r3, [r0, 0x4C]\n"
+ "\tstr r4, [sp]\n"
+ "\tmovs r0, 0xC\n"
+ "\tmovs r1, 0\n"
+ "\tbl xxx_call_draw_string\n"
+ "\tmovs r5, 0\n"
+ "\tb _0803CF98\n"
+ "\t.align 2, 0\n"
+"_0803CF60: .4byte gUnknown_203B404\n"
+"_0803CF64: .4byte gUnknown_80F42C0\n"
+"_0803CF68:\n"
+ "\tldr r0, [r6]\n"
+ "\tadds r0, 0x18\n"
+ "\tadds r1, r5, 0\n"
+ "\tbl sub_8013800\n"
+ "\tadds r4, r0, 0\n"
+ "\tldr r0, [r6]\n"
+ "\tlsls r1, r5, 1\n"
+ "\tadds r0, 0x2\n"
+ "\tadds r0, r1\n"
+ "\tmovs r1, 0\n"
+ "\tldrsh r0, [r0, r1]\n"
+ "\tbl GetMonSpecies\n"
+ "\tadds r2, r0, 0\n"
+ "\tldr r0, [r6]\n"
+ "\tldr r3, [r0, 0x4C]\n"
+ "\tmovs r0, 0\n"
+ "\tstr r0, [sp]\n"
+ "\tmovs r0, 0x8\n"
+ "\tadds r1, r4, 0\n"
+ "\tbl xxx_call_draw_string\n"
+ "\tadds r5, 0x1\n"
+"_0803CF98:\n"
+ "\tldr r0, [r6]\n"
+ "\tmovs r1, 0x32\n"
+ "\tldrsh r0, [r0, r1]\n"
+ "\tcmp r5, r0\n"
+ "\tblt _0803CF68\n"
+ "\tldr r4, _0803CFBC\n"
+ "\tldr r0, [r4]\n"
+ "\tldr r0, [r0, 0x4C]\n"
+ "\tbl sub_80073E0\n"
+ "\tldr r1, [r4]\n"
+ "\tmovs r0, 0x1\n"
+ "\tstrb r0, [r1, 0x16]\n"
+ "\tadd sp, 0x4\n"
+ "\tpop {r4-r6}\n"
+ "\tpop {r0}\n"
+ "\tbx r0\n"
+ "\t.align 2, 0\n"
+"_0803CFBC: .4byte gUnknown_203B404");
+}
+#endif
+
void PersonalityTest_DisplayPartnerSprite(void)
{
s32 partnerID;
@@ -67,12 +1003,12 @@ s32 GetValidPartners(void)
s32 CurrentPartnerID;
ValidPartnerCounter = 0;
- PlayerType[0] = GetPokemonType(gUnknown_203B404->StarterID,0);
- PlayerType[1] = GetPokemonType(gUnknown_203B404->StarterID,1);
+ PlayerType[0] = GetPokemonType(gUnknown_203B404->StarterID, 0);
+ PlayerType[1] = GetPokemonType(gUnknown_203B404->StarterID, 1);
for(counter = 0; counter < NUM_PARTNERS; counter++){
CurrentPartnerID = gPartners[counter];
- currentPartnerTypes[0] = GetPokemonType(CurrentPartnerID,0);
- currentPartnerTypes[1] = GetPokemonType(CurrentPartnerID,1);
+ currentPartnerTypes[0] = GetPokemonType(CurrentPartnerID, 0);
+ currentPartnerTypes[1] = GetPokemonType(CurrentPartnerID, 1);
if (((currentPartnerTypes[0] == '\0') || ((currentPartnerTypes[0] != PlayerType[0] && (currentPartnerTypes[0] != PlayerType[1]))))
&& ((currentPartnerTypes[1] == '\0' || ((currentPartnerTypes[1] != PlayerType[0] && (currentPartnerTypes[1] != PlayerType[1])))
))) {
@@ -82,23 +1018,3 @@ s32 GetValidPartners(void)
}
return ValidPartnerCounter;
}
-
-u8 sub_803D0D8()
-{
- return gUnknown_203B408;
-}
-
-void sub_803D0E4(u8 r0)
-{
- gUnknown_203B408 = r0;
-}
-
-u8 sub_803D0F0(u8 r0)
-{
- return gUnknown_80F42F0[r0];
-}
-
-u8 sub_803D100(u8 r0)
-{
- return gUnknown_80F42D0[r0];
-}
diff --git a/src/personality_test_pre.c b/src/personality_test_pre.c
deleted file mode 100644
index f2a4032..0000000
--- a/src/personality_test_pre.c
+++ /dev/null
@@ -1,768 +0,0 @@
-#include "global.h"
-#include "personality_test.h"
-#include "constants/emotions.h"
-#include "random.h"
-#include "file_system.h"
-#include "pokemon.h"
-#include "input.h"
-
-extern void* MemoryAlloc(u32, u32);
-extern void MemoryFree(void *);
-extern void sub_801317C(u32 *);
-extern void sub_8099690(u32);
-extern void sub_8001024(u32 *);
-extern s32 sub_8094E4C(void);
-extern void sub_8011C40(s32);
-extern void sub_8094D28(s32);
-extern void sub_8001044(u32 *);
-
-
-
-struct PersonalityAnswer
-{
- const char * text;
- int effect;
-};
-
-struct PersonalityQuestion
-{
- const char * question;
- const struct PersonalityAnswer * answers;
- const u8 (*effects[16]);
-};
-
-extern struct PersonalityQuestion *gPersonalityQuestionPointerTable[NUM_QUIZ_QUESTIONS];
-
-struct UnkSaveStruct1
-{
- /* 0x0 */ u32 unk0;
- /* 0x4 */ u32 unk4;
- /* 0x8 */ u16 unk8;
- /* 0xA */ u8 unkA;
- /* 0xB */ u8 playerGender;
-};
-extern struct UnkSaveStruct1 *gUnknown_203B46C;
-
-// The frick... This is definitely wrong in terms of members
-// There's 5 pointers in the data
-struct FaceData
-{
- /* 0x0 */ u8 *unk0[5];
-};
-
-struct stack_PartnerSprite
-{
- // size: 0x60
- u32 unk0;
- u8 padding[0x18 - 4];
- struct unkData data;
- u32 padding2[12];
-};
-
-extern void sub_80141B4(const char *text, u32 r1, u32 r2, u16 r3);
-extern void sub_8014248(const char *text, u32, u32, u32 *r0, u32, u32, u32, u32, u32);
-
-extern u32 sub_80144A4(s32 *);
-
-extern void sub_803CE6C(void);
-extern char* GetMonSpecies(u32);
-extern void CopyStringtoBuffer(char *r0, char *r1);
-extern void sub_801602C(u32, char *r0);
-
-extern u32 sub_8016080(void);
-extern void sub_80160D8(void);
-extern void sub_8099690(u32);
-extern void CopySpeciesNametoBuffer(char *r0, u32);
-
-extern void sub_8006518(void *);
-extern void sub_800641C(void *, u32, u32);
-extern void sub_80073E0(u32);
-extern void sub_80073B8(u32);
-extern void sub_8008C54(u32);
-extern void sub_800836C(u32, u8 *r0, u32);
-extern void SetBGPaletteBufferColorArray(s32 index, u8 *colorArray);
-
-extern void sub_803CEAC(void);
-extern void RedrawPartnerSelectionMenu(void);
-extern void sub_8013818(u32 *r0, s32, u32, u32);
-
-extern u32 GetKeyPress(struct UnkInputStruct **r0);
-extern u8 sub_80138B8(struct UnkInputStruct **r0, u32);
-extern void PlayMenuSoundEffect(u32);
-
-
-extern void sub_8013984(struct UnkInputStruct **r0);
-extern void AddMenuCursorSprite(struct UnkInputStruct **r0);
-
-extern const char gStarterReveal;
-extern const char gPartnerPrompt;
-extern const char gPartnerNickPrompt;
-extern const char gEndIntroText;
-extern const char gGenderText;
-extern u32 gGenderMenu;
-
-extern u8 gNatureQuestionTable[NUM_QUIZ_QUESTIONS];
-extern const char *gPersonalityTypeDescriptionTable[];
-
-extern char gAvailablePokemonNames[0x50];
-
-
-struct unkData gUnknown_80F4244 =
-{
- 0, 0, 0, 0,
- 5, 0, 0, 0,
- 0xC, 0, 6, 0,
- 5, 0, 5, 0,
- 5, 0, 0, 0,
- 0, 0, 0, 0,
-};
-
-const u8 filler[8] =
-{
- 'p', 'k', 's', 'd', 'i', 'r', '0', 0
-};
-
-extern struct unkData gUnknown_80F4278;
-
-
-u8 CreateTestTracker(void)
-{
- gUnknown_203B400 = MemoryAlloc(sizeof(struct PersonalityStruct_203B400),8);
- sub_801317C(&gUnknown_203B400->unkb4);
- InitializeTestStats();
- sub_8099690(1);
- return 1;
-}
-
-void InitializeTestStats(void)
-{
- s32 counter;
-
- sub_8001024(&gUnknown_203B400->unk4);
- gUnknown_203B400->FrameCounter = 0;
- gUnknown_203B400->TestState = 0;
- gUnknown_203B400->QuestionCounter = 0;
- for(counter = 0; counter < NUM_PERSONALITIES; counter++){
- gUnknown_203B400->NatureTotals[counter] = 0;
- }
- gUnknown_203B400->currQuestionIndex = 0;
- for(counter = 0; counter < NUM_QUIZ_QUESTIONS; counter++){
- gUnknown_203B400->QuestionTracker[counter] = 0;
- }
- gUnknown_203B400->playerNature = 0;
- gUnknown_203B400->playerGender = 0;
-}
-
-u8 HandleTestTrackerState(void)
-{
- s32 counter;
-
- s32 iVar1;
-
- gUnknown_203B400->FrameCounter++;
- switch(gUnknown_203B400->TestState)
- {
- case 0:
- GenerateNewQuestionOrGender();
- break;
- case 1:
- CallPromptNewQuestion();
- break;
- case 2:
- UpdateNatureTotals();
- break;
- case 3:
- SetPlayerGender();
- break;
- case 4:
- RevealPersonality();
- break;
- case 5:
- RevealStarter();
- break;
- case 6:
- sub_803CA8C();
- break;
- case 7:
- PromptPickPartner();
- break;
- case 8:
- sub_803CAD4();
- break;
- case 9:
- CallCreatePartnerSelectionMenu();
- break;
- case 10:
- PromptForPartnerNickname();
- break;
- case 11:
- sub_803CB5C();
- break;
- case 12:
- sub_803CB7C();
- break;
- case 13:
- PrintEndIntroText();
- break;
- case 14:
- sub_803CBE4();
- break;
- case 15:
- iVar1 = Random() * gUnknown_203B400->FrameCounter;
- sub_8094D28(Random());
-
- for(counter = 0; counter < NUM_PERSONALITIES; counter++){
- iVar1 *= (gUnknown_203B400->NatureTotals[counter] + counter + 3);
- }
-
- iVar1 += sub_8094E4C();
- while (iVar1 == -1) {
- iVar1 += sub_8094E4C();
- }
- sub_8011C40(iVar1);
- return 3;
- default:
- break;
- }
- return 0;
-}
-
-void DeleteTestTracker(void)
-{
- sub_8001044(&gUnknown_203B400->unk4);
- MemoryFree(gUnknown_203B400);
- gUnknown_203B400 = NULL;
-}
-
-void GenerateNewQuestionOrGender(void)
-{
- u8 category;
- int counter;
- int newQuestion;
-
- gUnknown_203B400->QuestionCounter++;
- if (gUnknown_203B400->QuestionCounter > MAX_ASKED_QUESTIONS) {
- // We've asked enough questions
- sub_8014248(&gGenderText, 0, 0, &gGenderMenu, 0, 3, 0, 0, 257);
- gUnknown_203B400->TestState = 3;
- }
- else
- {
- do {
- // Generate new question number and make sure we haven't done it
- newQuestion = RandomCapped(NUM_QUIZ_QUESTIONS);
- gUnknown_203B400->currQuestionIndex = newQuestion;
- } while (gUnknown_203B400->QuestionTracker[newQuestion] == 1);
-
- // Found one so let's get the category
- category = gNatureQuestionTable[gUnknown_203B400->currQuestionIndex];
-
- // Mark all of the questions in the category as used
- for(counter = 0; counter < NUM_QUIZ_QUESTIONS; counter++){
- if (gNatureQuestionTable[counter] == category)
- gUnknown_203B400->QuestionTracker[counter] = 1;
- }
- gUnknown_203B400->TestState = 1;
- }
-}
-
-void CallPromptNewQuestion(void)
-{
- PromptNewQuestion();
- gUnknown_203B400->TestState = 2;
-}
-
-NAKED
-void UpdateNatureTotals(void)
-{
- asm_unified(
- "\tpush {r4-r6,lr}\n"
- "\tsub sp, 0x4\n"
- "\tmov r0, sp\n"
- "\tbl sub_80144A4\n"
- "\tcmp r0, 0\n"
- "\tbne _0803C97C\n"
- "\tldr r3, [sp]\n"
- "\tcmp r3, 0x63\n"
- "\tbne _0803C944\n"
- "\tldr r0, _0803C940\n"
- "\tldr r1, [r0]\n"
- "\tmovs r0, 0x37\n"
- "\tstr r0, [r1, 0x3C]\n"
- "\tmovs r0, 0x1\n"
- "\tb _0803C97A\n"
- "\t.align 2, 0\n"
-"_0803C940: .4byte gUnknown_203B400\n"
-"_0803C944:\n"
- "\tldr r1, _0803C984\n"
- "\tldr r2, _0803C988\n"
- "\tldr r0, [r2]\n"
- "\tldr r0, [r0, 0x3C]\n"
- "\tlsls r0, 2\n"
- "\tadds r0, r1\n"
- "\tldr r0, [r0]\n"
- "\tldr r4, [r0, 0x8]\n"
- "\tlsls r0, r3, 4\n"
- "\tadds r4, r0\n"
- "\tmovs r3, 0\n"
- "\tadds r6, r2, 0\n"
- "\tadds r5, r6, 0\n"
-"_0803C95E:\n"
- "\tldr r1, [r5]\n"
- "\tlsls r0, r3, 2\n"
- "\tadds r1, 0x44\n"
- "\tadds r1, r0\n"
- "\tadds r0, r4, r3\n"
- "\tldrb r2, [r0]\n"
- "\tldr r0, [r1]\n"
- "\tadds r0, r2\n"
- "\tstr r0, [r1]\n"
- "\tadds r3, 0x1\n"
- "\tcmp r3, 0xC\n"
- "\tble _0803C95E\n"
- "\tldr r1, [r6]\n"
- "\tmovs r0, 0\n"
-"_0803C97A:\n"
- "\tstr r0, [r1, 0x34]\n"
-"_0803C97C:\n"
- "\tadd sp, 0x4\n"
- "\tpop {r4-r6}\n"
- "\tpop {r0}\n"
- "\tbx r0\n"
- "\t.align 2, 0\n"
-"_0803C984: .4byte gPersonalityQuestionPointerTable\n"
-"_0803C988: .4byte gUnknown_203B400"
- );
-}
-
-void SetPlayerGender(void)
-{
-
- int gender;
-
- if (sub_80144A4(&gender) == 0) {
- if (gender == MALE) {
- gUnknown_203B400->playerGender = MALE;
- gUnknown_203B46C->playerGender = MALE;
- }
- else
- {
- gUnknown_203B400->playerGender = FEMALE;
- gUnknown_203B46C->playerGender = FEMALE;
- }
- sub_8099690(0);
- gUnknown_203B400->TestState = 4;
- }
-}
-
-#ifdef NONMATCHING
-void RevealPersonality(void)
-{
- s32 currentNature;
- s32 counter;
-
- gUnknown_203B400->playerNature = RandomCapped(NUM_PERSONALITIES);
- currentNature = gUnknown_203B400->playerNature;
-
- // 2 Statements flip-flop but is functionaly equivalent
- // Struct saving into register and intialize of the counter
- for(counter = NUM_PERSONALITIES - 2; counter >= 0; counter--){
- currentNature = currentNature++;
-
- // Wraparound check
- if (currentNature > NUM_PERSONALITIES - 1) {
- currentNature = 0;
- }
-
- if (gUnknown_203B400->NatureTotals[currentNature] > gUnknown_203B400->NatureTotals[gUnknown_203B400->playerNature]) {
- gUnknown_203B400->playerNature = currentNature;
- }
- }
- gUnknown_203B400->StarterID = gStarters[gUnknown_203B400->playerNature][gUnknown_203B400->playerGender];
- PrintPersonalityTypeDescription();
- gUnknown_203B400->TestState = 5;
-}
-#else
-NAKED
-void RevealPersonality(void)
-{
- asm_unified("\tpush {r4-r7,lr}\n"
- "\tmovs r0, 0xD\n"
- "\tbl RandomCapped\n"
- "\tldr r2, _0803CA4C\n"
- "\tldr r1, [r2]\n"
- "\tadds r1, 0x40\n"
- "\tstrb r0, [r1]\n"
- "\tldr r0, [r2]\n"
- "\tadds r0, 0x40\n"
- "\tldrb r3, [r0]\n"
- "\tadds r7, r2, 0\n"
- "\tmovs r5, 0xB\n"
-"_0803C9F2:\n"
- "\tadds r3, 0x1\n"
- "\tcmp r3, 0xC\n"
- "\tble _0803C9FA\n"
- "\tmovs r3, 0\n"
-"_0803C9FA:\n"
- "\tldr r0, [r7]\n"
- "\tlsls r2, r3, 2\n"
- "\tadds r1, r0, 0\n"
- "\tadds r1, 0x44\n"
- "\tadds r2, r1, r2\n"
- "\tadds r4, r0, 0\n"
- "\tadds r4, 0x40\n"
- "\tldrb r0, [r4]\n"
- "\tlsls r0, 2\n"
- "\tadds r1, r0\n"
- "\tldr r2, [r2]\n"
- "\tldr r0, [r1]\n"
- "\tldr r6, _0803CA4C\n"
- "\tcmp r2, r0\n"
- "\tble _0803CA1A\n"
- "\tstrb r3, [r4]\n"
-"_0803CA1A:\n"
- "\tsubs r5, 0x1\n"
- "\tcmp r5, 0\n"
- "\tbge _0803C9F2\n"
- "\tldr r3, [r6]\n"
- "\tldr r2, _0803CA50\n"
- "\tadds r0, r3, 0\n"
- "\tadds r0, 0xB0\n"
- "\tldr r1, [r0]\n"
- "\tlsls r1, 1\n"
- "\tsubs r0, 0x70\n"
- "\tldrb r0, [r0]\n"
- "\tlsls r0, 2\n"
- "\tadds r1, r0\n"
- "\tadds r1, r2\n"
- "\tldrh r0, [r1]\n"
- "\tstrh r0, [r3, 0x8]\n"
- "\tbl PrintPersonalityTypeDescription\n"
- "\tldr r1, [r6]\n"
- "\tmovs r0, 0x5\n"
- "\tstr r0, [r1, 0x34]\n"
- "\tpop {r4-r7}\n"
- "\tpop {r0}\n"
- "\tbx r0\n"
- "\t.align 2, 0\n"
-"_0803CA4C: .4byte gUnknown_203B400\n"
-"_0803CA50: .4byte gStarters");
-}
-#endif
-
-void RevealStarter(void)
-{
- s32 temp;
-
- if (sub_80144A4(&temp) == 0) {
- sub_80141B4(&gStarterReveal,0,0,0x101);
- PersonalityTest_DisplayStarterSprite();
- gUnknown_203B400->TestState = 6;
- }
-}
-
-void sub_803CA8C(void)
-{
- s32 temp;
-
- if (sub_80144A4(&temp) == 0) {
- gUnknown_203B400->TestState = 7;
- }
-}
-
-void PromptPickPartner(void)
-{
- sub_80141B4(&gPartnerPrompt, 0, 0, 0x301);
- gUnknown_203B400->TestState = 8;
-}
-
-void sub_803CAD4(void)
-{
- s32 temp;
-
- if (sub_80144A4(&temp) == 0) {
- gUnknown_203B400->TestState = 9;
- }
-}
-
-void CallCreatePartnerSelectionMenu(void)
-{
- CreatePartnerSelectionMenu(gUnknown_203B400->StarterID);
- gUnknown_203B400->TestState = 10;
-}
-
-void PromptForPartnerNickname(void)
-{
- u16 selectedPartner;
-
- selectedPartner = HandlePartnerSelectionInput();
- if (selectedPartner != 0xffff)
- {
- if(selectedPartner != 0xfffe) {
- sub_803CE6C();
- gUnknown_203B400->PartnerID = selectedPartner;
- sub_80141B4(&gPartnerNickPrompt, 0, 0, 0x301);
- gUnknown_203B400->TestState = 11;
- }
- }
-}
-
-void sub_803CB5C(void)
-{
- s32 temp;
-
- if (sub_80144A4(&temp) == 0) {
- gUnknown_203B400->TestState = 12;
- }
-}
-
-void sub_803CB7C(void)
-{
-
- CopyStringtoBuffer(gUnknown_203B400->PartnerNick, GetMonSpecies(gUnknown_203B400->PartnerID));
- sub_801602C(3, gUnknown_203B400->PartnerNick);
- gUnknown_203B400->TestState = 13;
-}
-
-void PrintEndIntroText(void)
-{
- if (sub_8016080() != 0) {
- sub_80160D8();
- sub_80141B4(&gEndIntroText, 0, 0, 0x301);
- gUnknown_203B400->TestState = 14;
- }
-}
-
-void sub_803CBE4(void)
-{
- s32 temp;
-
- if (sub_80144A4(&temp) == 0) {
- gUnknown_203B400->TestState = 15;
- }
-}
-
-void PromptNewQuestion(void)
-{
- sub_8014248(gPersonalityQuestionPointerTable[gUnknown_203B400->currQuestionIndex]->question,
- 0, 0,
- (void *)gPersonalityQuestionPointerTable[gUnknown_203B400->currQuestionIndex]->answers,
- 0, 3, 0, 0, 0x101);
-}
-
-void PrintPersonalityTypeDescription(void)
-{
- CopySpeciesNametoBuffer(gAvailablePokemonNames, gUnknown_203B400->StarterID);
- sub_80141B4(gPersonalityTypeDescriptionTable[gUnknown_203B400->playerNature],0,
- 0,0x101);
-}
-
-void PersonalityTest_DisplayStarterSprite(void)
-{
- s32 starterID;
- struct OpenedFile *faceFile;
- int palleteIndex;
- u8 *r6;
- u32 faceIndex;
- struct stack_PartnerSprite stackArray;
-
- starterID = gUnknown_203B400->StarterID;
- sub_8006518(&stackArray);
- stackArray.data = gUnknown_80F4244;
- ResetUnusedInputStruct();
- sub_800641C(&stackArray, 1, 0);
- sub_8008C54(1);
- sub_80073B8(1);
- faceFile = GetDialogueSpriteDataPtr(starterID);
- r6 = ((struct FaceData *)(faceFile->data))->unk0[1 + EMOTION_HAPPY];
- faceIndex = EMOTION_HAPPY;
- for(palleteIndex = 0; palleteIndex < 16; palleteIndex++){
- SetBGPaletteBufferColorArray(palleteIndex + 224, &((struct FaceData *)(faceFile->data))->unk0[faceIndex][palleteIndex << 2]);
- }
- sub_800836C(1, r6, 0xe);
- CloseFile(faceFile);
- sub_80073E0(1);
-}
-
-#ifdef NONMATCHING
-void CreatePartnerSelectionMenu(s16 starterID)
-{
- s32 starterID_s32;
- starterID_s32 = starterID; // force an asr shift.. does lsr without it
-
- sub_803CEAC(); // creates 203B404
- gUnknown_203B404->StarterID = starterID_s32;
- gUnknown_203B404->unk4C = 0;
- gUnknown_203B404->unk50 = &gUnknown_203B404->unk54;
-
- gUnknown_203B404->unk54[0] = gUnknown_80F4290;
- gUnknown_203B404->unk54[1] = gUnknown_80F42A8;
- gUnknown_203B404->unk54[2] = gUnknown_80F4278;
- gUnknown_203B404->unk54[3] = gUnknown_80F4278;
-
- // TODO this is the problem area
- //gUnknown_203B404->unk50[5] = (u32 *) &gUnknown_203B404->sub; // so weird but think they store the substruct
-
- gUnknown_203B404->sub.unkb4 = 1;
- gUnknown_203B404->sub.unkb5 = 0;
- gUnknown_203B404->sub.unkb6 = 6;
- gUnknown_203B404->sub.unkb7 = 0;
- ResetUnusedInputStruct();
- sub_800641C(gUnknown_203B404->unk54, 1, 1);
- sub_8013818(&gUnknown_203B404->unk18, GetValidPartners(), 0xA, gUnknown_203B404->unk4C);
- RedrawPartnerSelectionMenu();
- PersonalityTest_DisplayPartnerSprite();
-}
-#else
-NAKED
-void CreatePartnerSelectionMenu(s16 starterID)
-{
- asm_unified("\tpush {r4-r7,lr}\n"
- "\tadds r4, r0, 0\n"
- "\tlsls r4, 16\n"
- "\tasrs r4, 16\n"
- "\tbl sub_803CEAC\n"
- "\tldr r5, _0803CDB0\n"
- "\tldr r0, [r5]\n"
- "\tmovs r3, 0\n"
- "\tmovs r1, 0\n"
- "\tstrh r4, [r0]\n"
- "\tstr r1, [r0, 0x4C]\n"
- "\tadds r1, r0, 0\n"
- "\tadds r1, 0x54\n"
- "\tstr r1, [r0, 0x50]\n"
- "\tldr r0, _0803CDB4\n"
- "\tldm r0!, {r2,r4,r6}\n"
- "\tstm r1!, {r2,r4,r6}\n"
- "\tldm r0!, {r2,r4,r7}\n"
- "\tstm r1!, {r2,r4,r7}\n"
- "\tldr r1, [r5]\n"
- "\tadds r1, 0x6C\n"
- "\tldr r0, _0803CDB8\n"
- "\tldm r0!, {r2,r6,r7}\n"
- "\tstm r1!, {r2,r6,r7}\n"
- "\tldm r0!, {r4,r6,r7}\n"
- "\tstm r1!, {r4,r6,r7}\n"
- "\tldr r1, [r5]\n"
- "\tldr r2, _0803CDBC\n"
- "\tadds r1, 0x84\n"
- "\tadds r0, r2, 0\n"
- "\tldm r0!, {r4,r6,r7}\n"
- "\tstm r1!, {r4,r6,r7}\n"
- "\tldm r0!, {r4,r6,r7}\n"
- "\tstm r1!, {r4,r6,r7}\n"
- "\tldr r0, [r5]\n"
- "\tadds r0, 0x9C\n"
- "\tldm r2!, {r1,r4,r6}\n"
- "\tstm r0!, {r1,r4,r6}\n"
- "\tldm r2!, {r1,r4,r7}\n"
- "\tstm r0!, {r1,r4,r7}\n"
- "\tldr r0, [r5]\n"
- "\tldr r1, [r0, 0x50]\n"
- "\tadds r0, 0xB4\n"
- "\tstr r0, [r1, 0x14]\n"
- "\tmovs r1, 0x1\n"
- "\tstrb r1, [r0]\n"
- "\tldr r0, [r5]\n"
- "\tadds r0, 0xB5\n"
- "\tstrb r3, [r0]\n"
- "\tldr r0, [r5]\n"
- "\tadds r0, 0xB6\n"
- "\tmovs r1, 0x6\n"
- "\tstrb r1, [r0]\n"
- "\tldr r0, [r5]\n"
- "\tadds r0, 0xB7\n"
- "\tstrb r3, [r0]\n"
- "\tbl ResetUnusedInputStruct\n"
- "\tldr r0, [r5]\n"
- "\tadds r0, 0x54\n"
- "\tmovs r1, 0x1\n"
- "\tmovs r2, 0x1\n"
- "\tbl sub_800641C\n"
- "\tldr r4, [r5]\n"
- "\tadds r4, 0x18\n"
- "\tbl GetValidPartners\n"
- "\tadds r1, r0, 0\n"
- "\tldr r0, [r5]\n"
- "\tldr r3, [r0, 0x4C]\n"
- "\tadds r0, r4, 0\n"
- "\tmovs r2, 0xA\n"
- "\tbl sub_8013818\n"
- "\tbl RedrawPartnerSelectionMenu\n"
- "\tbl PersonalityTest_DisplayPartnerSprite\n"
- "\tpop {r4-r7}\n"
- "\tpop {r0}\n"
- "\tbx r0\n"
- "\t.align 2, 0\n"
-"_0803CDB0: .4byte gUnknown_203B404\n"
-"_0803CDB4: .4byte gUnknown_80F4290\n"
-"_0803CDB8: .4byte gUnknown_80F42A8\n"
-"_0803CDBC: .4byte gUnknown_80F4278");
-}
-
-#endif
-
-u16 HandlePartnerSelectionInput(void)
-{
- s32 sVar1;
-
- sVar1 = gUnknown_203B404->currPartnerSelection;
- gUnknown_203B404->unk16 = 0;
- if (GetKeyPress(&gUnknown_203B404->unk18) == A_BUTTON) {
- PlayMenuSoundEffect(0);
- return gUnknown_203B404->PartnerArray[gUnknown_203B404->currPartnerSelection];
- }
- else {
- if (sub_80138B8(&gUnknown_203B404->unk18, 1) != '\0') {
- RedrawPartnerSelectionMenu();
- }
- if (sVar1 != gUnknown_203B404->currPartnerSelection) {
- PersonalityTest_DisplayPartnerSprite();
- }
- if (gUnknown_203B404->unk16 != '\0') {
- return -2;
- }
- else {
- return -1;
- }
- }
-}
-
-void sub_803CE34(u8 param_1)
-{
- gUnknown_203B404->numPartners = GetValidPartners();
- sub_8013984(&gUnknown_203B404->unk18);
- RedrawPartnerSelectionMenu();
- PersonalityTest_DisplayPartnerSprite();
- if (param_1 != 0) {
- AddMenuCursorSprite(&gUnknown_203B404->unk18);
- }
-}
-
-void sub_803CE6C()
-{
- gUnknown_203B404->unk54[gUnknown_203B404->unk4C] = gUnknown_80F4278;
- ResetUnusedInputStruct();
- sub_800641C(gUnknown_203B404->unk54, 1, 1);
- sub_803CECC(); // Free 203B404
-}
-
-void sub_803CEAC(void)
-{
- gUnknown_203B404 = MemoryAlloc(sizeof(struct PersonalityStruct_203B404), 8);
- nullsub_135();
-}
-
-void nullsub_135(void)
-{
-}
-
-
-void sub_803CECC(void)
-{
- if(gUnknown_203B404 != NULL){
- nullsub_135();
- MemoryFree(gUnknown_203B404);
- gUnknown_203B404 = NULL;
- }
-}
diff --git a/src/rescue_team_info.c b/src/rescue_team_info.c
new file mode 100644
index 0000000..205ce18
--- /dev/null
+++ b/src/rescue_team_info.c
@@ -0,0 +1,175 @@
+#include "global.h"
+#include "rescue_team_info.h"
+
+extern struct RescueTeamData *gRescueTeamInfoRef;
+extern struct RescueTeamData gRescueTeamInfo;
+
+extern void sub_809485C(u32 *r0, u8 *r1, u32 r2);
+extern void sub_809486C(u32 *r0, u8 *r1, u32 r2);
+extern void sub_809488C(u32 *r0, u8 *r1, u32 r2);
+extern void sub_8094924(u32 *r0, u8 *r1, u32);
+extern void nullsub_102(u32 *r0);
+extern u8 sub_80023E4(u32);
+extern void sub_80922B4(u8 *buffer, u8 *string, s32 size);
+extern void BoundedCopyStringtoBuffer(u8 *buffer, u8 *string, s32 size);
+
+extern const char *gRescueTeamRanks[];
+extern s32 gRescueRankMaxPoints[7];
+extern u8 gTeamNamePlaceholder[0x8]; // Pokemon
+extern u8 gUnknown_810A35B[0x10];
+
+bool32 sub_8092040(u8 param_1)
+{
+ s32 index;
+
+ if (param_1 >= 0xF0)
+ return TRUE;
+ else {
+ index = 0;
+ while (gUnknown_810A35B[index] != 0xF0){
+ if (gUnknown_810A35B[index] == param_1)
+ return TRUE;
+ index++;
+ };
+ return FALSE;
+ }
+}
+
+void LoadRescueTeamInfo(void)
+{
+ gRescueTeamInfoRef = &gRescueTeamInfo;
+}
+
+struct RescueTeamData *GetRescueTeamInfo(void)
+{
+ return &gRescueTeamInfo;
+}
+
+void InitializeResuceTeamInfo(void)
+{
+ BoundedCopyStringtoBuffer(gRescueTeamInfoRef->teamName, gTeamNamePlaceholder, TEAM_NAME_LENGTH);
+ gRescueTeamInfoRef->teamRankPts = 0;
+ gRescueTeamInfoRef->unk10 = 0;
+}
+
+void sub_80920B8(u8 *buffer)
+{
+ s32 counter;
+ for(counter = 0; counter < TEAM_NAME_LENGTH; counter++)
+ {
+ *buffer++ = gRescueTeamInfoRef->teamName[counter];
+ }
+}
+
+void sub_80920D8(u8 *buffer)
+{
+ sub_80922B4(buffer, gRescueTeamInfoRef->teamName, TEAM_NAME_LENGTH);
+}
+
+void SetRescueTeamName(u8 *buffer)
+{
+ s32 counter;
+ for(counter = 0; counter < TEAM_NAME_LENGTH; counter++)
+ {
+ gRescueTeamInfoRef->teamName[counter] = *buffer++;
+ }
+}
+
+s32 GetTeamRankPts(void)
+{
+ return gRescueTeamInfoRef->teamRankPts;
+}
+
+s32 GetPtsToNextRank(void)
+{
+ u8 teamRank;
+
+ teamRank = GetRescueTeamRank();
+ if (teamRank == LUCARIO_RANK) {
+ return 0;
+ }
+ else
+ {
+ return (gRescueRankMaxPoints[teamRank] - gRescueTeamInfoRef->teamRankPts);
+ }
+}
+
+// Unused
+void SetTeamRankPoints(s32 newPts)
+{
+ gRescueTeamInfoRef->teamRankPts = newPts;
+}
+
+void AddToTeamRankPts(s32 newPts)
+{
+ gRescueTeamInfoRef->teamRankPts += newPts;
+ if (gRescueTeamInfoRef->teamRankPts > 99999999) {
+ gRescueTeamInfoRef->teamRankPts = 99999999;
+ }
+}
+
+u8 GetRescueTeamRank(void)
+{
+ s32 rank;
+
+ for(rank = NORMAL_RANK; rank < MAX_TEAM_RANKS; rank++){
+ if (gRescueTeamInfoRef->teamRankPts < gRescueRankMaxPoints[rank]) {
+ return rank;
+ }
+ }
+ return LUCARIO_RANK;
+}
+
+const char *GetTeamRankString(u8 index)
+{
+ return gRescueTeamRanks[index];
+}
+
+// Unused
+u8 sub_80921B8(void)
+{
+ return gRescueTeamInfoRef->unk10;
+}
+
+u32 sub_80921C4(u8 *param_1, u32 param_2)
+
+{
+ u32 auStack36[4];
+ u8 neg1;
+ u8 zero;
+ u8 *puVar2;
+
+ neg1 = -1;
+ zero = 0;
+
+ sub_809486C(auStack36, param_1, param_2);
+ sub_809488C(auStack36, gRescueTeamInfoRef->teamName, 0x58);
+ sub_809488C(auStack36, (u8 *)&gRescueTeamInfoRef->teamRankPts, 0x20);
+ gRescueTeamInfoRef->unk10 = sub_80023E4(0);
+
+ if (gRescueTeamInfoRef->unk10 != 0)
+ {
+ puVar2 = &neg1;
+ }
+ else
+ {
+ puVar2 = &zero;
+ }
+ sub_809488C(auStack36,puVar2,1);
+ nullsub_102(auStack36);
+ return auStack36[2];
+}
+
+u32 sub_809222C(u8 *param_1, u32 param_2)
+{
+ u32 auStack32 [4];
+ u8 byteArray[4];
+
+ sub_809485C(auStack32, param_1, param_2);
+ sub_8094924(auStack32, gRescueTeamInfoRef->teamName, 0x58);
+ sub_8094924(auStack32, (u8 *)&gRescueTeamInfoRef->teamRankPts, 0x20);
+ sub_8094924(auStack32, byteArray, 1);
+ gRescueTeamInfoRef->unk10 = byteArray[0] & 1;
+ nullsub_102(auStack32);
+ return auStack32[2];
+}
diff --git a/src/save.c b/src/save.c
index 181d9c3..36eca52 100644
--- a/src/save.c
+++ b/src/save.c
@@ -6,6 +6,7 @@
#include "pokemon.h"
#include "random.h"
#include "save.h"
+#include "exclusive_pokemon.h"
struct unk_struct
{
@@ -73,7 +74,7 @@ extern u32 gUnknown_203B17C;
extern u32 gUnknown_203B180;
extern u32 *gUnknown_203B45C;
extern u32 *gUnknown_203B460;
-extern u32 gUnknown_203B464;
+extern struct RescueTeamData *gRescueTeamInfoRef;
extern u8 *gFriendAreas;
extern u32 gUnknown_203B46C;
extern u8 *gUnknown_203B480;
@@ -82,7 +83,7 @@ extern u32 *gUnknown_203B488;
extern u32 *gUnknown_203B48C;
extern u32 gUnknown_203B490;
extern u32 gUnknown_203B494;
-extern u8 *gUnknown_203B498;
+extern struct ExclusivePokemonData *gUnknown_203B498;
extern const char gSaveCorrupted;
extern const char gSavingAdventure;
@@ -95,7 +96,7 @@ extern const char gUnknown_80D45AC;
extern const char gUnknown_80D45F4;
extern const char gUnknown_80D4668;
-extern const char gUnknown_80D473C;
+extern const char gSaveNotWritten2;
extern const char gSaveFailed2;
extern volatile struct UnkStruct_203B184 *gUnknown_203B184;
@@ -115,7 +116,6 @@ extern u32 sub_808F2B0(void* a, s32 b);
extern u32 sub_8091C68(u8 *, u32);
extern u32 sub_8091D14(void* a, s32 b);
extern u32 sub_80921C4(u8 *, u32);
-extern u32 sub_809222C(void* a, s32 b);
extern u32 sub_80927A8(u8 *, u32);
extern u32 sub_80927F4(void* a, s32 b);
extern u8 *sub_8095100(void);
@@ -135,8 +135,6 @@ extern u32 *sub_808CE00(void);
extern void sub_808CE08(void);
extern u32 *sub_80909D0(void);
extern void sub_80909D8(void);
-extern u32 sub_809208C(void);
-extern void sub_8092094(void);
extern u32 sub_8094990(void);
extern void sub_8094998(u8 r0);
extern u8 *sub_80950F8(void);
@@ -148,8 +146,6 @@ extern u32 sub_8097680(void);
extern u32 *sub_809769C(void);
extern void sub_80974E8(void);
extern void sub_8097748(void);
-extern u8 *GetExclusivePokemon(void);
-extern void InitializeExclusivePokemon(void);
extern void sub_80993D8(void);
extern struct PlayTimeStruct *gPlayTimeRef;
@@ -523,13 +519,9 @@ u32 sub_8012240(void)
xxx_call_start_bg_music();
MemoryFree(r5);
if(temp != 0)
- {
return 2;
- }
else
- {
return 0;
- }
}
void sub_8012284(void)
@@ -581,7 +573,7 @@ void sub_8012300(void)
InitializeFriendAreas();
sub_808CE08();
sub_80909D8();
- sub_8092094();
+ InitializeResuceTeamInfo();
sub_80972F4();
sub_8095118();
sub_8095900();
@@ -609,7 +601,7 @@ void sub_8012334(struct UnkStruct_203B184 *r0)
gUnknown_203B488 = r0->unk10;
gUnknown_203B48C = r0->unk14;
gUnknown_203B490 = r0->unk18;
- gUnknown_203B464 = r0->unk1C;
+ gRescueTeamInfoRef = r0->RescueTeamInfo;
gUnknown_203B494 = r0->unk20;
gUnknown_203B498 = r0->ExclusivePokemon;
gFriendAreas = r0->BoughtFriendAreas;
@@ -624,7 +616,7 @@ void sub_8012334(struct UnkStruct_203B184 *r0)
gUnknown_203B488 = sub_8095108();
gUnknown_203B48C = sub_8095110();
gUnknown_203B490 = sub_80958F8();
- gUnknown_203B464 = sub_809208C();
+ gRescueTeamInfoRef = GetRescueTeamInfo();
gUnknown_203B494 = sub_8097680();
gUnknown_203B498 = GetExclusivePokemon();
gFriendAreas = GetBoughtFriendAreas();
@@ -661,29 +653,21 @@ u8 sub_8012484(void)
{
sub_80141B4(&gSaveCorrupted, 0, 0, 0x301);
gUnknown_203B188->unk0 = 3;
- break;
}
else
{
gUnknown_203B188->unk0 = 4;
- break;
}
}
else
{
gUnknown_203B188->unk0 = 6;
- break;
}
+ break;
case 3:
if(sub_80144A4(&temp2) == 0)
- {
gUnknown_203B188->unk0 = 4;
- break;
- }
- else
- {
- break;
- }
+ break;
case 4:
sub_8012298();
gUnknown_203B188->unk0 = 6;
@@ -808,7 +792,7 @@ void sub_8012574(s16 PokemonID)
}
#endif
-u8 sub_8012600(void)
+bool8 sub_8012600(void)
{
struct OpenedFile **faceFile;
u32 local_14;
@@ -843,13 +827,9 @@ u8 sub_8012600(void)
{
case 0:
if(gUnknown_203B18C->faceFile != NULL)
- {
sub_80141B4(&gSaveCompleted, 0, (u8 *)faceFile, 0x101);
- }
else
- {
sub_80141B4(&gSaveCompleted, 0, (u8 *)faceFile, 0x101);
- }
gUnknown_203B18C->unk0 = 5;
break;
case 1:
@@ -858,13 +838,9 @@ u8 sub_8012600(void)
break;
default:
if(gUnknown_203B18C->faceFile != NULL)
- {
sub_80141B4(&gSaveFailed, 0, (u8 *)faceFile, 0x101);
- }
else
- {
sub_80141B4(&gSaveFailed, 0, (u8 *)faceFile, 0x101);
- }
gUnknown_203B18C->unk0 = 5;
break;
}
@@ -892,9 +868,7 @@ void sub_8012750(void)
if(gUnknown_203B18C != NULL)
{
if(gUnknown_203B18C->faceFile != NULL)
- {
CloseFile(gUnknown_203B18C->faceFile);
- }
MemoryFree(gUnknown_203B18C);
gUnknown_203B18C = NULL;
}
@@ -966,13 +940,9 @@ void sub_8012850(u8 *r0, u32 r1, u8 r2)
gUnknown_203B194->unkC = r2;
gUnknown_203B194->unk0 = 0;
if(gUnknown_203B194->unkC != 0)
- {
sub_80141B4(&gUnknown_80D45AC, 0, 0, 0x20);
- }
else
- {
sub_80141B4(&gUnknown_80D45AC, 0, 0, 0x20);
- }
}
u32 sub_80128B0(void)
@@ -993,25 +963,19 @@ u32 sub_80128B0(void)
case 2:
stack_1 = 0;
if(gUnknown_203B194->unk10 == 0)
- {
gUnknown_203B194->unk10 = sub_801203C(&stack_1, 2);
- }
switch(gUnknown_203B194->unk10)
{
case 0:
sub_80121E0(0xf1207);
if(gUnknown_203B194->unkC != 0)
- {
sub_80141B4(&gUnknown_80D45F4, 0, 0, 0x301);
- }
else
- {
sub_80141B4(&gUnknown_80D4668, 0, 0, 0x301);
- }
gUnknown_203B194->unk0 = 3;
break;
case 1:
- sub_80141B4(&gUnknown_80D473C, 0, 0, 0);
+ sub_80141B4(&gSaveNotWritten2, 0, 0, 0);
gUnknown_203B194->unk0 = 4;
break;
default:
@@ -1030,13 +994,9 @@ u32 sub_80128B0(void)
break;
case 5:
if(gUnknown_203B194->unk10 == 0)
- {
return 2;
- }
else
- {
return 3;
- }
break;
default:
break;
diff --git a/src/text_util.c b/src/text_util.c
new file mode 100644
index 0000000..02c4239
--- /dev/null
+++ b/src/text_util.c
@@ -0,0 +1,148 @@
+#include "global.h"
+
+#define NUM_POKEMON_TYPES 18
+
+extern const char gNoneText[];
+extern const char gNormalText[];
+extern const char gFireText[];
+extern const char gWaterText[];
+extern const char gGrassText[];
+extern const char gElectricText[];
+extern const char gIceText[];
+extern const char gFightingText[];
+extern const char gPoisonText[];
+extern const char gGroundText[];
+extern const char gFlyingText[];
+extern const char gPsychicText[];
+extern const char gBugText[];
+extern const char gRockText[];
+extern const char gGhostText[];
+extern const char gDragonText[];
+extern const char gDarkText[];
+extern const char gSteelText[];
+
+const char * const gUnformattedTypeStrings[NUM_POKEMON_TYPES] =
+{
+ gNoneText,
+ gNormalText,
+ gFireText,
+ gWaterText,
+ gGrassText,
+ gElectricText,
+ gIceText,
+ gFightingText,
+ gPoisonText,
+ gGroundText,
+ gFlyingText,
+ gPsychicText,
+ gBugText,
+ gRockText,
+ gGhostText,
+ gDragonText,
+ gDarkText,
+ gSteelText,
+};
+
+#include "data/unformatted_type_names.h"
+
+extern const char * gFormattedTypeStrings[NUM_POKEMON_TYPES]; // formatted type names
+
+
+extern u8 *gAbilityNames[];
+extern u8 *AbilityDescriptions[];
+extern u8 gUnknown_810AC7C[];
+extern u8 gUnknown_810AC6A[];
+
+extern u32 gUnknown_810983C[26]; // TODO: verify size later
+
+u32 ReturnIntFromChar(u8 r0)
+{
+ return r0;
+}
+
+u32 ReturnIntFromChar2(u8 r0)
+{
+ return r0;
+}
+
+// Unused
+void sub_8092290(u8 *buffer, u8 *string)
+{
+ while( *string != '\0' ) {
+ *buffer++ = ReturnIntFromChar2(*string++);
+ }
+ *buffer = 0; // append a 0
+}
+
+void sub_80922B4(u8 *buffer, u8 *string, s32 size)
+{
+ while(1)
+ {
+ if(size-- < 1 || *string == '\0')
+ {
+ break;
+ }
+ *buffer++ = ReturnIntFromChar2(*string++);
+ }
+ *buffer = 0; // append a 0
+}
+
+u32 sub_80922E4(u32 r0)
+{
+ return gUnknown_810983C[r0];
+}
+
+void CopyStringtoBuffer(u8 *buffer, u8 *string)
+{
+ while( *string != '\0' ) {
+ *buffer++ = *string++;
+ }
+ *buffer = 0; // append a 0
+}
+
+void BoundedCopyStringtoBuffer(u8 *buffer, u8 *string, s32 size)
+{
+ while( 1 ) {
+ if (size-- < 1) {
+ break;
+ }
+ if (*string == '\0') {
+ *buffer = 0; // append a 0 and break
+ break;
+ }
+ // NOTE: *buffer++ = *string++ cases register flip
+ *buffer = *string;
+ buffer++;
+ string++;
+ }
+}
+
+const char *GetUnformattedTypeString(u8 type)
+{
+ return gUnformattedTypeStrings[type];
+}
+
+const char * GetFormattedTypeString(u8 type)
+{
+ return gFormattedTypeStrings[type];
+}
+
+u8 sub_8092354(u8 index)
+{
+ return gUnknown_810AC7C[index];
+}
+
+u8 sub_8092364(u8 index)
+{
+ return gUnknown_810AC6A[index];
+}
+
+void sub_8092374(char *buffer, u8 index)
+{
+ strncpy(buffer, gAbilityNames[index], 0x50);
+}
+
+u8 *GetAbilityDescription(u8 index)
+{
+ return AbilityDescriptions[index];
+}
diff --git a/src/wonder_mail.c b/src/wonder_mail.c
index 902b67a..d4b7196 100644
--- a/src/wonder_mail.c
+++ b/src/wonder_mail.c
@@ -41,7 +41,7 @@ struct unkStruct_203B2C4
u8 unk0;
u8 padding[3];
u32 unk4; // wonder mail link status??
- u8 unk8[0x36];
+ u8 unk8[0x36]; // Probably a buffer for entry
u8 unk3E;
u32 unk40;
u32 unk44; // another link status
@@ -55,7 +55,7 @@ struct unkStruct_203B2C4
u8 filler360[0x3BC - 0x360];
u32 unk3BC;
u8 filler3C0[0x41C - 0x3C0];
- u8 *unk41C;
+ u32 unk41C;
/* 0x420 */ struct OpenedFile *faceFile;
/* 0x424 */ u8 *faceData;
u16 unk428;
@@ -77,7 +77,7 @@ struct unkStruct_8095228
u8 padding[0x10 - 0x5];
u32 unk10;
u8 padding2[0x20 - 0x14];
- u8 *unk20;
+ u32 unk20;
u8 padding3[0x2C - 0x24];
s8 unk2C;
u8 padding4[0x30 - 0x2D];
@@ -109,35 +109,28 @@ extern u32 sub_8095350();
extern struct unkStruct_8095228 *sub_8095228(u8);
extern u8 sub_80A2824(u32);
-extern u32 gWonderMailErrorText;
-extern u32 gWonderMailNumGBAsText;
-extern u32 gWonderMailWrongModeText;
-extern u32 gWonderMailStorageFullText;
-extern u32 gWonderMailDuplicateText;
-extern u32 gWonderMailNotEligibleReceiveText;
-extern u32 gWonderMailNoRoomText;
-extern u32 gWonderMailFriendErrorText;
-extern u32 gWonderMailPasswordIncorrectText;
-extern u32 gWonderMailSOSPasswordIncorrectText;
-extern u32 gWonderMailDuplicateText;
-extern u32 gWonderMailAOKMailReceivedText;
+#include "data/wonder_mail_1.h"
+
+extern u32 gUnknown_80DED44;
+
+
extern u32 gUnknown_80DDA48;
-extern u32 gUnknown_80DEF04;
-extern u32 gUnknown_80DEF28;
-extern u32 gUnknown_80DEF80;
-extern u32 gUnknown_80DEFDC;
-extern u32 gUnknown_80DF044;
-extern u32 gUnknown_80DF0A0;
-extern u32 gUnknown_80DF0E0;
-extern u32 gUnknown_80DF138;
-extern u32 gUnknown_80DF194;
+extern const char gUnknown_80DEF04[];
+extern const char gUnknown_80DEF28[];
+extern const char gUnknown_80DEF80[];
+extern const char gUnknown_80DEFDC[];
+extern const char gUnknown_80DF044[];
+extern const char gUnknown_80DF0A0[];
+extern const char gUnknown_80DF0E0[];
+extern const char gUnknown_80DF138[];
+extern const char gUnknown_80DF194[];
+
extern char gUnknown_202E5D8[0x50];
extern char gAvailablePokemonNames[0x50];
-extern u8 *gUnknown_80DED44;
extern s32 sub_8095190(void);
extern u32 sub_8095324(u32);
-extern void sub_80141B4(u32 *r0, u32, u32 *r1, u32);
+extern void sub_80141B4(const char *r0, u32, u32 *r1, u32);
extern void nullsub_130(void);
extern void sub_8028348(void);
extern void sub_800641C(void *r0, u8, u8);
@@ -163,7 +156,7 @@ extern void MemoryFree(void *);
extern u32 sub_80154F0();
extern u32 sub_8039068(u32, u8 *r1, u8 *r0);
-extern void sub_8014248(u32 *r0, u32, u32, u32 *r4, u32, u32, u32, u32 *r5, u32);
+extern void sub_8014248(const char *r0, u32, u32, u32 *r4, u32, u32, u32, u32 *r5, u32);
extern void sub_8095274(u32);
extern void sub_80155F0();
extern void sub_80951BC(u8 *r0);
@@ -253,43 +246,43 @@ void sub_8028B1C(u32 r0)
break;
case 1:
case 2:
- sub_80141B4(&gWonderMailErrorText, 0, &gUnknown_203B2C0->unk420, 0x10d);
+ sub_80141B4(gWonderMailErrorText, 0, &gUnknown_203B2C0->unk420, 0x10d);
break;
case 3:
- sub_80141B4(&gWonderMailNumGBAsText, 0, &gUnknown_203B2C0->unk420, 0x10d);
+ sub_80141B4(gWonderMailNumGBAsText, 0, &gUnknown_203B2C0->unk420, 0x10d);
break;
case 4:
- sub_80141B4(&gWonderMailWrongModeText, 0, &gUnknown_203B2C0->unk420, 0x10d);
+ sub_80141B4(gWonderMailWrongModeText, 0, &gUnknown_203B2C0->unk420, 0x10d);
break;
case 5:
- sub_80141B4(&gWonderMailErrorText, 0, &gUnknown_203B2C0->unk420, 0x10d);
+ sub_80141B4(gWonderMailErrorText, 0, &gUnknown_203B2C0->unk420, 0x10d);
break;
case 6:
- sub_80141B4(&gWonderMailStorageFullText, 0, &gUnknown_203B2C0->unk420, 0x10d);
+ sub_80141B4(gWonderMailStorageFullText, 0, &gUnknown_203B2C0->unk420, 0x10d);
break;
case 7:
- sub_80141B4(&gWonderMailDuplicateText, 0, &gUnknown_203B2C0->unk420, 0x10d);
+ sub_80141B4(gWonderMailDuplicateText, 0, &gUnknown_203B2C0->unk420, 0x10d);
break;
case 8:
break;
case 9:
- sub_80141B4(&gWonderMailNotEligibleReceiveText, 0, &gUnknown_203B2C0->unk420, 0x10d);
+ sub_80141B4(gWonderMailNotEligibleReceiveText, 0, &gUnknown_203B2C0->unk420, 0x10d);
break;
case 10:
break;
case 11:
- sub_80141B4(&gWonderMailNotEligibleReceiveText, 0, &gUnknown_203B2C0->unk420, 0x10d);
+ sub_80141B4(gWonderMailNotEligibleReceiveText, 0, &gUnknown_203B2C0->unk420, 0x10d);
break;
case 12:
break;
case 13:
- sub_80141B4(&gWonderMailNoRoomText, 0, &gUnknown_203B2C0->unk420, 0x10d);
+ sub_80141B4(gWonderMailNoRoomText, 0, &gUnknown_203B2C0->unk420, 0x10d);
break;
case 14:
- sub_80141B4(&gWonderMailErrorText, 0, &gUnknown_203B2C0->unk420, 0x10d);
+ sub_80141B4(gWonderMailErrorText, 0, &gUnknown_203B2C0->unk420, 0x10d);
break;
case 15:
- sub_80141B4(&gWonderMailFriendErrorText, 0, &gUnknown_203B2C0->unk420, 0x10d);
+ sub_80141B4(gWonderMailFriendErrorText, 0, &gUnknown_203B2C0->unk420, 0x10d);
break;
default:
break;
@@ -534,7 +527,7 @@ void sub_8028EAC()
{
return;
}
- if(sub_8012600() == 0)
+ if(!sub_8012600())
{
sub_8012750();
sub_8028B04(25);
@@ -599,7 +592,7 @@ void sub_8028F58()
{
return;
}
- if(sub_8012600() == 0)
+ if(!sub_8012600())
{
sub_8012750();
sub_8028B04(2);
@@ -895,7 +888,7 @@ void sub_802939C(void)
{
return;
}
- if(sub_8012600() == 0)
+ if(!sub_8012600())
{
return_var = sub_8012744();
sub_8012750();
@@ -946,15 +939,15 @@ void sub_80293F4(void)
case 9:
break;
case 10:
- sub_8014248(&gWonderMailPasswordIncorrectText, 0, 8, &gUnknown_80DDA48, 0, 4, 0, &gUnknown_203B2C0->unk420, 0xC);
+ sub_8014248(gWonderMailPasswordIncorrectText, 0, 8, &gUnknown_80DDA48, 0, 4, 0, &gUnknown_203B2C0->unk420, 0xC);
sub_8028B04(0x28);
break;
case 11:
- sub_80141B4(&gWonderMailSOSPasswordIncorrectText, 0, &gUnknown_203B2C0->unk420, 0x10d);
+ sub_80141B4(gWonderMailSOSPasswordIncorrectText, 0, &gUnknown_203B2C0->unk420, 0x10d);
sub_8028B04(7);
break;
case 0:
- sub_80141B4(&gWonderMailDuplicateText, 0, &gUnknown_203B2C0->unk420, 0x10d);
+ sub_80141B4(gWonderMailDuplicateText, 0, &gUnknown_203B2C0->unk420, 0x10d);
sub_8028B04(7);
break;
case 12:
@@ -965,7 +958,7 @@ void sub_80293F4(void)
sub_8095274(temp.unk10);
temp.unkArray[0] = 2; // Some sort of Ack?
sub_80951BC(temp.unkArray);
- sub_80141B4(&gWonderMailAOKMailReceivedText, 0, &gUnknown_203B2C0->unk420, 0x101);
+ sub_80141B4(gWonderMailAOKMailReceivedText, 0, &gUnknown_203B2C0->unk420, 0x101);
sub_8028B04(0x23);
break;
case 16:
@@ -1319,7 +1312,7 @@ void sub_8029A88(void)
{
return;
}
- if(sub_8012600() == 0)
+ if(!sub_8012600())
{
sub_8012750();
sub_8028B04(0x39);
@@ -1583,38 +1576,39 @@ void sub_8029EA8(void)
}
}
-void sub_8029EC4(u32 param_1)
+// Is this used for only Thank-You Mail??
+void PrintWonderMailLinkError(u32 param_1)
{
switch(param_1) {
case 3:
- sub_80141B4(&gUnknown_80DEF28, 0, (u32 *)&gUnknown_203B2C4->faceFile, 0x10d);
+ sub_80141B4(gUnknown_80DEF28, 0, (u32 *)&gUnknown_203B2C4->faceFile, 0x10d);
break;
case 4:
- sub_80141B4(&gUnknown_80DEF80, 0, (u32 *)&gUnknown_203B2C4->faceFile, 0x10d);
+ sub_80141B4(gUnknown_80DEF80, 0, (u32 *)&gUnknown_203B2C4->faceFile, 0x10d);
break;
case 6:
- sub_80141B4(&gUnknown_80DEFDC, 0, (u32 *)&gUnknown_203B2C4->faceFile, 0x10d);
+ sub_80141B4(gUnknown_80DEFDC, 0, (u32 *)&gUnknown_203B2C4->faceFile, 0x10d);
break;
case 7:
- sub_80141B4(&gUnknown_80DF044, 0, (u32 *)&gUnknown_203B2C4->faceFile, 0x10d);
+ sub_80141B4(gUnknown_80DF044, 0, (u32 *)&gUnknown_203B2C4->faceFile, 0x10d);
break;
case 9:
- sub_80141B4(&gUnknown_80DF0A0, 0, (u32 *)&gUnknown_203B2C4->faceFile, 0x10d);
+ sub_80141B4(gUnknown_80DF0A0, 0, (u32 *)&gUnknown_203B2C4->faceFile, 0x10d);
break;
case 11:
- sub_80141B4(&gUnknown_80DF0A0, 0, (u32 *)&gUnknown_203B2C4->faceFile, 0x10d);
+ sub_80141B4(gUnknown_80DF0A0, 0, (u32 *)&gUnknown_203B2C4->faceFile, 0x10d);
break;
case 13:
- sub_80141B4(&gUnknown_80DF0E0, 0, (u32 *)&gUnknown_203B2C4->faceFile, 0x10d);
+ sub_80141B4(gUnknown_80DF0E0, 0, (u32 *)&gUnknown_203B2C4->faceFile, 0x10d);
break;
case 1:
case 2:
case 5:
case 14:
- sub_80141B4(&gUnknown_80DEF04, 0, (u32 *)&gUnknown_203B2C4->faceFile, 0x10d);
+ sub_80141B4(gUnknown_80DEF04, 0, (u32 *)&gUnknown_203B2C4->faceFile, 0x10d);
break;
case 15:
- sub_80141B4(&gUnknown_80DF138,0,(u32 *)&gUnknown_203B2C4->faceFile, 0x10d);
+ sub_80141B4(gUnknown_80DF138,0,(u32 *)&gUnknown_203B2C4->faceFile, 0x10d);
break;
case 0:
case 8:
diff --git a/src/wonder_mail_main_menu_pre.c b/src/wonder_mail_main_menu_pre.c
new file mode 100644
index 0000000..c1c5157
--- /dev/null
+++ b/src/wonder_mail_main_menu_pre.c
@@ -0,0 +1,433 @@
+#include "global.h"
+#include "save.h"
+
+struct unkWonderMailData
+{
+ u8 unk0[20];
+};
+
+struct unkStruct_203B3E8
+{
+ // size: 0x49C
+ u8 unk0; // state variable?
+ u8 unk1[0x36]; // Wonder Mail Buffer...
+ struct unkWonderMailData unk38; // 0x30 - 0x14
+ u8 unk38_1[0x30 - 20]; // TODO: split for the ldm/stm stuff (fix dumb hack)
+ u8 fill68[0x1EC - 0x68];
+ u32 unk1EC;
+ u8 fill1F0[0x24C - 0x1F0];
+ u32 unk24C;
+ u32 unk250;
+ u8 fill254[0x3C0 - 0x254];
+ struct unkWonderMailData unk3C0; // 0x3C0 + 0x14
+ u8 fill3D0[0x490 - 0x3D4];
+ u32 unk490;
+ u32 unk494;
+ u8 unk498;
+ u8 unk499;
+ u8 unk49A;
+ u8 unk49B;
+};
+
+extern u32 sub_8095324(u32);
+extern u32 sub_80144A4(s32 *);
+extern u32 sub_8011C1C(void);
+extern struct unkStruct_203B3E8 *gUnknown_203B3E8;
+extern void* MemoryAlloc(u32, u32);
+extern void MemoryFree(void *);
+extern void MemoryFill8(u8 *dest, u8 value, s32 size);
+extern void sub_803A1C0(u8);
+extern void ResetUnusedInputStruct(void);
+extern void sub_800641C(void *, u32, u32);
+extern void sub_8030DE4(void);
+extern void sub_801B450(void);
+extern void sub_803084C(void);
+extern void sub_801CBB8(void);
+extern void sub_80155F0(void);
+extern void sub_8031E10(void);
+
+extern u32 sub_802D0E0();
+extern u8 sub_802D178();
+extern void sub_802D184();
+
+extern s32 sub_80154F0();
+extern bool8 sub_803D358(u8 *, void *);
+extern bool8 sub_80959C0(void *);
+extern void sub_80141B4(u32 *r0, u32, u32 *r1, u32);
+
+void sub_8039BAC(u32);
+void sub_8039A18(void);
+void sub_8039AA8(void);
+void sub_8039B14(void);
+void sub_8039B20(void);
+void sub_8039B58(void);
+void sub_8039D88(void);
+void sub_8039D28(void);
+void sub_8039D68(void);
+void sub_8039DA4(void);
+void sub_8039DCC(void);
+void sub_8039B3C(void);
+void sub_8039D0C(void);
+void sub_8039C60(void);
+void sub_8039DE8(void);
+
+
+extern u32 gUnknown_80E7914;
+extern u32 gUnknown_80E7938;
+extern u32 gUnknown_80E7994;
+extern u32 gUnknown_80E79E4;
+extern u32 gUnknown_80E7A48;
+
+bool8 sub_8039880(void)
+{
+ return (sub_8095324(1) != 0 || sub_8095324(7) != 0 || sub_8011C1C() == 2);
+}
+
+bool8 CreateWonderMailMenu(void)
+{
+ int iVar2;
+
+ ResetUnusedInputStruct();
+ sub_800641C(0,1,1);
+
+ gUnknown_203B3E8 = MemoryAlloc(sizeof(struct unkStruct_203B3E8), 8);
+ MemoryFill8((u8 *)gUnknown_203B3E8, 0, sizeof(struct unkStruct_203B3E8));
+
+ for(iVar2 = 0; iVar2 < 0x36; iVar2++){
+ gUnknown_203B3E8->unk1[iVar2] = 0;
+ }
+
+ gUnknown_203B3E8->unk490 = 3;
+ gUnknown_203B3E8->unk494 = 2;
+ gUnknown_203B3E8->unk498 = 1;
+ gUnknown_203B3E8->unk490 = 5; // ??? Why?
+ sub_803A1C0(0x11); // 0x11 -> Display "Enter Wonder Mail Password"
+ return 1;
+}
+
+u8 UpdateWonderMailMenu(void)
+{
+ switch(gUnknown_203B3E8->unk0) {
+ case 4:
+ sub_8039A18();
+ break;
+ case 5: // When you exit out of the menu
+ return 3;
+ case 8:
+ sub_8039AA8();
+ break;
+ case 11: // "Please enter the Wonder Mail Password" Screen
+ break;
+ case 12: // Password Entry
+ sub_8039B14();
+ break;
+ case 6:
+ sub_8039B20();
+ break;
+ case 9:
+ sub_8039B58();
+ break;
+ case 7:
+ sub_8039D88();
+ break;
+ case 13:
+ sub_8039D28();
+ break;
+ case 14:
+ sub_8039D68();
+ break;
+ case 15:
+ sub_8039DA4();
+ break;
+ case 16:
+ sub_8039DCC();
+ break;
+ case 10:
+ sub_8039B3C();
+ break;
+ case 17:
+ sub_8039D0C();
+ break;
+ case 18:
+ sub_8039C60();
+ break;
+ case 19:
+ sub_8039DE8();
+ }
+ return 0;
+}
+
+void CleanWonderMailMenu(void)
+{
+ if (gUnknown_203B3E8 != NULL) {
+ MemoryFree(gUnknown_203B3E8);
+ gUnknown_203B3E8 = NULL;
+ sub_8030DE4(); // Frees 203B324
+ sub_801B450(); // Frees 203B230
+ sub_803084C(); // Frees 203B320
+ sub_801CBB8(); // Frees 203B244
+ sub_80155F0(); // Frees 203B1FC
+ sub_8031E10(); // Frees 203B334
+ }
+}
+
+void sub_8039A18(void)
+{
+ s32 local_8;
+
+ if (sub_80144A4(&local_8) == 0) {
+ gUnknown_203B3E8->unk24C = 10;
+ switch(local_8) {
+ case 3:
+ case 4:
+ gUnknown_203B3E8->unk490 = 3;
+ sub_803A1C0(8);
+ break;
+ case 5:
+ gUnknown_203B3E8->unk490 = 5;
+ sub_803A1C0(17);
+ break;
+ case 0:
+ case 8:
+ sub_803A1C0(5);
+ break;
+ }
+ }
+}
+
+void sub_8039AA8(void)
+{
+ s32 local_8;
+
+ if (sub_80144A4(&local_8) == 0) {
+ switch(local_8){
+ case 6:
+ if (gUnknown_203B3E8->unk494 == 1) {
+ sub_803A1C0(2);
+ }
+ else {
+ sub_803A1C0(12);
+ }
+ break;
+ case 0:
+ if (gUnknown_203B3E8->unk494 == 1) {
+ sub_803A1C0(1);
+ }
+ else {
+ sub_803A1C0(4);
+ }
+ break;
+ }
+ }
+}
+
+void sub_8039B14(void)
+{
+ sub_803A1C0(6);
+}
+
+void sub_8039B20(void)
+{
+ s32 local_8;
+
+ if (sub_80144A4(&local_8) == 0) {
+ sub_803A1C0(9);
+ }
+}
+
+void sub_8039B3C(void)
+{
+ s32 local_8;
+
+ if (sub_80144A4(&local_8) == 0) {
+ sub_803A1C0(4);
+ }
+}
+
+void sub_8039B58(void)
+{
+ s32 temp;
+
+ if (sub_80144A4(&temp) == 0) {
+ if (gUnknown_203B3E8->unk250 == 0) {
+ switch(gUnknown_203B3E8->unk24C){
+ case 9:
+ sub_803A1C0(7);
+ break;
+ case 10:
+ sub_803A1C0(13);
+ break;
+ }
+ }
+ else {
+ sub_8039BAC(gUnknown_203B3E8->unk250);
+ sub_803A1C0(10);
+ }
+ }
+}
+
+void sub_8039BAC(u32 arg)
+{
+ switch(arg)
+ {
+ case 0:
+ break;
+ case 1:
+ // "Communication Error"
+ sub_80141B4(&gUnknown_80E7914, 0, 0, 0x101);
+ break;
+ case 3:
+ // Incorrect number of GBA Systems
+ sub_80141B4(&gUnknown_80E7938, 0, 0, 0x101);
+ break;
+ case 2:
+ // No response from friend. Redo from start
+ sub_80141B4(&gUnknown_80E7994, 0, 0, 0x101);
+ break;
+ case 4:
+ // Sender and receiver in different modes
+ sub_80141B4(&gUnknown_80E79E4, 0, 0, 0x101);
+ break;
+ case 5:
+ // "Communication Error"
+ sub_80141B4(&gUnknown_80E7914, 0, 0, 0x101);
+ break;
+ case 14:
+ // "Communication Error"
+ sub_80141B4(&gUnknown_80E7914, 0, 0, 0x101);
+ break;
+ case 15: // "No response from your friend. Make sure sender and receiver are ready"
+ sub_80141B4(&gUnknown_80E7A48, 0, 0, 0x101);
+ break;
+ case 6:
+ case 7:
+ case 8:
+ case 9:
+ case 10:
+ case 11:
+ case 12:
+ case 13:
+ default:
+ // "Communication Error"
+ sub_80141B4(&gUnknown_80E7914, 0, 0, 0x101);
+ break;
+
+ }
+}
+
+void sub_8039C60(void)
+{
+ int iVar2;
+
+ iVar2 = sub_80154F0();
+ MemoryFill8((u8 *)&gUnknown_203B3E8->unk38, 0, 0x30);
+ switch(iVar2){
+ case 3:
+ sub_80155F0();
+ ResetUnusedInputStruct();
+ sub_800641C(&gUnknown_203B3E8->unk1EC,1,1);
+ if ( !sub_803D358(gUnknown_203B3E8->unk1,&gUnknown_203B3E8->unk38) || !sub_80959C0(&gUnknown_203B3E8->unk38) )
+ {
+ sub_803A1C0(19);
+ }
+ else {
+ // Copying some data but don't know what or structure
+ gUnknown_203B3E8->unk3C0 = gUnknown_203B3E8->unk38;
+
+ gUnknown_203B3E8->unk498 = 1;
+ sub_803A1C0(13);
+ }
+ break;
+ case 2:
+ sub_80155F0();
+ ResetUnusedInputStruct();
+ sub_800641C(&gUnknown_203B3E8->unk1EC,1,1);
+ sub_803A1C0(5);
+ break;
+ }
+}
+
+void sub_8039D0C(void)
+{
+ int iVar2;
+ if(sub_80144A4(&iVar2) == 0)
+ {
+ sub_803A1C0(0x12);
+ }
+}
+
+void sub_8039D28(void)
+{
+ if (sub_802D0E0() == 3) {
+ gUnknown_203B3E8->unk498 = sub_802D178();
+ sub_802D184();
+ if (gUnknown_203B3E8->unk498 != 0) {
+ sub_803A1C0(0xe);
+ }
+ else {
+ sub_803A1C0(0x10);
+ }
+ }
+}
+
+void sub_8039D68(void)
+{
+ int iVar2;
+ if(sub_80144A4(&iVar2) == 0)
+ {
+ sub_803A1C0(0xF);
+ sub_8012574(0); // "Saving Adventure.."
+ }
+}
+
+void sub_8039D88(void)
+{
+ int iVar2;
+ if(sub_80144A4(&iVar2) == 0)
+ {
+ sub_803A1C0(8);
+ }
+}
+
+void sub_8039DA4(void)
+{
+ int iVar2;
+ if(sub_80144A4(&iVar2) == 0)
+ {
+ if(!sub_8012600())
+ {
+ sub_8012750();
+ sub_803A1C0(0x10);
+ }
+ }
+}
+
+void sub_8039DCC(void)
+{
+ int iVar2;
+ if(sub_80144A4(&iVar2) == 0)
+ {
+ sub_803A1C0(5);
+ }
+}
+
+void sub_8039DE8(void)
+{
+ int iVar2;
+ if(sub_80144A4(&iVar2) == 0)
+ {
+ switch(iVar2)
+ {
+ case 6:
+ sub_803A1C0(0x11);
+ break;
+ case 0:
+ sub_803A1C0(5);
+ break;
+ }
+ }
+}
+
+void nullsub_54(void)
+{
+}
diff --git a/src/wonder_mail_mid.c b/src/wonder_mail_mid.c
index 93b2f5e..0256019 100644
--- a/src/wonder_mail_mid.c
+++ b/src/wonder_mail_mid.c
@@ -38,7 +38,6 @@ extern struct unkStruct_203B2C4 *gUnknown_203B2C4;
extern u16 gUnknown_80E5990[];
-extern struct unkStruct_203B340 *gUnknown_203B340;
extern s32 sub_8001658(u32, u32);
extern u32 gUnknown_80E4A40[];
extern u8 sub_8099B94();
@@ -53,7 +52,7 @@ extern void sub_80141B4(u32 *r0, u32, u32 *r1, u32);
extern void MemoryFill8(u8 *dest, u8 value, s32 size);
extern u32 gUnknown_80DF194;
-extern void sub_8029EC4(u32 param_1);
+extern void PrintWonderMailLinkError(u32 param_1);
extern void sub_802B2BC(u32);
extern u32 sub_80144A4(s32 *r0);
@@ -104,6 +103,7 @@ void sub_8029F98(void)
case 3:
case 5:
case 6:
+ // "Thank-You Mail has been sent"
sub_80141B4(&gUnknown_80DF194, 0, (u32 *)&gUnknown_203B2C4->faceFile, 0x10d);
break;
case 4:
@@ -111,17 +111,17 @@ void sub_8029F98(void)
break;
}
sub_802B2BC(0xD);
- return;
+ break;
case 7:
sub_802B2BC(0x21);
- return;
+ break;
default:
- return;
+ break;
}
}
else
{
- sub_8029EC4(gUnknown_203B2C4->unk44);
+ PrintWonderMailLinkError(gUnknown_203B2C4->unk44);
sub_802B2BC(0x1F);
}
}
@@ -179,13 +179,14 @@ void sub_802A0C8(void)
sub_802B2BC(0x11);
break;
case 4:
- gUnknown_203B2C4->unk4 = 0x10;
- gUnknown_203B2C4->unk218 = sub_80307EC();
- sub_8006518(&gUnknown_203B2C4->unk3BC);
- ResetUnusedInputStruct();
- sub_800641C(0,1,1);
- sub_8030D40(gUnknown_203B2C4->unk218,0);
- sub_802B2BC(0x12);
+ gUnknown_203B2C4->unk4 = 0x10;
+ gUnknown_203B2C4->unk218 = sub_80307EC();
+ sub_8006518(&gUnknown_203B2C4->unk3BC);
+ ResetUnusedInputStruct();
+ sub_800641C(0,1,1);
+ sub_8030D40(gUnknown_203B2C4->unk218,0);
+ sub_802B2BC(0x12);
+ break;
}
}
@@ -211,22 +212,22 @@ void sub_802A174(void)
switch(temp)
{
case 0xB:
- sub_803084C();
- sub_802B2BC(0xe);
- break;
+ sub_803084C();
+ sub_802B2BC(0xe);
+ break;
case 0xC:
- gUnknown_203B2C4->unk4 = 0x2b;
- sub_8006518(&gUnknown_203B2C4->unk3BC);
- ResetUnusedInputStruct();
- sub_800641C(0,1,1);
- sub_8030D40(gUnknown_203B2C4->unk218,0);
- sub_802B2BC(0x12);
- break;
+ gUnknown_203B2C4->unk4 = 0x2b;
+ sub_8006518(&gUnknown_203B2C4->unk3BC);
+ ResetUnusedInputStruct();
+ sub_800641C(0,1,1);
+ sub_8030D40(gUnknown_203B2C4->unk218,0);
+ sub_802B2BC(0x12);
+ break;
case 0:
case 0xD:
- sub_8035CC0(&gUnknown_203B2C4->unk35C,2);
- sub_8030810(1);
- sub_802B2BC(0x10);
+ sub_8035CC0(&gUnknown_203B2C4->unk35C,2);
+ sub_8030810(1);
+ sub_802B2BC(0x10);
default:
break;
}