summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/matsuda_debug_menu.c724
-rw-r--r--src/menu.c2
-rw-r--r--src/text.c4
-rw-r--r--src/trainer_card.c1812
4 files changed, 2449 insertions, 93 deletions
diff --git a/src/matsuda_debug_menu.c b/src/matsuda_debug_menu.c
index 9c20b4078..18f644cbb 100644
--- a/src/matsuda_debug_menu.c
+++ b/src/matsuda_debug_menu.c
@@ -12,7 +12,7 @@
extern u8 gUnknown_0203869A;
extern u8 gUnknown_0203869B;
-extern u8 gUnknown_02038695;
+extern u8 gContestPlayerMonIndex;
extern u16 gScriptContestCategory;
extern u16 gScriptContestRank;
extern u8 (*gCallback_03004AE8)(void);
@@ -39,9 +39,7 @@ extern void sub_805469C(void);
extern void sub_80AE398(u8, u8);
extern void sub_80AE098(u8);
extern void sub_80AA5BC(u8);
-extern void sub_80AA5E8(u16);
-extern void sub_80AA658(u8);
-extern void sub_80AA614(u8, u8);
+extern u32 sub_80AE770(u8, u8);
extern struct Window gMenuWindow;
@@ -74,24 +72,27 @@ extern u8 gMoveNames[][13];
extern u8 gMatsudaDebugMenu_UnknownByteArray[];
extern u32 gMatsudaDebugMenuTextList1[];
+extern u32 gMatsudaDebugMenuTextList2[];
+extern u32 gMatsudaDebugMenuTextList3[];
extern u8 gMatsudaDebugMenuContestTopLeft[][2];
-struct UnknownStruct
-{
- u8 text[2];
- u8 unk2;
- u8 filler3[27];
- u16 unk1E[4];
- u8 unk26;
- u8 unk27;
- u8 unk28;
- u8 unk29;
- u8 unk2A;
- u8 unk2B;
- u8 filler2C[20];
+struct ContestPokemon
+{
+ /* 0x00 */ u16 species;
+ /* 0x02 */ u8 nickname[POKEMON_NAME_LENGTH];
+ /* 0x0D */ u8 trainerName[8];
+ /* 0x15 */ u8 filler15[9];
+ /* 0x1E */ u16 moves[4]; // moves
+ /* 0x26 */ u8 cool; // cool
+ /* 0x27 */ u8 beauty; // beauty
+ /* 0x28 */ u8 cute; // cute
+ /* 0x29 */ u8 smart; // smart
+ /* 0x2A */ u8 tough; // tough
+ /* 0x2B */ u8 sheen; // sheen
+ /* 0x2C */ u8 filler2C[20];
};
-extern struct UnknownStruct gUnknown_02038570[];
+extern struct ContestPokemon gContestMons[];
extern bool8 gReceivedRemoteLinkPlayers;
extern u16 gBlockRecvBuffer[MAX_LINK_PLAYERS][BLOCK_BUFFER_SIZE / 2];
@@ -111,6 +112,9 @@ void sub_80A9E3C(u8 taskId);
void sub_80A9ED8(u8);
void sub_80A9E80(u8);
void sub_80AA280(u8);
+void sub_80AA5E8(u8);
+void sub_80AA614(u8, u8);
+void sub_80AA658(u8);
u8 unref_sub_80A9B28(void)
{
@@ -303,7 +307,7 @@ void sub_80A9F10(u8 taskId)
{
if(gReceivedRemoteLinkPlayers)
{
- gUnknown_02038695 = GetMultiplayerId();
+ gContestPlayerMonIndex = GetMultiplayerId();
if(GetLinkPlayerCount() == 4)
{
gUnknown_0203869A = 1;
@@ -406,7 +410,7 @@ void sub_80AA10C(void)
gPaletteFade.bufferTransferDisabled = 0;
gUnknown_02038694 = 0;
- if(!(gUnknown_02038570[0].unk2))
+ if(!(gContestMons[0].nickname[0]))
sub_80AE398(0, 0);
sub_80AE098(gUnknown_02038694);
@@ -419,9 +423,9 @@ void sub_80AA10C(void)
}
gScriptContestCategory = gScriptContestRank = 0;
- zero = 0;
+ zero = 0; // it's possible this was some assignment that matsuda used to quickly edit and test things without changing whats passed to the later functions.
sub_80AA5BC(zero);
- sub_80AA5E8((u8)gScriptContestRank);
+ sub_80AA5E8(gScriptContestRank);
sub_8003460(&gMenuWindow, gMatsudaDebugMenu_GoBackText, 0xD6, 0x12, 0x12);
sub_8003460(&gMenuWindow, gMatsudaDebugMenu_BattlePointsText, 0xDC, zero, 0xC);
LoadSpriteSheet(gUnknown_083C92B4);
@@ -460,44 +464,704 @@ void sub_80AA280(u8 var)
void sub_80AA340(u8 var)
{
- ConvertIntToDecimalStringN(unk_2000000, gUnknown_02038570[var].unk26, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ ConvertIntToDecimalStringN(unk_2000000, gContestMons[var].cool, STR_CONV_MODE_RIGHT_ALIGN, 3);
sub_8003460(&gMenuWindow, unk_2000000, 0x66, gUnknown_083C9282[0], gUnknown_083C9282[1]);
}
void sub_80AA388(u8 var)
{
- ConvertIntToDecimalStringN(unk_2000000, gUnknown_02038570[var].unk28, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ ConvertIntToDecimalStringN(unk_2000000, gContestMons[var].cute, STR_CONV_MODE_RIGHT_ALIGN, 3);
sub_8003460(&gMenuWindow, unk_2000000, 0x6C, gUnknown_083C9282[2], gUnknown_083C9282[3]);
}
void sub_80AA3D0(u8 var)
{
- ConvertIntToDecimalStringN(unk_2000000, gUnknown_02038570[var].unk27, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ ConvertIntToDecimalStringN(unk_2000000, gContestMons[var].beauty, STR_CONV_MODE_RIGHT_ALIGN, 3);
sub_8003460(&gMenuWindow, unk_2000000, 0x72, gUnknown_083C9282[4], gUnknown_083C9282[5]);
}
void sub_80AA418(u8 var)
{
- ConvertIntToDecimalStringN(unk_2000000, gUnknown_02038570[var].unk29, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ ConvertIntToDecimalStringN(unk_2000000, gContestMons[var].smart, STR_CONV_MODE_RIGHT_ALIGN, 3);
sub_8003460(&gMenuWindow, unk_2000000, 0x78, gUnknown_083C9282[6], gUnknown_083C9282[7]);
}
void sub_80AA460(u8 var)
{
- ConvertIntToDecimalStringN(unk_2000000, gUnknown_02038570[var].unk2A, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ ConvertIntToDecimalStringN(unk_2000000, gContestMons[var].tough, STR_CONV_MODE_RIGHT_ALIGN, 3);
sub_8003460(&gMenuWindow, unk_2000000, 0x7E, gUnknown_083C9282[8], gUnknown_083C9282[9]);
}
void sub_80AA4A8(u8 var)
{
- ConvertIntToDecimalStringN(unk_2000000, gUnknown_02038570[var].unk2B, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ ConvertIntToDecimalStringN(unk_2000000, gContestMons[var].sheen, STR_CONV_MODE_RIGHT_ALIGN, 3);
sub_8003460(&gMenuWindow, unk_2000000, 0x84, gUnknown_083C9282[10], gUnknown_083C9282[11]);
}
void sub_80AA4F0(u8 var1, u8 var2)
{
FillWindowRect_DefaultPalette(&gMenuWindow, 0, gUnknown_083C928E[var2][0], gUnknown_083C928E[var2][1], gUnknown_083C928E[var2][0] + 7, gUnknown_083C928E[var2][1] + 1);
- sub_8003460(&gMenuWindow, gMoveNames[gUnknown_02038570[var1].unk1E[var2]], 0x8A + var2 * 14, gUnknown_083C928E[var2][0], gUnknown_083C928E[var2][1]);
- ConvertIntToDecimalStringN(gStringVar1, gUnknown_02038570[var1].unk1E[var2], STR_CONV_MODE_LEADING_ZEROS, 3);
+ sub_8003460(&gMenuWindow, gMoveNames[gContestMons[var1].moves[var2]], 0x8A + var2 * 14, gUnknown_083C928E[var2][0], gUnknown_083C928E[var2][1]);
+ ConvertIntToDecimalStringN(gStringVar1, gContestMons[var1].moves[var2], STR_CONV_MODE_LEADING_ZEROS, 3);
sub_8003460(&gMenuWindow, gStringVar1, 0xFA + var2 * 6, gUnknown_083C928E[var2][0] + 7, gUnknown_083C928E[var2][1]);
}
+
+void sub_80AA5BC(u8 var)
+{
+ sub_8003460(&gMenuWindow, gMatsudaDebugMenuTextList2[var], 0xC2, 3, 0x12);
+}
+
+void sub_80AA5E8(u8 var)
+{
+ sub_8003460(&gMenuWindow, gMatsudaDebugMenuTextList3[var], 0xE8, 3, 4);
+}
+
+void sub_80AA614(u8 var1, u8 var2)
+{
+ u16 var = sub_80AE770(var1, var2);
+
+ ConvertIntToDecimalStringN(unk_2000000, var, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ sub_8003460(&gMenuWindow, unk_2000000, 0xE2, 3, 0xC);
+}
+
+void sub_80AA658(u8 var)
+{
+ u8 i;
+
+ sub_80AA340(var);
+ sub_80AA388(var);
+ sub_80AA3D0(var);
+ sub_80AA418(var);
+ sub_80AA460(var);
+ sub_80AA4A8(var);
+
+ for(i = 0; i < 4; i++)
+ sub_80AA4F0(var, i);
+}
+
+void SetDebugMonForContest(void)
+{
+ SetMonData(&gPlayerParty, MON_DATA_COOL, &gContestMons[gContestPlayerMonIndex].cool);
+ SetMonData(&gPlayerParty, MON_DATA_CUTE, &gContestMons[gContestPlayerMonIndex].cute);
+ SetMonData(&gPlayerParty, MON_DATA_BEAUTY, &gContestMons[gContestPlayerMonIndex].beauty);
+ SetMonData(&gPlayerParty, MON_DATA_SMART, &gContestMons[gContestPlayerMonIndex].smart);
+ SetMonData(&gPlayerParty, MON_DATA_TOUGH, &gContestMons[gContestPlayerMonIndex].tough);
+ SetMonData(&gPlayerParty, MON_DATA_SHEEN, &gContestMons[gContestPlayerMonIndex].sheen);
+ SetMonData(&gPlayerParty, MON_DATA_MOVE1, &gContestMons[gContestPlayerMonIndex].moves[0]);
+ SetMonData(&gPlayerParty, MON_DATA_MOVE2, &gContestMons[gContestPlayerMonIndex].moves[1]);
+ SetMonData(&gPlayerParty, MON_DATA_MOVE3, &gContestMons[gContestPlayerMonIndex].moves[2]);
+ SetMonData(&gPlayerParty, MON_DATA_MOVE4, &gContestMons[gContestPlayerMonIndex].moves[3]);
+}
+
+// too complicated
+__attribute__((naked))
+void sub_80AA754(struct Sprite *sprite)
+{
+ asm(".syntax unified\n\
+ push {r4,lr}\n\
+ adds r4, r0, 0\n\
+ ldr r0, _080AA774 @ =gMain\n\
+ ldrh r1, [r0, 0x30]\n\
+ cmp r1, 0x20\n\
+ beq _080AA7A2\n\
+ cmp r1, 0x20\n\
+ bgt _080AA782\n\
+ cmp r1, 0x2\n\
+ beq _080AA7F8\n\
+ cmp r1, 0x2\n\
+ bgt _080AA778\n\
+ cmp r1, 0x1\n\
+ beq _080AA7D8\n\
+ b _080AA870\n\
+ .align 2, 0\n\
+_080AA774: .4byte gMain\n\
+_080AA778:\n\
+ cmp r1, 0x8\n\
+ beq _080AA868\n\
+ cmp r1, 0x10\n\
+ beq _080AA7A2\n\
+ b _080AA870\n\
+_080AA782:\n\
+ cmp r1, 0x80\n\
+ beq _080AA7C2\n\
+ cmp r1, 0x80\n\
+ bgt _080AA790\n\
+ cmp r1, 0x40\n\
+ beq _080AA7AC\n\
+ b _080AA870\n\
+_080AA790:\n\
+ movs r0, 0x80\n\
+ lsls r0, 1\n\
+ cmp r1, r0\n\
+ beq _080AA814\n\
+ movs r0, 0x80\n\
+ lsls r0, 2\n\
+ cmp r1, r0\n\
+ beq _080AA834\n\
+ b _080AA870\n\
+_080AA7A2:\n\
+ ldrh r0, [r4, 0x2E]\n\
+ movs r1, 0x1\n\
+ eors r0, r1\n\
+ strh r0, [r4, 0x2E]\n\
+ b _080AA870\n\
+_080AA7AC:\n\
+ ldrh r1, [r4, 0x30]\n\
+ movs r2, 0x30\n\
+ ldrsh r0, [r4, r2]\n\
+ cmp r0, 0\n\
+ bne _080AA7BC\n\
+ movs r0, 0x8\n\
+ strh r0, [r4, 0x30]\n\
+ b _080AA870\n\
+_080AA7BC:\n\
+ subs r0, r1, 0x1\n\
+ strh r0, [r4, 0x30]\n\
+ b _080AA870\n\
+_080AA7C2:\n\
+ ldrh r1, [r4, 0x30]\n\
+ movs r3, 0x30\n\
+ ldrsh r0, [r4, r3]\n\
+ cmp r0, 0x8\n\
+ bne _080AA7D2\n\
+ movs r0, 0\n\
+ strh r0, [r4, 0x30]\n\
+ b _080AA870\n\
+_080AA7D2:\n\
+ adds r0, r1, 0x1\n\
+ strh r0, [r4, 0x30]\n\
+ b _080AA870\n\
+_080AA7D8:\n\
+ ldr r2, _080AA7F4 @ =gUnknown_083C92E4\n\
+ movs r1, 0x2E\n\
+ ldrsh r0, [r4, r1]\n\
+ lsls r0, 2\n\
+ movs r3, 0x30\n\
+ ldrsh r1, [r4, r3]\n\
+ lsls r1, 3\n\
+ adds r0, r1\n\
+ adds r0, r2\n\
+ ldr r2, [r0]\n\
+ adds r0, r4, 0\n\
+ movs r1, 0x1\n\
+ b _080AA84E\n\
+ .align 2, 0\n\
+_080AA7F4: .4byte gUnknown_083C92E4\n\
+_080AA7F8:\n\
+ ldr r1, _080AA810 @ =gUnknown_083C92E4\n\
+ movs r0, 0x2E\n\
+ ldrsh r2, [r4, r0]\n\
+ lsls r2, 2\n\
+ movs r3, 0x30\n\
+ ldrsh r0, [r4, r3]\n\
+ lsls r0, 3\n\
+ adds r2, r0\n\
+ adds r2, r1\n\
+ movs r1, 0x1\n\
+ negs r1, r1\n\
+ b _080AA84A\n\
+ .align 2, 0\n\
+_080AA810: .4byte gUnknown_083C92E4\n\
+_080AA814:\n\
+ ldr r2, _080AA830 @ =gUnknown_083C92E4\n\
+ movs r1, 0x2E\n\
+ ldrsh r0, [r4, r1]\n\
+ lsls r0, 2\n\
+ movs r3, 0x30\n\
+ ldrsh r1, [r4, r3]\n\
+ lsls r1, 3\n\
+ adds r0, r1\n\
+ adds r0, r2\n\
+ ldr r2, [r0]\n\
+ adds r0, r4, 0\n\
+ movs r1, 0xA\n\
+ b _080AA84E\n\
+ .align 2, 0\n\
+_080AA830: .4byte gUnknown_083C92E4\n\
+_080AA834:\n\
+ ldr r1, _080AA864 @ =gUnknown_083C92E4\n\
+ movs r0, 0x2E\n\
+ ldrsh r2, [r4, r0]\n\
+ lsls r2, 2\n\
+ movs r3, 0x30\n\
+ ldrsh r0, [r4, r3]\n\
+ lsls r0, 3\n\
+ adds r2, r0\n\
+ adds r2, r1\n\
+ movs r1, 0xA\n\
+ negs r1, r1\n\
+_080AA84A:\n\
+ ldr r2, [r2]\n\
+ adds r0, r4, 0\n\
+_080AA84E:\n\
+ bl _call_via_r2\n\
+ ldrh r0, [r4, 0x32]\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ ldrh r1, [r4, 0x34]\n\
+ lsls r1, 24\n\
+ lsrs r1, 24\n\
+ bl sub_80AA614\n\
+ b _080AA870\n\
+ .align 2, 0\n\
+_080AA864: .4byte gUnknown_083C92E4\n\
+_080AA868:\n\
+ adds r0, r4, 0\n\
+ movs r1, 0x1\n\
+ bl sub_80AAD08\n\
+_080AA870:\n\
+ ldr r2, _080AA898 @ =gUnknown_083C9296\n\
+ movs r0, 0x2E\n\
+ ldrsh r1, [r4, r0]\n\
+ movs r3, 0x30\n\
+ ldrsh r0, [r4, r3]\n\
+ lsls r0, 1\n\
+ adds r1, r0\n\
+ adds r1, r2\n\
+ ldrb r0, [r1]\n\
+ strh r0, [r4, 0x20]\n\
+ ldr r1, _080AA89C @ =gUnknown_083C92A8\n\
+ movs r2, 0x30\n\
+ ldrsh r0, [r4, r2]\n\
+ adds r0, r1\n\
+ ldrb r0, [r0]\n\
+ strh r0, [r4, 0x22]\n\
+ pop {r4}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_080AA898: .4byte gUnknown_083C9296\n\
+_080AA89C: .4byte gUnknown_083C92A8\n\
+ .syntax divided");
+}
+
+void sub_80AA8A0(struct Sprite *sprite, s8 var1, u8 var2)
+{
+ if(var1 == 1)
+ {
+ sprite->data2 = var2;
+ sub_80AA280(var2);
+ sub_80AA658(sprite->data2);
+ }
+}
+
+void sub_80AA8C8(struct Sprite *sprite, s8 var1)
+{
+ sub_80AA8A0(sprite, var1, 0);
+}
+
+void sub_80AA8D8(struct Sprite *sprite, s8 var1)
+{
+ sub_80AA8A0(sprite, var1, 1);
+}
+
+void sub_80AA8E8(struct Sprite *sprite, s8 var1)
+{
+ sub_80AA8A0(sprite, var1, 2);
+}
+
+void sub_80AA8F8(struct Sprite *sprite, s8 var1)
+{
+ sub_80AA8A0(sprite, var1, 3);
+}
+
+u8 sub_80AA908(u32 a1, u8 a2, s8 a3) // first param is unused.
+{
+ s16 val = a2 + a3;
+
+ if (val > 255)
+ val = 255;
+ else if (val < 0)
+ val = 0;
+
+ return val;
+}
+
+void sub_80AA930(struct Sprite *sprite, u8 var2)
+{
+ u8 val = sprite->data2;
+
+ gContestMons[sprite->data2].cool = sub_80AA908(val, gContestMons[sprite->data2].cool, var2);
+ sub_80AA340(sprite->data2);
+}
+
+void sub_80AA974(struct Sprite *sprite, u8 var2)
+{
+ u8 val = sprite->data2;
+
+ gContestMons[sprite->data2].cute = sub_80AA908(val, gContestMons[sprite->data2].cute, var2);
+ sub_80AA388(sprite->data2);
+}
+
+void sub_80AA9B8(struct Sprite *sprite, u8 var2)
+{
+ u8 val = sprite->data2;
+
+ gContestMons[sprite->data2].beauty = sub_80AA908(val, gContestMons[sprite->data2].beauty, var2);
+ sub_80AA3D0(sprite->data2);
+}
+
+void sub_80AA9FC(struct Sprite *sprite, u8 var2)
+{
+ u8 val = sprite->data2;
+
+ gContestMons[sprite->data2].smart = sub_80AA908(val, gContestMons[sprite->data2].smart, var2);
+ sub_80AA418(sprite->data2);
+}
+
+void sub_80AAA40(struct Sprite *sprite, u8 var2)
+{
+ u8 val = sprite->data2;
+
+ gContestMons[sprite->data2].tough = sub_80AA908(val, gContestMons[sprite->data2].tough, var2);
+ sub_80AA460(sprite->data2);
+}
+
+void sub_80AAA84(struct Sprite *sprite, u8 var2)
+{
+ u8 val = sprite->data2;
+
+ gContestMons[sprite->data2].sheen = sub_80AA908(val, gContestMons[sprite->data2].sheen, var2);
+ sub_80AA4A8(sprite->data2);
+}
+
+// a similar function is at 0x80AA908, however, it apparently returns the wrong type (u8 vs u16).
+u16 sub_80AAAC8(u32 a1, u16 a2, s8 a3) // first param is unused.
+{
+ s16 val = a2 + a3;
+
+ if (val > 354)
+ val = 1;
+ else if (val < 0)
+ val = 354;
+
+ return val;
+}
+
+void sub_80AAAF0(struct Sprite *sprite, u8 var2)
+{
+ u8 val = sprite->data2;
+
+ gContestMons[sprite->data2].moves[0] = sub_80AAAC8(val, gContestMons[sprite->data2].moves[0], var2);
+ sub_80AA4F0(sprite->data2, 0);
+}
+
+void sub_80AAB30(struct Sprite *sprite, u8 var2)
+{
+ u8 val = sprite->data2;
+
+ gContestMons[sprite->data2].moves[1] = sub_80AAAC8(val, gContestMons[sprite->data2].moves[1], var2);
+ sub_80AA4F0(sprite->data2, 1);
+}
+
+void sub_80AAB70(struct Sprite *sprite, u8 var2)
+{
+ u8 val = sprite->data2;
+
+ gContestMons[sprite->data2].moves[2] = sub_80AAAC8(val, gContestMons[sprite->data2].moves[2], var2);
+ sub_80AA4F0(sprite->data2, 2);
+}
+
+void sub_80AABB0(struct Sprite *sprite, u8 var2)
+{
+ u8 val = sprite->data2;
+
+ gContestMons[sprite->data2].moves[3] = sub_80AAAC8(val, gContestMons[sprite->data2].moves[3], var2);
+ sub_80AA4F0(sprite->data2, 3);
+}
+
+// hard/weird function #2
+__attribute__((naked))
+void sub_80AABF0(struct Sprite *sprite, u8 var2)
+{
+ asm(".syntax unified\n\
+ push {r4,r5,lr}\n\
+ adds r5, r0, 0\n\
+ lsls r1, 24\n\
+ movs r0, 0xFF\n\
+ cmp r1, 0\n\
+ ble _080AABFE\n\
+ movs r0, 0x1\n\
+_080AABFE:\n\
+ lsls r0, 24\n\
+ asrs r0, 24\n\
+ ldrh r1, [r5, 0x34]\n\
+ adds r0, r1\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ asrs r0, 24\n\
+ cmp r0, 0\n\
+ bge _080AAC14\n\
+ movs r4, 0\n\
+ b _080AAC1A\n\
+_080AAC14:\n\
+ cmp r0, 0x4\n\
+ ble _080AAC1A\n\
+ movs r4, 0x4\n\
+_080AAC1A:\n\
+ lsls r4, 24\n\
+ lsrs r0, r4, 24\n\
+ bl sub_80AA5BC\n\
+ asrs r4, 24\n\
+ strh r4, [r5, 0x34]\n\
+ ldr r0, _080AAC54 @ =gScriptContestCategory\n\
+ strh r4, [r0]\n\
+ lsls r4, 24\n\
+ lsrs r4, 24\n\
+ ldr r0, _080AAC58 @ =gScriptContestRank\n\
+ ldrb r1, [r0]\n\
+ adds r0, r4, 0\n\
+ bl sub_80AE398\n\
+ ldrh r0, [r5, 0x32]\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ bl sub_80AA280\n\
+ ldrh r0, [r5, 0x32]\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ bl sub_80AA658\n\
+ pop {r4,r5}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_080AAC54: .4byte gScriptContestCategory\n\
+_080AAC58: .4byte gScriptContestRank\n\
+ .syntax divided");
+}
+
+/*
+ thumb_func_start sub_80AABF0
+sub_80AABF0: @ 80AABF0
+ push {r4,r5,lr}
+ adds r5, r0, 0
+ lsls r1, 24
+ movs r0, 0xFF
+ cmp r1, 0
+ ble _080AABFE
+ movs r0, 0x1
+_080AABFE:
+ lsls r0, 24
+ asrs r0, 24
+ ldrh r1, [r5, 0x34]
+ adds r0, r1
+ lsls r0, 24
+ lsrs r4, r0, 24
+ asrs r0, 24
+ cmp r0, 0
+ bge _080AAC14
+ movs r4, 0
+ b _080AAC1A
+_080AAC14:
+ cmp r0, 0x4
+ ble _080AAC1A
+ movs r4, 0x4
+_080AAC1A:
+ lsls r4, 24
+ lsrs r0, r4, 24
+ bl sub_80AA5BC
+ asrs r4, 24
+ strh r4, [r5, 0x34]
+ ldr r0, _080AAC54 @ =gScriptContestCategory
+ strh r4, [r0]
+ lsls r4, 24
+ lsrs r4, 24
+ ldr r0, _080AAC58 @ =gScriptContestRank
+ ldrb r1, [r0]
+ adds r0, r4, 0
+ bl sub_80AE398
+ ldrh r0, [r5, 0x32]
+ lsls r0, 24
+ lsrs r0, 24
+ bl sub_80AA280
+ ldrh r0, [r5, 0x32]
+ lsls r0, 24
+ lsrs r0, 24
+ bl sub_80AA658
+ pop {r4,r5}
+ pop {r0}
+ bx r0
+ .align 2, 0
+_080AAC54: .4byte gScriptContestCategory
+_080AAC58: .4byte gScriptContestRank
+ thumb_func_end sub_80AABF0
+*/
+
+/*
+ thumb_func_start sub_80AA754
+sub_80AA754: @ 80AA754
+ push {r4,lr}
+ adds r4, r0, 0
+ ldr r0, _080AA774 @ =gMain
+ ldrh r1, [r0, 0x30]
+ cmp r1, 0x20
+ beq _080AA7A2
+ cmp r1, 0x20
+ bgt _080AA782
+ cmp r1, 0x2
+ beq _080AA7F8
+ cmp r1, 0x2
+ bgt _080AA778
+ cmp r1, 0x1
+ beq _080AA7D8
+ b _080AA870
+ .align 2, 0
+_080AA774: .4byte gMain
+_080AA778:
+ cmp r1, 0x8
+ beq _080AA868
+ cmp r1, 0x10
+ beq _080AA7A2
+ b _080AA870
+_080AA782:
+ cmp r1, 0x80
+ beq _080AA7C2
+ cmp r1, 0x80
+ bgt _080AA790
+ cmp r1, 0x40
+ beq _080AA7AC
+ b _080AA870
+_080AA790:
+ movs r0, 0x80
+ lsls r0, 1
+ cmp r1, r0
+ beq _080AA814
+ movs r0, 0x80
+ lsls r0, 2
+ cmp r1, r0
+ beq _080AA834
+ b _080AA870
+_080AA7A2:
+ ldrh r0, [r4, 0x2E]
+ movs r1, 0x1
+ eors r0, r1
+ strh r0, [r4, 0x2E]
+ b _080AA870
+_080AA7AC:
+ ldrh r1, [r4, 0x30]
+ movs r2, 0x30
+ ldrsh r0, [r4, r2]
+ cmp r0, 0
+ bne _080AA7BC
+ movs r0, 0x8
+ strh r0, [r4, 0x30]
+ b _080AA870
+_080AA7BC:
+ subs r0, r1, 0x1
+ strh r0, [r4, 0x30]
+ b _080AA870
+_080AA7C2:
+ ldrh r1, [r4, 0x30]
+ movs r3, 0x30
+ ldrsh r0, [r4, r3]
+ cmp r0, 0x8
+ bne _080AA7D2
+ movs r0, 0
+ strh r0, [r4, 0x30]
+ b _080AA870
+_080AA7D2:
+ adds r0, r1, 0x1
+ strh r0, [r4, 0x30]
+ b _080AA870
+_080AA7D8:
+ ldr r2, _080AA7F4 @ =gUnknown_083C92E4
+ movs r1, 0x2E
+ ldrsh r0, [r4, r1]
+ lsls r0, 2
+ movs r3, 0x30
+ ldrsh r1, [r4, r3]
+ lsls r1, 3
+ adds r0, r1
+ adds r0, r2
+ ldr r2, [r0]
+ adds r0, r4, 0
+ movs r1, 0x1
+ b _080AA84E
+ .align 2, 0
+_080AA7F4: .4byte gUnknown_083C92E4
+_080AA7F8:
+ ldr r1, _080AA810 @ =gUnknown_083C92E4
+ movs r0, 0x2E
+ ldrsh r2, [r4, r0]
+ lsls r2, 2
+ movs r3, 0x30
+ ldrsh r0, [r4, r3]
+ lsls r0, 3
+ adds r2, r0
+ adds r2, r1
+ movs r1, 0x1
+ negs r1, r1
+ b _080AA84A
+ .align 2, 0
+_080AA810: .4byte gUnknown_083C92E4
+_080AA814:
+ ldr r2, _080AA830 @ =gUnknown_083C92E4
+ movs r1, 0x2E
+ ldrsh r0, [r4, r1]
+ lsls r0, 2
+ movs r3, 0x30
+ ldrsh r1, [r4, r3]
+ lsls r1, 3
+ adds r0, r1
+ adds r0, r2
+ ldr r2, [r0]
+ adds r0, r4, 0
+ movs r1, 0xA
+ b _080AA84E
+ .align 2, 0
+_080AA830: .4byte gUnknown_083C92E4
+_080AA834:
+ ldr r1, _080AA864 @ =gUnknown_083C92E4
+ movs r0, 0x2E
+ ldrsh r2, [r4, r0]
+ lsls r2, 2
+ movs r3, 0x30
+ ldrsh r0, [r4, r3]
+ lsls r0, 3
+ adds r2, r0
+ adds r2, r1
+ movs r1, 0xA
+ negs r1, r1
+_080AA84A:
+ ldr r2, [r2]
+ adds r0, r4, 0
+_080AA84E:
+ bl _call_via_r2
+ ldrh r0, [r4, 0x32]
+ lsls r0, 24
+ lsrs r0, 24
+ ldrh r1, [r4, 0x34]
+ lsls r1, 24
+ lsrs r1, 24
+ bl sub_80AA614
+ b _080AA870
+ .align 2, 0
+_080AA864: .4byte gUnknown_083C92E4
+_080AA868:
+ adds r0, r4, 0
+ movs r1, 0x1
+ bl sub_80AAD08
+_080AA870:
+ ldr r2, _080AA898 @ =gUnknown_083C9296
+ movs r0, 0x2E
+ ldrsh r1, [r4, r0]
+ movs r3, 0x30
+ ldrsh r0, [r4, r3]
+ lsls r0, 1
+ adds r1, r0
+ adds r1, r2
+ ldrb r0, [r1]
+ strh r0, [r4, 0x20]
+ ldr r1, _080AA89C @ =gUnknown_083C92A8
+ movs r2, 0x30
+ ldrsh r0, [r4, r2]
+ adds r0, r1
+ ldrb r0, [r0]
+ strh r0, [r4, 0x22]
+ pop {r4}
+ pop {r0}
+ bx r0
+ .align 2, 0
+_080AA898: .4byte gUnknown_083C9296
+_080AA89C: .4byte gUnknown_083C92A8
+ thumb_func_end sub_80AA754
+*/
diff --git a/src/menu.c b/src/menu.c
index ae0dca058..0b5eab831 100644
--- a/src/menu.c
+++ b/src/menu.c
@@ -120,7 +120,7 @@ void MenuLoadTextWindowGraphics(void)
LoadTextWindowGraphics(gMenuWindowPtr);
}
-void BasicInitMenuWindow(struct WindowConfig *winConfig)
+void BasicInitMenuWindow(const struct WindowConfig *winConfig)
{
InitWindowFromConfig(gMenuWindowPtr, winConfig);
gMenuWindowPtr->tileDataStartOffset = gMenuTextTileOffset;
diff --git a/src/text.c b/src/text.c
index d64d5db15..c632a4fa6 100644
--- a/src/text.c
+++ b/src/text.c
@@ -770,7 +770,7 @@ const struct WindowConfig gWindowConfig_81E6DA8 =
(u16 *)BG_SCREEN_ADDR(11), // tilemap
};
-const struct WindowConfig gWindowConfig_81E6DC4 =
+const struct WindowConfig WindowConfig_TrainerCard_Back_Values =
{
0, // BG number
2, // BG character base block
@@ -791,7 +791,7 @@ const struct WindowConfig gWindowConfig_81E6DC4 =
(u16 *)BG_SCREEN_ADDR(30), // tilemap
};
-const struct WindowConfig gWindowConfig_81E6DE0 =
+const struct WindowConfig WindowConfig_TrainerCard_Back_Labels =
{
0, // BG number
2, // BG character base block
diff --git a/src/trainer_card.c b/src/trainer_card.c
index 84f2d561f..a04ad4359 100644
--- a/src/trainer_card.c
+++ b/src/trainer_card.c
@@ -9,22 +9,33 @@
#include "palette.h"
#include "pokedex.h"
#include "rom4.h"
-#include "save_menu_util.h"
+#include "songs.h"
+#include "sound.h"
#include "sprite.h"
+#include "string_util.h"
#include "task.h"
typedef void (*Callback)(void);
-struct Struct2000000
-{
- /*0x00*/ u8 filer0[1];
+struct Struct2000000 {
+ /*0x00*/ u8 var_0;
/*0x01*/ bool8 var_1;
- /*0x02*/ u8 filer1[2];
+ /*0x02*/ u8 var_2;
+ /*0x03*/ bool8 var_3;
/*0x04*/ u8 var_4;
/*0x05*/ u8 var_5;
/*0x06*/ u8 var_6;
- /*0x07*/ u8 filler2[0x59];
- /*0x60*/ Callback * var_60;
+ /*0x07*/ bool8 var_7;
+ /*0x08*/ bool8 var_8;
+ /*0x09*/ bool8 var_9;
+ /*0x0A*/ bool8 var_a;
+ /*0x0B*/ bool8 var_b;
+ /*0x0C*/ bool8 var_c;
+ /*0x0D*/ bool8 var_d;
+ /*0x0E*/ u8 var_e[8];
+ /*0x16*/ u8 filler_16[10];
+ /*0x20*/ u8 var_20[4][0x10];
+ /*0x60*/ Callback *var_60;
/*0x64*/ struct TrainerCard var_64;
/*0x9C*/ u8 language; // 0x9C
};
@@ -33,6 +44,32 @@ extern struct Struct2000000 unk_2000000;
extern struct LinkPlayerMapObject gLinkPlayerMapObjects[];
extern struct TrainerCard gTrainerCards[4];
+extern u8 gUnknown_03004DE0[]; // TODO: find out correct type
+
+extern u8 gUnknown_083B5EF4[];
+extern u16 *gUnknown_083B5EF8[5];
+extern u16 gUnknown_083B5F0C[];
+extern u16 gBadgesPalette[];
+extern u16 gUnknown_083B5F4C[];
+
+extern u16 gUnknown_08E8CFC0[];
+extern u16 gUnknown_08E8D9C0[];
+
+extern u8 gOtherText_TrainersTrainerCard[];
+extern u8 gOtherText_FirstHOF[];
+extern u8 gOtherText_LinkCableBattles[];
+extern u8 gOtherText_BattleTowerWinRecord[];
+extern u8 gOtherText_ContestRecord[];
+extern u8 gOtherText_MixingRecord[];
+extern u8 gOtherText_TradeRecord[];
+extern u8 gOtherText_Boy[];
+extern u8 gOtherText_Girl[];
+
+// Other signature than on save_menu_util.h
+void FormatPlayTime(u8 *playtime, u16 hours, u16 minutes, s16 colon);
+
+u16 GetPokedexSeenCount(void);
+
enum {
TD_0,
TD_1,
@@ -44,11 +81,68 @@ static void sub_809323C(void);
static void sub_8093254(void);
static void sub_80932AC(Callback callBack);
static void sub_80932E4(u8 arg1, Callback callBack);
+static void sub_8093324(void);
static void nullsub_60(u8);
static u32 sav12_xor_get_clamped_above(u8 index, u32 maxVal);
static u8 sub_80934F4(struct TrainerCard *);
static void sub_8093534(void);
static void sub_8093550(void);
+static void sub_8093598(void);
+static void sub_80935EC(void);
+static void sub_8093610(void);
+static void sub_8093688(void);
+static void sub_80936D4(void);
+static void sub_80937A4(void);
+static void sub_80937BC(void);
+static void sub_80937D8(void);
+static void sub_80937F0(void);
+static void nullsub_15(void);
+static void sub_8093800(void);
+static void sub_809380C();
+static void sub_809382C(u8 taskId);
+static void sub_80939A4(void);
+static void sub_80939C0(void);
+static void sub_80939DC(u8 taskId);
+static void sub_8093A28(void);
+static u8 sub_8093A48(void);
+static void sub_8093A68(u8 taskId);
+static void sub_8093D7C(void);
+static void sub_8093DAC(void);
+static void sub_8093DC8(void);
+static void sub_8093DEC(void);
+static void sub_8093E04(void);
+static void sub_8093E28(void);
+static void sub_8093EA0(void);
+static void sub_8093EF8(void);
+static void sub_8093F14(void);
+static void sub_8093F48(void);
+static void sub_8093F64(void);
+static void sub_8093F80(void);
+static void sub_8093FD0(void);
+static void sub_8094038(void);
+static void sub_80940E4(void);
+static void sub_8094110(void);
+static void sub_8094140(void);
+static void sub_8094188(void);
+static void TrainerCard_Front_PrintTrainerID(void);
+static void TrainerCard_Front_PrintMoney(void);
+static void TrainerCard_Front_PrintPokedexCount(void);
+static void TrainerCard_Front_PrintPlayTime(u8 *arg1, s16 colon);
+static void sub_809429C(void);
+static void TrainerCard_Back_PrintName(void);
+static void TrainerCard_Back_PrintHallOfFameTime_Label(void);
+static void TrainerCard_Back_PrintHallOfFameTime(void);
+static void TrainerCard_Back_PrintLinkBattlesLabel(void);
+static void TrainerCard_Back_PrintLinkBattles(void);
+static void TrainerCard_Back_PrintBattleTower_Label(void);
+static void TrainerCard_Back_PrintBattleTower(void);
+static void TrainerCard_Back_PrintLinkContests_Label(void);
+static void TrainerCard_Back_PrintLinkContests(void);
+static void TrainerCard_Back_PrintLinkPokeblocks_Label(void);
+static void TrainerCard_Back_PrintLinkPokeblocks(void);
+static void TrainerCard_Back_PrintPokemonTrades_Label(void);
+static void TrainerCard_Back_PrintPokemonTrades(void);
+static void unref_sub_8094588(u16 left, u16 top);
void sub_8093110(Callback arg1) {
sub_80932AC(arg1);
@@ -128,51 +222,19 @@ static void sub_809323C(void) {
UpdatePaletteFade();
}
-__attribute__((naked))
static void sub_8093254(void)
{
- asm(".syntax unified\n\
- push {lr}\n\
- bl LoadOam\n\
- bl ProcessSpriteCopyRequests\n\
- bl TransferPlttBuffer\n\
- ldr r2, _0809329C @ =0x02000000\n\
- ldrb r0, [r2, 0x6]\n\
- adds r0, 0x1\n\
- strb r0, [r2, 0x6]\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- cmp r0, 0x3B\n\
- bls _0809327E\n\
- movs r0, 0\n\
- strb r0, [r2, 0x6]\n\
- ldrb r0, [r2, 0x5]\n\
- movs r1, 0x1\n\
- eors r0, r1\n\
- strb r0, [r2, 0x5]\n\
-_0809327E:\n\
- ldrb r0, [r2, 0x4]\n\
- cmp r0, 0\n\
- beq _08093298\n\
- ldr r1, _080932A0 @ =0x040000d4\n\
- ldr r0, _080932A4 @ =gUnknown_03004DE0\n\
- str r0, [r1]\n\
- movs r2, 0xF0\n\
- lsls r2, 3\n\
- adds r0, r2\n\
- str r0, [r1, 0x4]\n\
- ldr r0, _080932A8 @ =0x800000a0\n\
- str r0, [r1, 0x8]\n\
- ldr r0, [r1, 0x8]\n\
-_08093298:\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
-_0809329C: .4byte 0x02000000\n\
-_080932A0: .4byte 0x040000d4\n\
-_080932A4: .4byte gUnknown_03004DE0\n\
-_080932A8: .4byte 0x800000a0\n\
- .syntax divided\n");
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+ unk_2000000.var_6++;
+ if (unk_2000000.var_6 >= 60)
+ {
+ unk_2000000.var_6 = 0;
+ unk_2000000.var_5 ^= 1;
+ }
+ if (unk_2000000.var_4)
+ DmaCopy16(3, gUnknown_03004DE0, gUnknown_03004DE0 + 0x780, 320);
}
static void sub_80932AC(Callback callBack) {
@@ -191,7 +253,7 @@ static void sub_80932E4(u8 arg1, Callback callBack) {
StoreWordInTwoHalfwords(&task->data[TD_CALLBACK], (u32) callBack);
}
-void sub_8093324(void) {
+static void sub_8093324(void) {
u8 taskId = FindTaskIdByFunc(nullsub_60);
struct Task *task = &gTasks[taskId];
unk_2000000.var_1 = task->data[TD_0];
@@ -250,13 +312,13 @@ void sub_8093390(struct TrainerCard *arg1) {
arg1->pokemonTrades = sav12_xor_get_clamped_above(GAME_STAT_POKEMON_TRADES, 0xFFFF);
// Battle tower?
- arg1->var_18 = gSaveBlock2.filler_A8.var_4C8;
- arg1->var_1A = gSaveBlock2.filler_A8.var_4CA;
- if (arg1->var_18 > 9999) {
- arg1->var_18 = 9999;
+ arg1->battleTowerWins = gSaveBlock2.filler_A8.var_4C8;
+ arg1->battleTowerLosses = gSaveBlock2.filler_A8.var_4CA;
+ if (arg1->battleTowerWins > 9999) {
+ arg1->battleTowerWins = 9999;
}
- if (arg1->var_1A > 9999) {
- arg1->var_1A = 9999;
+ if (arg1->battleTowerLosses > 9999) {
+ arg1->battleTowerLosses = 9999;
}
r4 = FALSE;
@@ -275,11 +337,11 @@ void sub_8093390(struct TrainerCard *arg1) {
arg1->playerName[i] = gSaveBlock2.playerName[i];
}
- arg1->var_1 = sub_80934F4(arg1);
+ arg1->stars = sub_80934F4(arg1);
}
u8 sub_80934C4(u8 id) {
- return gTrainerCards[id].var_1;
+ return gTrainerCards[id].stars;
}
static u32 sav12_xor_get_clamped_above(u8 index, u32 maxVal) {
@@ -303,7 +365,7 @@ static u8 sub_80934F4(struct TrainerCard *trainerCard) {
value += 1;
}
- if (trainerCard->var_1A > 49) {
+ if (trainerCard->battleTowerLosses > 49) {
value += 1;
}
@@ -333,3 +395,1633 @@ static void sub_8093550(void) {
REG_DISPSTAT |= DISPSTAT_VBLANK_INTR | DISPSTAT_HBLANK_INTR;
REG_DISPCNT = 0x1f40;
}
+
+__attribute__((naked))
+void sub_8093598() {
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ sub sp, 0x4\n\
+ movs r2, 0xC0\n\
+ lsls r2, 19\n\
+ movs r3, 0x80\n\
+ lsls r3, 9\n\
+ mov r4, sp\n\
+ movs r6, 0\n\
+ ldr r1, _080935E4 @ =0x040000d4\n\
+ movs r5, 0x80\n\
+ lsls r5, 5\n\
+ ldr r7, _080935E8 @ =0x81000800\n\
+ movs r0, 0x81\n\
+ lsls r0, 24\n\
+ mov r12, r0\n\
+_080935B6:\n\
+ strh r6, [r4]\n\
+ mov r0, sp\n\
+ str r0, [r1]\n\
+ str r2, [r1, 0x4]\n\
+ str r7, [r1, 0x8]\n\
+ ldr r0, [r1, 0x8]\n\
+ adds r2, r5\n\
+ subs r3, r5\n\
+ cmp r3, r5\n\
+ bhi _080935B6\n\
+ strh r6, [r4]\n\
+ mov r0, sp\n\
+ str r0, [r1]\n\
+ str r2, [r1, 0x4]\n\
+ lsrs r0, r3, 1\n\
+ mov r2, r12\n\
+ orrs r0, r2\n\
+ str r0, [r1, 0x8]\n\
+ ldr r0, [r1, 0x8]\n\
+ add sp, 0x4\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_080935E4: .4byte 0x040000d4\n\
+_080935E8: .4byte 0x81000800\n\
+ .syntax divided\n");
+}
+
+__attribute__((naked))
+void sub_80935EC() {
+ asm(".syntax unified\n\
+ sub sp, 0x4\n\
+ movs r2, 0xE0\n\
+ lsls r2, 19\n\
+ mov r1, sp\n\
+ movs r0, 0\n\
+ strh r0, [r1]\n\
+ ldr r0, _08093608 @ =0x040000d4\n\
+ str r1, [r0]\n\
+ str r2, [r0, 0x4]\n\
+ ldr r1, _0809360C @ =0x81000200\n\
+ str r1, [r0, 0x8]\n\
+ ldr r0, [r0, 0x8]\n\
+ add sp, 0x4\n\
+ bx lr\n\
+ .align 2, 0\n\
+_08093608: .4byte 0x040000d4\n\
+_0809360C: .4byte 0x81000200\n\
+ .syntax divided\n");
+}
+
+__attribute__((naked))
+void sub_8093610() {
+ asm(".syntax unified\n\
+ push {r4,r5,lr}\n\
+ ldr r5, _08093664 @ =REG_BG0CNT\n\
+ movs r1, 0\n\
+ strh r1, [r5]\n\
+ ldr r2, _08093668 @ =REG_BG1CNT\n\
+ strh r1, [r2]\n\
+ ldr r3, _0809366C @ =REG_BG2CNT\n\
+ strh r1, [r3]\n\
+ ldr r4, _08093670 @ =REG_BG3CNT\n\
+ strh r1, [r4]\n\
+ ldr r0, _08093674 @ =REG_BG0HOFS\n\
+ strh r1, [r0]\n\
+ adds r0, 0x2\n\
+ strh r1, [r0]\n\
+ adds r0, 0x2\n\
+ strh r1, [r0]\n\
+ adds r0, 0x2\n\
+ strh r1, [r0]\n\
+ adds r0, 0x2\n\
+ strh r1, [r0]\n\
+ adds r0, 0x2\n\
+ strh r1, [r0]\n\
+ adds r0, 0x2\n\
+ strh r1, [r0]\n\
+ adds r0, 0x2\n\
+ strh r1, [r0]\n\
+ ldr r1, _08093678 @ =0x00001e08\n\
+ adds r0, r1, 0\n\
+ strh r0, [r5]\n\
+ ldr r1, _0809367C @ =0x00000801\n\
+ adds r0, r1, 0\n\
+ strh r0, [r2]\n\
+ ldr r1, _08093680 @ =0x00000902\n\
+ adds r0, r1, 0\n\
+ strh r0, [r3]\n\
+ ldr r1, _08093684 @ =0x00000a03\n\
+ adds r0, r1, 0\n\
+ strh r0, [r4]\n\
+ pop {r4,r5}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_08093664: .4byte 0x4000008 @ REG_BG0CNT\n\
+_08093668: .4byte 0x400000A @ REG_BG1CNT\n\
+_0809366C: .4byte 0x400000C @ REG_BG2CNT\n\
+_08093670: .4byte 0x400000E @ REG_BG3CNT\n\
+_08093674: .4byte 0x4000010 @ REG_BG0HOFS\n\
+_08093678: .4byte 0x00001e08\n\
+_0809367C: .4byte 0x00000801\n\
+_08093680: .4byte 0x00000902\n\
+_08093684: .4byte 0x00000a03\n\
+ .syntax divided\n");
+}
+
+#ifdef NONMATCHING
+static void sub_8093688(void) {
+ int i;
+
+ asm_comment("WIP");
+ sub_8093324();
+
+ unk_2000000.var_0 = FALSE;
+ unk_2000000.var_3 = FALSE;
+ unk_2000000.var_4 = FALSE;
+
+ unk_2000000.var_2 = unk_2000000.var_64.stars;
+
+ unk_2000000.var_5 = FALSE;
+ unk_2000000.var_6 = FALSE;
+
+ for (i = 0; i < 4; i++) {
+ sub_80EB3FC(unk_2000000.var_20[i], unk_2000000.var_64.var_28[i]);
+ }
+
+ sub_80936D4();
+}
+#else
+
+__attribute__((naked))
+static void sub_8093688(void) {
+ asm(".syntax unified\n\
+ push {r4-r6,lr}\n\
+ bl sub_8093324\n\
+ ldr r2, _080936D0 @ =0x02000000\n\
+ movs r1, 0\n\
+ strb r1, [r2]\n\
+ strb r1, [r2, 0x3]\n\
+ strb r1, [r2, 0x4]\n\
+ adds r0, r2, 0\n\
+ adds r0, 0x65\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r2, 0x2]\n\
+ strb r1, [r2, 0x5]\n\
+ strb r1, [r2, 0x6]\n\
+ movs r4, 0\n\
+ adds r6, r2, 0\n\
+ adds r6, 0x20\n\
+ adds r5, r2, 0\n\
+ adds r5, 0x8C\n\
+_080936AE:\n\
+ lsls r0, r4, 4\n\
+ adds r0, r6\n\
+ lsls r1, r4, 1\n\
+ adds r1, r5, r1\n\
+ ldrh r1, [r1]\n\
+ bl sub_80EB3FC\n\
+ adds r0, r4, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ cmp r4, 0x3\n\
+ bls _080936AE\n\
+ bl sub_80936D4\n\
+ pop {r4-r6}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_080936D0: .4byte 0x02000000\n\
+ .syntax divided\n");
+}
+
+#endif
+
+static void sub_80936D4(void) {
+ unk_2000000.var_7 = FALSE;
+ unk_2000000.var_8 = FALSE;
+ unk_2000000.var_9 = FALSE;
+ unk_2000000.var_a = FALSE;
+ unk_2000000.var_b = FALSE;
+ unk_2000000.var_c = FALSE;
+ unk_2000000.var_d = FALSE;
+
+ memset(unk_2000000.var_e, 0, sizeof(unk_2000000.var_e));
+
+ if (unk_2000000.var_64.hasPokedex) {
+ unk_2000000.var_7 += TRUE;
+ }
+
+ if (unk_2000000.var_64.firstHallOfFameA != 0 || unk_2000000.var_64.firstHallOfFameB != 0 ||
+ unk_2000000.var_64.firstHallOfFameC != 0) {
+ unk_2000000.var_8 += TRUE;
+ }
+
+ if (unk_2000000.var_64.linkBattleWins != 0 || unk_2000000.var_64.linkBattleLosses != 0) {
+ unk_2000000.var_9 += TRUE;
+ }
+
+ if (unk_2000000.var_64.battleTowerWins != 0 || unk_2000000.var_64.battleTowerLosses != 0) {
+ unk_2000000.var_a += TRUE;
+ }
+
+ if (unk_2000000.var_64.contestsWithFriends != 0) {
+ unk_2000000.var_b += TRUE;
+ }
+
+ if (unk_2000000.var_64.pokeblocksWithFriends != 0) {
+ unk_2000000.var_c += TRUE;
+ }
+
+ if (unk_2000000.var_64.pokemonTrades != 0) {
+ unk_2000000.var_d += TRUE;
+ }
+
+ if (!unk_2000000.var_1) {
+ u32 badgeFlag;
+ int i;
+
+ i = 0;
+ badgeFlag = BADGE01_GET;
+ while (TRUE) {
+ if (FlagGet(badgeFlag)) {
+ unk_2000000.var_e[i] += TRUE;
+ }
+
+ badgeFlag += 1;
+ i += 1;
+ if (badgeFlag > BADGE08_GET) {
+ break;
+ }
+ }
+ }
+}
+
+void sub_80937A4() {
+ ResetPaletteFade();
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ ResetTasks();
+}
+
+void sub_80937BC() {
+ SetUpWindowConfig(&WindowConfig_TrainerCard_Back_Values);
+ MultistepInitMenuWindowBegin(&WindowConfig_TrainerCard_Back_Values);
+}
+
+static void sub_80937D8() {
+ sub_8093E04();
+ sub_8093E28();
+ sub_8093F64();
+ sub_8093DAC();
+}
+
+static void sub_80937F0() {
+ sub_8093EF8();
+}
+
+static void nullsub_15(void) {
+}
+
+static void sub_8093800() {
+ sub_809380C();
+}
+
+static void sub_809380C() {
+ u8 taskId;
+
+ taskId = CreateTask(sub_809382C, 0);
+ sub_809382C(taskId);
+}
+
+__attribute__((naked))
+static void sub_809382C(u8 taskId) {
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ ldr r7, _08093858 @ =gUnknown_083B5EBC\n\
+ lsls r1, r0, 2\n\
+ adds r1, r0\n\
+ lsls r4, r1, 3\n\
+ ldr r6, _0809385C @ =0x02000000\n\
+ ldr r5, _08093860 @ =gTasks\n\
+_0809383E:\n\
+ ldrb r0, [r6]\n\
+ lsls r0, 2\n\
+ adds r0, r7\n\
+ ldr r1, [r0]\n\
+ adds r0, r4, r5\n\
+ bl _call_via_r1\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ bne _0809383E\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_08093858: .4byte gUnknown_083B5EBC\n\
+_0809385C: .4byte 0x02000000\n\
+_08093860: .4byte gTasks\n\
+ .syntax divided\n");
+}
+
+__attribute__((naked))
+bool8 sub_8093864() {
+ asm(".syntax unified\n\
+ push {r4,r5,lr}\n\
+ sub sp, 0x4\n\
+ ldr r4, _080938A0 @ =0x02000000\n\
+ ldr r2, _080938A4 @ =gSaveBlock2\n\
+ ldrb r1, [r2, 0x11]\n\
+ movs r0, 0x1\n\
+ ands r0, r1\n\
+ movs r5, 0\n\
+ strb r0, [r4, 0x5]\n\
+ ldrb r0, [r2, 0x12]\n\
+ strb r0, [r4, 0x6]\n\
+ bl sub_80939A4\n\
+ movs r0, 0x1\n\
+ negs r0, r0\n\
+ str r5, [sp]\n\
+ movs r1, 0\n\
+ movs r2, 0x10\n\
+ movs r3, 0\n\
+ bl BeginNormalPaletteFade\n\
+ ldrb r0, [r4]\n\
+ adds r0, 0x1\n\
+ strb r0, [r4]\n\
+ movs r0, 0\n\
+ add sp, 0x4\n\
+ pop {r4,r5}\n\
+ pop {r1}\n\
+ bx r1\n\
+ .align 2, 0\n\
+_080938A0: .4byte 0x02000000\n\
+_080938A4: .4byte gSaveBlock2\n\
+ .syntax divided\n");
+}
+
+__attribute__((naked))
+bool8 sub_80938A8() {
+ asm(".syntax unified\n\
+ push {lr}\n\
+ ldr r0, _080938C4 @ =gPaletteFade\n\
+ ldrb r1, [r0, 0x7]\n\
+ movs r0, 0x80\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _080938BE\n\
+ ldr r1, _080938C8 @ =0x02000000\n\
+ ldrb r0, [r1]\n\
+ adds r0, 0x1\n\
+ strb r0, [r1]\n\
+_080938BE:\n\
+ movs r0, 0\n\
+ pop {r1}\n\
+ bx r1\n\
+ .align 2, 0\n\
+_080938C4: .4byte gPaletteFade\n\
+_080938C8: .4byte 0x02000000\n\
+ .syntax divided\n");
+}
+
+__attribute__((naked))
+bool8 sub_80938CC() {
+ asm(".syntax unified\n\
+ push {lr}\n\
+ ldr r0, _080938E4 @ =gMain\n\
+ ldrh r1, [r0, 0x2E]\n\
+ movs r0, 0x2\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _080938EC\n\
+ ldr r1, _080938E8 @ =0x02000000\n\
+ movs r0, 0x5\n\
+ strb r0, [r1]\n\
+ movs r0, 0x1\n\
+ b _08093914\n\
+ .align 2, 0\n\
+_080938E4: .4byte gMain\n\
+_080938E8: .4byte 0x02000000\n\
+_080938EC:\n\
+ movs r0, 0x1\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _08093912\n\
+ ldr r2, _08093900 @ =0x02000000\n\
+ ldrb r1, [r2, 0x3]\n\
+ cmp r1, 0\n\
+ beq _08093904\n\
+ movs r0, 0x5\n\
+ b _0809390C\n\
+ .align 2, 0\n\
+_08093900: .4byte 0x02000000\n\
+_08093904:\n\
+ movs r0, 0x1\n\
+ eors r0, r1\n\
+ strb r0, [r2, 0x3]\n\
+ movs r0, 0x3\n\
+_0809390C:\n\
+ strb r0, [r2]\n\
+ movs r0, 0x1\n\
+ b _08093914\n\
+_08093912:\n\
+ movs r0, 0\n\
+_08093914:\n\
+ pop {r1}\n\
+ bx r1\n\
+ .syntax divided\n");
+}
+
+bool8 sub_8093918() {
+ sub_8093A28();
+ PlaySE(SE_CARD);
+
+ unk_2000000.var_0 += TRUE;
+
+ return FALSE;
+}
+
+bool8 sub_8093938() {
+ if (sub_8093A48()) {
+ unk_2000000.var_0 = 2;
+ }
+
+ return FALSE;
+}
+
+__attribute__((naked))
+bool8 sub_8093954() {
+ asm(".syntax unified\n\
+ push {lr}\n\
+ sub sp, 0x4\n\
+ bl sub_80939C0\n\
+ movs r0, 0x1\n\
+ negs r0, r0\n\
+ movs r1, 0\n\
+ str r1, [sp]\n\
+ movs r2, 0\n\
+ movs r3, 0x10\n\
+ bl BeginNormalPaletteFade\n\
+ ldr r1, _0809397C @ =0x02000000\n\
+ ldrb r0, [r1]\n\
+ adds r0, 0x1\n\
+ strb r0, [r1]\n\
+ movs r0, 0\n\
+ add sp, 0x4\n\
+ pop {r1}\n\
+ bx r1\n\
+ .align 2, 0\n\
+_0809397C: .4byte 0x02000000\n\
+ .syntax divided\n");
+}
+
+bool8 sub_8093980() {
+ if (!gPaletteFade.active) {
+ SetMainCallback2((MainCallback) unk_2000000.var_60);
+ }
+
+ return FALSE;
+}
+
+static void sub_80939A4(void) {
+ CreateTask(sub_80939DC, 0);
+ BasicInitMenuWindow(&WindowConfig_TrainerCard_Back_Values);
+}
+
+static void sub_80939C0(void) {
+ u8 taskId;
+
+ taskId = FindTaskIdByFunc(sub_80939DC);
+
+ if (taskId != 0xFF) {
+ DestroyTask(taskId);
+ }
+}
+
+static void sub_80939DC(u8 taskId) {
+ u8 buffer[32];
+ struct Task *task;
+ task = &gTasks[taskId];
+
+ if (unk_2000000.var_5 != task->data[TD_1]) {
+ task->data[TD_1] = unk_2000000.var_5;
+ task->data[TD_0] ^= TRUE;
+ }
+
+ TrainerCard_Front_PrintPlayTime(buffer, task->data[TD_0]);
+ MenuPrint(buffer, 10, 12);
+}
+
+static void sub_8093A28(void) {
+ u8 taskId;
+
+ taskId = CreateTask(sub_8093A68, 0);
+ sub_8093A68(taskId);
+}
+
+__attribute__((naked))
+static u8 sub_8093A48() {
+ asm(".syntax unified\n\
+ push {lr}\n\
+ ldr r0, _08093A5C @ =sub_8093A68\n\
+ bl FindTaskIdByFunc\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r0, 0xFF\n\
+ beq _08093A60\n\
+ movs r0, 0\n\
+ b _08093A62\n\
+ .align 2, 0\n\
+_08093A5C: .4byte sub_8093A68\n\
+_08093A60:\n\
+ movs r0, 0x1\n\
+_08093A62:\n\
+ pop {r1}\n\
+ bx r1\n\
+ .syntax divided\n");
+}
+
+__attribute__((naked))
+static void sub_8093A68(u8 taskId) {
+ asm(".syntax unified\n\
+ push {r4,r5,lr}\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ ldr r5, _08093A98 @ =gUnknown_083B5ED8\n\
+ ldr r2, _08093A9C @ =gTasks\n\
+ lsls r1, r0, 2\n\
+ adds r1, r0\n\
+ lsls r1, 3\n\
+ adds r4, r1, r2\n\
+_08093A7A:\n\
+ movs r1, 0x8\n\
+ ldrsh r0, [r4, r1]\n\
+ lsls r0, 2\n\
+ adds r0, r5\n\
+ ldr r1, [r0]\n\
+ adds r0, r4, 0\n\
+ bl _call_via_r1\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ bne _08093A7A\n\
+ pop {r4,r5}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_08093A98: .4byte gUnknown_083B5ED8\n\
+_08093A9C: .4byte gTasks\n\
+ .syntax divided\n");
+}
+
+__attribute__((naked))
+bool8 sub_8093AA0() {
+ asm(".syntax unified\n\
+ push {r4,lr}\n\
+ adds r4, r0, 0\n\
+ ldr r0, _08093AE0 @ =0x02000000\n\
+ movs r1, 0\n\
+ strb r1, [r0, 0x4]\n\
+ bl dp12_8087EA4\n\
+ movs r1, 0\n\
+ ldr r0, _08093AE4 @ =gUnknown_03004DE0\n\
+ ldr r2, _08093AE8 @ =0x0000fffc\n\
+ movs r3, 0xF0\n\
+ lsls r3, 3\n\
+ adds r0, r3\n\
+_08093ABA:\n\
+ strh r2, [r0]\n\
+ adds r0, 0x2\n\
+ adds r1, 0x1\n\
+ cmp r1, 0x9F\n\
+ bls _08093ABA\n\
+ ldr r0, _08093AEC @ =sub_8093D7C\n\
+ bl SetHBlankCallback\n\
+ ldr r1, _08093AE0 @ =0x02000000\n\
+ movs r0, 0x1\n\
+ strb r0, [r1, 0x4]\n\
+ ldrh r0, [r4, 0x8]\n\
+ adds r0, 0x1\n\
+ strh r0, [r4, 0x8]\n\
+ movs r0, 0\n\
+ pop {r4}\n\
+ pop {r1}\n\
+ bx r1\n\
+ .align 2, 0\n\
+_08093AE0: .4byte 0x02000000\n\
+_08093AE4: .4byte gUnknown_03004DE0\n\
+_08093AE8: .4byte 0x0000fffc\n\
+_08093AEC: .4byte sub_8093D7C\n\
+ .syntax divided\n");
+}
+
+__attribute__((naked))
+bool8 sub_8093AF0() {
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ mov r7, r10\n\
+ mov r6, r9\n\
+ mov r5, r8\n\
+ push {r5-r7}\n\
+ sub sp, 0x4\n\
+ mov r8, r0\n\
+ ldr r1, _08093BFC @ =0x02000000\n\
+ movs r0, 0\n\
+ strb r0, [r1, 0x4]\n\
+ mov r2, r8\n\
+ ldrh r0, [r2, 0xA]\n\
+ adds r0, 0x3\n\
+ strh r0, [r2, 0xA]\n\
+ lsls r0, 16\n\
+ asrs r0, 16\n\
+ cmp r0, 0x4F\n\
+ ble _08093B18\n\
+ movs r0, 0x4F\n\
+ strh r0, [r2, 0xA]\n\
+_08093B18:\n\
+ mov r4, r8\n\
+ movs r0, 0xA\n\
+ ldrsh r7, [r4, r0]\n\
+ movs r0, 0xA0\n\
+ subs r0, r7\n\
+ mov r9, r0\n\
+ subs r4, r0, r7\n\
+ negs r0, r7\n\
+ lsls r6, r0, 16\n\
+ movs r0, 0xA0\n\
+ lsls r0, 16\n\
+ adds r1, r4, 0\n\
+ bl __udivsi3\n\
+ adds r5, r0, 0\n\
+ ldr r1, _08093C00 @ =0xffff0000\n\
+ adds r5, r1\n\
+ adds r0, r5, 0\n\
+ muls r0, r4\n\
+ adds r0, r6\n\
+ mov r10, r0\n\
+ adds r0, r5, 0\n\
+ adds r1, r4, 0\n\
+ bl __udivsi3\n\
+ str r0, [sp]\n\
+ lsls r5, 1\n\
+ movs r3, 0\n\
+ cmp r3, r7\n\
+ bcs _08093B74\n\
+ ldr r2, _08093C04 @ =gUnknown_03004DE0\n\
+ mov r12, r2\n\
+ ldr r0, _08093C08 @ =0x0000fffc\n\
+ adds r4, r0, 0\n\
+_08093B5C:\n\
+ lsls r0, r3, 16\n\
+ asrs r0, 16\n\
+ lsls r1, r0, 1\n\
+ add r1, r12\n\
+ subs r2, r4, r0\n\
+ strh r2, [r1]\n\
+ adds r0, 0x1\n\
+ lsls r0, 16\n\
+ lsrs r3, r0, 16\n\
+ asrs r0, 16\n\
+ cmp r0, r7\n\
+ bcc _08093B5C\n\
+_08093B74:\n\
+ lsls r2, r3, 16\n\
+ mov r1, r9\n\
+ lsls r0, r1, 16\n\
+ asrs r1, r0, 16\n\
+ mov r4, r10\n\
+ lsrs r7, r4, 16\n\
+ cmp r2, r0\n\
+ bge _08093BAE\n\
+ ldr r0, _08093C04 @ =gUnknown_03004DE0\n\
+ mov r9, r0\n\
+ ldr r4, _08093C08 @ =0x0000fffc\n\
+ mov r12, r4\n\
+ adds r4, r1, 0\n\
+_08093B8E:\n\
+ lsrs r1, r6, 16\n\
+ adds r6, r5\n\
+ ldr r0, [sp]\n\
+ subs r5, r0\n\
+ asrs r2, 16\n\
+ lsls r0, r2, 1\n\
+ add r0, r9\n\
+ add r1, r12\n\
+ strh r1, [r0]\n\
+ adds r2, 0x1\n\
+ lsls r2, 16\n\
+ lsrs r3, r2, 16\n\
+ lsls r2, r3, 16\n\
+ asrs r0, r2, 16\n\
+ cmp r0, r4\n\
+ blt _08093B8E\n\
+_08093BAE:\n\
+ adds r1, r7, 0\n\
+ lsls r0, r3, 16\n\
+ asrs r0, 16\n\
+ cmp r0, 0x9F\n\
+ bgt _08093BD4\n\
+ ldr r4, _08093C04 @ =gUnknown_03004DE0\n\
+ ldr r0, _08093C08 @ =0x0000fffc\n\
+ adds r2, r1, r0\n\
+_08093BBE:\n\
+ lsls r1, r3, 16\n\
+ asrs r1, 16\n\
+ lsls r0, r1, 1\n\
+ adds r0, r4\n\
+ strh r2, [r0]\n\
+ adds r1, 0x1\n\
+ lsls r1, 16\n\
+ lsrs r3, r1, 16\n\
+ asrs r1, 16\n\
+ cmp r1, 0x9F\n\
+ ble _08093BBE\n\
+_08093BD4:\n\
+ movs r0, 0x1\n\
+ ldr r1, _08093BFC @ =0x02000000\n\
+ strb r0, [r1, 0x4]\n\
+ mov r2, r8\n\
+ movs r4, 0xA\n\
+ ldrsh r0, [r2, r4]\n\
+ cmp r0, 0x4A\n\
+ ble _08093BEA\n\
+ ldrh r0, [r2, 0x8]\n\
+ adds r0, 0x1\n\
+ strh r0, [r2, 0x8]\n\
+_08093BEA:\n\
+ movs r0, 0\n\
+ add sp, 0x4\n\
+ pop {r3-r5}\n\
+ mov r8, r3\n\
+ mov r9, r4\n\
+ mov r10, r5\n\
+ pop {r4-r7}\n\
+ pop {r1}\n\
+ bx r1\n\
+ .align 2, 0\n\
+_08093BFC: .4byte 0x02000000\n\
+_08093C00: .4byte 0xffff0000\n\
+_08093C04: .4byte gUnknown_03004DE0\n\
+_08093C08: .4byte 0x0000fffc\n\
+ .syntax divided\n");
+}
+
+bool8 sub_8093C0C(struct TrainerCard *trainerCard) {
+ sub_80939C0();
+ sub_8093DAC();
+
+ if (!unk_2000000.var_3) {
+ sub_80939A4();
+ }
+
+ trainerCard->firstHallOfFameB += 1;
+
+ return TRUE;
+}
+
+__attribute__((naked))
+bool8 sub_8093C38() {
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ mov r7, r10\n\
+ mov r6, r9\n\
+ mov r5, r8\n\
+ push {r5-r7}\n\
+ sub sp, 0x4\n\
+ mov r8, r0\n\
+ ldr r1, _08093D40 @ =0x02000000\n\
+ movs r2, 0\n\
+ strb r2, [r1, 0x4]\n\
+ ldrh r0, [r0, 0xA]\n\
+ subs r0, 0x3\n\
+ mov r3, r8\n\
+ strh r0, [r3, 0xA]\n\
+ lsls r0, 16\n\
+ cmp r0, 0\n\
+ bgt _08093C5C\n\
+ strh r2, [r3, 0xA]\n\
+_08093C5C:\n\
+ mov r4, r8\n\
+ movs r0, 0xA\n\
+ ldrsh r7, [r4, r0]\n\
+ movs r0, 0xA0\n\
+ subs r0, r7\n\
+ mov r9, r0\n\
+ subs r4, r0, r7\n\
+ negs r0, r7\n\
+ lsls r6, r0, 16\n\
+ movs r0, 0xA0\n\
+ lsls r0, 16\n\
+ adds r1, r4, 0\n\
+ bl __udivsi3\n\
+ adds r5, r0, 0\n\
+ ldr r1, _08093D44 @ =0xffff0000\n\
+ adds r5, r1\n\
+ adds r0, r5, 0\n\
+ muls r0, r4\n\
+ adds r0, r6\n\
+ mov r10, r0\n\
+ adds r0, r5, 0\n\
+ adds r1, r4, 0\n\
+ bl __udivsi3\n\
+ str r0, [sp]\n\
+ lsrs r5, 1\n\
+ movs r3, 0\n\
+ cmp r3, r7\n\
+ bcs _08093CB8\n\
+ ldr r2, _08093D48 @ =gUnknown_03004DE0\n\
+ mov r12, r2\n\
+ ldr r0, _08093D4C @ =0x0000fffc\n\
+ adds r4, r0, 0\n\
+_08093CA0:\n\
+ lsls r0, r3, 16\n\
+ asrs r0, 16\n\
+ lsls r1, r0, 1\n\
+ add r1, r12\n\
+ subs r2, r4, r0\n\
+ strh r2, [r1]\n\
+ adds r0, 0x1\n\
+ lsls r0, 16\n\
+ lsrs r3, r0, 16\n\
+ asrs r0, 16\n\
+ cmp r0, r7\n\
+ bcc _08093CA0\n\
+_08093CB8:\n\
+ lsls r2, r3, 16\n\
+ mov r1, r9\n\
+ lsls r0, r1, 16\n\
+ asrs r1, r0, 16\n\
+ mov r4, r10\n\
+ lsrs r7, r4, 16\n\
+ cmp r2, r0\n\
+ bge _08093CF2\n\
+ ldr r0, _08093D48 @ =gUnknown_03004DE0\n\
+ mov r9, r0\n\
+ ldr r3, _08093D4C @ =0x0000fffc\n\
+ mov r12, r3\n\
+ adds r4, r1, 0\n\
+_08093CD2:\n\
+ lsrs r1, r6, 16\n\
+ adds r6, r5\n\
+ ldr r0, [sp]\n\
+ adds r5, r0\n\
+ asrs r2, 16\n\
+ lsls r0, r2, 1\n\
+ add r0, r9\n\
+ add r1, r12\n\
+ strh r1, [r0]\n\
+ adds r2, 0x1\n\
+ lsls r2, 16\n\
+ lsrs r3, r2, 16\n\
+ lsls r2, r3, 16\n\
+ asrs r0, r2, 16\n\
+ cmp r0, r4\n\
+ blt _08093CD2\n\
+_08093CF2:\n\
+ adds r1, r7, 0\n\
+ lsls r0, r3, 16\n\
+ asrs r0, 16\n\
+ cmp r0, 0x9F\n\
+ bgt _08093D18\n\
+ ldr r4, _08093D48 @ =gUnknown_03004DE0\n\
+ ldr r0, _08093D4C @ =0x0000fffc\n\
+ adds r2, r1, r0\n\
+_08093D02:\n\
+ lsls r1, r3, 16\n\
+ asrs r1, 16\n\
+ lsls r0, r1, 1\n\
+ adds r0, r4\n\
+ strh r2, [r0]\n\
+ adds r1, 0x1\n\
+ lsls r1, 16\n\
+ lsrs r3, r1, 16\n\
+ asrs r1, 16\n\
+ cmp r1, 0x9F\n\
+ ble _08093D02\n\
+_08093D18:\n\
+ movs r0, 0x1\n\
+ ldr r1, _08093D40 @ =0x02000000\n\
+ strb r0, [r1, 0x4]\n\
+ mov r2, r8\n\
+ movs r3, 0xA\n\
+ ldrsh r0, [r2, r3]\n\
+ cmp r0, 0\n\
+ bgt _08093D2E\n\
+ ldrh r0, [r2, 0x8]\n\
+ adds r0, 0x1\n\
+ strh r0, [r2, 0x8]\n\
+_08093D2E:\n\
+ movs r0, 0\n\
+ add sp, 0x4\n\
+ pop {r3-r5}\n\
+ mov r8, r3\n\
+ mov r9, r4\n\
+ mov r10, r5\n\
+ pop {r4-r7}\n\
+ pop {r1}\n\
+ bx r1\n\
+ .align 2, 0\n\
+_08093D40: .4byte 0x02000000\n\
+_08093D44: .4byte 0xffff0000\n\
+_08093D48: .4byte gUnknown_03004DE0\n\
+_08093D4C: .4byte 0x0000fffc\n\
+ .syntax divided\n");
+}
+
+bool8 sub_8093D50(void) {
+ u8 taskId;
+
+ unk_2000000.var_4 = FALSE;
+ SetHBlankCallback(NULL);
+ sub_8093E04();
+
+ taskId = FindTaskIdByFunc(sub_8093A68);
+ DestroyTask(taskId);
+
+ return FALSE;
+}
+
+__attribute__((naked))
+static void sub_8093D7C(void) {
+ asm(".syntax unified\n\
+ ldr r1, _08093DA0 @ =gUnknown_03004DE0\n\
+ ldr r0, _08093DA4 @ =REG_VCOUNT\n\
+ ldrh r2, [r0]\n\
+ movs r0, 0xFF\n\
+ ands r0, r2\n\
+ lsls r0, 1\n\
+ movs r2, 0xF0\n\
+ lsls r2, 3\n\
+ adds r1, r2\n\
+ adds r0, r1\n\
+ ldrh r1, [r0]\n\
+ ldr r0, _08093DA8 @ =REG_BG0VOFS\n\
+ strh r1, [r0]\n\
+ adds r0, 0x4\n\
+ strh r1, [r0]\n\
+ adds r0, 0x4\n\
+ strh r1, [r0]\n\
+ bx lr\n\
+ .align 2, 0\n\
+_08093DA0: .4byte gUnknown_03004DE0\n\
+_08093DA4: .4byte 0x4000006 @ REG_VCOUNT\n\
+_08093DA8: .4byte 0x4000012 @ REG_BG0VOFS\n\
+ .syntax divided\n");
+}
+
+static void sub_8093DAC(void) {
+ if (unk_2000000.var_3) {
+ sub_8093DEC();
+ } else {
+ sub_8093DC8();
+ }
+}
+
+static void sub_8093DC8(void) {
+ MenuZeroFillScreen();
+ sub_80940E4();
+ sub_8093F14();
+ sub_8093F80();
+ sub_8093FD0();
+ sub_8094038();
+ sub_8094140();
+}
+
+static void sub_8093DEC(void) {
+ MenuZeroFillScreen();
+ sub_80940E4();
+ sub_8093F48();
+ sub_8094188();
+}
+
+__attribute__((naked))
+static void sub_8093E04() {
+ asm(".syntax unified\n\
+ ldr r0, _08093E20 @ =REG_BG0VOFS\n\
+ ldr r2, _08093E24 @ =0x0000fffc\n\
+ adds r1, r2, 0\n\
+ strh r1, [r0]\n\
+ adds r0, 0x2\n\
+ movs r2, 0\n\
+ strh r2, [r0]\n\
+ adds r0, 0x2\n\
+ strh r1, [r0]\n\
+ adds r0, 0x2\n\
+ strh r2, [r0]\n\
+ adds r0, 0x2\n\
+ strh r1, [r0]\n\
+ bx lr\n\
+ .align 2, 0\n\
+_08093E20: .4byte 0x4000012 @ REG_BG0VOFS\n\
+_08093E24: .4byte 0x0000fffc\n\
+ .syntax divided\n");
+}
+
+__attribute__((naked))
+static void sub_8093E28(void) {
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ bl sub_8093EA0\n\
+ ldr r0, _08093E84 @ =gUnknown_083B5F6C\n\
+ movs r1, 0xE0\n\
+ movs r2, 0x20\n\
+ bl LoadPalette\n\
+ ldr r3, _08093E88 @ =gMenuTrainerCard_Gfx\n\
+ movs r4, 0xC0\n\
+ lsls r4, 19\n\
+ movs r5, 0xA4\n\
+ lsls r5, 5\n\
+ ldr r1, _08093E8C @ =0x040000d4\n\
+ ldr r6, _08093E90 @ =0x80000800\n\
+ movs r2, 0x80\n\
+ lsls r2, 5\n\
+ movs r7, 0x80\n\
+ lsls r7, 24\n\
+_08093E4E:\n\
+ str r3, [r1]\n\
+ str r4, [r1, 0x4]\n\
+ str r6, [r1, 0x8]\n\
+ ldr r0, [r1, 0x8]\n\
+ adds r3, r2\n\
+ adds r4, r2\n\
+ subs r5, r2\n\
+ cmp r5, r2\n\
+ bhi _08093E4E\n\
+ str r3, [r1]\n\
+ str r4, [r1, 0x4]\n\
+ lsrs r0, r5, 1\n\
+ orrs r0, r7\n\
+ str r0, [r1, 0x8]\n\
+ ldr r0, [r1, 0x8]\n\
+ ldr r1, _08093E94 @ =gBadgesTiles\n\
+ ldr r2, _08093E98 @ =0x06001480\n\
+ ldr r0, _08093E8C @ =0x040000d4\n\
+ str r1, [r0]\n\
+ str r2, [r0, 0x4]\n\
+ ldr r1, _08093E9C @ =0x80000200\n\
+ str r1, [r0, 0x8]\n\
+ ldr r0, [r0, 0x8]\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_08093E84: .4byte gUnknown_083B5F6C\n\
+_08093E88: .4byte gMenuTrainerCard_Gfx\n\
+_08093E8C: .4byte 0x040000d4\n\
+_08093E90: .4byte 0x80000800\n\
+_08093E94: .4byte gBadgesTiles\n\
+_08093E98: .4byte 0x06001480\n\
+_08093E9C: .4byte 0x80000200\n\
+ .syntax divided\n");
+}
+
+static void sub_8093EA0(void) {
+ LoadPalette(gUnknown_083B5EF8[unk_2000000.var_2], 0, 48 * 2);
+ LoadPalette(gBadgesPalette, 48, 16 * 2);
+ LoadPalette(gUnknown_083B5F4C, 64, 16 * 2);
+
+ if (unk_2000000.var_64.gender != MALE) {
+ LoadPalette(gUnknown_083B5F0C, 16, 16 * 2);
+ }
+}
+
+static void sub_8093EF8(void) {
+ LoadTrainerGfx_TrainerCard(unk_2000000.var_64.gender, 80, (void *) (VRAM + 0x1880));
+}
+
+__attribute__((naked))
+static void sub_8093F14(void) {
+ asm(".syntax unified\n\
+ push {lr}\n\
+ sub sp, 0x8\n\
+ ldr r0, _08093F3C @ =gUnknown_083B5EEC\n\
+ ldr r1, [r0, 0x4]\n\
+ ldr r0, [r0]\n\
+ str r0, [sp]\n\
+ str r1, [sp, 0x4]\n\
+ ldr r0, _08093F40 @ =0x02000000\n\
+ ldrb r0, [r0, 0x1]\n\
+ lsls r0, 2\n\
+ add r0, sp\n\
+ ldr r0, [r0]\n\
+ ldr r1, _08093F44 @ =0x06004800\n\
+ movs r2, 0xA0\n\
+ lsls r2, 1\n\
+ bl CpuFastSet\n\
+ add sp, 0x8\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_08093F3C: .4byte gUnknown_083B5EEC\n\
+_08093F40: .4byte 0x02000000\n\
+_08093F44: .4byte 0x06004800\n\
+ .syntax divided\n");
+}
+
+static void sub_8093F48(void) {
+ CpuFastSet(gUnknown_08E8CFC0, (void *) (VRAM + 0x4800), 320);
+}
+
+static void sub_8093F64(void) {
+ CpuFastSet(gUnknown_08E8D9C0, (void *) (VRAM + 0x5000), 320);
+}
+
+__attribute__((naked))
+static void sub_8093F80(void) {
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ movs r5, 0xC4\n\
+ ldr r7, _08093FCC @ =0x06004000\n\
+ movs r1, 0x5\n\
+ movs r0, 0xA0\n\
+ lsls r0, 7\n\
+ adds r6, r0, 0\n\
+_08093F8E:\n\
+ movs r0, 0x13\n\
+ lsls r3, r1, 16\n\
+ asrs r4, r3, 11\n\
+_08093F94:\n\
+ lsls r2, r0, 16\n\
+ asrs r2, 16\n\
+ adds r1, r4, r2\n\
+ lsls r1, 1\n\
+ adds r1, r7\n\
+ adds r0, r5, 0\n\
+ orrs r0, r6\n\
+ strh r0, [r1]\n\
+ adds r2, 0x1\n\
+ lsls r2, 16\n\
+ adds r0, r5, 0x1\n\
+ lsls r0, 16\n\
+ lsrs r5, r0, 16\n\
+ lsrs r0, r2, 16\n\
+ asrs r2, 16\n\
+ cmp r2, 0x1A\n\
+ ble _08093F94\n\
+ movs r1, 0x80\n\
+ lsls r1, 9\n\
+ adds r0, r3, r1\n\
+ lsrs r1, r0, 16\n\
+ asrs r0, 16\n\
+ cmp r0, 0xC\n\
+ ble _08093F8E\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_08093FCC: .4byte 0x06004000\n\
+ .syntax divided\n");
+}
+
+__attribute__((naked))
+static void sub_8093FD0(void) {
+ asm(".syntax unified\n\
+ push {r4-r6,lr}\n\
+ ldr r4, _0809402C @ =0x06004000\n\
+ movs r2, 0xF\n\
+ ldr r0, _08094030 @ =0x02000000\n\
+ ldrb r0, [r0, 0x2]\n\
+ adds r0, 0xF\n\
+ cmp r2, r0\n\
+ bge _08094002\n\
+ movs r6, 0xC0\n\
+ lsls r6, 1\n\
+ ldr r1, _08094034 @ =0x0000408f\n\
+ adds r5, r1, 0\n\
+ adds r3, r0, 0\n\
+_08093FEA:\n\
+ lsls r1, r2, 16\n\
+ asrs r1, 16\n\
+ lsls r0, r1, 1\n\
+ adds r0, r4\n\
+ adds r0, r6\n\
+ strh r5, [r0]\n\
+ adds r1, 0x1\n\
+ lsls r1, 16\n\
+ lsrs r2, r1, 16\n\
+ asrs r1, 16\n\
+ cmp r1, r3\n\
+ blt _08093FEA\n\
+_08094002:\n\
+ lsls r1, r2, 16\n\
+ asrs r0, r1, 16\n\
+ cmp r0, 0x12\n\
+ bgt _08094024\n\
+ movs r3, 0xC0\n\
+ lsls r3, 1\n\
+ movs r2, 0\n\
+_08094010:\n\
+ asrs r0, r1, 16\n\
+ lsls r1, r0, 1\n\
+ adds r1, r4\n\
+ adds r1, r3\n\
+ strh r2, [r1]\n\
+ adds r0, 0x1\n\
+ lsls r1, r0, 16\n\
+ asrs r0, r1, 16\n\
+ cmp r0, 0x12\n\
+ ble _08094010\n\
+_08094024:\n\
+ pop {r4-r6}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_0809402C: .4byte 0x06004000\n\
+_08094030: .4byte 0x02000000\n\
+_08094034: .4byte 0x0000408f\n\
+ .syntax divided\n");
+}
+
+__attribute__((naked))
+static void sub_8094038(void) {
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ mov r7, r9\n\
+ mov r6, r8\n\
+ push {r6,r7}\n\
+ ldr r1, _080940D0 @ =0x02000000\n\
+ ldrb r0, [r1, 0x1]\n\
+ cmp r0, 0\n\
+ bne _080940C2\n\
+ ldr r0, _080940D4 @ =0x06004000\n\
+ mov r9, r0\n\
+ movs r0, 0\n\
+ movs r2, 0x4\n\
+ adds r1, 0xE\n\
+ mov r8, r1\n\
+ ldr r7, _080940D8 @ =gUnknown_083B5F8C\n\
+ movs r1, 0xC0\n\
+ lsls r1, 6\n\
+ adds r6, r1, 0\n\
+ adds r1, r7, 0x6\n\
+ mov r12, r1\n\
+_08094060:\n\
+ lsls r0, 16\n\
+ asrs r4, r0, 16\n\
+ mov r1, r8\n\
+ adds r0, r4, r1\n\
+ ldrb r0, [r0]\n\
+ lsls r5, r2, 16\n\
+ cmp r0, 0\n\
+ beq _080940AE\n\
+ asrs r1, r5, 15\n\
+ add r1, r9\n\
+ movs r2, 0xF0\n\
+ lsls r2, 2\n\
+ adds r3, r1, r2\n\
+ lsls r2, r4, 3\n\
+ adds r0, r2, r7\n\
+ ldrh r0, [r0]\n\
+ orrs r0, r6\n\
+ strh r0, [r3]\n\
+ ldr r0, _080940DC @ =0x000003c2\n\
+ adds r3, r1, r0\n\
+ adds r0, r7, 0x2\n\
+ adds r0, r2, r0\n\
+ ldrh r0, [r0]\n\
+ orrs r0, r6\n\
+ strh r0, [r3]\n\
+ movs r0, 0x80\n\
+ lsls r0, 3\n\
+ adds r3, r1, r0\n\
+ adds r0, r7, 0x4\n\
+ adds r0, r2, r0\n\
+ ldrh r0, [r0]\n\
+ orrs r0, r6\n\
+ strh r0, [r3]\n\
+ ldr r0, _080940E0 @ =0x00000402\n\
+ adds r1, r0\n\
+ add r2, r12\n\
+ ldrh r0, [r2]\n\
+ orrs r0, r6\n\
+ strh r0, [r1]\n\
+_080940AE:\n\
+ adds r1, r4, 0x1\n\
+ lsls r1, 16\n\
+ movs r2, 0xC0\n\
+ lsls r2, 10\n\
+ adds r0, r5, r2\n\
+ lsrs r2, r0, 16\n\
+ lsrs r0, r1, 16\n\
+ asrs r1, 16\n\
+ cmp r1, 0x7\n\
+ ble _08094060\n\
+_080940C2:\n\
+ pop {r3,r4}\n\
+ mov r8, r3\n\
+ mov r9, r4\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_080940D0: .4byte 0x02000000\n\
+_080940D4: .4byte 0x06004000\n\
+_080940D8: .4byte gUnknown_083B5F8C\n\
+_080940DC: .4byte 0x000003c2\n\
+_080940E0: .4byte 0x00000402\n\
+ .syntax divided\n");
+}
+
+__attribute__((naked))
+static void sub_80940E4() {
+ asm(".syntax unified\n\
+ push {r4,lr}\n\
+ movs r2, 0\n\
+ ldr r1, _08094108 @ =0x06004000\n\
+ movs r4, 0\n\
+ ldr r3, _0809410C @ =0x000003ff\n\
+_080940EE:\n\
+ strh r4, [r1]\n\
+ lsls r0, r2, 16\n\
+ movs r2, 0x80\n\
+ lsls r2, 9\n\
+ adds r0, r2\n\
+ adds r1, 0x2\n\
+ lsrs r2, r0, 16\n\
+ asrs r0, 16\n\
+ cmp r0, r3\n\
+ ble _080940EE\n\
+ pop {r4}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_08094108: .4byte 0x06004000\n\
+_0809410C: .4byte 0x000003ff\n\
+ .syntax divided\n");
+}
+
+__attribute__((naked))
+static void sub_8094110() {
+ asm(".syntax unified\n\
+ push {r4-r6,lr}\n\
+ ldr r6, _0809413C @ =0x06004800\n\
+ movs r2, 0x3\n\
+ movs r5, 0xA0\n\
+ lsls r5, 2\n\
+ movs r3, 0x1\n\
+ movs r4, 0xB0\n\
+ lsls r4, 2\n\
+_08094120:\n\
+ lsls r0, r2, 1\n\
+ adds r0, r6\n\
+ adds r1, r0, r5\n\
+ strh r3, [r1]\n\
+ adds r0, r4\n\
+ strh r3, [r0]\n\
+ adds r0, r2, 0x1\n\
+ lsls r0, 16\n\
+ lsrs r2, r0, 16\n\
+ cmp r2, 0x10\n\
+ bls _08094120\n\
+ pop {r4-r6}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_0809413C: .4byte 0x06004800\n\
+ .syntax divided\n");
+}
+
+
+static void sub_8094140(void) {
+ u8 *buffer;
+
+ BasicInitMenuWindow(&WindowConfig_TrainerCard_Back_Values);
+
+ buffer = gStringVar1;
+ StringCopy(buffer, unk_2000000.var_64.playerName);
+ ConvertInternationalString(buffer, unk_2000000.language);
+ MenuPrint(buffer, 7, 5);
+
+ TrainerCard_Front_PrintTrainerID();
+ TrainerCard_Front_PrintMoney();
+ TrainerCard_Front_PrintPokedexCount();
+ sub_809429C();
+}
+
+static void sub_8094188(void) {
+ BasicInitMenuWindow(&WindowConfig_TrainerCard_Back_Values);
+ TrainerCard_Back_PrintName();
+ TrainerCard_Back_PrintHallOfFameTime_Label();
+ TrainerCard_Back_PrintLinkBattlesLabel();
+ TrainerCard_Back_PrintBattleTower_Label();
+ TrainerCard_Back_PrintLinkContests_Label();
+ TrainerCard_Back_PrintLinkPokeblocks_Label();
+ TrainerCard_Back_PrintPokemonTrades_Label();
+
+ BasicInitMenuWindow(&WindowConfig_TrainerCard_Back_Labels);
+ TrainerCard_Back_PrintHallOfFameTime();
+ TrainerCard_Back_PrintLinkBattles();
+ TrainerCard_Back_PrintBattleTower();
+ TrainerCard_Back_PrintLinkContests();
+ TrainerCard_Back_PrintLinkPokeblocks();
+ TrainerCard_Back_PrintPokemonTrades();
+}
+
+static void TrainerCard_Front_PrintTrainerID(void) {
+ u8 buffer[8];
+
+ ConvertIntToDecimalStringN(buffer, unk_2000000.var_64.trainerId, STR_CONV_MODE_LEADING_ZEROS, 5);
+ MenuPrint(buffer, 20, 2);
+}
+
+static void TrainerCard_Front_PrintMoney(void) {
+ sub_80B7AEC(unk_2000000.var_64.money, 16, 8);
+}
+
+static void TrainerCard_Front_PrintPokedexCount(void) {
+ u8 buffer[16];
+
+ if (unk_2000000.var_7 == FALSE) {
+ sub_8094110();
+ return;
+ }
+
+ ConvertIntToDecimalStringN(buffer, unk_2000000.var_64.pokedexSeen, STR_CONV_MODE_LEFT_ALIGN, 3);
+ MenuPrint_RightAligned(buffer, 16, 10);
+}
+
+static void TrainerCard_Front_PrintPlayTime(u8 *arg1, s16 colon) {
+ u8 buffer[16];
+ u16 playTimeHours;
+ u16 playTimeMinutes;
+
+ playTimeHours = gSaveBlock2.playTimeHours;
+ playTimeMinutes = gSaveBlock2.playTimeMinutes;
+
+ if (unk_2000000.var_1 != 0) {
+ playTimeHours = unk_2000000.var_64.playTimeHours;
+ playTimeMinutes = unk_2000000.var_64.playTimeMinutes;
+ }
+
+ FormatPlayTime(buffer, playTimeHours, playTimeMinutes, colon);
+ sub_8072C74(arg1, buffer, 48, 1);
+}
+
+static void sub_809429C(void) {
+ u8 *bufferPtr;
+
+ if (unk_2000000.var_1 == FALSE) {
+ return;
+ }
+
+ bufferPtr = gStringVar1;
+ bufferPtr = StringCopy(bufferPtr, unk_2000000.var_20[0]);
+ bufferPtr[0] = 00;
+ bufferPtr++;
+ bufferPtr = StringCopy(bufferPtr, unk_2000000.var_20[1]);
+ MenuPrint(gStringVar1, 2, 14);
+
+ bufferPtr = gStringVar1;
+ bufferPtr = StringCopy(bufferPtr, unk_2000000.var_20[2]);
+ bufferPtr[0] = 00;
+ bufferPtr++;
+ bufferPtr = StringCopy(bufferPtr, unk_2000000.var_20[3]);
+ MenuPrint(gStringVar1, 2, 16);
+}
+
+static void TrainerCard_Back_PrintName(void) {
+ u8 *bufferPtr;
+
+ bufferPtr = gStringVar1;
+ StringCopy(bufferPtr, unk_2000000.var_64.playerName);
+ ConvertInternationalString(bufferPtr, unk_2000000.language);
+
+ StringAppend(bufferPtr, gOtherText_TrainersTrainerCard);
+
+ MenuPrint_RightAligned(gStringVar1, 28, 2);
+}
+
+static void TrainerCard_Back_PrintHallOfFameTime_Label(void) {
+ if (unk_2000000.var_8 == FALSE) {
+ return;
+ }
+
+ MenuPrint(gOtherText_FirstHOF, 3, 5);
+}
+
+static void TrainerCard_Back_PrintHallOfFameTime(void) {
+ u8 *bufferPtr;
+
+ if (unk_2000000.var_8 == FALSE) {
+ return;
+ }
+
+ bufferPtr = gStringVar1;
+ bufferPtr = ConvertIntToDecimalStringN(bufferPtr, unk_2000000.var_64.firstHallOfFameA, STR_CONV_MODE_RIGHT_ALIGN,
+ 3);
+ bufferPtr = StringCopy(bufferPtr, gUnknown_083B5EF4);
+ bufferPtr = ConvertIntToDecimalStringN(bufferPtr, unk_2000000.var_64.firstHallOfFameB, STR_CONV_MODE_LEADING_ZEROS,
+ 2);
+ bufferPtr = StringCopy(bufferPtr, gUnknown_083B5EF4);
+ bufferPtr = ConvertIntToDecimalStringN(bufferPtr, unk_2000000.var_64.firstHallOfFameC, STR_CONV_MODE_LEADING_ZEROS,
+ 2);
+
+ MenuPrint_RightAligned(gStringVar1, 28, 5);
+}
+
+static void TrainerCard_Back_PrintLinkBattlesLabel(void) {
+ if (unk_2000000.var_9 == FALSE) {
+ return;
+ }
+
+ MenuPrint(gOtherText_LinkCableBattles, 3, 7);
+}
+
+static void TrainerCard_Back_PrintLinkBattles(void) {
+ u8 buffer[16];
+
+ if (unk_2000000.var_9 == FALSE) {
+ return;
+ }
+
+ ConvertIntToDecimalString(buffer, unk_2000000.var_64.linkBattleWins);
+ MenuPrint_RightAligned(buffer, 22, 7);
+
+ ConvertIntToDecimalString(buffer, unk_2000000.var_64.linkBattleLosses);
+ MenuPrint_RightAligned(buffer, 28, 7);
+}
+
+static void TrainerCard_Back_PrintBattleTower_Label(void) {
+ if (unk_2000000.var_a == FALSE) {
+ return;
+ }
+
+ MenuPrint(gOtherText_BattleTowerWinRecord, 3, 15);
+}
+
+static void TrainerCard_Back_PrintBattleTower(void) {
+ u8 buffer[16];
+
+ if (unk_2000000.var_a == FALSE) {
+ return;
+ }
+
+ sub_8072C44(buffer, unk_2000000.var_64.battleTowerWins, 24, 1);
+ MenuPrint_PixelCoords(buffer, 112, 120, 0);
+
+ sub_8072C44(buffer, unk_2000000.var_64.battleTowerLosses, 24, 1);
+ MenuPrint_PixelCoords(buffer, 149, 120, 0);
+}
+
+static void TrainerCard_Back_PrintLinkContests_Label(void) {
+ if (unk_2000000.var_b == FALSE) {
+ return;
+ }
+
+ MenuPrint(gOtherText_ContestRecord, 3, 13);
+}
+
+static void TrainerCard_Back_PrintLinkContests(void) {
+ u8 buffer[8];
+
+ if (unk_2000000.var_b == FALSE) {
+ return;
+ }
+
+ ConvertIntToDecimalStringN(buffer, unk_2000000.var_64.contestsWithFriends, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ MenuPrint_RightAligned(buffer, 28, 13);
+}
+
+static void TrainerCard_Back_PrintLinkPokeblocks_Label(void) {
+ if (unk_2000000.var_c == FALSE) {
+ return;
+ }
+
+ MenuPrint(gOtherText_MixingRecord, 3, 11);
+}
+
+static void TrainerCard_Back_PrintLinkPokeblocks(void) {
+ u8 buffer[8];
+
+ if (unk_2000000.var_c == FALSE) {
+ return;
+ }
+
+ ConvertIntToDecimalStringN(buffer, unk_2000000.var_64.pokeblocksWithFriends, STR_CONV_MODE_RIGHT_ALIGN, 5);
+ MenuPrint_RightAligned(buffer, 28, 11);
+}
+
+static void TrainerCard_Back_PrintPokemonTrades_Label(void) {
+ if (unk_2000000.var_d == FALSE) {
+ return;
+ }
+
+ MenuPrint(gOtherText_TradeRecord, 3, 9);
+}
+
+static void TrainerCard_Back_PrintPokemonTrades(void) {
+ u8 buffer[8];
+
+ if (unk_2000000.var_d == FALSE) {
+ return;
+ }
+
+ ConvertIntToDecimalStringN(buffer, unk_2000000.var_64.pokemonTrades, STR_CONV_MODE_RIGHT_ALIGN, 5);
+ MenuPrint_RightAligned(buffer, 28, 9);
+}
+
+static void unref_sub_8094588(u16 left, u16 top) {
+ u8 *text = gOtherText_Boy;
+
+ if (gSaveBlock2.playerGender == FEMALE) {
+ text = gOtherText_Girl;
+ }
+
+ MenuPrint(text, (u8) left, (u8) top);
+}