diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/code_2.c | 4 | ||||
-rw-r--r-- | src/code_80118A4.c | 16 | ||||
-rw-r--r-- | src/code_801D760.c | 102 | ||||
-rw-r--r-- | src/code_803D0D8.c | 25 | ||||
-rw-r--r-- | src/code_8040094.c | 46 | ||||
-rw-r--r-- | src/code_809017C.c | 322 | ||||
-rw-r--r-- | src/code_8098BDC.c | 4 | ||||
-rw-r--r-- | src/code_80A26CC.c | 112 | ||||
-rw-r--r-- | src/data/nature_description.h | 232 | ||||
-rw-r--r-- | src/data/unformatted_type_names.h | 18 | ||||
-rw-r--r-- | src/data/wonder_mail_1.h | 141 | ||||
-rw-r--r-- | src/debug.c | 6 | ||||
-rw-r--r-- | src/exclusive_pokemon.c | 42 | ||||
-rw-r--r-- | src/friend_area.c | 3 | ||||
-rw-r--r-- | src/music.c | 4 | ||||
-rw-r--r-- | src/music_pre.c | 28 | ||||
-rw-r--r-- | src/personality_test.c | 978 | ||||
-rw-r--r-- | src/personality_test_pre.c | 768 | ||||
-rw-r--r-- | src/rescue_team_info.c | 175 | ||||
-rw-r--r-- | src/save.c | 62 | ||||
-rw-r--r-- | src/text_util.c | 148 | ||||
-rw-r--r-- | src/wonder_mail.c | 106 | ||||
-rw-r--r-- | src/wonder_mail_main_menu_pre.c | 433 | ||||
-rw-r--r-- | src/wonder_mail_mid.c | 53 |
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]; +} @@ -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; } |