diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/pokedex.c | 2 | ||||
-rwxr-xr-x | src/trainer_card.c | 1626 |
2 files changed, 1609 insertions, 19 deletions
diff --git a/src/pokedex.c b/src/pokedex.c index 8c6ed3159..3d294e9e9 100644 --- a/src/pokedex.c +++ b/src/pokedex.c @@ -4381,7 +4381,7 @@ u16 sub_80C089C(u8 caseID) return count; } -bool8 sub_80C08E4(void) +bool16 sub_80C08E4(void) { u16 i; diff --git a/src/trainer_card.c b/src/trainer_card.c index d23413a26..51ef20ddc 100755 --- a/src/trainer_card.c +++ b/src/trainer_card.c @@ -12,8 +12,26 @@ #include "overworld.h" #include "menu.h" #include "text.h" +#include "constants/flags.h" +#include "event_data.h" +#include "constants/game_stat.h" +#include "money.h" +#include "string_util.h" +#include "trainer_card.h" +#include "gpu_regs.h" +#include "international_string_util.h" +#include "pokedex.h" +#include "graphics.h" +#include "pokemon_icon.h" -extern const u8 gText_WaitingTrainerFinishReading[]; +//external functions +extern u8 sub_80F8940(void); +extern bool16 sub_80C08E4(void); +extern u8 sub_80D30A0(u16); +extern void TintPalette_CustomTone(u16 *palette, u16 count, u16 rTone, u16 gTone, u16 bTone); +extern void TintPalette_SepiaTone(u16 *palette, u16 count); + +//gfx extern const u32 gUnknown_08DD2AE0[]; extern const u32 gUnknown_08DD21B0[]; extern const u32 gUnknown_08DD2D30[]; @@ -28,6 +46,60 @@ extern const u32 gFireRedTrainerCard_Gfx[]; extern const u32 gUnknown_0856F018[]; extern const u32 gUnknown_08DD1F78[]; +//strings +extern const u8 gText_WaitingTrainerFinishReading[]; +extern const u8 gText_TrainerCardName[]; +extern const u8 gText_TrainerCardIDNo[]; +extern const u8 gText_TrainerCardMoney[]; +extern const u8 gText_PokedollarVar1[]; +extern const u8 gText_EmptyString6[]; +extern const u8 gText_TrainerCardPokedex[]; +extern const u8 gText_TrainerCardTime[]; +extern const u8 gText_Colon2[]; +extern const u8 gText_Var1sTrainerCard[]; +extern const u8 gText_HallOfFameDebut[]; +extern const u8 gText_WinsLosses[]; +extern const u8 gText_PokemonTrades[]; +extern const u8 gText_BerryCrush[]; +extern const u8 gText_UnionTradesAndBattles[]; +extern const u8 gText_Var1DarkGreyShadowLightGrey[]; +extern const u8 gText_PokeblocksWithFriends[]; +extern const u8 gText_WonContestsWFriends[]; +extern const u8 gText_WSlashStraightSlash[]; +extern const u8 gText_Var1DarkLightGreyBP[]; +extern const u8 gText_BattleTower[]; +extern const u8 gText_BattlePtsWon[]; + +//const rom data to be moved from data/trainer_card.s to this file +extern const struct BgTemplate gUnknown_0856FAB4[4]; +extern const struct WindowTemplate gUnknown_0856FAC4[]; +extern const u8 gUnknown_0856FB0C[]; +extern const u8* gUnknown_0856FB40[]; +extern const u8 gUnknown_0856FB48[]; +extern const u8 gUnknown_0856FB4A[]; +extern const u8 gUnknown_0856FB4C[]; +extern const u8 gUnknown_0856FB55[]; +extern const u8 gUnknown_0856FB57[]; +extern const u8 gUnknown_0856FB0F[]; +extern const u8* gUnknown_0856FB5C[]; +extern const u8 gUnknown_0856FB68[6]; +extern const u8 gUnknown_0856FB6E[6]; +extern const u8 gUnknown_0856FB74[4]; +extern const u8 gUnknown_0856F54C[]; +extern const u8 gUnknown_0856F56C[]; +extern const u8 gUnknown_0856F58C[]; +extern const u8 gUnknown_0856F5AC[]; +extern const u8 gUnknown_0856F4EC[]; +extern const u8 gUnknown_0856F4AC[]; +extern const u8 gUnknown_0856F50C[]; +extern const u8 gUnknown_0856F4CC[]; +extern const u8 gUnknown_0856F52C[]; +extern const u8* gEmeraldTrainerCardStarPals[]; +extern const u8* gFireRedTrainerCardStarPals[]; +extern const u8 gUnknown_0856FB78[]; +extern bool8 (*const gUnknown_0856FB28[])(struct Task *); + +//this file's functions /*static*/ void sub_80C2690(void); /*static*/ void sub_80C26D4(void); /*static*/ void sub_80C48C8(void); @@ -44,28 +116,109 @@ extern const u32 gUnknown_08DD1F78[]; /*static*/ bool8 sub_80C4940(void); /*static*/ bool8 sub_80C2AD8(void); /*static*/ void sub_80C2C80(void); +/*static*/ u32 sav12_xor_get_clamped_above(u8 stat, u32 max); +/*static*/ bool8 sub_80C2DFC(void); +/*static*/ u32 sub_80C2E40(void); +/*static*/ u8 TrainerCard_GetStarCount(struct TrainerCard*); +/*static*/ u16 sub_80C376C(void); +/*static*/ void sub_80C2EC4(struct TrainerCard*, u8); +/*static*/ void sub_80C3020(struct TrainerCard*); +/*static*/ u8 sub_80C4FCC(u8); +/*static*/ void sub_80C3190(void); +/*static*/ void sub_80C3278(void); +/*static*/ void sub_80C334C(void); +/*static*/ void sub_80C3388(void); +/*static*/ void sub_80C3404(void); +/*static*/ void sub_80C3414(void); +/*static*/ void sub_80C4EE4(void); +/*static*/ void sub_80C3574(void); +/*static*/ void sub_80C3608(void); +/*static*/ void sub_80C3684(void); +/*static*/ void sub_80C378C(void); +/*static*/ void sub_80C3A18(void); +/*static*/ bool8 sub_80C34B0(void); +/*static*/ void sub_80C3B50(void); +/*static*/ void sub_80C3CCC(void); +/*static*/ void sub_80C3D60(void); +/*static*/ void sub_80C3DF0(void); +/*static*/ void sub_80C3E58(void); +/*static*/ void sub_80C3F64(void); +/*static*/ void sub_80C3ED4(void); +/*static*/ void sub_80C3FE0(void); +/*static*/ void sub_80C4140(void); +/*static*/ void sub_80C40CC(void); +/*static*/ void sub_80C42A4(void); +/*static*/ void sub_80C3548(void); +/*static*/ void sub_80C3AF0(void); +/*static*/ void sub_80C3BC4(void); +/*static*/ void sub_80C3CF4(void); +/*static*/ void sub_80C3DC0(void); +/*static*/ void sub_80C3E20(void); +/*static*/ void sub_80C3E98(void); +/*static*/ void sub_80C3F14(void); +/*static*/ void sub_80C3FA4(void); +/*static*/ void sub_80C4020(void); +/*static*/ void sub_80C3C34(u8 top, const u8* str1, u8* str2, const u8* color); +/*static*/ void sub_80C4330(void); +/*static*/ u8 sub_80C43A8(void); +/*static*/ void sub_80C474C(void); +/*static*/ void sub_80C4960(u8); +/*static*/ bool8 sub_80C4998(struct Task* task); +/*static*/ bool8 sub_80C49D8(struct Task* task); +/*static*/ void sub_80C32EC(u16); extern struct UnknownStruct{ u8 var_0; u8 var_1; u8 var_2; - u8 filler3[2]; + u8 var_3; + u8 var_4; u8 var_5; - u8 filler6[3]; + u8 var_6; + u8 var_7; + u8 var_8; u8 var_9; - u8 fillerA[0x51F]; + u8 var_A; + u8 var_B; + u8 var_C; + u8 var_D; + u8 var_E; + u8 var_F; + u8 var_10; + u8 badgeCount[8]; + u8 var_19[0xD]; + u8 var_26[0xD]; + u8 var_33[0xD]; + u8 var_40[0xD]; + u8 var_4D[0x46]; + u8 var_93[0x46]; + u8 var_D9[0x8C]; + u8 var_165[0x46]; + u8 var_1AB[0x8C]; + u8 var_237[0x8C]; + u8 var_2C3[0x8C]; + u8 var_34F[0x46]; + u8 var_395[0x46]; + u8 var_3DB[0x46]; + u8 var_421[0x47]; + u16 var_468[0x60]; + s8 var_528; u8 var_529; u8 var_52A; u8 var_52B; u16 var_52C; void (*callback2)(void); - u8 filler531[0x64]; + struct TrainerCard var_534; u8 var_598[0x4B0]; u8 var_A48[0x4B0]; u8 var_EF8[0x4B0]; u8 var_13A8[0x400]; u8 var_17A8[0x200]; - u8 var_19A8[0x200]; + u8 var_19A8[0x2300]; + u8 var_3CA8[0x2000]; + u8 var_5CA8[0x2000]; + u16 var_7CA8; + u8 var_7CAA; }* gUnknown_02039CE8; void sub_80C2690(void) @@ -93,9 +246,9 @@ void sub_80C26D4(void) void sub_80C2710(void) { RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); } void sub_80C2728(u8 taskId) @@ -145,13 +298,13 @@ void sub_80C2760(u8 taskId) gUnknown_02039CE8->var_0++; break; case 7: - if(gWirelessCommType == TRUE && gReceivedRemoteLinkPlayers == TRUE) + if(gWirelessCommType == 1 && gReceivedRemoteLinkPlayers == TRUE) { sub_800E0E8(); CreateWirelessStatusIndicatorSprite(230, 150); } - BlendPalettes(-1, 16, gUnknown_02039CE8->var_52C); - BeginNormalPaletteFade(- 1, 0, 16, 0, gUnknown_02039CE8->var_52C); + BlendPalettes(0xFFFFFFFF, 16, gUnknown_02039CE8->var_52C); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, gUnknown_02039CE8->var_52C); SetVBlankCallback(sub_80C2690); gUnknown_02039CE8->var_0++; break; @@ -185,7 +338,7 @@ void sub_80C2760(u8 taskId) gUnknown_02039CE8->var_0 = 15; else { - BeginNormalPaletteFade(-1, 0, 0, 16, gUnknown_02039CE8->var_52C); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, gUnknown_02039CE8->var_52C); gUnknown_02039CE8->var_0 = 14; } } @@ -204,7 +357,7 @@ void sub_80C2760(u8 taskId) gUnknown_02039CE8->var_0 = 15; else if(gReceivedRemoteLinkPlayers) { - BeginNormalPaletteFade(-1, 0, 0, 16, gUnknown_02039CE8->var_52C); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, gUnknown_02039CE8->var_52C); gUnknown_02039CE8->var_0 = 14; } else @@ -220,7 +373,7 @@ void sub_80C2760(u8 taskId) gUnknown_02039CE8->var_0 = 15; else { - BeginNormalPaletteFade(-1, 0, 0, 16, gUnknown_02039CE8->var_52C); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, gUnknown_02039CE8->var_52C); gUnknown_02039CE8->var_0 = 14; } } @@ -235,7 +388,7 @@ void sub_80C2760(u8 taskId) case 16: if(!gReceivedRemoteLinkPlayers) { - BeginNormalPaletteFade(-1, 0, 0, 16, gUnknown_02039CE8->var_52C); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, gUnknown_02039CE8->var_52C); gUnknown_02039CE8->var_0 = 14; } break; @@ -249,7 +402,6 @@ void sub_80C2760(u8 taskId) gUnknown_02039CE8->var_0 = 10; PlaySE(SE_RG_CARD3); } - break; } } @@ -303,9 +455,1447 @@ bool8 sub_80C2AD8(void) break; default: gUnknown_02039CE8->var_2 = 0; - return 1; + return TRUE; } gUnknown_02039CE8->var_2++; + return FALSE; +} + +NAKED +void sub_80C2C80(void) //not really a nonmatching, skipped it because of DMA macros +{ + asm("\n\ + .syntax unified\n\ + push {lr}\n\ + sub sp, 0x8\n\ + ldr r1, =gMain\n\ + movs r2, 0x87\n\ + lsls r2, 3\n\ + adds r0, r1, r2\n\ + ldrb r0, [r0]\n\ + adds r3, r1, 0\n\ + cmp r0, 0xA\n\ + bls _080C2C96\n\ + b _080C2DD8\n\ +_080C2C96:\n\ + lsls r0, 2\n\ + ldr r1, =_080C2CA8\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ + .pool\n\ + .align 2, 0\n\ +_080C2CA8:\n\ + .4byte _080C2CD4\n\ + .4byte _080C2CEC\n\ + .4byte _080C2D14\n\ + .4byte _080C2D50\n\ + .4byte _080C2D6A\n\ + .4byte _080C2D74\n\ + .4byte _080C2D88\n\ + .4byte _080C2D8E\n\ + .4byte _080C2DA0\n\ + .4byte _080C2DA6\n\ + .4byte _080C2DB8\n\ +_080C2CD4:\n\ + bl sub_80C334C\n\ + bl sub_80C3414\n\ + ldr r1, =gMain\n\ + movs r0, 0x87\n\ + lsls r0, 3\n\ + adds r1, r0\n\ + b _080C2DCC\n\ + .pool\n\ +_080C2CEC:\n\ + movs r1, 0xE0\n\ + lsls r1, 19\n\ + movs r0, 0\n\ + str r0, [sp]\n\ + ldr r0, =0x040000d4\n\ + mov r2, sp\n\ + str r2, [r0]\n\ + str r1, [r0, 0x4]\n\ + ldr r1, =0x85000100\n\ + str r1, [r0, 0x8]\n\ + ldr r0, [r0, 0x8]\n\ + movs r0, 0x87\n\ + lsls r0, 3\n\ + adds r1, r3, r0\n\ + b _080C2DCC\n\ + .pool\n\ +_080C2D14:\n\ + ldr r0, =gUnknown_02039CE8\n\ + ldr r0, [r0]\n\ + ldr r1, =0x0000052c\n\ + adds r0, r1\n\ + ldrh r0, [r0]\n\ + cmp r0, 0\n\ + bne _080C2D36\n\ + movs r2, 0xA0\n\ + lsls r2, 19\n\ + add r1, sp, 0x4\n\ + strh r0, [r1]\n\ + ldr r0, =0x040000d4\n\ + str r1, [r0]\n\ + str r2, [r0, 0x4]\n\ + ldr r1, =0x81000200\n\ + str r1, [r0, 0x8]\n\ + ldr r0, [r0, 0x8]\n\ +_080C2D36:\n\ + movs r2, 0x87\n\ + lsls r2, 3\n\ + adds r1, r3, r2\n\ + b _080C2DCC\n\ + .pool\n\ +_080C2D50:\n\ + bl ResetSpriteData\n\ + bl FreeAllSpritePalettes\n\ + bl ResetPaletteFade\n\ + ldr r1, =gMain\n\ + movs r0, 0x87\n\ + lsls r0, 3\n\ + adds r1, r0\n\ + ldrb r0, [r1]\n\ + adds r0, 0x1\n\ + strb r0, [r1]\n\ +_080C2D6A:\n\ + bl sub_80C3388\n\ + b _080C2DC4\n\ + .pool\n\ +_080C2D74:\n\ + bl sub_80C41D8\n\ + ldr r1, =gMain\n\ + movs r0, 0x87\n\ + lsls r0, 3\n\ + adds r1, r0\n\ + b _080C2DCC\n\ + .pool\n\ +_080C2D88:\n\ + bl sub_80C2AD8\n\ + b _080C2DBC\n\ +_080C2D8E:\n\ + bl sub_80C4330\n\ + ldr r1, =gMain\n\ + movs r0, 0x87\n\ + lsls r0, 3\n\ + adds r1, r0\n\ + b _080C2DCC\n\ + .pool\n\ +_080C2DA0:\n\ + bl sub_80C3278\n\ + b _080C2DC4\n\ +_080C2DA6:\n\ + bl sub_80C3548\n\ + ldr r1, =gMain\n\ + movs r0, 0x87\n\ + lsls r0, 3\n\ + adds r1, r0\n\ + b _080C2DCC\n\ + .pool\n\ +_080C2DB8:\n\ + bl sub_80C43A8\n\ +_080C2DBC:\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + bne _080C2DDC\n\ +_080C2DC4:\n\ + ldr r1, =gMain\n\ + movs r2, 0x87\n\ + lsls r2, 3\n\ + adds r1, r2\n\ +_080C2DCC:\n\ + ldrb r0, [r1]\n\ + adds r0, 0x1\n\ + strb r0, [r1]\n\ + b _080C2DDC\n\ + .pool\n\ +_080C2DD8:\n\ + bl sub_80C3404\n\ +_080C2DDC:\n\ + add sp, 0x8\n\ + pop {r0}\n\ + bx r0\n\ + .syntax divided"); +} + +u32 sav12_xor_get_clamped_above(u8 stat, u32 max) +{ + u32 retStat = GetGameStat(stat); + return (retStat > max) ? max : retStat; +} + +bool8 sub_80C2DFC(void) +{ + u8 i; + for(i = 0; i <= 6; i++) + { + if(!FlagGet(FLAG_SYS_TOWER_SILVER + 2 * i) || !FlagGet(FLAG_SYS_TOWER_GOLD + 2 * i)) + return FALSE; + } + return TRUE; +} + +u32 sub_80C2E40(void) +{ + u32 stat = GetGameStat(GAME_STAT_ENTERED_HOF); + u8 r4 = (stat | -stat) >> 31; + + if(sub_80C08E4()) + r4++; + if(sub_80F8940() > 4) + r4++; + if(sub_80C2DFC()) + r4++; + return r4; +} + +u8 TrainerCard_GetStarCount(struct TrainerCard *trainerCard) +{ + u8 value = 0; + + if (trainerCard->firstHallOfFameA || trainerCard->firstHallOfFameB || trainerCard->firstHallOfFameC) + value++; + if (trainerCard->var_3) + value++; + if (trainerCard->battleTowerLosses > 49) + value++; + if (trainerCard->var_4) + value++; + + return value; +} + +void sub_80C2EC4(struct TrainerCard *trainerCard, u8 arg1) +{ + u32 playTime; + bool32 enteredHallOfFame; + u8 i; + + trainerCard->gender = gSaveBlock2Ptr->playerGender; + trainerCard->playTimeHours = gSaveBlock2Ptr->playTimeHours; + trainerCard->playTimeMinutes = gSaveBlock2Ptr->playTimeMinutes; + + playTime = GetGameStat(GAME_STAT_FIRST_HOF_PLAY_TIME); + enteredHallOfFame = GetGameStat(GAME_STAT_ENTERED_HOF); + if (!enteredHallOfFame) + playTime = 0; + + trainerCard->firstHallOfFameA = playTime >> 16; + trainerCard->firstHallOfFameB = (playTime >> 8) & 0xFF; + trainerCard->firstHallOfFameC = playTime & 0xFF; + if((playTime >> 16) > 999) + { + trainerCard->firstHallOfFameA = 999; + trainerCard->firstHallOfFameB = 59; + trainerCard->firstHallOfFameC = 59; + } + + trainerCard->hasPokedex = FlagGet(FLAG_SYS_POKEDEX_GET); + trainerCard->var_3 = sub_80C08E4(); + trainerCard->pokedexCaught = sub_80C376C(); + + trainerCard->trainerId = (gSaveBlock2Ptr->playerTrainerId[1] << 8) | gSaveBlock2Ptr->playerTrainerId[0]; + + trainerCard->linkBattleWins = sav12_xor_get_clamped_above(GAME_STAT_LINK_BATTLE_WINS, 9999); + trainerCard->linkBattleLosses = sav12_xor_get_clamped_above(GAME_STAT_LINK_BATTLE_LOSSES, 9999); + + trainerCard->pokemonTrades = sav12_xor_get_clamped_above(GAME_STAT_POKEMON_TRADES, 0xFFFF); + + trainerCard->money = GetMoney(&gSaveBlock1Ptr->money); + + for (i = 0; i < 4; i++) + trainerCard->var_28[i] = gSaveBlock1Ptr->unk2BB0[i]; + + StringCopy(trainerCard->playerName, gSaveBlock2Ptr->playerName); + + switch(arg1) + { + case 2: + trainerCard->battleTowerWins = 0; + trainerCard->battleTowerLosses = 0; + case 0: + trainerCard->contestsWithFriends = sav12_xor_get_clamped_above(GAME_STAT_WON_LINK_CONTEST, 999); + trainerCard->pokeblocksWithFriends = sav12_xor_get_clamped_above(GAME_STAT_POKEBLOCKS_WITH_FRIENDS, 0xFFFF); + if(sub_80F8940() > 4) + trainerCard->var_4 = TRUE; + trainerCard->stars = TrainerCard_GetStarCount(trainerCard); + break; + case 1: + trainerCard->battleTowerWins = 0; + trainerCard->battleTowerLosses = 0; + trainerCard->contestsWithFriends = 0; + trainerCard->pokeblocksWithFriends = 0; + trainerCard->var_4 = 0; + trainerCard->stars = 0; + } +} + +#ifdef NONMATCHING //r0 and r1 swapped +void sub_80C3020(struct TrainerCard *trainerCard) +{ + memset(trainerCard, 0, sizeof(struct TrainerCard)); + trainerCard->var_38 = 3; + sub_80C2EC4(trainerCard, 2); + trainerCard->var_60 = sub_80C2DFC(); + trainerCard->var_62 = gSaveBlock2Ptr->frontier.field_EBA; + if(trainerCard->var_60) + trainerCard->stars++; + if(trainerCard->gender == FEMALE) + trainerCard->var_4F = gUnknown_08329D54[(trainerCard->trainerId & 7) + 8]; + else + trainerCard->var_4F = gUnknown_08329D54[trainerCard->trainerId & 7]; +} +#else +NAKED +void sub_80C3020(struct TrainerCard *trainerCard) +{ + asm("\n\ + .syntax unified\n\ + push {r4,lr}\n\ + adds r4, r0, 0\n\ + movs r1, 0\n\ + movs r2, 0x64\n\ + bl memset\n\ + adds r1, r4, 0\n\ + adds r1, 0x38\n\ + movs r0, 0x3\n\ + strb r0, [r1]\n\ + adds r0, r4, 0\n\ + movs r1, 0x2\n\ + bl sub_80C2EC4\n\ + bl sub_80C2DFC\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + adds r1, r4, 0\n\ + adds r1, 0x60\n\ + strh r0, [r1]\n\ + ldr r0, =gSaveBlock2Ptr\n\ + ldr r0, [r0]\n\ + ldr r2, =0x00000eba\n\ + adds r0, r2\n\ + ldrh r0, [r0]\n\ + adds r2, r4, 0\n\ + adds r2, 0x62\n\ + strh r0, [r2]\n\ + ldrh r0, [r1]\n\ + cmp r0, 0\n\ + beq _080C3066\n\ + ldrb r0, [r4, 0x1]\n\ + adds r0, 0x1\n\ + strb r0, [r4, 0x1]\n\ +_080C3066:\n\ + ldrb r0, [r4]\n\ + cmp r0, 0x1\n\ + bne _080C3084\n\ + ldr r2, =gUnknown_08329D54\n\ + ldrh r0, [r4, 0xE]\n\ + movs r1, 0x7\n\ + ands r0, r1\n\ + adds r0, 0x8\n\ + b _080C308C\n\ + .pool\n\ +_080C3084:\n\ + ldr r2, =gUnknown_08329D54\n\ + ldrh r0, [r4, 0xE]\n\ + movs r1, 0x7\n\ + ands r0, r1\n\ +_080C308C:\n\ + lsls r0, 1\n\ + adds r0, r2\n\ + ldrh r1, [r0]\n\ + adds r0, r4, 0\n\ + adds r0, 0x4F\n\ + strb r1, [r0]\n\ + pop {r4}\n\ + pop {r0}\n\ + bx r0\n\ + .pool\n\ + .syntax divided"); +} +#endif // NONMATCHING + +#ifdef NONMATCHING //r0 and r1 swapped +void TrainerCard_GenerateCardForPlayer(struct TrainerCard *trainerCard) +{ + u8 temp; + memset(trainerCard, 0, 0x60); + trainerCard->var_38 = 3; + sub_80C2EC4(trainerCard, 2); + temp = sub_80C2DFC(); + trainerCard->var_3A = temp; + *((u16*)&trainerCard->var_3C) = gSaveBlock2Ptr->frontier.field_EBA; + if(temp) + trainerCard->stars++; + if(trainerCard->gender == FEMALE) + trainerCard->var_4F = gUnknown_08329D54[(trainerCard->trainerId & 7) + 8]; + else + trainerCard->var_4F = gUnknown_08329D54[trainerCard->trainerId & 7]; +} +#else +NAKED +void TrainerCard_GenerateCardForPlayer(struct TrainerCard *trainerCard) +{ + asm("\n\ + .syntax unified\n\ + push {r4,lr}\n\ + adds r4, r0, 0\n\ + movs r1, 0\n\ + movs r2, 0x60\n\ + bl memset\n\ + adds r1, r4, 0\n\ + adds r1, 0x38\n\ + movs r0, 0x3\n\ + strb r0, [r1]\n\ + adds r0, r4, 0\n\ + movs r1, 0x2\n\ + bl sub_80C2EC4\n\ + bl sub_80C2DFC\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + strh r0, [r4, 0x3A]\n\ + ldr r1, =gSaveBlock2Ptr\n\ + ldr r1, [r1]\n\ + ldr r2, =0x00000eba\n\ + adds r1, r2\n\ + ldrh r1, [r1]\n\ + strh r1, [r4, 0x3C]\n\ + cmp r0, 0\n\ + beq _080C30E0\n\ + ldrb r0, [r4, 0x1]\n\ + adds r0, 0x1\n\ + strb r0, [r4, 0x1]\n\ +_080C30E0:\n\ + ldrb r0, [r4]\n\ + cmp r0, 0x1\n\ + bne _080C3100\n\ + ldr r2, =gUnknown_08329D54\n\ + ldrh r0, [r4, 0xE]\n\ + movs r1, 0x7\n\ + ands r0, r1\n\ + adds r0, 0x8\n\ + b _080C3108\n\ + .pool\n\ +_080C3100:\n\ + ldr r2, =gUnknown_08329D54\n\ + ldrh r0, [r4, 0xE]\n\ + movs r1, 0x7\n\ + ands r0, r1\n\ +_080C3108:\n\ + lsls r0, 1\n\ + adds r0, r2\n\ + ldrh r1, [r0]\n\ + adds r0, r4, 0\n\ + adds r0, 0x4F\n\ + strb r1, [r0]\n\ + pop {r4}\n\ + pop {r0}\n\ + bx r0\n\ + .pool\n\ + .syntax divided"); +} +#endif // NONMATCHING + +void sub_80C3120(struct TrainerCard *trainerCard, u16 *src, u8 gameVersion) +{ + memset(trainerCard, 0, sizeof(struct TrainerCard)); + trainerCard->var_38 = gameVersion; + switch(sub_80C4FCC(gameVersion)) + { + case 0: + memcpy(trainerCard, src, 0x60); + break; + case 1: + memcpy(trainerCard, src, 0x38); + break; + case 2: + memcpy(trainerCard, src, 0x60); + trainerCard->var_3C = 0; + trainerCard->var_60 = src[29]; + trainerCard->var_62 = src[30]; + } +} + +void sub_80C3190(void) +{ + u8 i; + u32 badgeFlag; + + gUnknown_02039CE8->var_A = 0; + gUnknown_02039CE8->var_B = 0; + gUnknown_02039CE8->var_C = 0; + gUnknown_02039CE8->var_D = 0; + gUnknown_02039CE8->var_E = 0; + gUnknown_02039CE8->var_F = 0; + gUnknown_02039CE8->var_10 = 0; + memset(gUnknown_02039CE8->badgeCount, 0, 8); + if(gUnknown_02039CE8->var_534.hasPokedex) + gUnknown_02039CE8->var_A++; + + if(gUnknown_02039CE8->var_534.firstHallOfFameA + ||gUnknown_02039CE8->var_534.firstHallOfFameB + ||gUnknown_02039CE8->var_534.firstHallOfFameC) + gUnknown_02039CE8->var_B++; + + if(gUnknown_02039CE8->var_534.linkBattleWins || gUnknown_02039CE8->var_534.linkBattleLosses) + gUnknown_02039CE8->var_C++; + if(gUnknown_02039CE8->var_534.pokemonTrades) + gUnknown_02039CE8->var_10++; + if(gUnknown_02039CE8->var_534.battleTowerWins || gUnknown_02039CE8->var_534.battleTowerLosses) + gUnknown_02039CE8->var_D++; + + i = 0; + badgeFlag = FLAG_BADGE01_GET; + while (1) + { + if(FlagGet(badgeFlag)) + gUnknown_02039CE8->badgeCount[i]++; + badgeFlag++; + i++; + if (badgeFlag > FLAG_BADGE08_GET) + break; + } +} + +void sub_80C3278(void) +{ + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); + ShowBg(0); + ShowBg(1); + ShowBg(2); + ShowBg(3); + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_DARKEN); + SetGpuReg(REG_OFFSET_BLDY, 0); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR); + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ); + SetGpuReg(REG_OFFSET_WIN0V, 160); + SetGpuReg(REG_OFFSET_WIN0H, 240); + if(gReceivedRemoteLinkPlayers) + EnableInterrupts(INTR_FLAG_VBLANK | INTR_FLAG_HBLANK | INTR_FLAG_VCOUNT | INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL); + else + EnableInterrupts(INTR_FLAG_VBLANK | INTR_FLAG_HBLANK); +} + +void sub_80C32EC(u16 arg0) +{ + u8 quotient = (arg0 + 40) / 10; + + if((s8)quotient <= 4) + quotient = 0; + gUnknown_02039CE8->var_528 = quotient; + SetGpuReg(REG_OFFSET_BLDY, gUnknown_02039CE8->var_528); + SetGpuReg(REG_OFFSET_WIN0V, (gUnknown_02039CE8->var_7CA8 * 256) | (160 - gUnknown_02039CE8->var_7CA8)); +} + +void sub_80C334C(void) +{ + SetVBlankCallback(NULL); + SetHBlankCallback(NULL); + SetGpuReg(REG_OFFSET_DISPCNT, 0); + SetGpuReg(REG_OFFSET_BG0CNT, 0); + SetGpuReg(REG_OFFSET_BG1CNT, 0); + SetGpuReg(REG_OFFSET_BG2CNT, 0); + SetGpuReg(REG_OFFSET_BG3CNT, 0); +} + +void sub_80C3388(void) +{ + ResetBgsAndClearDma3BusyFlags(0); + InitBgsFromTemplates(0, gUnknown_0856FAB4, ARRAY_COUNT(gUnknown_0856FAB4)); + ChangeBgX(0, 0, 0); + ChangeBgY(0, 0, 0); + ChangeBgX(1, 0, 0); + ChangeBgY(1, 0, 0); + ChangeBgX(2, 0, 0); + ChangeBgY(2, 0, 0); + ChangeBgX(3, 0, 0); + ChangeBgY(3, 0, 0); + InitWindows(gUnknown_0856FAC4); + DeactivateAllTextPrinters(); + sub_81973A4(); +} + +void sub_80C3404(void) +{ + SetMainCallback2(sub_80C2710); +} + +void sub_80C3414(void) +{ + ResetTasks(); + ScanlineEffect_Stop(); + CreateTask(sub_80C2760, 0); + sub_80C4EE4(); + sub_80C3190(); +} + +bool8 sub_80C3438(void) +{ + switch(gUnknown_02039CE8->var_1) + { + case 0: + sub_80C3574(); + break; + case 1: + sub_80C3608(); + break; + case 2: + sub_80C3684(); + break; + case 3: + sub_80C378C(); + break; + case 4: + sub_80C3880(); + break; + case 5: + sub_80C3A18(); + break; + default: + gUnknown_02039CE8->var_1 = 0; + return TRUE; + } + gUnknown_02039CE8->var_1++; + return FALSE; +} + +bool8 sub_80C34B0(void) +{ + switch(gUnknown_02039CE8->var_1) + { + case 0: + sub_80C3B50(); + break; + case 1: + sub_80C3CCC(); + break; + case 2: + sub_80C3D60(); + break; + case 3: + sub_80C3DF0(); + break; + case 4: + sub_80C3E58(); + sub_80C3F64(); + break; + case 5: + sub_80C3ED4(); + sub_80C3FE0(); + break; + case 6: + sub_80C4140(); + sub_80C40CC(); + break; + case 7: + sub_80C42A4(); + break; + default: + gUnknown_02039CE8->var_1 = 0; + return TRUE; + } + gUnknown_02039CE8->var_1++; + return FALSE; +} + +void sub_80C3548(void) +{ + sub_80C3AF0(); + sub_80C3BC4(); + sub_80C3CF4(); + sub_80C3DC0(); + sub_80C3E20(); + sub_80C3E98(); + sub_80C3F14(); + sub_80C3FA4(); + sub_80C4020(); +} + +void sub_80C3574(void) +{ + u8 buffer[32]; + u8* txtPtr; + txtPtr = StringCopy(buffer, gText_TrainerCardName); + StringCopy(txtPtr, gUnknown_02039CE8->var_534.playerName); + ConvertInternationalString(txtPtr, gUnknown_02039CE8->var_7CAA); + if(!gUnknown_02039CE8->var_52A) + AddTextPrinterParameterized3(1, 1, 20, 28, gUnknown_0856FB0C, -1, buffer); + else + AddTextPrinterParameterized3(1, 1, 16, 33, gUnknown_0856FB0C, -1, buffer); +} + +void sub_80C3608(void) +{ + u8 buffer[32]; + u8* txtPtr; + s32 xPos; + u32 top; + txtPtr = StringCopy(buffer, gText_TrainerCardIDNo); + ConvertIntToDecimalStringN(txtPtr, gUnknown_02039CE8->var_534.trainerId, STR_CONV_MODE_LEADING_ZEROS, 5); + if(!gUnknown_02039CE8->var_52A) + { + xPos = GetStringCenterAlignXOffset(1, buffer, 80) + 132; + top = 9; + } + else + { + xPos = GetStringCenterAlignXOffset(1, buffer, 96) + 120; + top = 9; + } + + AddTextPrinterParameterized3(1, 1, xPos, top, gUnknown_0856FB0C, -1, buffer); +} + +void sub_80C3684(void) +{ + s32 xOffset; + u8 top; + if(!gUnknown_02039CE8->var_52B) + AddTextPrinterParameterized3(1, 1, 20, 56, gUnknown_0856FB0C, -1, gText_TrainerCardMoney); + else + AddTextPrinterParameterized3(1, 1, 16, 57, gUnknown_0856FB0C, -1, gText_TrainerCardMoney); + ConvertIntToDecimalStringN(gStringVar1, gUnknown_02039CE8->var_534.money, 0, 6); + StringExpandPlaceholders(gStringVar4, gText_PokedollarVar1); + if(!gUnknown_02039CE8->var_52B) + { + xOffset = GetStringRightAlignXOffset(1, gStringVar4, 144); + top = 56; + } + else + { + xOffset = GetStringRightAlignXOffset(1, gStringVar4, 128); + top = 57; + } + AddTextPrinterParameterized3(1, 1, xOffset, top, gUnknown_0856FB0C, -1, gStringVar4); +} + +u16 sub_80C376C(void) +{ + if(IsNationalPokedexEnabled()) + return GetNationalPokedexCount(FLAG_GET_CAUGHT); + + return GetHoennPokedexCount(FLAG_GET_CAUGHT); +} + +void sub_80C378C(void) +{ + s32 xOffset; + u8 top; + if(FlagGet(FLAG_SYS_POKEDEX_GET)) + { + if(!gUnknown_02039CE8->var_52B) + AddTextPrinterParameterized3(1, 1, 20, 72, gUnknown_0856FB0C, -1, gText_TrainerCardPokedex); + else + AddTextPrinterParameterized3(1, 1, 16, 73, gUnknown_0856FB0C, -1,gText_TrainerCardPokedex); + StringCopy(ConvertIntToDecimalStringN(gStringVar4, gUnknown_02039CE8->var_534.pokedexCaught, 0, 3), gText_EmptyString6); + if(!gUnknown_02039CE8->var_52B) + { + xOffset = GetStringRightAlignXOffset(1, gStringVar4, 144); + top = 72; + } + else + { + xOffset = GetStringRightAlignXOffset(1, gStringVar4, 128); + top = 73; + } + AddTextPrinterParameterized3(1, 1, xOffset, top, gUnknown_0856FB0C, -1, gStringVar4); + } +} + +void sub_80C3880(void) +{ + u16 hours; + u16 minutes; + s32 width; + u32 r7, r4, r10; + if(!gUnknown_02039CE8->var_52B) + AddTextPrinterParameterized3(1, 1, 20, 88, gUnknown_0856FB0C, -1, gText_TrainerCardTime); + else + AddTextPrinterParameterized3(1, 1, 16, 89, gUnknown_0856FB0C, -1, gText_TrainerCardTime); + if(gUnknown_02039CE8->var_5) + { + hours = gUnknown_02039CE8->var_534.playTimeHours; + minutes = gUnknown_02039CE8->var_534.playTimeMinutes; + } + else + { + hours = gSaveBlock2Ptr->playTimeHours; + minutes = gSaveBlock2Ptr->playTimeMinutes; + } + if(hours > 999) + hours = 999; + if(minutes > 59) + minutes = 59; + width = GetStringWidth(1, gText_Colon2, 0); + + if(!gUnknown_02039CE8->var_52B) + { + r7 = 144; + r4 = 88; + } + else + { + r7 = 128; + r4 = 89; + } + r10 = width + 30; + r7 -= r10; + + FillWindowPixelRect(1, 0, r7, r4, r10, 15); + ConvertIntToDecimalStringN(gStringVar4, hours, 1, 3); + AddTextPrinterParameterized3(1, 1, r7, r4, gUnknown_0856FB0C, -1, gStringVar4); + r7 += 18; + AddTextPrinterParameterized3(1, 1, r7, r4, gUnknown_0856FB40[gUnknown_02039CE8->var_7], -1, gText_Colon2); + r7 += width; + ConvertIntToDecimalStringN(gStringVar4, minutes, 2, 2); + AddTextPrinterParameterized3(1, 1, r7, r4, gUnknown_0856FB0C, -1, gStringVar4); +} + +void sub_80C3A18(void) +{ + if(gUnknown_02039CE8->var_5) + { + AddTextPrinterParameterized3(1, 1, 8, gUnknown_0856FB48[gUnknown_02039CE8->var_52B], gUnknown_0856FB0C, -1, gUnknown_02039CE8->var_19); + AddTextPrinterParameterized3(1, 1, GetStringWidth(1, gUnknown_02039CE8->var_19, 0) + 14, gUnknown_0856FB48[gUnknown_02039CE8->var_52B], gUnknown_0856FB0C, -1, gUnknown_02039CE8->var_26); + AddTextPrinterParameterized3(1, 1, 8, gUnknown_0856FB4A[gUnknown_02039CE8->var_52B], gUnknown_0856FB0C, -1, gUnknown_02039CE8->var_33); + AddTextPrinterParameterized3(1, 1, GetStringWidth(1, gUnknown_02039CE8->var_33, 0) + 14, gUnknown_0856FB4A[gUnknown_02039CE8->var_52B], gUnknown_0856FB0C, -1, gUnknown_02039CE8->var_40); + } +} + +void sub_80C3AF0(void) +{ + StringCopy(gUnknown_02039CE8->var_4D, gUnknown_02039CE8->var_534.playerName); + ConvertInternationalString(gUnknown_02039CE8->var_4D, gUnknown_02039CE8->var_7CAA); + if(gUnknown_02039CE8->var_52A) + { + StringCopy(gStringVar1, gUnknown_02039CE8->var_4D); + StringExpandPlaceholders(gUnknown_02039CE8->var_4D, gText_Var1sTrainerCard); + } +} + +void sub_80C3B50(void) +{ + if(!gUnknown_02039CE8->var_52B) + AddTextPrinterParameterized3(1, 1, 136, 9, gUnknown_0856FB0C, -1, gUnknown_02039CE8->var_4D); + else + AddTextPrinterParameterized3(1, 1, GetStringRightAlignXOffset(1, gUnknown_02039CE8->var_4D, 216), 9, gUnknown_0856FB0C, -1, gUnknown_02039CE8->var_4D); +} + +void sub_80C3BC4(void) +{ + if(gUnknown_02039CE8->var_B) + { + ConvertIntToDecimalStringN(gStringVar1, gUnknown_02039CE8->var_534.firstHallOfFameA, 1, 3); + ConvertIntToDecimalStringN(gStringVar2, gUnknown_02039CE8->var_534.firstHallOfFameB, 2, 2); + ConvertIntToDecimalStringN(gStringVar3, gUnknown_02039CE8->var_534.firstHallOfFameC, 2, 2); + StringExpandPlaceholders(gUnknown_02039CE8->var_93, gUnknown_0856FB4C); + } +} + +void sub_80C3C34(u8 top, const u8* str1, u8* str2, const u8* color) +{ + AddTextPrinterParameterized3(1, 1, gUnknown_0856FB55[gUnknown_02039CE8->var_52B], top * 16 + 33, gUnknown_0856FB0C, -1, str1); + AddTextPrinterParameterized3(1, 1, GetStringRightAlignXOffset(1, str2, gUnknown_0856FB57[gUnknown_02039CE8->var_52B]), top * 16 + 33, color, -1, str2); +} + +void sub_80C3CCC(void) +{ + if(gUnknown_02039CE8->var_B) + sub_80C3C34(0, gText_HallOfFameDebut, gUnknown_02039CE8->var_93, gUnknown_0856FB0F); +} + +void sub_80C3CF4(void) +{ + if(gUnknown_02039CE8->var_C) + { + StringCopy(gUnknown_02039CE8->var_D9, gUnknown_0856FB5C[gUnknown_02039CE8->var_52A]); + ConvertIntToDecimalStringN(gUnknown_02039CE8->var_165, gUnknown_02039CE8->var_534.linkBattleWins, 0, 4); + ConvertIntToDecimalStringN(gUnknown_02039CE8->var_1AB, gUnknown_02039CE8->var_534.linkBattleLosses, 0, 4); + } +} + +void sub_80C3D60(void) +{ + if(gUnknown_02039CE8->var_C) + { + StringCopy(gStringVar1, gUnknown_02039CE8->var_165); + StringCopy(gStringVar2, gUnknown_02039CE8->var_1AB); + StringExpandPlaceholders(gStringVar4, gText_WinsLosses); + sub_80C3C34(1, gUnknown_02039CE8->var_D9, gStringVar4, gUnknown_0856FB0C); + } +} + +void sub_80C3DC0(void) +{ + if(gUnknown_02039CE8->var_10) + ConvertIntToDecimalStringN(gUnknown_02039CE8->var_237, gUnknown_02039CE8->var_534.pokemonTrades, 1, 5); +} + +void sub_80C3DF0(void) +{ + if(gUnknown_02039CE8->var_10) + sub_80C3C34(2, gText_PokemonTrades, gUnknown_02039CE8->var_237, gUnknown_0856FB0F); +} + +void sub_80C3E20(void) +{ + if(!gUnknown_02039CE8->var_52A && gUnknown_02039CE8->var_534.var_3C) + ConvertIntToDecimalStringN(gUnknown_02039CE8->var_2C3, gUnknown_02039CE8->var_534.var_3C, 1, 5); +} + +void sub_80C3E58(void) +{ + if(!gUnknown_02039CE8->var_52A && gUnknown_02039CE8->var_534.var_3C) + sub_80C3C34(4, gText_BerryCrush, gUnknown_02039CE8->var_2C3, gUnknown_0856FB0F); +} + +void sub_80C3E98(void) +{ + if(!gUnknown_02039CE8->var_52A && gUnknown_02039CE8->var_534.var_40) + ConvertIntToDecimalStringN(gUnknown_02039CE8->var_34F, gUnknown_02039CE8->var_534.var_40, 1, 5); +} + +void sub_80C3ED4(void) +{ + if(!gUnknown_02039CE8->var_52A && gUnknown_02039CE8->var_534.var_40) + sub_80C3C34(3, gText_UnionTradesAndBattles, gUnknown_02039CE8->var_34F, gUnknown_0856FB0F); +} + +void sub_80C3F14(void) +{ + if(gUnknown_02039CE8->var_52A && gUnknown_02039CE8->var_534.pokeblocksWithFriends) + { + ConvertIntToDecimalStringN(gStringVar1, gUnknown_02039CE8->var_534.pokeblocksWithFriends, 1, 5); + StringExpandPlaceholders(gUnknown_02039CE8->var_395, gText_Var1DarkGreyShadowLightGrey); + } +} + +void sub_80C3F64(void) +{ + if(gUnknown_02039CE8->var_52A && gUnknown_02039CE8->var_534.pokeblocksWithFriends) + sub_80C3C34(3, gText_PokeblocksWithFriends, gUnknown_02039CE8->var_395, gUnknown_0856FB0F); +} + +void sub_80C3FA4(void) +{ + if(gUnknown_02039CE8->var_52A && gUnknown_02039CE8->var_534.contestsWithFriends) + ConvertIntToDecimalStringN(gUnknown_02039CE8->var_3DB, gUnknown_02039CE8->var_534.contestsWithFriends, 1, 5); +} + +void sub_80C3FE0(void) +{ + if(gUnknown_02039CE8->var_52A && gUnknown_02039CE8->var_534.contestsWithFriends) + sub_80C3C34(4, gText_WonContestsWFriends, gUnknown_02039CE8->var_3DB, gUnknown_0856FB0F); +} + +void sub_80C4020(void) +{ + switch(gUnknown_02039CE8->var_52A) + { + case 1: + if(gUnknown_02039CE8->var_D) + { + ConvertIntToDecimalStringN(gStringVar1, gUnknown_02039CE8->var_534.battleTowerWins, 1, 4); + ConvertIntToDecimalStringN(gStringVar2, gUnknown_02039CE8->var_534.battleTowerLosses, 1, 4); + StringExpandPlaceholders(gUnknown_02039CE8->var_421, gText_WSlashStraightSlash); + } + break; + + case 2: + if(gUnknown_02039CE8->var_534.var_62) + { + ConvertIntToDecimalStringN(gStringVar1, gUnknown_02039CE8->var_534.var_62, 1, 5); + StringExpandPlaceholders(gUnknown_02039CE8->var_421, gText_Var1DarkLightGreyBP); + } + case 0: + } +} + +void sub_80C40CC(void) +{ + switch(gUnknown_02039CE8->var_52A) + { + case 1: + if(gUnknown_02039CE8->var_D) + sub_80C3C34(5, gText_BattleTower, gUnknown_02039CE8->var_421, gUnknown_0856FB0C); + break; + case 2: + if(gUnknown_02039CE8->var_534.var_62) + sub_80C3C34(5, gText_BattlePtsWon, gUnknown_02039CE8->var_421, gUnknown_0856FB0F); + case 0: + } +} + +void sub_80C4140(void) +{ + u8 i; + u8 buffer[8]; + u8 buffer2[8]; + memcpy(buffer, gUnknown_0856FB68, sizeof(gUnknown_0856FB68)); + memcpy(buffer2, gUnknown_0856FB6E, sizeof(gUnknown_0856FB6E)); + + if(!gUnknown_02039CE8->var_52A) + { + for(i = 0; i < 6; i++) + { + if(gUnknown_02039CE8->var_534.monSpecies[i]) + { + u8 monSpecies = sub_80D30A0(gUnknown_02039CE8->var_534.monSpecies[i]); + WriteSequenceToBgTilemapBuffer(3, 16 * i + 224, buffer2[i] + 3, 15, 4, 4, buffer[monSpecies], 1); + } + } + } +} + +void sub_80C41D8(void) +{ + u8 i; + CpuSet(gMonIconPalettes, gUnknown_02039CE8->var_468, 0x60); + switch(gUnknown_02039CE8->var_534.var_4E) + { + case 1: + TintPalette_CustomTone(gUnknown_02039CE8->var_468, 96, 0, 0, 0); + break; + case 2: + TintPalette_CustomTone(gUnknown_02039CE8->var_468, 96, 500, 330, 310); + break; + case 3: + TintPalette_SepiaTone(gUnknown_02039CE8->var_468, 96); + case 0: + } + LoadPalette(gUnknown_02039CE8->var_468, 80, 192); + + for(i = 0; i < 6; i++) + { + if(gUnknown_02039CE8->var_534.monSpecies[i]) + LoadBgTiles(3, GetMonIconTiles(gUnknown_02039CE8->var_534.monSpecies[i], 0), 512, 16 * i + 32); + } +} + +void sub_80C42A4(void) +{ + u8 i; + u8 buffer[4]; + memcpy(buffer, gUnknown_0856FB74, sizeof(gUnknown_0856FB74)); + if(!gUnknown_02039CE8->var_52A && gUnknown_02039CE8->var_534.var_4C == 1) + { + for(i = 0; i < 3; i++) + { + u8 var_50 = gUnknown_02039CE8->var_534.var_50[i]; + if(gUnknown_02039CE8->var_534.var_50[i]) + WriteSequenceToBgTilemapBuffer(3, i * 4 + 320, i * 3 + 2, 2, 2, 2, buffer[var_50 - 1], 1); + } + } +} + +void sub_80C4330(void) +{ + LoadPalette(gUnknown_0856F54C, 176, 32); + LoadPalette(gUnknown_0856F56C, 192, 32); + LoadPalette(gUnknown_0856F58C, 208, 32); + LoadPalette(gUnknown_0856F5AC, 224, 32); + LoadBgTiles(3, gUnknown_02039CE8->var_17A8, 1024, 128); +} + +void sub_80C438C(u8 windowId) +{ + PutWindowTilemap(windowId); + CopyWindowToVram(windowId, 3); +} + +u8 sub_80C43A8(void) +{ + switch(gUnknown_02039CE8->var_3) + { + case 0: + LoadBgTiles(3, gUnknown_02039CE8->var_13A8, 1024, 0); + break; + case 1: + LoadBgTiles(0, gUnknown_02039CE8->var_19A8, 6144, 0); + break; + case 2: + if(gUnknown_02039CE8->var_52A) + { + LoadPalette(gEmeraldTrainerCardStarPals[gUnknown_02039CE8->var_534.stars], 0, 96); + LoadPalette(gUnknown_0856F4EC, 48, 32); + if(gUnknown_02039CE8->var_534.gender) + LoadPalette(gUnknown_0856F4AC, 16, 32); + } + else + { + LoadPalette(gFireRedTrainerCardStarPals[gUnknown_02039CE8->var_534.stars], 0, 96); + LoadPalette(gUnknown_0856F50C, 48, 32); + if(gUnknown_02039CE8->var_534.gender) + LoadPalette(gUnknown_0856F4CC, 16, 32); + } + LoadPalette(gUnknown_0856F52C, 64, 32); + break; + case 3: + SetBgTilemapBuffer(0, gUnknown_02039CE8->var_3CA8); + SetBgTilemapBuffer(2, gUnknown_02039CE8->var_5CA8); + break; + case 4: + FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32); + FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 32, 32); + FillBgTilemapBufferRect_Palette0(3, 0, 0, 0, 32, 32); + default: + return 1; + } + gUnknown_02039CE8->var_3++; return 0; } +NAKED +void sub_80C4550(u8* ptr) //nested loop +{ + asm("\n\ + .syntax unified\n\ + push {r4-r7,lr}\n\ + adds r7, r0, 0\n\ + ldr r0, =gUnknown_02039CE8\n\ + ldr r0, [r0]\n\ + ldr r1, =0x00005ca8\n\ + adds r6, r0, r1\n\ + movs r1, 0\n\ +_080C455E:\n\ + movs r2, 0\n\ + lsls r5, r1, 16\n\ + asrs r1, r5, 16\n\ + lsls r3, r1, 5\n\ + lsls r0, r1, 4\n\ + subs r0, r1\n\ + lsls r4, r0, 1\n\ +_080C456C:\n\ + lsls r0, r2, 16\n\ + asrs r1, r0, 16\n\ + adds r2, r0, 0\n\ + cmp r1, 0x1D\n\ + bgt _080C4590\n\ + adds r0, r3, r1\n\ + lsls r0, 1\n\ + adds r0, r6\n\ + adds r1, r4, r1\n\ + lsls r1, 1\n\ + adds r1, r7\n\ + ldrh r1, [r1]\n\ + b _080C4598\n\ + .pool\n\ +_080C4590:\n\ + adds r0, r3, r1\n\ + lsls r0, 1\n\ + adds r0, r6\n\ + ldrh r1, [r7]\n\ +_080C4598:\n\ + strh r1, [r0]\n\ + movs r1, 0x80\n\ + lsls r1, 9\n\ + adds r0, r2, r1\n\ + lsrs r2, r0, 16\n\ + asrs r0, 16\n\ + cmp r0, 0x1F\n\ + ble _080C456C\n\ + adds r0, r5, r1\n\ + lsrs r1, r0, 16\n\ + asrs r0, 16\n\ + cmp r0, 0x13\n\ + ble _080C455E\n\ + movs r0, 0x2\n\ + bl CopyBgTilemapBufferToVram\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .syntax divided"); +} + +NAKED +void sub_80C45C0(u8* ptr) //nested loop +{ + asm("\n\ + .syntax unified\n\ + push {r4-r7,lr}\n\ + adds r7, r0, 0\n\ + ldr r0, =gUnknown_02039CE8\n\ + ldr r0, [r0]\n\ + ldr r1, =0x00003ca8\n\ + adds r6, r0, r1\n\ + movs r1, 0\n\ +_080C45CE:\n\ + movs r2, 0\n\ + lsls r5, r1, 16\n\ + asrs r1, r5, 16\n\ + lsls r3, r1, 5\n\ + lsls r0, r1, 4\n\ + subs r0, r1\n\ + lsls r4, r0, 1\n\ +_080C45DC:\n\ + lsls r0, r2, 16\n\ + asrs r1, r0, 16\n\ + adds r2, r0, 0\n\ + cmp r1, 0x1D\n\ + bgt _080C4600\n\ + adds r0, r3, r1\n\ + lsls r0, 1\n\ + adds r0, r6\n\ + adds r1, r4, r1\n\ + lsls r1, 1\n\ + adds r1, r7\n\ + ldrh r1, [r1]\n\ + b _080C4608\n\ + .pool\n\ +_080C4600:\n\ + adds r0, r3, r1\n\ + lsls r0, 1\n\ + adds r0, r6\n\ + ldrh r1, [r7]\n\ +_080C4608:\n\ + strh r1, [r0]\n\ + movs r1, 0x80\n\ + lsls r1, 9\n\ + adds r0, r2, r1\n\ + lsrs r2, r0, 16\n\ + asrs r0, 16\n\ + cmp r0, 0x1F\n\ + ble _080C45DC\n\ + adds r0, r5, r1\n\ + lsrs r1, r0, 16\n\ + asrs r0, 16\n\ + cmp r0, 0x13\n\ + ble _080C45CE\n\ + movs r0, 0\n\ + bl CopyBgTilemapBufferToVram\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .syntax divided"); +} + +NAKED +void sub_80C4630(void) +{ + asm("\n\ + .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, 0xC\n\ + movs r0, 0xC0\n\ + mov r8, r0\n\ + movs r2, 0x3\n\ + mov r10, r2\n\ + ldr r2, =gUnknown_0856FB78\n\ + ldr r4, =gUnknown_02039CE8\n\ + ldr r1, [r4]\n\ + ldr r3, =0x0000052b\n\ + adds r0, r1, r3\n\ + ldrb r0, [r0]\n\ + adds r0, r2\n\ + ldrb r3, [r0]\n\ + ldr r0, =0x00000535\n\ + adds r1, r0\n\ + ldrb r0, [r1]\n\ + str r0, [sp]\n\ + movs r0, 0x1\n\ + str r0, [sp, 0x4]\n\ + movs r0, 0x4\n\ + str r0, [sp, 0x8]\n\ + movs r0, 0x3\n\ + movs r1, 0x8F\n\ + movs r2, 0xF\n\ + bl FillBgTilemapBufferRect\n\ + ldr r0, [r4]\n\ + ldrb r0, [r0, 0x5]\n\ + cmp r0, 0\n\ + bne _080C4724\n\ + movs r2, 0x4\n\ + mov r9, r2\n\ + movs r2, 0\n\ + movs r6, 0x1\n\ +_080C467E:\n\ + ldr r0, =gUnknown_02039CE8\n\ + ldr r1, [r0]\n\ + lsls r0, r2, 16\n\ + asrs r7, r0, 16\n\ + adds r1, 0x11\n\ + adds r1, r7\n\ + ldrb r0, [r1]\n\ + cmp r0, 0\n\ + beq _080C4700\n\ + mov r3, r9\n\ + lsls r5, r3, 24\n\ + lsrs r5, 24\n\ + str r6, [sp]\n\ + str r6, [sp, 0x4]\n\ + mov r0, r10\n\ + str r0, [sp, 0x8]\n\ + movs r0, 0x3\n\ + mov r1, r8\n\ + adds r2, r5, 0\n\ + movs r3, 0xF\n\ + bl FillBgTilemapBufferRect\n\ + mov r1, r8\n\ + adds r1, 0x1\n\ + lsls r1, 16\n\ + lsrs r1, 16\n\ + mov r4, r9\n\ + adds r4, 0x1\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + str r6, [sp]\n\ + str r6, [sp, 0x4]\n\ + mov r2, r10\n\ + str r2, [sp, 0x8]\n\ + movs r0, 0x3\n\ + adds r2, r4, 0\n\ + movs r3, 0xF\n\ + bl FillBgTilemapBufferRect\n\ + mov r1, r8\n\ + adds r1, 0x10\n\ + lsls r1, 16\n\ + lsrs r1, 16\n\ + str r6, [sp]\n\ + str r6, [sp, 0x4]\n\ + mov r3, r10\n\ + str r3, [sp, 0x8]\n\ + movs r0, 0x3\n\ + adds r2, r5, 0\n\ + movs r3, 0x10\n\ + bl FillBgTilemapBufferRect\n\ + mov r1, r8\n\ + adds r1, 0x11\n\ + lsls r1, 16\n\ + lsrs r1, 16\n\ + str r6, [sp]\n\ + str r6, [sp, 0x4]\n\ + mov r0, r10\n\ + str r0, [sp, 0x8]\n\ + movs r0, 0x3\n\ + adds r2, r4, 0\n\ + movs r3, 0x10\n\ + bl FillBgTilemapBufferRect\n\ +_080C4700:\n\ + adds r0, r7, 0x1\n\ + lsls r0, 16\n\ + mov r1, r8\n\ + adds r1, 0x2\n\ + lsls r1, 16\n\ + lsrs r1, 16\n\ + mov r8, r1\n\ + mov r2, r9\n\ + lsls r1, r2, 16\n\ + movs r3, 0xC0\n\ + lsls r3, 10\n\ + adds r1, r3\n\ + lsrs r1, 16\n\ + mov r9, r1\n\ + lsrs r2, r0, 16\n\ + asrs r0, 16\n\ + cmp r0, 0x7\n\ + ble _080C467E\n\ +_080C4724:\n\ + movs r0, 0x3\n\ + bl CopyBgTilemapBufferToVram\n\ + add sp, 0xC\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .pool\n\ + .syntax divided"); +} + +void sub_80C474C(void) +{ + if(!gUnknown_02039CE8->var_52A) + { + if(gUnknown_02039CE8->var_10) + { + FillBgTilemapBufferRect(3, 141, 27, 9, 1, 1, 1); + FillBgTilemapBufferRect(3, 157, 27, 10, 1, 1, 1); + } + if(gUnknown_02039CE8->var_534.var_3C) + { + FillBgTilemapBufferRect(3, 141, 21, 13, 1, 1, 1); + FillBgTilemapBufferRect(3, 157, 21, 14, 1, 1, 1); + } + if(gUnknown_02039CE8->var_534.var_40) + { + FillBgTilemapBufferRect(3, 141, 27, 11, 1, 1, 1); + FillBgTilemapBufferRect(3, 157, 27, 12, 1, 1, 1); + } + } + else + { + if(gUnknown_02039CE8->var_10) + { + FillBgTilemapBufferRect(3, 141, 27, 9, 1, 1, 0); + FillBgTilemapBufferRect(3, 157, 27, 10, 1, 1, 0); + } + if(gUnknown_02039CE8->var_534.contestsWithFriends) + { + FillBgTilemapBufferRect(3, 141, 27, 13, 1, 1, 0); + FillBgTilemapBufferRect(3, 157, 27, 14, 1, 1, 0); + } + if(gUnknown_02039CE8->var_D) + { + FillBgTilemapBufferRect(3, 141, 17, 15, 1, 1, 0); + FillBgTilemapBufferRect(3, 157, 17, 16, 1, 1, 0); + FillBgTilemapBufferRect(3, 140, 27, 15, 1, 1, 0); + FillBgTilemapBufferRect(3, 156, 27, 16, 1, 1, 0); + } + } + CopyBgTilemapBufferToVram(3); +} + +void sub_80C48C8(void) +{ + if(++gUnknown_02039CE8->var_6 > 60) + { + gUnknown_02039CE8->var_6 = 0; + gUnknown_02039CE8->var_7 ^= 1; + gUnknown_02039CE8->var_529 = 1; + } +} + +u8 sub_80C4904(u8 cardId) +{ + struct TrainerCard* trainerCards = gTrainerCards; + return trainerCards[cardId].stars; +} + +void sub_80C4918(void) +{ + u8 taskId = CreateTask(sub_80C4960, 0); + sub_80C4960(taskId); + SetHBlankCallback(sub_80C26D4); +} + +bool8 sub_80C4940(void) +{ + if(FindTaskIdByFunc(sub_80C4960) == 0xFF) + return TRUE; + return FALSE; +} + +void sub_80C4960(u8 taskId) +{ + while(gUnknown_0856FB28[gTasks[taskId].data[0]](&gTasks[taskId])) + ; +} + +bool8 sub_80C4998(struct Task* task) +{ + u32 i; + HideBg(1); + HideBg(3); + ScanlineEffect_Stop(); + ScanlineEffect_Clear(); + for(i = 0; i < 160; i++) + gScanlineEffectRegBuffers[1][i] = 0; + task->data[0]++; + return FALSE; +} |