diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/money.c | 4 | ||||
-rw-r--r-- | src/pokedex.c | 2 | ||||
-rw-r--r-- | src/start_menu.c | 4 | ||||
-rw-r--r-- | src/trainer_card.c | 1606 |
4 files changed, 861 insertions, 755 deletions
diff --git a/src/money.c b/src/money.c index 39e5aaa32..0bc1e7016 100644 --- a/src/money.c +++ b/src/money.c @@ -6,7 +6,7 @@ #include "text_window.h" extern const u8 gText_PokedollarVar1[]; -extern const u8 gUnknown_8419CE7[]; +extern const u8 gText_TrainerCardMoney[]; #define MAX_MONEY 999999 @@ -110,7 +110,7 @@ void PrintMoneyAmount(u8 windowId, u8 x, u8 y, int amount, u8 speed) void PrintMoneyAmountInMoneyBoxWithBorder(u8 windowId, u16 tileStart, u8 pallete, int amount) { DrawStdFrameWithCustomTileAndPalette(windowId, FALSE, tileStart, pallete); - AddTextPrinterParameterized(windowId, 2, gUnknown_8419CE7, 0, 0, 0xFF, 0); + AddTextPrinterParameterized(windowId, 2, gText_TrainerCardMoney, 0, 0, 0xFF, 0); PrintMoneyAmountInMoneyBox(windowId, amount, 0); } diff --git a/src/pokedex.c b/src/pokedex.c index 84ca59549..1354aac8c 100644 --- a/src/pokedex.c +++ b/src/pokedex.c @@ -88,7 +88,7 @@ bool16 HasAllHoennMons(void) return TRUE; } -bool8 HasAllKantoMons(void) +bool16 HasAllKantoMons(void) { u16 i; diff --git a/src/start_menu.c b/src/start_menu.c index 2a1713902..31bb3beb7 100644 --- a/src/start_menu.c +++ b/src/start_menu.c @@ -504,7 +504,7 @@ static bool8 StartMenuPlayerCallback(void) PlayRainStoppingSoundEffect(); DestroySafariZoneStatsWindow(); CleanupOverworldWindowsAndTilemaps(); - InitTrainerCard(CB2_ReturnToFieldWithOpenMenu); + ShowPlayerTrainerCard(CB2_ReturnToFieldWithOpenMenu); return TRUE; } return FALSE; @@ -554,7 +554,7 @@ static bool8 StartMenuLinkPlayerCallback(void) { PlayRainStoppingSoundEffect(); CleanupOverworldWindowsAndTilemaps(); - InitLinkPartnerTrainerCard(gUnknown_300502C, CB2_ReturnToFieldWithOpenMenu); + ShowTrainerCardInLink(gUnknown_300502C, CB2_ReturnToFieldWithOpenMenu); return TRUE; } return FALSE; diff --git a/src/trainer_card.c b/src/trainer_card.c index 095a21685..88ea21d8d 100644 --- a/src/trainer_card.c +++ b/src/trainer_card.c @@ -8,189 +8,229 @@ #include "link.h" #include "bg.h" #include "sound.h" -#include "frontier_pass.h" #include "overworld.h" #include "menu.h" #include "text.h" #include "event_data.h" #include "easy_chat.h" #include "money.h" +#include "window.h" #include "strings.h" #include "string_util.h" #include "trainer_card.h" #include "gpu_regs.h" -#include "international_string_util.h" #include "pokedex.h" #include "pokemon_icon.h" #include "graphics.h" #include "pokemon_icon.h" +#include "help_system.h" #include "trainer_pokemon_sprites.h" -#include "script_pokemon_util_80F87D8.h" +#include "new_menu_helpers.h" #include "constants/songs.h" #include "constants/flags.h" #include "constants/game_stat.h" -#include "constants/battle_frontier.h" -#include "constants/rgb.h" +#include "constants/vars.h" +#include "constants/species.h" + +#define BADGE_COUNT 8 enum { CARD_TYPE_FRLG, - CARD_TYPE_RS, CARD_TYPE_EMERALD, }; struct TrainerCardData { - u8 var_0; - u8 printState; - u8 gfxLoadState; - u8 bgPalLoadState; - u8 var_4; - bool8 isLink; - u8 var_6; - u8 var_7; - u8 var_8; - bool8 allowDMACopy; - bool8 hasPokedex; - bool8 hasHofResult; - bool8 hasLinkResults; - bool8 hasBattleTowerWins; - u8 var_E; - u8 var_F; - bool8 hasTrades; - u8 badgeCount[8]; - u8 var_19[4][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[0x46]; - u16 var_468[0x60]; - s8 var_528; - u8 var_529; - u8 cardType; - bool8 isHoenn; - u16 var_52C; - void (*callback2)(void); - struct TrainerCard trainerCard; - u16 var_598[0x4B0 / 2]; - u16 var_A48[0x4B0 / 2]; - u16 var_EF8[0x4B0 / 2]; - u8 var_13A8[0x400]; - u8 var_17A8[0x200]; - u8 var_19A8[0x2300]; - u16 var_3CA8[0x2000 / 2]; - u16 var_5CA8[0x2000 / 2]; - u16 var_7CA8; - u8 language; -}; - + /*0x0000*/ u8 taskState; + /*0x0001*/ u8 printState; + /*0x0002*/ u8 gfxLoadState; + /*0x0003*/ u8 bgPalLoadState; + /*0x0004*/ u8 var_4; + /*0x0005*/ bool8 isLink; + /*0x0006*/ u8 var_6; + /*0x0007*/ u8 var_7; + /*0x0008*/ u8 var_8; + /*0x0009*/ bool8 allowDMACopy; + /*0x000A*/ bool8 hasPokedex; + /*0x000B*/ bool8 hasHofResult; + /*0x000C*/ bool8 hasLinkResults; + /*0x000D*/ bool8 hasBattleTowerWins; + /*0x000E*/ u8 var_E; + /*0x000F*/ u8 var_F; + /*0x0010*/ bool8 hasTrades; + /*0x0011*/ u8 hasBadge[BADGE_COUNT]; + /*0x0019*/ u8 var_19[4][0xD]; + /*0x004D*/ u8 var_4D[0x46]; + /*0x0093*/ u8 var_93[0x46]; + /*0x00D9*/ u8 var_D9[0x46]; + /*0x011F*/ u8 var_11F[0x46]; + /*0x0165*/ u8 var_165[0x46]; + /*0x01AB*/ u8 var_1AB[0x46]; + /*0x01F1*/ u8 var_1F1[0x46]; + /*0x0237*/ u8 var_237[0x46]; + /*0x027D*/ u8 var_27D[0x46]; + /*0x02C3*/ u8 var_2C3[0x46]; + /*0x0309*/ u8 var_309[0x46]; + /*0x034F*/ u8 var_34F[0x46]; + /*0x0395*/ u8 var_395; + /*0x0396*/ u16 monIconPals[0x30]; + /*0x03F6*/ u8 var_3DB[0x60]; + /*0x0456*/ s8 var_456; + /*0x0457*/ u8 cardType; + /*0x0458*/ void (*callback2)(void); + /*0x045C*/ struct TrainerCard trainerCard; + // /*0x045C*/ u8 gender; + // /*0x045D*/ u8 stars; + // /*0x045E*/ bool8 hasPokedex; + // /*0x045F*/ bool8 caughtAllHoenn; + // /*0x0460*/ bool8 hasAllPaintings; + // /*0x0462*/ u16 hofDebutHours; + // /*0x0464*/ u16 hofDebutMinutes; + // /*0x0466*/ u16 hofDebutSeconds; + // /*0x0468*/ u16 caughtMonsCount; + // /*0x046A*/ u16 trainerId; + // /*0x046C*/ u16 playTimeHours; + // /*0x046E*/ u16 playTimeMinutes; + // /*0x0470*/ u16 linkBattleWins; + // /*0x0472*/ u16 linkBattleLosses; + // /*0x0474*/ u16 battleTowerWins; + // /*0x0476*/ u16 battleTowerStraightWins; + // /*0x0478*/ u16 contestsWithFriends; + // /*0x047A*/ u16 pokeblocksWithFriends; + // /*0x047C*/ u16 pokemonTrades; + // /*0x0480*/ u32 money; + // /*0x0484*/ u16 var_28[4]; + // /*0x048C*/ u8 playerName[PLAYER_NAME_LENGTH]; + // /*0x0494*/ u8 version; + // /*0x0496*/ u16 var_3A; + // /*0x0498*/ u32 berryCrushPoints; + // /*0x049C*/ u32 unionRoomNum; + // /*0x04A0*/ u32 berriesPicked; + // /*0x04A4*/ u32 jumpsInRow; + // /*0x04A8*/ bool8 var_4C; + // /*0x04A9*/ bool8 hasAllMons; + // /*0x04AA*/ u8 var_4E; + // /*0x04AB*/ u8 var_4F; + // /*0x04AC*/ u8 var_50[4]; + // /*0x04B0*/ u16 monSpecies[PARTY_SIZE]; + /*0x04BC*/ u16 var_4BC; + /*0x04BE*/ u8 var_4BE[0x4AE]; + /*0x096C*/ u16 var_96C[0x258]; + /*0x0E1C*/ u16 var_E1C; + /*0x0E1E*/ u8 unk_E1E[0x4AE]; + /*0x12CC*/ u16 cardTiles[0x200]; + /*0x16CC*/ u16 bgTiles[0x100]; + /*0x18CC*/ u16 var_18CC[0x1180]; + /*0x3BCC*/ u16 bgTilemap0[0x1000]; + /*0x5BCC*/ u16 bgTilemap2[0x1000]; + /*0x7BCC*/ u16 var_7BCC; + /*0x7BCE*/ bool8 var_7BCE; + /*0x7BCF*/ u8 language; +}; /* size = 0x7BD0 */ + +// RAM EWRAM_DATA struct TrainerCard gTrainerCards[4] = {0}; EWRAM_DATA static struct TrainerCardData *sTrainerCardDataPtr = NULL; // Function Declaration static void VblankCb_TrainerCard(void); static void HblankCb_TrainerCard(void); -static void sub_80C48C8(void); static void CB2_TrainerCard(void); -static void CloseTrainerCard(u8 task); -static bool8 PrintAllOnCardPage1(void); -static void sub_80C438C(u8); -static void sub_80C4FF0(void); -static void sub_80C4550(u16*); -static void sub_80C45C0(u16*); -static void TrainerCard_PrintStarsAndBadgesOnCard(void); -static void PrintTimeOnCard(void); -static void sub_80C4918(void); -static bool8 sub_80C4940(void); +static void CloseTrainerCard(u8 taskId); +static void Task_TrainerCard(u8 taskId); static bool8 LoadCardGfx(void); static void CB2_InitTrainerCard(void); static u32 GetCappedGameStat(u8 statId, u32 maxValue); -static bool8 HasAllFrontierSymbols(void); -static u8 GetRubyTrainerStars(struct TrainerCard*); -static u16 GetCaughtMonsCount(void); -static void SetPlayerCardData(struct TrainerCard*, u8); -static void TrainerCard_GenerateCardForLinkPlayer(struct TrainerCard*); -static u8 VersionToCardType(u8); +static u8 GetTrainerStarCount(struct TrainerCard *trainerCard); +static void SetPlayerCardData(struct TrainerCard *trainerCard, u8 cardType); static void SetDataFromTrainerCard(void); static void HandleGpuRegs(void); +static void sub_8089BD8(u16 arg0); static void ResetGpuRegs(void); -static void InitBgsAndWindows(void); +static void TrainerCardNull(void); +static void sub_8089C5C(void); +static void sub_8089C80(void); +static void sub_8089CA4(void); +static void ResetTrainerCard(void); static void SetTrainerCardCb2(void); -static void sub_80C3414(void); -static void sub_80C4EE4(void); -static u8 GetSetCardType(void); +static void sub_8089DA4(void); +static bool8 PrintAllOnCardPage1(void); +static bool8 PrintStringsOnCardPage2(void); +static void sub_8089ECC(void); static void PrintNameOnCard(void); static void PrintIdOnCard(void); static void PrintMoneyOnCard(void); +static u16 GetCaughtMonsCount(void); static void PrintPokedexOnCard(void); +static void PrintTimeOnCard(void); static void PrintProfilePhraseOnCard(void); -static bool8 PrintStringsOnCardPage2(void); -static void sub_80C3B50(void); -static void PrintHofDebutStringOnCard(void); -static void PrintWinsLossesStringOnCard(void); -static void PrintTradesStringOnCard(void); -static void PrintBerryCrushStringOnCard(void); -static void PrintPokeblockStringOnCard(void); -static void PrintUnionStringOnCard(void); -static void PrintContestStringOnCard(void); -static void TrainerCard_PrintPokemonIconsOnCard(void); -static void PrintBattleFacilityStringOnCard(void); -static void sub_80C42A4(void); -static void PrintAllVariableNumsOnCardPage2(void); static void PrintNameOnCard2(void); +static void sub_808A4FC(void); static void PrintHofTimeOnCard(void); +static void PrintHofDebutStringOnCard(void); static void PrintLinkResultsNumsOnCard(void); +static void PrintWinsLossesStringOnCard(void); static void PrintTradesNumOnCard(void); +static void PrintTradesStringOnCard(void); static void PrintBerryCrushNumOnCard(void); +static void PrintBerryCrushStringOnCard(void); static void PrintUnionNumOnCard(void); -static void PrintPokeblocksNumOnCard(void); -static void PrintContestNumOnCard(void); -static void PrintBattleFacilityNumsOnCard(void); -static void PrintString(u8 top, const u8* str1, u8* str2, const u8* color); -static void sub_80C4330(void); -static u8 SetCardBgsAndPals(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 bool8 sub_80C4B08(struct Task* task); -static bool8 sub_80C4C1C(struct Task* task); -static bool8 sub_80C4C84(struct Task* task); -static bool8 sub_80C4DB0(struct Task* task); -static void sub_80C32EC(u16); -static void sub_80C41D8(void); - -// const rom data -static const u32 gUnknown_0856F018[] = INCBIN_U32("graphics/trainer_card/stickers_fr.4bpp.lz"); -static const u16 gUnknown_0856F18C[] = INCBIN_U16("graphics/trainer_card/unknown_56F18C.gbapal"); -static const u16 gEmeraldTrainerCard1Star_Pal[] = INCBIN_U16("graphics/trainer_card/one_star.gbapal"); -static const u16 gFireRedTrainerCard1Star_Pal[] = INCBIN_U16("graphics/trainer_card/one_star_fr.gbapal"); -static const u16 gEmeraldTrainerCard2Star_Pal[] = INCBIN_U16("graphics/trainer_card/two_stars.gbapal"); -static const u16 gFireRedTrainerCard2Star_Pal[] = INCBIN_U16("graphics/trainer_card/two_stars_fr.gbapal"); -static const u16 gEmeraldTrainerCard3Star_Pal[] = INCBIN_U16("graphics/trainer_card/three_stars.gbapal"); -static const u16 gFireRedTrainerCard3Star_Pal[] = INCBIN_U16("graphics/trainer_card/three_stars_fr.gbapal"); -static const u16 gEmeraldTrainerCard4Star_Pal[] = INCBIN_U16("graphics/trainer_card/four_stars.gbapal"); -static const u16 gFireRedTrainerCard4Star_Pal[] = INCBIN_U16("graphics/trainer_card/four_stars_fr.gbapal"); -static const u16 sEmeraldTrainerCardFemaleBackground_Pal[] = INCBIN_U16("graphics/trainer_card/female_bg.gbapal"); -static const u16 sFireRedTrainerCardFemaleBackground_Pal[] = INCBIN_U16("graphics/trainer_card/female_bg_fr.gbapal"); -static const u16 sEmeraldTrainerCardBadges_Pal[] = INCBIN_U16("graphics/trainer_card/badges.gbapal"); -static const u16 sFireRedTrainerCardBadges_Pal[] = INCBIN_U16("graphics/trainer_card/badges_fr.gbapal"); -static const u16 gUnknown_0856F52C[] = INCBIN_U16("graphics/trainer_card/gold.gbapal"); -static const u16 gUnknown_0856F54C[] = INCBIN_U16("graphics/trainer_card/stickers_fr1.gbapal"); -static const u16 gUnknown_0856F56C[] = INCBIN_U16("graphics/trainer_card/stickers_fr2.gbapal"); -static const u16 gUnknown_0856F58C[] = INCBIN_U16("graphics/trainer_card/stickers_fr3.gbapal"); -static const u16 gUnknown_0856F5AC[] = INCBIN_U16("graphics/trainer_card/stickers_fr4.gbapal"); -static const u32 sEmeraldTrainerCardBadges_Tile[] = INCBIN_U32("graphics/trainer_card/badges.4bpp.lz"); -static const u32 sFireRedTrainerCardBadges_Tile[] = INCBIN_U32("graphics/trainer_card/badges_fr.4bpp.lz"); - -static const struct BgTemplate gUnknown_0856FAB4[4] = +static void PrintUnionStringOnCard(void); +static void TrainerCard_PrintPokemonIconsOnCard(void); +static void sub_808AB10(void); +static void sub_808ABE0(void); +static void TrainerCardLoadStickerPals(void); +static void PutTrainerCardWindow(u8 windowId); +static bool8 SetTrainerCardBgsAndPals(void); +static void LoadTrainerCardTilemap2(u16* ptr); +static void LoadTrainerCardTilemap0(u16* ptr); +static void TrainerCard_PrintStarsAndBadgesOnCard(void); +static void sub_808B090(void); +static void sub_808B180(void); +static void sub_808B1D4(void); +static bool8 sub_808B1FC(void); +static void sub_808B21C(u8 taskId); +static bool8 sub_808B254(struct Task* task); +static bool8 sub_808B294(struct Task* task); +static bool8 sub_808B3C4(struct Task* task); +static bool8 sub_808B4D8(struct Task* task); +static bool8 sub_808B540(struct Task* task); +static bool8 sub_808B66C(struct Task *task); +static void sub_808B774(void); +static u8 GetCardType(void); +static void sub_808B838(void); + +// Data +static const u32 sTrainerCardStickers[] = INCBIN_U32("graphics/trainer_card/stickers.4bpp.lz"); +static const u32 sUnknown_83CC4DC[] = INCBIN_U32("graphics/trainer_card/unk_83CC4DC.bin"); +static const u32 sUnknown_83CC6F0[] = INCBIN_U32("graphics/trainer_card/unk_83CC6F0.bin"); +static const u32 sUnknown_83CC8A8[] = INCBIN_U32("graphics/trainer_card/unk_83CC8A8.bin"); +static const u32 sUnknown_83CC984[] = INCBIN_U32("graphics/trainer_card/unk_83CC984.bin"); +static const u32 sUnknown_83CCAB0[] = INCBIN_U32("graphics/trainer_card/unk_83CCAB0.bin"); +static const u32 sUnknown_83CCCA4[] = INCBIN_U32("graphics/trainer_card/unk_83CCCA4.bin"); +static const u32 sUnknown_83CCE30[] = INCBIN_U32("graphics/trainer_card/unk_83CCE30.bin"); +static const u32 sUnknown_83CCEC8[] = INCBIN_U32("graphics/trainer_card/unk_83CCEC8.bin"); +static const u16 sEmeraldTrainerCard1Stars_Pals[] = INCBIN_U16("graphics/trainer_card/em_1stars_pals.gbapal"); +static const u16 sFireRedTrainerCard1Stars_Pals[] = INCBIN_U16("graphics/trainer_card/fr_1stars_pals.gbapal"); +static const u16 sEmeraldTrainerCard2Stars_Pals[] = INCBIN_U16("graphics/trainer_card/em_2stars_pals.gbapal"); +static const u16 sFireRedTrainerCard2Stars_Pals[] = INCBIN_U16("graphics/trainer_card/fr_2stars_pals.gbapal"); +static const u16 sEmeraldTrainerCard3Stars_Pals[] = INCBIN_U16("graphics/trainer_card/em_3stars_pals.gbapal"); +static const u16 sFireRedTrainerCard3Stars_Pals[] = INCBIN_U16("graphics/trainer_card/fr_3stars_pals.gbapal"); +static const u16 sEmeraldTrainerCard4Stars_Pals[] = INCBIN_U16("graphics/trainer_card/em_4stars_pals.gbapal"); +static const u16 sFireRedTrainerCard4Stars_Pals[] = INCBIN_U16("graphics/trainer_card/fr_4stars_pals.gbapal"); +static const u16 sEmeraldTrainerCardFemaleBackground_Pal[] = INCBIN_U16("graphics/trainer_card/em_female_bg.gbapal"); +static const u16 sFireRedTrainerCardFemaleBackground_Pal[] = INCBIN_U16("graphics/trainer_card/fr_female_bg.gbapal"); +static const u16 sEmeraldTrainerCardBadges_Pal[] = INCBIN_U16("graphics/trainer_card/em_badges.gbapal"); +static const u16 sFireRedTrainerCardBadges_Pal[] = INCBIN_U16("graphics/trainer_card/fr_badges.gbapal"); +static const u16 sUnknown_83CD300[] = INCBIN_U16("graphics/trainer_card/unk_83CD300.gbapal"); +static const u16 sTrainerCardStickerPal1[] = INCBIN_U16("graphics/trainer_card/sticker1.gbapal"); +static const u16 sTrainerCardStickerPal2[] = INCBIN_U16("graphics/trainer_card/sticker2.gbapal"); +static const u16 sTrainerCardStickerPal3[] = INCBIN_U16("graphics/trainer_card/sticker3.gbapal"); +static const u16 sTrainerCardStickerPal4[] = INCBIN_U16("graphics/trainer_card/sticker4.gbapal"); +static const u32 sEmeraldTrainerCardBadges_Tile[] = INCBIN_U32("graphics/trainer_card/em_badges.4bpp.lz"); +static const u32 sFireRedTrainerCardBadges_Tile[] = INCBIN_U32("graphics/trainer_card/badges.4bpp.lz"); +static const struct BgTemplate sTrainerCardBgTemplates[4] = { { .bg = 0, @@ -227,28 +267,28 @@ static const struct BgTemplate gUnknown_0856FAB4[4] = .paletteMode = 0, .priority = 1, .baseTile = 192 - }, + } }; -static const struct WindowTemplate gUnknown_0856FAC4[] = +static const struct WindowTemplate sTrainerCardWindowTemplates[4] = { { .bg = 1, .tilemapLeft = 2, .tilemapTop = 15, - .width = 27, + .width = 26, .height = 4, .paletteNum = 15, - .baseBlock = 0x253, + .baseBlock = 0x241 }, { .bg = 1, .tilemapLeft = 1, .tilemapTop = 1, - .width = 28, + .width = 27, .height = 18, .paletteNum = 15, - .baseBlock = 0x1, + .baseBlock = 0x1 }, { .bg = 3, @@ -257,49 +297,155 @@ static const struct WindowTemplate gUnknown_0856FAC4[] = .width = 9, .height = 10, .paletteNum = 8, - .baseBlock = 0x150, + .baseBlock = 0x150 }, DUMMY_WIN_TEMPLATE }; -static const u16 *const gEmeraldTrainerCardStarPals[] = +static const u16 *const sEmeraldTrainerCardStarPals[] = { - gEmeraldTrainerCard0Star_Pal, - gEmeraldTrainerCard1Star_Pal, - gEmeraldTrainerCard2Star_Pal, - gEmeraldTrainerCard3Star_Pal, - gEmeraldTrainerCard4Star_Pal, + gEmeraldTrainerCard_Pal, + sEmeraldTrainerCard1Stars_Pals, + sEmeraldTrainerCard2Stars_Pals, + sEmeraldTrainerCard3Stars_Pals, + sEmeraldTrainerCard4Stars_Pals }; -static const u16 *const gFireRedTrainerCardStarPals[] = +static const u16 *const sFireRedTrainerCardStarPals[] = { - gFireRedTrainerCard0Star_Pal, - gFireRedTrainerCard1Star_Pal, - gFireRedTrainerCard2Star_Pal, - gFireRedTrainerCard3Star_Pal, - gFireRedTrainerCard4Star_Pal, + gFireRedTrainerCard_Pal, + sFireRedTrainerCard1Stars_Pals, + sFireRedTrainerCard2Stars_Pals, + sFireRedTrainerCard3Stars_Pals, + sFireRedTrainerCard4Stars_Pals }; -static const u8 gUnknown_0856FB0C[] = {0, 2, 3}; -static const u8 gUnknown_0856FB0F[] = {0, 4, 5}; -static const u8 gUnknown_0856FB12[6] = {0}; +static const u8 sFireRedTrainerCardPage1TextColors[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY}; +static const u8 sTrainerCardPage2TextColors[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_RED, TEXT_COLOR_LIGHT_RED}; +static const u8 sEmeraldTrainerCardPage1TextColors[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_TRANSPARENT, TEXT_COLOR_TRANSPARENT}; +static const u8 sTrainerCardFontIds[] = {0, 2, 0}; +static const u8 sTrainerCardPicPositions[][2][2] = +{ + {{13, 4}, {13, 4}}, + {{1, 0}, {1, 0}} +}; -static const u8 gUnknown_0856FB18[][2][2] = +static const u8 sLinkTrainerCardFrontPics[][2] = { - {{0xD, 4}, {0xD, 4}}, - {{1, 0}, {1, 0}}, + {TRAINER_PIC_RS_MAY_2, TRAINER_PIC_RED}, + {TRAINER_PIC_PROFESSOR_OAK, TRAINER_PIC_RS_BRENDAN_2}, }; -static const u8 gUnknown_0856FB20[][2] = {{0x4E, 0x4F}, {0x50, 0x51}, {0x3C, 0x3F}}; +static const u8 sLinkTrainerCardFacilityClasses[][8] = +{ + {0x74, 0x6F, 0x5C, 0x58, 0x6A, 0x59, 0x6D, 0x6C}, + {0x75, 0x7D, 0x5D, 0x5A, 0x16, 0x30, 0x41, 0x68} +}; -static bool8 (*const gUnknown_0856FB28[])(struct Task *) = +static bool8 (*const sTrainerCardTasks[])(struct Task *) = { - sub_80C4998, - sub_80C49D8, - sub_80C4B08, - sub_80C4C1C, - sub_80C4C84, - sub_80C4DB0, + sub_808B254, + sub_808B294, + sub_808B3C4, + sub_808B4D8, + sub_808B540, + sub_808B66C +}; + +static const u8 sTrainerCardPlayerNameXPositions[] = {0x14, 0x10}; +static const u8 sTrainerCardPlayerNameYPositions[] = {0x1D, 0x21}; +static const u8 sTrainerCardIdXPositions[] = {0x8E, 0x80}; +static const u8 sTrainerCardIdYPositions[] = {0xA, 0x9}; +static const u8 *const sTrainerCardTextColors[] = {sFireRedTrainerCardPage1TextColors, sEmeraldTrainerCardPage1TextColors}; +static const u8 sTrainerCardTimeHoursXPositions[] = {0x65, 0x55}; +static const u8 sTrainerCardTimeHoursYPositions[] = {0x77, 0x67}; +static const u8 sTrainerCardTimeMinutesXPositions[] = {0x7C, 0x6C}; +static const u8 sTrainerCardTimeMinutesYPositions[] = {0x58, 0x59}; +static const u8 sTrainerCardProfilePhraseXPositions[] = {0x73, 0x69}; +static const u8 sTrainerCardProfilePhraseYPositions[] = {0x82, 0x78}; +static const u8 sUnknown_83CD93C[] = {0x8A, 0xD8}; +static const u8 sUnknown_83CD93E[] = {0xB, 0xA}; +static const u8 sTrainerCardHofDebutXPositions[] = {0xA, 0x10, 0x0, 0x0}; +static const u8 *const sLinkTrainerCardRecordStrings[] = {gText_LinkBattles, gText_LinkCableBattles}; +static const u8 sUnknown_83CD94C[] = {5, 6, 7, 8, 9, 10}; +static const u8 sUnknown_83CD952[] = {0, 4, 8, 12, 16, 20}; +static const u8 sUnknown_83CD958[] = {11, 12, 13, 14}; +static const u8 sUnknown_83CD95C[] = {7, 6, 0, 0}; + +static const struct TrainerCard sLinkPlayerTrainerCardTemplate1 = +{ + .gender = MALE, + .stars = 4, + .hasPokedex = TRUE, + .caughtAllHoenn = TRUE, + .hasAllPaintings = TRUE, + .hofDebutHours = 999, + .hofDebutMinutes = 59, + .hofDebutSeconds = 59, + .caughtMonsCount = 200, + .trainerId = 0x6072, + .playTimeHours = 999, + .playTimeMinutes = 59, + .linkBattleWins = 5535, + .linkBattleLosses = 5535, + .battleTowerWins = 5535, + .battleTowerStraightWins = 5535, + .contestsWithFriends = 55555, + .pokeblocksWithFriends = 44444, + .pokemonTrades = 33333, + .money = 999999, + .var_28 = {0, 0, 0, 0}, + .playerName = _("あかみ どりお"), //{0x1, 0x6, 0x20, 0x0, 0x45, 0x28, 0x5, 0xFF}, + .version = VERSION_FIRE_RED, + .var_3A = 0, + .berryCrushPoints = 5555, + .unionRoomNum = 8500, + .berriesPicked = 5456, + .jumpsInRow = 6300, + .var_4C = TRUE, + .hasAllMons = TRUE, + .var_4E = 2, + .var_4F = 0, + .var_50 = {1, 2, 3, 0}, + .monSpecies = {SPECIES_CHARIZARD, SPECIES_DIGLETT, SPECIES_NIDORINA, SPECIES_FEAROW, SPECIES_PARAS, SPECIES_SLOWBRO} +}; + +static const struct TrainerCard sLinkPlayerTrainerCardTemplate2 = +{ + .gender = FEMALE, + .stars = 2, + .hasPokedex = TRUE, + .caughtAllHoenn = TRUE, + .hasAllPaintings = TRUE, + .hofDebutHours = 999, + .hofDebutMinutes = 59, + .hofDebutSeconds = 59, + .caughtMonsCount = 200, + .trainerId = 0x6072, + .playTimeHours = 999, + .playTimeMinutes = 59, + .linkBattleWins = 5535, + .linkBattleLosses = 5535, + .battleTowerWins = 65535, + .battleTowerStraightWins = 65535, + .contestsWithFriends = 55555, + .pokeblocksWithFriends = 44444, + .pokemonTrades = 33333 , + .money = 999999, + .var_28 = {0, 0, 0, 0}, + .playerName = _("るびさふぁこ!"), + .version = 0, + .var_3A = 0, + .berryCrushPoints = 555, + .unionRoomNum = 500, + .berriesPicked = 456, + .jumpsInRow = 300, + .var_4C = TRUE, + .hasAllMons = TRUE, + .var_4E = 2, + .var_4F = 0, + .var_50 = {1, 2, 3, 0}, + .monSpecies = {SPECIES_CHARIZARD, SPECIES_DIGLETT, SPECIES_NIDORINA, SPECIES_FEAROW, SPECIES_PARAS, SPECIES_SLOWBRO} }; // Functions @@ -308,7 +454,7 @@ static void VblankCb_TrainerCard(void) LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); - sub_80C48C8(); + sub_808B180(); if (sTrainerCardDataPtr->allowDMACopy) DmaCopy16(3, &gScanlineEffectRegBuffers[0], &gScanlineEffectRegBuffers[1], 0x140); } @@ -343,40 +489,40 @@ static void CloseTrainerCard(u8 taskId) static void Task_TrainerCard(u8 taskId) { - switch (sTrainerCardDataPtr->var_0) + switch (sTrainerCardDataPtr->taskState) { case 0: if (!IsDma3ManagerBusyWithBgCopy()) { FillWindowPixelBuffer(1, PIXEL_FILL(0)); - sTrainerCardDataPtr->var_0++; + sTrainerCardDataPtr->taskState++; } break; case 1: if (PrintAllOnCardPage1()) - sTrainerCardDataPtr->var_0++; + sTrainerCardDataPtr->taskState++; break; case 2: - sub_80C438C(1); - sTrainerCardDataPtr->var_0++; + PutTrainerCardWindow(1); + sTrainerCardDataPtr->taskState++; break; case 3: FillWindowPixelBuffer(2, PIXEL_FILL(0)); - sub_80C4FF0(); - sub_80C438C(2); - sTrainerCardDataPtr->var_0++; + sub_808B838(); + PutTrainerCardWindow(2); + sTrainerCardDataPtr->taskState++; break; case 4: - sub_80C4550(sTrainerCardDataPtr->var_EF8); - sTrainerCardDataPtr->var_0++; + LoadTrainerCardTilemap2(&sTrainerCardDataPtr->var_E1C); + sTrainerCardDataPtr->taskState++; break; case 5: - sub_80C45C0(sTrainerCardDataPtr->var_598); - sTrainerCardDataPtr->var_0++; + LoadTrainerCardTilemap0(&sTrainerCardDataPtr->var_4BC); + sTrainerCardDataPtr->taskState++; break; case 6: TrainerCard_PrintStarsAndBadgesOnCard(); - sTrainerCardDataPtr->var_0++; + sTrainerCardDataPtr->taskState++; break; case 7: if (gWirelessCommType == 1 && gReceivedRemoteLinkPlayers == TRUE) @@ -384,99 +530,101 @@ static void Task_TrainerCard(u8 taskId) LoadWirelessStatusIndicatorSpriteGfx(); CreateWirelessStatusIndicatorSprite(230, 150); } - BlendPalettes(0xFFFFFFFF, 16, sTrainerCardDataPtr->var_52C); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, sTrainerCardDataPtr->var_52C); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); SetVBlankCallback(VblankCb_TrainerCard); - sTrainerCardDataPtr->var_0++; + sTrainerCardDataPtr->taskState++; break; case 8: if (!UpdatePaletteFade() && !IsDma3ManagerBusyWithBgCopy()) { - PlaySE(SE_RG_CARD3); - sTrainerCardDataPtr->var_0 = 10; + PlaySE(SE_CARD3); + sTrainerCardDataPtr->taskState = 10; } break; case 9: if (!IsSEPlaying()) - sTrainerCardDataPtr->var_0++; + sTrainerCardDataPtr->taskState++; break; case 10: - if (!gReceivedRemoteLinkPlayers && sTrainerCardDataPtr->var_529) + if (!gReceivedRemoteLinkPlayers && sTrainerCardDataPtr->var_7BCE) { PrintTimeOnCard(); - sub_80C438C(1); - sTrainerCardDataPtr->var_529 = 0; + PutTrainerCardWindow(1); + sTrainerCardDataPtr->var_7BCE = 0; } - if (gMain.newKeys & A_BUTTON) + + if (JOY_NEW(A_BUTTON)) { - sub_80C4918(); - PlaySE(SE_RG_CARD1); - sTrainerCardDataPtr->var_0 = 12; + HelpSystem_SetSomeVariable2(11); + sub_808B1D4(); + PlaySE(SE_CARD1); + sTrainerCardDataPtr->taskState = 12; } - else if (gMain.newKeys & B_BUTTON) + else if (JOY_NEW(B_BUTTON)) { if (gReceivedRemoteLinkPlayers && sTrainerCardDataPtr->isLink && InUnionRoom() == TRUE) { - sTrainerCardDataPtr->var_0 = 15; + sTrainerCardDataPtr->taskState = 15; } else { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, sTrainerCardDataPtr->var_52C); - sTrainerCardDataPtr->var_0 = 14; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + sTrainerCardDataPtr->taskState = 14; } } break; case 12: - if (sub_80C4940() && sub_8087598() != TRUE) + if (sub_808B1FC() && sub_8058244() != TRUE) { - PlaySE(SE_RG_CARD3); - sTrainerCardDataPtr->var_0 = 11; + PlaySE(SE_CARD3); + sTrainerCardDataPtr->taskState = 11; } break; case 11: - if (gMain.newKeys & B_BUTTON) + if (JOY_NEW(B_BUTTON)) { if (gReceivedRemoteLinkPlayers && sTrainerCardDataPtr->isLink && InUnionRoom() == TRUE) { - sTrainerCardDataPtr->var_0 = 15; + sTrainerCardDataPtr->taskState = 15; } else if (gReceivedRemoteLinkPlayers) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, sTrainerCardDataPtr->var_52C); - sTrainerCardDataPtr->var_0 = 14; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + sTrainerCardDataPtr->taskState = 14; } else { - sub_80C4918(); - sTrainerCardDataPtr->var_0 = 13; - PlaySE(SE_RG_CARD1); + HelpSystem_SetSomeVariable2(10); + sub_808B1D4(); + sTrainerCardDataPtr->taskState = 13; + PlaySE(SE_CARD1); } } - else if (gMain.newKeys & A_BUTTON) + else if (JOY_NEW(A_BUTTON)) { if (gReceivedRemoteLinkPlayers && sTrainerCardDataPtr->isLink && InUnionRoom() == TRUE) { - sTrainerCardDataPtr->var_0 = 15; + sTrainerCardDataPtr->taskState = 15; } else { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, sTrainerCardDataPtr->var_52C); - sTrainerCardDataPtr->var_0 = 14; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + sTrainerCardDataPtr->taskState = 14; } } break; case 15: - sub_800AC34(); + sub_800AAC0(); DrawDialogueFrame(0, 1); - AddTextPrinterParameterized(0, 1, gText_WaitingTrainerFinishReading, 0, 1, 255, 0); + AddTextPrinterParameterized(0, 2, gText_WaitingTrainerFinishReading, 0, 1, TEXT_SPEED_FF, 0); CopyWindowToVram(0, 3); - sTrainerCardDataPtr->var_0 = 16; + sTrainerCardDataPtr->taskState = 16; break; case 16: if (!gReceivedRemoteLinkPlayers) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, sTrainerCardDataPtr->var_52C); - sTrainerCardDataPtr->var_0 = 14; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + sTrainerCardDataPtr->taskState = 14; } break; case 14: @@ -484,10 +632,10 @@ static void Task_TrainerCard(u8 taskId) CloseTrainerCard(taskId); break; case 13: - if (sub_80C4940() && sub_8087598() != TRUE) + if (sub_808B1FC() && sub_8058244() != TRUE) { - sTrainerCardDataPtr->var_0 = 10; - PlaySE(SE_RG_CARD3); + sTrainerCardDataPtr->taskState = 10; + PlaySE(SE_CARD3); } break; } @@ -498,45 +646,45 @@ static bool8 LoadCardGfx(void) switch (sTrainerCardDataPtr->gfxLoadState) { case 0: - if (sTrainerCardDataPtr->cardType == CARD_TYPE_RS) - LZ77UnCompWram(gUnknown_83CCE30, sTrainerCardDataPtr->unk_E1C); + if (sTrainerCardDataPtr->cardType == CARD_TYPE_EMERALD) + LZ77UnCompWram(sUnknown_83CCE30, &sTrainerCardDataPtr->var_E1C); else - LZ77UnCompWram(gUnknown_83CCEC8, sTrainerCardDataPtr->unk_E1C); + LZ77UnCompWram(sUnknown_83CCEC8, &sTrainerCardDataPtr->var_E1C); break; case 1: - if (sTrainerCardDataPtr->cardType == CARD_TYPE_RS) - LZ77UnCompWram(gUnknown_83CC8A8, sTrainerCardDataPtr->unk_96C); + if (sTrainerCardDataPtr->cardType == CARD_TYPE_EMERALD) + LZ77UnCompWram(sUnknown_83CC8A8, &sTrainerCardDataPtr->var_96C); else - LZ77UnCompWram(gUnknown_83CC984, sTrainerCardDataPtr->unk_96C); + LZ77UnCompWram(sUnknown_83CC984, &sTrainerCardDataPtr->var_96C); break; case 2: if (!sTrainerCardDataPtr->isLink) { - if (sTrainerCardDataPtr->cardType == CARD_TYPE_RS) - LZ77UnCompWram(gUnknown_83CC4DC, sTrainerCardDataPtr->unk_4BC); + if (sTrainerCardDataPtr->cardType == CARD_TYPE_EMERALD) + LZ77UnCompWram(sUnknown_83CC4DC, &sTrainerCardDataPtr->var_4BC); else - LZ77UnCompWram(gUnknown_83CC6F0, sTrainerCardDataPtr->unk_4BC); + LZ77UnCompWram(sUnknown_83CC6F0, &sTrainerCardDataPtr->var_4BC); } else { - if (sTrainerCardDataPtr->cardType == CARD_TYPE_RS) - LZ77UnCompWram(gUnknown_83CCAB0, sTrainerCardDataPtr->unk_4BC); + if (sTrainerCardDataPtr->cardType == CARD_TYPE_EMERALD) + LZ77UnCompWram(sUnknown_83CCAB0, &sTrainerCardDataPtr->var_4BC); else - LZ77UnCompWram(gUnknown_83CCCA4, sTrainerCardDataPtr->unk_4BC); + LZ77UnCompWram(sUnknown_83CCCA4, &sTrainerCardDataPtr->var_4BC); } break; case 3: - LZ77UnCompWram(sTrainerCardBadges_Tile, sTrainerCardDataPtr->var_12CC); - break; + LZ77UnCompWram(sFireRedTrainerCardBadges_Tile, &sTrainerCardDataPtr->cardTiles); + break; case 4: - if (sTrainerCardDataPtr->cardType == CARD_TYPE_RS) - LZ77UnCompWram(gEmeraldTrainerCard_Gfx, sTrainerCardDataPtr->var_18CC); + if (sTrainerCardDataPtr->cardType == CARD_TYPE_EMERALD) + LZ77UnCompWram(gEmeraldTrainerCard_Gfx, &sTrainerCardDataPtr->var_18CC); else - LZ77UnCompWram(gFireRedTrainerCard_Gfx, sTrainerCardDataPtr->var_18CC); + LZ77UnCompWram(gFireRedTrainerCard_Gfx, &sTrainerCardDataPtr->var_18CC); break; case 5: if (sTrainerCardDataPtr->cardType == CARD_TYPE_FRLG) - LZ77UnCompWram(gTrainerCardIcons, sTrainerCardDataPtr->var_16CC); + LZ77UnCompWram(sTrainerCardStickers, &sTrainerCardDataPtr->bgTiles); break; default: sTrainerCardDataPtr->gfxLoadState = 0; @@ -552,51 +700,60 @@ static void CB2_InitTrainerCard(void) { case 0: ResetGpuRegs(); - sub_80C3414(); + sub_8089DA4(); gMain.state++; break; case 1: - DmaClear32(3, (void *)OAM, OAM_SIZE); + TrainerCardNull(); gMain.state++; break; case 2: - if (!sTrainerCardDataPtr->var_52C) - DmaClear16(3, (void *)PLTT, PLTT_SIZE); + sub_8089C5C(); gMain.state++; break; case 3: - ResetSpriteData(); - FreeAllSpritePalettes(); - ResetPaletteFade(); + sub_8089C80(); gMain.state++; + // fallthrough case 4: - InitBgsAndWindows(); + sub_8089CA4(); gMain.state++; break; case 5: - sub_80C41D8(); + ResetTrainerCard(); gMain.state++; break; case 6: - if (LoadCardGfx() == TRUE) - gMain.state++; + LoadStdWindowFrameGfx(); + gMain.state++; break; case 7: - sub_80C4330(); + sub_808AB10(); gMain.state++; break; case 8: - HandleGpuRegs(); - gMain.state++; + if (LoadCardGfx() == TRUE) + gMain.state++; break; case 9: - PrintAllVariableNumsOnCardPage2(); + TrainerCardLoadStickerPals(); gMain.state++; break; case 10: - if (SetCardBgsAndPals() == TRUE) + HandleGpuRegs(); + gMain.state++; + break; + case 11: + sub_8089ECC(); + gMain.state++; + break; + case 12: + if (SetTrainerCardBgsAndPals() == TRUE) gMain.state++; break; + case 13: + gMain.state++; + break; default: SetTrainerCardCb2(); break; @@ -606,47 +763,22 @@ static void CB2_InitTrainerCard(void) static u32 GetCappedGameStat(u8 statId, u32 maxValue) { u32 statValue = GetGameStat(statId); - return min(maxValue, statValue); } -static bool8 HasAllFrontierSymbols(void) -{ - u8 i; - for (i = 0; i < NUM_FRONTIER_FACILITIES; i++) - { - if (!FlagGet(FLAG_SYS_TOWER_SILVER + 2 * i) || !FlagGet(FLAG_SYS_TOWER_GOLD + 2 * i)) - return FALSE; - } - return TRUE; -} - -u32 CountPlayerTrainerStars(void) +static u8 GetTrainerStarCount(struct TrainerCard *trainerCard) { u8 stars = 0; - if (GetGameStat(GAME_STAT_ENTERED_HOF)) - stars++; - if (HasAllHoennMons()) - stars++; - if (CountPlayerContestPaintings() > 4) - stars++; - if (HasAllFrontierSymbols()) - stars++; - - return stars; -} - -static u8 GetRubyTrainerStars(struct TrainerCard *trainerCard) -{ - u8 stars = 0; - - if (trainerCard->hofDebutHours || trainerCard->hofDebutMinutes || trainerCard->hofDebutSeconds) + if (trainerCard->hofDebutHours != 0 || trainerCard->hofDebutMinutes != 0 || trainerCard->hofDebutSeconds != 0) stars++; + if (trainerCard->caughtAllHoenn) stars++; + if (trainerCard->battleTowerStraightWins > 49) stars++; + if (trainerCard->hasAllPaintings) stars++; @@ -657,7 +789,7 @@ static void SetPlayerCardData(struct TrainerCard *trainerCard, u8 cardType) { u32 playTime; u8 i; - + trainerCard->gender = gSaveBlock2Ptr->playerGender; trainerCard->playTimeHours = gSaveBlock2Ptr->playTimeHours; trainerCard->playTimeMinutes = gSaveBlock2Ptr->playTimeMinutes; @@ -684,8 +816,14 @@ static void SetPlayerCardData(struct TrainerCard *trainerCard, u8 cardType) trainerCard->linkBattleWins = GetCappedGameStat(GAME_STAT_LINK_BATTLE_WINS, 9999); trainerCard->linkBattleLosses = GetCappedGameStat(GAME_STAT_LINK_BATTLE_LOSSES, 9999); - trainerCard->pokemonTrades = GetCappedGameStat(GAME_STAT_POKEMON_TRADES, 0xFFFF); + + trainerCard->battleTowerWins = 0; + trainerCard->battleTowerStraightWins = 0; + trainerCard->contestsWithFriends = 0; + trainerCard->pokeblocksWithFriends = 0; + + trainerCard->hasAllPaintings = FALSE; trainerCard->money = GetMoney(&gSaveBlock1Ptr->money); @@ -694,147 +832,139 @@ static void SetPlayerCardData(struct TrainerCard *trainerCard, u8 cardType) StringCopy(trainerCard->playerName, gSaveBlock2Ptr->playerName); - switch (cardType) + if (cardType == CARD_TYPE_FRLG) + { + trainerCard->stars = GetTrainerStarCount(trainerCard); + } + else if (cardType == CARD_TYPE_EMERALD) { - case CARD_TYPE_EMERALD: - trainerCard->battleTowerWins = 0; - trainerCard->battleTowerStraightWins = 0; - // Seems like GF got CARD_TYPE_FRLG and CARD_TYPE_RS wrong. - case CARD_TYPE_FRLG: - trainerCard->contestsWithFriends = GetCappedGameStat(GAME_STAT_WON_LINK_CONTEST, 999); - trainerCard->pokeblocksWithFriends = GetCappedGameStat(GAME_STAT_POKEBLOCKS_WITH_FRIENDS, 0xFFFF); - if (CountPlayerContestPaintings() > 4) - trainerCard->hasAllPaintings = TRUE; - trainerCard->stars = GetRubyTrainerStars(trainerCard); - break; - case CARD_TYPE_RS: - trainerCard->battleTowerWins = 0; - trainerCard->battleTowerStraightWins = 0; - trainerCard->contestsWithFriends = 0; - trainerCard->pokeblocksWithFriends = 0; - trainerCard->hasAllPaintings = 0; trainerCard->stars = 0; - break; + if (trainerCard->hofDebutHours != 0 || (trainerCard->hofDebutMinutes != 0 || trainerCard->hofDebutSeconds != 0)) + trainerCard->stars = cardType; + + if (HasAllKantoMons() != 0) + trainerCard->stars++; + + if (HasAllMons() != 0) + trainerCard->stars++; } } -static void TrainerCard_GenerateCardForLinkPlayer(struct TrainerCard *trainerCard) +void TrainerCard_GenerateCardForLinkPlayer(struct TrainerCard *trainerCard) { - memset(trainerCard, 0, sizeof(struct TrainerCard)); - trainerCard->version = GAME_VERSION; + u8 id = 0; + + trainerCard->version = VERSION_FIRE_RED; SetPlayerCardData(trainerCard, CARD_TYPE_EMERALD); - trainerCard->hasAllSymbols = HasAllFrontierSymbols(); - trainerCard->frontierBP = gSaveBlock2Ptr->frontier.cardBattlePoints; - if (trainerCard->hasAllSymbols) + if (GetCardType() != CARD_TYPE_FRLG) + return; + + trainerCard->stars = id; + if (trainerCard->hofDebutHours != 0 || trainerCard->hofDebutMinutes != 0 || trainerCard->hofDebutSeconds != 0) + trainerCard->stars = 1; + + trainerCard->caughtAllHoenn = HasAllKantoMons(); + trainerCard->hasAllMons = HasAllMons(); + trainerCard->berriesPicked = gSaveBlock2Ptr->berryPick.berriesPicked; + trainerCard->jumpsInRow = gSaveBlock2Ptr->pokeJump.jumpsInRow; + + trainerCard->berryCrushPoints = GetCappedGameStat(GAME_STAT_BERRY_CRUSH_POINTS, 0xFFFF); + trainerCard->unionRoomNum = GetCappedGameStat(GAME_STAT_NUM_UNION_ROOM_BATTLES, 0xFFFF); + trainerCard->var_4C = TRUE; + + if (trainerCard->caughtAllHoenn) trainerCard->stars++; - - if (trainerCard->gender == FEMALE) - trainerCard->var_4F = gLinkPlayerFacilityClasses[(trainerCard->trainerId % 8) + 8]; - else - trainerCard->var_4F = gLinkPlayerFacilityClasses[trainerCard->trainerId % 8]; -} - -void TrainerCard_GenerateCardForPlayer(struct TrainerCard *trainerCard) -{ - memset(trainerCard, 0, 0x60); - trainerCard->version = GAME_VERSION; - SetPlayerCardData(trainerCard, CARD_TYPE_EMERALD); - trainerCard->var_3A = HasAllFrontierSymbols(); - *((u16*)&trainerCard->berryCrushPoints) = gSaveBlock2Ptr->frontier.cardBattlePoints; - if (trainerCard->var_3A) + + if (trainerCard->hasAllMons) trainerCard->stars++; - + + if (trainerCard->berriesPicked >= 200 && trainerCard->jumpsInRow >= 200) + trainerCard->stars++; + + id = ((u16)trainerCard->trainerId) % 8; if (trainerCard->gender == FEMALE) - trainerCard->var_4F = gLinkPlayerFacilityClasses[(trainerCard->trainerId % 8) + 8]; + trainerCard->var_4F = sLinkTrainerCardFacilityClasses[1][id]; else - trainerCard->var_4F = gLinkPlayerFacilityClasses[trainerCard->trainerId % 8]; -} - -void CopyTrainerCardData(struct TrainerCard *dst, u16 *src, u8 gameVersion) -{ - memset(dst, 0, sizeof(struct TrainerCard)); - dst->version = gameVersion; - - switch (VersionToCardType(gameVersion)) - { - case CARD_TYPE_FRLG: - memcpy(dst, src, 0x60); - break; - case CARD_TYPE_RS: - memcpy(dst, src, 0x38); - break; - case CARD_TYPE_EMERALD: - memcpy(dst, src, 0x60); - dst->berryCrushPoints = 0; - dst->hasAllSymbols = src[29]; - dst->frontierBP = src[30]; - break; - } + trainerCard->var_4F = sLinkTrainerCardFacilityClasses[0][id]; + + trainerCard->var_50[0] = VarGet(VAR_HOF_BRAG_STATE); + trainerCard->var_50[1] = VarGet(VAR_EGG_BRAG_STATE); + trainerCard->var_50[2] = VarGet(VAR_LINK_WIN_BRAG_STATE); + + trainerCard->var_4E = VarGet(VAR_TRAINER_CARD_MON_ICON_TINT_IDX); + + trainerCard->monSpecies[0] = MailSpeciesToIconSpecies(VarGet(VAR_TRAINER_CARD_MON_ICON_1)); + trainerCard->monSpecies[1] = MailSpeciesToIconSpecies(VarGet(VAR_TRAINER_CARD_MON_ICON_2)); + trainerCard->monSpecies[2] = MailSpeciesToIconSpecies(VarGet(VAR_TRAINER_CARD_MON_ICON_3)); + trainerCard->monSpecies[3] = MailSpeciesToIconSpecies(VarGet(VAR_TRAINER_CARD_MON_ICON_4)); + trainerCard->monSpecies[4] = MailSpeciesToIconSpecies(VarGet(VAR_TRAINER_CARD_MON_ICON_5)); + trainerCard->monSpecies[5] = MailSpeciesToIconSpecies(VarGet(VAR_TRAINER_CARD_MON_ICON_6)); } static void SetDataFromTrainerCard(void) { - u8 i; u32 badgeFlag; - + u8 i; + sTrainerCardDataPtr->hasPokedex = FALSE; sTrainerCardDataPtr->hasHofResult = FALSE; sTrainerCardDataPtr->hasLinkResults = FALSE; sTrainerCardDataPtr->hasBattleTowerWins = FALSE; - sTrainerCardDataPtr->var_E = 0; - sTrainerCardDataPtr->var_F = 0; + sTrainerCardDataPtr->var_E = FALSE; + sTrainerCardDataPtr->var_F = FALSE; sTrainerCardDataPtr->hasTrades = FALSE; - memset(sTrainerCardDataPtr->badgeCount, 0, sizeof(sTrainerCardDataPtr->badgeCount)); - if (sTrainerCardDataPtr->trainerCard.hasPokedex) + + memset(&sTrainerCardDataPtr->hasBadge, 0, BADGE_COUNT); + if (sTrainerCardDataPtr->trainerCard.hasPokedex != 0) sTrainerCardDataPtr->hasPokedex++; - - if (sTrainerCardDataPtr->trainerCard.hofDebutHours - || sTrainerCardDataPtr->trainerCard.hofDebutMinutes - || sTrainerCardDataPtr->trainerCard.hofDebutSeconds) + + if (sTrainerCardDataPtr->trainerCard.hofDebutHours != 0 + || sTrainerCardDataPtr->trainerCard.hofDebutMinutes != 0 + || sTrainerCardDataPtr->trainerCard.hofDebutSeconds != 0) sTrainerCardDataPtr->hasHofResult++; - - if (sTrainerCardDataPtr->trainerCard.linkBattleWins || sTrainerCardDataPtr->trainerCard.linkBattleLosses) + + if (sTrainerCardDataPtr->trainerCard.linkBattleWins != 0 || sTrainerCardDataPtr->trainerCard.linkBattleLosses != 0) sTrainerCardDataPtr->hasLinkResults++; - if (sTrainerCardDataPtr->trainerCard.pokemonTrades) + + if (sTrainerCardDataPtr->trainerCard.pokemonTrades != 0) sTrainerCardDataPtr->hasTrades++; - if (sTrainerCardDataPtr->trainerCard.battleTowerWins || sTrainerCardDataPtr->trainerCard.battleTowerStraightWins) - sTrainerCardDataPtr->hasBattleTowerWins++; for (i = 0, badgeFlag = FLAG_BADGE01_GET; badgeFlag <= FLAG_BADGE08_GET; badgeFlag++, i++) { if (FlagGet(badgeFlag)) - sTrainerCardDataPtr->badgeCount[i]++; + sTrainerCardDataPtr->hasBadge[i]++; } } static void HandleGpuRegs(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_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON); 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); + SetGpuReg(REG_OFFSET_WIN0V, WININ_WIN0_CLR | WIN_RANGE(0, 0x80)); + SetGpuReg(REG_OFFSET_WIN0H, WININ_WIN0_CLR | WININ_WIN0_OBJ | WIN_RANGE(0, 0xC0)); 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); } -static void sub_80C32EC(u16 arg0) +static void sub_8089BD8(u16 arg0) { s8 quotient = (arg0 + 40) / 10; if (quotient <= 4) quotient = 0; - sTrainerCardDataPtr->var_528 = quotient; - SetGpuReg(REG_OFFSET_BLDY, sTrainerCardDataPtr->var_528); - SetGpuReg(REG_OFFSET_WIN0V, (sTrainerCardDataPtr->var_7CA8 * 256) | (160 - sTrainerCardDataPtr->var_7CA8)); + + sTrainerCardDataPtr->var_456 = quotient; + SetGpuReg(REG_OFFSET_BLDY, sTrainerCardDataPtr->var_456); + SetGpuReg(REG_OFFSET_WIN0V, (sTrainerCardDataPtr->var_7BCC * 256) | (160 - sTrainerCardDataPtr->var_7BCC)); } static void ResetGpuRegs(void) @@ -842,16 +972,44 @@ static void ResetGpuRegs(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); } -static void InitBgsAndWindows(void) +static void TrainerCardNull(void) +{ +} + +static void sub_8089C5C(void) +{ + DmaClear32(3, (void *)OAM, OAM_SIZE); +} + +static void sub_8089C80(void) +{ + DmaClear16(3, (void *)PLTT, PLTT_SIZE); +} + +static void sub_8089CA4(void) +{ + SetGpuReg(REG_OFFSET_BG0CNT, DISPCNT_MODE_0); + SetGpuReg(REG_OFFSET_BG1CNT, DISPCNT_MODE_0); + SetGpuReg(REG_OFFSET_BG2CNT, DISPCNT_MODE_0); + SetGpuReg(REG_OFFSET_BG3CNT, DISPCNT_MODE_0); + SetGpuReg(REG_OFFSET_BG0HOFS, DISPCNT_MODE_0); + SetGpuReg(REG_OFFSET_BG0VOFS, DISPCNT_MODE_0); + SetGpuReg(REG_OFFSET_BG1HOFS, DISPCNT_MODE_0); + SetGpuReg(REG_OFFSET_BG1VOFS, DISPCNT_MODE_0); + SetGpuReg(REG_OFFSET_BG2HOFS, DISPCNT_MODE_0); + SetGpuReg(REG_OFFSET_BG2VOFS, DISPCNT_MODE_0); + SetGpuReg(REG_OFFSET_BG3HOFS, DISPCNT_MODE_0); + SetGpuReg(REG_OFFSET_BG3VOFS, DISPCNT_MODE_0); +} + +static void ResetTrainerCard(void) { + ResetSpriteData(); + ResetPaletteFade(); ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(0, gUnknown_0856FAB4, ARRAY_COUNT(gUnknown_0856FAB4)); + InitBgsFromTemplates(0, sTrainerCardBgTemplates, NELEMS(sTrainerCardBgTemplates)); ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); ChangeBgX(1, 0, 0); @@ -860,22 +1018,22 @@ static void InitBgsAndWindows(void) ChangeBgY(2, 0, 0); ChangeBgX(3, 0, 0); ChangeBgY(3, 0, 0); - InitWindows(gUnknown_0856FAC4); + InitWindows(sTrainerCardWindowTemplates); DeactivateAllTextPrinters(); - sub_81973A4(); } static void SetTrainerCardCb2(void) { SetMainCallback2(CB2_TrainerCard); + HelpSystem_SetSomeVariable2(10); } -static void sub_80C3414(void) +static void sub_8089DA4(void) { ResetTasks(); ScanlineEffect_Stop(); CreateTask(Task_TrainerCard, 0); - sub_80C4EE4(); + sub_808B774(); SetDataFromTrainerCard(); } @@ -908,13 +1066,13 @@ static bool8 PrintAllOnCardPage1(void) sTrainerCardDataPtr->printState++; return FALSE; } - + static bool8 PrintStringsOnCardPage2(void) { switch (sTrainerCardDataPtr->printState) { case 0: - sub_80C3B50(); + sub_808A4FC(); break; case 1: PrintHofDebutStringOnCard(); @@ -927,18 +1085,15 @@ static bool8 PrintStringsOnCardPage2(void) break; case 4: PrintBerryCrushStringOnCard(); - PrintPokeblockStringOnCard(); break; case 5: PrintUnionStringOnCard(); - PrintContestStringOnCard(); break; case 6: TrainerCard_PrintPokemonIconsOnCard(); - PrintBattleFacilityStringOnCard(); break; case 7: - sub_80C42A4(); + sub_808ABE0(); break; default: sTrainerCardDataPtr->printState = 0; @@ -948,7 +1103,7 @@ static bool8 PrintStringsOnCardPage2(void) return FALSE; } -static void PrintAllVariableNumsOnCardPage2(void) +static void sub_8089ECC(void) { PrintNameOnCard2(); PrintHofTimeOnCard(); @@ -956,69 +1111,51 @@ static void PrintAllVariableNumsOnCardPage2(void) PrintTradesNumOnCard(); PrintBerryCrushNumOnCard(); PrintUnionNumOnCard(); - PrintPokeblocksNumOnCard(); - PrintContestNumOnCard(); - PrintBattleFacilityNumsOnCard(); } static void PrintNameOnCard(void) { - u8 buffer[32]; + u8 buffer[2][32]; u8* txtPtr; - txtPtr = StringCopy(buffer, gText_TrainerCardName); + + txtPtr = StringCopy(buffer[0], gText_TrainerCardName); + txtPtr = buffer[1]; StringCopy(txtPtr, sTrainerCardDataPtr->trainerCard.playerName); ConvertInternationalString(txtPtr, sTrainerCardDataPtr->language); - if (sTrainerCardDataPtr->cardType == CARD_TYPE_FRLG) - AddTextPrinterParameterized3(1, 1, 20, 28, gUnknown_0856FB0C, TEXT_SPEED_FF, buffer); - else - AddTextPrinterParameterized3(1, 1, 16, 33, gUnknown_0856FB0C, TEXT_SPEED_FF, buffer); + StringAppend(buffer[0], txtPtr); + AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardPlayerNameXPositions[sTrainerCardDataPtr->cardType], sTrainerCardPlayerNameYPositions[sTrainerCardDataPtr->cardType], sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, buffer[0]); } - + static void PrintIdOnCard(void) { u8 buffer[32]; u8* txtPtr; - s32 xPos; - u32 top; + txtPtr = StringCopy(buffer, gText_TrainerCardIDNo); ConvertIntToDecimalStringN(txtPtr, sTrainerCardDataPtr->trainerCard.trainerId, STR_CONV_MODE_LEADING_ZEROS, 5); - if (sTrainerCardDataPtr->cardType == CARD_TYPE_FRLG) - { - xPos = GetStringCenterAlignXOffset(1, buffer, 80) + 132; - top = 9; - } - else - { - xPos = GetStringCenterAlignXOffset(1, buffer, 96) + 120; - top = 9; - } - - AddTextPrinterParameterized3(1, 1, xPos, top, gUnknown_0856FB0C, TEXT_SPEED_FF, buffer); + AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardIdXPositions[sTrainerCardDataPtr->cardType], sTrainerCardIdYPositions[sTrainerCardDataPtr->cardType], sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, buffer); } static void PrintMoneyOnCard(void) { - s32 xOffset; - u8 top; - - if (!sTrainerCardDataPtr->isHoenn) - AddTextPrinterParameterized3(1, 1, 20, 56, gUnknown_0856FB0C, TEXT_SPEED_FF, gText_TrainerCardMoney); - else - AddTextPrinterParameterized3(1, 1, 16, 57, gUnknown_0856FB0C, TEXT_SPEED_FF, gText_TrainerCardMoney); + u8 buffer[10]; + u8* txtPtr; + u8 x; - ConvertIntToDecimalStringN(gStringVar1, sTrainerCardDataPtr->trainerCard.money, STR_CONV_MODE_LEFT_ALIGN, 6); - StringExpandPlaceholders(gStringVar4, gText_PokedollarVar1); - if (!sTrainerCardDataPtr->isHoenn) + txtPtr = StringCopy(buffer, gText_TrainerCardYen); + ConvertIntToDecimalStringN(txtPtr, sTrainerCardDataPtr->trainerCard.money, STR_CONV_MODE_LEFT_ALIGN, 6); + if (sTrainerCardDataPtr->cardType != CARD_TYPE_EMERALD) { - xOffset = GetStringRightAlignXOffset(1, gStringVar4, 144); - top = 56; + x = -122 - 6 * StringLength(buffer); + AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 20, 56, sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, gText_TrainerCardMoney); + AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], x, 56, sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, buffer); } else { - xOffset = GetStringRightAlignXOffset(1, gStringVar4, 128); - top = 57; - } - AddTextPrinterParameterized3(1, 1, xOffset, top, gUnknown_0856FB0C, TEXT_SPEED_FF, gStringVar4); + x = 118 - 6 * StringLength(buffer); + AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 16, 57, sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, gText_TrainerCardMoney); + AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], x, 57, sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, buffer); + } } static u16 GetCaughtMonsCount(void) @@ -1026,99 +1163,85 @@ static u16 GetCaughtMonsCount(void) if (IsNationalPokedexEnabled()) return GetNationalPokedexCount(FLAG_GET_CAUGHT); else - return GetHoennPokedexCount(FLAG_GET_CAUGHT); + return GetKantoPokedexCount(FLAG_GET_CAUGHT); } static void PrintPokedexOnCard(void) { - s32 xOffset; - u8 top; + u8 buffer[10]; + u8 x; + if (FlagGet(FLAG_SYS_POKEDEX_GET)) { - if (!sTrainerCardDataPtr->isHoenn) - AddTextPrinterParameterized3(1, 1, 20, 72, gUnknown_0856FB0C, TEXT_SPEED_FF, gText_TrainerCardPokedex); - else - AddTextPrinterParameterized3(1, 1, 16, 73, gUnknown_0856FB0C, TEXT_SPEED_FF, gText_TrainerCardPokedex); - StringCopy(ConvertIntToDecimalStringN(gStringVar4, sTrainerCardDataPtr->trainerCard.caughtMonsCount, STR_CONV_MODE_LEFT_ALIGN, 3), gText_EmptyString6); - if (!sTrainerCardDataPtr->isHoenn) + ConvertIntToDecimalStringN(buffer, sTrainerCardDataPtr->trainerCard.caughtMonsCount, 0, 3); + if (sTrainerCardDataPtr->cardType != CARD_TYPE_EMERALD) { - xOffset = GetStringRightAlignXOffset(1, gStringVar4, 144); - top = 72; + x = -120 - 6 * StringLength(buffer); + AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 20, 72, sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, gText_TrainerCardPokedex); + AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], x, 72, sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, buffer); + AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 138, 72, sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, gText_TrainerCardNull); } else { - xOffset = GetStringRightAlignXOffset(1, gStringVar4, 128); - top = 73; + x = 120 - 6 * StringLength(buffer); + AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 16, 73, sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, gText_TrainerCardPokedex); + AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], x, 73, sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, buffer); + AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 138, 73, sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, gText_TrainerCardNull); } - AddTextPrinterParameterized3(1, 1, xOffset, top, gUnknown_0856FB0C, TEXT_SPEED_FF, gStringVar4); } } -static const u8 *const gUnknown_0856FB40[] = {gUnknown_0856FB0C, gUnknown_0856FB12}; - static void PrintTimeOnCard(void) { u16 hours; u16 minutes; - s32 width; - u32 r7, r4, r10; - - if (!sTrainerCardDataPtr->isHoenn) - AddTextPrinterParameterized3(1, 1, 20, 88, gUnknown_0856FB0C, TEXT_SPEED_FF, gText_TrainerCardTime); - else - AddTextPrinterParameterized3(1, 1, 16, 89, gUnknown_0856FB0C, TEXT_SPEED_FF, gText_TrainerCardTime); + u8 buffer[6]; + hours = gSaveBlock2Ptr->playTimeHours; + minutes = gSaveBlock2Ptr->playTimeMinutes; if (sTrainerCardDataPtr->isLink) { hours = sTrainerCardDataPtr->trainerCard.playTimeHours; minutes = sTrainerCardDataPtr->trainerCard.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 (!sTrainerCardDataPtr->isHoenn) - { - r7 = 144; - r4 = 88; - } + + FillWindowPixelRect(1, PIXEL_FILL(0), sTrainerCardTimeHoursXPositions[sTrainerCardDataPtr->cardType], sTrainerCardTimeMinutesYPositions[sTrainerCardDataPtr->cardType], 50, 12); + if (sTrainerCardDataPtr->cardType != CARD_TYPE_EMERALD) + AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 20, 88, sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, gText_TrainerCardTime); else - { - r7 = 128; - r4 = 89; - } - r10 = width + 30; - r7 -= r10; - - FillWindowPixelRect(1, PIXEL_FILL(0), r7, r4, r10, 15); - ConvertIntToDecimalStringN(gStringVar4, hours, STR_CONV_MODE_RIGHT_ALIGN, 3); - AddTextPrinterParameterized3(1, 1, r7, r4, gUnknown_0856FB0C, TEXT_SPEED_FF, gStringVar4); - r7 += 18; - AddTextPrinterParameterized3(1, 1, r7, r4, gUnknown_0856FB40[sTrainerCardDataPtr->var_7], TEXT_SPEED_FF, gText_Colon2); - r7 += width; - ConvertIntToDecimalStringN(gStringVar4, minutes, STR_CONV_MODE_LEADING_ZEROS, 2); - AddTextPrinterParameterized3(1, 1, r7, r4, gUnknown_0856FB0C, TEXT_SPEED_FF, gStringVar4); + AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 16, 89, sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, gText_TrainerCardTime); + + ConvertIntToDecimalStringN(buffer, hours, STR_CONV_MODE_RIGHT_ALIGN, 3); + AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardTimeHoursXPositions[sTrainerCardDataPtr->cardType], + sTrainerCardTimeMinutesYPositions[sTrainerCardDataPtr->cardType], sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, buffer); + AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardTimeHoursYPositions[sTrainerCardDataPtr->cardType], + sTrainerCardTimeMinutesYPositions[sTrainerCardDataPtr->cardType], sTrainerCardTextColors[sTrainerCardDataPtr->var_7], TEXT_SPEED_FF, gText_Colon2); + + ConvertIntToDecimalStringN(buffer, minutes, STR_CONV_MODE_LEADING_ZEROS, 2); + AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardTimeMinutesXPositions[sTrainerCardDataPtr->cardType], sTrainerCardTimeMinutesYPositions[sTrainerCardDataPtr->cardType], sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, buffer); } -static const u8 gUnknown_0856FB48[] = {0x71, 0x68}; -static const u8 gUnknown_0856FB4A[] = {0x81, 0x78}; - static void PrintProfilePhraseOnCard(void) { if (sTrainerCardDataPtr->isLink) { - AddTextPrinterParameterized3(1, 1, 8, gUnknown_0856FB48[sTrainerCardDataPtr->isHoenn], gUnknown_0856FB0C, TEXT_SPEED_FF, sTrainerCardDataPtr->var_19[0]); - AddTextPrinterParameterized3(1, 1, GetStringWidth(1, sTrainerCardDataPtr->var_19[0], 0) + 14, gUnknown_0856FB48[sTrainerCardDataPtr->isHoenn], gUnknown_0856FB0C, TEXT_SPEED_FF, sTrainerCardDataPtr->var_19[1]); - AddTextPrinterParameterized3(1, 1, 8, gUnknown_0856FB4A[sTrainerCardDataPtr->isHoenn], gUnknown_0856FB0C, TEXT_SPEED_FF, sTrainerCardDataPtr->var_19[2]); - AddTextPrinterParameterized3(1, 1, GetStringWidth(1, sTrainerCardDataPtr->var_19[2], 0) + 14, gUnknown_0856FB4A[sTrainerCardDataPtr->isHoenn], gUnknown_0856FB0C, TEXT_SPEED_FF, sTrainerCardDataPtr->var_19[3]); + AddTextPrinterParameterized3(1, 2, 10, sTrainerCardProfilePhraseXPositions[sTrainerCardDataPtr->cardType], + sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->var_19[0]); + + AddTextPrinterParameterized3(1, 2, GetStringWidth(2, sTrainerCardDataPtr->var_19[0], 0) + 16, sTrainerCardProfilePhraseXPositions[sTrainerCardDataPtr->cardType], + sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->var_19[1]); + + AddTextPrinterParameterized3(1, 2, 10, sTrainerCardProfilePhraseYPositions[sTrainerCardDataPtr->cardType], + sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->var_19[2]); + + AddTextPrinterParameterized3(1, 2, GetStringWidth(2, sTrainerCardDataPtr->var_19[2], 0) + 16, sTrainerCardProfilePhraseYPositions[sTrainerCardDataPtr->cardType], + sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->var_19[3]); } } @@ -1126,183 +1249,147 @@ static void PrintNameOnCard2(void) { StringCopy(sTrainerCardDataPtr->var_4D, sTrainerCardDataPtr->trainerCard.playerName); ConvertInternationalString(sTrainerCardDataPtr->var_4D, sTrainerCardDataPtr->language); - if (sTrainerCardDataPtr->cardType != CARD_TYPE_FRLG) + if (sTrainerCardDataPtr->cardType == CARD_TYPE_EMERALD) { - StringCopy(gStringVar1, sTrainerCardDataPtr->var_4D); - StringExpandPlaceholders(sTrainerCardDataPtr->var_4D, gText_Var1sTrainerCard); + StringAppend(sTrainerCardDataPtr->var_4D, gText_Var1sTrainerCard); } } -static void sub_80C3B50(void) +static void sub_808A4FC(void) { - if (!sTrainerCardDataPtr->isHoenn) - AddTextPrinterParameterized3(1, 1, 136, 9, gUnknown_0856FB0C, TEXT_SPEED_FF, sTrainerCardDataPtr->var_4D); + u8 x; + + if (sTrainerCardDataPtr->cardType == CARD_TYPE_FRLG) + { + AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sUnknown_83CD93C[sTrainerCardDataPtr->cardType], + sUnknown_83CD93E[sTrainerCardDataPtr->cardType], sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->var_4D); + } else - AddTextPrinterParameterized3(1, 1, GetStringRightAlignXOffset(1, sTrainerCardDataPtr->var_4D, 216), 9, gUnknown_0856FB0C, TEXT_SPEED_FF, sTrainerCardDataPtr->var_4D); + { + x = sUnknown_83CD93C[sTrainerCardDataPtr->cardType] - GetStringWidth(sTrainerCardFontIds[1], sTrainerCardDataPtr->var_4D, GetFontAttribute(sTrainerCardFontIds[1], FONTATTR_LETTER_SPACING)); + + AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], x, sUnknown_83CD93E[sTrainerCardDataPtr->cardType], + sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->var_4D); + } } -static const u8 gUnknown_0856FB4C[] = {0xfd, 0x02, 0xf0, 0xfd, 0x03, 0xf0, 0xfd, 0x04, 0xff}; - static void PrintHofTimeOnCard(void) { + u8 buffer[10]; + u8* txtPtr; + if (sTrainerCardDataPtr->hasHofResult) { - ConvertIntToDecimalStringN(gStringVar1, sTrainerCardDataPtr->trainerCard.hofDebutHours, STR_CONV_MODE_RIGHT_ALIGN, 3); - ConvertIntToDecimalStringN(gStringVar2, sTrainerCardDataPtr->trainerCard.hofDebutMinutes, STR_CONV_MODE_LEADING_ZEROS, 2); - ConvertIntToDecimalStringN(gStringVar3, sTrainerCardDataPtr->trainerCard.hofDebutSeconds, STR_CONV_MODE_LEADING_ZEROS, 2); - StringExpandPlaceholders(sTrainerCardDataPtr->var_93, gUnknown_0856FB4C); + ConvertIntToDecimalStringN(buffer, sTrainerCardDataPtr->trainerCard.hofDebutHours, STR_CONV_MODE_RIGHT_ALIGN, 3); + txtPtr = StringCopy(sTrainerCardDataPtr->var_93, buffer); + StringAppendN(sTrainerCardDataPtr->var_93, gText_Colon2, 2); + ConvertIntToDecimalStringN(buffer, sTrainerCardDataPtr->trainerCard.hofDebutMinutes, STR_CONV_MODE_LEADING_ZEROS, 2); + StringAppendN(sTrainerCardDataPtr->var_93, buffer, 3); + StringAppendN(sTrainerCardDataPtr->var_93, gText_Colon2, 2); + ConvertIntToDecimalStringN(buffer, sTrainerCardDataPtr->trainerCard.hofDebutSeconds, STR_CONV_MODE_LEADING_ZEROS, 2); + StringAppendN(sTrainerCardDataPtr->var_93, buffer, 3); } } -static const u8 gUnknown_0856FB55[] = {0x08, 0x10}; -static const u8 gUnknown_0856FB57[] = {0xd8, 0xd8}; - -static void PrintString(u8 top, const u8* str1, u8* str2, const u8* color) -{ - AddTextPrinterParameterized3(1, 1, gUnknown_0856FB55[sTrainerCardDataPtr->isHoenn], top * 16 + 33, gUnknown_0856FB0C, TEXT_SPEED_FF, str1); - AddTextPrinterParameterized3(1, 1, GetStringRightAlignXOffset(1, str2, gUnknown_0856FB57[sTrainerCardDataPtr->isHoenn]), top * 16 + 33, color, TEXT_SPEED_FF, str2); -} - static void PrintHofDebutStringOnCard(void) { if (sTrainerCardDataPtr->hasHofResult) - PrintString(0, gText_HallOfFameDebut, sTrainerCardDataPtr->var_93, gUnknown_0856FB0F); + { + AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardHofDebutXPositions[sTrainerCardDataPtr->cardType], 35, sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, gText_HallOfFameDebut); + AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 164, 35, sTrainerCardPage2TextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->var_93); + } } -static const u8 *const gUnknown_0856FB5C[] = {gText_LinkBattles, gText_LinkCableBattles, gText_LinkBattles}; - static void PrintLinkResultsNumsOnCard(void) { + u8 buffer[30]; + if (sTrainerCardDataPtr->hasLinkResults) { - StringCopy(sTrainerCardDataPtr->var_D9, gUnknown_0856FB5C[sTrainerCardDataPtr->cardType]); - ConvertIntToDecimalStringN(sTrainerCardDataPtr->var_165, sTrainerCardDataPtr->trainerCard.linkBattleWins, STR_CONV_MODE_LEFT_ALIGN, 4); - ConvertIntToDecimalStringN(sTrainerCardDataPtr->var_1AB, sTrainerCardDataPtr->trainerCard.linkBattleLosses, STR_CONV_MODE_LEFT_ALIGN, 4); + StringCopy(sTrainerCardDataPtr->var_D9, sLinkTrainerCardRecordStrings[sTrainerCardDataPtr->cardType]); + StringCopy(sTrainerCardDataPtr->var_11F, gText_WinLossRatio); + ConvertIntToDecimalStringN(buffer, sTrainerCardDataPtr->trainerCard.linkBattleWins, STR_CONV_MODE_RIGHT_ALIGN, 4); + StringCopy(sTrainerCardDataPtr->var_165, buffer); + ConvertIntToDecimalStringN(buffer, sTrainerCardDataPtr->trainerCard.linkBattleLosses, STR_CONV_MODE_RIGHT_ALIGN, 4); + StringCopy(sTrainerCardDataPtr->var_1AB, buffer); } } static void PrintWinsLossesStringOnCard(void) -{ +{ if (sTrainerCardDataPtr->hasLinkResults) { - StringCopy(gStringVar1, sTrainerCardDataPtr->var_165); - StringCopy(gStringVar2, sTrainerCardDataPtr->var_1AB); - StringExpandPlaceholders(gStringVar4, gText_WinsLosses); - PrintString(1, sTrainerCardDataPtr->var_D9, gStringVar4, gUnknown_0856FB0C); + AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardHofDebutXPositions[sTrainerCardDataPtr->cardType], 51, + sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->var_D9); + AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 130, 51, sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->var_11F); + AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 144, 51, sTrainerCardPage2TextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->var_165); + AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 192, 51, sTrainerCardPage2TextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->var_1AB); } } static void PrintTradesNumOnCard(void) { if (sTrainerCardDataPtr->hasTrades) + { + StringCopy(sTrainerCardDataPtr->var_1F1, gText_PokemonTrades); ConvertIntToDecimalStringN(sTrainerCardDataPtr->var_237, sTrainerCardDataPtr->trainerCard.pokemonTrades, STR_CONV_MODE_RIGHT_ALIGN, 5); + } } static void PrintTradesStringOnCard(void) { if (sTrainerCardDataPtr->hasTrades) - PrintString(2, gText_PokemonTrades, sTrainerCardDataPtr->var_237, gUnknown_0856FB0F); + { + AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardHofDebutXPositions[sTrainerCardDataPtr->cardType], 67, sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->var_1F1); + AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 186, 67, sTrainerCardPage2TextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->var_237); + } } static void PrintBerryCrushNumOnCard(void) { - if (sTrainerCardDataPtr->cardType == CARD_TYPE_FRLG && sTrainerCardDataPtr->trainerCard.berryCrushPoints) + if (sTrainerCardDataPtr->cardType != CARD_TYPE_EMERALD) + { + StringCopy(sTrainerCardDataPtr->var_27D, gText_BerryCrushes); ConvertIntToDecimalStringN(sTrainerCardDataPtr->var_2C3, sTrainerCardDataPtr->trainerCard.berryCrushPoints, STR_CONV_MODE_RIGHT_ALIGN, 5); + } } static void PrintBerryCrushStringOnCard(void) { - if (sTrainerCardDataPtr->cardType == CARD_TYPE_FRLG && sTrainerCardDataPtr->trainerCard.berryCrushPoints) - PrintString(4, gText_BerryCrush, sTrainerCardDataPtr->var_2C3, gUnknown_0856FB0F); -} - -static void PrintUnionNumOnCard(void) -{ - if (sTrainerCardDataPtr->cardType == CARD_TYPE_FRLG && sTrainerCardDataPtr->trainerCard.unionRoomNum) - ConvertIntToDecimalStringN(sTrainerCardDataPtr->var_34F, sTrainerCardDataPtr->trainerCard.unionRoomNum, STR_CONV_MODE_RIGHT_ALIGN, 5); -} - -static void PrintUnionStringOnCard(void) -{ - if (sTrainerCardDataPtr->cardType == CARD_TYPE_FRLG && sTrainerCardDataPtr->trainerCard.unionRoomNum) - PrintString(3, gText_UnionTradesAndBattles, sTrainerCardDataPtr->var_34F, gUnknown_0856FB0F); -} - -static void PrintPokeblocksNumOnCard(void) -{ - if (sTrainerCardDataPtr->cardType != CARD_TYPE_FRLG && sTrainerCardDataPtr->trainerCard.pokeblocksWithFriends) + if (sTrainerCardDataPtr->cardType != CARD_TYPE_EMERALD && sTrainerCardDataPtr->trainerCard.berryCrushPoints) { - ConvertIntToDecimalStringN(gStringVar1, sTrainerCardDataPtr->trainerCard.pokeblocksWithFriends, STR_CONV_MODE_RIGHT_ALIGN, 5); - StringExpandPlaceholders(sTrainerCardDataPtr->var_395, gText_Var1DarkGreyShadowLightGrey); + AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardHofDebutXPositions[sTrainerCardDataPtr->cardType], 99, sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->var_27D); + AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 186, 99, sTrainerCardPage2TextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->var_2C3); } } -static void PrintPokeblockStringOnCard(void) -{ - if (sTrainerCardDataPtr->cardType != CARD_TYPE_FRLG && sTrainerCardDataPtr->trainerCard.pokeblocksWithFriends) - PrintString(3, gText_PokeblocksWithFriends, sTrainerCardDataPtr->var_395, gUnknown_0856FB0F); -} - -static void PrintContestNumOnCard(void) -{ - if (sTrainerCardDataPtr->cardType != CARD_TYPE_FRLG && sTrainerCardDataPtr->trainerCard.contestsWithFriends) - ConvertIntToDecimalStringN(sTrainerCardDataPtr->var_3DB, sTrainerCardDataPtr->trainerCard.contestsWithFriends, STR_CONV_MODE_RIGHT_ALIGN, 5); -} - -static void PrintContestStringOnCard(void) -{ - if (sTrainerCardDataPtr->cardType != CARD_TYPE_FRLG && sTrainerCardDataPtr->trainerCard.contestsWithFriends) - PrintString(4, gText_WonContestsWFriends, sTrainerCardDataPtr->var_3DB, gUnknown_0856FB0F); -} - -static void PrintBattleFacilityNumsOnCard(void) +static void PrintUnionNumOnCard(void) { - switch (sTrainerCardDataPtr->cardType) + if (sTrainerCardDataPtr->cardType != CARD_TYPE_EMERALD) { - case CARD_TYPE_RS: - if (sTrainerCardDataPtr->hasBattleTowerWins) - { - ConvertIntToDecimalStringN(gStringVar1, sTrainerCardDataPtr->trainerCard.battleTowerWins, STR_CONV_MODE_RIGHT_ALIGN, 4); - ConvertIntToDecimalStringN(gStringVar2, sTrainerCardDataPtr->trainerCard.battleTowerStraightWins, STR_CONV_MODE_RIGHT_ALIGN, 4); - StringExpandPlaceholders(sTrainerCardDataPtr->var_421, gText_WSlashStraightSlash); - } - break; - case CARD_TYPE_EMERALD: - if (sTrainerCardDataPtr->trainerCard.frontierBP) - { - ConvertIntToDecimalStringN(gStringVar1, sTrainerCardDataPtr->trainerCard.frontierBP, STR_CONV_MODE_RIGHT_ALIGN, 5); - StringExpandPlaceholders(sTrainerCardDataPtr->var_421, gText_Var1DarkLightGreyBP); - } - break; - case CARD_TYPE_FRLG: - break; + StringCopy(sTrainerCardDataPtr->var_309, gText_UnionRoomTradesBattles); + ConvertIntToDecimalStringN(sTrainerCardDataPtr->var_34F, sTrainerCardDataPtr->trainerCard.unionRoomNum, STR_CONV_MODE_RIGHT_ALIGN, 5); } } -static void PrintBattleFacilityStringOnCard(void) +static void PrintUnionStringOnCard(void) { - switch (sTrainerCardDataPtr->cardType) + if (sTrainerCardDataPtr->cardType != CARD_TYPE_EMERALD && sTrainerCardDataPtr->trainerCard.unionRoomNum) { - case CARD_TYPE_RS: - if (sTrainerCardDataPtr->hasBattleTowerWins) - PrintString(5, gText_BattleTower, sTrainerCardDataPtr->var_421, gUnknown_0856FB0C); - break; - case CARD_TYPE_EMERALD: - if (sTrainerCardDataPtr->trainerCard.frontierBP) - PrintString(5, gText_BattlePtsWon, sTrainerCardDataPtr->var_421, gUnknown_0856FB0F); - break; - case CARD_TYPE_FRLG: - break; + AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], sTrainerCardHofDebutXPositions[sTrainerCardDataPtr->cardType], 83, sFireRedTrainerCardPage1TextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->var_309); + AddTextPrinterParameterized3(1, sTrainerCardFontIds[1], 186, 83, sTrainerCardPage2TextColors, TEXT_SPEED_FF, sTrainerCardDataPtr->var_34F); } } static void TrainerCard_PrintPokemonIconsOnCard(void) { u8 i; - u8 buffer[] = {0x05, 0x06, 0x07, 0x08, 0x09, 0x0a}; - u8 buffer2[] = {0x00, 0x04, 0x08, 0x0c, 0x10, 0x14}; + u8 buffer[6]; + u8 buffer2[6]; - if (sTrainerCardDataPtr->cardType == CARD_TYPE_FRLG) + memcpy(buffer, sUnknown_83CD94C, 6); + memcpy(buffer2, sUnknown_83CD952, 6); + if (sTrainerCardDataPtr->cardType != CARD_TYPE_EMERALD) { for (i = 0; i < 6; i++) { @@ -1315,39 +1402,40 @@ static void TrainerCard_PrintPokemonIconsOnCard(void) } } -static void sub_80C41D8(void) + +static void sub_808AB10(void) { u8 i; - CpuSet(gMonIconPalettes, sTrainerCardDataPtr->var_468, 0x60); + CpuSet(gMonIconPalettes, sTrainerCardDataPtr->monIconPals, 32 * 3); switch (sTrainerCardDataPtr->trainerCard.var_4E) { case 0: break; case 1: - TintPalette_CustomTone(sTrainerCardDataPtr->var_468, 96, 0, 0, 0); + TintPalette_CustomTone(sTrainerCardDataPtr->monIconPals, 96, 0, 0, 0); break; case 2: - TintPalette_CustomTone(sTrainerCardDataPtr->var_468, 96, 500, 330, 310); + TintPalette_CustomTone(sTrainerCardDataPtr->monIconPals, 96, 500, 330, 310); break; case 3: - TintPalette_SepiaTone(sTrainerCardDataPtr->var_468, 96); + TintPalette_SepiaTone(sTrainerCardDataPtr->monIconPals, 96); break; } - LoadPalette(sTrainerCardDataPtr->var_468, 80, 192); - + + LoadPalette(sTrainerCardDataPtr->monIconPals, 80, 192); for (i = 0; i < 6; i++) { - if (sTrainerCardDataPtr->trainerCard.monSpecies[i]) - LoadBgTiles(3, GetMonIconTiles(sTrainerCardDataPtr->trainerCard.monSpecies[i], 0), 512, 16 * i + 32); + LoadBgTiles(3, GetMonIconTiles(sTrainerCardDataPtr->trainerCard.monSpecies[i], 0), 512, 16 * i + 32); } } -static void sub_80C42A4(void) +static void sub_808ABE0(void) { u8 i; - u8 buffer[4] = {0x0b, 0x0c, 0x0d, 0x0e}; - + u8 buffer[4]; + + memcpy(buffer, sUnknown_83CD958, 4); if (sTrainerCardDataPtr->cardType == CARD_TYPE_FRLG && sTrainerCardDataPtr->trainerCard.var_4C == 1) { for (i = 0; i < 3; i++) @@ -1359,67 +1447,71 @@ static void sub_80C42A4(void) } } -static void sub_80C4330(void) +static void TrainerCardLoadStickerPals(void) { - LoadPalette(gUnknown_0856F54C, 176, 32); - LoadPalette(gUnknown_0856F56C, 192, 32); - LoadPalette(gUnknown_0856F58C, 208, 32); - LoadPalette(gUnknown_0856F5AC, 224, 32); - LoadBgTiles(3, sTrainerCardDataPtr->var_17A8, 1024, 128); + LoadPalette(sTrainerCardStickerPal1, 176, 32); + LoadPalette(sTrainerCardStickerPal2, 192, 32); + LoadPalette(sTrainerCardStickerPal3, 208, 32); + LoadPalette(sTrainerCardStickerPal4, 224, 32); + LoadBgTiles(3, sTrainerCardDataPtr->bgTiles, 1024, 128); } -static void sub_80C438C(u8 windowId) +static void PutTrainerCardWindow(u8 windowId) { PutWindowTilemap(windowId); CopyWindowToVram(windowId, 3); } -static u8 SetCardBgsAndPals(void) +static bool8 SetTrainerCardBgsAndPals(void) { switch (sTrainerCardDataPtr->bgPalLoadState) { case 0: - LoadBgTiles(3, sTrainerCardDataPtr->var_13A8, 1024, 0); + LoadBgTiles(3, sTrainerCardDataPtr->cardTiles, 1024, 0); break; case 1: - LoadBgTiles(0, sTrainerCardDataPtr->var_19A8, 6144, 0); + LoadBgTiles(0, sTrainerCardDataPtr->var_18CC, 6144, 0); break; case 2: - if (sTrainerCardDataPtr->cardType != CARD_TYPE_FRLG) - { - LoadPalette(gEmeraldTrainerCardStarPals[sTrainerCardDataPtr->trainerCard.stars], 0, 96); - LoadPalette(sEmeraldTrainerCardBadges_Pal, 48, 32); - if (sTrainerCardDataPtr->trainerCard.gender) - LoadPalette(sEmeraldTrainerCardFemaleBackground_Pal, 16, 32); - } + if (sTrainerCardDataPtr->cardType == CARD_TYPE_EMERALD) + LoadPalette(sEmeraldTrainerCardStarPals[sTrainerCardDataPtr->trainerCard.stars], 0, 96); else - { - LoadPalette(gFireRedTrainerCardStarPals[sTrainerCardDataPtr->trainerCard.stars], 0, 96); - LoadPalette(sFireRedTrainerCardBadges_Pal, 48, 32); - if (sTrainerCardDataPtr->trainerCard.gender) - LoadPalette(sFireRedTrainerCardFemaleBackground_Pal, 16, 32); - } - LoadPalette(gUnknown_0856F52C, 64, 32); + LoadPalette(sFireRedTrainerCardStarPals[sTrainerCardDataPtr->trainerCard.stars], 0, 96); break; case 3: - SetBgTilemapBuffer(0, sTrainerCardDataPtr->var_3CA8); - SetBgTilemapBuffer(2, sTrainerCardDataPtr->var_5CA8); + if (sTrainerCardDataPtr->cardType == CARD_TYPE_EMERALD) + LoadPalette(sEmeraldTrainerCardBadges_Pal, 48, 32); + else + LoadPalette(sFireRedTrainerCardBadges_Pal, 48, 32); break; case 4: + if (sTrainerCardDataPtr->cardType == CARD_TYPE_EMERALD && sTrainerCardDataPtr->trainerCard.gender != MALE) + LoadPalette(sEmeraldTrainerCardFemaleBackground_Pal, 16, 32); + else if (sTrainerCardDataPtr->trainerCard.gender != MALE) + LoadPalette(sFireRedTrainerCardFemaleBackground_Pal, 16, 32); + break; + case 5: + LoadPalette(sUnknown_83CD300, 64, 32); + break; + case 6: + SetBgTilemapBuffer(0, sTrainerCardDataPtr->bgTilemap0); + SetBgTilemapBuffer(2, sTrainerCardDataPtr->bgTilemap2); + break; + default: 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; + return TRUE; } + sTrainerCardDataPtr->bgPalLoadState++; - return 0; + return FALSE; } -static void sub_80C4550(u16 *ptr) +static void LoadTrainerCardTilemap2(u16* ptr) { s16 i, j; - u16 *dst = sTrainerCardDataPtr->var_5CA8; + u16 *dst = sTrainerCardDataPtr->bgTilemap2; for (i = 0; i < 20; i++) { @@ -1431,13 +1523,14 @@ static void sub_80C4550(u16 *ptr) dst[32 * i + j] = ptr[0]; } } + CopyBgTilemapBufferToVram(2); } -static void sub_80C45C0(u16* ptr) +static void LoadTrainerCardTilemap0(u16* ptr) { s16 i, j; - u16 *dst = sTrainerCardDataPtr->var_3CA8; + u16 *dst = sTrainerCardDataPtr->bgTilemap0; for (i = 0; i < 20; i++) { @@ -1449,49 +1542,51 @@ static void sub_80C45C0(u16* ptr) dst[32 * i + j] = ptr[0]; } } + CopyBgTilemapBufferToVram(0); } -static const u8 gUnknown_0856FB78[] = {7, 7}; - static void TrainerCard_PrintStarsAndBadgesOnCard(void) { s16 i, x; u16 tileNum = 192; u8 palNum = 3; - FillBgTilemapBufferRect(3, 143, 15, gUnknown_0856FB78[sTrainerCardDataPtr->isHoenn], sTrainerCardDataPtr->trainerCard.stars, 1, 4); + FillBgTilemapBufferRect(3, 143, 15, sUnknown_83CD95C[sTrainerCardDataPtr->cardType], sTrainerCardDataPtr->trainerCard.stars, 1, 4); if (!sTrainerCardDataPtr->isLink) { x = 4; - for (i = 0; i < 8; i++, tileNum += 2, x += 3) + for (i = 0; i < BADGE_COUNT; i++, tileNum += 2, x += 3) { - if (sTrainerCardDataPtr->badgeCount[i]) + if (sTrainerCardDataPtr->hasBadge[i]) { - FillBgTilemapBufferRect(3, tileNum, x, 15, 1, 1, palNum); - FillBgTilemapBufferRect(3, tileNum + 1, x + 1, 15, 1, 1, palNum); - FillBgTilemapBufferRect(3, tileNum + 16, x, 16, 1, 1, palNum); - FillBgTilemapBufferRect(3, tileNum + 17, x + 1, 16, 1, 1, palNum); + FillBgTilemapBufferRect(3, tileNum, x, 16, 1, 1, palNum); + FillBgTilemapBufferRect(3, tileNum + 1, x + 1, 16, 1, 1, palNum); + FillBgTilemapBufferRect(3, tileNum + 16, x, 17, 1, 1, palNum); + FillBgTilemapBufferRect(3, tileNum + 17, x + 1, 17, 1, 1, palNum); } } } + CopyBgTilemapBufferToVram(3); } -static void sub_80C474C(void) +static void sub_808B090(void) { - if (sTrainerCardDataPtr->cardType == CARD_TYPE_FRLG) + if (sTrainerCardDataPtr->cardType != CARD_TYPE_EMERALD) { if (sTrainerCardDataPtr->hasTrades) { - FillBgTilemapBufferRect(3, 141, 27, 9, 1, 1, 1); - FillBgTilemapBufferRect(3, 157, 27, 10, 1, 1, 1); + FillBgTilemapBufferRect(3, 141, 26, 9, 1, 1, 1); + FillBgTilemapBufferRect(3, 157, 26, 10, 1, 1, 1); } + if (sTrainerCardDataPtr->trainerCard.berryCrushPoints) { FillBgTilemapBufferRect(3, 141, 21, 13, 1, 1, 1); FillBgTilemapBufferRect(3, 157, 21, 14, 1, 1, 1); } + if (sTrainerCardDataPtr->trainerCard.unionRoomNum) { FillBgTilemapBufferRect(3, 141, 27, 11, 1, 1, 1); @@ -1502,63 +1597,53 @@ static void sub_80C474C(void) { if (sTrainerCardDataPtr->hasTrades) { - FillBgTilemapBufferRect(3, 141, 27, 9, 1, 1, 0); - FillBgTilemapBufferRect(3, 157, 27, 10, 1, 1, 0); - } - if (sTrainerCardDataPtr->trainerCard.contestsWithFriends) - { - FillBgTilemapBufferRect(3, 141, 27, 13, 1, 1, 0); - FillBgTilemapBufferRect(3, 157, 27, 14, 1, 1, 0); - } - if (sTrainerCardDataPtr->hasBattleTowerWins) - { - 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); + FillBgTilemapBufferRect(3, 141, 26, 9, 1, 1, 0); + FillBgTilemapBufferRect(3, 157, 26, 10, 1, 1, 0); } } + CopyBgTilemapBufferToVram(3); } -static void sub_80C48C8(void) +static void sub_808B180(void) { if (++sTrainerCardDataPtr->var_6 > 60) { sTrainerCardDataPtr->var_6 = 0; sTrainerCardDataPtr->var_7 ^= 1; - sTrainerCardDataPtr->var_529 = 1; + sTrainerCardDataPtr->var_7BCE = 1; } } u8 GetTrainerCardStars(u8 cardId) { struct TrainerCard* trainerCards = gTrainerCards; + return trainerCards[cardId].stars; } -static void sub_80C4918(void) +static void sub_808B1D4(void) { - u8 taskId = CreateTask(sub_80C4960, 0); - sub_80C4960(taskId); + u8 taskId = CreateTask(sub_808B21C, 0); + sub_808B21C(taskId); SetHBlankCallback(HblankCb_TrainerCard); } -static bool8 sub_80C4940(void) +static bool8 sub_808B1FC(void) { - if (FindTaskIdByFunc(sub_80C4960) == 0xFF) + if (FindTaskIdByFunc(sub_808B21C) == 0xFF) return TRUE; else return FALSE; } -static void sub_80C4960(u8 taskId) +static void sub_808B21C(u8 taskId) { - while(gUnknown_0856FB28[gTasks[taskId].data[0]](&gTasks[taskId])) + while(sTrainerCardTasks[gTasks[taskId].data[0]](&gTasks[taskId])) ; } -static bool8 sub_80C4998(struct Task* task) +static bool8 sub_808B254(struct Task* task) { u32 i; @@ -1567,12 +1652,15 @@ static bool8 sub_80C4998(struct Task* task) ScanlineEffect_Stop(); ScanlineEffect_Clear(); for (i = 0; i < 160; i++) + { gScanlineEffectRegBuffers[1][i] = 0; + } + task->data[0]++; return FALSE; } -static bool8 sub_80C49D8(struct Task* task) +static bool8 sub_808B294(struct Task* task) { u32 r4, r5, r10, r7, r6, var_24, r9, var; s16 i; @@ -1583,10 +1671,9 @@ static bool8 sub_80C49D8(struct Task* task) else task->data[1] += 7; - sTrainerCardDataPtr->var_7CA8 = task->data[1]; - sub_80C32EC(task->data[1]); - - // ??? + sTrainerCardDataPtr->var_7BCC = task->data[1]; + sub_8089BD8(task->data[1]); + r7 = task->data[1]; r9 = 160 - r7; r4 = r9 - r7; @@ -1599,7 +1686,10 @@ static bool8 sub_80C49D8(struct Task* task) r5 *= 2; for (i = 0; i < r7; i++) + { gScanlineEffectRegBuffers[0][i] = -i; + } + for (; i < (s16)(r9); i++) { var = r6 >> 16; @@ -1607,10 +1697,13 @@ static bool8 sub_80C49D8(struct Task* task) r5 -= r10; gScanlineEffectRegBuffers[0][i] = var; } + var = var_24 >> 16; for (; i < 160; i++) + { gScanlineEffectRegBuffers[0][i] = var; - + } + sTrainerCardDataPtr->allowDMACopy = TRUE; if (task->data[1] >= 77) task->data[0]++; @@ -1618,10 +1711,10 @@ static bool8 sub_80C49D8(struct Task* task) return FALSE; } -static bool8 sub_80C4B08(struct Task* task) +static bool8 sub_808B3C4(struct Task* task) { sTrainerCardDataPtr->allowDMACopy = FALSE; - if (sub_8087598() == TRUE) + if (sub_8058244() == TRUE) return FALSE; do @@ -1630,7 +1723,7 @@ static bool8 sub_80C4B08(struct Task* task) { case 0: FillWindowPixelBuffer(1, PIXEL_FILL(0)); - FillBgTilemapBufferRect_Palette0(3, 0, 0, 0, 0x20, 0x20); + FillBgTilemapBufferRect_Palette0(3, 0, 0, 0, 32, 32); break; case 1: if (!sTrainerCardDataPtr->var_8) @@ -1646,19 +1739,19 @@ static bool8 sub_80C4B08(struct Task* task) break; case 2: if (!sTrainerCardDataPtr->var_8) - sub_80C45C0(sTrainerCardDataPtr->var_A48); + LoadTrainerCardTilemap0(sTrainerCardDataPtr->var_96C); else - sub_80C438C(1); + PutTrainerCardWindow(1); break; case 3: if (!sTrainerCardDataPtr->var_8) - sub_80C474C(); + sub_808B090(); else FillWindowPixelBuffer(2, PIXEL_FILL(0)); break; case 4: if (sTrainerCardDataPtr->var_8) - sub_80C4FF0(); + sub_808B838(); break; default: task->data[0]++; @@ -1672,25 +1765,26 @@ static bool8 sub_80C4B08(struct Task* task) return FALSE; } -static bool8 sub_80C4C1C(struct Task* task) +static bool8 sub_808B4D8(struct Task* task) { sTrainerCardDataPtr->allowDMACopy = FALSE; if (sTrainerCardDataPtr->var_8) { - sub_80C438C(2); - sub_80C4550(sTrainerCardDataPtr->var_EF8); - sub_80C45C0(sTrainerCardDataPtr->var_598); + PutTrainerCardWindow(2); + LoadTrainerCardTilemap2(&sTrainerCardDataPtr->var_E1C); + LoadTrainerCardTilemap0(&sTrainerCardDataPtr->var_4BC); TrainerCard_PrintStarsAndBadgesOnCard(); } - sub_80C438C(1); + + PutTrainerCardWindow(1); sTrainerCardDataPtr->var_8 ^= 1; task->data[0]++; sTrainerCardDataPtr->allowDMACopy = TRUE; - PlaySE(SE_RG_CARD2); + PlaySE(SE_CARD2); return FALSE; } -static bool8 sub_80C4C84(struct Task* task) +static bool8 sub_808B540(struct Task* task) { u32 r4, r5, r10, r7, r6, var_24, r9, var; s16 i; @@ -1701,10 +1795,9 @@ static bool8 sub_80C4C84(struct Task* task) else task->data[1] -= 5; - sTrainerCardDataPtr->var_7CA8 = task->data[1]; - sub_80C32EC(task->data[1]); - - // ??? + sTrainerCardDataPtr->var_7BCC = task->data[1]; + sub_8089BD8(task->data[1]); + r7 = task->data[1]; r9 = 160 - r7; r4 = r9 - r7; @@ -1717,7 +1810,10 @@ static bool8 sub_80C4C84(struct Task* task) r5 /= 2; for (i = 0; i < r7; i++) + { gScanlineEffectRegBuffers[0][i] = -i; + } + for (; i < (s16)(r9); i++) { var = r6 >> 16; @@ -1725,10 +1821,13 @@ static bool8 sub_80C4C84(struct Task* task) r5 += r10; gScanlineEffectRegBuffers[0][i] = var; } + var = var_24 >> 16; for (; i < 160; i++) + { gScanlineEffectRegBuffers[0][i] = var; - + } + sTrainerCardDataPtr->allowDMACopy = TRUE; if (task->data[1] <= 0) task->data[0]++; @@ -1736,12 +1835,12 @@ static bool8 sub_80C4C84(struct Task* task) return FALSE; } -static bool8 sub_80C4DB0(struct Task *task) +static bool8 sub_808B66C(struct Task *task) { ShowBg(1); ShowBg(3); SetHBlankCallback(NULL); - DestroyTask(FindTaskIdByFunc(sub_80C4960)); + DestroyTask(FindTaskIdByFunc(sub_808B21C)); return FALSE; } @@ -1749,16 +1848,11 @@ void ShowPlayerTrainerCard(void (*callback)(void)) { sTrainerCardDataPtr = AllocZeroed(sizeof(*sTrainerCardDataPtr)); sTrainerCardDataPtr->callback2 = callback; - if (callback == CB2_ReshowFrontierPass) - sTrainerCardDataPtr->var_52C = 0x7FFF; - else - sTrainerCardDataPtr->var_52C = 0; - if (InUnionRoom() == TRUE) sTrainerCardDataPtr->isLink = TRUE; else sTrainerCardDataPtr->isLink = FALSE; - + sTrainerCardDataPtr->language = GAME_LANGUAGE; TrainerCard_GenerateCardForLinkPlayer(&sTrainerCardDataPtr->trainerCard); SetMainCallback2(CB2_InitTrainerCard); @@ -1774,79 +1868,91 @@ void ShowTrainerCardInLink(u8 cardId, void (*callback)(void)) SetMainCallback2(CB2_InitTrainerCard); } -static void sub_80C4EE4(void) +static void sub_808B774(void) { u8 i; - sTrainerCardDataPtr->var_0 = 0; + sTrainerCardDataPtr->taskState = 0; sTrainerCardDataPtr->var_6 = gSaveBlock2Ptr->playTimeVBlanks; sTrainerCardDataPtr->var_7 = 0; sTrainerCardDataPtr->var_8 = 0; - sTrainerCardDataPtr->var_528 = 0; - sTrainerCardDataPtr->cardType = GetSetCardType(); + sTrainerCardDataPtr->var_456 = 0; + if (GetCardType() == CARD_TYPE_EMERALD) + sTrainerCardDataPtr->cardType = CARD_TYPE_EMERALD; + else + sTrainerCardDataPtr->cardType = CARD_TYPE_FRLG; + for (i = 0; i < 4; i++) + { CopyEasyChatWord(sTrainerCardDataPtr->var_19[i], sTrainerCardDataPtr->trainerCard.var_28[i]); + } } -static u8 GetSetCardType(void) +static u8 GetCardType(void) { if (sTrainerCardDataPtr == NULL) { if (gGameVersion == VERSION_FIRE_RED || gGameVersion == VERSION_LEAF_GREEN) return CARD_TYPE_FRLG; - else if (gGameVersion == VERSION_EMERALD) - return CARD_TYPE_EMERALD; else - return CARD_TYPE_RS; + return CARD_TYPE_EMERALD; } else { if (sTrainerCardDataPtr->trainerCard.version == VERSION_FIRE_RED || sTrainerCardDataPtr->trainerCard.version == VERSION_LEAF_GREEN) - { - sTrainerCardDataPtr->isHoenn = FALSE; return CARD_TYPE_FRLG; - } - else if (sTrainerCardDataPtr->trainerCard.version == VERSION_EMERALD) - { - sTrainerCardDataPtr->isHoenn = TRUE; + else return CARD_TYPE_EMERALD; + } +} + +static void sub_808B838(void) +{ + u8 val = sLinkTrainerCardFrontPics[sTrainerCardDataPtr->cardType][sTrainerCardDataPtr->trainerCard.gender]; + + if (InUnionRoom() == TRUE && gReceivedRemoteLinkPlayers == 1) + { + val = sTrainerCardDataPtr->trainerCard.var_4F; + sub_810C330(FacilityClassToPicIndex(val), TRUE, sTrainerCardPicPositions[sTrainerCardDataPtr->cardType][sTrainerCardDataPtr->trainerCard.gender][0], + sTrainerCardPicPositions[sTrainerCardDataPtr->cardType][sTrainerCardDataPtr->trainerCard.gender][1], 8, 2); + } + else + { + if (sTrainerCardDataPtr->cardType != CARD_TYPE_FRLG) + { + sub_810C330(FacilityClassToPicIndex(val), TRUE, sTrainerCardPicPositions[sTrainerCardDataPtr->cardType][sTrainerCardDataPtr->trainerCard.gender][0], + sTrainerCardPicPositions[sTrainerCardDataPtr->cardType][sTrainerCardDataPtr->trainerCard.gender][1], 8, 2); } else { - sTrainerCardDataPtr->isHoenn = TRUE; - return CARD_TYPE_RS; + sub_810C330(PlayerGenderToFrontTrainerPicId_Debug(sTrainerCardDataPtr->trainerCard.gender, TRUE), TRUE, + sTrainerCardPicPositions[sTrainerCardDataPtr->cardType][sTrainerCardDataPtr->trainerCard.gender][0], + sTrainerCardPicPositions[sTrainerCardDataPtr->cardType][sTrainerCardDataPtr->trainerCard.gender][1], + 8, 2); } } } -static u8 VersionToCardType(u8 version) +// Unused +static void Unref_InitTrainerCard(void (*callback)(void)) { - if (version == VERSION_FIRE_RED || version == VERSION_LEAF_GREEN) - return CARD_TYPE_FRLG; - else if (version == VERSION_EMERALD) - return CARD_TYPE_EMERALD; - else - return CARD_TYPE_RS; + ShowPlayerTrainerCard(callback); + SetMainCallback2(CB2_InitTrainerCard); } -static void sub_80C4FF0(void) +// Unused +static void Unref_InitTrainerCardLink(void (*callback)(void)) { - if (InUnionRoom() == TRUE && gReceivedRemoteLinkPlayers == 1) - { - sub_818D938(FacilityClassToPicIndex(sTrainerCardDataPtr->trainerCard.var_4F), - TRUE, - gUnknown_0856FB18[sTrainerCardDataPtr->isHoenn][sTrainerCardDataPtr->trainerCard.gender][0], - gUnknown_0856FB18[sTrainerCardDataPtr->isHoenn][sTrainerCardDataPtr->trainerCard.gender][1], - 8, - 2); - } - else - { - sub_818D938(FacilityClassToPicIndex(gUnknown_0856FB20[sTrainerCardDataPtr->cardType][sTrainerCardDataPtr->trainerCard.gender]), - TRUE, - gUnknown_0856FB18[sTrainerCardDataPtr->isHoenn][sTrainerCardDataPtr->trainerCard.gender][0], - gUnknown_0856FB18[sTrainerCardDataPtr->isHoenn][sTrainerCardDataPtr->trainerCard.gender][1], - 8, - 2); - } + memcpy(gTrainerCards, &sLinkPlayerTrainerCardTemplate1, 0x60); + ShowTrainerCardInLink(CARD_TYPE_FRLG, callback); + SetMainCallback2(CB2_InitTrainerCard); +} + +// Unused +static void Unref_InitTrainerCardLink2(void (*callback)(void)) +{ + memcpy(gTrainerCards, &sLinkPlayerTrainerCardTemplate2, 0x60); + ShowTrainerCardInLink(CARD_TYPE_FRLG, callback); + SetMainCallback2(CB2_InitTrainerCard); } + |