From 9fddd04a57680d5ed5bf31f5b56fdb762dd9c588 Mon Sep 17 00:00:00 2001 From: scbroede <32247405+scbroede@users.noreply.github.com> Date: Wed, 30 Jul 2025 00:07:51 -0400 Subject: [PATCH] more trainer card documentation (#647) --- .clang-format | 3 + include/overlay071/ov71_0223B140.h | 10 - include/overlay071/ov71_0223CF0C.h | 13 - include/overlay071/ov71_0223D324.h | 9 - include/overlay071/struct_ov71_0223B620.h | 66 - include/overlay071/struct_ov71_0223C444.h | 12 - include/overlay071/struct_ov71_0223D238.h | 20 - include/overlay071/struct_ov71_0223D324.h | 8 - include/screen_fade.h | 4 +- include/sound.h | 5 + include/sound_playback.h | 3 - include/trainer_card.h | 44 +- include/trainer_card_badge_dirt.h | 8 + include/trainer_card_save_data.h | 17 +- .../trainer_card_badge_chimes.h | 9 + .../trainer_card_display_text.h | 0 .../trainer_card_screen/trainer_card_screen.h | 10 + .../trainer_card_screen_defs.h | 97 ++ .../trainer_card_sprites.h | 17 + include/unk_0203D1B8.h | 2 +- include/unk_0206C2D0.h | 8 - platinum.us/main.lsf | 14 +- platinum.us/sbins_shared.sha1 | 2 +- src/field_comm_manager.c | 2 +- src/meson.build | 10 +- src/overlay005/map_prop.c | 4 +- src/overlay005/ov5_021F134C.c | 2 +- src/overlay006/ov6_02242AF0.c | 2 +- src/overlay008/ov8_02249960.c | 14 +- src/overlay012/battle_anim_system.c | 1 + src/overlay071/ov71_0223B140.c | 1341 ----------------- src/overlay071/ov71_0223CF0C.c | 229 --- src/overlay071/ov71_0223D324.c | 156 -- src/overlay084/ov84_0223B5A0.c | 2 +- src/overlay093/ov93_021D0D80.c | 4 +- src/overlay093/ov93_021D111C.c | 4 +- src/overlay097/main_menu_util.c | 4 +- src/overlay113/ov113_0225E368.c | 2 +- src/overlay117/ov117_02263AF0.c | 2 +- src/pokemon.c | 6 +- src/screen_fade.c | 4 +- src/start_menu.c | 10 +- src/system_vars.c | 2 +- src/trainer_card.c | 87 +- src/trainer_card_badge_dirt.c | 43 + src/trainer_card_save_data.c | 16 +- .../trainer_card_badge_chimes.c | 139 ++ .../trainer_card_display_text.c | 36 +- src/trainer_card_screen/trainer_card_screen.c | 1323 ++++++++++++++++ .../trainer_card_sprites.c | 226 +++ src/unk_0202854C.c | 10 +- src/unk_0203D1B8.c | 20 +- src/unk_020559DC.c | 32 +- src/unk_0205A0D8.c | 2 +- src/unk_0205B33C.c | 2 +- src/unk_0205C980.c | 14 +- src/unk_0206C2D0.c | 47 - src/unk_02073838.c | 4 +- src/unk_0207E0B8.c | 2 +- 59 files changed, 2080 insertions(+), 2105 deletions(-) delete mode 100644 include/overlay071/ov71_0223B140.h delete mode 100644 include/overlay071/ov71_0223CF0C.h delete mode 100644 include/overlay071/ov71_0223D324.h delete mode 100644 include/overlay071/struct_ov71_0223B620.h delete mode 100644 include/overlay071/struct_ov71_0223C444.h delete mode 100644 include/overlay071/struct_ov71_0223D238.h delete mode 100644 include/overlay071/struct_ov71_0223D324.h create mode 100644 include/trainer_card_badge_dirt.h create mode 100644 include/trainer_card_screen/trainer_card_badge_chimes.h rename include/{overlay071 => trainer_card_screen}/trainer_card_display_text.h (100%) create mode 100644 include/trainer_card_screen/trainer_card_screen.h create mode 100644 include/trainer_card_screen/trainer_card_screen_defs.h create mode 100644 include/trainer_card_screen/trainer_card_sprites.h delete mode 100644 include/unk_0206C2D0.h delete mode 100644 src/overlay071/ov71_0223B140.c delete mode 100644 src/overlay071/ov71_0223CF0C.c delete mode 100644 src/overlay071/ov71_0223D324.c create mode 100644 src/trainer_card_badge_dirt.c create mode 100644 src/trainer_card_screen/trainer_card_badge_chimes.c rename src/{overlay071 => trainer_card_screen}/trainer_card_display_text.c (92%) create mode 100644 src/trainer_card_screen/trainer_card_screen.c create mode 100644 src/trainer_card_screen/trainer_card_sprites.c delete mode 100644 src/unk_0206C2D0.c diff --git a/.clang-format b/.clang-format index f05b325905..1d537ae3f8 100644 --- a/.clang-format +++ b/.clang-format @@ -53,6 +53,9 @@ IndentGotoLabels: false IndentPPDirectives: None IndentWidth: 4 +Macros: + - FX32_ONE=0x0000000000001000L + SortIncludes: CaseSensitive IncludeBlocks: Regroup IncludeCategories: diff --git a/include/overlay071/ov71_0223B140.h b/include/overlay071/ov71_0223B140.h deleted file mode 100644 index 6e1cd93fb5..0000000000 --- a/include/overlay071/ov71_0223B140.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef POKEPLATINUM_OV71_0223B140_H -#define POKEPLATINUM_OV71_0223B140_H - -#include "overlay_manager.h" - -int ov71_0223B140(ApplicationManager *appMan, int *param1); -int ov71_0223B388(ApplicationManager *appMan, int *param1); -int ov71_0223B5B8(ApplicationManager *appMan, int *param1); - -#endif // POKEPLATINUM_OV71_0223B140_H diff --git a/include/overlay071/ov71_0223CF0C.h b/include/overlay071/ov71_0223CF0C.h deleted file mode 100644 index 8819053286..0000000000 --- a/include/overlay071/ov71_0223CF0C.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef POKEPLATINUM_OV71_0223CF0C_H -#define POKEPLATINUM_OV71_0223CF0C_H - -#include "overlay071/struct_ov71_0223D238.h" - -#include "narc.h" - -void ov71_0223CF0C(UnkStruct_ov71_0223D238 *param0, NARC *param1); -void ov71_0223D070(UnkStruct_ov71_0223D238 *param0, const u8 *param1); -void ov71_0223D238(UnkStruct_ov71_0223D238 *param0); -void ov71_0223D298(UnkStruct_ov71_0223D238 *param0, const u8 param1, const u8 param2); - -#endif // POKEPLATINUM_OV71_0223CF0C_H diff --git a/include/overlay071/ov71_0223D324.h b/include/overlay071/ov71_0223D324.h deleted file mode 100644 index 3f3b535f2d..0000000000 --- a/include/overlay071/ov71_0223D324.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef POKEPLATINUM_OV71_0223D324_H -#define POKEPLATINUM_OV71_0223D324_H - -#include "overlay071/struct_ov71_0223D324.h" - -void ov71_0223D324(UnkStruct_ov71_0223D324 *param0); -void ov71_0223D338(UnkStruct_ov71_0223D324 *param0, const int param1, const u8 param2); - -#endif // POKEPLATINUM_OV71_0223D324_H diff --git a/include/overlay071/struct_ov71_0223B620.h b/include/overlay071/struct_ov71_0223B620.h deleted file mode 100644 index a8fb1135e7..0000000000 --- a/include/overlay071/struct_ov71_0223B620.h +++ /dev/null @@ -1,66 +0,0 @@ -#ifndef POKEPLATINUM_STRUCT_OV71_0223B620_H -#define POKEPLATINUM_STRUCT_OV71_0223B620_H - -#include - -#include "overlay071/struct_ov71_0223C444.h" -#include "overlay071/struct_ov71_0223D238.h" -#include "overlay071/struct_ov71_0223D324.h" - -#include "bg_window.h" -#include "strbuf.h" -#include "trainer_card.h" - -enum TrainerCardWindows { - TRAINER_CARD_WINDOW_ID, - TRAINER_CARD_WINDOW_NAME, - TRAINER_CARD_WINDOW_MONEY, - TRAINER_CARD_WINDOW_POKEDEX, - TRAINER_CARD_WINDOW_SCORE, - TRAINER_CARD_WINDOW_TIME, - TRAINER_CARD_WINDOW_ADVENTURE_STARTED, - TRAINER_CARD_WINDOW_HOF_DEBUT, - TRAINER_CARD_WINDOW_TIMES_LINKED, - TRAINER_CARD_WINDOW_LINK_BATTLES, - TRAINER_CARD_WINDOW_LINK_TRADES, - TRAINER_CARD_WINDOW_COUNT -}; - -typedef struct { - BgConfig *bgConfig; - Window windows[TRAINER_CARD_WINDOW_COUNT]; - TrainerCard *trainerCard; - u8 unk_B8[12288]; - void *unk_30B8; - NNSG2dCharacterData *unk_30BC; - BOOL unk_30C0; - BOOL unk_30C4; - fx32 unk_30C8; - fx32 unk_30CC; - fx32 unk_30D0; - int unk_30D4; - BOOL unk_30D8; - int unk_30DC; - int unk_30E0; - UnkStruct_ov71_0223D238 unk_30E4; - int unk_3348; - int unk_334C; - BOOL unk_3350; - UnkStruct_ov71_0223D324 unk_3354; - void *unk_335C; - NNSG2dScreenData *unk_3360; - UnkStruct_ov71_0223C444 unk_3364; - Strbuf *unusedStrbuf; - Strbuf *colonStrbuf; - u8 unk_3374[8]; - u8 unk_337C; - u8 unk_337D; - u8 unk_337E; - u8 unk_337F; - u8 unk_3380; - u8 unk_3381; - u8 unk_3382; - u8 unk_3383; -} UnkStruct_ov71_0223B620; - -#endif // POKEPLATINUM_STRUCT_OV71_0223B620_H diff --git a/include/overlay071/struct_ov71_0223C444.h b/include/overlay071/struct_ov71_0223C444.h deleted file mode 100644 index c9847e5e14..0000000000 --- a/include/overlay071/struct_ov71_0223C444.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef POKEPLATINUM_STRUCT_OV71_0223C444_H -#define POKEPLATINUM_STRUCT_OV71_0223C444_H - -typedef struct { - s8 unk_00; - s8 unk_01; - s8 unk_02; - s8 unk_03; - u8 unk_04; -} UnkStruct_ov71_0223C444; - -#endif // POKEPLATINUM_STRUCT_OV71_0223C444_H diff --git a/include/overlay071/struct_ov71_0223D238.h b/include/overlay071/struct_ov71_0223D238.h deleted file mode 100644 index 6a148db1f4..0000000000 --- a/include/overlay071/struct_ov71_0223D238.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef POKEPLATINUM_STRUCT_OV71_0223D238_H -#define POKEPLATINUM_STRUCT_OV71_0223D238_H - -#include - -#include "sprite.h" -#include "sprite_resource.h" -#include "sprite_util.h" - -typedef struct { - SpriteList *unk_00; - G2dRenderer unk_04; - SpriteResourceCollection *unk_190[4]; - SpriteResource *unk_1A0[2][4]; - Sprite *unk_1C0[25]; - void *unk_224[8]; - NNSG2dPaletteData *unk_244[8]; -} UnkStruct_ov71_0223D238; - -#endif // POKEPLATINUM_STRUCT_OV71_0223D238_H diff --git a/include/overlay071/struct_ov71_0223D324.h b/include/overlay071/struct_ov71_0223D324.h deleted file mode 100644 index 1627c86455..0000000000 --- a/include/overlay071/struct_ov71_0223D324.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef POKEPLATINUM_STRUCT_OV71_0223D324_H -#define POKEPLATINUM_STRUCT_OV71_0223D324_H - -typedef struct { - u8 unk_00[4][2]; -} UnkStruct_ov71_0223D324; - -#endif // POKEPLATINUM_STRUCT_OV71_0223D324_H diff --git a/include/screen_fade.h b/include/screen_fade.h index 03607e2360..0d8a039f07 100644 --- a/include/screen_fade.h +++ b/include/screen_fade.h @@ -29,8 +29,8 @@ enum FadeType { FADE_TYPE_BRIGHTNESS_OUT = 0, FADE_TYPE_BRIGHTNESS_IN, FADE_TYPE_UNK_2, - FADE_TYPE_UNK_3, - FADE_TYPE_UNK_4, + FADE_TYPE_DOWNWARD_IN, + FADE_TYPE_UPWARD_OUT, FADE_TYPE_UNK_5, FADE_TYPE_UNK_6, FADE_TYPE_UNK_7, diff --git a/include/sound.h b/include/sound.h index d4d46eeb6b..d998592ff4 100644 --- a/include/sound.h +++ b/include/sound.h @@ -29,6 +29,11 @@ #define WAVE_OUT_PAN_CENTER 64 #define WAVE_OUT_PAN_RIGHT 127 +#define SOUND_PLAYBACK_TRACK(TRACK) (1 << (TRACK)) +#define SOUND_PLAYBACK_TRACK_ALL 0xFFFF + +#define NUM_SE_PLAYERS PLAYER_SE_4 - PLAYER_SE_1 + 1 + enum SoundScene { SOUND_SCENE_NONE = 0, SOUND_SCENE_TITLE_SCREEN, diff --git a/include/sound_playback.h b/include/sound_playback.h index 87955bdc38..b7f6408b75 100644 --- a/include/sound_playback.h +++ b/include/sound_playback.h @@ -6,9 +6,6 @@ #include "sound_system.h" -#define SOUND_PLAYBACK_TRACK(TRACK) (1 << (TRACK)) -#define SOUND_PLAYBACK_TRACK_ALL 0xFFFF - enum BGMFadeInType { BGM_FADE_IN_TYPE_FROM_ZERO = 0, // Fade in from volume 0 BGM_FADE_IN_TYPE_FROM_CURRENT = 1, // Fade in from the current volume diff --git a/include/trainer_card.h b/include/trainer_card.h index b71d955b02..0d3baae7de 100644 --- a/include/trainer_card.h +++ b/include/trainer_card.h @@ -5,25 +5,34 @@ #include "field/field_system_decl.h" +#include "badges.h" #include "play_time.h" -typedef struct { - int unk_00_0 : 1; - int unk_00_1 : 31; -} TrainerCard_sub1; +#define SIGNATURE_WIDTH 24 +#define SIGNATURE_HEIGHT 8 + +#define BADGE_POLISH_THRESHOLD_DIRTY 100 +#define BADGE_POLISH_THRESHOLD_NORMAL 140 +#define BADGE_POLISH_THRESHOLD_2_SPARKLES 170 +#define BADGE_POLISH_THRESHOLD_4_SPARKLES 190 +#define MAX_BADGE_POLISH 199 + +typedef struct TrainerCardBadge { + int obtained : 1; + int polish : 31; +} TrainerCardBadge; typedef struct TrainerCard { u8 gameVersion; u8 regionCode; - u8 unk_02; + u8 gymLeadersToHide_Unused; u8 stars; - u8 unk_04_0 : 1; - u8 unk_04_1 : 1; + u8 badgesInteractable : 1; + u8 liveTimeDisplay : 1; u8 gender : 1; u8 pokedexObtained : 1; - u8 padding_04_4 : 4; - u8 unk_05; - u8 padding_06[2]; + u8 trainerAppearance; + u8 padding[2]; u16 name[TRAINER_NAME_LEN + 1]; const PlayTime *playTime; u32 money; @@ -40,22 +49,21 @@ typedef struct TrainerCard { u8 hofDebutMonth; u8 hofDebutDay; u8 hofDebutMinute; - u8 padding_36[2]; u32 timesLinked; u32 linkBattleWins; u32 linkBattleLosses; u32 linkTrades; - TrainerCard_sub1 unk_48[8]; - u8 signature[1536]; - u16 checksum; + TrainerCardBadge badges[MAX_BADGES]; + u8 signature[SIGNATURE_WIDTH * SIGNATURE_HEIGHT * 8]; + u16 checksum; // calculated but never used for anything u16 unk_66A; } TrainerCard; -void TrainerCard_Init(const u8 param0, const u8 param1, const u8 param2, const u8 param3, FieldSystem *fieldSystem, TrainerCard *trainerCard); -TrainerCard *TrainerCard_New(const u16 headID); +void TrainerCard_Init(u8 param0, u8 param1, u8 gymLeadersToHide, u8 trainerAppearance, FieldSystem *fieldSystem, TrainerCard *trainerCard); +TrainerCard *TrainerCard_New(u16 heapID); void TrainerCard_Free(TrainerCard *trainerCard); u8 TrainerCard_CalculateStars(FieldSystem *fieldSystem); -void sub_020721D4(FieldSystem *fieldSystem, const TrainerCard *trainerCard); +void TrainerCard_SaveBadgePolish(FieldSystem *fieldSystem, const TrainerCard *trainerCard); void sub_02072204(FieldSystem *fieldSystem); -#endif // POKEPLATINUM_trainer_card_H +#endif // POKEPLATINUM_TRAINER_CARD_H diff --git a/include/trainer_card_badge_dirt.h b/include/trainer_card_badge_dirt.h new file mode 100644 index 0000000000..6b3783eae9 --- /dev/null +++ b/include/trainer_card_badge_dirt.h @@ -0,0 +1,8 @@ +#ifndef POKEPLATINUM_TRAINER_CARD_BADGE_DIRT_H +#define POKEPLATINUM_TRAINER_CARD_BADGE_DIRT_H + +#include "savedata.h" + +void TrainerCard_AccumulateBadgeDirt(SaveData *saveData, s32 daysPassed); + +#endif // POKEPLATINUM_TRAINER_CARD_BADGE_DIRT_H diff --git a/include/trainer_card_save_data.h b/include/trainer_card_save_data.h index 67110202f9..66e423dc29 100644 --- a/include/trainer_card_save_data.h +++ b/include/trainer_card_save_data.h @@ -3,22 +3,23 @@ #include "badges.h" #include "savedata.h" +#include "trainer_card.h" -typedef struct TrainerCardBadge { - int cleanliness; -} TrainerCardBadge; +typedef struct TrainerCardSaveDataBadge { + int polish; +} TrainerCardSaveDataBadge; typedef struct TrainerCardSaveData { - TrainerCardBadge badges[MAX_BADGES]; - u8 signature[1536]; + TrainerCardSaveDataBadge badges[MAX_BADGES]; + u8 signature[SIGNATURE_WIDTH * SIGNATURE_HEIGHT * 8]; } TrainerCardSaveData; int TrainerCardSaveData_Size(void); void TrainerCardSaveData_Init(TrainerCardSaveData *tcSaveData); TrainerCardSaveData *SaveData_GetTrainerCardSaveData(SaveData *saveData); u8 *TrainerCardSaveData_GetSignature(TrainerCardSaveData *tcSaveData); -TrainerCardBadge *TrainerCardSaveData_GetTrainerCardBadges(TrainerCardSaveData *tcSaveData); -int TrainerCardBadge_GetCleanliness(const u8 badgeID, TrainerCardBadge *badges); -void TrainerCardBadge_SetCleanliness(const u8 badgeID, const int cleanliness, TrainerCardBadge *badges); +TrainerCardSaveDataBadge *TrainerCardSaveData_GetTrainerCardSaveDataBadges(TrainerCardSaveData *tcSaveData); +int TrainerCardSaveDataBadge_GetPolish(u8 badgeID, TrainerCardSaveDataBadge *badges); +void TrainerCardSaveDataBadge_SetPolish(u8 badgeID, int polish, TrainerCardSaveDataBadge *badges); #endif // POKEPLATINUM_TRAINERCARD_SAVEDATA_H diff --git a/include/trainer_card_screen/trainer_card_badge_chimes.h b/include/trainer_card_screen/trainer_card_badge_chimes.h new file mode 100644 index 0000000000..af44690954 --- /dev/null +++ b/include/trainer_card_screen/trainer_card_badge_chimes.h @@ -0,0 +1,9 @@ +#ifndef POKEPLATINUM_TRAINERCARD_BADGE_CHIMES_H +#define POKEPLATINUM_TRAINERCARD_BADGE_CHIMES_H + +#include "trainer_card_screen/trainer_card_screen_defs.h" + +void TrainerCard_InitBadgeChimeState(TrainerCardBadgeChimeState *badgeChimeState); +void TrainerCard_PlayBadgeChime(TrainerCardBadgeChimeState *badgeChimeState, int badgeID, u8 polishLevel); + +#endif // POKEPLATINUM_TRAINERCARD_BADGE_CHIMES_H diff --git a/include/overlay071/trainer_card_display_text.h b/include/trainer_card_screen/trainer_card_display_text.h similarity index 100% rename from include/overlay071/trainer_card_display_text.h rename to include/trainer_card_screen/trainer_card_display_text.h diff --git a/include/trainer_card_screen/trainer_card_screen.h b/include/trainer_card_screen/trainer_card_screen.h new file mode 100644 index 0000000000..a3a6896777 --- /dev/null +++ b/include/trainer_card_screen/trainer_card_screen.h @@ -0,0 +1,10 @@ +#ifndef POKEPLATINUM_TRAINERCARD_SCREEN_H +#define POKEPLATINUM_TRAINERCARD_SCREEN_H + +#include "overlay_manager.h" + +BOOL TrainerCardScreen_Init(ApplicationManager *appMan, int *state); +BOOL TrainerCardScreen_Main(ApplicationManager *appMan, int *state); +BOOL TrainerCardScreen_Exit(ApplicationManager *appMan, int *state); + +#endif // POKEPLATINUM_TRAINERCARD_SCREEN_H diff --git a/include/trainer_card_screen/trainer_card_screen_defs.h b/include/trainer_card_screen/trainer_card_screen_defs.h new file mode 100644 index 0000000000..f55eabec4e --- /dev/null +++ b/include/trainer_card_screen/trainer_card_screen_defs.h @@ -0,0 +1,97 @@ +#ifndef POKEPLATINUM_STRUCT_TRAINERCARD_SCREEN_H +#define POKEPLATINUM_STRUCT_TRAINERCARD_SCREEN_H + +#include + +#include "badges.h" +#include "bg_window.h" +#include "sound.h" +#include "sprite.h" +#include "sprite_resource.h" +#include "sprite_util.h" +#include "strbuf.h" +#include "trainer_card.h" + +enum TrainerCardWindows { + TRAINER_CARD_WINDOW_ID, + TRAINER_CARD_WINDOW_NAME, + TRAINER_CARD_WINDOW_MONEY, + TRAINER_CARD_WINDOW_POKEDEX, + TRAINER_CARD_WINDOW_SCORE, + TRAINER_CARD_WINDOW_TIME, + TRAINER_CARD_WINDOW_ADVENTURE_STARTED, + TRAINER_CARD_WINDOW_HOF_DEBUT, + TRAINER_CARD_WINDOW_TIMES_LINKED, + TRAINER_CARD_WINDOW_LINK_BATTLES, + TRAINER_CARD_WINDOW_LINK_TRADES, + TRAINER_CARD_WINDOW_COUNT +}; + +enum BadgePolishLevels { + BADGE_POLISH_LEVEL_FILTHY, + BADGE_POLISH_LEVEL_DIRTY, + BADGE_POLISH_LEVEL_NORMAL, + BADGE_POLISH_LEVEL_2_SPARKLES, + BADGE_POLISH_LEVEL_4_SPARKLES, + BADGE_POLISH_LEVEL_COUNT +}; + +typedef struct BadgePolishingState { + s8 previousXDirection; + s8 previousYDirection; + s8 currentXDirection; + s8 currentYDirection; + u8 soundEffectIndex; +} BadgePolishingState; + +typedef struct TrainerCardBadgeChimeState { + u8 badgeChimePlayers[NUM_SE_PLAYERS][2]; +} TrainerCardBadgeChimeState; + +typedef struct TrainerCardSpriteData { + SpriteList *spriteList; + G2dRenderer g2dRenderer; + SpriteResourceCollection *spriteResourceCollection[4]; + SpriteResource *spriteResources[2][4]; + Sprite *sprites[MAX_BADGES * 3 + 1]; + void *badgePaletteBuffers[MAX_BADGES]; + NNSG2dPaletteData *badgePalettes[MAX_BADGES]; +} TrainerCardSpriteData; + +typedef struct TrainerCardScreen { + BgConfig *bgConfig; + Window windows[TRAINER_CARD_WINDOW_COUNT]; + TrainerCard *trainerCard; + u8 signature[SIGNATURE_WIDTH * SIGNATURE_HEIGHT * TILE_SIZE_8BPP]; + void *trainerSprite; + NNSG2dCharacterData *trainerCharacterData; + BOOL viewingBack; + BOOL polishingEnabled; + fx32 cardXScale; + fx32 cardYScale; + fx32 badgeCaseCoverYScale; + int touchedRectangleIndex; + BOOL badgeCaseCoverMoving; + int lastTouchedX; + int lastTouchedY; + TrainerCardSpriteData spriteData; + int cardScalingSpeed; + int unused; + BOOL badgeCaseButtonPushed; + TrainerCardBadgeChimeState badgeChimeState; + void *trainerScreenDataNSCRBuffer; + NNSG2dScreenData *trainerScreenData; + BadgePolishingState badgePolishingState; + Strbuf *unusedStrbuf; + Strbuf *colonStrbuf; + u8 polishingProgress[MAX_BADGES]; + u8 badgeCaseOpenState; + u8 badgeCaseTransitionIndex; + u8 subState; + u8 badgeCaseButtonAnimTimer; + u8 badgeCaseButtonAnimIndex; + u8 badgeCaseButtonState; + u8 timer; +} TrainerCardScreen; + +#endif // POKEPLATINUM_STRUCT_TRAINERCARD_SCREEN_H diff --git a/include/trainer_card_screen/trainer_card_sprites.h b/include/trainer_card_screen/trainer_card_sprites.h new file mode 100644 index 0000000000..f4978816b9 --- /dev/null +++ b/include/trainer_card_screen/trainer_card_sprites.h @@ -0,0 +1,17 @@ +#ifndef POKEPLATINUM_TRAINERCARD_SPRITES_H +#define POKEPLATINUM_TRAINERCARD_SPRITES_H + +#include "trainer_card_screen/trainer_card_screen_defs.h" + +#include "narc.h" + +#define TRAINER_CARD_TWO_SPARKLES_SPRITES_INDEX 8 +#define TRAINER_CARD_FOUR_SPARKLES_SPRITES_INDEX 16 +#define TRAINER_CARD_BADGE_CASE_BUTTON_EFFECT_SPRITE_INDEX 24 + +void TrainerCard_InitSpriteData(TrainerCardSpriteData *spriteData, NARC *narc); +void TrainerCard_DrawBadgeCaseSprites(TrainerCardSpriteData *spriteData, u8 *badgesObtained); +void TrainerCard_FreeSprites(TrainerCardSpriteData *spriteData); +void TrainerCard_DrawBadgeDirt(TrainerCardSpriteData *spriteData, u8 badgeID, u8 dirtLevel); + +#endif // POKEPLATINUM_TRAINERCARD_SPRITES_H diff --git a/include/unk_0203D1B8.h b/include/unk_0203D1B8.h index 7b70e2f86a..81fc05c72b 100644 --- a/include/unk_0203D1B8.h +++ b/include/unk_0203D1B8.h @@ -68,7 +68,7 @@ void *sub_0203DE34(FieldSystem *fieldSystem); void sub_0203DE78(FieldSystem *fieldSystem, SaveData *saveData); void sub_0203DE88(FieldSystem *fieldSystem, SaveData *saveData); void sub_0203DFE8(FieldTask *param0, int param1, int param2, int param3, int param4, const u16 *param5, u16 *param6); -void sub_0203E09C(FieldSystem *fieldSystem, TrainerCard *param1); +void FieldSystem_OpenTrainerCardScreen(FieldSystem *fieldSystem, TrainerCard *param1); BOOL sub_0203E0AC(FieldSystem *fieldSystem, void *param1); void FieldSystem_LaunchChooseStarterApp(FieldSystem *fieldSystem, ChooseStarterData *param1); void sub_0203E0D0(FieldSystem *fieldSystem); diff --git a/include/unk_0206C2D0.h b/include/unk_0206C2D0.h deleted file mode 100644 index a2010fab0b..0000000000 --- a/include/unk_0206C2D0.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef POKEPLATINUM_UNK_0206C2D0_H -#define POKEPLATINUM_UNK_0206C2D0_H - -#include "savedata.h" - -void sub_0206C2D0(SaveData *saveData, const s32 param1); - -#endif // POKEPLATINUM_UNK_0206C2D0_H diff --git a/platinum.us/main.lsf b/platinum.us/main.lsf index ddd2fb86c4..3cbd6cb2cd 100644 --- a/platinum.us/main.lsf +++ b/platinum.us/main.lsf @@ -269,7 +269,7 @@ Static main Object main.nef.p/src_unk_0206B70C.c.o Object main.nef.p/src_unk_0206B9D8.c.o Object main.nef.p/src_great_marsh_lookout.c.o - Object main.nef.p/src_unk_0206C2D0.c.o + Object main.nef.p/src_trainer_card_badge_dirt.c.o Object main.nef.p/src_roaming_pokemon.c.o Object main.nef.p/src_unk_0206C660.c.o Object main.nef.p/src_unk_0206C784.c.o @@ -1244,18 +1244,18 @@ Overlay overlay70 Object main.nef.p/src_overlay070_ov70_0226CE54.c.o } -Overlay overlay71 +Overlay trainer_card_screen { After overlay12 - Object main.nef.p/src_overlay071_ov71_0223B140.c.o - Object main.nef.p/src_overlay071_trainer_card_display_text.c.o - Object main.nef.p/src_overlay071_ov71_0223CF0C.c.o - Object main.nef.p/src_overlay071_ov71_0223D324.c.o + Object main.nef.p/src_trainer_card_screen_trainer_card_screen.c.o + Object main.nef.p/src_trainer_card_screen_trainer_card_display_text.c.o + Object main.nef.p/src_trainer_card_screen_trainer_card_sprites.c.o + Object main.nef.p/src_trainer_card_screen_trainer_card_badge_chimes.c.o } Overlay overlay72 { - After overlay71 + After trainer_card_screen Object main.nef.p/src_overlay072_ov72_0223D7A0.c.o } diff --git a/platinum.us/sbins_shared.sha1 b/platinum.us/sbins_shared.sha1 index 78196f4ab3..13ee72418e 100644 --- a/platinum.us/sbins_shared.sha1 +++ b/platinum.us/sbins_shared.sha1 @@ -70,7 +70,7 @@ d2a6ce95570f7eddb8cbfbe0fd8317d54c48cb1d *overlay64.sbin 6c90858a9f97833957e94da68513a90b7ea16dfa *overlay68.sbin c655f6874e4e9897f3f0782af1140cedd97154da *overlay69.sbin b80c7e652b63a37f2a30b9c0f14d6e5608185d05 *overlay70.sbin -cf86b18a15a2b011fd0e7c98379a9fa228c3fc4c *overlay71.sbin +cf86b18a15a2b011fd0e7c98379a9fa228c3fc4c *trainer_card_screen.sbin 39a79a31811cac6b1a90206e67624c0a3179bd46 *overlay72.sbin deecf01a5608b25883804ef30c9d4c3d0c904ee5 *rowan_intro.sbin 21e3d2a2fb36d739f4fd16792719bf6fa7b7e6aa *options_menu.sbin diff --git a/src/field_comm_manager.c b/src/field_comm_manager.c index d009e76cbb..7c849549c6 100644 --- a/src/field_comm_manager.c +++ b/src/field_comm_manager.c @@ -180,7 +180,7 @@ void FieldCommMan_EnterBattleRoom(FieldSystem *fieldSystem) } } - TrainerCard_Init(0, 0, 0, 0xff, sFieldCommMan->fieldSystem, sFieldCommMan->trainerCard[netId]); + TrainerCard_Init(FALSE, FALSE, 0, 0xFF, sFieldCommMan->fieldSystem, sFieldCommMan->trainerCard[netId]); } CommTiming_StartSync(95); diff --git a/src/meson.build b/src/meson.build index b396fcbd88..febbc5872a 100644 --- a/src/meson.build +++ b/src/meson.build @@ -255,7 +255,7 @@ pokeplatinum_c = files( 'unk_0206B70C.c', 'unk_0206B9D8.c', 'great_marsh_lookout.c', - 'unk_0206C2D0.c', + 'trainer_card_badge_dirt.c', 'roaming_pokemon.c', 'unk_0206C660.c', 'unk_0206C784.c', @@ -797,10 +797,10 @@ pokeplatinum_c = files( 'overlay070/ov70_0226C8B4.c', 'overlay070/ov70_0226CC74.c', 'overlay070/ov70_0226CE54.c', - 'overlay071/ov71_0223B140.c', - 'overlay071/trainer_card_display_text.c', - 'overlay071/ov71_0223CF0C.c', - 'overlay071/ov71_0223D324.c', + 'trainer_card_screen/trainer_card_screen.c', + 'trainer_card_screen/trainer_card_display_text.c', + 'trainer_card_screen/trainer_card_sprites.c', + 'trainer_card_screen/trainer_card_badge_chimes.c', 'overlay072/ov72_0223D7A0.c', 'applications/rowan_intro/rowan_intro_app.c', 'applications/rowan_intro/tv_app.c', diff --git a/src/overlay005/map_prop.c b/src/overlay005/map_prop.c index 7bd372d65c..83ca2b422f 100644 --- a/src/overlay005/map_prop.c +++ b/src/overlay005/map_prop.c @@ -132,7 +132,7 @@ void MapPropManager_Render(const VecFx32 *positionOffset, const AreaDataManager 0, 0, 0, - FX32_ONE + FX32_ONE, }; for (int i = 0; i < MAX_LOADED_MAP_PROPS; i++) { @@ -312,7 +312,7 @@ void MapPropManager_Render2(MapPropManager *mapPropManager, AreaDataManager *con 0, 0, 0, - FX32_ONE + FX32_ONE, }; for (u8 i = 0; i < MAX_LOADED_MAP_PROPS; i++) { diff --git a/src/overlay005/ov5_021F134C.c b/src/overlay005/ov5_021F134C.c index 9aab05e773..9d71f876eb 100644 --- a/src/overlay005/ov5_021F134C.c +++ b/src/overlay005/ov5_021F134C.c @@ -387,7 +387,7 @@ static const fx32 Unk_ov5_02200284[] = { FX32_ONE * 18, FX32_ONE * 18, FX32_ONE * 8, - FX32_ONE * 4 + FX32_ONE * 4, }; static const int Unk_ov5_02200278[3] = { diff --git a/src/overlay006/ov6_02242AF0.c b/src/overlay006/ov6_02242AF0.c index 0256be189b..87ba17c8ae 100644 --- a/src/overlay006/ov6_02242AF0.c +++ b/src/overlay006/ov6_02242AF0.c @@ -79,7 +79,7 @@ static const fx32 Unk_ov6_02249074[] = { FX32_ONE * 2, FX32_ONE * 2, FX32_ONE * 1, - FX32_ONE / 2 + FX32_ONE / 2, }; void GreatMarsh_DynamicMapFeaturesInit(FieldSystem *fieldSystem) diff --git a/src/overlay008/ov8_02249960.c b/src/overlay008/ov8_02249960.c index 9ce4530bb3..7ed5388bbc 100644 --- a/src/overlay008/ov8_02249960.c +++ b/src/overlay008/ov8_02249960.c @@ -2264,12 +2264,16 @@ static const u32 Unk_ov8_0224C700[2] = { }; static const VecFx32 Unk_ov8_0224C7A0[2] = { - { ((11 << 4) * FX32_ONE) + ((16 * FX32_ONE) >> 1), + { + ((11 << 4) * FX32_ONE) + ((16 * FX32_ONE) >> 1), FX32_ONE * 12, - ((13 << 4) * FX32_ONE) + ((16 * FX32_ONE) >> 1) }, - { ((11 << 4) * FX32_ONE) + ((16 * FX32_ONE) >> 1), - (FX32_ONE * 13), - ((13 << 4) * FX32_ONE) + ((16 * FX32_ONE) >> 1) } + ((13 << 4) * FX32_ONE) + ((16 * FX32_ONE) >> 1), + }, + { + ((11 << 4) * FX32_ONE) + ((16 * FX32_ONE) >> 1), + FX32_ONE * 13, + ((13 << 4) * FX32_ONE) + ((16 * FX32_ONE) >> 1), + } }; static const u16 Unk_ov8_0224C7B8[12] = { diff --git a/src/overlay012/battle_anim_system.c b/src/overlay012/battle_anim_system.c index 1bee66407d..f799ac58e7 100644 --- a/src/overlay012/battle_anim_system.c +++ b/src/overlay012/battle_anim_system.c @@ -38,6 +38,7 @@ #include "pltt_transfer.h" #include "pokemon.h" #include "pokemon_sprite.h" +#include "sound.h" #include "sound_playback.h" #include "spl.h" #include "sprite.h" diff --git a/src/overlay071/ov71_0223B140.c b/src/overlay071/ov71_0223B140.c deleted file mode 100644 index 70a773baa8..0000000000 --- a/src/overlay071/ov71_0223B140.c +++ /dev/null @@ -1,1341 +0,0 @@ -#include "overlay071/ov71_0223B140.h" - -#include -#include - -#include "generated/genders.h" - -#include "struct_defs/struct_02099F80.h" - -#include "overlay071/ov71_0223CF0C.h" -#include "overlay071/ov71_0223D324.h" -#include "overlay071/struct_ov71_0223B620.h" -#include "overlay071/struct_ov71_0223C444.h" -#include "overlay071/trainer_card_display_text.h" - -#include "bg_window.h" -#include "graphics.h" -#include "gx_layers.h" -#include "heap.h" -#include "message.h" -#include "narc.h" -#include "overlay_manager.h" -#include "render_oam.h" -#include "screen_fade.h" -#include "sound.h" -#include "sound_playback.h" -#include "sprite.h" -#include "strbuf.h" -#include "system.h" -#include "touch_pad.h" -#include "touch_screen.h" -#include "unk_020393C8.h" -#include "vram_transfer.h" - -#include "res/text/bank/trainer_card.h" - -typedef struct { - const TouchScreenRect *unk_00[2]; -} UnkStruct_ov71_0223D4D0; - -static void ov71_0223B620(UnkStruct_ov71_0223B620 *param0); -static void ov71_0223B668(UnkStruct_ov71_0223B620 *param0); -static void ov71_0223B688(void); -static void ov71_0223B858(BgConfig *bgConfig); -static void ov71_0223B968(UnkStruct_ov71_0223B620 *param0, NARC *narc); -static void ov71_0223BBDC(BgConfig *bgConfig); -static BOOL ov71_0223BC20(UnkStruct_ov71_0223B620 *param0); -static BOOL ov71_0223BDF8(UnkStruct_ov71_0223B620 *param0); -static BOOL ov71_0223C334(UnkStruct_ov71_0223B620 *param0, const u8 *param1); -static int ov71_0223BEF8(UnkStruct_ov71_0223B620 *param0); -static void ov71_0223BFBC(UnkStruct_ov71_0223B620 *param0); -static void ov71_0223B6A8(const u8 stars, const u8 pokedexObtained, NARC *narc); -static void ov71_0223B768(const u8 gameVersion, NARC *narc); -static void ov71_0223B820(const u8 param0, NARC *narc); -static void ov71_0223C0D8(UnkStruct_ov71_0223B620 *param0, const u8 param1); -static void ov71_0223C128(UnkStruct_ov71_0223B620 *param0, const u8 param1); -static void ov71_0223C18C(void *param0); -static void ov71_0223C390(UnkStruct_ov71_0223B620 *param0); -static void ov71_0223C3E8(UnkStruct_ov71_0223B620 *param0); -static void ov71_0223C1AC(UnkStruct_ov71_0223B620 *param0, const u8 param1); -static void ov71_0223C288(void); -static void ov71_0223C2F4(UnkStruct_ov71_0223B620 *param0); -static const u8 ov71_0223C40C(const int param0); -static void ov71_0223C444(UnkStruct_ov71_0223C444 *param0); -static void ov71_0223C44C(UnkStruct_ov71_0223C444 *param0); -static void ov71_0223C45C(UnkStruct_ov71_0223C444 *param0); -static void ov71_0223C4DC(const u8 *param0, u8 *param1); -static void ov71_0223C530(BgConfig *bgConfig, const int param1, const u8 *param2); -static void ov71_0223C594(const int unused); -static void ov71_0223C5A4(UnkStruct_ov71_0223B620 *param0, const u8 param1); -static int ov71_0223C60C(BgConfig *bgConfig, const TouchScreenRect *rect); -static int ov71_0223C654(BgConfig *bgConfig, const TouchScreenRect *rect); - -static const u8 Unk_ov71_0223D4B0[5] = { - 0x1, - 0x3, - 0x4, - 0xF, - 0xF -}; - -static const TouchScreenRect Unk_ov71_0223D5A4[] = { - { 0x98, 0xB7, 0x78, 0x97 }, - { 0x28, 0x4F, 0x18, 0x3F }, - { 0x28, 0x4F, 0x50, 0x77 }, - { 0x28, 0x4F, 0x88, 0xA7 }, - { 0x28, 0x4F, 0xC0, 0xE7 }, - { 0x60, 0x87, 0x18, 0x3F }, - { 0x60, 0x87, 0x50, 0x77 }, - { 0x60, 0x87, 0x88, 0xA7 }, - { 0x60, 0x87, 0xC0, 0xE7 }, - { 0xFF, 0x0, 0x0, 0x0 } -}; - -static const TouchScreenRect Unk_ov71_0223D4C0[] = { - { 0x98, 0xB7, 0x78, 0x97 }, - { 0xFF, 0x0, 0x0, 0x0 } -}; - -static const UnkStruct_ov71_0223D4D0 Unk_ov71_0223D4D0[] = { - { Unk_ov71_0223D4C0, Unk_ov71_0223D4C0 }, - { Unk_ov71_0223D4C0, Unk_ov71_0223D5A4 } -}; - -static const u8 Unk_ov71_0223D4A8[] = { - 0x1, - 0x1, - 0x0, - 0x2 -}; - -static const u8 Unk_ov71_0223D4AC[] = { - 0x1, - 0x1, - 0x0, - 0x0 -}; - -static const u8 *const Unk_ov71_0223D4C8[] = { - Unk_ov71_0223D4A8, - Unk_ov71_0223D4AC -}; - -static const int Unk_ov71_0223D604[16] = { - 0x40, - 0x3D, - 0x34, - 0x37, - 0x39, - 0x3A, - 0x3E, - 0x36, - 0x3C, - 0x32, - 0x41, - 0x35, - 0x38, - 0x3B, - 0x33, - 0x3F -}; - -int ov71_0223B140(ApplicationManager *appMan, int *param1) -{ - UnkStruct_ov71_0223B620 *v0; - NARC *v1; - - SetVBlankCallback(NULL, NULL); - SetHBlankCallback(NULL, NULL); - GXLayers_DisableEngineALayers(); - GXLayers_DisableEngineBLayers(); - - GX_SetVisiblePlane(0); - GXS_SetVisiblePlane(0); - - SetAutorepeat(4, 8); - Heap_Create(HEAP_ID_APPLICATION, HEAP_ID_TRAINER_CARD_SCREEN, HEAP_SIZE_TRAINER_CARD_SCREEN); - - v1 = NARC_ctor(NARC_INDEX_GRAPHIC__TRAINER_CASE, HEAP_ID_TRAINER_CARD_SCREEN); - v0 = ApplicationManager_NewData(appMan, sizeof(UnkStruct_ov71_0223B620), HEAP_ID_TRAINER_CARD_SCREEN); - - memset(v0, 0, sizeof(UnkStruct_ov71_0223B620)); - - v0->trainerCard = ApplicationManager_Args(appMan); - v0->bgConfig = BgConfig_New(HEAP_ID_TRAINER_CARD_SCREEN); - - ov71_0223B620(v0); - ov71_0223B688(); - ov71_0223B858(v0->bgConfig); - ov71_0223B968(v0, v1); - - EnableTouchPad(); - InitializeTouchPad(4); - Sound_SetSceneAndPlayBGM(SOUND_SCENE_SUB_56, SEQ_NONE, 0); - ov71_0223D324(&v0->unk_3354); - Sound_PlayEffect(SEQ_SE_DP_CARD3); - ov71_0223CF0C(&v0->unk_30E4, v1); - - { - int v2; - u8 v3[8]; - - for (v2 = 0; v2 < 8; v2++) { - if (v0->trainerCard->unk_48[v2].unk_00_0) { - v3[v2] = 1; - } else { - v3[v2] = 0; - } - } - - ov71_0223D070(&v0->unk_30E4, v3); - } - - TrainerCard_AddWindows(v0->bgConfig, v0->windows); - - { - u8 v4; - - for (v4 = 0; v4 < 8; v4++) { - if ((v0->trainerCard->unk_02 >> v4) & 0x1) { - ov71_0223C128(v0, v4); - } - } - - Bg_CopyTilemapBufferToVRAM(v0->bgConfig, BG_LAYER_MAIN_3); - } - - TrainerCard_DrawFrontText(v0->windows, v0->trainerCard); - - if (v0->trainerCard->unk_04_1) { - TrainerCard_BlinkPlaytimeColon(&(v0->windows[TRAINER_CARD_WINDOW_TIME]), TRUE, v0->colonStrbuf); - } - - v0->unk_30C0 = 0; - v0->unk_337C = 0; - v0->unk_30D4 = 0xffffffff; - v0->unk_3350 = 0; - v0->unk_3381 = 0; - - { - u8 v5; - u8 v6; - - for (v6 = 0; v6 < 8; v6++) { - v0->unk_3374[v6] = 0; - - if (v0->trainerCard->unk_48[v6].unk_00_0) { - v5 = ov71_0223C40C(v0->trainerCard->unk_48[v6].unk_00_1); - - if (v5 <= 4) { - if (v5 == 4) { - ov71_0223D298(&v0->unk_30E4, v6, 0); - } else { - ov71_0223D298(&v0->unk_30E4, v6, 3 - v5); - } - } - - if (v5 == 4 - 1) { - Sprite_SetDrawFlag(v0->unk_30E4.unk_1C0[8 + v6], TRUE); - } else if (v5 == 4) { - Sprite_SetDrawFlag(v0->unk_30E4.unk_1C0[(8 + 8) + v6], TRUE); - } - } - } - } - - ov71_0223C288(); - - SetVBlankCallback(ov71_0223C18C, NULL); - DrawWifiConnectionIcon(); - Sound_SetPlayerVolume(1, 127 / 3); - StartScreenFade(FADE_SUB_THEN_MAIN, FADE_TYPE_UNK_3, FADE_TYPE_UNK_3, COLOR_BLACK, 6, 1, HEAP_ID_TRAINER_CARD_SCREEN); - NARC_dtor(v1); - - return 1; -} - -int ov71_0223B388(ApplicationManager *appMan, int *param1) -{ - UnkStruct_ov71_0223B620 *v0 = ApplicationManager_Data(appMan); - - switch (*param1) { - case 0: - if (IsScreenFadeDone()) { - *param1 = 1; - } - - break; - - case 1: { - int v1; - - v1 = ov71_0223BEF8(v0); - - if (v1 == 1) { - if (v0->unk_30D4 == 0) { - v0->unk_3350 = 1; - v0->unk_3381 = 1; - - Sprite_SetDrawFlag(v0->unk_30E4.unk_1C0[((8 + 8) + 8)], TRUE); - Sprite_SetAnimateFlag(v0->unk_30E4.unk_1C0[((8 + 8) + 8)], 1); - Sprite_SetAnim(v0->unk_30E4.unk_1C0[((8 + 8) + 8)], 10); - - v0->unk_337E = 0; - v0->unk_3380 = 0; - v0->unk_337F = 0; - v0->unk_30D8 = 0; - *param1 = 4; - } else { - u8 v2 = v0->unk_30D4 - 1; - - if (v0->trainerCard->unk_48[v2].unk_00_0) { - u8 v3; - - v3 = ov71_0223C40C(v0->trainerCard->unk_48[v2].unk_00_1); - ov71_0223D338(&v0->unk_3354, v2, v3); - } - } - } else if (v1 == 2) { - if ((v0->unk_3350) && (v0->unk_30D4 != 0)) { - v0->unk_3350 = 0; - v0->unk_3381 = 2; - } - - ov71_0223BFBC(v0); - } else { - if ((v0->unk_3350) && (v0->unk_3381 == 0)) { - v0->unk_3350 = 0; - v0->unk_3381 = 2; - } - - if (v0->trainerCard->unk_04_0) { - ov71_0223C44C(&v0->unk_3364); - } - - if (v1 == 3) { - v0->unk_337E = 0; - *param1 = 3; - } else if (v1 == 4) { - Sound_PlayEffect(SEQ_SE_CONFIRM); - - StartScreenFade(FADE_MAIN_THEN_SUB, FADE_TYPE_UNK_4, FADE_TYPE_UNK_4, COLOR_BLACK, 6, 1, HEAP_ID_TRAINER_CARD_SCREEN); - *param1 = 2; - } - } - - ov71_0223C5A4(v0, v0->trainerCard->unk_04_1); - } break; - case 2: - if (IsScreenFadeDone()) { - return 1; - } - break; - case 3: - if (ov71_0223BC20(v0)) { - *param1 = 1; - } - break; - case 4: - if (v0->unk_3381 == 0) { - int v4; - - v4 = ov71_0223BEF8(v0); - - if (v4 == 1) { - if (v0->unk_30D4 == 0) { - v0->unk_3350 = 1; - v0->unk_3381 = 1; - v0->unk_3380 = 0; - v0->unk_337F = 0; - } - } else if (v4 == 2) { - if ((v0->unk_3350) && (v0->unk_30D4 != 0)) { - v0->unk_3350 = 0; - v0->unk_3381 = 2; - } - } else { - if (v0->unk_3350) { - v0->unk_3350 = 0; - v0->unk_3381 = 2; - } - } - } - - if (v0->unk_30D8 == 0) { - v0->unk_30D8 = ov71_0223BDF8(v0); - } - - if (v0->unk_30D8) { - v0->unk_30D8 = 0; - *param1 = 1; - } - break; - } - - ov71_0223C2F4(v0); - SpriteList_Update(v0->unk_30E4.unk_00); - - return 0; -} - -int ov71_0223B5B8(ApplicationManager *appMan, int *param1) -{ - UnkStruct_ov71_0223B620 *v0 = ApplicationManager_Data(appMan); - - ov71_0223C288(); - ov71_0223B668(v0); - ov71_0223D238(&v0->unk_30E4); - - Heap_Free(v0->unk_30B8); - Heap_Free(v0->unk_335C); - - TrainerCard_RemoveWindows(v0->windows); - ov71_0223BBDC(v0->bgConfig); - - DisableTouchPad(); - ApplicationManager_FreeData(appMan); - SetVBlankCallback(NULL, NULL); - Heap_Destroy(HEAP_ID_TRAINER_CARD_SCREEN); - Sound_SetPlayerVolume(1, 127); - - return 1; -} - -static void ov71_0223B620(UnkStruct_ov71_0223B620 *param0) -{ - param0->unusedStrbuf = Strbuf_Init(4, HEAP_ID_TRAINER_CARD_SCREEN); - param0->colonStrbuf = Strbuf_Init(5, HEAP_ID_TRAINER_CARD_SCREEN); - - MessageLoader *messageLoader = MessageLoader_Init(MESSAGE_LOADER_BANK_HANDLE, NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_TRAINER_CARD, HEAP_ID_TRAINER_CARD_SCREEN); - - MessageLoader_GetStrbuf(messageLoader, TrainerCard_Text_Colon, param0->colonStrbuf); - MessageLoader_Free(messageLoader); -} - -static void ov71_0223B668(UnkStruct_ov71_0223B620 *param0) -{ - Strbuf_Free(param0->unusedStrbuf); - Strbuf_Free(param0->colonStrbuf); -} - -static void ov71_0223B688(void) -{ - UnkStruct_02099F80 v0 = { - GX_VRAM_BG_64_E, - GX_VRAM_BGEXTPLTT_NONE, - GX_VRAM_SUB_BG_128_C, - GX_VRAM_SUB_BGEXTPLTT_NONE, - GX_VRAM_OBJ_128_B, - GX_VRAM_OBJEXTPLTT_NONE, - GX_VRAM_SUB_OBJ_16_I, - GX_VRAM_SUB_OBJEXTPLTT_NONE, - GX_VRAM_TEX_NONE, - GX_VRAM_TEXPLTT_NONE - }; - - GXLayers_SetBanks(&v0); -} - -static void ov71_0223B6A8(const u8 stars, const u8 pokedexObtained, NARC *narc) -{ - { - void *v0; - NNSG2dPaletteData *v1; - - if (pokedexObtained) { - switch (stars) { - case 0: - v0 = Graphics_GetPlttDataFromOpenNARC(narc, 0, &v1, HEAP_ID_TRAINER_CARD_SCREEN); - break; - case 1: - v0 = Graphics_GetPlttDataFromOpenNARC(narc, 1, &v1, HEAP_ID_TRAINER_CARD_SCREEN); - break; - case 2: - v0 = Graphics_GetPlttDataFromOpenNARC(narc, 2, &v1, HEAP_ID_TRAINER_CARD_SCREEN); - break; - case 3: - v0 = Graphics_GetPlttDataFromOpenNARC(narc, 3, &v1, HEAP_ID_TRAINER_CARD_SCREEN); - break; - case 4: - v0 = Graphics_GetPlttDataFromOpenNARC(narc, 4, &v1, HEAP_ID_TRAINER_CARD_SCREEN); - break; - case 5: - v0 = Graphics_GetPlttDataFromOpenNARC(narc, 5, &v1, HEAP_ID_TRAINER_CARD_SCREEN); - break; - } - } else { - v0 = Graphics_GetPlttDataFromOpenNARC(narc, 6, &v1, HEAP_ID_TRAINER_CARD_SCREEN); - } - - { - u16 *v2; - - DC_FlushRange(v1->pRawData, 2 * 16 * 16); - v2 = v1->pRawData; - - GXS_LoadBGPltt(&v2[16], 2 * 16, 2 * 16 * 3); - GXS_LoadBGPltt(&v2[16 * 15], 2 * 16 * 15, 2 * 16); - - Heap_Free(v0); - } - } -} - -static void ov71_0223B768(const u8 gameVersion, NARC *narc) -{ - void *v0; - NNSG2dPaletteData *v1; - - switch (gameVersion) { - case VERSION_DIAMOND: - v0 = Graphics_GetPlttDataFromOpenNARC(narc, 7, &v1, HEAP_ID_TRAINER_CARD_SCREEN); - break; - case VERSION_PEARL: - v0 = Graphics_GetPlttDataFromOpenNARC(narc, 8, &v1, HEAP_ID_TRAINER_CARD_SCREEN); - break; - case VERSION_PLATINUM: - v0 = Graphics_GetPlttDataFromOpenNARC(narc, 10, &v1, HEAP_ID_TRAINER_CARD_SCREEN); - break; - case VERSION_HEARTGOLD: - v0 = Graphics_GetPlttDataFromOpenNARC(narc, 11, &v1, HEAP_ID_TRAINER_CARD_SCREEN); - break; - case VERSION_SOULSILVER: - v0 = Graphics_GetPlttDataFromOpenNARC(narc, 12, &v1, HEAP_ID_TRAINER_CARD_SCREEN); - break; - default: - v0 = Graphics_GetPlttDataFromOpenNARC(narc, 9, &v1, HEAP_ID_TRAINER_CARD_SCREEN); - break; - } - - DC_FlushRange(v1->pRawData, 2 * 16); - - GX_LoadBGPltt(v1->pRawData, 0, 2 * 16); - GXS_LoadBGPltt(v1->pRawData, 0, 2 * 16); - - Heap_Free(v0); -} - -static void ov71_0223B820(const u8 param0, NARC *narc) -{ - void *v0; - u8 *v1; - NNSG2dPaletteData *v2; - - v0 = Graphics_GetPlttDataFromOpenNARC(narc, 48, &v2, HEAP_ID_TRAINER_CARD_SCREEN); - v1 = (u8 *)(v2->pRawData); - - DC_FlushRange(&v1[2 * 16 * param0], 2 * 16); - GXS_LoadBGPltt(&v1[2 * 16 * param0], 2 * 16 * 4, 2 * 16); - - Heap_Free(v0); -} - -static void ov71_0223B858(BgConfig *bgConfig) -{ - GX_SetDispSelect(GX_DISP_SELECT_SUB_MAIN); - - { - GraphicsModes v0 = { - GX_DISPMODE_GRAPHICS, - GX_BGMODE_1, - GX_BGMODE_4, - GX_BG0_AS_2D, - }; - - SetAllGraphicsModes(&v0); - } - - { - BgTemplate v1 = { - .x = 0, - .y = 0, - .bufferSize = 0x800, - .baseTile = 0, - .screenSize = BG_SCREEN_SIZE_256x256, - .colorMode = GX_BG_COLORMODE_256, - .screenBase = GX_BG_SCRBASE_0xf000, - .charBase = GX_BG_CHARBASE_0x04000, - .bgExtPltt = GX_BG_EXTPLTT_01, - .priority = 0, - .areaOver = 0, - .mosaic = FALSE, - }; - - Bg_InitFromTemplate(bgConfig, BG_LAYER_SUB_3, &v1, BG_TYPE_STATIC_WITH_AFFINE); - Bg_ClearTilemap(bgConfig, BG_LAYER_SUB_3); - } - - { - BgTemplate v2 = { - .x = 0, - .y = 0, - .bufferSize = 0x800, - .baseTile = 0, - .screenSize = BG_SCREEN_SIZE_256x256, - .colorMode = GX_BG_COLORMODE_16, - .screenBase = GX_BG_SCRBASE_0xe000, - .charBase = GX_BG_CHARBASE_0x0c000, - .bgExtPltt = GX_BG_EXTPLTT_01, - .priority = 3, - .areaOver = 0, - .mosaic = FALSE, - }; - - Bg_InitFromTemplate(bgConfig, BG_LAYER_SUB_1, &v2, BG_TYPE_STATIC); - Bg_ClearTilemap(bgConfig, BG_LAYER_SUB_1); - } - - { - BgTemplate v3 = { - .x = 0, - .y = 0, - .bufferSize = 0x800, - .baseTile = 0, - .screenSize = BG_SCREEN_SIZE_256x256, - .colorMode = GX_BG_COLORMODE_256, - .screenBase = GX_BG_SCRBASE_0xe800, - .charBase = GX_BG_CHARBASE_0x00000, - .bgExtPltt = GX_BG_EXTPLTT_01, - .priority = 2, - .areaOver = 0, - .mosaic = FALSE, - }; - - Bg_InitFromTemplate(bgConfig, BG_LAYER_SUB_2, &v3, BG_TYPE_AFFINE); - Bg_ClearTilemap(bgConfig, BG_LAYER_SUB_2); - } - - { - BgTemplate v4 = { - .x = 0, - .y = 0, - .bufferSize = 0x800, - .baseTile = 0, - .screenSize = BG_SCREEN_SIZE_256x256, - .colorMode = GX_BG_COLORMODE_16, - .screenBase = GX_BG_SCRBASE_0xe000, - .charBase = GX_BG_CHARBASE_0x00000, - .bgExtPltt = GX_BG_EXTPLTT_01, - .priority = 3, - .areaOver = 0, - .mosaic = FALSE, - }; - - Bg_InitFromTemplate(bgConfig, BG_LAYER_MAIN_2, &v4, BG_TYPE_STATIC); - Bg_ClearTilemap(bgConfig, BG_LAYER_MAIN_2); - } - - { - BgTemplate v5 = { - .x = 0, - .y = 0, - .bufferSize = 0x800, - .baseTile = 0, - .screenSize = BG_SCREEN_SIZE_256x256, - .colorMode = GX_BG_COLORMODE_256, - .screenBase = GX_BG_SCRBASE_0xe800, - .charBase = GX_BG_CHARBASE_0x04000, - .bgExtPltt = GX_BG_EXTPLTT_01, - .priority = 0, - .areaOver = 0, - .mosaic = FALSE, - }; - - Bg_InitFromTemplate(bgConfig, BG_LAYER_MAIN_3, &v5, BG_TYPE_AFFINE); - Bg_ClearTilemap(bgConfig, BG_LAYER_MAIN_3); - } -} - -static void ov71_0223B968(UnkStruct_ov71_0223B620 *param0, NARC *narc) -{ - { - void *v0; - NNSG2dPaletteData *v1; - - v0 = Graphics_GetPlttDataFromOpenNARC(narc, 0, &v1, HEAP_ID_TRAINER_CARD_SCREEN); - - DC_FlushRange(v1->pRawData, 2 * 16 * 16); - GXS_LoadBGPltt(v1->pRawData, 0, 2 * 16 * 16); - Heap_Free(v0); - } - - ov71_0223B6A8(param0->trainerCard->stars, param0->trainerCard->pokedexObtained, narc); - - { - void *v2; - NNSG2dPaletteData *v3; - - v2 = Graphics_GetPlttDataFromOpenNARC(narc, 13, &v3, HEAP_ID_TRAINER_CARD_SCREEN); - - DC_FlushRange(v3->pRawData, 16 * 2 * 16); - GX_LoadBGPltt(v3->pRawData, 0, 16 * 2 * 16); - Heap_Free(v2); - } - - ov71_0223B768(param0->trainerCard->gameVersion, narc); - - if (param0->trainerCard->unk_05 == 0xff) { - s32 v4, v5, v6; - - switch (param0->trainerCard->gameVersion) { - case VERSION_DIAMOND: - case VERSION_PEARL: - v4 = 32; - v5 = 42; - v6 = 26; - break; - default: - v4 = 31; - v5 = 40; - v6 = -1; - break; - } - - { - BOOL v7; - - param0->unk_30B8 = LoadMemberFromOpenNARC(narc, v4, 0, HEAP_ID_TRAINER_CARD_SCREEN, 0); - GF_ASSERT(param0->unk_30B8 != NULL); - - v7 = NNS_G2dGetUnpackedBGCharacterData(param0->unk_30B8, ¶m0->unk_30BC); - GF_ASSERT(v7); - } - - if (v6 != -1) { - Graphics_LoadPaletteFromOpenNARC(narc, v6, 4, 4 * 32, 2 * 32, HEAP_ID_TRAINER_CARD_SCREEN); - } - - if (param0->trainerCard->gender == GENDER_MALE) { - param0->unk_335C = Graphics_GetScrnDataFromOpenNARC(narc, v5, 0, ¶m0->unk_3360, HEAP_ID_TRAINER_CARD_SCREEN); - } else { - param0->unk_335C = Graphics_GetScrnDataFromOpenNARC(narc, v5 + 1, 0, ¶m0->unk_3360, HEAP_ID_TRAINER_CARD_SCREEN); - } - } else { - { - BOOL v8; - - param0->unk_30B8 = LoadMemberFromOpenNARC(narc, Unk_ov71_0223D604[param0->trainerCard->unk_05], 0, HEAP_ID_TRAINER_CARD_SCREEN, 0); - GF_ASSERT(param0->unk_30B8 != NULL); - - v8 = NNS_G2dGetUnpackedBGCharacterData(param0->unk_30B8, ¶m0->unk_30BC); - GF_ASSERT(v8); - - param0->unk_335C = Graphics_GetScrnDataFromOpenNARC(narc, 49, 0, ¶m0->unk_3360, HEAP_ID_TRAINER_CARD_SCREEN); - - ov71_0223B820(param0->trainerCard->unk_05, narc); - } - } - - ov71_0223C390(param0); - - Graphics_LoadTilesToBgLayerFromOpenNARC(narc, 27, param0->bgConfig, BG_LAYER_SUB_2, 0, 0, FALSE, HEAP_ID_TRAINER_CARD_SCREEN); - Graphics_LoadTilemapToBgLayerFromOpenNARC(narc, 35, param0->bgConfig, BG_LAYER_SUB_2, 0, 0, FALSE, HEAP_ID_TRAINER_CARD_SCREEN); - - Graphics_LoadTilesToBgLayerFromOpenNARC(narc, 28, param0->bgConfig, BG_LAYER_SUB_1, 0, 0, FALSE, HEAP_ID_TRAINER_CARD_SCREEN); - Graphics_LoadTilemapToBgLayerFromOpenNARC(narc, 37, param0->bgConfig, BG_LAYER_SUB_1, 0, 0, FALSE, HEAP_ID_TRAINER_CARD_SCREEN); - - Graphics_LoadTilesToBgLayerFromOpenNARC(narc, 29, param0->bgConfig, BG_LAYER_MAIN_2, 0, 0, FALSE, HEAP_ID_TRAINER_CARD_SCREEN); - Graphics_LoadTilemapToBgLayerFromOpenNARC(narc, 38, param0->bgConfig, BG_LAYER_MAIN_2, 0, 0, FALSE, HEAP_ID_TRAINER_CARD_SCREEN); - - Graphics_LoadTilesToBgLayerFromOpenNARC(narc, 30, param0->bgConfig, BG_LAYER_MAIN_3, 0, 0, FALSE, HEAP_ID_TRAINER_CARD_SCREEN); - Graphics_LoadTilemapToBgLayerFromOpenNARC(narc, 39, param0->bgConfig, BG_LAYER_MAIN_3, 0, 0, FALSE, HEAP_ID_TRAINER_CARD_SCREEN); - - ov71_0223C4DC(param0->trainerCard->signature, param0->unk_B8); -} - -static void ov71_0223BBDC(BgConfig *bgConfig) -{ - GXLayers_EngineAToggleLayers(GX_PLANEMASK_BG0 | GX_PLANEMASK_BG1 | GX_PLANEMASK_BG2 | GX_PLANEMASK_BG3 | GX_PLANEMASK_OBJ, 0); - GXLayers_EngineBToggleLayers(GX_PLANEMASK_BG0 | GX_PLANEMASK_BG1 | GX_PLANEMASK_OBJ, 0); - Bg_FreeTilemapBuffer(bgConfig, BG_LAYER_SUB_3); - Bg_FreeTilemapBuffer(bgConfig, BG_LAYER_SUB_2); - Bg_FreeTilemapBuffer(bgConfig, BG_LAYER_SUB_1); - Bg_FreeTilemapBuffer(bgConfig, BG_LAYER_MAIN_2); - Bg_FreeTilemapBuffer(bgConfig, BG_LAYER_MAIN_3); - Heap_Free(bgConfig); -} - -static BOOL ov71_0223BC20(UnkStruct_ov71_0223B620 *param0) -{ - BOOL v0; - MtxFx22 v1; - fx32 v2, v3; - - v0 = 0; - - switch (param0->unk_337E) { - case 0: - param0->unk_3348 = 8; - param0->unk_30C8 = 1 << FX32_SHIFT; - param0->unk_30CC = 1 << FX32_SHIFT; - param0->unk_30C8 += 2 << (FX32_SHIFT - 6); - param0->unk_30CC += 2 << (FX32_SHIFT - 6); - - Sound_PlayEffect(SEQ_SE_DP_CARD5); - - param0->unk_337E++; - break; - case 1: - param0->unk_30C8 -= 2 << (FX32_SHIFT - param0->unk_3348); - - if (param0->unk_30C8 <= 0) { - param0->unk_30C8 = 0x24; - param0->unk_337E++; - } - - param0->unk_3348--; - - if (param0->unk_3348 <= 1) { - param0->unk_3348 = 1; - } - break; - case 2: - if (param0->unk_30C0 == 0) { - param0->unk_30C0 = 1; - Graphics_LoadTilemapToBgLayer(NARC_INDEX_GRAPHIC__TRAINER_CASE, 36, param0->bgConfig, BG_LAYER_SUB_2, 0, 0, FALSE, HEAP_ID_TRAINER_CARD_SCREEN); - TrainerCard_ClearWindows(param0->windows, TRAINER_CARD_WINDOW_ID, TRAINER_CARD_WINDOW_ADVENTURE_STARTED); - ov71_0223C3E8(param0); - Bg_ClearTilemap(param0->bgConfig, BG_LAYER_SUB_3); - TrainerCard_DrawBackText(param0->windows, param0->trainerCard); - ov71_0223C530(param0->bgConfig, BG_LAYER_SUB_3, param0->unk_B8); - } else { - param0->unk_30C0 = 0; - Graphics_LoadTilemapToBgLayer(NARC_INDEX_GRAPHIC__TRAINER_CASE, 35, param0->bgConfig, BG_LAYER_SUB_2, 0, 0, FALSE, HEAP_ID_TRAINER_CARD_SCREEN); - TrainerCard_ClearWindows(param0->windows, TRAINER_CARD_WINDOW_HOF_DEBUT, TRAINER_CARD_WINDOW_LINK_TRADES); - Bg_ClearTilemap(param0->bgConfig, BG_LAYER_SUB_3); - ov71_0223C390(param0); - TrainerCard_DrawFrontText(param0->windows, param0->trainerCard); - } - - param0->unk_337E++; - break; - case 3: - param0->unk_3348++; - - if (param0->unk_3348 > 8) { - param0->unk_3348 = 8; - } - - param0->unk_30C8 += 2 << (FX32_SHIFT - param0->unk_3348); - - if (param0->unk_30C8 >= (1 << FX32_SHIFT)) { - param0->unk_30C8 = 1 << FX32_SHIFT; - param0->unk_30C8 = 1 << FX32_SHIFT; - param0->unk_30CC = 1 << FX32_SHIFT; - v0 = 1; - } - break; - } - - v2 = FX_Inv(param0->unk_30C8); - v3 = FX_Inv(param0->unk_30CC); - - v1._00 = v2; - v1._01 = 0; - v1._10 = 0; - v1._11 = v3; - - SVC_WaitVBlankIntr(); - - G2S_SetBG2Affine(&v1, 128, 96, 0, 0); - G2S_SetBG3Affine(&v1, 128, 96, 0, 0); - - return v0; -} - -static const fx32 Unk_ov71_0223D5CC[] = { - 2 << (FX32_SHIFT - 6), - 2 << (FX32_SHIFT - 6), - 2 << (FX32_SHIFT - 6), - 2 << (FX32_SHIFT - 6), - 2 << (FX32_SHIFT - 6), - 2 << (FX32_SHIFT - 5), - 2 << (FX32_SHIFT - 5), - 2 << (FX32_SHIFT - 5), - 2 << (FX32_SHIFT - 5), - 2 << (FX32_SHIFT - 5), - 2 << (FX32_SHIFT - 4), - 2 << (FX32_SHIFT - 4), - 2 << (FX32_SHIFT - 4), - 2 << (FX32_SHIFT - 4) -}; - -static BOOL ov71_0223BDF8(UnkStruct_ov71_0223B620 *param0) -{ - MtxFx22 v0; - fx32 v1, v2; - - switch (param0->unk_337E) { - case 0: - param0->unk_337D = 0; - - if (param0->unk_337C == 0) { - param0->unk_30D0 = 1 << FX32_SHIFT; - param0->unk_337E = 1; - } else { - param0->unk_337E = 2; - } - - ov71_0223C594(param0->unk_337C); - break; - case 1: - param0->unk_30D0 -= Unk_ov71_0223D5CC[param0->unk_337D++]; - - if (param0->unk_337D == 14) { - param0->unk_337C = 1; - param0->unk_337E = 3; - } - break; - case 2: - param0->unk_30D0 += Unk_ov71_0223D5CC[(14 - 1) - (param0->unk_337D++)]; - - if (param0->unk_337D == 14) { - param0->unk_337C = 0; - param0->unk_30D0 = (1 << FX32_SHIFT); - param0->unk_337E = 3; - } - break; - case 3: - return 1; - } - - v1 = FX_Inv(1 << FX32_SHIFT); - v2 = FX_Inv(param0->unk_30D0); - - v0._00 = v1; - v0._01 = 0; - v0._10 = 0; - v0._11 = v2; - - SVC_WaitVBlankIntr(); - G2_SetBG3Affine(&v0, 128, 0, 0, 0); - - return 0; -} - -static int ov71_0223BEF8(UnkStruct_ov71_0223B620 *param0) -{ - int v0; - BOOL v1 = 0; - v0 = 0; - - param0->unk_30D4 = TOUCHSCREEN_INPUT_NONE; - - if (gSystem.touchPressed) { - param0->unk_30C4 = 1; - } - - param0->unk_30D4 = ov71_0223C60C(param0->bgConfig, Unk_ov71_0223D4D0[param0->trainerCard->unk_04_0].unk_00[param0->unk_337C]); - - if (param0->unk_30D4 != TOUCHSCREEN_INPUT_NONE) { - v1 = 1; - v0 = 1; - } else if (gSystem.touchHeld) { - param0->unk_30D4 = ov71_0223C654(param0->bgConfig, Unk_ov71_0223D4D0[param0->trainerCard->unk_04_0].unk_00[param0->unk_337C]); - - if (param0->unk_30C4) { - v1 = 1; - v0 = 2; - } - } else { - param0->unk_30C4 = 0; - } - - if (v1 == 0) { - if (gSystem.pressedKeys & PAD_BUTTON_A) { - v0 = 3; - } else if (gSystem.pressedKeys & PAD_BUTTON_B) { - v0 = 4; - } - } - - return v0; -} - -static void ov71_0223BFBC(UnkStruct_ov71_0223B620 *param0) -{ - BOOL v0; - int v1; - - v0 = 0; - - if ((gSystem.touchX != 0xffff) && (gSystem.touchY != 0xffff) && (param0->unk_30DC != 0xffff) && (param0->unk_30E0 != 0xffff)) { - if ((param0->unk_30D4 != TOUCHSCREEN_INPUT_NONE) && (param0->unk_30D4 != 0)) { - if (param0->trainerCard->unk_48[param0->unk_30D4 - 1].unk_00_0) { - if (param0->unk_30DC > gSystem.touchX) { - v1 = param0->unk_30DC - gSystem.touchX; - param0->unk_3364.unk_02 = -1; - } else { - v1 = gSystem.touchX - param0->unk_30DC; - param0->unk_3364.unk_02 = 1; - } - - if ((v1 >= 3) && (v1 <= 40)) { - if (param0->unk_30E0 > gSystem.touchY) { - v1 = param0->unk_30E0 - gSystem.touchY; - param0->unk_3364.unk_03 = -1; - } else { - v1 = gSystem.touchY - param0->unk_30E0; - param0->unk_3364.unk_03 = 1; - } - - if (v1 <= 40) { - v0 = 1; - ov71_0223C45C(¶m0->unk_3364); - } else { - ov71_0223C444(¶m0->unk_3364); - } - } else if (v1 <= 40) { - if (param0->unk_30E0 > gSystem.touchY) { - v1 = param0->unk_30E0 - gSystem.touchY; - param0->unk_3364.unk_03 = -1; - } else { - v1 = gSystem.touchY - param0->unk_30E0; - param0->unk_3364.unk_03 = 1; - } - - if ((v1 >= 3) && (v1 <= 40)) { - v0 = 1; - ov71_0223C45C(¶m0->unk_3364); - } else { - ov71_0223C444(¶m0->unk_3364); - } - } - - if (v0) { - ov71_0223C1AC(param0, param0->unk_30D4 - 1); - } - } - } - } - - param0->unk_30DC = gSystem.touchX; - param0->unk_30E0 = gSystem.touchY; -} - -static void ov71_0223C0D8(UnkStruct_ov71_0223B620 *param0, const u8 param1) -{ - u16 *v0; - u16 v1; - u8 v2, v3; - - v0 = (u16 *)Bg_GetTilemapBuffer(param0->bgConfig, BG_LAYER_MAIN_2); - v1 = (4 * 32) + (4 * param1); - - for (v3 = 0; v3 < 4; v3++) { - for (v2 = 0; v2 < 4; v2++) { - v0[(v3 + 19) * 32 + v2 + 14] = v1 + v3 * 32 + v2 + (0 << 12); - } - } - - Bg_CopyTilemapBufferToVRAM(param0->bgConfig, BG_LAYER_MAIN_2); -} - -static void ov71_0223C128(UnkStruct_ov71_0223B620 *param0, const u8 param1) -{ - u8 *v0; - u16 v1; - u8 v2, v3; - u8 v4, v5; - u8 v6, v7; - - v4 = 3; - v6 = 4; - v5 = param1 % 4; - v7 = param1 / 4; - - v4 += (v5 * 7); - v6 += (v7 * 7); - - v0 = (u8 *)Bg_GetTilemapBuffer(param0->bgConfig, BG_LAYER_MAIN_3); - v1 = (5 * 32 + 26); - - for (v3 = 0; v3 < 5; v3++) { - for (v2 = 0; v2 < 5; v2++) { - v0[(v3 + v6) * 32 + v2 + v4] = v1 + v3 * 16 + v2; - } - } -} - -static void ov71_0223C18C(void *param0) -{ - VramTransfer_Process(); - RenderOam_Transfer(); - - OS_SetIrqCheckFlag(OS_IE_V_BLANK); -} - -static void ov71_0223C1AC(UnkStruct_ov71_0223B620 *param0, const u8 param1) -{ - int v0; - u8 v1, v2; - - v0 = (param0->trainerCard->unk_48[param1].unk_00_1) + 1; - - if (v0 < 200) { - v2 = ov71_0223C40C(param0->trainerCard->unk_48[param1].unk_00_1); - - param0->unk_3374[param1]++; - - if (param0->unk_3374[param1] >= Unk_ov71_0223D4B0[v2]) { - param0->unk_3374[param1] = 0; - (param0->trainerCard->unk_48[param1].unk_00_1)++; - - v1 = ov71_0223C40C(v0); - GF_ASSERT(v2 <= v1); - - if (v2 < v1) { - if (v1 <= 4) { - if (v1 == 4) { - ov71_0223D298(¶m0->unk_30E4, param1, 0); - } else { - ov71_0223D298(¶m0->unk_30E4, param1, 3 - v1); - } - } - - if (v1 == 4 - 1) { - Sprite_SetDrawFlag(param0->unk_30E4.unk_1C0[8 + param1], TRUE); - } else if (v1 == 4) { - Sprite_SetDrawFlag(param0->unk_30E4.unk_1C0[8 + param1], FALSE); - Sprite_SetDrawFlag(param0->unk_30E4.unk_1C0[(8 + 8) + param1], TRUE); - } - } - } - } -} - -static void ov71_0223C288(void) -{ - MtxFx22 v0; - fx32 v1, v2; - - v1 = FX_Inv(1 << FX32_SHIFT); - v2 = FX_Inv(1 << FX32_SHIFT); - v0._00 = v1; - v0._01 = 0; - v0._10 = 0; - v0._11 = v2; - - SVC_WaitVBlankIntr(); - - G2S_SetBG2Affine(&v0, 128, 96, 0, 0); - G2S_SetBG3Affine(&v0, 128, 96, 0, 0); - - SVC_WaitVBlankIntr(); - - G2_SetBG3Affine(&v0, 128, 0, 0, 0); -} - -static void ov71_0223C2F4(UnkStruct_ov71_0223B620 *param0) -{ - if (param0->unk_3381 == 1) { - if (ov71_0223C334(param0, Unk_ov71_0223D4C8[0])) { - param0->unk_3381 = 0; - } - } else if (param0->unk_3381 == 2) { - if (ov71_0223C334(param0, Unk_ov71_0223D4C8[1])) { - param0->unk_3381 = 0; - } - } -} - -static BOOL ov71_0223C334(UnkStruct_ov71_0223B620 *param0, const u8 *param1) -{ - u8 v0, v1; - - v0 = param1[param0->unk_3380 * 2]; - - if (v0 == 0) { - param0->unk_337F = 0; - param0->unk_3380 = 0; - return 1; - } else if (param0->unk_337F >= v0) { - param0->unk_337F = 0; - param0->unk_3380++; - } - - v1 = param1[param0->unk_3380 * 2 + 1]; - - if (param0->unk_337F == 0) { - ov71_0223C0D8(param0, v1); - } - - param0->unk_337F++; - - return 0; -} - -static void ov71_0223C390(UnkStruct_ov71_0223B620 *param0) -{ - u32 v0 = param0->unk_3360->szByte; - - Bg_LoadTiles(param0->bgConfig, BG_LAYER_SUB_3, param0->unk_30BC->pRawData, param0->unk_30BC->szByte, 0); - - if (Bg_GetTilemapBuffer(param0->bgConfig, BG_LAYER_SUB_3) != NULL) { - Bg_LoadTilemapBuffer(param0->bgConfig, BG_LAYER_SUB_3, param0->unk_3360->rawData, v0); - } - - Bg_CopyTilemapBufferRangeToVRAM(param0->bgConfig, BG_LAYER_SUB_3, param0->unk_3360->rawData, v0, 0); -} - -static void ov71_0223C3E8(UnkStruct_ov71_0223B620 *param0) -{ - Bg_FillTilemapRect(param0->bgConfig, BG_LAYER_SUB_3, 0, 20, 6, 6, 9, 16); -} - -static const u8 ov71_0223C40C(const int param0) -{ - u8 v0; - - if ((0 <= param0) && (param0 < 100)) { - v0 = 0; - } else if (param0 < 140) { - v0 = 1; - } else if (param0 < 170) { - v0 = 2; - } else if (param0 < 190) { - v0 = 3; - } else if (param0 < 200) { - v0 = 4; - } else { - GF_ASSERT(FALSE); - v0 = 0; - } - - return v0; -} - -static void ov71_0223C444(UnkStruct_ov71_0223C444 *param0) -{ - param0->unk_02 = 0; - param0->unk_03 = 0; -} - -static void ov71_0223C44C(UnkStruct_ov71_0223C444 *param0) -{ - param0->unk_00 = 0; - param0->unk_01 = 0; - param0->unk_02 = 0; - param0->unk_03 = 0; - param0->unk_04 = 0; -} - -static void ov71_0223C45C(UnkStruct_ov71_0223C444 *param0) -{ - int v0[2] = { - 1682, 1683 - }; - - if ((param0->unk_00 == 0) && (param0->unk_01 == 0)) { - Sound_PlayEffect(SEQ_SE_DP_MIGAKU01); - } - - if ((param0->unk_00 * param0->unk_02 < 0) || (param0->unk_01 * param0->unk_03 < 0)) { - param0->unk_04 = (param0->unk_04 + 1) % 2; - Sound_PlayEffect(v0[param0->unk_04]); - } - - param0->unk_00 = param0->unk_02; - param0->unk_01 = param0->unk_03; - param0->unk_02 = 0; - param0->unk_03 = 0; -} - -static void ov71_0223C4DC(const u8 *param0, u8 *param1) -{ - int v0, v1; - u8 v2; - u8 v3; - - for (v0 = 0; v0 < 24 * 8 * 64; v0++) { - v1 = v0 / 64; - v2 = (v0 / 8) % 8; - v3 = (v0 % 8); - - param1[v0] = (0x1 & (param0[(v1 * 8) + v2] >> v3)); - } -} - -static void ov71_0223C530(BgConfig *bgConfig, const int bgLayer, const u8 *param2) -{ - u16 *v0; - u8 v1, v2; - u16 v3; - - Bg_LoadTiles(bgConfig, bgLayer, param2, 24 * 8 * 64, 1); - - v0 = (u16 *)Bg_GetTilemapBuffer(bgConfig, bgLayer); - v3 = 0; - - for (v2 = 0; v2 < 8; v2++) { - for (v1 = 0; v1 < 24; v1++) { - v0[(14 + v2) * 32 + v1 + 4] = (1 + v3); - v3++; - } - } - - Bg_CopyTilemapBufferToVRAM(bgConfig, bgLayer); -} - -static void ov71_0223C594(const int unused) -{ - Sound_PlayEffect(SEQ_SE_DP_CARD11); -} - -static void ov71_0223C5A4(UnkStruct_ov71_0223B620 *param0, const u8 param1) -{ - if (!param1) { - return; - } - - if (!param0->unk_30C0) { - if (param0->unk_3382 == 15) { - TrainerCard_DrawUpdatedTime(param0->windows, param0->trainerCard, param0->unusedStrbuf); - - TrainerCard_BlinkPlaytimeColon(&(param0->windows[TRAINER_CARD_WINDOW_TIME]), TRUE, param0->colonStrbuf); - } else if (param0->unk_3382 == 0) { - TrainerCard_BlinkPlaytimeColon(&(param0->windows[TRAINER_CARD_WINDOW_TIME]), FALSE, param0->colonStrbuf); - } - } - - param0->unk_3382 = (param0->unk_3382 + 1) % 30; -} - -static int ov71_0223C60C(BgConfig *bgConfig, const TouchScreenRect *rect) -{ - int v0 = TouchScreen_CheckRectanglePressed(rect); - - if (v0 != TOUCHSCREEN_INPUT_NONE) { - if (v0 != 0) { - u16 v1 = 0x40; - - if (Bg_DoesPixelAtXYMatchVal(bgConfig, BG_LAYER_MAIN_2, gSystem.touchX, gSystem.touchY, &v1) == 0) { - return TOUCHSCREEN_INPUT_NONE; - } - } else { - return v0; - } - } - - return v0; -} - -static int ov71_0223C654(BgConfig *bgConfig, const TouchScreenRect *rect) -{ - int v0 = TouchScreen_CheckRectangleHeld(rect); - - if (v0 != TOUCHSCREEN_INPUT_NONE) { - if (v0 != 0) { - u16 v1 = 0x40; - - if (Bg_DoesPixelAtXYMatchVal(bgConfig, BG_LAYER_MAIN_2, gSystem.touchX, gSystem.touchY, &v1) == 0) { - return TOUCHSCREEN_INPUT_NONE; - } - } else { - return v0; - } - } - - return v0; -} diff --git a/src/overlay071/ov71_0223CF0C.c b/src/overlay071/ov71_0223CF0C.c deleted file mode 100644 index 8fd6ac2c87..0000000000 --- a/src/overlay071/ov71_0223CF0C.c +++ /dev/null @@ -1,229 +0,0 @@ -#include "overlay071/ov71_0223CF0C.h" - -#include -#include - -#include "overlay071/struct_ov71_0223D238.h" - -#include "char_transfer.h" -#include "gx_layers.h" -#include "heap.h" -#include "narc.h" -#include "pltt_transfer.h" -#include "render_oam.h" -#include "sprite.h" -#include "sprite_resource.h" -#include "sprite_transfer.h" -#include "sprite_util.h" - -typedef struct { - int unk_00; - int unk_04; -} UnkStruct_ov71_0223D73C; - -static const u8 Unk_ov71_0223D6C8[4] = { - 0x1, - 0x2, - 0x1, - 0x1 -}; - -static const UnkStruct_ov71_0223D73C Unk_ov71_0223D73C[] = { - { 0x18, 0x28 }, - { 0x50, 0x28 }, - { 0x88, 0x28 }, - { 0xC0, 0x28 }, - { 0x18, 0x48 }, - { 0x50, 0x48 }, - { 0x88, 0x48 }, - { 0xC0, 0x48 } -}; - -static const UnkStruct_ov71_0223D73C Unk_ov71_0223D6FC[] = { - { 0x18, 0x28 }, - { 0x50, 0x28 }, - { 0x88, 0x28 }, - { 0xC0, 0x28 }, - { 0x18, 0x60 }, - { 0x50, 0x60 }, - { 0x88, 0x60 }, - { 0xC0, 0x60 } -}; - -static void ov71_0223D2F4(void); - -void ov71_0223CF0C(UnkStruct_ov71_0223D238 *param0, NARC *param1) -{ - int v0; - - ov71_0223D2F4(); - NNS_G2dInitOamManagerModule(); - RenderOam_Init(0, 128, 0, 32, 0, 128, 0, 32, 25); - - param0->unk_00 = SpriteList_InitRendering((8 + 8 + 8 + 1), ¶m0->unk_04, HEAP_ID_TRAINER_CARD_SCREEN); - - for (v0 = 0; v0 < 4; v0++) { - param0->unk_190[v0] = SpriteResourceCollection_New(Unk_ov71_0223D6C8[v0], v0, HEAP_ID_TRAINER_CARD_SCREEN); - } - - param0->unk_1A0[0][0] = SpriteResourceCollection_AddTilesFrom(param0->unk_190[0], param1, 33, 0, 1, NNS_G2D_VRAM_TYPE_2DMAIN, HEAP_ID_TRAINER_CARD_SCREEN); - param0->unk_1A0[0][1] = SpriteResourceCollection_AddPaletteFrom(param0->unk_190[1], param1, 14, 0, 1, NNS_G2D_VRAM_TYPE_2DMAIN, 9, HEAP_ID_TRAINER_CARD_SCREEN); - param0->unk_1A0[0][2] = SpriteResourceCollection_AddFrom(param0->unk_190[2], param1, 44, 0, 1, 2, HEAP_ID_TRAINER_CARD_SCREEN); - param0->unk_1A0[0][3] = SpriteResourceCollection_AddFrom(param0->unk_190[3], param1, 46, 0, 1, 3, HEAP_ID_TRAINER_CARD_SCREEN); - - SpriteTransfer_RequestChar(param0->unk_1A0[0][0]); - SpriteTransfer_RequestPlttWholeRange(param0->unk_1A0[0][1]); - - { - u8 v1; - const int v2[8] = { - 16, 17, 18, 19, 20, 21, 22, 23 - }; - - for (v1 = 0; v1 < 8; v1++) { - param0->unk_224[v1] = NARC_AllocAndReadWholeMember(param1, v2[v1], 25); - - if (param0->unk_224[v1] != NULL) { - if (NNS_G2dGetUnpackedPaletteData(param0->unk_224[v1], ¶m0->unk_244[v1]) == 0) { - Heap_Free(param0->unk_244[v1]); - GF_ASSERT(0); - } - } else { - GF_ASSERT(0); - } - } - } - - GXLayers_EngineAToggleLayers(GX_PLANEMASK_OBJ, 1); -} - -void ov71_0223D070(UnkStruct_ov71_0223D238 *param0, const u8 *param1) -{ - int v0; - SpriteResourcesHeader v1; - - SpriteResourcesHeader_Init(&v1, 1, 1, 1, 1, 0xffffffff, 0xffffffff, 0, 1, param0->unk_190[0], param0->unk_190[1], param0->unk_190[2], param0->unk_190[3], NULL, NULL); - - { - u8 v2; - AffineSpriteListTemplate v3; - - v3.list = param0->unk_00; - v3.resourceData = &v1; - v3.position.x = 0; - v3.position.y = 0; - v3.position.z = 0; - v3.affineScale.x = FX32_ONE; - v3.affineScale.y = FX32_ONE; - v3.affineScale.z = FX32_ONE; - v3.affineZRotation = 0; - v3.priority = 2; - v3.vramType = NNS_G2D_VRAM_TYPE_2DMAIN; - v3.heapID = HEAP_ID_TRAINER_CARD_SCREEN; - - for (v0 = 0; v0 < 8; v0++) { - v3.position.x = FX32_ONE * Unk_ov71_0223D73C[v0].unk_00; - v3.position.y = FX32_ONE * Unk_ov71_0223D73C[v0].unk_04; - param0->unk_1C0[v0] = SpriteList_AddAffine(&v3); - Sprite_SetAnimateFlag(param0->unk_1C0[v0], 0); - Sprite_SetAnim(param0->unk_1C0[v0], v0); - - if (!param1[v0]) { - Sprite_SetDrawFlag(param0->unk_1C0[v0], FALSE); - } - } - - { - v2 = 8; - - for (v0 = 0; v0 < 8; v0++) { - v3.position.x = FX32_ONE * Unk_ov71_0223D6FC[v0].unk_00; - v3.position.y = FX32_ONE * Unk_ov71_0223D6FC[v0].unk_04; - v3.priority = 1; - param0->unk_1C0[v2 + v0] = SpriteList_AddAffine(&v3); - Sprite_SetAnimateFlag(param0->unk_1C0[v2 + v0], 1); - Sprite_SetAnim(param0->unk_1C0[v2 + v0], 8); - Sprite_SetDrawFlag(param0->unk_1C0[v2 + v0], FALSE); - } - - v2 += 8; - - for (v0 = 0; v0 < 8; v0++) { - v3.position.x = FX32_ONE * Unk_ov71_0223D6FC[v0].unk_00; - v3.position.y = FX32_ONE * Unk_ov71_0223D6FC[v0].unk_04; - v3.priority = 1; - param0->unk_1C0[v2 + v0] = SpriteList_AddAffine(&v3); - Sprite_SetAnimateFlag(param0->unk_1C0[v2 + v0], 1); - Sprite_SetAnim(param0->unk_1C0[v2 + v0], 9); - Sprite_SetDrawFlag(param0->unk_1C0[v2 + v0], FALSE); - } - } - v2 += 8; - - { - v1.priority = 0; - v3.position.x = FX32_ONE * (12 * 8); - v3.position.y = FX32_ONE * (17 * 8); - v3.priority = 0; - param0->unk_1C0[v2] = SpriteList_AddAffine(&v3); - Sprite_SetAnimateFlag(param0->unk_1C0[v2], 0); - Sprite_SetAnim(param0->unk_1C0[v2], 10); - Sprite_SetDrawFlag(param0->unk_1C0[v2], FALSE); - } - } -} - -void ov71_0223D238(UnkStruct_ov71_0223D238 *param0) -{ - u8 v0; - - for (v0 = 0; v0 < 8; v0++) { - Heap_Free(param0->unk_224[v0]); - } - - SpriteTransfer_ResetCharTransfer(param0->unk_1A0[0][0]); - SpriteTransfer_ResetPlttTransfer(param0->unk_1A0[0][1]); - - for (v0 = 0; v0 < 4; v0++) { - SpriteResourceCollection_Delete(param0->unk_190[v0]); - } - - SpriteList_Delete(param0->unk_00); - RenderOam_Free(); - CharTransfer_Free(); - PlttTransfer_Free(); -} - -void ov71_0223D298(UnkStruct_ov71_0223D238 *param0, const u8 param1, const u8 param2) -{ - NNSG2dImagePaletteProxy *v0; - u32 v1; - u32 v2; - u8 *v3; - - GF_ASSERT(param1 < 8); - GF_ASSERT(param2 <= 3); - - v0 = Sprite_GetPaletteProxy(param0->unk_1C0[param1]); - v1 = NNS_G2dGetImagePaletteLocation(v0, NNS_G2D_VRAM_TYPE_2DMAIN); - v1 += param1 * (16 * 2); - v3 = param0->unk_244[param1]->pRawData; - - DC_FlushRange(&v3[param2 * 16 * 2], 16 * 2); - GX_LoadOBJPltt(&v3[param2 * 16 * 2], v1, 16 * 2); -} - -static void ov71_0223D2F4(void) -{ - { - CharTransferTemplate v0 = { - 1, 2048, 0, 25 - }; - - CharTransfer_Init(&v0); - } - - PlttTransfer_Init(2, HEAP_ID_TRAINER_CARD_SCREEN); - CharTransfer_ClearBuffers(); - PlttTransfer_Clear(); -} diff --git a/src/overlay071/ov71_0223D324.c b/src/overlay071/ov71_0223D324.c deleted file mode 100644 index 955a052713..0000000000 --- a/src/overlay071/ov71_0223D324.c +++ /dev/null @@ -1,156 +0,0 @@ -#include "overlay071/ov71_0223D324.h" - -#include -#include - -#include "overlay071/struct_ov71_0223D324.h" - -#include "sound.h" - -static void ov71_0223D370(UnkStruct_ov71_0223D324 *param0); -static BOOL ov71_0223D3A0(UnkStruct_ov71_0223D324 *param0, const int param1, const u8 param2); -static BOOL ov71_0223D3D8(UnkStruct_ov71_0223D324 *param0, const int param1, const u8 param2); -static BOOL ov71_0223D410(UnkStruct_ov71_0223D324 *param0, const int param1, const u8 param2); -static void ov71_0223D454(UnkStruct_ov71_0223D324 *param0); -static void ov71_0223D42C(UnkStruct_ov71_0223D324 *param0, int param1, int param2, int param3); -static void ov71_0223D470(int param0, const int param1, const u8 param2); - -static const u16 Unk_ov71_0223D77C[8] = { - 0x0, - 0x80, - 0x100, - 0x140, - 0x1C0, - 0x240, - 0x2C0, - 0x300 -}; - -void ov71_0223D324(UnkStruct_ov71_0223D324 *param0) -{ - int v0, v1; - - for (v0 = 0; v0 < 4; v0++) { - param0->unk_00[v0][0] = v0; - param0->unk_00[v0][1] = 0xff; - } - - return; -} - -void ov71_0223D338(UnkStruct_ov71_0223D324 *param0, const int param1, const u8 param2) -{ - int v0; - - ov71_0223D370(param0); - - if (ov71_0223D3A0(param0, param1, param2) == 1) { - return; - } - - if (ov71_0223D3D8(param0, param1, param2) == 1) { - return; - } - - if (ov71_0223D410(param0, param1, param2) == 1) { - return; - } - - return; -} - -static void ov71_0223D370(UnkStruct_ov71_0223D324 *param0) -{ - int v0; - - for (v0 = 0; v0 < 4; v0++) { - if (param0->unk_00[v0][1] != 0xff) { - if (Sound_GetNumberOfPlayingSequencesForPlayer(3 + param0->unk_00[v0][0]) == 0) { - param0->unk_00[v0][1] = 0xff; - } - } - } - - ov71_0223D454(param0); - return; -} - -static BOOL ov71_0223D3A0(UnkStruct_ov71_0223D324 *param0, const int param1, const u8 param2) -{ - int v0; - - for (v0 = 0; v0 < 4; v0++) { - if (param0->unk_00[v0][1] == param1) { - ov71_0223D470(param0->unk_00[v0][0], param1, param2); - ov71_0223D42C(param0, v0, param0->unk_00[v0][0], param1); - return 1; - } - } - - return 0; -} - -static BOOL ov71_0223D3D8(UnkStruct_ov71_0223D324 *param0, const int param1, const u8 param2) -{ - int v0, v1; - - for (v0 = 0; v0 < 4; v0++) { - if (param0->unk_00[v0][1] == 0xff) { - ov71_0223D470(param0->unk_00[v0][0], param1, param2); - - ov71_0223D42C(param0, v0, param0->unk_00[v0][0], param1); - return 1; - } - } - - return 0; -} - -static BOOL ov71_0223D410(UnkStruct_ov71_0223D324 *param0, const int param1, const u8 param2) -{ - int v0 = (4 - 1); - - ov71_0223D470(param0->unk_00[v0][0], param1, param2); - ov71_0223D42C(param0, v0, param0->unk_00[v0][0], param1); - - return 1; -} - -static void ov71_0223D42C(UnkStruct_ov71_0223D324 *param0, int param1, int param2, int param3) -{ - int v0; - - for (v0 = param1; v0 > 0; v0--) { - param0->unk_00[v0][0] = param0->unk_00[v0 - 1][0]; - param0->unk_00[v0][1] = param0->unk_00[v0 - 1][1]; - } - - param0->unk_00[0][0] = param2; - param0->unk_00[0][1] = param3; - - return; -} - -static void ov71_0223D454(UnkStruct_ov71_0223D324 *param0) -{ - int v0; - - for (v0 = 0; v0 < 4; v0++) { - if (param0->unk_00[v0][0] == 0xff) { - param0->unk_00[v0][0] = param0->unk_00[v0 + 1][0]; - param0->unk_00[v0 + 1][0] = 0xff; - } - } - - return; -} - -static void ov71_0223D470(int param0, const int param1, const u8 param2) -{ - int v0 = 152 * (4 - param2); - - Sound_PlaySequenceWithPlayer((3 + param0), (3 + param0), 1684); - Sound_SetPitchForHandle((3 + param0), 0xffff, (Unk_ov71_0223D77C[param1] - v0)); - - return; -} diff --git a/src/overlay084/ov84_0223B5A0.c b/src/overlay084/ov84_0223B5A0.c index f48132a06c..9bb3e58c74 100644 --- a/src/overlay084/ov84_0223B5A0.c +++ b/src/overlay084/ov84_0223B5A0.c @@ -408,7 +408,7 @@ int ov84_0223B5A0(ApplicationManager *appMan, int *param1) v0->unk_00 = BgConfig_New(HEAP_ID_6); v0->unk_425 = TrainerInfo_Gender(v0->unk_CC); - StartScreenFade(FADE_MAIN_THEN_SUB, FADE_TYPE_UNK_3, FADE_TYPE_UNK_3, COLOR_BLACK, 6, 1, HEAP_ID_6); + StartScreenFade(FADE_MAIN_THEN_SUB, FADE_TYPE_DOWNWARD_IN, FADE_TYPE_DOWNWARD_IN, COLOR_BLACK, 6, 1, HEAP_ID_6); SetAutorepeat(3, 8); ov84_0223BEAC(v0); diff --git a/src/overlay093/ov93_021D0D80.c b/src/overlay093/ov93_021D0D80.c index 698b2c7777..017c19bafa 100644 --- a/src/overlay093/ov93_021D0D80.c +++ b/src/overlay093/ov93_021D0D80.c @@ -132,12 +132,12 @@ int ov93_021D0E70(ApplicationManager *appMan, int *param1) 0, 0, 0, - FX32_ONE + FX32_ONE, }; VecFx32 v3 = { FX32_ONE, FX32_ONE, - FX32_ONE + FX32_ONE, }; VecFx32 v4 = { 0, diff --git a/src/overlay093/ov93_021D111C.c b/src/overlay093/ov93_021D111C.c index 6803877126..bf74e87d05 100644 --- a/src/overlay093/ov93_021D111C.c +++ b/src/overlay093/ov93_021D111C.c @@ -133,12 +133,12 @@ int ov93_021D120C(ApplicationManager *appMan, int *param1) 0, 0, 0, - FX32_ONE + FX32_ONE, }; VecFx32 v3 = { FX32_ONE, FX32_ONE, - FX32_ONE + FX32_ONE, }; VecFx32 v4 = { 0, diff --git a/src/overlay097/main_menu_util.c b/src/overlay097/main_menu_util.c index a0c725255d..2a60a43a87 100644 --- a/src/overlay097/main_menu_util.c +++ b/src/overlay097/main_menu_util.c @@ -442,8 +442,8 @@ Sprite *MainMenuUtil_InitSprite(enum DSScreen screen, Sprite *sprite, int x, int template.affineScale.y = FX32_ONE; template.affineScale.z = FX32_ONE; template.affineZRotation = 0; - template.position.x = FX32_ONE *x; - template.position.y = FX32_ONE *y; + template.position.x = FX32_ONE * x; + template.position.y = FX32_ONE * y; template.priority = 10; template.vramType = screen == DS_SCREEN_MAIN ? NNS_G2D_VRAM_TYPE_2DMAIN : NNS_G2D_VRAM_TYPE_2DSUB; template.heapID = utilMan->heapID; diff --git a/src/overlay113/ov113_0225E368.c b/src/overlay113/ov113_0225E368.c index a38f7376f5..73e7ff8d8d 100644 --- a/src/overlay113/ov113_0225E368.c +++ b/src/overlay113/ov113_0225E368.c @@ -242,7 +242,7 @@ static const struct { -FX32_ONE * 16 * (5 + 0), FX32_ONE * 16 * (5 + 0), FX32_ONE * 16 * (3 + 0), - -FX32_ONE * 16 * (3 + 0) + -FX32_ONE * 16 * (3 + 0), }; static const UnkStruct_ov113_02260CAC Unk_ov113_02260CAC[] = { diff --git a/src/overlay117/ov117_02263AF0.c b/src/overlay117/ov117_02263AF0.c index c538e4ab11..602cdca6a1 100644 --- a/src/overlay117/ov117_02263AF0.c +++ b/src/overlay117/ov117_02263AF0.c @@ -296,7 +296,7 @@ static const fx32 Unk_ov117_02266BA4[] = { FX32_ONE, 0x1800, 0xA00, - 0x2000 + 0x2000, }; static const u16 Unk_ov117_02266C54[][4] = { diff --git a/src/pokemon.c b/src/pokemon.c index d895a1d40c..3ecedee257 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4213,7 +4213,7 @@ u8 Pokemon_HasPokerus(Party *party, u8 param1) return result; } -void Party_UpdatePokerusStatus(Party *party, s32 param1) +void Party_UpdatePokerusStatus(Party *party, s32 daysPassed) { int currentPartyCount = Party_GetCurrentCount(party); @@ -4224,10 +4224,10 @@ void Party_UpdatePokerusStatus(Party *party, s32 param1) u8 monPokerus = Pokemon_GetValue(mon, MON_DATA_POKERUS, NULL); if (monPokerus & 0xf) { - if (((monPokerus & 0xf) < param1) || (param1 > 4)) { + if (((monPokerus & 0xf) < daysPassed) || (daysPassed > 4)) { monPokerus &= 0xf0; } else { - monPokerus -= param1; + monPokerus -= daysPassed; } if (monPokerus == 0) { diff --git a/src/screen_fade.c b/src/screen_fade.c index 3d930f621a..27c245fd66 100644 --- a/src/screen_fade.c +++ b/src/screen_fade.c @@ -81,8 +81,8 @@ static const ScreenFadeFunc sScreenFadeFuncs[FADE_TYPE_MAX] = { [FADE_TYPE_BRIGHTNESS_OUT] = sub_0200F85C, [FADE_TYPE_BRIGHTNESS_IN] = sub_0200F878, [FADE_TYPE_UNK_2] = sub_0200F898, - [FADE_TYPE_UNK_3] = sub_0200F8D4, - [FADE_TYPE_UNK_4] = sub_0200F90C, + [FADE_TYPE_DOWNWARD_IN] = sub_0200F8D4, + [FADE_TYPE_UPWARD_OUT] = sub_0200F90C, [FADE_TYPE_UNK_5] = sub_0200F948, [FADE_TYPE_UNK_6] = sub_0200F980, [FADE_TYPE_UNK_7] = sub_0200F9AC, diff --git a/src/start_menu.c b/src/start_menu.c index c0c6a833b5..b07ebe7e0a 100644 --- a/src/start_menu.c +++ b/src/start_menu.c @@ -1356,11 +1356,11 @@ static BOOL StartMenu_TrainerCard(FieldTask *taskMan) menu->taskData = TrainerCard_New(HEAP_ID_FIELDMAP); - TrainerCard_Init(1, 1, 0, 0xff, fieldSystem, (TrainerCard *)menu->taskData); - sub_0203E09C(fieldSystem, (TrainerCard *)menu->taskData); + TrainerCard_Init(TRUE, TRUE, 0, 0xFF, fieldSystem, (TrainerCard *)menu->taskData); + FieldSystem_OpenTrainerCardScreen(fieldSystem, (TrainerCard *)menu->taskData); menu->callback = sub_0203BF00; - return 0; + return FALSE; } static BOOL sub_0203BF00(FieldTask *taskMan) @@ -1368,13 +1368,13 @@ static BOOL sub_0203BF00(FieldTask *taskMan) FieldSystem *fieldSystem = FieldTask_GetFieldSystem(taskMan); StartMenu *menu = FieldTask_GetEnv(taskMan); - sub_020721D4(fieldSystem, (TrainerCard *)menu->taskData); + TrainerCard_SaveBadgePolish(fieldSystem, (TrainerCard *)menu->taskData); TrainerCard_Free((TrainerCard *)menu->taskData); FieldSystem_StartFieldMap(fieldSystem); menu->state = START_MENU_STATE_12; - return 0; + return FALSE; } static BOOL StartMenu_SelectSave(FieldTask *taskMan) diff --git a/src/system_vars.c b/src/system_vars.c index baa2524e1d..927c54539c 100644 --- a/src/system_vars.c +++ b/src/system_vars.c @@ -247,7 +247,7 @@ void SystemVars_RandomizeJubilifeLotteryTrainerID(VarsFlags *varsFlags) #define LOTTERY_LCRNG_INCREMENT 12345 -void SystemVars_SynchronizeJubilifeLotteryTrainerID(SaveData *saveData, u16 trainerID) +void SystemVars_SynchronizeJubilifeLotteryTrainerID(SaveData *saveData, u16 unused) { VarsFlags *varsFlags = SaveData_GetVarsFlags(saveData); u32 recordMixedRand = RecordMixedRNG_GetRand(SaveData_GetRecordMixedRNG(saveData)) * LCRNG_MULTIPLIER + LOTTERY_LCRNG_INCREMENT; diff --git a/src/trainer_card.c b/src/trainer_card.c index ada3d9d0fd..370c2958ef 100644 --- a/src/trainer_card.c +++ b/src/trainer_card.c @@ -10,6 +10,7 @@ #include "field/field_system.h" +#include "badges.h" #include "charcode_util.h" #include "field_system.h" #include "field_task.h" @@ -29,27 +30,31 @@ #include "unk_0205B33C.h" #include "vars_flags.h" +#define TRAINER_CARD_MAX_TIMES_LINKED 999999 +#define TRAINER_CARD_MAX_LINK_BATTLE_RESULTS 9999 +#define TRAINER_CARD_MAX_LINK_TRADES 99999 + typedef struct { int unk_00; TrainerCard *unk_04; } UnkStruct_02072204; -static void sub_02072014(u8 param0, u8 gameVersion, u8 stars, u8 param3, u8 regionCode, TrainerCard *trainerCard); +static void TrainerCard_SetFields(u8 badgesInteractable, u8 gameVersion, u8 stars, u8 gymLeadersToHide, u8 regionCode, TrainerCard *trainerCard); static void TrainerCard_SetTrainerInfo(u16 id, u8 gender, const u16 *name, u32 money, u32 seenPokemon, BOOL pokedexObtained, u32 score, TrainerCard *trainerCard); static void TrainerCard_SetDates(u8 gameCompleted, const PlayTime *playTime, const RTCDate *adventureStartedDate, const RTCDate *hofDebutDate, const RTCTime *hofDebutTime, u8 param5, TrainerCard *trainerCard); -static void TrainerCard_SetLinkDataAndSignature(u32 param0, u32 param1, u32 param2, u32 param3, const u8 *param4, TrainerCard *trainerCard); -static void sub_0207216C(TrainerInfo *param0, FieldSystem *fieldSystem, TrainerCard *trainerCard); +static void TrainerCard_SetLinkDataAndSignature(u32 timesLinked, u32 linkBattleWins, u32 linkBattleLosses, u32 linkTrades, const u8 *signature, TrainerCard *trainerCard); +static void TrainerCard_SetBadgeData(TrainerInfo *trainerInfo, FieldSystem *fieldSystem, TrainerCard *trainerCard); static BOOL sub_02072230(FieldTask *param0); -void TrainerCard_Init(u8 param0, u8 param1, u8 param2, u8 param3, FieldSystem *fieldSystem, TrainerCard *trainerCard) +void TrainerCard_Init(u8 badgesInteractable, u8 liveTimeDisplay, u8 gymLeadersToHide, u8 trainerAppearance, FieldSystem *fieldSystem, TrainerCard *trainerCard) { SaveData *saveData = FieldSystem_GetSaveData(fieldSystem); TrainerInfo *trainerInfo = SaveData_GetTrainerInfo(saveData); GameRecords *gameRecords = SaveData_GetGameRecords(saveData); - trainerCard->unk_05 = param3; + trainerCard->trainerAppearance = trainerAppearance; - sub_02072014(param0, GAME_VERSION, TrainerCard_CalculateStars(fieldSystem), param2, TrainerInfo_RegionCode(trainerInfo), trainerCard); + TrainerCard_SetFields(badgesInteractable, GAME_VERSION, TrainerCard_CalculateStars(fieldSystem), gymLeadersToHide, TrainerInfo_RegionCode(trainerInfo), trainerCard); TrainerCard_SetTrainerInfo(TrainerInfo_ID_LowHalf(trainerInfo), TrainerInfo_Gender(trainerInfo), TrainerInfo_Name(trainerInfo), TrainerInfo_Money(trainerInfo), Pokedex_CountSeen(SaveData_GetPokedex(fieldSystem->saveData)), Pokedex_IsObtained(SaveData_GetPokedex(fieldSystem->saveData)), GameRecords_GetTrainerScore(gameRecords), trainerCard); @@ -60,7 +65,7 @@ void TrainerCard_Init(u8 param0, u8 param1, u8 param2, u8 param3, FieldSystem *f FieldSystem_GetStartTimestamp(fieldSystem, &adventureStartedDate, &firstCompletionTime); FieldSystem_GetFirstCompletionTimestamp(fieldSystem, &firstCompletionDate, &firstCompletionTime); - TrainerCard_SetDates(SystemFlag_CheckGameCompleted(SaveData_GetVarsFlags(fieldSystem->saveData)), playTime, &adventureStartedDate, &firstCompletionDate, &firstCompletionTime, param1, trainerCard); + TrainerCard_SetDates(SystemFlag_CheckGameCompleted(SaveData_GetVarsFlags(fieldSystem->saveData)), playTime, &adventureStartedDate, &firstCompletionDate, &firstCompletionTime, liveTimeDisplay, trainerCard); TrainerCardSaveData *tcSaveData = SaveData_GetTrainerCardSaveData(fieldSystem->saveData); u32 timesLinked = GameRecords_GetRecordValue(gameRecords, RECORD_UNK_091) + GameRecords_GetRecordValue(gameRecords, RECORD_LOCAL_LINK_TRADES) + GameRecords_GetRecordValue(gameRecords, RECORD_WIFI_TRADES) + GameRecords_GetRecordValue(gameRecords, RECORD_UNK_020) + GameRecords_GetRecordValue(gameRecords, RECORD_UNK_025) + GameRecords_GetRecordValue(gameRecords, RECORD_UNK_032); @@ -70,13 +75,13 @@ void TrainerCard_Init(u8 param0, u8 param1, u8 param2, u8 param3, FieldSystem *f TrainerCard_SetLinkDataAndSignature(timesLinked, linkBattleWins, linkBattleLosses, linkTrades, TrainerCardSaveData_GetSignature(tcSaveData), trainerCard); - sub_0207216C(trainerInfo, fieldSystem, trainerCard); + TrainerCard_SetBadgeData(trainerInfo, fieldSystem, trainerCard); int i, checksum = 0; - u8 *v15 = (u8 *)trainerCard; + u8 *buffer = (u8 *)trainerCard; for (i = 0; i < sizeof(TrainerCard); i++) { - checksum ^= v15[i]; + checksum ^= buffer[i]; } trainerCard->checksum = checksum; @@ -131,13 +136,13 @@ u8 TrainerCard_CalculateStars(FieldSystem *fieldSystem) return trainerCardStars; } -static void sub_02072014(u8 param0, u8 gameVersion, u8 stars, u8 param3, u8 regionCode, TrainerCard *trainerCard) +static void TrainerCard_SetFields(u8 badgesInteractable, u8 gameVersion, u8 stars, u8 gymLeadersToHide, u8 regionCode, TrainerCard *trainerCard) { - trainerCard->unk_04_0 = param0; + trainerCard->badgesInteractable = badgesInteractable; trainerCard->gameVersion = gameVersion; trainerCard->stars = stars; trainerCard->regionCode = regionCode; - trainerCard->unk_02 = param3; + trainerCard->gymLeadersToHide_Unused = gymLeadersToHide; } static void TrainerCard_SetTrainerInfo(u16 id, u8 gender, const u16 *name, u32 money, u32 seenPokemon, BOOL pokedexObtained, u32 score, TrainerCard *trainerCard) @@ -153,7 +158,7 @@ static void TrainerCard_SetTrainerInfo(u16 id, u8 gender, const u16 *name, u32 m trainerCard->score = score; } -static void TrainerCard_SetDates(u8 gameCompleted, const PlayTime *playTime, const RTCDate *adventureStartedDate, const RTCDate *firstCompletionDate, const RTCTime *firstCompletionTime, const u8 param5, TrainerCard *trainerCard) +static void TrainerCard_SetDates(u8 gameCompleted, const PlayTime *playTime, const RTCDate *adventureStartedDate, const RTCDate *firstCompletionDate, const RTCTime *firstCompletionTime, const u8 liveTimeDisplay, TrainerCard *trainerCard) { trainerCard->playTimeHours = PlayTime_GetHours(playTime); trainerCard->playTimeMinutes = PlayTime_GetMinutes(playTime); @@ -175,9 +180,9 @@ static void TrainerCard_SetDates(u8 gameCompleted, const PlayTime *playTime, con trainerCard->hofDebutMinute = 0; } - trainerCard->unk_04_1 = param5; + trainerCard->liveTimeDisplay = liveTimeDisplay; - if (param5) { + if (liveTimeDisplay) { trainerCard->playTime = playTime; } else { trainerCard->playTime = NULL; @@ -188,55 +193,55 @@ static void TrainerCard_SetLinkDataAndSignature(u32 timesLinked, u32 linkBattleW { trainerCard->timesLinked = timesLinked; - if (trainerCard->timesLinked > 999999) { - trainerCard->timesLinked = 999999; + if (trainerCard->timesLinked > TRAINER_CARD_MAX_TIMES_LINKED) { + trainerCard->timesLinked = TRAINER_CARD_MAX_TIMES_LINKED; } trainerCard->linkBattleWins = linkBattleWins; trainerCard->linkBattleLosses = linkBattleLosses; - if (trainerCard->linkBattleWins > 9999) { - trainerCard->linkBattleWins = 9999; + if (trainerCard->linkBattleWins > TRAINER_CARD_MAX_LINK_BATTLE_RESULTS) { + trainerCard->linkBattleWins = TRAINER_CARD_MAX_LINK_BATTLE_RESULTS; } - if (trainerCard->linkBattleLosses > 9999) { - trainerCard->linkBattleLosses = 9999; + if (trainerCard->linkBattleLosses > TRAINER_CARD_MAX_LINK_BATTLE_RESULTS) { + trainerCard->linkBattleLosses = TRAINER_CARD_MAX_LINK_BATTLE_RESULTS; } trainerCard->linkTrades = linkTrades; - if (trainerCard->linkTrades > 99999) { - trainerCard->linkTrades = 99999; + if (trainerCard->linkTrades > TRAINER_CARD_MAX_LINK_TRADES) { + trainerCard->linkTrades = TRAINER_CARD_MAX_LINK_TRADES; } - MI_CpuCopy8(signature, trainerCard->signature, 24 * 8 * 8); + MI_CpuCopy8(signature, trainerCard->signature, SIGNATURE_WIDTH * SIGNATURE_HEIGHT * 8); } -static void sub_0207216C(TrainerInfo *param0, FieldSystem *fieldSystem, TrainerCard *trainerCard) +static void TrainerCard_SetBadgeData(TrainerInfo *trainerInfo, FieldSystem *fieldSystem, TrainerCard *trainerCard) { - u8 v0; - TrainerCardSaveData *v1 = SaveData_GetTrainerCardSaveData(fieldSystem->saveData); - TrainerCardBadge *v2 = TrainerCardSaveData_GetTrainerCardBadges(v1); + u8 badgeID; + TrainerCardSaveData *tcSaveData = SaveData_GetTrainerCardSaveData(fieldSystem->saveData); + TrainerCardSaveDataBadge *badges = TrainerCardSaveData_GetTrainerCardSaveDataBadges(tcSaveData); - for (v0 = 0; v0 < 8; v0++) { - if (TrainerInfo_HasBadge(param0, v0)) { - trainerCard->unk_48[v0].unk_00_0 = 1; + for (badgeID = 0; badgeID < MAX_BADGES; badgeID++) { + if (TrainerInfo_HasBadge(trainerInfo, badgeID)) { + trainerCard->badges[badgeID].obtained = TRUE; } else { - trainerCard->unk_48[v0].unk_00_0 = 0; + trainerCard->badges[badgeID].obtained = FALSE; } - trainerCard->unk_48[v0].unk_00_1 = TrainerCardBadge_GetCleanliness(v0, v2); + trainerCard->badges[badgeID].polish = TrainerCardSaveDataBadge_GetPolish(badgeID, badges); } } -void sub_020721D4(FieldSystem *fieldSystem, const TrainerCard *trainerCard) +void TrainerCard_SaveBadgePolish(FieldSystem *fieldSystem, const TrainerCard *trainerCard) { - u8 v0; - TrainerCardSaveData *v1 = SaveData_GetTrainerCardSaveData(fieldSystem->saveData); - TrainerCardBadge *v2 = TrainerCardSaveData_GetTrainerCardBadges(v1); + u8 badgeID; + TrainerCardSaveData *tcSaveData = SaveData_GetTrainerCardSaveData(fieldSystem->saveData); + TrainerCardSaveDataBadge *badges = TrainerCardSaveData_GetTrainerCardSaveDataBadges(tcSaveData); - for (v0 = 0; v0 < 8; v0++) { - TrainerCardBadge_SetCleanliness(v0, trainerCard->unk_48[v0].unk_00_1, v2); + for (badgeID = 0; badgeID < MAX_BADGES; badgeID++) { + TrainerCardSaveDataBadge_SetPolish(badgeID, trainerCard->badges[badgeID].polish, badges); } } @@ -265,7 +270,7 @@ static BOOL sub_02072230(FieldTask *param0) } break; case 10: - sub_0203E09C(fieldSystem, v1->unk_04); + FieldSystem_OpenTrainerCardScreen(fieldSystem, v1->unk_04); v1->unk_00 = 11; break; case 11: diff --git a/src/trainer_card_badge_dirt.c b/src/trainer_card_badge_dirt.c new file mode 100644 index 0000000000..b03b96b153 --- /dev/null +++ b/src/trainer_card_badge_dirt.c @@ -0,0 +1,43 @@ +#include "trainer_card_badge_dirt.h" + +#include +#include + +#include "badges.h" +#include "save_player.h" +#include "savedata.h" +#include "trainer_card.h" +#include "trainer_card_save_data.h" +#include "trainer_info.h" + +void TrainerCard_AccumulateBadgeDirt(SaveData *saveData, s32 daysPassed) +{ + if (daysPassed <= 0) { + return; + } + + TrainerCardSaveData *tcSaveData = SaveData_GetTrainerCardSaveData(saveData); + TrainerCardSaveDataBadge *badges = TrainerCardSaveData_GetTrainerCardSaveDataBadges(tcSaveData); + TrainerInfo *trainerInfo = SaveData_GetTrainerInfo(saveData); + + for (u8 badgeID = 0; badgeID < MAX_BADGES; badgeID++) { + if (TrainerInfo_HasBadge(trainerInfo, badgeID) == 0) { + continue; + } + + int polish = TrainerCardSaveDataBadge_GetPolish(badgeID, badges); + + if (0 < polish && polish < MAX_BADGE_POLISH + 1) { + polish -= (10 * daysPassed); + } else { + GF_ASSERT(polish < MAX_BADGE_POLISH + 1); + polish = 0; + } + + if (polish < 0) { + polish = 0; + } + + TrainerCardSaveDataBadge_SetPolish(badgeID, polish, badges); + } +} diff --git a/src/trainer_card_save_data.c b/src/trainer_card_save_data.c index 10bf63abdd..1b65d12762 100644 --- a/src/trainer_card_save_data.c +++ b/src/trainer_card_save_data.c @@ -15,12 +15,12 @@ void TrainerCardSaveData_Init(TrainerCardSaveData *tcSaveData) memset(tcSaveData, 0, sizeof(TrainerCardSaveData)); int badgeID; - TrainerCardBadge *badges; + TrainerCardSaveDataBadge *badges; - badges = TrainerCardSaveData_GetTrainerCardBadges(tcSaveData); + badges = TrainerCardSaveData_GetTrainerCardSaveDataBadges(tcSaveData); for (badgeID = 0; badgeID < MAX_BADGES; badgeID++) { - TrainerCardBadge_SetCleanliness(badgeID, 140, badges); + TrainerCardSaveDataBadge_SetPolish(badgeID, BADGE_POLISH_THRESHOLD_NORMAL, badges); } } @@ -34,17 +34,17 @@ u8 *TrainerCardSaveData_GetSignature(TrainerCardSaveData *tcSaveData) return tcSaveData->signature; } -TrainerCardBadge *TrainerCardSaveData_GetTrainerCardBadges(TrainerCardSaveData *tcSaveData) +TrainerCardSaveDataBadge *TrainerCardSaveData_GetTrainerCardSaveDataBadges(TrainerCardSaveData *tcSaveData) { return tcSaveData->badges; } -int TrainerCardBadge_GetCleanliness(const u8 badgeID, TrainerCardBadge *badges) +int TrainerCardSaveDataBadge_GetPolish(u8 badgeID, TrainerCardSaveDataBadge *badges) { - return badges[badgeID].cleanliness; + return badges[badgeID].polish; } -void TrainerCardBadge_SetCleanliness(const u8 badgeID, const int cleanliness, TrainerCardBadge *badges) +void TrainerCardSaveDataBadge_SetPolish(u8 badgeID, int polish, TrainerCardSaveDataBadge *badges) { - badges[badgeID].cleanliness = cleanliness; + badges[badgeID].polish = polish; } diff --git a/src/trainer_card_screen/trainer_card_badge_chimes.c b/src/trainer_card_screen/trainer_card_badge_chimes.c new file mode 100644 index 0000000000..59dbcbf73e --- /dev/null +++ b/src/trainer_card_screen/trainer_card_badge_chimes.c @@ -0,0 +1,139 @@ +#include "trainer_card_screen/trainer_card_badge_chimes.h" + +#include +#include + +#include "trainer_card_screen/trainer_card_screen.h" +#include "trainer_card_screen/trainer_card_screen_defs.h" + +#include "badges.h" +#include "sound.h" + +#define SFX_PLAYER_INDEX 0 +#define ACTIVE_BADGE_CHIME 1 + +#define NO_BADGE_CHIME 0xFF + +static void TrainerCard_CheckBadgeChimesFinishedPlaying(TrainerCardBadgeChimeState *badgeChimeState); +static BOOL TrainerCard_FindSoundEffectPlayerWithSameBadgeChime(TrainerCardBadgeChimeState *badgeChimeState, int badgeID, u8 polishLevel); +static BOOL TrainerCard_FindFreeSoundEffectPlayer(TrainerCardBadgeChimeState *badgeChimeState, int badgeID, u8 polishLevel); +static BOOL TrainerCard_GetLeastRecentlyUsedSoundEffectPlayer(TrainerCardBadgeChimeState *badgeChimeState, int badgeID, u8 polishLevel); +static void TrainerCard_DoNothing(TrainerCardBadgeChimeState *badgeChimeState); +static void TrainerCard_FlagSoundEffectPlayerAsInUse(TrainerCardBadgeChimeState *badgeChimeState, int index, int sfxPlayerIndex, int badgeID); +static void TrainerCard_PlayBadgeChimeSoundEffect(int badgeChimeState, int badgeID, u8 polishLevel); + +static const u16 sBadgeChimeBasePitches[MAX_BADGES] = { + [BADGE_ID_COAL] = 0, + [BADGE_ID_FOREST] = 128, + [BADGE_ID_COBBLE] = 256, + [BADGE_ID_FEN] = 320, + [BADGE_ID_RELIC] = 448, + [BADGE_ID_MINE] = 576, + [BADGE_ID_ICICLE] = 704, + [BADGE_ID_BEACON] = 768 +}; + +void TrainerCard_InitBadgeChimeState(TrainerCardBadgeChimeState *badgeChimeState) +{ + for (int i = 0; i < NUM_SE_PLAYERS; i++) { + badgeChimeState->badgeChimePlayers[i][SFX_PLAYER_INDEX] = i; + badgeChimeState->badgeChimePlayers[i][ACTIVE_BADGE_CHIME] = NO_BADGE_CHIME; + } +} + +void TrainerCard_PlayBadgeChime(TrainerCardBadgeChimeState *badgeChimeState, int badgeID, u8 polishLevel) +{ + TrainerCard_CheckBadgeChimesFinishedPlaying(badgeChimeState); + + if (TrainerCard_FindSoundEffectPlayerWithSameBadgeChime(badgeChimeState, badgeID, polishLevel) == TRUE) { + return; + } + + if (TrainerCard_FindFreeSoundEffectPlayer(badgeChimeState, badgeID, polishLevel) == TRUE) { + return; + } + + if (TrainerCard_GetLeastRecentlyUsedSoundEffectPlayer(badgeChimeState, badgeID, polishLevel) == TRUE) { + return; + } +} + +static void TrainerCard_CheckBadgeChimesFinishedPlaying(TrainerCardBadgeChimeState *badgeChimeState) +{ + for (int i = 0; i < NUM_SE_PLAYERS; i++) { + if (badgeChimeState->badgeChimePlayers[i][ACTIVE_BADGE_CHIME] != NO_BADGE_CHIME) { + if (Sound_GetNumberOfPlayingSequencesForPlayer(PLAYER_SE_1 + badgeChimeState->badgeChimePlayers[i][SFX_PLAYER_INDEX]) == 0) { + badgeChimeState->badgeChimePlayers[i][ACTIVE_BADGE_CHIME] = NO_BADGE_CHIME; + } + } + } + + TrainerCard_DoNothing(badgeChimeState); +} + +static BOOL TrainerCard_FindSoundEffectPlayerWithSameBadgeChime(TrainerCardBadgeChimeState *badgeChimeState, int badgeID, u8 polishLevel) +{ + for (int i = 0; i < NUM_SE_PLAYERS; i++) { + if (badgeChimeState->badgeChimePlayers[i][ACTIVE_BADGE_CHIME] == badgeID) { + TrainerCard_PlayBadgeChimeSoundEffect(badgeChimeState->badgeChimePlayers[i][SFX_PLAYER_INDEX], badgeID, polishLevel); + TrainerCard_FlagSoundEffectPlayerAsInUse(badgeChimeState, i, badgeChimeState->badgeChimePlayers[i][SFX_PLAYER_INDEX], badgeID); + return TRUE; + } + } + + return FALSE; +} + +static BOOL TrainerCard_FindFreeSoundEffectPlayer(TrainerCardBadgeChimeState *badgeChimeState, int badgeID, u8 polishLevel) +{ + for (int i = 0; i < NUM_SE_PLAYERS; i++) { + if (badgeChimeState->badgeChimePlayers[i][ACTIVE_BADGE_CHIME] == NO_BADGE_CHIME) { + TrainerCard_PlayBadgeChimeSoundEffect(badgeChimeState->badgeChimePlayers[i][SFX_PLAYER_INDEX], badgeID, polishLevel); + TrainerCard_FlagSoundEffectPlayerAsInUse(badgeChimeState, i, badgeChimeState->badgeChimePlayers[i][SFX_PLAYER_INDEX], badgeID); + return TRUE; + } + } + + return FALSE; +} + +static BOOL TrainerCard_GetLeastRecentlyUsedSoundEffectPlayer(TrainerCardBadgeChimeState *badgeChimeState, int badgeID, u8 polishLevel) +{ + int index = NUM_SE_PLAYERS - 1; + + TrainerCard_PlayBadgeChimeSoundEffect(badgeChimeState->badgeChimePlayers[index][SFX_PLAYER_INDEX], badgeID, polishLevel); + TrainerCard_FlagSoundEffectPlayerAsInUse(badgeChimeState, index, badgeChimeState->badgeChimePlayers[index][SFX_PLAYER_INDEX], badgeID); + + return TRUE; +} + +static void TrainerCard_FlagSoundEffectPlayerAsInUse(TrainerCardBadgeChimeState *badgeChimeState, int index, int sfxPlayerIndex, int badgeID) +{ + for (int i = index; i > 0; i--) { + badgeChimeState->badgeChimePlayers[i][SFX_PLAYER_INDEX] = badgeChimeState->badgeChimePlayers[i - 1][SFX_PLAYER_INDEX]; + badgeChimeState->badgeChimePlayers[i][ACTIVE_BADGE_CHIME] = badgeChimeState->badgeChimePlayers[i - 1][ACTIVE_BADGE_CHIME]; + } + + badgeChimeState->badgeChimePlayers[0][SFX_PLAYER_INDEX] = sfxPlayerIndex; + badgeChimeState->badgeChimePlayers[0][ACTIVE_BADGE_CHIME] = badgeID; +} + +static void TrainerCard_DoNothing(TrainerCardBadgeChimeState *badgeChimeState) +{ + for (int i = 0; i < NUM_SE_PLAYERS; i++) { + if (badgeChimeState->badgeChimePlayers[i][SFX_PLAYER_INDEX] == NO_BADGE_CHIME) { + // bug: this function uses the wrong index and therefore the above condition is never met + // good thing too because there's an out of bounds array access in here + badgeChimeState->badgeChimePlayers[i][SFX_PLAYER_INDEX] = badgeChimeState->badgeChimePlayers[i + 1][SFX_PLAYER_INDEX]; + badgeChimeState->badgeChimePlayers[i + 1][SFX_PLAYER_INDEX] = NO_BADGE_CHIME; + } + } +} + +static void TrainerCard_PlayBadgeChimeSoundEffect(int sfxPlayerIndex, int badgeID, u8 polishLevel) +{ + int pitchModifier = 152 * (BADGE_POLISH_LEVEL_4_SPARKLES - polishLevel); + + Sound_PlaySequenceWithPlayer(SOUND_HANDLE_TYPE_SFX_1 + sfxPlayerIndex, PLAYER_SE_1 + sfxPlayerIndex, SEQ_SE_DP_BADGE_C); + Sound_SetPitchForHandle(SOUND_HANDLE_TYPE_SFX_1 + sfxPlayerIndex, SOUND_PLAYBACK_TRACK_ALL, sBadgeChimeBasePitches[badgeID] - pitchModifier); +} diff --git a/src/overlay071/trainer_card_display_text.c b/src/trainer_card_screen/trainer_card_display_text.c similarity index 92% rename from src/overlay071/trainer_card_display_text.c rename to src/trainer_card_screen/trainer_card_display_text.c index a3ad9a6005..ab307861aa 100644 --- a/src/overlay071/trainer_card_display_text.c +++ b/src/trainer_card_screen/trainer_card_display_text.c @@ -1,11 +1,11 @@ -#include "overlay071/trainer_card_display_text.h" +#include "trainer_card_screen/trainer_card_display_text.h" #include #include #include "constants/heap.h" -#include "overlay071/struct_ov71_0223B620.h" +#include "trainer_card_screen/trainer_card_screen_defs.h" #include "bg_window.h" #include "font.h" @@ -22,8 +22,8 @@ #define TRAINER_CARD_WINDOW_FULL_WIDTH 28 #define TRAINER_CARD_WINDOW_HEIGHT 2 -static void TrainerCard_DrawNumber(Window *window, const u32 windowWidth, const u32 endXOffset, const u32 yOffset, Strbuf *strbuf, const u32 num, const u8 maxDigits, enum PaddingMode paddingMode); -static void TrainerCard_DrawString(Window *window, const u32 windowWidth, const u32 endXOffset, const u32 yOffset, const Strbuf *strbuf); +static void TrainerCard_DrawNumber(Window *window, u32 windowWidth, u32 endXOffset, u32 yOffset, Strbuf *strbuf, u32 num, u8 maxDigits, enum PaddingMode paddingMode); +static void TrainerCard_DrawString(Window *window, u32 windowWidth, u32 endXOffset, u32 yOffset, const Strbuf *strbuf); static const WindowTemplate sTrainerCardWindowTemplates[] = { [TRAINER_CARD_WINDOW_ID] = { @@ -211,7 +211,7 @@ void TrainerCard_DrawFrontText(Window *windows, const TrainerCard *trainerCard) TrainerCard_DrawNumber(&windows[TRAINER_CARD_WINDOW_SCORE], TRAINER_CARD_WINDOW_PARTIAL_WIDTH * TILE_WIDTH_PIXELS, 0, 0, strbuf, trainerCard->score, 9, PADDING_MODE_SPACES); - if (trainerCard->unk_04_1) { + if (trainerCard->liveTimeDisplay) { StringTemplate_SetNumber(template, 0, PlayTime_GetHours(trainerCard->playTime), 3, PADDING_MODE_SPACES, CHARSET_MODE_EN); StringTemplate_SetNumber(template, 1, PlayTime_GetMinutes(trainerCard->playTime), 2, PADDING_MODE_ZEROES, CHARSET_MODE_EN); MessageLoader_GetStrbuf(messageLoader, TrainerCard_Text_Format_HHMMWithoutColon, fmtString); @@ -277,17 +277,17 @@ void TrainerCard_DrawBackText(Window *windows, const TrainerCard *trainerCard) MessageLoader_GetStrbuf(messageLoader, TrainerCard_Text_BlankDate, strbuf); } - u32 xOffset = TRAINER_CARD_WINDOW_FULL_WIDTH * TILE_WIDTH_PIXELS - Font_CalcStrbufWidth(0, strbuf, 0); + u32 xOffset = TRAINER_CARD_WINDOW_FULL_WIDTH * TILE_WIDTH_PIXELS - Font_CalcStrbufWidth(FONT_SYSTEM, strbuf, 0); Text_AddPrinterWithParamsAndColor(&windows[TRAINER_CARD_WINDOW_HOF_DEBUT], FONT_SYSTEM, strbuf, xOffset, 0, TEXT_SPEED_INSTANT, TEXT_COLOR(1, 2, 0), NULL); MessageLoader_GetStrbuf(messageLoader, TrainerCard_Text_Format_HHMMWithColon, fmtString); StringTemplate_Format(template, strbuf, fmtString); - xOffset = TRAINER_CARD_WINDOW_FULL_WIDTH * TILE_WIDTH_PIXELS - Font_CalcStrbufWidth(0, strbuf, 0); + xOffset = TRAINER_CARD_WINDOW_FULL_WIDTH * TILE_WIDTH_PIXELS - Font_CalcStrbufWidth(FONT_SYSTEM, strbuf, 0); Text_AddPrinterWithParamsAndColor(&windows[TRAINER_CARD_WINDOW_HOF_DEBUT], FONT_SYSTEM, strbuf, xOffset, 16, TEXT_SPEED_INSTANT, TEXT_COLOR(1, 2, 0), NULL); StringTemplate_SetNumber(template, 5, trainerCard->timesLinked, 6, PADDING_MODE_NONE, CHARSET_MODE_EN); MessageLoader_GetStrbuf(messageLoader, TrainerCard_Text_Format_Number_2, fmtString); StringTemplate_Format(template, strbuf, fmtString); - xOffset = TRAINER_CARD_WINDOW_FULL_WIDTH * TILE_WIDTH_PIXELS - Font_CalcStrbufWidth(0, strbuf, 0); + xOffset = TRAINER_CARD_WINDOW_FULL_WIDTH * TILE_WIDTH_PIXELS - Font_CalcStrbufWidth(FONT_SYSTEM, strbuf, 0); Text_AddPrinterWithParamsAndColor(&windows[TRAINER_CARD_WINDOW_TIMES_LINKED], FONT_SYSTEM, strbuf, xOffset, 0, TEXT_SPEED_INSTANT, TEXT_COLOR(1, 2, 0), NULL); MessageLoader_GetStrbuf(messageLoader, TrainerCard_Text_W, strbuf); @@ -300,8 +300,8 @@ void TrainerCard_DrawBackText(Window *windows, const TrainerCard *trainerCard) StringTemplate_SetNumber(template, 5, trainerCard->linkTrades, 6, PADDING_MODE_NONE, CHARSET_MODE_EN); MessageLoader_GetStrbuf(messageLoader, TrainerCard_Text_Format_Number_2, fmtString); StringTemplate_Format(template, strbuf, fmtString); - xOffset = TRAINER_CARD_WINDOW_FULL_WIDTH * TILE_WIDTH_PIXELS - Font_CalcStrbufWidth(0, strbuf, 0); - Text_AddPrinterWithParamsAndColor(&windows[TRAINER_CARD_WINDOW_LINK_TRADES], FONT_SYSTEM, strbuf, xOffset, 0, 0, TEXT_COLOR(1, 2, 0), NULL); + xOffset = TRAINER_CARD_WINDOW_FULL_WIDTH * TILE_WIDTH_PIXELS - Font_CalcStrbufWidth(FONT_SYSTEM, strbuf, 0); + Text_AddPrinterWithParamsAndColor(&windows[TRAINER_CARD_WINDOW_LINK_TRADES], FONT_SYSTEM, strbuf, xOffset, 0, TEXT_SPEED_INSTANT, TEXT_COLOR(1, 2, 0), NULL); Strbuf_Free(fmtString); StringTemplate_Free(template); @@ -309,23 +309,21 @@ void TrainerCard_DrawBackText(Window *windows, const TrainerCard *trainerCard) MessageLoader_Free(messageLoader); } -void TrainerCard_ClearWindows(Window *windows, const u8 start, const u8 end) +void TrainerCard_ClearWindows(Window *windows, u8 start, u8 end) { - u8 i; - - for (i = start; i <= end; i++) { + for (u8 i = start; i <= end; i++) { Window_ClearAndCopyToVRAM(&windows[i]); } } -static void TrainerCard_DrawNumber(Window *window, const u32 windowWidth, const u32 endXOffset, const u32 yOffset, Strbuf *strbuf, const u32 num, const u8 maxDigits, enum PaddingMode paddingMode) +static void TrainerCard_DrawNumber(Window *window, u32 windowWidth, u32 endXOffset, u32 yOffset, Strbuf *strbuf, u32 num, u8 maxDigits, enum PaddingMode paddingMode) { Strbuf_FormatInt(strbuf, num, maxDigits, paddingMode, CHARSET_MODE_EN); u32 width = Font_CalcStrbufWidth(FONT_SYSTEM, strbuf, 0); Text_AddPrinterWithParamsAndColor(window, FONT_SYSTEM, strbuf, windowWidth - (width + endXOffset), yOffset, TEXT_SPEED_INSTANT, TEXT_COLOR(1, 2, 0), NULL); } -static void TrainerCard_DrawString(Window *window, const u32 windowWidth, const u32 endXOffset, const u32 yOffset, const Strbuf *strbuf) +static void TrainerCard_DrawString(Window *window, u32 windowWidth, u32 endXOffset, u32 yOffset, const Strbuf *strbuf) { u32 width = Font_CalcStrbufWidth(FONT_SYSTEM, strbuf, 0); Text_AddPrinterWithParamsAndColor(window, FONT_SYSTEM, strbuf, windowWidth - (width + endXOffset), yOffset, TEXT_SPEED_INSTANT, TEXT_COLOR(1, 2, 0), NULL); @@ -348,8 +346,8 @@ void TrainerCard_DrawUpdatedTime(Window *windows, const TrainerCard *trainerCard Strbuf *fmtString = Strbuf_Init(32, HEAP_ID_TRAINER_CARD_SCREEN); StringTemplate *template = StringTemplate_New(2, 32, HEAP_ID_TRAINER_CARD_SCREEN); - StringTemplate_SetNumber(template, 0, PlayTime_GetHours(trainerCard->playTime), 3, 1, 1); - StringTemplate_SetNumber(template, 1, PlayTime_GetMinutes(trainerCard->playTime), 2, 2, 1); + StringTemplate_SetNumber(template, 0, PlayTime_GetHours(trainerCard->playTime), 3, PADDING_MODE_SPACES, CHARSET_MODE_EN); + StringTemplate_SetNumber(template, 1, PlayTime_GetMinutes(trainerCard->playTime), 2, PADDING_MODE_ZEROES, CHARSET_MODE_EN); MessageLoader_GetStrbuf(messageLoader, TrainerCard_Text_Format_HHMMWithoutColon, fmtString); StringTemplate_Format(template, strbuf, fmtString); u32 xOffset = TRAINER_CARD_WINDOW_FULL_WIDTH * TILE_WIDTH_PIXELS - Font_CalcStrbufWidth(FONT_SYSTEM, strbuf, 0); @@ -361,7 +359,7 @@ void TrainerCard_DrawUpdatedTime(Window *windows, const TrainerCard *trainerCard StringTemplate_Free(template); } -void TrainerCard_BlinkPlaytimeColon(Window *window, const BOOL showColon, Strbuf *strbuf) +void TrainerCard_BlinkPlaytimeColon(Window *window, BOOL showColon, Strbuf *strbuf) { if (showColon) { Text_AddPrinterWithParamsAndColor(window, FONT_SYSTEM, strbuf, 205, 0, TEXT_SPEED_INSTANT, TEXT_COLOR(1, 2, 0), NULL); diff --git a/src/trainer_card_screen/trainer_card_screen.c b/src/trainer_card_screen/trainer_card_screen.c new file mode 100644 index 0000000000..affa5ec88e --- /dev/null +++ b/src/trainer_card_screen/trainer_card_screen.c @@ -0,0 +1,1323 @@ +#include "trainer_card_screen/trainer_card_screen.h" + +#include +#include + +#include "generated/genders.h" + +#include "struct_defs/struct_02099F80.h" + +#include "trainer_card_screen/trainer_card_display_text.h" +#include "trainer_card_screen/trainer_card_screen_defs.h" +#include "trainer_card_screen/trainer_card_sprites.h" + +#include "badges.h" +#include "bg_window.h" +#include "graphics.h" +#include "gx_layers.h" +#include "heap.h" +#include "message.h" +#include "narc.h" +#include "overlay_manager.h" +#include "render_oam.h" +#include "screen_fade.h" +#include "sound.h" +#include "sound_playback.h" +#include "sprite.h" +#include "strbuf.h" +#include "system.h" +#include "touch_pad.h" +#include "touch_screen.h" +#include "unk_020393C8.h" +#include "vram_transfer.h" + +#include "res/text/bank/trainer_card.h" + +enum TrainerCardStates { + STATE_INITIAL, + STATE_MAIN, + STATE_EXIT, + STATE_FLIP_CARD, + STATE_OPEN_CLOSE_BADGE_CASE +}; + +enum TrainerCardFlipSubStates { + FLIP_SUBSTATE_INITIAL, + FLIP_SUBSTATE_SCALE_DOWN, + FLIP_SUBSTATE_DRAW_OTHER_SIDE, + FLIP_SUBSTATE_SCALE_UP +}; + +enum BadgeCaseOpenCloseSubStates { + CASE_SUBSTATE_INITIAL, + CASE_SUBSTATE_OPEN, + CASE_SUBSTATE_CLOSE, + CASE_SUBSTATE_DONE +}; + +enum BadgeCaseTouchRectangles { + TOUCH_RECTANGLE_OPEN_CLOSE_BADGE_CASE, + TOUCH_RECTANGLE_COAL_BADGE, + TOUCH_RECTANGLE_FOREST_BADGE, + TOUCH_RECTANGLE_COBBLE_BADGE, + TOUCH_RECTANGLE_FEN_BADGE, + TOUCH_RECTANGLE_RELIC_BADGE, + TOUCH_RECTANGLE_MINE_BADGE, + TOUCH_RECTANGLE_ICICLE_BADGE, + TOUCH_RECTANGLE_BEACON_BADGE +}; + +enum BadgeCaseOpenCloseStates { + BADGE_CASE_CLOSED, + BADGE_CASE_OPEN, + BADGE_CASE_OPEN_CLOSE_STATE_COUNT +}; + +enum BadgeCaseButtonStates { + BUTTON_STATE_DEFAULT, + BUTTON_STATE_PUSHED, + BUTTON_STATE_SPRING_BACK +}; + +enum TrainerCardPlayerInputs { + INPUT_NONE, + INPUT_TOUCH_SCREEN_TAP, + INPUT_TOUCH_SCREEN_HOLD, + INPUT_A_BUTTON, + INPUT_B_BUTTON +}; + +enum BadgeCaseButtonSpriteIndices { + BUTTON_NOT_PRESSED, + BUTTON_HALF_PRESSED, + BUTTON_FULLY_PRESSED +}; + +typedef struct TouchRectangleSet { + const TouchScreenRect *touchRectangles[BADGE_CASE_OPEN_CLOSE_STATE_COUNT]; +} TouchRectangleSet; + +static void TrainerCard_InitStrBufs(TrainerCardScreen *trainerCardScreen); +static void TrainerCard_FreeStrBufs(TrainerCardScreen *trainerCardScreen); +static void TrainerCard_SetVRAMBanks(void); +static void TrainerCard_InitBackgrounds(BgConfig *bgConfig); +static void TrainerCard_DrawTrainerCard(TrainerCardScreen *trainerCardScreen, NARC *narc); +static void TrainerCard_TeardownBgs(BgConfig *bgConfig); +static BOOL TrainerCard_FlipTrainerCard(TrainerCardScreen *trainerCardScreen); +static BOOL TrainerCard_OpenCloseBadgeCase(TrainerCardScreen *trainerCardScreen); +static int TrainerCard_GetPlayerInput(TrainerCardScreen *trainerCardScreen); +static void TrainerCard_HandleBadgePolishing(TrainerCardScreen *trainerCardScreen); +static void TrainerCard_LoadCardPalette(u8 stars, u8 pokedexObtained, NARC *narc); +static void TrainerCard_LoadCasePalette(u8 gameVersion, NARC *narc); +static void TrainerCard_LoadTrainerAppearancePalette(u8 trainerAppearance, NARC *narc); +static void TrainerCard_RedrawBadgeCaseButton(TrainerCardScreen *trainerCardScreen, u8 buttonSpriteIndex); +static void TrainerCard_HideGymLeaderFace_Unused(TrainerCardScreen *trainerCardScreen, u8 gymLeader); +static void TrainerCard_TransferGraphicsOnVBlank(void *unused); +static void TrainerCard_DrawTrainer(TrainerCardScreen *trainerCardScreen); +static void TrainerCard_ClearTrainerSprite(TrainerCardScreen *trainerCardScreen); +static void TrainerCard_PolishBadge(TrainerCardScreen *trainerCardScreen, u8 badgeID); +static void TrainerCard_ResetAffineTransforms(void); +static void TrainerCard_HandleBadgeCaseButtonAnimation(TrainerCardScreen *trainerCardScreen); +static BOOL TrainerCard_AnimateBadgeCaseButton(TrainerCardScreen *trainerCardScreen, const u8 *buttonAnimData); +static u8 TrainerCard_GetBadgePolishLevel(int polish); +static void TrainerCard_ResetBadgePolishingDirection(BadgePolishingState *badgePolishingState); +static void TrainerCard_ResetBadgePolishingState(BadgePolishingState *badgePolishingState); +static void TrainerCard_PlayPolishingSoundEffects(BadgePolishingState *badgePolishingState); +static void TrainerCard_ConvertSignatureDataToPixels(const u8 *signatureData, u8 *signaturePixels); +static void TrainerCard_DisplaySignature(BgConfig *bgConfig, int bgLayer, const u8 *signature); +static void TrainerCard_PlayOpenCloseBadgeCaseSoundEffect(int unused); +static void TrainerCard_UpdatePlayTime(TrainerCardScreen *trainerCardScreen, u8 liveTimeDisplay); +static int TrainerCard_CheckTouchedRectangles(BgConfig *bgConfig, const TouchScreenRect *rects); +static int TrainerCard_CheckHeldRectangles(BgConfig *bgConfig, const TouchScreenRect *rects); + +static const u8 sPolishThresholds[BADGE_POLISH_LEVEL_COUNT] = { + 1, + 3, + 4, + 15, + 15 +}; + +static const TouchScreenRect sTouchRectangles_BadgesEnabled[] = { + [TOUCH_RECTANGLE_OPEN_CLOSE_BADGE_CASE] = { .rect = { .top = 152, .bottom = 183, .left = 120, .right = 151 } }, + [TOUCH_RECTANGLE_COAL_BADGE] = { .rect = { .top = 40, .bottom = 79, .left = 24, .right = 63 } }, + [TOUCH_RECTANGLE_FOREST_BADGE] = { .rect = { .top = 40, .bottom = 79, .left = 80, .right = 119 } }, + [TOUCH_RECTANGLE_COBBLE_BADGE] = { .rect = { .top = 40, .bottom = 79, .left = 136, .right = 167 } }, + [TOUCH_RECTANGLE_FEN_BADGE] = { .rect = { .top = 40, .bottom = 79, .left = 192, .right = 231 } }, + [TOUCH_RECTANGLE_RELIC_BADGE] = { .rect = { .top = 96, .bottom = 135, .left = 24, .right = 63 } }, + [TOUCH_RECTANGLE_MINE_BADGE] = { .rect = { .top = 96, .bottom = 135, .left = 80, .right = 119 } }, + [TOUCH_RECTANGLE_ICICLE_BADGE] = { .rect = { .top = 96, .bottom = 135, .left = 136, .right = 167 } }, + [TOUCH_RECTANGLE_BEACON_BADGE] = { .rect = { .top = 96, .bottom = 135, .left = 192, .right = 231 } }, + { TOUCHSCREEN_TABLE_TERMINATOR, 0, 0, 0 } +}; + +static const TouchScreenRect sTouchRectangles_BadgesDisabled[] = { + [TOUCH_RECTANGLE_OPEN_CLOSE_BADGE_CASE] = { .rect = { .top = 152, .bottom = 183, .left = 120, .right = 151 } }, + { TOUCHSCREEN_TABLE_TERMINATOR, 0, 0, 0 } +}; + +static const TouchRectangleSet sTouchRectangleSets[] = { + { .touchRectangles = { [BADGE_CASE_CLOSED] = sTouchRectangles_BadgesDisabled, [BADGE_CASE_OPEN] = sTouchRectangles_BadgesDisabled } }, + { .touchRectangles = { [BADGE_CASE_CLOSED] = sTouchRectangles_BadgesDisabled, [BADGE_CASE_OPEN] = sTouchRectangles_BadgesEnabled } } +}; + +static const u8 sButtonPushAnimData[] = { + 1, + BUTTON_HALF_PRESSED, + 0, + BUTTON_FULLY_PRESSED +}; + +static const u8 sButtonSpringBackAnimData[] = { + 1, + BUTTON_HALF_PRESSED, + 0, + BUTTON_NOT_PRESSED +}; + +static const u8 *const sButtonAnimData[] = { + sButtonPushAnimData, + sButtonSpringBackAnimData +}; + +static const int sTrainerAppearanceNarcIndices[16] = { + 64, + 61, + 52, + 55, + 57, + 58, + 62, + 54, + 60, + 50, + 65, + 53, + 56, + 59, + 51, + 63 +}; + +BOOL TrainerCardScreen_Init(ApplicationManager *appMan, int *state) +{ + SetVBlankCallback(NULL, NULL); + SetHBlankCallback(NULL, NULL); + GXLayers_DisableEngineALayers(); + GXLayers_DisableEngineBLayers(); + + GX_SetVisiblePlane(0); + GXS_SetVisiblePlane(0); + + SetAutorepeat(4, 8); + Heap_Create(HEAP_ID_APPLICATION, HEAP_ID_TRAINER_CARD_SCREEN, HEAP_SIZE_TRAINER_CARD_SCREEN); + + NARC *narc = NARC_ctor(NARC_INDEX_GRAPHIC__TRAINER_CASE, HEAP_ID_TRAINER_CARD_SCREEN); + TrainerCardScreen *trainerCardScreen = ApplicationManager_NewData(appMan, sizeof(TrainerCardScreen), HEAP_ID_TRAINER_CARD_SCREEN); + + memset(trainerCardScreen, 0, sizeof(TrainerCardScreen)); + + trainerCardScreen->trainerCard = ApplicationManager_Args(appMan); + trainerCardScreen->bgConfig = BgConfig_New(HEAP_ID_TRAINER_CARD_SCREEN); + + TrainerCard_InitStrBufs(trainerCardScreen); + TrainerCard_SetVRAMBanks(); + TrainerCard_InitBackgrounds(trainerCardScreen->bgConfig); + TrainerCard_DrawTrainerCard(trainerCardScreen, narc); + + EnableTouchPad(); + InitializeTouchPad(4); + Sound_SetSceneAndPlayBGM(SOUND_SCENE_SUB_56, SEQ_NONE, 0); + TrainerCard_InitBadgeChimeState(&trainerCardScreen->badgeChimeState); + Sound_PlayEffect(SEQ_SE_DP_CARD3); + TrainerCard_InitSpriteData(&trainerCardScreen->spriteData, narc); + + u8 badgesObtained[MAX_BADGES]; + + for (int badgeID = 0; badgeID < MAX_BADGES; badgeID++) { + if (trainerCardScreen->trainerCard->badges[badgeID].obtained) { + badgesObtained[badgeID] = TRUE; + } else { + badgesObtained[badgeID] = FALSE; + } + } + + TrainerCard_DrawBadgeCaseSprites(&trainerCardScreen->spriteData, badgesObtained); + + TrainerCard_AddWindows(trainerCardScreen->bgConfig, trainerCardScreen->windows); + + for (u8 gymLeader = 0; gymLeader < MAX_BADGES; gymLeader++) { + if ((trainerCardScreen->trainerCard->gymLeadersToHide_Unused >> gymLeader) & 0x1) { + // never reached, relevant field is always 0 + TrainerCard_HideGymLeaderFace_Unused(trainerCardScreen, gymLeader); + } + } + + Bg_CopyTilemapBufferToVRAM(trainerCardScreen->bgConfig, BG_LAYER_MAIN_3); + + TrainerCard_DrawFrontText(trainerCardScreen->windows, trainerCardScreen->trainerCard); + + if (trainerCardScreen->trainerCard->liveTimeDisplay) { + TrainerCard_BlinkPlaytimeColon(&trainerCardScreen->windows[TRAINER_CARD_WINDOW_TIME], TRUE, trainerCardScreen->colonStrbuf); + } + + trainerCardScreen->viewingBack = FALSE; + trainerCardScreen->badgeCaseOpenState = BADGE_CASE_CLOSED; + trainerCardScreen->touchedRectangleIndex = TOUCHSCREEN_INPUT_NONE; + trainerCardScreen->badgeCaseButtonPushed = FALSE; + trainerCardScreen->badgeCaseButtonState = BUTTON_STATE_DEFAULT; + + for (u8 badgeID = 0; badgeID < MAX_BADGES; badgeID++) { + trainerCardScreen->polishingProgress[badgeID] = 0; + + if (trainerCardScreen->trainerCard->badges[badgeID].obtained) { + u8 polishLevel = TrainerCard_GetBadgePolishLevel(trainerCardScreen->trainerCard->badges[badgeID].polish); + + if (polishLevel <= BADGE_POLISH_LEVEL_4_SPARKLES) { + if (polishLevel == BADGE_POLISH_LEVEL_4_SPARKLES) { + TrainerCard_DrawBadgeDirt(&trainerCardScreen->spriteData, badgeID, 0); + } else { + TrainerCard_DrawBadgeDirt(&trainerCardScreen->spriteData, badgeID, BADGE_POLISH_LEVEL_2_SPARKLES - polishLevel); + } + } + + if (polishLevel == BADGE_POLISH_LEVEL_2_SPARKLES) { + Sprite_SetDrawFlag(trainerCardScreen->spriteData.sprites[TRAINER_CARD_TWO_SPARKLES_SPRITES_INDEX + badgeID], TRUE); + } else if (polishLevel == BADGE_POLISH_LEVEL_4_SPARKLES) { + Sprite_SetDrawFlag(trainerCardScreen->spriteData.sprites[TRAINER_CARD_FOUR_SPARKLES_SPRITES_INDEX + badgeID], TRUE); + } + } + } + + TrainerCard_ResetAffineTransforms(); + + SetVBlankCallback(TrainerCard_TransferGraphicsOnVBlank, NULL); + DrawWifiConnectionIcon(); + Sound_SetPlayerVolume(PLAYER_FIELD, SOUND_VOLUME_MAX / 3); + StartScreenFade(FADE_SUB_THEN_MAIN, FADE_TYPE_DOWNWARD_IN, FADE_TYPE_DOWNWARD_IN, COLOR_BLACK, 6, 1, HEAP_ID_TRAINER_CARD_SCREEN); + NARC_dtor(narc); + + return TRUE; +} + +BOOL TrainerCardScreen_Main(ApplicationManager *appMan, int *state) +{ + TrainerCardScreen *trainerCardScreen = ApplicationManager_Data(appMan); + + switch (*state) { + case STATE_INITIAL: + if (IsScreenFadeDone()) { + *state = STATE_MAIN; + } + + break; + + case STATE_MAIN: + int input = TrainerCard_GetPlayerInput(trainerCardScreen); + + if (input == INPUT_TOUCH_SCREEN_TAP) { + if (trainerCardScreen->touchedRectangleIndex == TOUCH_RECTANGLE_OPEN_CLOSE_BADGE_CASE) { + trainerCardScreen->badgeCaseButtonPushed = TRUE; + trainerCardScreen->badgeCaseButtonState = BUTTON_STATE_PUSHED; + + Sprite_SetDrawFlag(trainerCardScreen->spriteData.sprites[TRAINER_CARD_BADGE_CASE_BUTTON_EFFECT_SPRITE_INDEX], TRUE); + Sprite_SetAnimateFlag(trainerCardScreen->spriteData.sprites[TRAINER_CARD_BADGE_CASE_BUTTON_EFFECT_SPRITE_INDEX], TRUE); + Sprite_SetAnim(trainerCardScreen->spriteData.sprites[TRAINER_CARD_BADGE_CASE_BUTTON_EFFECT_SPRITE_INDEX], 10); + + trainerCardScreen->subState = CASE_SUBSTATE_INITIAL; + trainerCardScreen->badgeCaseButtonAnimIndex = 0; + trainerCardScreen->badgeCaseButtonAnimTimer = 0; + trainerCardScreen->badgeCaseCoverMoving = FALSE; + *state = STATE_OPEN_CLOSE_BADGE_CASE; + } else { + u8 badgeID = trainerCardScreen->touchedRectangleIndex - TOUCH_RECTANGLE_COAL_BADGE; + + if (trainerCardScreen->trainerCard->badges[badgeID].obtained) { + u8 polishLevel = TrainerCard_GetBadgePolishLevel(trainerCardScreen->trainerCard->badges[badgeID].polish); + TrainerCard_PlayBadgeChime(&trainerCardScreen->badgeChimeState, badgeID, polishLevel); + } + } + } else if (input == INPUT_TOUCH_SCREEN_HOLD) { + if (trainerCardScreen->badgeCaseButtonPushed && trainerCardScreen->touchedRectangleIndex != TOUCH_RECTANGLE_OPEN_CLOSE_BADGE_CASE) { + trainerCardScreen->badgeCaseButtonPushed = FALSE; + trainerCardScreen->badgeCaseButtonState = BUTTON_STATE_SPRING_BACK; + } + + TrainerCard_HandleBadgePolishing(trainerCardScreen); + } else { + if (trainerCardScreen->badgeCaseButtonPushed && trainerCardScreen->badgeCaseButtonState == BUTTON_STATE_DEFAULT) { + trainerCardScreen->badgeCaseButtonPushed = FALSE; + trainerCardScreen->badgeCaseButtonState = BUTTON_STATE_SPRING_BACK; + } + + if (trainerCardScreen->trainerCard->badgesInteractable) { + TrainerCard_ResetBadgePolishingState(&trainerCardScreen->badgePolishingState); + } + + if (input == INPUT_A_BUTTON) { + trainerCardScreen->subState = FLIP_SUBSTATE_INITIAL; + *state = STATE_FLIP_CARD; + } else if (input == INPUT_B_BUTTON) { + Sound_PlayEffect(SEQ_SE_CONFIRM); + + StartScreenFade(FADE_MAIN_THEN_SUB, FADE_TYPE_UPWARD_OUT, FADE_TYPE_UPWARD_OUT, COLOR_BLACK, 6, 1, HEAP_ID_TRAINER_CARD_SCREEN); + *state = STATE_EXIT; + } + } + + TrainerCard_UpdatePlayTime(trainerCardScreen, trainerCardScreen->trainerCard->liveTimeDisplay); + break; + case STATE_EXIT: + if (IsScreenFadeDone()) { + return TRUE; + } + break; + case STATE_FLIP_CARD: + if (TrainerCard_FlipTrainerCard(trainerCardScreen)) { + *state = STATE_MAIN; + } + break; + case STATE_OPEN_CLOSE_BADGE_CASE: + if (trainerCardScreen->badgeCaseButtonState == BUTTON_STATE_DEFAULT) { + int input = TrainerCard_GetPlayerInput(trainerCardScreen); + + if (input == INPUT_TOUCH_SCREEN_TAP) { + if (trainerCardScreen->touchedRectangleIndex == TOUCH_RECTANGLE_OPEN_CLOSE_BADGE_CASE) { + trainerCardScreen->badgeCaseButtonPushed = TRUE; + trainerCardScreen->badgeCaseButtonState = BUTTON_STATE_PUSHED; + trainerCardScreen->badgeCaseButtonAnimIndex = 0; + trainerCardScreen->badgeCaseButtonAnimTimer = 0; + } + } else if (input == INPUT_TOUCH_SCREEN_HOLD) { + if (trainerCardScreen->badgeCaseButtonPushed && trainerCardScreen->touchedRectangleIndex != TOUCH_RECTANGLE_OPEN_CLOSE_BADGE_CASE) { + trainerCardScreen->badgeCaseButtonPushed = FALSE; + trainerCardScreen->badgeCaseButtonState = BUTTON_STATE_SPRING_BACK; + } + } else { + if (trainerCardScreen->badgeCaseButtonPushed) { + trainerCardScreen->badgeCaseButtonPushed = FALSE; + trainerCardScreen->badgeCaseButtonState = BUTTON_STATE_SPRING_BACK; + } + } + } + + if (trainerCardScreen->badgeCaseCoverMoving == FALSE) { + trainerCardScreen->badgeCaseCoverMoving = TrainerCard_OpenCloseBadgeCase(trainerCardScreen); + } + + if (trainerCardScreen->badgeCaseCoverMoving) { + trainerCardScreen->badgeCaseCoverMoving = FALSE; + *state = STATE_MAIN; + } + break; + } + + TrainerCard_HandleBadgeCaseButtonAnimation(trainerCardScreen); + SpriteList_Update(trainerCardScreen->spriteData.spriteList); + + return FALSE; +} + +BOOL TrainerCardScreen_Exit(ApplicationManager *appMan, int *state) +{ + TrainerCardScreen *trainerCardScreen = ApplicationManager_Data(appMan); + + TrainerCard_ResetAffineTransforms(); + TrainerCard_FreeStrBufs(trainerCardScreen); + TrainerCard_FreeSprites(&trainerCardScreen->spriteData); + + Heap_Free(trainerCardScreen->trainerSprite); + Heap_Free(trainerCardScreen->trainerScreenDataNSCRBuffer); + + TrainerCard_RemoveWindows(trainerCardScreen->windows); + TrainerCard_TeardownBgs(trainerCardScreen->bgConfig); + + DisableTouchPad(); + ApplicationManager_FreeData(appMan); + SetVBlankCallback(NULL, NULL); + Heap_Destroy(HEAP_ID_TRAINER_CARD_SCREEN); + Sound_SetPlayerVolume(PLAYER_FIELD, SOUND_VOLUME_MAX); + + return TRUE; +} + +static void TrainerCard_InitStrBufs(TrainerCardScreen *trainerCardScreen) +{ + trainerCardScreen->unusedStrbuf = Strbuf_Init(4, HEAP_ID_TRAINER_CARD_SCREEN); + trainerCardScreen->colonStrbuf = Strbuf_Init(5, HEAP_ID_TRAINER_CARD_SCREEN); + + MessageLoader *messageLoader = MessageLoader_Init(MESSAGE_LOADER_BANK_HANDLE, NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_TRAINER_CARD, HEAP_ID_TRAINER_CARD_SCREEN); + + MessageLoader_GetStrbuf(messageLoader, TrainerCard_Text_Colon, trainerCardScreen->colonStrbuf); + MessageLoader_Free(messageLoader); +} + +static void TrainerCard_FreeStrBufs(TrainerCardScreen *trainerCardScreen) +{ + Strbuf_Free(trainerCardScreen->unusedStrbuf); + Strbuf_Free(trainerCardScreen->colonStrbuf); +} + +static void TrainerCard_SetVRAMBanks(void) +{ + UnkStruct_02099F80 banks = { + GX_VRAM_BG_64_E, + GX_VRAM_BGEXTPLTT_NONE, + GX_VRAM_SUB_BG_128_C, + GX_VRAM_SUB_BGEXTPLTT_NONE, + GX_VRAM_OBJ_128_B, + GX_VRAM_OBJEXTPLTT_NONE, + GX_VRAM_SUB_OBJ_16_I, + GX_VRAM_SUB_OBJEXTPLTT_NONE, + GX_VRAM_TEX_NONE, + GX_VRAM_TEXPLTT_NONE + }; + + GXLayers_SetBanks(&banks); +} + +static void TrainerCard_LoadCardPalette(u8 stars, u8 pokedexObtained, NARC *narc) +{ + void *nclrBuffer; + NNSG2dPaletteData *paletteData; + + if (pokedexObtained) { + switch (stars) { + case 0: + nclrBuffer = Graphics_GetPlttDataFromOpenNARC(narc, 0, &paletteData, HEAP_ID_TRAINER_CARD_SCREEN); + break; + case 1: + nclrBuffer = Graphics_GetPlttDataFromOpenNARC(narc, 1, &paletteData, HEAP_ID_TRAINER_CARD_SCREEN); + break; + case 2: + nclrBuffer = Graphics_GetPlttDataFromOpenNARC(narc, 2, &paletteData, HEAP_ID_TRAINER_CARD_SCREEN); + break; + case 3: + nclrBuffer = Graphics_GetPlttDataFromOpenNARC(narc, 3, &paletteData, HEAP_ID_TRAINER_CARD_SCREEN); + break; + case 4: + nclrBuffer = Graphics_GetPlttDataFromOpenNARC(narc, 4, &paletteData, HEAP_ID_TRAINER_CARD_SCREEN); + break; + case 5: + nclrBuffer = Graphics_GetPlttDataFromOpenNARC(narc, 5, &paletteData, HEAP_ID_TRAINER_CARD_SCREEN); + break; + } + } else { + nclrBuffer = Graphics_GetPlttDataFromOpenNARC(narc, 6, &paletteData, HEAP_ID_TRAINER_CARD_SCREEN); + } + + DC_FlushRange(paletteData->pRawData, PALETTE_SIZE_EXT_BYTES); + u16 *rawData = paletteData->pRawData; + + GXS_LoadBGPltt(&rawData[PALETTE_SIZE], PALETTE_SIZE_BYTES, PALETTE_SIZE_BYTES * 3); + GXS_LoadBGPltt(&rawData[PALETTE_SIZE * 15], PALETTE_SIZE_BYTES * 15, PALETTE_SIZE_BYTES); + + Heap_Free(nclrBuffer); +} + +static void TrainerCard_LoadCasePalette(u8 gameVersion, NARC *narc) +{ + void *nclrBuffer; + NNSG2dPaletteData *paletteData; + + switch (gameVersion) { + case VERSION_DIAMOND: + nclrBuffer = Graphics_GetPlttDataFromOpenNARC(narc, 7, &paletteData, HEAP_ID_TRAINER_CARD_SCREEN); + break; + case VERSION_PEARL: + nclrBuffer = Graphics_GetPlttDataFromOpenNARC(narc, 8, &paletteData, HEAP_ID_TRAINER_CARD_SCREEN); + break; + case VERSION_PLATINUM: + nclrBuffer = Graphics_GetPlttDataFromOpenNARC(narc, 10, &paletteData, HEAP_ID_TRAINER_CARD_SCREEN); + break; + case VERSION_HEARTGOLD: + nclrBuffer = Graphics_GetPlttDataFromOpenNARC(narc, 11, &paletteData, HEAP_ID_TRAINER_CARD_SCREEN); + break; + case VERSION_SOULSILVER: + nclrBuffer = Graphics_GetPlttDataFromOpenNARC(narc, 12, &paletteData, HEAP_ID_TRAINER_CARD_SCREEN); + break; + default: + nclrBuffer = Graphics_GetPlttDataFromOpenNARC(narc, 9, &paletteData, HEAP_ID_TRAINER_CARD_SCREEN); + break; + } + + DC_FlushRange(paletteData->pRawData, PALETTE_SIZE_BYTES); + + GX_LoadBGPltt(paletteData->pRawData, 0, PALETTE_SIZE_BYTES); + GXS_LoadBGPltt(paletteData->pRawData, 0, PALETTE_SIZE_BYTES); + + Heap_Free(nclrBuffer); +} + +static void TrainerCard_LoadTrainerAppearancePalette(u8 trainerAppearance, NARC *narc) +{ + NNSG2dPaletteData *paletteData; + + void *nclrBuffer = Graphics_GetPlttDataFromOpenNARC(narc, 48, &paletteData, HEAP_ID_TRAINER_CARD_SCREEN); + u8 *rawData = (u8 *)(paletteData->pRawData); + + DC_FlushRange(&rawData[PALETTE_SIZE_BYTES * trainerAppearance], PALETTE_SIZE_BYTES); + GXS_LoadBGPltt(&rawData[PALETTE_SIZE_BYTES * trainerAppearance], PALETTE_SIZE_BYTES * 4, PALETTE_SIZE_BYTES); + + Heap_Free(nclrBuffer); +} + +static void TrainerCard_InitBackgrounds(BgConfig *bgConfig) +{ + GX_SetDispSelect(GX_DISP_SELECT_SUB_MAIN); + + GraphicsModes graphicsModes = { + .displayMode = GX_DISPMODE_GRAPHICS, + .mainBgMode = GX_BGMODE_1, + .subBgMode = GX_BGMODE_4, + .bg0As2DOr3D = GX_BG0_AS_2D, + }; + + SetAllGraphicsModes(&graphicsModes); + + BgTemplate sub3Template = { + .x = 0, + .y = 0, + .bufferSize = 0x800, + .baseTile = 0, + .screenSize = BG_SCREEN_SIZE_256x256, + .colorMode = GX_BG_COLORMODE_256, + .screenBase = GX_BG_SCRBASE_0xf000, + .charBase = GX_BG_CHARBASE_0x04000, + .bgExtPltt = GX_BG_EXTPLTT_01, + .priority = 0, + .areaOver = 0, + .mosaic = FALSE, + }; + + Bg_InitFromTemplate(bgConfig, BG_LAYER_SUB_3, &sub3Template, BG_TYPE_STATIC_WITH_AFFINE); + Bg_ClearTilemap(bgConfig, BG_LAYER_SUB_3); + + BgTemplate sub1Template = { + .x = 0, + .y = 0, + .bufferSize = 0x800, + .baseTile = 0, + .screenSize = BG_SCREEN_SIZE_256x256, + .colorMode = GX_BG_COLORMODE_16, + .screenBase = GX_BG_SCRBASE_0xe000, + .charBase = GX_BG_CHARBASE_0x0c000, + .bgExtPltt = GX_BG_EXTPLTT_01, + .priority = 3, + .areaOver = 0, + .mosaic = FALSE, + }; + + Bg_InitFromTemplate(bgConfig, BG_LAYER_SUB_1, &sub1Template, BG_TYPE_STATIC); + Bg_ClearTilemap(bgConfig, BG_LAYER_SUB_1); + + BgTemplate sub2Template = { + .x = 0, + .y = 0, + .bufferSize = 0x800, + .baseTile = 0, + .screenSize = BG_SCREEN_SIZE_256x256, + .colorMode = GX_BG_COLORMODE_256, + .screenBase = GX_BG_SCRBASE_0xe800, + .charBase = GX_BG_CHARBASE_0x00000, + .bgExtPltt = GX_BG_EXTPLTT_01, + .priority = 2, + .areaOver = 0, + .mosaic = FALSE, + }; + + Bg_InitFromTemplate(bgConfig, BG_LAYER_SUB_2, &sub2Template, BG_TYPE_AFFINE); + Bg_ClearTilemap(bgConfig, BG_LAYER_SUB_2); + + BgTemplate main2Template = { + .x = 0, + .y = 0, + .bufferSize = 0x800, + .baseTile = 0, + .screenSize = BG_SCREEN_SIZE_256x256, + .colorMode = GX_BG_COLORMODE_16, + .screenBase = GX_BG_SCRBASE_0xe000, + .charBase = GX_BG_CHARBASE_0x00000, + .bgExtPltt = GX_BG_EXTPLTT_01, + .priority = 3, + .areaOver = 0, + .mosaic = FALSE, + }; + + Bg_InitFromTemplate(bgConfig, BG_LAYER_MAIN_2, &main2Template, BG_TYPE_STATIC); + Bg_ClearTilemap(bgConfig, BG_LAYER_MAIN_2); + + BgTemplate main3Template = { + .x = 0, + .y = 0, + .bufferSize = 0x800, + .baseTile = 0, + .screenSize = BG_SCREEN_SIZE_256x256, + .colorMode = GX_BG_COLORMODE_256, + .screenBase = GX_BG_SCRBASE_0xe800, + .charBase = GX_BG_CHARBASE_0x04000, + .bgExtPltt = GX_BG_EXTPLTT_01, + .priority = 0, + .areaOver = 0, + .mosaic = FALSE, + }; + + Bg_InitFromTemplate(bgConfig, BG_LAYER_MAIN_3, &main3Template, BG_TYPE_AFFINE); + Bg_ClearTilemap(bgConfig, BG_LAYER_MAIN_3); +} + +static void TrainerCard_DrawTrainerCard(TrainerCardScreen *trainerCardScreen, NARC *narc) +{ + NNSG2dPaletteData *paletteData; + + // will mostly be overwritten by TrainerCard_LoadCardPalette, with the exception of the palette for the trainer sprite + void *nclrBuffer = Graphics_GetPlttDataFromOpenNARC(narc, 0, &paletteData, HEAP_ID_TRAINER_CARD_SCREEN); + + DC_FlushRange(paletteData->pRawData, PALETTE_SIZE_EXT_BYTES); + GXS_LoadBGPltt(paletteData->pRawData, 0, PALETTE_SIZE_EXT_BYTES); + Heap_Free(nclrBuffer); + + TrainerCard_LoadCardPalette(trainerCardScreen->trainerCard->stars, trainerCardScreen->trainerCard->pokedexObtained, narc); + + NNSG2dPaletteData *paletteData2; + + nclrBuffer = Graphics_GetPlttDataFromOpenNARC(narc, 13, &paletteData2, HEAP_ID_TRAINER_CARD_SCREEN); + + DC_FlushRange(paletteData2->pRawData, PALETTE_SIZE_EXT_BYTES); + GX_LoadBGPltt(paletteData2->pRawData, 0, PALETTE_SIZE_EXT_BYTES); + Heap_Free(nclrBuffer); + + TrainerCard_LoadCasePalette(trainerCardScreen->trainerCard->gameVersion, narc); + + if (trainerCardScreen->trainerCard->trainerAppearance == 0xff) { + s32 trainerSpriteNarcIndex, trainerScreenDataNarcIndex, trainerPaletteNarcIndex; + + switch (trainerCardScreen->trainerCard->gameVersion) { + case VERSION_DIAMOND: + case VERSION_PEARL: + trainerSpriteNarcIndex = 32; + trainerScreenDataNarcIndex = 42; + trainerPaletteNarcIndex = 26; + break; + default: + trainerSpriteNarcIndex = 31; + trainerScreenDataNarcIndex = 40; + trainerPaletteNarcIndex = -1; // platinum trainer palettes are already in the first palette loaded in this function + break; + } + + trainerCardScreen->trainerSprite = LoadMemberFromOpenNARC(narc, trainerSpriteNarcIndex, FALSE, HEAP_ID_TRAINER_CARD_SCREEN, FALSE); + GF_ASSERT(trainerCardScreen->trainerSprite != NULL); + + BOOL success = NNS_G2dGetUnpackedBGCharacterData(trainerCardScreen->trainerSprite, &trainerCardScreen->trainerCharacterData); + GF_ASSERT(success); + + if (trainerPaletteNarcIndex != -1) { + Graphics_LoadPaletteFromOpenNARC(narc, trainerPaletteNarcIndex, PAL_LOAD_SUB_BG, 4 * PALETTE_SIZE_BYTES, 2 * PALETTE_SIZE_BYTES, HEAP_ID_TRAINER_CARD_SCREEN); + } + + if (trainerCardScreen->trainerCard->gender == GENDER_MALE) { + trainerCardScreen->trainerScreenDataNSCRBuffer = Graphics_GetScrnDataFromOpenNARC(narc, trainerScreenDataNarcIndex, FALSE, &trainerCardScreen->trainerScreenData, HEAP_ID_TRAINER_CARD_SCREEN); + } else { + trainerCardScreen->trainerScreenDataNSCRBuffer = Graphics_GetScrnDataFromOpenNARC(narc, trainerScreenDataNarcIndex + 1, FALSE, &trainerCardScreen->trainerScreenData, HEAP_ID_TRAINER_CARD_SCREEN); + } + } else { + trainerCardScreen->trainerSprite = LoadMemberFromOpenNARC(narc, sTrainerAppearanceNarcIndices[trainerCardScreen->trainerCard->trainerAppearance], FALSE, HEAP_ID_TRAINER_CARD_SCREEN, FALSE); + GF_ASSERT(trainerCardScreen->trainerSprite != NULL); + + BOOL success = NNS_G2dGetUnpackedBGCharacterData(trainerCardScreen->trainerSprite, &trainerCardScreen->trainerCharacterData); + GF_ASSERT(success); + + trainerCardScreen->trainerScreenDataNSCRBuffer = Graphics_GetScrnDataFromOpenNARC(narc, 49, FALSE, &trainerCardScreen->trainerScreenData, HEAP_ID_TRAINER_CARD_SCREEN); + + TrainerCard_LoadTrainerAppearancePalette(trainerCardScreen->trainerCard->trainerAppearance, narc); + } + + TrainerCard_DrawTrainer(trainerCardScreen); + + Graphics_LoadTilesToBgLayerFromOpenNARC(narc, 27, trainerCardScreen->bgConfig, BG_LAYER_SUB_2, 0, 0, FALSE, HEAP_ID_TRAINER_CARD_SCREEN); + Graphics_LoadTilemapToBgLayerFromOpenNARC(narc, 35, trainerCardScreen->bgConfig, BG_LAYER_SUB_2, 0, 0, FALSE, HEAP_ID_TRAINER_CARD_SCREEN); + + Graphics_LoadTilesToBgLayerFromOpenNARC(narc, 28, trainerCardScreen->bgConfig, BG_LAYER_SUB_1, 0, 0, FALSE, HEAP_ID_TRAINER_CARD_SCREEN); + Graphics_LoadTilemapToBgLayerFromOpenNARC(narc, 37, trainerCardScreen->bgConfig, BG_LAYER_SUB_1, 0, 0, FALSE, HEAP_ID_TRAINER_CARD_SCREEN); + + Graphics_LoadTilesToBgLayerFromOpenNARC(narc, 29, trainerCardScreen->bgConfig, BG_LAYER_MAIN_2, 0, 0, FALSE, HEAP_ID_TRAINER_CARD_SCREEN); + Graphics_LoadTilemapToBgLayerFromOpenNARC(narc, 38, trainerCardScreen->bgConfig, BG_LAYER_MAIN_2, 0, 0, FALSE, HEAP_ID_TRAINER_CARD_SCREEN); + + Graphics_LoadTilesToBgLayerFromOpenNARC(narc, 30, trainerCardScreen->bgConfig, BG_LAYER_MAIN_3, 0, 0, FALSE, HEAP_ID_TRAINER_CARD_SCREEN); + Graphics_LoadTilemapToBgLayerFromOpenNARC(narc, 39, trainerCardScreen->bgConfig, BG_LAYER_MAIN_3, 0, 0, FALSE, HEAP_ID_TRAINER_CARD_SCREEN); + + TrainerCard_ConvertSignatureDataToPixels(trainerCardScreen->trainerCard->signature, trainerCardScreen->signature); +} + +static void TrainerCard_TeardownBgs(BgConfig *bgConfig) +{ + GXLayers_EngineAToggleLayers(GX_PLANEMASK_BG0 | GX_PLANEMASK_BG1 | GX_PLANEMASK_BG2 | GX_PLANEMASK_BG3 | GX_PLANEMASK_OBJ, FALSE); + GXLayers_EngineBToggleLayers(GX_PLANEMASK_BG0 | GX_PLANEMASK_BG1 | GX_PLANEMASK_OBJ, FALSE); + Bg_FreeTilemapBuffer(bgConfig, BG_LAYER_SUB_3); + Bg_FreeTilemapBuffer(bgConfig, BG_LAYER_SUB_2); + Bg_FreeTilemapBuffer(bgConfig, BG_LAYER_SUB_1); + Bg_FreeTilemapBuffer(bgConfig, BG_LAYER_MAIN_2); + Bg_FreeTilemapBuffer(bgConfig, BG_LAYER_MAIN_3); + Heap_Free(bgConfig); +} + +static BOOL TrainerCard_FlipTrainerCard(TrainerCardScreen *trainerCardScreen) +{ + BOOL doneFlipping = FALSE; + + switch (trainerCardScreen->subState) { + case FLIP_SUBSTATE_INITIAL: + trainerCardScreen->cardScalingSpeed = 8; + trainerCardScreen->cardXScale = 1 << FX32_SHIFT; + trainerCardScreen->cardYScale = 1 << FX32_SHIFT; + trainerCardScreen->cardXScale += 2 << (FX32_SHIFT - 6); + trainerCardScreen->cardYScale += 2 << (FX32_SHIFT - 6); + + Sound_PlayEffect(SEQ_SE_DP_CARD5); + + trainerCardScreen->subState++; + break; + case FLIP_SUBSTATE_SCALE_DOWN: + trainerCardScreen->cardXScale -= 2 << (FX32_SHIFT - trainerCardScreen->cardScalingSpeed); + + if (trainerCardScreen->cardXScale <= 0) { + trainerCardScreen->cardXScale = 36; + trainerCardScreen->subState++; + } + + trainerCardScreen->cardScalingSpeed--; + + if (trainerCardScreen->cardScalingSpeed <= 1) { + trainerCardScreen->cardScalingSpeed = 1; + } + break; + case FLIP_SUBSTATE_DRAW_OTHER_SIDE: + if (trainerCardScreen->viewingBack == FALSE) { + trainerCardScreen->viewingBack = TRUE; + Graphics_LoadTilemapToBgLayer(NARC_INDEX_GRAPHIC__TRAINER_CASE, 36, trainerCardScreen->bgConfig, BG_LAYER_SUB_2, 0, 0, FALSE, HEAP_ID_TRAINER_CARD_SCREEN); + TrainerCard_ClearWindows(trainerCardScreen->windows, TRAINER_CARD_WINDOW_ID, TRAINER_CARD_WINDOW_ADVENTURE_STARTED); + TrainerCard_ClearTrainerSprite(trainerCardScreen); + Bg_ClearTilemap(trainerCardScreen->bgConfig, BG_LAYER_SUB_3); + TrainerCard_DrawBackText(trainerCardScreen->windows, trainerCardScreen->trainerCard); + TrainerCard_DisplaySignature(trainerCardScreen->bgConfig, BG_LAYER_SUB_3, trainerCardScreen->signature); + } else { + trainerCardScreen->viewingBack = FALSE; + Graphics_LoadTilemapToBgLayer(NARC_INDEX_GRAPHIC__TRAINER_CASE, 35, trainerCardScreen->bgConfig, BG_LAYER_SUB_2, 0, 0, FALSE, HEAP_ID_TRAINER_CARD_SCREEN); + TrainerCard_ClearWindows(trainerCardScreen->windows, TRAINER_CARD_WINDOW_HOF_DEBUT, TRAINER_CARD_WINDOW_LINK_TRADES); + Bg_ClearTilemap(trainerCardScreen->bgConfig, BG_LAYER_SUB_3); + TrainerCard_DrawTrainer(trainerCardScreen); + TrainerCard_DrawFrontText(trainerCardScreen->windows, trainerCardScreen->trainerCard); + } + + trainerCardScreen->subState++; + break; + case FLIP_SUBSTATE_SCALE_UP: + trainerCardScreen->cardScalingSpeed++; + + if (trainerCardScreen->cardScalingSpeed > 8) { + trainerCardScreen->cardScalingSpeed = 8; + } + + trainerCardScreen->cardXScale += 2 << (FX32_SHIFT - trainerCardScreen->cardScalingSpeed); + + if (trainerCardScreen->cardXScale >= (1 << FX32_SHIFT)) { + trainerCardScreen->cardXScale = 1 << FX32_SHIFT; + trainerCardScreen->cardXScale = 1 << FX32_SHIFT; + trainerCardScreen->cardYScale = 1 << FX32_SHIFT; + doneFlipping = TRUE; + } + break; + } + + MtxFx22 affineTransform; + + fx32 xScale = FX_Inv(trainerCardScreen->cardXScale); + fx32 yScale = FX_Inv(trainerCardScreen->cardYScale); + + affineTransform._00 = xScale; + affineTransform._01 = 0; + affineTransform._10 = 0; + affineTransform._11 = yScale; + + SVC_WaitVBlankIntr(); + + G2S_SetBG2Affine(&affineTransform, 128, 96, 0, 0); + G2S_SetBG3Affine(&affineTransform, 128, 96, 0, 0); + + return doneFlipping; +} + +static BOOL TrainerCard_OpenCloseBadgeCase(TrainerCardScreen *trainerCardScreen) +{ + static const fx32 sBadgeCaseCoverScalingSpeeds[] = { + 2 << (FX32_SHIFT - 6), + 2 << (FX32_SHIFT - 6), + 2 << (FX32_SHIFT - 6), + 2 << (FX32_SHIFT - 6), + 2 << (FX32_SHIFT - 6), + 2 << (FX32_SHIFT - 5), + 2 << (FX32_SHIFT - 5), + 2 << (FX32_SHIFT - 5), + 2 << (FX32_SHIFT - 5), + 2 << (FX32_SHIFT - 5), + 2 << (FX32_SHIFT - 4), + 2 << (FX32_SHIFT - 4), + 2 << (FX32_SHIFT - 4), + 2 << (FX32_SHIFT - 4) + }; + + switch (trainerCardScreen->subState) { + case CASE_SUBSTATE_INITIAL: + trainerCardScreen->badgeCaseTransitionIndex = 0; + + if (trainerCardScreen->badgeCaseOpenState == BADGE_CASE_CLOSED) { + trainerCardScreen->badgeCaseCoverYScale = 1 << FX32_SHIFT; + trainerCardScreen->subState = CASE_SUBSTATE_OPEN; + } else { + trainerCardScreen->subState = CASE_SUBSTATE_CLOSE; + } + + TrainerCard_PlayOpenCloseBadgeCaseSoundEffect(trainerCardScreen->badgeCaseOpenState); + break; + case CASE_SUBSTATE_OPEN: + trainerCardScreen->badgeCaseCoverYScale -= sBadgeCaseCoverScalingSpeeds[trainerCardScreen->badgeCaseTransitionIndex++]; + + if (trainerCardScreen->badgeCaseTransitionIndex == NELEMS(sBadgeCaseCoverScalingSpeeds)) { + trainerCardScreen->badgeCaseOpenState = BADGE_CASE_OPEN; + trainerCardScreen->subState = CASE_SUBSTATE_DONE; + } + break; + case CASE_SUBSTATE_CLOSE: + trainerCardScreen->badgeCaseCoverYScale += sBadgeCaseCoverScalingSpeeds[NELEMS(sBadgeCaseCoverScalingSpeeds) - 1 - (trainerCardScreen->badgeCaseTransitionIndex++)]; + + if (trainerCardScreen->badgeCaseTransitionIndex == NELEMS(sBadgeCaseCoverScalingSpeeds)) { + trainerCardScreen->badgeCaseOpenState = BADGE_CASE_CLOSED; + trainerCardScreen->badgeCaseCoverYScale = (1 << FX32_SHIFT); + trainerCardScreen->subState = CASE_SUBSTATE_DONE; + } + break; + case CASE_SUBSTATE_DONE: + return TRUE; + } + + MtxFx22 affineTransform; + + fx32 xScale = FX_Inv(1 << FX32_SHIFT); + fx32 yScale = FX_Inv(trainerCardScreen->badgeCaseCoverYScale); + + affineTransform._00 = xScale; + affineTransform._01 = 0; + affineTransform._10 = 0; + affineTransform._11 = yScale; + + SVC_WaitVBlankIntr(); + G2_SetBG3Affine(&affineTransform, 128, 0, 0, 0); + + return FALSE; +} + +static int TrainerCard_GetPlayerInput(TrainerCardScreen *trainerCardScreen) +{ + BOOL touchScreenInput = FALSE; + int input = INPUT_NONE; + + trainerCardScreen->touchedRectangleIndex = TOUCHSCREEN_INPUT_NONE; + + if (gSystem.touchPressed) { + trainerCardScreen->polishingEnabled = TRUE; + } + + trainerCardScreen->touchedRectangleIndex = TrainerCard_CheckTouchedRectangles(trainerCardScreen->bgConfig, sTouchRectangleSets[trainerCardScreen->trainerCard->badgesInteractable].touchRectangles[trainerCardScreen->badgeCaseOpenState]); + + if (trainerCardScreen->touchedRectangleIndex != TOUCHSCREEN_INPUT_NONE) { + touchScreenInput = TRUE; + input = INPUT_TOUCH_SCREEN_TAP; + } else if (gSystem.touchHeld) { + trainerCardScreen->touchedRectangleIndex = TrainerCard_CheckHeldRectangles(trainerCardScreen->bgConfig, sTouchRectangleSets[trainerCardScreen->trainerCard->badgesInteractable].touchRectangles[trainerCardScreen->badgeCaseOpenState]); + + if (trainerCardScreen->polishingEnabled) { + touchScreenInput = TRUE; + input = INPUT_TOUCH_SCREEN_HOLD; + } + } else { + trainerCardScreen->polishingEnabled = FALSE; + } + + if (touchScreenInput == FALSE) { + if (gSystem.pressedKeys & PAD_BUTTON_A) { + input = INPUT_A_BUTTON; + } else if (gSystem.pressedKeys & PAD_BUTTON_B) { + input = INPUT_B_BUTTON; + } + } + + return input; +} + +static void TrainerCard_HandleBadgePolishing(TrainerCardScreen *trainerCardScreen) +{ + int distance; + BOOL validMovement = FALSE; + + if ((gSystem.touchX != (u16)TOUCHSCREEN_INPUT_NONE) && (gSystem.touchY != (u16)TOUCHSCREEN_INPUT_NONE) && (trainerCardScreen->lastTouchedX != (u16)TOUCHSCREEN_INPUT_NONE) && (trainerCardScreen->lastTouchedY != (u16)TOUCHSCREEN_INPUT_NONE)) { + if ((trainerCardScreen->touchedRectangleIndex != TOUCHSCREEN_INPUT_NONE) && (trainerCardScreen->touchedRectangleIndex != TOUCH_RECTANGLE_OPEN_CLOSE_BADGE_CASE)) { + if (trainerCardScreen->trainerCard->badges[trainerCardScreen->touchedRectangleIndex - TOUCH_RECTANGLE_COAL_BADGE].obtained) { + if (trainerCardScreen->lastTouchedX > gSystem.touchX) { + distance = trainerCardScreen->lastTouchedX - gSystem.touchX; + trainerCardScreen->badgePolishingState.currentXDirection = -1; + } else { + distance = gSystem.touchX - trainerCardScreen->lastTouchedX; + trainerCardScreen->badgePolishingState.currentXDirection = 1; + } + + if ((distance >= 3) && (distance <= 40)) { + if (trainerCardScreen->lastTouchedY > gSystem.touchY) { + distance = trainerCardScreen->lastTouchedY - gSystem.touchY; + trainerCardScreen->badgePolishingState.currentYDirection = -1; + } else { + distance = gSystem.touchY - trainerCardScreen->lastTouchedY; + trainerCardScreen->badgePolishingState.currentYDirection = 1; + } + + if (distance <= 40) { + validMovement = TRUE; + TrainerCard_PlayPolishingSoundEffects(&trainerCardScreen->badgePolishingState); + } else { + TrainerCard_ResetBadgePolishingDirection(&trainerCardScreen->badgePolishingState); + } + } else if (distance <= 40) { + if (trainerCardScreen->lastTouchedY > gSystem.touchY) { + distance = trainerCardScreen->lastTouchedY - gSystem.touchY; + trainerCardScreen->badgePolishingState.currentYDirection = -1; + } else { + distance = gSystem.touchY - trainerCardScreen->lastTouchedY; + trainerCardScreen->badgePolishingState.currentYDirection = 1; + } + + if ((distance >= 3) && (distance <= 40)) { + validMovement = TRUE; + TrainerCard_PlayPolishingSoundEffects(&trainerCardScreen->badgePolishingState); + } else { + TrainerCard_ResetBadgePolishingDirection(&trainerCardScreen->badgePolishingState); + } + } + + if (validMovement) { + TrainerCard_PolishBadge(trainerCardScreen, trainerCardScreen->touchedRectangleIndex - TOUCH_RECTANGLE_COAL_BADGE); + } + } + } + } + + trainerCardScreen->lastTouchedX = gSystem.touchX; + trainerCardScreen->lastTouchedY = gSystem.touchY; +} + +static void TrainerCard_RedrawBadgeCaseButton(TrainerCardScreen *trainerCardScreen, u8 buttonSpriteIndex) +{ + u16 *tilemapBuffer = (u16 *)Bg_GetTilemapBuffer(trainerCardScreen->bgConfig, BG_LAYER_MAIN_2); + u16 baseTile = (4 * 32) + (4 * buttonSpriteIndex); + + u8 x, y; + for (y = 0; y < 4; y++) { + for (x = 0; x < 4; x++) { + tilemapBuffer[(y + 19) * 32 + x + 14] = baseTile + y * 32 + x; + } + } + + Bg_CopyTilemapBufferToVRAM(trainerCardScreen->bgConfig, BG_LAYER_MAIN_2); +} + +static void TrainerCard_HideGymLeaderFace_Unused(TrainerCardScreen *trainerCardScreen, u8 gymLeader) +{ + u8 portraitToReplaceX = 3; + u8 portraitToReplaceY = 4; + u8 gymLeaderColumn = gymLeader % 4; + u8 gymLeaderRow = gymLeader / 4; + + portraitToReplaceX += (gymLeaderColumn * 7); + portraitToReplaceY += (gymLeaderRow * 7); + + u8 *tilemapBuffer = (u8 *)Bg_GetTilemapBuffer(trainerCardScreen->bgConfig, BG_LAYER_MAIN_3); + u16 anonymousPortraitBaseTile = 5 * 32 + 26; + + u8 x, y; + for (y = 0; y < 5; y++) { + for (x = 0; x < 5; x++) { + tilemapBuffer[(y + portraitToReplaceY) * 32 + x + portraitToReplaceX] = anonymousPortraitBaseTile + y * 16 + x; + } + } +} + +static void TrainerCard_TransferGraphicsOnVBlank(void *unused) +{ + VramTransfer_Process(); + RenderOam_Transfer(); + + OS_SetIrqCheckFlag(OS_IE_V_BLANK); +} + +static void TrainerCard_PolishBadge(TrainerCardScreen *trainerCardScreen, u8 badgeID) +{ + int updatedPolish = (trainerCardScreen->trainerCard->badges[badgeID].polish) + 1; + + if (updatedPolish < MAX_BADGE_POLISH + 1) { + u8 currentPolishLevel = TrainerCard_GetBadgePolishLevel(trainerCardScreen->trainerCard->badges[badgeID].polish); + + trainerCardScreen->polishingProgress[badgeID]++; + + if (trainerCardScreen->polishingProgress[badgeID] >= sPolishThresholds[currentPolishLevel]) { + trainerCardScreen->polishingProgress[badgeID] = 0; + trainerCardScreen->trainerCard->badges[badgeID].polish++; + + u8 updatedPolishLevel = TrainerCard_GetBadgePolishLevel(updatedPolish); + GF_ASSERT(currentPolishLevel <= updatedPolishLevel); + + if (currentPolishLevel < updatedPolishLevel) { + if (updatedPolishLevel <= BADGE_POLISH_LEVEL_4_SPARKLES) { + if (updatedPolishLevel == BADGE_POLISH_LEVEL_4_SPARKLES) { + TrainerCard_DrawBadgeDirt(&trainerCardScreen->spriteData, badgeID, 0); + } else { + TrainerCard_DrawBadgeDirt(&trainerCardScreen->spriteData, badgeID, BADGE_POLISH_LEVEL_2_SPARKLES - updatedPolishLevel); + } + } + + if (updatedPolishLevel == BADGE_POLISH_LEVEL_2_SPARKLES) { + Sprite_SetDrawFlag(trainerCardScreen->spriteData.sprites[TRAINER_CARD_TWO_SPARKLES_SPRITES_INDEX + badgeID], TRUE); + } else if (updatedPolishLevel == BADGE_POLISH_LEVEL_4_SPARKLES) { + Sprite_SetDrawFlag(trainerCardScreen->spriteData.sprites[TRAINER_CARD_TWO_SPARKLES_SPRITES_INDEX + badgeID], FALSE); + Sprite_SetDrawFlag(trainerCardScreen->spriteData.sprites[TRAINER_CARD_FOUR_SPARKLES_SPRITES_INDEX + badgeID], TRUE); + } + } + } + } +} + +static void TrainerCard_ResetAffineTransforms(void) +{ + MtxFx22 affineTransform; + + fx32 xScale = FX_Inv(1 << FX32_SHIFT); + fx32 yScale = FX_Inv(1 << FX32_SHIFT); + affineTransform._00 = xScale; + affineTransform._01 = 0; + affineTransform._10 = 0; + affineTransform._11 = yScale; + + SVC_WaitVBlankIntr(); + + G2S_SetBG2Affine(&affineTransform, 128, 96, 0, 0); + G2S_SetBG3Affine(&affineTransform, 128, 96, 0, 0); + + SVC_WaitVBlankIntr(); + + G2_SetBG3Affine(&affineTransform, 128, 0, 0, 0); +} + +static void TrainerCard_HandleBadgeCaseButtonAnimation(TrainerCardScreen *trainerCardScreen) +{ + if (trainerCardScreen->badgeCaseButtonState == BUTTON_STATE_PUSHED) { + if (TrainerCard_AnimateBadgeCaseButton(trainerCardScreen, sButtonAnimData[0])) { + trainerCardScreen->badgeCaseButtonState = BUTTON_STATE_DEFAULT; + } + } else if (trainerCardScreen->badgeCaseButtonState == BUTTON_STATE_SPRING_BACK) { + if (TrainerCard_AnimateBadgeCaseButton(trainerCardScreen, sButtonAnimData[1])) { + trainerCardScreen->badgeCaseButtonState = BUTTON_STATE_DEFAULT; + } + } +} + +static BOOL TrainerCard_AnimateBadgeCaseButton(TrainerCardScreen *trainerCardScreen, const u8 *buttonAnimData) +{ + u8 duration = buttonAnimData[trainerCardScreen->badgeCaseButtonAnimIndex * 2]; + + if (duration == 0) { + trainerCardScreen->badgeCaseButtonAnimTimer = 0; + trainerCardScreen->badgeCaseButtonAnimIndex = 0; + return TRUE; + } else if (trainerCardScreen->badgeCaseButtonAnimTimer >= duration) { + trainerCardScreen->badgeCaseButtonAnimTimer = 0; + trainerCardScreen->badgeCaseButtonAnimIndex++; + } + + u8 buttonSpriteIndex = buttonAnimData[trainerCardScreen->badgeCaseButtonAnimIndex * 2 + 1]; + + if (trainerCardScreen->badgeCaseButtonAnimTimer == 0) { + TrainerCard_RedrawBadgeCaseButton(trainerCardScreen, buttonSpriteIndex); + } + + trainerCardScreen->badgeCaseButtonAnimTimer++; + + return FALSE; +} + +static void TrainerCard_DrawTrainer(TrainerCardScreen *trainerCardScreen) +{ + u32 size = trainerCardScreen->trainerScreenData->szByte; + + Bg_LoadTiles(trainerCardScreen->bgConfig, BG_LAYER_SUB_3, trainerCardScreen->trainerCharacterData->pRawData, trainerCardScreen->trainerCharacterData->szByte, 0); + + if (Bg_GetTilemapBuffer(trainerCardScreen->bgConfig, BG_LAYER_SUB_3) != NULL) { + Bg_LoadTilemapBuffer(trainerCardScreen->bgConfig, BG_LAYER_SUB_3, trainerCardScreen->trainerScreenData->rawData, size); + } + + Bg_CopyTilemapBufferRangeToVRAM(trainerCardScreen->bgConfig, BG_LAYER_SUB_3, trainerCardScreen->trainerScreenData->rawData, size, 0); +} + +static void TrainerCard_ClearTrainerSprite(TrainerCardScreen *trainerCardScreen) +{ + Bg_FillTilemapRect(trainerCardScreen->bgConfig, BG_LAYER_SUB_3, 0, 20, 6, 6, 9, TILEMAP_FILL_VAL_KEEP_PALETTE); +} + +static u8 TrainerCard_GetBadgePolishLevel(int badgePolish) +{ + u8 level; + + if ((0 <= badgePolish) && (badgePolish < BADGE_POLISH_THRESHOLD_DIRTY)) { + level = BADGE_POLISH_LEVEL_FILTHY; + } else if (badgePolish < BADGE_POLISH_THRESHOLD_NORMAL) { + level = BADGE_POLISH_LEVEL_DIRTY; + } else if (badgePolish < BADGE_POLISH_THRESHOLD_2_SPARKLES) { + level = BADGE_POLISH_LEVEL_NORMAL; + } else if (badgePolish < BADGE_POLISH_THRESHOLD_4_SPARKLES) { + level = BADGE_POLISH_LEVEL_2_SPARKLES; + } else if (badgePolish < MAX_BADGE_POLISH + 1) { + level = BADGE_POLISH_LEVEL_4_SPARKLES; + } else { + GF_ASSERT(FALSE); + level = 0; + } + + return level; +} + +static void TrainerCard_ResetBadgePolishingDirection(BadgePolishingState *badgePolishingState) +{ + badgePolishingState->currentXDirection = 0; + badgePolishingState->currentYDirection = 0; +} + +static void TrainerCard_ResetBadgePolishingState(BadgePolishingState *badgePolishingState) +{ + badgePolishingState->previousXDirection = 0; + badgePolishingState->previousYDirection = 0; + badgePolishingState->currentXDirection = 0; + badgePolishingState->currentYDirection = 0; + badgePolishingState->soundEffectIndex = 0; +} + +static void TrainerCard_PlayPolishingSoundEffects(BadgePolishingState *badgePolishingState) +{ + int soundEffects[2] = { + SEQ_SE_DP_MIGAKU01, SEQ_SE_DP_MIGAKU02 + }; + + if (badgePolishingState->previousXDirection == 0 && badgePolishingState->previousYDirection == 0) { + Sound_PlayEffect(SEQ_SE_DP_MIGAKU01); + } + + if ((badgePolishingState->previousXDirection * badgePolishingState->currentXDirection < 0) || (badgePolishingState->previousYDirection * badgePolishingState->currentYDirection < 0)) { + badgePolishingState->soundEffectIndex = (badgePolishingState->soundEffectIndex + 1) % 2; + Sound_PlayEffect(soundEffects[badgePolishingState->soundEffectIndex]); + } + + badgePolishingState->previousXDirection = badgePolishingState->currentXDirection; + badgePolishingState->previousYDirection = badgePolishingState->currentYDirection; + badgePolishingState->currentXDirection = 0; + badgePolishingState->currentYDirection = 0; +} + +static void TrainerCard_ConvertSignatureDataToPixels(const u8 *signatureData, u8 *signaturePixels) +{ + for (int pixel = 0; pixel < SIGNATURE_WIDTH * SIGNATURE_HEIGHT * TILE_SIZE_8BPP; pixel++) { + int tileIndex = pixel / TILE_SIZE_8BPP; + u8 offset = (pixel / 8) % 8; + u8 shift = pixel % 8; + + signaturePixels[pixel] = 0x1 & (signatureData[(tileIndex * 8) + offset] >> shift); + } +} + +static void TrainerCard_DisplaySignature(BgConfig *bgConfig, int bgLayer, const u8 *signature) +{ + u16 *tilemapBuffer; + u8 x, y; + u16 tileIndex; + + Bg_LoadTiles(bgConfig, bgLayer, signature, SIGNATURE_WIDTH * SIGNATURE_HEIGHT * TILE_SIZE_8BPP, 1); + + tilemapBuffer = (u16 *)Bg_GetTilemapBuffer(bgConfig, bgLayer); + tileIndex = 0; + + for (y = 0; y < SIGNATURE_HEIGHT; y++) { + for (x = 0; x < SIGNATURE_WIDTH; x++) { + tilemapBuffer[(14 + y) * 32 + x + 4] = 1 + tileIndex; + tileIndex++; + } + } + + Bg_CopyTilemapBufferToVRAM(bgConfig, bgLayer); +} + +static void TrainerCard_PlayOpenCloseBadgeCaseSoundEffect(int unused) +{ + Sound_PlayEffect(SEQ_SE_DP_CARD11); +} + +static void TrainerCard_UpdatePlayTime(TrainerCardScreen *trainerCardScreen, u8 liveTimeDisplay) +{ + if (!liveTimeDisplay) { + return; + } + + if (!trainerCardScreen->viewingBack) { + if (trainerCardScreen->timer == 15) { + TrainerCard_DrawUpdatedTime(trainerCardScreen->windows, trainerCardScreen->trainerCard, trainerCardScreen->unusedStrbuf); + + TrainerCard_BlinkPlaytimeColon(&(trainerCardScreen->windows[TRAINER_CARD_WINDOW_TIME]), TRUE, trainerCardScreen->colonStrbuf); + } else if (trainerCardScreen->timer == 0) { + TrainerCard_BlinkPlaytimeColon(&(trainerCardScreen->windows[TRAINER_CARD_WINDOW_TIME]), FALSE, trainerCardScreen->colonStrbuf); + } + } + + trainerCardScreen->timer = (trainerCardScreen->timer + 1) % 30; +} + +static int TrainerCard_CheckTouchedRectangles(BgConfig *bgConfig, const TouchScreenRect *rects) +{ + int touchedRectangle = TouchScreen_CheckRectanglePressed(rects); + + if (touchedRectangle != TOUCHSCREEN_INPUT_NONE) { + if (touchedRectangle != TOUCH_RECTANGLE_OPEN_CLOSE_BADGE_CASE) { + u16 caseBackground = 0x40; + + if (Bg_DoesPixelAtXYMatchVal(bgConfig, BG_LAYER_MAIN_2, gSystem.touchX, gSystem.touchY, &caseBackground) == FALSE) { + return TOUCHSCREEN_INPUT_NONE; + } + } else { + return touchedRectangle; + } + } + + return touchedRectangle; +} + +static int TrainerCard_CheckHeldRectangles(BgConfig *bgConfig, const TouchScreenRect *rects) +{ + int heldRectangle = TouchScreen_CheckRectangleHeld(rects); + + if (heldRectangle != TOUCHSCREEN_INPUT_NONE) { + if (heldRectangle != TOUCH_RECTANGLE_OPEN_CLOSE_BADGE_CASE) { + u16 caseBackground = 0x40; + + if (Bg_DoesPixelAtXYMatchVal(bgConfig, BG_LAYER_MAIN_2, gSystem.touchX, gSystem.touchY, &caseBackground) == FALSE) { + return TOUCHSCREEN_INPUT_NONE; + } + } else { + return heldRectangle; + } + } + + return heldRectangle; +} diff --git a/src/trainer_card_screen/trainer_card_sprites.c b/src/trainer_card_screen/trainer_card_sprites.c new file mode 100644 index 0000000000..6854092805 --- /dev/null +++ b/src/trainer_card_screen/trainer_card_sprites.c @@ -0,0 +1,226 @@ +#include "trainer_card_screen/trainer_card_sprites.h" + +#include +#include + +#include "trainer_card_screen/trainer_card_screen_defs.h" + +#include "badges.h" +#include "char_transfer.h" +#include "gx_layers.h" +#include "heap.h" +#include "narc.h" +#include "pltt_transfer.h" +#include "render_oam.h" +#include "sprite.h" +#include "sprite_resource.h" +#include "sprite_transfer.h" +#include "sprite_util.h" + +typedef struct Coordinates { + int x; + int y; +} Coordinates; + +static const u8 sSpriteResourceCapacities[4] = { + [SPRITE_RESOURCE_CHAR] = 1, + [SPRITE_RESOURCE_PLTT] = 2, + [SPRITE_RESOURCE_CELL] = 1, + [SPRITE_RESOURCE_ANIM] = 1 +}; + +static const Coordinates sBadgeCoordinates[] = { + [BADGE_ID_COAL] = { .x = 24, .y = 40 }, + [BADGE_ID_FOREST] = { .x = 80, .y = 40 }, + [BADGE_ID_COBBLE] = { .x = 136, .y = 40 }, + [BADGE_ID_FEN] = { .x = 192, .y = 40 }, + [BADGE_ID_RELIC] = { .x = 24, .y = 72 }, + [BADGE_ID_MINE] = { .x = 80, .y = 72 }, + [BADGE_ID_ICICLE] = { .x = 136, .y = 72 }, + [BADGE_ID_BEACON] = { .x = 192, .y = 72 } +}; + +static const Coordinates sSparkleCoordinates[] = { + [BADGE_ID_COAL] = { .x = 24, .y = 40 }, + [BADGE_ID_FOREST] = { .x = 80, .y = 40 }, + [BADGE_ID_COBBLE] = { .x = 136, .y = 40 }, + [BADGE_ID_FEN] = { .x = 192, .y = 40 }, + [BADGE_ID_RELIC] = { .x = 24, .y = 96 }, + [BADGE_ID_MINE] = { .x = 80, .y = 96 }, + [BADGE_ID_ICICLE] = { .x = 136, .y = 96 }, + [BADGE_ID_BEACON] = { .x = 192, .y = 96 } +}; + +static void TrainerCard_InitCharPlttTransferBuffers(void); + +void TrainerCard_InitSpriteData(TrainerCardSpriteData *spriteData, NARC *narc) +{ + int resourceType; + + TrainerCard_InitCharPlttTransferBuffers(); + NNS_G2dInitOamManagerModule(); + RenderOam_Init(0, 128, 0, 32, 0, 128, 0, 32, HEAP_ID_TRAINER_CARD_SCREEN); + + spriteData->spriteList = SpriteList_InitRendering((MAX_BADGES * 3 + 1), &spriteData->g2dRenderer, HEAP_ID_TRAINER_CARD_SCREEN); + + for (resourceType = SPRITE_RESOURCE_CHAR; resourceType < SPRITE_RESOURCE_MULTI_CELL; resourceType++) { + spriteData->spriteResourceCollection[resourceType] = SpriteResourceCollection_New(sSpriteResourceCapacities[resourceType], resourceType, HEAP_ID_TRAINER_CARD_SCREEN); + } + + spriteData->spriteResources[0][SPRITE_RESOURCE_CHAR] = SpriteResourceCollection_AddTilesFrom(spriteData->spriteResourceCollection[SPRITE_RESOURCE_CHAR], narc, 33, FALSE, 1, NNS_G2D_VRAM_TYPE_2DMAIN, HEAP_ID_TRAINER_CARD_SCREEN); + spriteData->spriteResources[0][SPRITE_RESOURCE_PLTT] = SpriteResourceCollection_AddPaletteFrom(spriteData->spriteResourceCollection[SPRITE_RESOURCE_PLTT], narc, 14, FALSE, 1, NNS_G2D_VRAM_TYPE_2DMAIN, 9, HEAP_ID_TRAINER_CARD_SCREEN); + spriteData->spriteResources[0][SPRITE_RESOURCE_CELL] = SpriteResourceCollection_AddFrom(spriteData->spriteResourceCollection[SPRITE_RESOURCE_CELL], narc, 44, FALSE, 1, SPRITE_RESOURCE_CELL, HEAP_ID_TRAINER_CARD_SCREEN); + spriteData->spriteResources[0][SPRITE_RESOURCE_ANIM] = SpriteResourceCollection_AddFrom(spriteData->spriteResourceCollection[SPRITE_RESOURCE_ANIM], narc, 46, FALSE, 1, SPRITE_RESOURCE_ANIM, HEAP_ID_TRAINER_CARD_SCREEN); + + SpriteTransfer_RequestChar(spriteData->spriteResources[0][SPRITE_RESOURCE_CHAR]); + SpriteTransfer_RequestPlttWholeRange(spriteData->spriteResources[0][SPRITE_RESOURCE_PLTT]); + + u8 badgeID; + const int badgePaletteNarcIndices[MAX_BADGES] = { + [BADGE_ID_COAL] = 16, + [BADGE_ID_FOREST] = 17, + [BADGE_ID_COBBLE] = 18, + [BADGE_ID_FEN] = 19, + [BADGE_ID_RELIC] = 20, + [BADGE_ID_MINE] = 21, + [BADGE_ID_ICICLE] = 22, + [BADGE_ID_BEACON] = 23 + }; + + for (badgeID = 0; badgeID < MAX_BADGES; badgeID++) { + spriteData->badgePaletteBuffers[badgeID] = NARC_AllocAndReadWholeMember(narc, badgePaletteNarcIndices[badgeID], HEAP_ID_TRAINER_CARD_SCREEN); + + if (spriteData->badgePaletteBuffers[badgeID] != NULL) { + if (NNS_G2dGetUnpackedPaletteData(spriteData->badgePaletteBuffers[badgeID], &spriteData->badgePalettes[badgeID]) == FALSE) { + Heap_Free(spriteData->badgePalettes[badgeID]); + GF_ASSERT(FALSE); + } + } else { + GF_ASSERT(FALSE); + } + } + + GXLayers_EngineAToggleLayers(GX_PLANEMASK_OBJ, TRUE); +} + +void TrainerCard_DrawBadgeCaseSprites(TrainerCardSpriteData *spriteData, u8 *badgesObtained) +{ + int badgeID; + SpriteResourcesHeader resourceData; + + SpriteResourcesHeader_Init(&resourceData, 1, 1, 1, 1, 0xffffffff, 0xffffffff, FALSE, 1, spriteData->spriteResourceCollection[SPRITE_RESOURCE_CHAR], spriteData->spriteResourceCollection[SPRITE_RESOURCE_PLTT], spriteData->spriteResourceCollection[SPRITE_RESOURCE_CELL], spriteData->spriteResourceCollection[SPRITE_RESOURCE_ANIM], NULL, NULL); + + u8 index; + AffineSpriteListTemplate template; + + template.list = spriteData->spriteList; + template.resourceData = &resourceData; + template.position.x = 0; + template.position.y = 0; + template.position.z = 0; + template.affineScale.x = FX32_ONE; + template.affineScale.y = FX32_ONE; + template.affineScale.z = FX32_ONE; + template.affineZRotation = 0; + template.priority = 2; + template.vramType = NNS_G2D_VRAM_TYPE_2DMAIN; + template.heapID = HEAP_ID_TRAINER_CARD_SCREEN; + + for (badgeID = 0; badgeID < MAX_BADGES; badgeID++) { + template.position.x = FX32_ONE * sBadgeCoordinates[badgeID].x; + template.position.y = FX32_ONE * sBadgeCoordinates[badgeID].y; + spriteData->sprites[badgeID] = SpriteList_AddAffine(&template); + Sprite_SetAnimateFlag(spriteData->sprites[badgeID], FALSE); + Sprite_SetAnim(spriteData->sprites[badgeID], badgeID); + + if (!badgesObtained[badgeID]) { + Sprite_SetDrawFlag(spriteData->sprites[badgeID], FALSE); + } + } + + index = TRAINER_CARD_TWO_SPARKLES_SPRITES_INDEX; + + for (badgeID = 0; badgeID < MAX_BADGES; badgeID++) { + template.position.x = FX32_ONE * sSparkleCoordinates[badgeID].x; + template.position.y = FX32_ONE * sSparkleCoordinates[badgeID].y; + template.priority = 1; + spriteData->sprites[index + badgeID] = SpriteList_AddAffine(&template); + Sprite_SetAnimateFlag(spriteData->sprites[index + badgeID], TRUE); + Sprite_SetAnim(spriteData->sprites[index + badgeID], 8); + Sprite_SetDrawFlag(spriteData->sprites[index + badgeID], FALSE); + } + + index += TRAINER_CARD_FOUR_SPARKLES_SPRITES_INDEX - TRAINER_CARD_TWO_SPARKLES_SPRITES_INDEX; + + for (badgeID = 0; badgeID < MAX_BADGES; badgeID++) { + template.position.x = FX32_ONE * sSparkleCoordinates[badgeID].x; + template.position.y = FX32_ONE * sSparkleCoordinates[badgeID].y; + template.priority = 1; + spriteData->sprites[index + badgeID] = SpriteList_AddAffine(&template); + Sprite_SetAnimateFlag(spriteData->sprites[index + badgeID], TRUE); + Sprite_SetAnim(spriteData->sprites[index + badgeID], 9); + Sprite_SetDrawFlag(spriteData->sprites[index + badgeID], FALSE); + } + + index += TRAINER_CARD_BADGE_CASE_BUTTON_EFFECT_SPRITE_INDEX - TRAINER_CARD_FOUR_SPARKLES_SPRITES_INDEX; + + resourceData.priority = 0; + template.position.x = FX32_ONE * (12 * 8); + template.position.y = FX32_ONE * (17 * 8); + template.priority = 0; + spriteData->sprites[index] = SpriteList_AddAffine(&template); + Sprite_SetAnimateFlag(spriteData->sprites[index], FALSE); + Sprite_SetAnim(spriteData->sprites[index], 10); + Sprite_SetDrawFlag(spriteData->sprites[index], FALSE); +} + +void TrainerCard_FreeSprites(TrainerCardSpriteData *spriteData) +{ + u8 i; + + for (i = 0; i < MAX_BADGES; i++) { + Heap_Free(spriteData->badgePaletteBuffers[i]); + } + + SpriteTransfer_ResetCharTransfer(spriteData->spriteResources[0][0]); + SpriteTransfer_ResetPlttTransfer(spriteData->spriteResources[0][1]); + + for (i = SPRITE_RESOURCE_CHAR; i < SPRITE_RESOURCE_MULTI_CELL; i++) { + SpriteResourceCollection_Delete(spriteData->spriteResourceCollection[i]); + } + + SpriteList_Delete(spriteData->spriteList); + RenderOam_Free(); + CharTransfer_Free(); + PlttTransfer_Free(); +} + +void TrainerCard_DrawBadgeDirt(TrainerCardSpriteData *spriteData, u8 badgeID, u8 dirtLevel) +{ + GF_ASSERT(badgeID < MAX_BADGES); + GF_ASSERT(dirtLevel <= 3); + + NNSG2dImagePaletteProxy *paletteProxy = Sprite_GetPaletteProxy(spriteData->sprites[badgeID]); + u32 vramLocation = NNS_G2dGetImagePaletteLocation(paletteProxy, NNS_G2D_VRAM_TYPE_2DMAIN); + vramLocation += badgeID * PALETTE_SIZE_BYTES; + u8 *rawData = spriteData->badgePalettes[badgeID]->pRawData; + + DC_FlushRange(&rawData[dirtLevel * PALETTE_SIZE_BYTES], PALETTE_SIZE_BYTES); + GX_LoadOBJPltt(&rawData[dirtLevel * PALETTE_SIZE_BYTES], vramLocation, PALETTE_SIZE_BYTES); +} + +static void TrainerCard_InitCharPlttTransferBuffers(void) +{ + CharTransferTemplate template = { + .maxTasks = 1, + .sizeMain = 2048, + .sizeSub = 0, + .heapID = HEAP_ID_TRAINER_CARD_SCREEN + }; + + CharTransfer_Init(&template); + + PlttTransfer_Init(2, HEAP_ID_TRAINER_CARD_SCREEN); + CharTransfer_ClearBuffers(); + PlttTransfer_Clear(); +} diff --git a/src/unk_0202854C.c b/src/unk_0202854C.c index 6b8807a691..81f57ab3d9 100644 --- a/src/unk_0202854C.c +++ b/src/unk_0202854C.c @@ -169,7 +169,7 @@ static int sub_02028638(Underground *underground) return -1; } -void sub_02028658(SaveData *saveData, int param1) +void sub_02028658(SaveData *saveData, int daysPassed) { Underground *v0 = SaveData_GetUnderground(saveData); MATHRandContext16 v1; @@ -177,13 +177,13 @@ void sub_02028658(SaveData *saveData, int param1) u8 v3[] = { 0, 1, 1, 3, 3, 5 }; int i, v5, v6, v7, j; - if (param1 <= 0) { + if (daysPassed <= 0) { return; } - v5 = param1; + v5 = daysPassed; - if (param1 > 99) { + if (daysPassed > 99) { v5 = 99; } @@ -204,7 +204,7 @@ void sub_02028658(SaveData *saveData, int param1) } } - v0->randomSeed = ARNG_Next(v0->randomSeed + param1); + v0->randomSeed = ARNG_Next(v0->randomSeed + daysPassed); v0->unk_9AC_0 = 1; } diff --git a/src/unk_0203D1B8.c b/src/unk_0203D1B8.c index 68537d7f14..ebdcd58cbb 100644 --- a/src/unk_0203D1B8.c +++ b/src/unk_0203D1B8.c @@ -54,7 +54,6 @@ #include "overlay058/ov58_021D0D80.h" #include "overlay059/ov59_021D0D80.h" #include "overlay064/ov64_0222DCE0.h" -#include "overlay071/ov71_0223B140.h" #include "overlay072/ov72_0223D7A0.h" #include "overlay080/ov80_021D0D80.h" #include "overlay084/const_ov84_02241130.h" @@ -79,6 +78,7 @@ #include "overlay110/ov110_021D0D80.h" #include "overlay111/ov111_021D0D80.h" #include "savedata/save_table.h" +#include "trainer_card_screen/trainer_card_screen.h" #include "bag.h" #include "coins.h" @@ -153,7 +153,7 @@ FS_EXTERN_OVERLAY(overlay58); FS_EXTERN_OVERLAY(overlay59); FS_EXTERN_OVERLAY(overlay61); FS_EXTERN_OVERLAY(overlay64); -FS_EXTERN_OVERLAY(overlay71); +FS_EXTERN_OVERLAY(trainer_card_screen); FS_EXTERN_OVERLAY(overlay72); FS_EXTERN_OVERLAY(options_menu); FS_EXTERN_OVERLAY(choose_starter); @@ -1266,18 +1266,18 @@ void sub_0203DFE8(FieldTask *param0, int param1, int param2, int param3, int par FieldTask_InitCall(param0, sub_0203DE98, v2); } -void sub_0203E09C(FieldSystem *fieldSystem, TrainerCard *param1) +void FieldSystem_OpenTrainerCardScreen(FieldSystem *fieldSystem, TrainerCard *trainerCard) { - FS_EXTERN_OVERLAY(overlay71); + FS_EXTERN_OVERLAY(trainer_card_screen); - static const ApplicationManagerTemplate v0 = { - ov71_0223B140, - ov71_0223B388, - ov71_0223B5B8, - FS_OVERLAY_ID(overlay71) + static const ApplicationManagerTemplate template = { + .init = TrainerCardScreen_Init, + .main = TrainerCardScreen_Main, + .exit = TrainerCardScreen_Exit, + .overlayID = FS_OVERLAY_ID(trainer_card_screen) }; - FieldSystem_StartChildProcess(fieldSystem, &v0, param1); + FieldSystem_StartChildProcess(fieldSystem, &template, trainerCard); } BOOL sub_0203E0AC(FieldSystem *fieldSystem, void *param1) diff --git a/src/unk_020559DC.c b/src/unk_020559DC.c index c8d9df3553..0bbe5ebf9d 100644 --- a/src/unk_020559DC.c +++ b/src/unk_020559DC.c @@ -18,12 +18,12 @@ #include "special_encounter.h" #include "system_data.h" #include "system_vars.h" +#include "trainer_card_badge_dirt.h" #include "unk_0202854C.h" #include "unk_0202C858.h" #include "unk_0202E2CC.h" #include "unk_02055C50.h" #include "unk_0206B9D8.h" -#include "unk_0206C2D0.h" #include "unk_0206CCB0.h" #include "vars_flags.h" @@ -48,15 +48,15 @@ void sub_020559DC(FieldSystem *fieldSystem) inline_020559DC(fieldSystem, v2, &v0, &v1); } -static void sub_02055A14(FieldSystem *fieldSystem, GameTime *param1, const RTCDate *param2) +static void sub_02055A14(FieldSystem *fieldSystem, GameTime *gameTime, const RTCDate *currentDate) { - s32 v0 = RTC_ConvertDateToDay(param2); + s32 currentDay = RTC_ConvertDateToDay(currentDate); - if (v0 < param1->day) { - param1->day = v0; - } else if (v0 > param1->day) { - sub_02055AC0(fieldSystem, v0 - param1->day); - param1->day = v0; + if (currentDay < gameTime->day) { + gameTime->day = currentDay; + } else if (currentDay > gameTime->day) { + sub_02055AC0(fieldSystem, currentDay - gameTime->day); + gameTime->day = currentDay; } } @@ -84,27 +84,27 @@ static void inline_020559DC(FieldSystem *fieldSystem, GameTime *param1, const RT } } -static void sub_02055AC0(FieldSystem *fieldSystem, s32 param1) +static void sub_02055AC0(FieldSystem *fieldSystem, s32 daysPassed) { - sub_02028658(FieldSystem_GetSaveData(fieldSystem), param1); + sub_02028658(FieldSystem_GetSaveData(fieldSystem), daysPassed); sub_0203F1FC(fieldSystem); - sub_0206C2D0(fieldSystem->saveData, param1); - RecordMixedRNG_AdvanceEntries(SaveData_GetRecordMixedRNG(fieldSystem->saveData), param1); + TrainerCard_AccumulateBadgeDirt(fieldSystem->saveData, daysPassed); + RecordMixedRNG_AdvanceEntries(SaveData_GetRecordMixedRNG(fieldSystem->saveData), daysPassed); SpecialEncounter_SetMixedRecordDailies(SaveData_GetSpecialEncounters(fieldSystem->saveData), RecordMixedRNG_GetRand(SaveData_GetRecordMixedRNG(fieldSystem->saveData))); { Party *v0; v0 = SaveData_GetParty(fieldSystem->saveData); - Party_UpdatePokerusStatus(v0, param1); + Party_UpdatePokerusStatus(v0, daysPassed); } { VarsFlags *varsFlags = SaveData_GetVarsFlags(fieldSystem->saveData); u16 deadlineInDays = SystemVars_GetNewsPressDeadline(varsFlags); - if (deadlineInDays > param1) { - deadlineInDays -= param1; + if (deadlineInDays > daysPassed) { + deadlineInDays -= daysPassed; } else { deadlineInDays = 0; } @@ -113,7 +113,7 @@ static void sub_02055AC0(FieldSystem *fieldSystem, s32 param1) } { - SystemVars_SynchronizeJubilifeLotteryTrainerID(fieldSystem->saveData, param1); + SystemVars_SynchronizeJubilifeLotteryTrainerID(fieldSystem->saveData, daysPassed); } { diff --git a/src/unk_0205A0D8.c b/src/unk_0205A0D8.c index 4c08c3ceb9..0dfda69313 100644 --- a/src/unk_0205A0D8.c +++ b/src/unk_0205A0D8.c @@ -1041,7 +1041,7 @@ static BOOL sub_0205B140(FieldTask *param0) } break; case 3: - sub_0203E09C(fieldSystem, v2); + FieldSystem_OpenTrainerCardScreen(fieldSystem, v2); v1->unk_28++; break; case 4: diff --git a/src/unk_0205B33C.c b/src/unk_0205B33C.c index c20aa0f565..2894b1da43 100644 --- a/src/unk_0205B33C.c +++ b/src/unk_0205B33C.c @@ -1372,7 +1372,7 @@ void *sub_0205C17C(UnkStruct_0205B43C *param0) param0->unk_188[0] = TrainerCard_New(HEAP_ID_SYSTEM); param0->unk_188[1] = TrainerCard_New(HEAP_ID_SYSTEM); - TrainerCard_Init(0, 0, 0, sub_0205CA14(TrainerInfo_Gender(param0->unk_08), TrainerInfo_Appearance(param0->unk_08), 0), param0->fieldSystem, param0->unk_184); + TrainerCard_Init(FALSE, FALSE, 0, sub_0205CA14(TrainerInfo_Gender(param0->unk_08), TrainerInfo_Appearance(param0->unk_08), 0), param0->fieldSystem, param0->unk_184); return (void *)param0->unk_188[CommSys_CurNetId() ^ 1]; } diff --git a/src/unk_0205C980.c b/src/unk_0205C980.c index f6a4fc9009..18a1160f6f 100644 --- a/src/unk_0205C980.c +++ b/src/unk_0205C980.c @@ -59,27 +59,27 @@ int TrainerInfo_GetAppearanceIndex(u32 trainerId, int trainerGender, u32 variant return TRAINER_APPEARANCES[v1][0]; } -static int sub_0205C9E0(int param0, int param1) +static int sub_0205C9E0(int gender, int param1) { int v0; for (v0 = 0; v0 < 16 / 2; v0++) { - if (TRAINER_APPEARANCES[v0 + (param0 * (16 / 2))][0] == param1) { - return v0 + (param0 * (16 / 2)); + if (TRAINER_APPEARANCES[v0 + (gender * (16 / 2))][0] == param1) { + return v0 + (gender * (16 / 2)); } } return 0; } -int sub_0205CA0C(int param0, int param1) +int sub_0205CA0C(int gender, int param1) { - return sub_0205C9E0(param0, param1); + return sub_0205C9E0(gender, param1); } -int sub_0205CA14(int param0, int param1, int param2) +int sub_0205CA14(int gender, int param1, int param2) { - int v0 = sub_0205C9E0(param0, param1); + int v0 = sub_0205C9E0(gender, param1); switch (param2) { case 0: diff --git a/src/unk_0206C2D0.c b/src/unk_0206C2D0.c deleted file mode 100644 index 571dffd03f..0000000000 --- a/src/unk_0206C2D0.c +++ /dev/null @@ -1,47 +0,0 @@ -#include "unk_0206C2D0.h" - -#include -#include - -#include "save_player.h" -#include "savedata.h" -#include "trainer_card_save_data.h" -#include "trainer_info.h" - -void sub_0206C2D0(SaveData *saveData, const s32 param1) -{ - u8 v0; - int v1; - TrainerCardSaveData *v2; - TrainerCardBadge *v3; - TrainerInfo *v4; - - if (param1 <= 0) { - return; - } - - v2 = SaveData_GetTrainerCardSaveData(saveData); - v3 = TrainerCardSaveData_GetTrainerCardBadges(v2); - v4 = SaveData_GetTrainerInfo(saveData); - - for (v0 = 0; v0 < 8; v0++) { - if (TrainerInfo_HasBadge(v4, v0) == 0) { - continue; - } - - v1 = TrainerCardBadge_GetCleanliness(v0, v3); - - if ((0 < v1) && (v1 < 200)) { - v1 -= (10 * param1); - } else { - GF_ASSERT(v1 < 200); - v1 = 0; - } - - if (v1 < 0) { - v1 = 0; - } - - TrainerCardBadge_SetCleanliness(v0, v1, v3); - } -} diff --git a/src/unk_02073838.c b/src/unk_02073838.c index 1b427a04d4..092af1c2f6 100644 --- a/src/unk_02073838.c +++ b/src/unk_02073838.c @@ -22,7 +22,7 @@ static void sub_020739D8(UnkStruct_02073974 *param0, void *param1, u32 param2); static const VecFx32 Unk_020F0544 = { FX32_ONE, FX32_ONE, - FX32_ONE + FX32_ONE, }; static const MtxFx33 Unk_020F0550 = { @@ -34,7 +34,7 @@ static const MtxFx33 Unk_020F0550 = { 0x0, 0x0, 0x0, - FX32_ONE + FX32_ONE, }; void sub_02073838(UnkStruct_02073838 *param0) diff --git a/src/unk_0207E0B8.c b/src/unk_0207E0B8.c index 8f2308cd17..059236c028 100644 --- a/src/unk_0207E0B8.c +++ b/src/unk_0207E0B8.c @@ -260,7 +260,7 @@ static int sub_0207E0B8(ApplicationManager *appMan, int *param1) v1 = NARC_ctor(NARC_INDEX_GRAPHIC__PL_PLIST_GRA, HEAP_ID_12); v0 = sub_0207ECC0(appMan); - StartScreenFade(FADE_MAIN_THEN_SUB, FADE_TYPE_UNK_3, FADE_TYPE_UNK_3, COLOR_BLACK, 6, 1, HEAP_ID_12); + StartScreenFade(FADE_MAIN_THEN_SUB, FADE_TYPE_DOWNWARD_IN, FADE_TYPE_DOWNWARD_IN, COLOR_BLACK, 6, 1, HEAP_ID_12); sub_0207EDC0(v0); sub_0207E8C0(); sub_0207E918(v0->unk_00);