diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/matsuda_debug_menu.c | 724 | ||||
-rw-r--r-- | src/menu.c | 2 | ||||
-rw-r--r-- | src/text.c | 4 | ||||
-rw-r--r-- | src/trainer_card.c | 1812 |
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); +} |