From e727a5115aeecafbdc5fcc5ce22a19252a9d90fa Mon Sep 17 00:00:00 2001 From: Viperio <146665252+Viperio19@users.noreply.github.com> Date: Fri, 17 Oct 2025 02:26:32 +0200 Subject: [PATCH] Document hall of fame sequence (overlay086) (#759) --- generated/text_banks.txt | 2 +- .../applications/pc_hall_of_fame/manager.h | 2 +- include/constants/heap.h | 2 +- .../boat_cutscene.h | 0 include/cutscenes/hall_of_fame.h | 10 + ...{hall_of_fame.h => hall_of_fame_entries.h} | 6 +- include/overlay086/ov86_0223B140.h | 10 - include/savedata/save_table.h | 2 +- .../struct_defs/pc_hall_of_fame_screen_def.h | 2 +- include/struct_defs/struct_0203E234.h | 8 +- include/unk_0203D1B8.h | 4 +- platinum.us/main.lsf | 16 +- platinum.us/sbins_shared.sha1 | 5 +- res/text/{unk_0351.json => hall_of_fame.json} | 28 +- src/applications/pc_hall_of_fame/display.c | 10 +- .../boat_cutscene/boat_cutscene.c | 2 +- .../boat_cutscene/canalave_ship.c | 2 +- .../boat_cutscene/snowpoint_ship.c | 2 +- src/cutscenes/hall_of_fame.c | 1926 ++++++++++++++++ ...{hall_of_fame.c => hall_of_fame_entries.c} | 2 +- src/meson.build | 10 +- src/overlay086/ov86_0223B140.c | 1938 ----------------- src/savedata/save_table.c | 2 +- src/scrcmd.c | 6 +- src/unk_0203D1B8.c | 50 +- src/unk_02052C6C.c | 14 +- 26 files changed, 2024 insertions(+), 2037 deletions(-) rename include/{boat_cutscene => cutscenes}/boat_cutscene.h (100%) create mode 100644 include/cutscenes/hall_of_fame.h rename include/{hall_of_fame.h => hall_of_fame_entries.h} (92%) delete mode 100644 include/overlay086/ov86_0223B140.h rename res/text/{unk_0351.json => hall_of_fame.json} (64%) rename src/{ => cutscenes}/boat_cutscene/boat_cutscene.c (99%) rename src/{ => cutscenes}/boat_cutscene/canalave_ship.c (99%) rename src/{ => cutscenes}/boat_cutscene/snowpoint_ship.c (99%) create mode 100644 src/cutscenes/hall_of_fame.c rename src/{hall_of_fame.c => hall_of_fame_entries.c} (99%) delete mode 100644 src/overlay086/ov86_0223B140.c diff --git a/generated/text_banks.txt b/generated/text_banks.txt index 2e7dc5c9fc..841f7bc6de 100644 --- a/generated/text_banks.txt +++ b/generated/text_banks.txt @@ -349,7 +349,7 @@ TEXT_BANK_UNK_0347 TEXT_BANK_UNK_0348 TEXT_BANK_DUMMY_0349 TEXT_BANK_TRADE -TEXT_BANK_UNK_0351 +TEXT_BANK_HALL_OF_FAME TEXT_BANK_PC_HALL_OF_FAME TEXT_BANK_UNK_0353 TEXT_BANK_UNK_0354 diff --git a/include/applications/pc_hall_of_fame/manager.h b/include/applications/pc_hall_of_fame/manager.h index a466a2cabb..e36d6214c4 100644 --- a/include/applications/pc_hall_of_fame/manager.h +++ b/include/applications/pc_hall_of_fame/manager.h @@ -6,7 +6,7 @@ #include "applications/pc_hall_of_fame/display.h" -#include "hall_of_fame.h" +#include "hall_of_fame_entries.h" #include "overlay_manager.h" typedef struct PCHallOfFameMan { diff --git a/include/constants/heap.h b/include/constants/heap.h index 823e39002a..3c103b5989 100644 --- a/include/constants/heap.h +++ b/include/constants/heap.h @@ -65,7 +65,7 @@ enum HeapID { HEAP_ID_60, HEAP_ID_PC_HALL_OF_FAME, HEAP_ID_62, - HEAP_ID_63, + HEAP_ID_HALL_OF_FAME, HEAP_ID_64, HEAP_ID_65, HEAP_ID_66, diff --git a/include/boat_cutscene/boat_cutscene.h b/include/cutscenes/boat_cutscene.h similarity index 100% rename from include/boat_cutscene/boat_cutscene.h rename to include/cutscenes/boat_cutscene.h diff --git a/include/cutscenes/hall_of_fame.h b/include/cutscenes/hall_of_fame.h new file mode 100644 index 0000000000..7cfd3a3077 --- /dev/null +++ b/include/cutscenes/hall_of_fame.h @@ -0,0 +1,10 @@ +#ifndef POKEPLATINUM_HALL_OF_FAME_H +#define POKEPLATINUM_HALL_OF_FAME_H + +#include "overlay_manager.h" + +BOOL HallOfFameManager_Init(ApplicationManager *appMan, int *state); +BOOL HallOfFameManager_Exit(ApplicationManager *appMan, int *state); +BOOL HallOfFameManager_Main(ApplicationManager *appMan, int *state); + +#endif // POKEPLATINUM_HALL_OF_FAME_H diff --git a/include/hall_of_fame.h b/include/hall_of_fame_entries.h similarity index 92% rename from include/hall_of_fame.h rename to include/hall_of_fame_entries.h index 0a0f388bfe..dcc0452084 100644 --- a/include/hall_of_fame.h +++ b/include/hall_of_fame_entries.h @@ -1,5 +1,5 @@ -#ifndef POKEPLATINUM_HALL_OF_FAME_H -#define POKEPLATINUM_HALL_OF_FAME_H +#ifndef POKEPLATINUM_HALL_OF_FAME_ENTRIES_H +#define POKEPLATINUM_HALL_OF_FAME_ENTRIES_H #include @@ -56,4 +56,4 @@ u32 HallOfFame_GetEntryPokemonCount(const HallOfFame *hallOfFame, int entryIndex void HallOfFame_GetEntryPokemonData(const HallOfFame *hallOfFame, int entryIndex, int pokemonIndex, PCHallOfFamePokemon *pcHallOfFameMon); void HallOfFame_GetEntryDate(const HallOfFame *hallOfFame, int entryIndex, RTCDate *date); -#endif // POKEPLATINUM_HALL_OF_FAME_H +#endif // POKEPLATINUM_HALL_OF_FAME_ENTRIES_H diff --git a/include/overlay086/ov86_0223B140.h b/include/overlay086/ov86_0223B140.h deleted file mode 100644 index de1078f1a5..0000000000 --- a/include/overlay086/ov86_0223B140.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef POKEPLATINUM_OV86_0223B140_H -#define POKEPLATINUM_OV86_0223B140_H - -#include "overlay_manager.h" - -int ov86_0223B140(ApplicationManager *appMan, int *param1); -int ov86_0223B2E4(ApplicationManager *appMan, int *param1); -int ov86_0223B394(ApplicationManager *appMan, int *param1); - -#endif // POKEPLATINUM_OV86_0223B140_H diff --git a/include/savedata/save_table.h b/include/savedata/save_table.h index 683d2741d9..39065e5d55 100644 --- a/include/savedata/save_table.h +++ b/include/savedata/save_table.h @@ -9,7 +9,7 @@ #include "struct_defs/struct_0202440C.h" #include "struct_defs/struct_0202F264.h" -#include "hall_of_fame.h" +#include "hall_of_fame_entries.h" #include "mystery_gift.h" #include "savedata.h" diff --git a/include/struct_defs/pc_hall_of_fame_screen_def.h b/include/struct_defs/pc_hall_of_fame_screen_def.h index a97a0a812a..9cddf14cb0 100644 --- a/include/struct_defs/pc_hall_of_fame_screen_def.h +++ b/include/struct_defs/pc_hall_of_fame_screen_def.h @@ -5,7 +5,7 @@ #include "constants/pokemon.h" -#include "hall_of_fame.h" +#include "hall_of_fame_entries.h" typedef enum PCHallOfFameTextState { PC_HALL_OF_FAME_TEXT_GENERAL, diff --git a/include/struct_defs/struct_0203E234.h b/include/struct_defs/struct_0203E234.h index 087ffc130e..60a6cfb399 100644 --- a/include/struct_defs/struct_0203E234.h +++ b/include/struct_defs/struct_0203E234.h @@ -5,10 +5,10 @@ #include "play_time.h" #include "trainer_info.h" -typedef struct { - const TrainerInfo *unk_00; - const Party *unk_04; +typedef struct HallOfFameDisplayData { + const TrainerInfo *trainerInfo; + const Party *party; const PlayTime *playTime; -} UnkStruct_0203E234; +} HallOfFameDisplayData; #endif // POKEPLATINUM_STRUCT_0203E234_H diff --git a/include/unk_0203D1B8.h b/include/unk_0203D1B8.h index 4ebf1dab9e..c109356cf7 100644 --- a/include/unk_0203D1B8.h +++ b/include/unk_0203D1B8.h @@ -91,8 +91,8 @@ void sub_0203E0D0(FieldSystem *fieldSystem); void FieldSystem_LaunchGTSApp(FieldSystem *fieldSystem, BOOL connectToWiFi); void *sub_0203E1AC(FieldSystem *fieldSystem, int param1, int param2); void sub_0203E224(FieldSystem *fieldSystem); -void sub_0203E234(FieldSystem *fieldSystem, UnkStruct_0203E234 *param1); -void *sub_0203E244(FieldSystem *fieldSystem); +void FieldTask_StartHallOfFame(FieldSystem *fieldSystem, HallOfFameDisplayData *displayData); +void *FieldTask_OpenPCHallOfFameScreen(FieldSystem *fieldSystem); void sub_0203E274(FieldSystem *fieldSystem, UnkStruct_0203E274 *param1); void sub_0203E284(FieldSystem *fieldSystem, UnkStruct_020997B8 *param1); void FieldTask_PlayBoatCutscene_CanalaveShip(FieldSystem *fieldSystem, void *taskEnv); diff --git a/platinum.us/main.lsf b/platinum.us/main.lsf index 1608f76bb2..d7649a7a92 100644 --- a/platinum.us/main.lsf +++ b/platinum.us/main.lsf @@ -136,7 +136,7 @@ Static main Object main.nef.p/src_special_encounter.c.o Object main.nef.p/src_global_trade.c.o Object main.nef.p/src_mystery_gift.c.o - Object main.nef.p/src_hall_of_fame.c.o + Object main.nef.p/src_hall_of_fame_entries.c.o Object main.nef.p/src_unk_0202E2CC.c.o Object main.nef.p/src_unk_0202E840.c.o Object main.nef.p/src_unk_0202EEC0.c.o @@ -272,7 +272,7 @@ Static main 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_boat_cutscene_boat_cutscene.c.o + Object main.nef.p/src_cutscenes_boat_cutscene_boat_cutscene.c.o Object main.nef.p/src_unk_0206CCB0.c.o Object main.nef.p/src_unk_0206F314.c.o Object main.nef.p/src_unk_02070428.c.o @@ -1361,13 +1361,13 @@ Overlay overlay85 Object main.nef.p/src_overlay085_ov85_02241440.c.o } -Overlay overlay86 +Overlay hall_of_fame { After battle_anim - Object main.nef.p/src_overlay086_ov86_0223B140.c.o + Object main.nef.p/src_cutscenes_hall_of_fame.c.o } -Overlay overlay87 +Overlay pc_hall_of_fame { After main Object main.nef.p/src_applications_pc_hall_of_fame_manager.c.o @@ -1405,11 +1405,11 @@ Overlay overlay92 Object main.nef.p/src_overlay092_ov92_021D0D80.c.o } -Overlay boat_cutscene +Overlay cutscenes { After main - Object main.nef.p/src_boat_cutscene_canalave_ship.c.o - Object main.nef.p/src_boat_cutscene_snowpoint_ship.c.o + Object main.nef.p/src_cutscenes_boat_cutscene_canalave_ship.c.o + Object main.nef.p/src_cutscenes_boat_cutscene_snowpoint_ship.c.o } Overlay overlay94 diff --git a/platinum.us/sbins_shared.sha1 b/platinum.us/sbins_shared.sha1 index 1120e7fd78..3ce1e31674 100644 --- a/platinum.us/sbins_shared.sha1 +++ b/platinum.us/sbins_shared.sha1 @@ -85,14 +85,13 @@ b8c85f32459d20b3a6cfde5a1e349215dd0157a0 *overlay79.sbin 1904a30bcfb722856130ab7b3d0e79fd0070520d *overlay83.sbin 8bd6a805631e2d661f9d5889e568a72e60f93a04 *bag.sbin c197c9edb988d64dec0a56427dfc6960646dc1f7 *overlay85.sbin -a563e0430b460ee5a39442667561e0bd5428dcdb *overlay86.sbin -8c7f762ebf90f08b09b9efd49946176bb6ed1c69 *overlay87.sbin +a563e0430b460ee5a39442667561e0bd5428dcdb *hall_of_fame.sbin +8c7f762ebf90f08b09b9efd49946176bb6ed1c69 *pc_hall_of_fame.sbin ca9016bf18dc6efc3490bfb893f7cbf12920af00 *overlay88.sbin de8a847bff8c343d69b853a215e6ee775ef2ef96 *overlay89.sbin 84ce4bc9949f697c12ae6598ef74a7e3f60b1531 *overlay90.sbin 2c26cf42ca34629dfc7cc491820e2a309e57eeeb *overlay91.sbin 87c3ffad8da5d31174a542832d80bf1855c3225c *overlay92.sbin -dabd69f841fce75c91c4236925757150990af289 *boat_cutscene.sbin 3410ea804433b4a797932d1999fbb2429611ae56 *overlay95.sbin af7de8e345ff25de55130069f313b57e85d72a4f *overlay96.sbin 138a69ea796d35f244daa36a7e9962ea2d0322e0 *main_menu.sbin diff --git a/res/text/unk_0351.json b/res/text/hall_of_fame.json similarity index 64% rename from res/text/unk_0351.json rename to res/text/hall_of_fame.json index 007cfc60c8..16528707d8 100644 --- a/res/text/unk_0351.json +++ b/res/text/hall_of_fame.json @@ -2,83 +2,83 @@ "key": 1471, "messages": [ { - "id": "pl_msg_00000351_00000", + "id": "HallOfFame_Text_Welcome", "en_US": [ "Welcome to the\n", "Hall of Fame!" ] }, { - "id": "pl_msg_00000351_00001", + "id": "HallOfFame_Text_PokemonInfoMale", "en_US": "{STRVAR_1 0, 0, 0} ♂ Lv.{STRVAR_1 52, 1, 0}" }, { - "id": "pl_msg_00000351_00002", + "id": "HallOfFame_Text_PokemonInfoFemale", "en_US": "{STRVAR_1 0, 0, 0} ♀ Lv.{STRVAR_1 52, 1, 0}" }, { - "id": "pl_msg_00000351_00003", + "id": "HallOfFame_Text_PokemonInfoGenderless", "en_US": "{STRVAR_1 0, 0, 0} Lv.{STRVAR_1 52, 1, 0}" }, { - "id": "pl_msg_00000351_00004", + "id": "HallOfFame_Text_OT", "en_US": "OT/{STRVAR_1 3, 0, 0}" }, { - "id": "pl_msg_00000351_00005", + "id": "HallOfFame_Text_MetAt", "en_US": [ "Met at\n", "{STRVAR_1 4, 0, 0}." ] }, { - "id": "pl_msg_00000351_00006", + "id": "HallOfFame_Text_HatchedAt", "en_US": [ "Hatched at\n", "{STRVAR_1 4, 0, 0}." ] }, { - "id": "pl_msg_00000351_00007", + "id": "HallOfFame_Text_ObtainedInLinkTrade", "en_US": [ "Obtained in a link\n", "trade." ] }, { - "id": "pl_msg_00000351_00008", + "id": "HallOfFame_Text_ArrivedFromKanto", "en_US": [ "Arrived from the Kanto\n", "region." ] }, { - "id": "pl_msg_00000351_00009", + "id": "HallOfFame_Text_ArrivedFromHoenn", "en_US": [ "Arrived from the Hoenn\n", "region." ] }, { - "id": "pl_msg_00000351_00010", + "id": "HallOfFame_Text_ArrivedFromDistantLand", "en_US": [ "Arrived from a distant\n", "land." ] }, { - "id": "pl_msg_00000351_00011", + "id": "HallOfFame_Text_ObtainedInFatefulEncounter", "en_US": [ "Obtained in a fateful\n", "encounter." ] }, { - "id": "pl_msg_00000351_00012", + "id": "HallOfFame_Text_LeagueChampionCongratulations", "en_US": "League Champion! Congratulations!" }, { - "id": "pl_msg_00000351_00013", + "id": "HallOfFame_Text_PlayerInfo", "en_US": "{STRVAR_1 3, 0, 0} ID: {STRVAR_1 54, 1, 0} Time: {STRVAR_1 52, 2, 0}:{STRVAR_1 51, 3, 0}" } ] diff --git a/src/applications/pc_hall_of_fame/display.c b/src/applications/pc_hall_of_fame/display.c index 8901695d0f..4d516900d2 100644 --- a/src/applications/pc_hall_of_fame/display.c +++ b/src/applications/pc_hall_of_fame/display.c @@ -17,7 +17,7 @@ #include "font.h" #include "graphics.h" #include "gx_layers.h" -#include "hall_of_fame.h" +#include "hall_of_fame_entries.h" #include "heap.h" #include "message.h" #include "pokemon.h" @@ -443,8 +443,8 @@ static void ov87_021D1818(PCHallOfFameApp *pcHallOfFameApp) NNSG2dAnimBankData *animBank; int unused; - pcHallOfFameApp->cellBank = Graphics_GetCellBank(27, 77, 0, &cellBank, HEAP_ID_PC_HALL_OF_FAME); - pcHallOfFameApp->animBank = Graphics_GetAnimBank(27, 78, 0, &animBank, HEAP_ID_PC_HALL_OF_FAME); + pcHallOfFameApp->cellBank = Graphics_GetCellBank(27, 77, FALSE, &cellBank, HEAP_ID_PC_HALL_OF_FAME); + pcHallOfFameApp->animBank = Graphics_GetAnimBank(27, 78, FALSE, &animBank, HEAP_ID_PC_HALL_OF_FAME); MI_CpuClearFast(pcHallOfFameApp->unk_200, sizeof(pcHallOfFameApp->unk_200)); @@ -527,7 +527,7 @@ static void ov87_021D18A0(PCHallOfFameApp *pcHallOfFameApp, NNSG2dCellDataBank * static void PCHallOfFame_DrawAllPokemon(PCHallOfFameApp *pcHallOfFameApp) { - static const TileRegion v0 = FRAME_0_REGION; + static const TileRegion tileRegion = FRAME_0_REGION; PokemonSpriteTemplate spriteTemplate; const PCHallOfFameScreen *pcHallOfFameScreen; int i; @@ -538,7 +538,7 @@ static void PCHallOfFame_DrawAllPokemon(PCHallOfFameApp *pcHallOfFameApp) Pokemon_InitWith(pcHallOfFameApp->mon, pcHallOfFameScreen->pokemon[i].species, pcHallOfFameScreen->pokemon[i].level, INIT_IVS_RANDOM, TRUE, pcHallOfFameScreen->pokemon[i].personality, OTID_SET, pcHallOfFameScreen->pokemon[i].OTID); Pokemon_SetValue(pcHallOfFameApp->mon, MON_DATA_FORM, (void *)(&(pcHallOfFameScreen->pokemon[i].form))); Pokemon_BuildSpriteTemplate(&spriteTemplate, pcHallOfFameApp->mon, FACE_FRONT); - CharacterSprite_LoadPokemonSpriteRegion(spriteTemplate.narcID, spriteTemplate.character, HEAP_ID_PC_HALL_OF_FAME, &v0, pcHallOfFameApp->unk_200, pcHallOfFameScreen->pokemon[i].personality, FALSE, FACE_FRONT, pcHallOfFameScreen->pokemon[i].species); + CharacterSprite_LoadPokemonSpriteRegion(spriteTemplate.narcID, spriteTemplate.character, HEAP_ID_PC_HALL_OF_FAME, &tileRegion, pcHallOfFameApp->unk_200, pcHallOfFameScreen->pokemon[i].personality, FALSE, FACE_FRONT, pcHallOfFameScreen->pokemon[i].species); DC_FlushRange(pcHallOfFameApp->unk_200, sizeof(pcHallOfFameApp->unk_200)); GX_LoadOBJ(pcHallOfFameApp->unk_200, 3200 * i, 3200); diff --git a/src/boat_cutscene/boat_cutscene.c b/src/cutscenes/boat_cutscene/boat_cutscene.c similarity index 99% rename from src/boat_cutscene/boat_cutscene.c rename to src/cutscenes/boat_cutscene/boat_cutscene.c index 3f68b98e27..6d494ae928 100644 --- a/src/boat_cutscene/boat_cutscene.c +++ b/src/cutscenes/boat_cutscene/boat_cutscene.c @@ -1,4 +1,4 @@ -#include "boat_cutscene/boat_cutscene.h" +#include "cutscenes/boat_cutscene.h" #include #include diff --git a/src/boat_cutscene/canalave_ship.c b/src/cutscenes/boat_cutscene/canalave_ship.c similarity index 99% rename from src/boat_cutscene/canalave_ship.c rename to src/cutscenes/boat_cutscene/canalave_ship.c index 028da34c46..d378ba6d07 100644 --- a/src/boat_cutscene/canalave_ship.c +++ b/src/cutscenes/boat_cutscene/canalave_ship.c @@ -3,7 +3,7 @@ #include "struct_defs/struct_02099F80.h" -#include "boat_cutscene/boat_cutscene.h" +#include "cutscenes/boat_cutscene.h" #include "overlay009/camera_configuration.h" #include "camera.h" diff --git a/src/boat_cutscene/snowpoint_ship.c b/src/cutscenes/boat_cutscene/snowpoint_ship.c similarity index 99% rename from src/boat_cutscene/snowpoint_ship.c rename to src/cutscenes/boat_cutscene/snowpoint_ship.c index ab2a40d8ba..be3acb7aac 100644 --- a/src/boat_cutscene/snowpoint_ship.c +++ b/src/cutscenes/boat_cutscene/snowpoint_ship.c @@ -3,7 +3,7 @@ #include "struct_defs/struct_02099F80.h" -#include "boat_cutscene/boat_cutscene.h" +#include "cutscenes/boat_cutscene.h" #include "overlay009/camera_configuration.h" #include "camera.h" diff --git a/src/cutscenes/hall_of_fame.c b/src/cutscenes/hall_of_fame.c new file mode 100644 index 0000000000..bc2d82cff6 --- /dev/null +++ b/src/cutscenes/hall_of_fame.c @@ -0,0 +1,1926 @@ +#include "cutscenes/hall_of_fame.h" + +#include +#include + +#include "struct_defs/sprite_animation_frame.h" +#include "struct_defs/struct_0203E234.h" +#include "struct_defs/struct_02099F80.h" + +#include "overlay005/struct_ov5_021DE5D0.h" + +#include "bg_window.h" +#include "camera.h" +#include "character_sprite.h" +#include "enums.h" +#include "font.h" +#include "graphics.h" +#include "gx_layers.h" +#include "heap.h" +#include "inlines.h" +#include "math_util.h" +#include "message.h" +#include "narc.h" +#include "overlay_manager.h" +#include "party.h" +#include "play_time.h" +#include "pokemon.h" +#include "pokemon_sprite.h" +#include "render_oam.h" +#include "screen_fade.h" +#include "sound.h" +#include "sound_playback.h" +#include "sprite.h" +#include "sprite_util.h" +#include "strbuf.h" +#include "string_template.h" +#include "sys_task.h" +#include "sys_task_manager.h" +#include "system.h" +#include "text.h" +#include "trainer_info.h" + +#include "res/text/bank/hall_of_fame.h" + +#define ROW_HEIGHT 16 + +#define POKEMON_FRAME_WIDTH 96 +#define POKEMON_FRAME_HEIGHT 128 +#define PLAYER_FRAME_HEIGHT 144 + +#define VIEWPORT_X_MIN 0 +#define VIEWPORT_X_MAX 255 +#define VIEWPORT_Y_MIN 0 +#define VIEWPORT_Y_MAX 191 + +#define NUM_CONFETTI 48 + +#define MAX_SPOTLIGHT_TASKS 8 + +typedef struct HallOfFameMovement { + fx32 start; + fx32 stepSize; + fx32 end; + int numSteps; + BOOL done; +} HallOfFameMovement; + +typedef struct HallOfFameMan { + int state; + int monCount; + int delay; + HallOfFameDisplayData *displayData; + BgConfig *bgConfig; + Window window; + SpriteList *spriteList; + G2dRenderer g2dRenderer; + Sprite *monSprites[MAX_PARTY_SIZE]; + Sprite *sprite; + void *unk_1D0; + void *unk_1D4; + SpriteAnimationFrame animFrames[MAX_PARTY_SIZE][MAX_ANIMATION_FRAMES]; + int slotIndexes[MAX_PARTY_SIZE]; + int species[MAX_PARTY_SIZE]; + u32 forms[MAX_PARTY_SIZE]; + u8 unk_310[6400]; + Camera *camera; + VecFx32 position; + CameraAngle cameraAngle; + SysTask *task_1C28; + SysTask *taskSpotlights; + SysTask *taskConfetti; + SysTask *tasks[4]; + StringTemplate *strTemplate; + Strbuf *strbuf_1C30; + Strbuf *strbuf_1C4C; + MessageLoader *msgLoaderHallOfFame; + NARC *narc; +} HallOfFameMan; + +typedef struct HallOfFameConfetti { + int color; + int unk_04; + VecFx16 unk_08[4]; + VecFx16 unk_20; + VecFx16 unk_26; + MtxFx44 pDst; + BOOL unk_6C; +} HallOfFameConfetti; + +typedef struct HallOfFameConfettiAnimation { + BOOL active; + volatile BOOL unk_04; + HallOfFameConfetti confetti[48]; + GXDLInfo info; + u32 unk_151C[7680]; + u32 unk_8D1C; + int unk_8D20; + MtxFx44 pDst; +} HallOfFameConfettiAnimation; + +typedef struct HallOfFameTask { + void *data; + SysTask **task; +} HallOfFameTask; + +typedef struct HallOfFamePokemonSprite { + HallOfFameTask hallOfFameTask; + Sprite *sprite; + VecFx32 position; + HallOfFameMovement movement; +} HallOfFamePokemonSprite; + +typedef struct HallOfFamePlayerSprite { + HallOfFameTask hallOfFameTask; + Sprite *sprite; + VecFx32 position; + HallOfFameMovement movement; +} HallOfFamePlayerSprite; + +typedef struct HallOfFameFrameSliderHorizontal { + HallOfFameTask hallOfFameTask; + HallOfFameMovement movement; +} HallOfFameFrameSliderHorizontal; + +typedef struct HallOfFameFrameSliderVertical { + HallOfFameTask hallOfFameTask; + HallOfFameMovement movement; + int left; + int right; + int height; +} HallOfFameFrameSliderVertical; + +typedef struct HallOfFameFrameExpander { + HallOfFameTask hallOfFameTask; + HallOfFameMovement movementLeft; + HallOfFameMovement movementRight; + int top; + int bottom; +} HallOfFameFrameExpander; + +typedef struct HallOfFameSliderToBlack { + HallOfFameTask hallOfFameTask; + HallOfFameMovement movementTop; + HallOfFameMovement movementBottom; + int left; + int right; +} HallOfFameSliderToBlack; + +typedef struct HallOfFamePokemonAnimation { + HallOfFameTask hallOfFameTask; + Sprite *sprite; + const SpriteAnimationFrame *animFrame; + PokemonSpriteTaskAnim anim; + NNSG2dImageProxy imageProxies[2]; + BOOL playCry; + int species; + u32 form; +} HallOfFamePokemonAnimation; + +typedef struct HallOfFamePokemonTextAdder { + HallOfFameTask hallOfFameTask; + HallOfFameMan *hallOfFameMan; + BgConfig *bgConfig; + Window *window; + StringTemplate *strTemplate; + Strbuf *strbuf_18; + Strbuf *strbuf_1C; + MessageLoader *msgLoader; + Pokemon *mon; + const TrainerInfo *trainerInfo; + int xPosition; + int delay; + int state; +} HallOfFamePokemonTextAdder; + +typedef struct HallOfFamePokemonTextRemover { + HallOfFameTask hallOfFameTask; + HallOfFameMan *hallOfFameMan; + BgConfig *bgConfig; + Window *window; + HallOfFameMovement movement; + int state; + int bgLayer; +} HallOfFamePokemonTextRemover; + +typedef struct HallOfFamePartySprites { + HallOfFameTask hallOfFameTask; + Sprite **sprites; + HallOfFameMan *hallOfFameMan; + int monIndex; + int monCount; + int delay; + HallOfFameMovement movements[6]; + VecFx32 positions[6]; +} HallOfFamePartySprites; + +typedef struct HallOfFameSpotlights { + GXDLInfo info; + u32 ptr[512]; + u32 ptrSize; + SysTask *tasks[MAX_SPOTLIGHT_TASKS]; + SysTask *task; + int taskID; + HallOfFameMan *hallOfFameMan; +} HallOfFameSpotlights; + +typedef struct { + GXDLInfo *info; + u32 unk_04[512]; + u32 unk_804; + fx32 unk_808; + fx32 unk_80C; + int color; + int unk_814; + fx16 unk_818; + VecFx16 unk_81A; + VecFx16 unk_820; + VecFx16 unk_826; + VecFx16 unk_82C; + HallOfFameMan *hallOfFameMan; +} UnkStruct_ov86_0223CAE4; + +static void inline inline_ov86_0223CB74(UnkStruct_ov86_0223CAE4 *wk); +static BOOL HallOfFame_State_FadeIn(HallOfFameMan *hallOfFameMan); +static BOOL HallOfFame_State_FadeOut(HallOfFameMan *hallOfFameMan); +static BOOL HallOfFame_State_ShowIndividualPokemon(HallOfFameMan *hallOfFameMan); +static BOOL HallOfFame_State_ShowPartyAndPlayer(HallOfFameMan *hallOfFameMan); +static BOOL HallOfFame_State_WipeToBlack(HallOfFameMan *hallOfFameMan); +static BOOL HallOfFame_IsSysTaskDone(HallOfFameMan *hallOfFameMan, int taskID); +static void ov86_0223B6CC(SysTask *task, void *data); +static SysTask *HallOfFame_ExecuteSysTaskOnVBlank(SysTaskFunc callback, void *param, int priority); +static void ov86_0223B74C(HallOfFameMan *hallOfFameMan); +static void ov86_0223B8C4(HallOfFameMan *hallOfFameMan); +static void ov86_0223B900(HallOfFameMan *hallOfFameMan); +static void HallOfFame_InitCamera(HallOfFameMan *hallOfFameMan); +static void HallOfFame_DeleteCamera(HallOfFameMan *hallOfFameMan); +static void ov86_0223BA44(HallOfFameMan *hallOfFameMan); +static void ov86_0223BAC8(HallOfFameMan *hallOfFameMan, NNSG2dCellDataBank *cellBank, NNSG2dAnimBankData *animBank, NARC *narc); +static void HallOfFame_DeleteSprites(HallOfFameMan *hallOfFameMan); +static void HallOfFame_ShowPokemonSprite(HallOfFameMan *hallOfFameMan, int monIndex, int taskID); +static void HallOfFame_SlideInPokemonSprite(SysTask *task, void *data); +static void HallOfFame_ShowPlayerSprite(HallOfFameMan *hallOfFameMan, int taskID); +static void HallOfFame_SlideInPlayerSprite(SysTask *task, void *data); +static void HallOfFame_SlideFrameHorizontal(SysTask *task, void *data); +static void HallOfFame_SlideFrameVertical(SysTask *task, void *data); +static void HallOfFame_ExpandFrameHorizontal(SysTask *task, void *data); +static void HallOfFame_SlideToBlack(SysTask *task, void *data); +static void HallOfFame_ShowPokemonFrame(HallOfFameMan *hallOfFameMan, int monIndex, int taskID); +static void HallOfFame_RemovePokemonFrame(HallOfFameMan *hallOfFameMan, int monIndex, int taskID); +static void HallOfFame_ShowPlayerFrame(HallOfFameMan *hallOfFameMan, int taskID); +static void HallOfFame_ExpandFrame(HallOfFameMan *hallOfFameMan, int taskID); +static void HallOfFame_WipeToBlack(HallOfFameMan *hallOfFameMan, int taskID); +static void HallOfFame_InitPokemonAnimation(HallOfFameMan *hallOfFameMan, int monIndex, BOOL playCry, int taskID); +static void HallOfFame_PlayPokemonAnimation(SysTask *task, void *data); +static void HallOfFame_ShowPokemonText(HallOfFameMan *hallOfFameMan, int monIndex, int taskID); +static void HallOfFame_PrintPokemonText(SysTask *task, void *data); +static void HallOfFame_RemovePokemonText(HallOfFameMan *hallOfFameMan, int taskID); +static void HallOfFame_SlideOutPokemonText(SysTask *task, void *data); +static void HallOfFame_ShowPlayerText(HallOfFameMan *hallOfFameMan); +static void HallOfFame_ShowPartySprites(HallOfFameMan *hallOfFameMan, int taskID); +static void HallOfFame_SlideInPartySprites(SysTask *task, void *data); +static SysTask *HallOfFame_InitSpotlightsTask(HallOfFameMan *hallOfFameMan); +static void ov86_0223CA10(SysTask *task, void *data); +static void ov86_0223CA64(SysTask *task, void *data); +static void ov86_0223CAA0(SysTask *task, fx16 param1, fx32 param2); +static void ov86_0223CB74(SysTask *task, void *data); +static void ov86_0223CD00(SysTask *task); +static void HallOfFame_FreeSpotlightTasks(SysTask *task); +static BOOL ov86_0223CD80(void); +static SysTask *HallOfFame_InitConfettiTask(HallOfFameMan *hallOfFameMan); +static void HallOfFame_SysTaskDone(SysTask *task); +static void HallOfFame_SetConfettiActive(SysTask *task); +static void HallOfFame_DoConfettiAnimation(SysTask *task, void *data); +static void ov86_0223D220(SysTask *task); +static void HallOfFameMovement_Init(HallOfFameMovement *movement, fx32 start, fx32 end, int numSteps); +static fx32 HallOfFameMovement_Run(HallOfFameMovement *movement); +static BOOL HallOfFameMovement_IsDone(HallOfFameMovement *movement); +static int HallOfFame_GetMetStringIndex(HallOfFameMan *hallOfFameMan, Pokemon *mon, const TrainerInfo *trainerInfo); +static SysTask *ov86_0223CAE4(HallOfFameSpotlights *spotlights, fx16 param1, fx32 param2, int taskID); + +BOOL HallOfFameManager_Init(ApplicationManager *appMan, int *state) +{ + HallOfFameMan *hallOfFameMan; + + SetVBlankCallback(NULL, NULL); + Heap_Create(HEAP_ID_APPLICATION, HEAP_ID_HALL_OF_FAME, 196608); + + hallOfFameMan = ApplicationManager_NewData(appMan, sizeof(HallOfFameMan), HEAP_ID_HALL_OF_FAME); + + hallOfFameMan->displayData = ApplicationManager_Args(appMan); + hallOfFameMan->msgLoaderHallOfFame = MessageLoader_Init(MESSAGE_LOADER_BANK_HANDLE, NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_HALL_OF_FAME, HEAP_ID_HALL_OF_FAME); + hallOfFameMan->strbuf_1C30 = Strbuf_Init(500, HEAP_ID_HALL_OF_FAME); + hallOfFameMan->strbuf_1C4C = Strbuf_Init(500, HEAP_ID_HALL_OF_FAME); + hallOfFameMan->strTemplate = StringTemplate_Default(HEAP_ID_HALL_OF_FAME); + hallOfFameMan->narc = NARC_ctor(NARC_INDEX_POKETOOL__POKE_EDIT__PL_POKE_DATA, HEAP_ID_HALL_OF_FAME); + + int i, currentPartyCount; + + hallOfFameMan->monCount = 0; + currentPartyCount = Party_GetCurrentCount(hallOfFameMan->displayData->party); + + for (i = 0; i < currentPartyCount; i++) { + if (Pokemon_GetValue(Party_GetPokemonBySlotIndex(hallOfFameMan->displayData->party, i), MON_DATA_IS_EGG, NULL) == 0) { + hallOfFameMan->slotIndexes[hallOfFameMan->monCount] = i; + hallOfFameMan->monCount++; + } + } + + ov86_0223B74C(hallOfFameMan); + ov86_0223B900(hallOfFameMan); + ov86_0223BA44(hallOfFameMan); + + hallOfFameMan->taskConfetti = NULL; + hallOfFameMan->taskSpotlights = HallOfFame_InitSpotlightsTask(hallOfFameMan); + + ov86_0223CAA0(hallOfFameMan->taskSpotlights, -FX16_CONST(0.714f), FX32_CONST(20)); + ov86_0223CAA0(hallOfFameMan->taskSpotlights, -FX16_CONST(0.429f), FX32_CONST(60)); + ov86_0223CAA0(hallOfFameMan->taskSpotlights, -FX16_CONST(0.143f), FX32_CONST(40)); + ov86_0223CAA0(hallOfFameMan->taskSpotlights, FX16_CONST(0.143f), FX32_CONST(140)); + ov86_0223CAA0(hallOfFameMan->taskSpotlights, FX16_CONST(0.429f), FX32_CONST(120)); + ov86_0223CAA0(hallOfFameMan->taskSpotlights, FX16_CONST(0.714f), FX32_CONST(160)); + + hallOfFameMan->taskConfetti = HallOfFame_InitConfettiTask(hallOfFameMan); + + GX_SetDispSelect(GX_DISP_SELECT_MAIN_SUB); + + hallOfFameMan->state = 0; + hallOfFameMan->task_1C28 = HallOfFame_ExecuteSysTaskOnVBlank(ov86_0223B6CC, hallOfFameMan, 6); + + Sound_SetSceneAndPlayBGM(SOUND_SCENE_8, SEQ_BLD_EV_DENDO2, 1); + + return TRUE; +} + +BOOL HallOfFameManager_Exit(ApplicationManager *appMan, int *state) +{ + switch (*state) { + case 0: + HallOfFameMan *hallOfFameMan = ApplicationManager_Data(appMan); + + SysTask_Done(hallOfFameMan->task_1C28); + + HallOfFame_SysTaskDone(hallOfFameMan->taskConfetti); + HallOfFame_FreeSpotlightTasks(hallOfFameMan->taskSpotlights); + HallOfFame_DeleteSprites(hallOfFameMan); + HallOfFame_DeleteCamera(hallOfFameMan); + ov86_0223B8C4(hallOfFameMan); + + StringTemplate_Free(hallOfFameMan->strTemplate); + Strbuf_Free(hallOfFameMan->strbuf_1C30); + Strbuf_Free(hallOfFameMan->strbuf_1C4C); + MessageLoader_Free(hallOfFameMan->msgLoaderHallOfFame); + NARC_dtor(hallOfFameMan->narc); + ApplicationManager_FreeData(appMan); + Heap_Destroy(HEAP_ID_HALL_OF_FAME); + (*state)++; + break; + case 1: + if (ov86_0223CD80()) { + return TRUE; + } + } + + return FALSE; +} + +BOOL HallOfFameManager_Main(ApplicationManager *appMan, int *state) +{ + static BOOL (*const hallOfFameStates[])(HallOfFameMan *) = { + HallOfFame_State_FadeIn, + HallOfFame_State_ShowIndividualPokemon, + HallOfFame_State_ShowPartyAndPlayer, + HallOfFame_State_WipeToBlack, + HallOfFame_State_FadeOut + }; + + HallOfFameMan *hallOfFameMan = ApplicationManager_Data(appMan); + + if (*state < NELEMS(hallOfFameStates)) { + if (hallOfFameStates[*state](hallOfFameMan)) { + hallOfFameMan->state = 0; + hallOfFameMan->delay = 0; + (*state)++; + } + + return FALSE; + } + + return TRUE; +} + +static BOOL HallOfFame_State_FadeIn(HallOfFameMan *hallOfFameMan) +{ + switch (hallOfFameMan->state) { + case 0: + StartScreenFade(FADE_MAIN_ONLY, FADE_TYPE_BRIGHTNESS_IN, FADE_TYPE_BRIGHTNESS_IN, COLOR_BLACK, 16, 1, HEAP_ID_HALL_OF_FAME); + hallOfFameMan->state++; + break; + case 1: + if (IsScreenFadeDone()) { + return TRUE; + } + } + + return FALSE; +} + +static BOOL HallOfFame_State_FadeOut(HallOfFameMan *hallOfFameMan) +{ + switch (hallOfFameMan->state) { + case 0: + StartScreenFade(FADE_MAIN_ONLY, FADE_TYPE_BRIGHTNESS_OUT, FADE_TYPE_BRIGHTNESS_OUT, COLOR_BLACK, 2, 1, HEAP_ID_HALL_OF_FAME); + Sound_FadeOutBGM(SOUND_VOLUME_MIN, 30); + hallOfFameMan->state++; + break; + case 1: + if (IsScreenFadeDone() && !Sound_IsFadeActive()) { + return TRUE; + } + } + + return FALSE; +} + +static BOOL HallOfFame_State_ShowIndividualPokemon(HallOfFameMan *hallOfFameMan) +{ + static int monIndex = 0; + + if (hallOfFameMan->delay) { + hallOfFameMan->delay--; + return FALSE; + } + + switch (hallOfFameMan->state) { + case 0: + monIndex = 0; + hallOfFameMan->state++; + case 1: + HallOfFame_ShowPokemonSprite(hallOfFameMan, monIndex, 0); + HallOfFame_ShowPokemonFrame(hallOfFameMan, monIndex, 1); + hallOfFameMan->state++; + break; + case 2: + if (HallOfFame_IsSysTaskDone(hallOfFameMan, 0)) { + hallOfFameMan->delay = 20; + hallOfFameMan->state++; + } + break; + case 3: + HallOfFame_InitPokemonAnimation(hallOfFameMan, monIndex, TRUE, 0); + HallOfFame_ShowPokemonText(hallOfFameMan, monIndex, 1); + hallOfFameMan->state++; + break; + case 4: + if (HallOfFame_IsSysTaskDone(hallOfFameMan, 0) && HallOfFame_IsSysTaskDone(hallOfFameMan, 1)) { + hallOfFameMan->delay = 30; + hallOfFameMan->state++; + } + break; + case 5: + HallOfFame_RemovePokemonText(hallOfFameMan, 0); + HallOfFame_RemovePokemonFrame(hallOfFameMan, monIndex, 1); + hallOfFameMan->state++; + break; + case 6: + if (HallOfFame_IsSysTaskDone(hallOfFameMan, 0)) { + Sprite_SetDrawFlag(hallOfFameMan->monSprites[monIndex], FALSE); + + if (++monIndex < hallOfFameMan->monCount) { + hallOfFameMan->delay = 30; + hallOfFameMan->state = 1; + } else { + return TRUE; + } + } + break; + } + + return FALSE; +} + +static BOOL HallOfFame_State_ShowPartyAndPlayer(HallOfFameMan *hallOfFameMan) +{ + if (hallOfFameMan->delay) { + hallOfFameMan->delay--; + return FALSE; + } + + switch (hallOfFameMan->state) { + case 0: + Graphics_LoadTilemapToBgLayer(NARC_INDEX_GRAPHIC__DENDOU_DEMO, 1, hallOfFameMan->bgConfig, BG_LAYER_MAIN_3, 0, 0, TRUE, HEAP_ID_HALL_OF_FAME); + hallOfFameMan->state++; + break; + case 1: + HallOfFame_ShowPlayerSprite(hallOfFameMan, 0); + HallOfFame_ShowPlayerFrame(hallOfFameMan, 1); + hallOfFameMan->state++; + break; + case 2: + if (HallOfFame_IsSysTaskDone(hallOfFameMan, 0) + && HallOfFame_IsSysTaskDone(hallOfFameMan, 1)) { + hallOfFameMan->delay = 20; + hallOfFameMan->state++; + } + break; + case 3: + HallOfFame_ExpandFrame(hallOfFameMan, 0); + hallOfFameMan->state++; + break; + case 4: + if (HallOfFame_IsSysTaskDone(hallOfFameMan, 0)) { + HallOfFame_ShowPlayerText(hallOfFameMan); + hallOfFameMan->delay = 20; + hallOfFameMan->state++; + } + break; + case 5: + HallOfFame_ShowPartySprites(hallOfFameMan, 0); + hallOfFameMan->state++; + break; + case 6: + if (HallOfFame_IsSysTaskDone(hallOfFameMan, 0)) { + hallOfFameMan->delay = 20; + hallOfFameMan->state++; + } + break; + case 7: + HallOfFame_SetConfettiActive(hallOfFameMan->taskConfetti); + hallOfFameMan->state++; + break; + case 8: + if (gSystem.pressedKeys & (PAD_BUTTON_A | PAD_BUTTON_B)) { + return TRUE; + } + break; + } + + return FALSE; +} + +static BOOL HallOfFame_State_WipeToBlack(HallOfFameMan *hallOfFameMan) +{ + switch (hallOfFameMan->state) { + case 0: + HallOfFame_WipeToBlack(hallOfFameMan, 0); + hallOfFameMan->state++; + break; + case 1: + if (HallOfFame_IsSysTaskDone(hallOfFameMan, 0)) { + return TRUE; + } + } + + return FALSE; +} + +static BOOL HallOfFame_IsSysTaskDone(HallOfFameMan *hallOfFameMan, int taskID) +{ + return hallOfFameMan->tasks[taskID] == NULL; +} + +static void ov86_0223B6CC(SysTask *task, void *data) +{ + HallOfFameMan *hallOfFameMan = data; + + if (G3X_IsGeometryBusy()) { + return; + } + + G3X_Reset(); + NNS_G3dGePushMtx(); + + ov86_0223CD00(hallOfFameMan->taskSpotlights); + + NNS_G3dGePopMtx(1); + NNS_G3dGePushMtx(); + + ov86_0223D220(hallOfFameMan->taskConfetti); + + NNS_G3dGePopMtx(1); + G3_SwapBuffers(GX_SORTMODE_MANUAL, GX_BUFFERMODE_Z); + + SpriteList_Update(hallOfFameMan->spriteList); + RenderOam_Transfer(); +} + +static SysTask *HallOfFame_ExecuteSysTaskOnVBlank(SysTaskFunc callback, void *param, int priority) +{ + return SysTask_ExecuteOnVBlank(callback, param, priority); +} + +static void ov86_0223B74C(HallOfFameMan *hallOfFameMan) +{ + NARC *narc; + static const UnkStruct_02099F80 v1 = { + GX_VRAM_BG_128_B, + GX_VRAM_BGEXTPLTT_NONE, + GX_VRAM_SUB_BG_128_C, + GX_VRAM_SUB_BGEXTPLTT_NONE, + GX_VRAM_OBJ_64_E, + GX_VRAM_OBJEXTPLTT_NONE, + GX_VRAM_SUB_OBJ_16_I, + GX_VRAM_SUB_OBJEXTPLTT_NONE, + GX_VRAM_TEX_0_A, + GX_VRAM_TEXPLTT_01_FG + }; + static const GraphicsModes graphicsModes = { + GX_DISPMODE_GRAPHICS, + GX_BGMODE_0, + GX_BGMODE_0, + GX_BG0_AS_3D + }; + static const BgTemplate v3 = { + .x = 0, + .y = 0, + .bufferSize = 0x1000, + .baseTile = 0, + .screenSize = BG_SCREEN_SIZE_256x512, + .colorMode = GX_BG_COLORMODE_16, + .screenBase = GX_BG_SCRBASE_0xe000, + .charBase = GX_BG_CHARBASE_0x10000, + .bgExtPltt = GX_BG_EXTPLTT_01, + .priority = 0, + .areaOver = 0, + .mosaic = FALSE, + }; + static const BgTemplate v4 = { + .x = 0, + .y = 0, + .bufferSize = 0, + .baseTile = 0, + .screenSize = BG_SCREEN_SIZE_256x256, + .colorMode = GX_BG_COLORMODE_16, + .screenBase = GX_BG_SCRBASE_0xf000, + .charBase = GX_BG_CHARBASE_0x18000, + .bgExtPltt = GX_BG_EXTPLTT_01, + .priority = 1, + .areaOver = 0, + .mosaic = FALSE, + }; + static const BgTemplate v5 = { + .x = 0, + .y = 0, + .bufferSize = 0, + .baseTile = 0, + .screenSize = BG_SCREEN_SIZE_256x256, + .colorMode = GX_BG_COLORMODE_16, + .screenBase = GX_BG_SCRBASE_0xf800, + .charBase = GX_BG_CHARBASE_0x18000, + .bgExtPltt = GX_BG_EXTPLTT_01, + .priority = 3, + .areaOver = 0, + .mosaic = FALSE, + }; + + hallOfFameMan->bgConfig = BgConfig_New(HEAP_ID_HALL_OF_FAME); + + GXLayers_SetBanks(&v1); + GX_SetDispSelect(GX_DISP_SELECT_SUB_MAIN); + + SetAllGraphicsModes(&graphicsModes); + Bg_InitFromTemplate(hallOfFameMan->bgConfig, BG_LAYER_MAIN_1, &v3, 0); + Bg_InitFromTemplate(hallOfFameMan->bgConfig, BG_LAYER_MAIN_2, &v4, 0); + Bg_InitFromTemplate(hallOfFameMan->bgConfig, BG_LAYER_MAIN_3, &v5, 0); + Bg_FillTilesRange(hallOfFameMan->bgConfig, BG_LAYER_MAIN_1, 0x0, 1, 0); + Bg_FillTilemapRect(hallOfFameMan->bgConfig, BG_LAYER_MAIN_1, 0x0, 0, 0, 32, 32, 0); + Window_Add(hallOfFameMan->bgConfig, &(hallOfFameMan->window), BG_LAYER_MAIN_1, 0, 0, 32, 24, 1, 1); + Window_FillTilemap(&(hallOfFameMan->window), 0); + Window_LoadTiles(&(hallOfFameMan->window)); + Window_PutToTilemap(&hallOfFameMan->window); + + narc = NARC_ctor(NARC_INDEX_GRAPHIC__DENDOU_DEMO, HEAP_ID_HALL_OF_FAME); + + Graphics_LoadTilesToBgLayerFromOpenNARC(narc, 3, hallOfFameMan->bgConfig, BG_LAYER_MAIN_3, 0, 0, TRUE, HEAP_ID_HALL_OF_FAME); + Graphics_LoadTilemapToBgLayerFromOpenNARC(narc, 0, hallOfFameMan->bgConfig, BG_LAYER_MAIN_3, 0, 0, TRUE, HEAP_ID_HALL_OF_FAME); + Graphics_LoadPaletteFromOpenNARC(narc, 4, 0, 0, 0x60, HEAP_ID_HALL_OF_FAME); + Graphics_LoadTilemapToBgLayerFromOpenNARC(narc, 2, hallOfFameMan->bgConfig, BG_LAYER_MAIN_2, 0, 0, TRUE, HEAP_ID_HALL_OF_FAME); + Bg_CopyTilemapBufferToVRAM(hallOfFameMan->bgConfig, 1); + + G2_SetWnd0Position(0, 0, 0, 0); + G2_SetWnd0InsidePlane(GX_WND_PLANEMASK_ALL ^ GX_WND_PLANEMASK_BG2, 1); + G2_SetWndOutsidePlane(GX_WND_PLANEMASK_ALL, 1); + GX_SetVisibleWnd(GX_WNDMASK_W0); + + NARC_dtor(narc); +} + +static void ov86_0223B8C4(HallOfFameMan *hallOfFameMan) +{ + GX_SetVisibleWnd(GX_WNDMASK_NONE); + + Window_Remove(&(hallOfFameMan->window)); + Bg_FreeTilemapBuffer(hallOfFameMan->bgConfig, BG_LAYER_MAIN_1); + Bg_FreeTilemapBuffer(hallOfFameMan->bgConfig, BG_LAYER_MAIN_2); + Bg_FreeTilemapBuffer(hallOfFameMan->bgConfig, BG_LAYER_MAIN_3); + Heap_Free(hallOfFameMan->bgConfig); +} + +static void ov86_0223B900(HallOfFameMan *hallOfFameMan) +{ + NNS_G3dInit(); + + G3X_InitMtxStack(); + G3X_SetShading(GX_SHADING_TOON); + G3X_AntiAlias(1); + G3X_AlphaTest(0, 0); + G3X_AlphaBlend(1); + G3X_SetClearColor(GX_RGB(0, 0, 0), 0, 0x7fff, 63, 0); + + G3_SwapBuffers(GX_SORTMODE_AUTO, GX_BUFFERMODE_W); + G3_ViewPort(VIEWPORT_X_MIN, VIEWPORT_Y_MIN, VIEWPORT_X_MAX, VIEWPORT_Y_MAX); + + NNS_GfdInitFrmTexVramManager(1, 1); + NNS_GfdInitFrmPlttVramManager(0x4000, 1); + + GXLayers_EngineAToggleLayers(GX_PLANEMASK_BG0, 1); + + G2_SetBG0Priority(2); + G2_SetBlendAlpha(GX_BLEND_PLANEMASK_NONE, GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_OBJ, 0, 0); + + HallOfFame_InitCamera(hallOfFameMan); +} + +static void HallOfFame_InitCamera(HallOfFameMan *hallOfFameMan) +{ + VecFx32 position; + + hallOfFameMan->camera = Camera_Alloc(HEAP_ID_HALL_OF_FAME); + hallOfFameMan->position.x = 0; + hallOfFameMan->position.y = 0; + hallOfFameMan->position.z = 0; + hallOfFameMan->cameraAngle.x = 0; + hallOfFameMan->cameraAngle.y = 0; + hallOfFameMan->cameraAngle.z = 0; + + Camera_InitWithTarget(&(hallOfFameMan->position), 20480, &(hallOfFameMan->cameraAngle), 4004, 0, TRUE, hallOfFameMan->camera); + + position.x = 0; + position.y = FX32_ONE; + position.z = 0; + + Camera_SetUp(&position, hallOfFameMan->camera); + Camera_SetAsActive(hallOfFameMan->camera); + Camera_SetClipping(1 << FX32_SHIFT, 500 << FX32_SHIFT, hallOfFameMan->camera); +} + +static void HallOfFame_DeleteCamera(HallOfFameMan *hallOfFameMan) +{ + Camera_Delete(hallOfFameMan->camera); +} + +static void ov86_0223BA44(HallOfFameMan *hallOfFameMan) +{ + NNSG2dCellDataBank *cellBank; + NNSG2dAnimBankData *animBank; + NARC *narc = NARC_ctor(NARC_INDEX_BATTLE__GRAPHIC__PL_BATT_OBJ, HEAP_ID_HALL_OF_FAME); + + NNS_G2dInitOamManagerModule(); + RenderOam_Init(0, 128, 0, 32, 0, 128, 0, 32, HEAP_ID_HALL_OF_FAME); + + hallOfFameMan->spriteList = SpriteList_InitRendering(64, &hallOfFameMan->g2dRenderer, HEAP_ID_HALL_OF_FAME); + hallOfFameMan->unk_1D0 = Graphics_GetCellBankFromOpenNARC(narc, 77, FALSE, &cellBank, HEAP_ID_HALL_OF_FAME); + hallOfFameMan->unk_1D4 = Graphics_GetAnimBankFromOpenNARC(narc, 78, FALSE, &animBank, HEAP_ID_HALL_OF_FAME); + + ov86_0223BAC8(hallOfFameMan, cellBank, animBank, narc); + + NARC_dtor(narc); + GXLayers_EngineAToggleLayers(GX_PLANEMASK_OBJ, 1); +} + +static void ov86_0223BAC8(HallOfFameMan *hallOfFameMan, NNSG2dCellDataBank *cellBank, NNSG2dAnimBankData *animBank, NARC *narc) +{ + static const TileRegion tileRegions[2] = { + FRAME_0_REGION, + FRAME_1_REGION + }; + PokemonSpriteTemplate spriteTemplate; + SpriteResourcesHeader resourceHeader; + SpriteListTemplate spriteListTemplate; + UnkStruct_ov5_021DE5D0 v4; + NNSG2dImageProxy imageProxy; + NNSG2dImagePaletteProxy paletteProxy; + NNSG2dCharacterData *charData; + NNSG2dPaletteData *paletteData; + void *ncgrBuffer; + void *nclrBuffer; + const Pokemon *mon; + int i; + + resourceHeader.charData = NULL; + resourceHeader.multiCellBank = NULL; + resourceHeader.multiCellAnimBank = NULL; + resourceHeader.isVRamTransfer = 0; + resourceHeader.cellBank = cellBank; + resourceHeader.cellAnimBank = animBank; + resourceHeader.priority = 3; + resourceHeader.imageProxy = &imageProxy; + resourceHeader.paletteProxy = &paletteProxy; + + spriteListTemplate.list = hallOfFameMan->spriteList; + spriteListTemplate.resourceData = &resourceHeader; + + VEC_Set(&(spriteListTemplate.position), 0, 0, 0); + + spriteListTemplate.vramType = NNS_G2D_VRAM_TYPE_2DMAIN; + spriteListTemplate.heapID = HEAP_ID_HALL_OF_FAME; + + ncgrBuffer = Graphics_GetCharDataFromOpenNARC(narc, 76, FALSE, &charData, HEAP_ID_HALL_OF_FAME); + nclrBuffer = Graphics_GetPlttDataFromOpenNARC(narc, 75, &paletteData, HEAP_ID_HALL_OF_FAME); + + for (i = 0; i < hallOfFameMan->monCount; i++) { + NNS_G2dInitImageProxy(&imageProxy); + NNS_G2dInitImagePaletteProxy(&paletteProxy); + NNS_G2dLoadImage1DMapping(charData, i * 2 * 3200, NNS_G2D_VRAM_TYPE_2DMAIN, &imageProxy); + NNS_G2dLoadPalette(paletteData, i * 0x20, NNS_G2D_VRAM_TYPE_2DMAIN, &paletteProxy); + + spriteListTemplate.priority = 1 + i; + hallOfFameMan->monSprites[i] = SpriteList_Add(&spriteListTemplate); + + Sprite_SetDrawFlag(hallOfFameMan->monSprites[i], FALSE); + mon = Party_GetPokemonBySlotIndex(hallOfFameMan->displayData->party, hallOfFameMan->slotIndexes[i]); + Pokemon_BuildSpriteTemplate(&spriteTemplate, (Pokemon *)mon, FACE_FRONT); + + hallOfFameMan->species[i] = Pokemon_GetValue((Pokemon *)mon, MON_DATA_SPECIES, NULL); + hallOfFameMan->forms[i] = Pokemon_GetValue((Pokemon *)mon, MON_DATA_FORM, NULL); + + CharacterSprite_LoadPokemonSpriteRegion(spriteTemplate.narcID, + spriteTemplate.character, + HEAP_ID_HALL_OF_FAME, + &tileRegions[0], + hallOfFameMan->unk_310, + Pokemon_GetValue((Pokemon *)mon, + MON_DATA_PERSONALITY, + NULL), + TRUE, + FACE_FRONT, + hallOfFameMan->species[i]); + + DC_FlushRange(hallOfFameMan->unk_310, 3200); + GX_LoadOBJ(hallOfFameMan->unk_310, i * 2 * 3200, 3200); + + CharacterSprite_LoadPokemonSpriteRegion(spriteTemplate.narcID, + spriteTemplate.character, + HEAP_ID_HALL_OF_FAME, + &tileRegions[1], + hallOfFameMan->unk_310, + Pokemon_GetValue((Pokemon *)mon, + MON_DATA_PERSONALITY, + NULL), + TRUE, + FACE_FRONT, + hallOfFameMan->species[i]); + + DC_FlushRange(hallOfFameMan->unk_310, 3200); + GX_LoadOBJ(hallOfFameMan->unk_310, i * 2 * 3200 + 3200, 3200); + + Graphics_LoadPalette(spriteTemplate.narcID, spriteTemplate.palette, 1, i * 0x20, 0x20, HEAP_ID_HALL_OF_FAME); + PokeSprite_LoadAnimationFrames(hallOfFameMan->narc, &hallOfFameMan->animFrames[i][0], hallOfFameMan->species[i], 1); + } + + NNS_G2dInitImageProxy(&imageProxy); + NNS_G2dInitImagePaletteProxy(&paletteProxy); + NNS_G2dLoadImage1DMapping(charData, 38400, NNS_G2D_VRAM_TYPE_2DMAIN, &imageProxy); + NNS_G2dLoadPalette(paletteData, 192, NNS_G2D_VRAM_TYPE_2DMAIN, &paletteProxy); + + sub_02076AAC((TrainerInfo_Gender(hallOfFameMan->displayData->trainerInfo) == GENDER_FEMALE) ? 1 : 0, 2, &v4); + CharacterSprite_LoadSpriteRegion(v4.narcID, v4.unk_14, HEAP_ID_HALL_OF_FAME, &tileRegions[0], hallOfFameMan->unk_310); + + DC_FlushRange(hallOfFameMan->unk_310, 3200); + GX_LoadOBJ(hallOfFameMan->unk_310, 38400, 3200); + + Graphics_LoadPalette(v4.narcID, v4.unk_08, 1, 192, 0x20, HEAP_ID_HALL_OF_FAME); + + spriteListTemplate.priority = 0; + hallOfFameMan->sprite = SpriteList_Add(&spriteListTemplate); + + Sprite_SetDrawFlag(hallOfFameMan->sprite, FALSE); + Heap_Free(nclrBuffer); + Heap_Free(ncgrBuffer); +} + +static void HallOfFame_DeleteSprites(HallOfFameMan *hallOfFameMan) +{ + int i; + + for (i = 0; i < hallOfFameMan->monCount; i++) { + Sprite_Delete(hallOfFameMan->monSprites[i]); + } + + Heap_Free(hallOfFameMan->unk_1D4); + Heap_Free(hallOfFameMan->unk_1D0); + SpriteList_Delete(hallOfFameMan->spriteList); + RenderOam_Free(); +} + +static void HallOfFameTask_Finish(SysTask *task, void *data) +{ + HallOfFameTask *hallOfFameTask = data; + + *(hallOfFameTask->task) = NULL; + + Heap_Free(hallOfFameTask->data); + SysTask_Done(task); +} + +static void HallOfFameTask_Init(HallOfFameTask *hallOfFameTask, void *data, SysTask **task) +{ + hallOfFameTask->data = data; + hallOfFameTask->task = task; +} + +static void HallOfFameTask_FinishAfterVBlank(HallOfFameTask *hallOfFameTask) +{ + SysTask_ExecuteAfterVBlank(HallOfFameTask_Finish, hallOfFameTask, 0); +} + +static void HallOfFame_ShowPokemonSprite(HallOfFameMan *hallOfFameMan, int monIndex, int taskID) +{ + static const struct { + fx32 start; + fx32 end; + } pokemonMovements[] = { + { 786432, 294912 }, + { 262144, 753664 } + }; + HallOfFamePokemonSprite *pokemonSprite = Heap_Alloc(HEAP_ID_HALL_OF_FAME, sizeof(HallOfFamePokemonSprite)); + int side = monIndex & 1; + + HallOfFameTask_Init(&pokemonSprite->hallOfFameTask, pokemonSprite, &(hallOfFameMan->tasks[taskID])); + pokemonSprite->sprite = hallOfFameMan->monSprites[monIndex]; + HallOfFameMovement_Init(&pokemonSprite->movement, pokemonMovements[side].start, pokemonMovements[side].end, 28); + + VEC_Set(&pokemonSprite->position, pokemonMovements[side].start, 393216, 0); + + Sprite_SetPosition(pokemonSprite->sprite, &pokemonSprite->position); + Sprite_SetDrawFlag(pokemonSprite->sprite, TRUE); + + hallOfFameMan->tasks[taskID] = HallOfFame_ExecuteSysTaskOnVBlank(HallOfFame_SlideInPokemonSprite, pokemonSprite, 0); +} + +static void HallOfFame_SlideInPokemonSprite(SysTask *task, void *data) +{ + HallOfFamePokemonSprite *pokemonSprite = data; + + pokemonSprite->position.x = HallOfFameMovement_Run(&pokemonSprite->movement); + Sprite_SetPosition(pokemonSprite->sprite, &pokemonSprite->position); + + if (HallOfFameMovement_IsDone(&pokemonSprite->movement)) { + HallOfFameTask_FinishAfterVBlank(&pokemonSprite->hallOfFameTask); + SysTask_Done(task); + } +} + +static void HallOfFame_ShowPlayerSprite(HallOfFameMan *hallOfFameMan, int taskID) +{ + HallOfFamePlayerSprite *playerSprite = Heap_Alloc(HEAP_ID_HALL_OF_FAME, sizeof(HallOfFamePlayerSprite)); + HallOfFameTask_Init(&playerSprite->hallOfFameTask, playerSprite, &(hallOfFameMan->tasks[taskID])); + + playerSprite->sprite = hallOfFameMan->sprite; + HallOfFameMovement_Init(&playerSprite->movement, FX32_CONST(232), FX32_CONST(104), 28); + + VEC_Set(&playerSprite->position, FX32_CONST(128), FX32_CONST(232), 0); + + Sprite_SetPosition(playerSprite->sprite, &playerSprite->position); + Sprite_SetDrawFlag(playerSprite->sprite, TRUE); + + hallOfFameMan->tasks[taskID] = HallOfFame_ExecuteSysTaskOnVBlank(HallOfFame_SlideInPlayerSprite, playerSprite, 0); +} + +static void HallOfFame_SlideInPlayerSprite(SysTask *task, void *data) +{ + HallOfFamePlayerSprite *playerSprite = data; + + playerSprite->position.y = HallOfFameMovement_Run(&playerSprite->movement); + Sprite_SetPosition(playerSprite->sprite, &playerSprite->position); + + if (HallOfFameMovement_IsDone(&playerSprite->movement)) { + HallOfFameTask_FinishAfterVBlank(&playerSprite->hallOfFameTask); + SysTask_Done(task); + } +} + +static void HallOfFame_SlideFrameHorizontal(SysTask *task, void *data) +{ + HallOfFameFrameSliderHorizontal *sliderHorizontal = data; + int left = HallOfFameMovement_Run(&(sliderHorizontal->movement)) >> FX32_SHIFT; + int right = left + POKEMON_FRAME_WIDTH; + + if (left < VIEWPORT_X_MIN) { + left = VIEWPORT_X_MIN; + } + + if (right < VIEWPORT_X_MIN) { + right = VIEWPORT_X_MIN; + } + + if (left > VIEWPORT_X_MAX) { + left = right = VIEWPORT_X_MIN; + } + + if (right > VIEWPORT_X_MAX) { + right = VIEWPORT_X_MAX; + } + + G2_SetWnd0Position(left, 32, right, 32 + POKEMON_FRAME_HEIGHT); + + if (HallOfFameMovement_IsDone(&(sliderHorizontal->movement))) { + HallOfFameTask_FinishAfterVBlank(&sliderHorizontal->hallOfFameTask); + SysTask_Done(task); + } +} + +static void HallOfFame_SlideFrameVertical(SysTask *task, void *data) +{ + HallOfFameFrameSliderVertical *sliderVertical = data; + int top = HallOfFameMovement_Run(&(sliderVertical->movement)) >> FX32_SHIFT; + int bottom = top + sliderVertical->height; + + if (top < VIEWPORT_Y_MIN) { + top = VIEWPORT_Y_MIN; + } + + if (bottom < VIEWPORT_Y_MIN) { + bottom = VIEWPORT_Y_MIN; + } + + if (top > VIEWPORT_Y_MAX) { + top = bottom = VIEWPORT_Y_MIN; + } + + if (bottom > VIEWPORT_Y_MAX) { + bottom = VIEWPORT_Y_MAX; + } + + G2_SetWnd0Position(sliderVertical->left, top, sliderVertical->right, bottom); + + if (HallOfFameMovement_IsDone(&(sliderVertical->movement))) { + HallOfFameTask_FinishAfterVBlank(&sliderVertical->hallOfFameTask); + SysTask_Done(task); + } +} + +static void HallOfFame_ExpandFrameHorizontal(SysTask *task, void *data) +{ + HallOfFameFrameExpander *frameExpander = data; + int left = HallOfFameMovement_Run(&frameExpander->movementLeft) >> FX32_SHIFT; + int right = HallOfFameMovement_Run(&frameExpander->movementRight) >> FX32_SHIFT; + + if (left < VIEWPORT_X_MIN) { + left = VIEWPORT_X_MIN; + } + + if (right < VIEWPORT_X_MIN) { + right = VIEWPORT_X_MIN; + } + + if (left > VIEWPORT_X_MAX) { + left = right = VIEWPORT_X_MIN; + } + + if (right > VIEWPORT_X_MAX) { + right = VIEWPORT_X_MAX; + } + + G2_SetWnd0Position(left, frameExpander->top, right, frameExpander->bottom); + + if (HallOfFameMovement_IsDone(&(frameExpander->movementLeft))) { + HallOfFameTask_FinishAfterVBlank(&frameExpander->hallOfFameTask); + SysTask_Done(task); + } +} + +static void HallOfFame_SlideToBlack(SysTask *task, void *data) +{ + HallOfFameSliderToBlack *sliderToBlack = data; + int top = HallOfFameMovement_Run(&sliderToBlack->movementTop) >> FX32_SHIFT; + int bottom = HallOfFameMovement_Run(&sliderToBlack->movementBottom) >> FX32_SHIFT; + + if (top < VIEWPORT_Y_MIN) { + top = VIEWPORT_Y_MIN; + } + + if (bottom < VIEWPORT_Y_MIN) { + bottom = VIEWPORT_Y_MIN; + } + + if (top > VIEWPORT_Y_MAX) { + top = bottom = VIEWPORT_Y_MIN; + } + + if (bottom > VIEWPORT_Y_MAX) { + bottom = VIEWPORT_Y_MAX; + } + + G2_SetWnd0Position(sliderToBlack->left, top, sliderToBlack->right, bottom); + + if (HallOfFameMovement_IsDone(&(sliderToBlack->movementTop))) { + HallOfFameTask_FinishAfterVBlank(&sliderToBlack->hallOfFameTask); + SysTask_Done(task); + } +} + +static void HallOfFame_ShowPokemonFrame(HallOfFameMan *hallOfFameMan, int monIndex, int taskID) +{ + static const struct { + fx32 start; + fx32 end; + } frameMovements[] = { + { FX32_CONST(-96), FX32_CONST(24) }, + { FX32_CONST(352), FX32_CONST(136) } + }; + HallOfFameFrameSliderHorizontal *sliderHorizontal = Heap_Alloc(HEAP_ID_HALL_OF_FAME, sizeof(HallOfFameFrameSliderHorizontal)); + int side = monIndex & 1; + + HallOfFameTask_Init(&sliderHorizontal->hallOfFameTask, sliderHorizontal, &(hallOfFameMan->tasks[taskID])); + HallOfFameMovement_Init(&sliderHorizontal->movement, frameMovements[side].start, frameMovements[side].end, 28); + + hallOfFameMan->tasks[taskID] = HallOfFame_ExecuteSysTaskOnVBlank(HallOfFame_SlideFrameHorizontal, sliderHorizontal, 1); +} + +static void HallOfFame_RemovePokemonFrame(HallOfFameMan *hallOfFameMan, int monIndex, int taskID) +{ + static const int frameCoordsLeft[] = { + 24, + 136, + }; + HallOfFameFrameSliderVertical *sliderVertical = Heap_Alloc(HEAP_ID_HALL_OF_FAME, sizeof(HallOfFameFrameSliderVertical)); + int side = monIndex & 1; + + HallOfFameTask_Init(&sliderVertical->hallOfFameTask, sliderVertical, &(hallOfFameMan->tasks[taskID])); + HallOfFameMovement_Init(&sliderVertical->movement, FX32_CONST(32), FX32_CONST(-160), 28); + + sliderVertical->left = frameCoordsLeft[side]; + sliderVertical->right = sliderVertical->left + POKEMON_FRAME_WIDTH; + sliderVertical->height = POKEMON_FRAME_HEIGHT; + + hallOfFameMan->tasks[taskID] = HallOfFame_ExecuteSysTaskOnVBlank(HallOfFame_SlideFrameVertical, sliderVertical, 1); +} + +static void HallOfFame_ShowPlayerFrame(HallOfFameMan *hallOfFameMan, int taskID) +{ + HallOfFameFrameSliderVertical *sliderVertical = Heap_Alloc(HEAP_ID_HALL_OF_FAME, sizeof(HallOfFameFrameSliderVertical)); + + HallOfFameTask_Init(&sliderVertical->hallOfFameTask, sliderVertical, &(hallOfFameMan->tasks[taskID])); + HallOfFameMovement_Init(&sliderVertical->movement, FX32_CONST(-144), FX32_CONST(24), 28); + + sliderVertical->left = 88; + sliderVertical->right = 168; + sliderVertical->height = PLAYER_FRAME_HEIGHT; + + hallOfFameMan->tasks[taskID] = HallOfFame_ExecuteSysTaskOnVBlank(HallOfFame_SlideFrameVertical, sliderVertical, 1); +} + +static void HallOfFame_ExpandFrame(HallOfFameMan *hallOfFameMan, int taskID) +{ + HallOfFameFrameExpander *frameExpander = Heap_Alloc(HEAP_ID_HALL_OF_FAME, sizeof(HallOfFameFrameExpander)); + + HallOfFameTask_Init(&frameExpander->hallOfFameTask, frameExpander, &(hallOfFameMan->tasks[taskID])); + HallOfFameMovement_Init(&frameExpander->movementLeft, FX32_CONST(88), 0, 12); + HallOfFameMovement_Init(&frameExpander->movementRight, FX32_CONST(168), FX32_CONST(255), 12); + + frameExpander->top = 24; + frameExpander->bottom = frameExpander->top + PLAYER_FRAME_HEIGHT; + + hallOfFameMan->tasks[taskID] = HallOfFame_ExecuteSysTaskOnVBlank(HallOfFame_ExpandFrameHorizontal, frameExpander, 1); +} + +static void HallOfFame_WipeToBlack(HallOfFameMan *hallOfFameMan, int taskID) +{ + HallOfFameSliderToBlack *sliderToBlack = Heap_Alloc(HEAP_ID_HALL_OF_FAME, sizeof(HallOfFameSliderToBlack)); + + HallOfFameTask_Init(&sliderToBlack->hallOfFameTask, sliderToBlack, &(hallOfFameMan->tasks[taskID])); + HallOfFameMovement_Init(&sliderToBlack->movementTop, FX32_CONST(24), FX32_CONST(96), 24); + HallOfFameMovement_Init(&sliderToBlack->movementBottom, FX32_CONST(24 + 144), FX32_CONST(96), 24); + + sliderToBlack->left = VIEWPORT_X_MIN; + sliderToBlack->right = VIEWPORT_X_MAX; + + hallOfFameMan->tasks[taskID] = HallOfFame_ExecuteSysTaskOnVBlank(HallOfFame_SlideToBlack, sliderToBlack, 1); +} + +static void HallOfFame_InitPokemonAnimation(HallOfFameMan *hallOfFameMan, int monIndex, BOOL playCry, int taskID) +{ + HallOfFamePokemonAnimation *pokemonAnimation = Heap_Alloc(HEAP_ID_HALL_OF_FAME, sizeof(HallOfFamePokemonAnimation)); + + HallOfFameTask_Init(&pokemonAnimation->hallOfFameTask, pokemonAnimation, &(hallOfFameMan->tasks[taskID])); + + pokemonAnimation->sprite = hallOfFameMan->monSprites[monIndex]; + pokemonAnimation->animFrame = &hallOfFameMan->animFrames[monIndex][0]; + + PokemonSpriteTaskAnim_Init(&pokemonAnimation->anim, pokemonAnimation->animFrame); + + pokemonAnimation->playCry = playCry; + pokemonAnimation->species = hallOfFameMan->species[monIndex]; + pokemonAnimation->form = hallOfFameMan->forms[monIndex]; + pokemonAnimation->imageProxies[0] = *Sprite_GetImageProxy(pokemonAnimation->sprite); + pokemonAnimation->imageProxies[1] = pokemonAnimation->imageProxies[0]; + + NNS_G2dInitImageProxy(&pokemonAnimation->imageProxies[1]); + NNS_G2dSetImageLocation(&(pokemonAnimation->imageProxies[1]), NNS_G2D_VRAM_TYPE_2DMAIN, monIndex * 2 * 3200 + 3200); + + hallOfFameMan->tasks[taskID] = SysTask_Start(HallOfFame_PlayPokemonAnimation, pokemonAnimation, 0); +} + +static void HallOfFame_PlayPokemonAnimation(SysTask *task, void *data) +{ + HallOfFamePokemonAnimation *pokemonAnimation = data; + int currSpriteFrame; + + if (pokemonAnimation->playCry) { + Sound_PlayPokemonCry(pokemonAnimation->species, pokemonAnimation->form); + pokemonAnimation->playCry = FALSE; + } + + currSpriteFrame = PokemonSpriteTaskAnim_Tick(&pokemonAnimation->anim); + + if (currSpriteFrame >= 0) { + Sprite_SetImageProxy(pokemonAnimation->sprite, &pokemonAnimation->imageProxies[currSpriteFrame]); + } else { + HallOfFameTask_FinishAfterVBlank(&pokemonAnimation->hallOfFameTask); + SysTask_Done(task); + } +} + +static void HallOfFame_ShowPokemonText(HallOfFameMan *hallOfFameMan, int monIndex, int taskID) +{ + HallOfFamePokemonTextAdder *textAdder = Heap_Alloc(HEAP_ID_HALL_OF_FAME, sizeof(HallOfFamePokemonTextAdder)); + + HallOfFameTask_Init(&textAdder->hallOfFameTask, textAdder, &(hallOfFameMan->tasks[taskID])); + + textAdder->hallOfFameMan = hallOfFameMan; + textAdder->bgConfig = hallOfFameMan->bgConfig; + textAdder->window = &(hallOfFameMan->window); + textAdder->strTemplate = hallOfFameMan->strTemplate; + textAdder->strbuf_18 = hallOfFameMan->strbuf_1C30; + textAdder->strbuf_1C = hallOfFameMan->strbuf_1C4C; + textAdder->msgLoader = hallOfFameMan->msgLoaderHallOfFame; + textAdder->xPosition = monIndex & 1 ? 0 : 120; + textAdder->mon = Party_GetPokemonBySlotIndex(hallOfFameMan->displayData->party, hallOfFameMan->slotIndexes[monIndex]); + textAdder->trainerInfo = hallOfFameMan->displayData->trainerInfo; + textAdder->delay = 0; + textAdder->state = 0; + + hallOfFameMan->tasks[taskID] = SysTask_Start(HallOfFame_PrintPokemonText, textAdder, 0); +} + +static void HallOfFame_PrintTextAtRow(HallOfFamePokemonTextAdder *textAdder, int yOffset) +{ + int i, numLines, xOffset; + + numLines = Strbuf_NumLines(textAdder->strbuf_1C); + + for (i = 0; i < numLines; i++) { + Strbuf_CopyLineNum(textAdder->strbuf_18, textAdder->strbuf_1C, i); + xOffset = (136 - Font_CalcStrbufWidth(FONT_SYSTEM, textAdder->strbuf_18, 0)) / 2; + Text_AddPrinterWithParamsAndColor(textAdder->window, FONT_SYSTEM, textAdder->strbuf_18, textAdder->xPosition + xOffset, yOffset + i * 16, TEXT_SPEED_NO_TRANSFER, TEXT_COLOR(1, 2, 0), NULL); + } +} + +static void HallOfFame_LoadPokemonText(HallOfFamePokemonTextAdder *textAdder) +{ + StringTemplate_SetSpeciesName(textAdder->strTemplate, 0, Pokemon_GetBoxPokemon(textAdder->mon)); + StringTemplate_SetNumber(textAdder->strTemplate, 1, Pokemon_GetLevel(textAdder->mon), 3, PADDING_MODE_NONE, CHARSET_MODE_EN); + + switch (Pokemon_GetGender(textAdder->mon)) { + case GENDER_MALE: + MessageLoader_GetStrbuf(textAdder->msgLoader, HallOfFame_Text_PokemonInfoMale, textAdder->strbuf_18); + break; + case GENDER_FEMALE: + MessageLoader_GetStrbuf(textAdder->msgLoader, HallOfFame_Text_PokemonInfoFemale, textAdder->strbuf_18); + break; + case GENDER_NONE: + default: + MessageLoader_GetStrbuf(textAdder->msgLoader, HallOfFame_Text_PokemonInfoGenderless, textAdder->strbuf_18); + break; + } + + StringTemplate_Format(textAdder->strTemplate, textAdder->strbuf_1C, textAdder->strbuf_18); +} + +static void HallOfFame_LoadMetString(HallOfFamePokemonTextAdder *textAdder) +{ + int metStringIndex = HallOfFame_GetMetStringIndex(textAdder->hallOfFameMan, textAdder->mon, textAdder->trainerInfo); + + switch (metStringIndex) { + case HallOfFame_Text_MetAt - HallOfFame_Text_MetAt: + case HallOfFame_Text_HatchedAt - HallOfFame_Text_MetAt: + StringTemplate_SetLocationName(textAdder->strTemplate, 0, Pokemon_GetValue(textAdder->mon, MON_DATA_HATCH_LOCATION, NULL)); + break; + } + + MessageLoader_GetStrbuf(textAdder->msgLoader, HallOfFame_Text_MetAt + metStringIndex, textAdder->strbuf_18); + StringTemplate_Format(textAdder->strTemplate, textAdder->strbuf_1C, textAdder->strbuf_18); +} + +static void HallOfFame_PrintPokemonText(SysTask *task, void *data) +{ + HallOfFamePokemonTextAdder *textAdder = data; + + if (textAdder->delay) { + textAdder->delay--; + return; + } + + switch (textAdder->state) { + case 0: + MessageLoader_GetStrbuf(textAdder->msgLoader, HallOfFame_Text_Welcome, textAdder->strbuf_1C); + HallOfFame_PrintTextAtRow(textAdder, ROW_HEIGHT); + Window_LoadTiles(textAdder->window); + textAdder->delay = 20; + textAdder->state++; + break; + case 1: + Pokemon_GetValue(textAdder->mon, MON_DATA_NICKNAME_STRBUF, textAdder->strbuf_1C); + HallOfFame_PrintTextAtRow(textAdder, ROW_HEIGHT * 3); + HallOfFame_LoadPokemonText(textAdder); + HallOfFame_PrintTextAtRow(textAdder, ROW_HEIGHT * 4); + Window_LoadTiles(textAdder->window); + textAdder->delay = 20; + textAdder->state++; + break; + case 2: + StringTemplate_SetOTName(textAdder->strTemplate, 0, Pokemon_GetBoxPokemon(textAdder->mon)); + MessageLoader_GetStrbuf(textAdder->msgLoader, HallOfFame_Text_OT, textAdder->strbuf_18); + StringTemplate_Format(textAdder->strTemplate, textAdder->strbuf_1C, textAdder->strbuf_18); + HallOfFame_PrintTextAtRow(textAdder, ROW_HEIGHT * 6); + HallOfFame_LoadMetString(textAdder); + HallOfFame_PrintTextAtRow(textAdder, ROW_HEIGHT * 7); + Window_LoadTiles(textAdder->window); + textAdder->state++; + break; + case 3: + HallOfFameTask_FinishAfterVBlank(&textAdder->hallOfFameTask); + SysTask_Done(task); + break; + } +} + +static void HallOfFame_RemovePokemonText(HallOfFameMan *hallOfFameMan, int taskID) +{ + HallOfFamePokemonTextRemover *textRemover = Heap_Alloc(HEAP_ID_HALL_OF_FAME, sizeof(HallOfFamePokemonTextRemover)); + + HallOfFameTask_Init(&textRemover->hallOfFameTask, textRemover, &(hallOfFameMan->tasks[taskID])); + + textRemover->bgConfig = hallOfFameMan->bgConfig; + textRemover->window = &(hallOfFameMan->window); + textRemover->bgLayer = BG_LAYER_MAIN_1; + textRemover->state = 0; + + HallOfFameMovement_Init(&(textRemover->movement), FX32_CONST(0), FX32_CONST(256), 28); + + hallOfFameMan->tasks[taskID] = HallOfFame_ExecuteSysTaskOnVBlank(HallOfFame_SlideOutPokemonText, textRemover, 0); +} + +static void HallOfFame_SlideOutPokemonText(SysTask *task, void *data) +{ + HallOfFamePokemonTextRemover *textRemover = data; + + switch (textRemover->state) { + case 0: { + int y = HallOfFameMovement_Run(&textRemover->movement) >> FX32_SHIFT; + + Bg_SetOffset(textRemover->bgConfig, textRemover->bgLayer, BG_OFFSET_UPDATE_SET_Y, y); + + if (HallOfFameMovement_IsDone(&textRemover->movement)) { + textRemover->state++; + } + } break; + case 1: + Window_FillTilemap(textRemover->window, 0); + Window_LoadTiles(textRemover->window); + textRemover->state++; + break; + case 2: + Bg_SetOffset(textRemover->bgConfig, textRemover->bgLayer, BG_OFFSET_UPDATE_SET_Y, 0); + HallOfFameTask_FinishAfterVBlank(&textRemover->hallOfFameTask); + SysTask_Done(task); + break; + } +} + +static void HallOfFame_ShowPlayerText(HallOfFameMan *hallOfFameMan) +{ + int xOffset; + + MessageLoader_GetStrbuf(hallOfFameMan->msgLoaderHallOfFame, HallOfFame_Text_LeagueChampionCongratulations, hallOfFameMan->strbuf_1C30); + + xOffset = (256 - Font_CalcStrbufWidth(FONT_SYSTEM, hallOfFameMan->strbuf_1C30, 0)) / 2; + Text_AddPrinterWithParamsAndColor(&hallOfFameMan->window, FONT_SYSTEM, hallOfFameMan->strbuf_1C30, xOffset, 4, TEXT_SPEED_NO_TRANSFER, TEXT_COLOR(1, 2, 0), NULL); + StringTemplate_SetPlayerName(hallOfFameMan->strTemplate, 0, hallOfFameMan->displayData->trainerInfo); + + StringTemplate_SetNumber(hallOfFameMan->strTemplate, 1, TrainerInfo_ID_LowHalf(hallOfFameMan->displayData->trainerInfo), 5, PADDING_MODE_ZEROES, CHARSET_MODE_EN); + StringTemplate_SetNumber(hallOfFameMan->strTemplate, 2, PlayTime_GetHours(hallOfFameMan->displayData->playTime), 3, PADDING_MODE_NONE, CHARSET_MODE_EN); + StringTemplate_SetNumber(hallOfFameMan->strTemplate, 3, PlayTime_GetMinutes(hallOfFameMan->displayData->playTime), 2, PADDING_MODE_ZEROES, CHARSET_MODE_EN); + MessageLoader_GetStrbuf(hallOfFameMan->msgLoaderHallOfFame, HallOfFame_Text_PlayerInfo, hallOfFameMan->strbuf_1C4C); + StringTemplate_Format(hallOfFameMan->strTemplate, hallOfFameMan->strbuf_1C30, hallOfFameMan->strbuf_1C4C); + + xOffset = (256 - Font_CalcStrbufWidth(FONT_SYSTEM, hallOfFameMan->strbuf_1C30, 0)) / 2; + Text_AddPrinterWithParamsAndColor(&hallOfFameMan->window, FONT_SYSTEM, hallOfFameMan->strbuf_1C30, xOffset, 172, TEXT_SPEED_NO_TRANSFER, TEXT_COLOR(1, 2, 0), NULL); + Window_LoadTiles(&hallOfFameMan->window); +} + +static void HallOfFame_ShowPartySprites(HallOfFameMan *hallOfFameMan, int taskID) +{ + static const VecFx32 initialPositions[] = { + { FX32_CONST(-40), FX32_CONST(104 - 8), 0 }, + { FX32_CONST(296), FX32_CONST(104 - 8), 0 }, + { FX32_CONST(-40), FX32_CONST(104 - 16), 0 }, + { FX32_CONST(296), FX32_CONST(104 - 16), 0 }, + { FX32_CONST(-40), FX32_CONST(104 - 24), 0 }, + { FX32_CONST(296), FX32_CONST(104 - 24), 0 } + }; + static const fx32 endPositionsX[] = { + FX32_CONST(128 + 32), + FX32_CONST(128 - 32), + FX32_CONST(128 + 64), + FX32_CONST(128 - 64), + FX32_CONST(128 + 96), + FX32_CONST(128 - 96) + }; + HallOfFamePartySprites *partySprites = Heap_Alloc(HEAP_ID_HALL_OF_FAME, sizeof(HallOfFamePartySprites)); + int i; + + HallOfFameTask_Init(&partySprites->hallOfFameTask, partySprites, &(hallOfFameMan->tasks[taskID])); + + partySprites->hallOfFameMan = hallOfFameMan; + partySprites->sprites = hallOfFameMan->monSprites; + partySprites->monIndex = 0; + partySprites->delay = 0; + partySprites->monCount = hallOfFameMan->monCount; + + for (i = 0; i < partySprites->monCount; i++) { + partySprites->positions[i] = initialPositions[i]; + Sprite_SetPosition(partySprites->sprites[i], &initialPositions[i]); + Sprite_SetDrawFlag(partySprites->sprites[i], TRUE); + } + + for (i = 0; i < MAX_PARTY_SIZE; i++) { + HallOfFameMovement_Init(&partySprites->movements[i], initialPositions[i].x, endPositionsX[i], 8); + } + + hallOfFameMan->tasks[taskID] = SysTask_Start(HallOfFame_SlideInPartySprites, partySprites, 0); +} + +static void HallOfFame_SlideInPartySprites(SysTask *task, void *data) +{ + HallOfFamePartySprites *partySprites = data; + int i; + + for (i = 0; i < partySprites->monIndex; i++) { + partySprites->positions[i].x = HallOfFameMovement_Run(&partySprites->movements[i]); + + if (i < partySprites->monCount) { + Sprite_SetPosition(partySprites->sprites[i], &(partySprites->positions[i])); + } + } + + if (partySprites->delay) { + partySprites->delay--; + } else { + if (partySprites->monIndex < MAX_PARTY_SIZE) { + partySprites->delay = 4; + partySprites->monIndex++; + } else if (HallOfFameMovement_IsDone(&partySprites->movements[partySprites->monCount - 1])) { + HallOfFameTask_FinishAfterVBlank(&partySprites->hallOfFameTask); + SysTask_Done(task); + } + } +} + +static u32 Unk_ov86_0223D564 = 0; +static BOOL Unk_ov86_0223D540 = TRUE; + +static SysTask *HallOfFame_InitSpotlightsTask(HallOfFameMan *hallOfFameMan) +{ + HallOfFameSpotlights *spotlights = Heap_Alloc(HEAP_ID_HALL_OF_FAME, sizeof(HallOfFameSpotlights)); + + if (spotlights) { + Unk_ov86_0223D540 = TRUE; + Unk_ov86_0223D564 = 2; + + spotlights->taskID = 0; + spotlights->task = HallOfFame_ExecuteSysTaskOnVBlank(ov86_0223CA64, spotlights, 5); + spotlights->hallOfFameMan = hallOfFameMan; + + return HallOfFame_ExecuteSysTaskOnVBlank(ov86_0223CA10, spotlights, 3); + } + + return NULL; +} + +static void ov86_0223CA10(SysTask *task, void *data) +{ + if (Unk_ov86_0223D540) { + HallOfFameSpotlights *spotlights = data; + + G3_BeginMakeDL(&spotlights->info, spotlights->ptr, sizeof(spotlights->ptr)); + G3B_MaterialColorDiffAmb(&spotlights->info, GX_RGB(31, 31, 31), GX_RGB(16, 16, 16), 0); + G3B_MaterialColorSpecEmi(&spotlights->info, GX_RGB(16, 16, 16), GX_RGB(0, 0, 0), 0); + } else { + Unk_ov86_0223D564--; + SysTask_Done(task); + } +} + +static void ov86_0223CA64(SysTask *task, void *data) +{ + if (Unk_ov86_0223D540) { + HallOfFameSpotlights *spotlights = data; + spotlights->ptrSize = G3_EndMakeDL(&spotlights->info); + DC_FlushRange(spotlights->ptr, spotlights->ptrSize); + } else { + Unk_ov86_0223D564--; + SysTask_Done(task); + } +} + +static void ov86_0223CAA0(SysTask *task, fx16 param1, fx32 param2) +{ + HallOfFameSpotlights *spotlights = SysTask_GetParam(task); + + if (spotlights->taskID < MAX_SPOTLIGHT_TASKS) { + spotlights->tasks[spotlights->taskID] = ov86_0223CAE4(spotlights, param1, param2, spotlights->taskID); + Unk_ov86_0223D564++; + spotlights->taskID++; + } +} + +static SysTask *ov86_0223CAE4(HallOfFameSpotlights *spotlights, fx16 param1, fx32 param2, int taskID) +{ + static const int colors[] = { + GX_RGB(31, 31, 12), + GX_RGB(31, 31, 16), + GX_RGB(31, 28, 8), + GX_RGB(31, 31, 12), + GX_RGB(31, 31, 16), + GX_RGB(31, 28, 8), + GX_RGB(31, 31, 12), + GX_RGB(31, 31, 12) + }; + static const fx16 v1[] = { + 0xc00, + 0xb00, + 0xa00, + 0xc00, + 0xb00, + 0xa00 + }; + UnkStruct_ov86_0223CAE4 *v2 = Heap_Alloc(HEAP_ID_HALL_OF_FAME, sizeof(UnkStruct_ov86_0223CAE4)); + + if (v2) { + v2->info = &(spotlights->info); + v2->unk_818 = param1; + v2->color = colors[taskID]; + v2->unk_804 = 0; + v2->unk_808 = param2; + v2->unk_80C = v1[taskID]; + v2->unk_814 = taskID; + + VEC_Fx16Set(&(v2->unk_81A), param1 - 80, -FX16_ONE, 0); + VEC_Fx16Set(&(v2->unk_820), param1 + 80, -FX16_ONE, 0); + + return HallOfFame_ExecuteSysTaskOnVBlank(ov86_0223CB74, v2, 4); + } + + return NULL; +} + +static void inline inline_ov86_0223CB74(UnkStruct_ov86_0223CAE4 *param0) +{ + int v0 = param0->unk_808 >> FX32_SHIFT; + fx32 v1 = param0->unk_818 + FX_Mul(CalcCosineDegrees(v0), 10240); + fx32 v2 = FX_Mul(CalcSineDegrees(v0), 10240) - FX16_ONE; + + VEC_Fx16Set(&(param0->unk_826), v1 - 576, v2, 0); + VEC_Fx16Set(&(param0->unk_82C), v1 + 576, v2, 0); +} + +static void ov86_0223CB74(SysTask *task, void *data) +{ + if (Unk_ov86_0223D540) { + UnkStruct_ov86_0223CAE4 *v0 = data; + + v0->unk_808 += v0->unk_80C; + + if (v0->unk_80C > 0) { + if (v0->unk_808 >= 696320) { + v0->unk_80C *= -1; + } + } else { + if (v0->unk_808 <= 40960) { + v0->unk_80C *= -1; + } + } + + inline_ov86_0223CB74(v0); + + G3B_PolygonAttr(v0->info, GX_LIGHTMASK_NONE, GX_POLYGONMODE_MODULATE, GX_CULL_BACK, v0->unk_814, 16, 0); + G3B_Begin(v0->info, GX_BEGIN_QUADS); + + G3B_Color(v0->info, v0->color); + G3B_Vtx(v0->info, v0->unk_81A.x, v0->unk_81A.y, v0->unk_81A.z); + G3B_Vtx(v0->info, v0->unk_820.x, v0->unk_820.y, v0->unk_820.z); + G3B_Vtx(v0->info, v0->unk_82C.x, v0->unk_82C.y, v0->unk_82C.z); + G3B_Vtx(v0->info, v0->unk_826.x, v0->unk_826.y, v0->unk_826.z); + + G3B_End(v0->info); + } else { + Unk_ov86_0223D564--; + SysTask_Done(task); + } +} + +static void ov86_0223CD00(SysTask *task) +{ + if (task != NULL) { + HallOfFameSpotlights *spotlights = SysTask_GetParam(task); + + G3_PushMtx(); + MI_SendGXCommand(3, spotlights->ptr, spotlights->ptrSize); + G3_PopMtx(1); + } +} + +static void HallOfFame_FreeSpotlightTasks(SysTask *task) +{ + Unk_ov86_0223D540 = FALSE; + + if (task != NULL) { + HallOfFameSpotlights *spotlights = SysTask_GetParam(task); + int i; + + for (i = 0; i < spotlights->taskID; i++) { + Heap_Free(SysTask_GetParam(spotlights->tasks[i])); + } + + Heap_Free(spotlights); + } +} + +static BOOL ov86_0223CD80(void) +{ + return Unk_ov86_0223D564 == 0; +} + +static SysTask *HallOfFame_InitConfettiTask(HallOfFameMan *hallOfFameMan) +{ + static const int colors[] = { + GX_RGB(16, 28, 21), + GX_RGB(31, 16, 29), + GX_RGB(8, 8, 31), + GX_RGB(6, 31, 31), + GX_RGB(31, 31, 0), + GX_RGB(9, 31, 0), + GX_RGB(31, 18, 0), + GX_RGB(22, 0, 31) + }; + static const VecFx16 v1[4] = { + { -156, -205, 0 }, + { 156, -205, 0 }, + { 156, 205, 0 }, + { -156, 205, 0 } + }; + HallOfFameConfettiAnimation *confettiAnim = Heap_Alloc(HEAP_ID_HALL_OF_FAME, sizeof(HallOfFameConfettiAnimation)); + int i, v4, rand = LCRNG_Next(), colorIndex; + s16 v7, v8, v9; + + LCRNG_SetSeed(13716); + + for (i = 0, colorIndex = 0; i < NUM_CONFETTI; i++) { + confettiAnim->confetti[i].color = colors[colorIndex]; + + if (++colorIndex >= NELEMS(colors)) { + colorIndex = 0; + } + + v7 = -4096 + (LCRNG_Next() % 8192); + v8 = 4096 + (LCRNG_Next() % 8192); + v9 = -328 + (LCRNG_Next() % 656); + + for (v4 = 0; v4 < 4; v4++) { + confettiAnim->confetti[i].unk_08[v4].x = v7 + v1[v4].x; + confettiAnim->confetti[i].unk_08[v4].y = v8 + v1[v4].y; + confettiAnim->confetti[i].unk_08[v4].z = v9 + v1[v4].z; + confettiAnim->confetti[i].unk_20.x = 0; + confettiAnim->confetti[i].unk_20.y = 0; + confettiAnim->confetti[i].unk_20.z = 0; + confettiAnim->confetti[i].unk_26.x = 512 + LCRNG_Next() % 512; + confettiAnim->confetti[i].unk_26.y = 512 + LCRNG_Next() % 512; + confettiAnim->confetti[i].unk_26.z = 512 + LCRNG_Next() % 512; + + MTX_Identity44(&confettiAnim->confetti[i].pDst); + } + + v4 = LCRNG_Next() & 7; + + while (v4--) { + VEC_Fx16Add(&confettiAnim->confetti[i].unk_20, &confettiAnim->confetti[i].unk_26, &confettiAnim->confetti[i].unk_20); + } + } + + LCRNG_SetSeed(rand); + + confettiAnim->active = FALSE; + confettiAnim->unk_04 = 0; + confettiAnim->unk_8D20 = 0; + + G3_MtxMode(GX_MTXMODE_POSITION_VECTOR); + + return SysTask_Start(HallOfFame_DoConfettiAnimation, confettiAnim, 2); +} + +static void HallOfFame_SysTaskDone(SysTask *task) +{ + if (task) { + Heap_Free(SysTask_GetParam(task)); + SysTask_Done(task); + } +} + +static void HallOfFame_SetConfettiActive(SysTask *task) +{ + if (task) { + HallOfFameConfettiAnimation *confettiAnim = SysTask_GetParam(task); + confettiAnim->active = TRUE; + } +} + +static void HallOfFame_DoConfettiAnimation(SysTask *task, void *data) +{ + HallOfFameConfettiAnimation *confettiAnim = data; + + if (confettiAnim->active) { + int i, v2; + + G3_BeginMakeDL(&confettiAnim->info, confettiAnim->unk_151C, sizeof(confettiAnim->unk_151C)); + G3B_PolygonAttr(&confettiAnim->info, GX_LIGHTMASK_01, GX_POLYGONMODE_MODULATE, GX_CULL_NONE, 63, 31, 0); + G3B_MaterialColorDiffAmb(&confettiAnim->info, GX_RGB(20, 20, 20), GX_RGB(0, 0, 0), 0); + + for (i = 0; i < NUM_CONFETTI; i++) { + confettiAnim->confetti[i].unk_08[3].y -= 85; + + if (confettiAnim->confetti[i].unk_08[3].y <= -4096) { + confettiAnim->confetti[i].unk_08[3].y = 4096 - (-4096 - confettiAnim->confetti[i].unk_08[3].y); + } + + confettiAnim->confetti[i].unk_08[0].y = confettiAnim->confetti[i].unk_08[3].y - (205 * 2); + confettiAnim->confetti[i].unk_08[1].y = confettiAnim->confetti[i].unk_08[0].y; + confettiAnim->confetti[i].unk_08[2].y = confettiAnim->confetti[i].unk_08[3].y; + + VEC_Fx16Add(&confettiAnim->confetti[i].unk_20, &confettiAnim->confetti[i].unk_26, &confettiAnim->confetti[i].unk_20); + + MTX_Identity44(&(confettiAnim->confetti[i].pDst)); + MTX_TransApply44(&(confettiAnim->confetti[i].pDst), &(confettiAnim->confetti[i].pDst), confettiAnim->confetti[i].unk_08[0].x, confettiAnim->confetti[i].unk_08[0].y, confettiAnim->confetti[i].unk_08[0].z); + + G3B_LightColor(&(confettiAnim->info), GX_LIGHTID_0, GX_RGB(11, 11, 11)); + G3B_LightColor(&(confettiAnim->info), GX_LIGHTID_1, confettiAnim->confetti[i].color); + + VecFx16 v3; + + VEC_Fx16Set(&v3, 0, FX16_ONE - 1, -FX16_ONE + 1); + VEC_Fx16Normalize(&v3, &v3); + + G3B_LightVector(&confettiAnim->info, GX_LIGHTID_0, v3.x, v3.y, v3.z); + + VEC_Fx16Set(&v3, 0, -FX16_ONE + 1, FX16_ONE - 1); + VEC_Fx16Normalize(&v3, &v3); + + G3B_LightVector(&confettiAnim->info, GX_LIGHTID_1, v3.x, v3.y, v3.z); + + MtxFx44 pDst; + + MTX_RotX44(&pDst, FX_SinIdx((u16)(confettiAnim->confetti[i].unk_20.x)), FX_CosIdx((u16)(confettiAnim->confetti[i].unk_20.x))); + MTX_Concat44(&pDst, &(confettiAnim->confetti[i].pDst), &(confettiAnim->confetti[i].pDst)); + + MTX_RotY44(&pDst, FX_SinIdx((u16)(confettiAnim->confetti[i].unk_20.y)), FX_CosIdx((u16)(confettiAnim->confetti[i].unk_20.y))); + MTX_Concat44(&pDst, &(confettiAnim->confetti[i].pDst), &(confettiAnim->confetti[i].pDst)); + + MTX_RotZ44(&pDst, FX_SinIdx((u16)(confettiAnim->confetti[i].unk_20.z)), FX_CosIdx((u16)(confettiAnim->confetti[i].unk_20.z))); + MTX_Concat44(&pDst, &(confettiAnim->confetti[i].pDst), &(confettiAnim->confetti[i].pDst)); + + G3B_MaterialColorSpecEmi(&confettiAnim->info, GX_RGB(31, 31, 31), confettiAnim->confetti[i].color, 0); + G3B_PushMtx(&confettiAnim->info); + G3B_LoadMtx44(&confettiAnim->info, &(confettiAnim->confetti[i].pDst)); + G3B_Begin(&confettiAnim->info, GX_BEGIN_QUADS); + + G3B_Normal(&confettiAnim->info, 0, 0, -FX16_ONE + 1); + G3B_Vtx(&confettiAnim->info, -156, -205, 0); + G3B_Vtx(&confettiAnim->info, 156, -205, 0); + G3B_Vtx(&confettiAnim->info, 156, 205, 0); + G3B_Vtx(&confettiAnim->info, -156, 205, 0); + + G3B_End(&confettiAnim->info); + G3B_PopMtx(&confettiAnim->info, 1); + } + + confettiAnim->unk_8D1C = G3_EndMakeDL(&confettiAnim->info); + DC_FlushRange(confettiAnim->unk_151C, confettiAnim->unk_8D1C); + + GF_ASSERT(confettiAnim->unk_8D1C < sizeof(confettiAnim->unk_151C)); + confettiAnim->unk_04 = 1; + } +} + +static void ov86_0223D220(SysTask *task) +{ + if (task) { + HallOfFameConfettiAnimation *confettiAnim = SysTask_GetParam(task); + + if (confettiAnim->unk_04) { + G3_PushMtx(); + MI_SendGXCommand(3, confettiAnim->unk_151C, confettiAnim->unk_8D1C); + G3_PopMtx(1); + confettiAnim->unk_04 = 0; + } else { + (void)0; + } + } +} + +static void HallOfFameMovement_Init(HallOfFameMovement *movement, fx32 start, fx32 end, int numSteps) +{ + movement->start = start; + movement->end = end; + movement->stepSize = (end - start) / numSteps; + movement->numSteps = numSteps - 1; + movement->done = FALSE; +} + +static fx32 HallOfFameMovement_Run(HallOfFameMovement *movement) +{ + if (movement->numSteps) { + movement->numSteps--; + movement->start += movement->stepSize; + return movement->start; + } else { + movement->done = TRUE; + return movement->end; + } +} + +static BOOL HallOfFameMovement_IsDone(HallOfFameMovement *movement) +{ + return movement->done; +} + +static int HallOfFame_GetMetStringIndex(HallOfFameMan *hallOfFameMan, Pokemon *mon, const TrainerInfo *trainerInfo) +{ + BOOL reencrypt = Pokemon_EnterDecryptionContext(mon); + int metStringIndex = HallOfFame_Text_ObtainedInFatefulEncounter - HallOfFame_Text_MetAt; + + do { + int metGame = Pokemon_GetValue(mon, MON_DATA_MET_GAME, NULL); + + if (metGame == VERSION_SAPPHIRE || metGame == VERSION_RUBY || metGame == VERSION_EMERALD) { + metStringIndex = HallOfFame_Text_ArrivedFromHoenn - HallOfFame_Text_MetAt; + break; + } + + if (metGame == VERSION_FIRERED || metGame == VERSION_LEAFGREEN) { + metStringIndex = HallOfFame_Text_ArrivedFromKanto - HallOfFame_Text_MetAt; + break; + } + + if (metGame == VERSION_GAMECUBE) { + metStringIndex = HallOfFame_Text_ArrivedFromDistantLand - HallOfFame_Text_MetAt; + break; + } + + if (Pokemon_GetValue(mon, MON_DATA_FATEFUL_ENCOUNTER, NULL)) { + metStringIndex = HallOfFame_Text_ObtainedInFatefulEncounter - HallOfFame_Text_MetAt; + break; + } + + u32 trainerID = TrainerInfo_ID(trainerInfo); + u32 otID = Pokemon_GetValue(mon, MON_DATA_OT_ID, NULL); + + if (trainerID != otID) { + metStringIndex = HallOfFame_Text_ObtainedInLinkTrade - HallOfFame_Text_MetAt; + break; + } + + TrainerInfo_NameStrbuf(trainerInfo, hallOfFameMan->strbuf_1C30); + Pokemon_GetValue(mon, MON_DATA_OTNAME_STRBUF, hallOfFameMan->strbuf_1C4C); + + if (Strbuf_Compare(hallOfFameMan->strbuf_1C30, hallOfFameMan->strbuf_1C4C)) { + metStringIndex = HallOfFame_Text_ObtainedInLinkTrade - HallOfFame_Text_MetAt; + break; + } + + if (Pokemon_GetValue(mon, MON_DATA_HATCH_LOCATION, NULL) >= 2000) { + metStringIndex = HallOfFame_Text_ObtainedInFatefulEncounter - HallOfFame_Text_MetAt; + ; + } else { + if (Pokemon_GetValue(mon, MON_DATA_MET_MONTH, NULL) == 0) { + metStringIndex = HallOfFame_Text_MetAt - HallOfFame_Text_MetAt; + } else { + metStringIndex = HallOfFame_Text_HatchedAt - HallOfFame_Text_MetAt; + } + } + } while (FALSE); + + Pokemon_ExitDecryptionContext(mon, reencrypt); + + return metStringIndex; +} diff --git a/src/hall_of_fame.c b/src/hall_of_fame_entries.c similarity index 99% rename from src/hall_of_fame.c rename to src/hall_of_fame_entries.c index 49ba65932c..3e8707dc51 100644 --- a/src/hall_of_fame.c +++ b/src/hall_of_fame_entries.c @@ -1,4 +1,4 @@ -#include "hall_of_fame.h" +#include "hall_of_fame_entries.h" #include #include diff --git a/src/meson.build b/src/meson.build index 04f245de50..8bcbe04a4a 100644 --- a/src/meson.build +++ b/src/meson.build @@ -125,7 +125,7 @@ pokeplatinum_c = files( 'special_encounter.c', 'global_trade.c', 'mystery_gift.c', - 'hall_of_fame.c', + 'hall_of_fame_entries.c', 'unk_0202E2CC.c', 'unk_0202E840.c', 'unk_0202EEC0.c', @@ -258,7 +258,7 @@ pokeplatinum_c = files( 'trainer_card_badge_dirt.c', 'roaming_pokemon.c', 'unk_0206C660.c', - 'boat_cutscene/boat_cutscene.c', + 'cutscenes/boat_cutscene/boat_cutscene.c', 'unk_0206CCB0.c', 'unk_0206F314.c', 'unk_02070428.c', @@ -839,7 +839,7 @@ pokeplatinum_c = files( 'applications/bag/windows.c', 'applications/bag/sprites.c', 'overlay085/ov85_02241440.c', - 'overlay086/ov86_0223B140.c', + 'cutscenes/hall_of_fame.c', 'applications/pc_hall_of_fame/manager.c', 'applications/pc_hall_of_fame/display.c', 'overlay088/ov88_0223B140.c', @@ -848,8 +848,8 @@ pokeplatinum_c = files( 'overlay090/ov90_021D0D80.c', 'overlay091/ov91_021D0D80.c', 'overlay092/ov92_021D0D80.c', - 'boat_cutscene/canalave_ship.c', - 'boat_cutscene/snowpoint_ship.c', + 'cutscenes/boat_cutscene/canalave_ship.c', + 'cutscenes/boat_cutscene/snowpoint_ship.c', 'overlay094/networking.c', 'overlay094/application.c', 'overlay094/screens/main_menu.c', diff --git a/src/overlay086/ov86_0223B140.c b/src/overlay086/ov86_0223B140.c deleted file mode 100644 index 6a9b7960bb..0000000000 --- a/src/overlay086/ov86_0223B140.c +++ /dev/null @@ -1,1938 +0,0 @@ -#include "overlay086/ov86_0223B140.h" - -#include -#include - -#include "struct_defs/sprite_animation_frame.h" -#include "struct_defs/struct_0203E234.h" -#include "struct_defs/struct_02099F80.h" - -#include "overlay005/struct_ov5_021DE5D0.h" - -#include "bg_window.h" -#include "camera.h" -#include "character_sprite.h" -#include "enums.h" -#include "font.h" -#include "graphics.h" -#include "gx_layers.h" -#include "heap.h" -#include "inlines.h" -#include "math_util.h" -#include "message.h" -#include "narc.h" -#include "overlay_manager.h" -#include "party.h" -#include "play_time.h" -#include "pokemon.h" -#include "pokemon_sprite.h" -#include "render_oam.h" -#include "screen_fade.h" -#include "sound.h" -#include "sound_playback.h" -#include "sprite.h" -#include "sprite_util.h" -#include "strbuf.h" -#include "string_template.h" -#include "sys_task.h" -#include "sys_task_manager.h" -#include "system.h" -#include "text.h" -#include "trainer_info.h" - -typedef struct { - fx32 unk_00; - fx32 unk_04; - fx32 unk_08; - int unk_0C; - BOOL unk_10; -} UnkStruct_ov86_0223D264; - -typedef struct { - int unk_00; - int unk_04; - int unk_08; - UnkStruct_0203E234 *unk_0C; - BgConfig *unk_10; - Window unk_14; - SpriteList *unk_24; - G2dRenderer unk_28; - Sprite *unk_1B4[6]; - Sprite *unk_1CC; - void *unk_1D0; - void *unk_1D4; - SpriteAnimationFrame unk_1D8[6][10]; - int unk_2C8[6]; - int unk_2E0[6]; - u32 unk_2F8[6]; - u8 unk_310[6400]; - Camera *camera; - VecFx32 unk_1C14; - CameraAngle cameraAngle; - SysTask *unk_1C28; - SysTask *unk_1C2C; - SysTask *unk_1C30; - SysTask *unk_1C34[4]; - StringTemplate *unk_1C44; - Strbuf *unk_1C48; - Strbuf *unk_1C4C; - MessageLoader *unk_1C50; - NARC *unk_1C54; -} UnkStruct_ov86_0223B3C8; - -typedef struct { - int unk_00; - int unk_04; - VecFx16 unk_08[4]; - VecFx16 unk_20; - VecFx16 unk_26; - MtxFx44 unk_2C; - BOOL unk_6C; -} UnkStruct_ov86_0223CD94_sub1; - -typedef struct { - BOOL unk_00; - volatile BOOL unk_04; - UnkStruct_ov86_0223CD94_sub1 unk_08[48]; - GXDLInfo unk_1508; - u32 unk_151C[7680]; - u32 unk_8D1C; - int unk_8D20; - MtxFx44 unk_8D24; -} UnkStruct_ov86_0223CD94; - -typedef struct { - void *unk_00; - SysTask **unk_04; -} UnkStruct_ov86_0223BDAC; - -typedef struct { - UnkStruct_ov86_0223BDAC unk_00; - Sprite *unk_08; - VecFx32 unk_0C; - UnkStruct_ov86_0223D264 unk_18; -} UnkStruct_ov86_0223BDE0; - -typedef struct { - UnkStruct_ov86_0223BDAC unk_00; - Sprite *unk_08; - VecFx32 unk_0C; - UnkStruct_ov86_0223D264 unk_18; -} UnkStruct_ov86_0223BEA0; - -typedef struct { - UnkStruct_ov86_0223BDAC unk_00; - UnkStruct_ov86_0223D264 unk_08; -} UnkStruct_ov86_0223BF44; - -typedef struct { - UnkStruct_ov86_0223BDAC unk_00; - UnkStruct_ov86_0223D264 unk_08; - int unk_1C; - int unk_20; - int unk_24; -} UnkStruct_ov86_0223BFAC; - -typedef struct { - UnkStruct_ov86_0223BDAC unk_00; - UnkStruct_ov86_0223D264 unk_08; - UnkStruct_ov86_0223D264 unk_1C; - int unk_30; - int unk_34; -} UnkStruct_ov86_0223C01C; - -typedef struct { - UnkStruct_ov86_0223BDAC unk_00; - UnkStruct_ov86_0223D264 unk_08; - UnkStruct_ov86_0223D264 unk_1C; - int unk_30; - int unk_34; -} UnkStruct_ov86_0223C090; - -typedef struct { - UnkStruct_ov86_0223BDAC unk_00; - Sprite *unk_08; - const SpriteAnimationFrame *unk_0C; - PokemonSpriteTaskAnim unk_10; - NNSG2dImageProxy unk_24[2]; - BOOL unk_6C; - int unk_70; - u32 unk_74; -} UnkStruct_ov86_0223C2CC; - -typedef struct { - UnkStruct_ov86_0223BDAC unk_00; - UnkStruct_ov86_0223B3C8 *unk_08; - BgConfig *unk_0C; - Window *unk_10; - StringTemplate *unk_14; - Strbuf *unk_18; - Strbuf *unk_1C; - MessageLoader *unk_20; - Pokemon *unk_24; - const TrainerInfo *unk_28; - int unk_2C; - int unk_30; - int unk_34; -} UnkStruct_ov86_0223C3E4; - -typedef struct { - UnkStruct_ov86_0223BDAC unk_00; - UnkStruct_ov86_0223B3C8 *unk_08; - BgConfig *unk_0C; - Window *unk_10; - UnkStruct_ov86_0223D264 unk_14; - int unk_28; - int unk_2C; -} UnkStruct_ov86_0223C664; - -typedef struct { - UnkStruct_ov86_0223BDAC unk_00; - Sprite **unk_08; - UnkStruct_ov86_0223B3C8 *unk_0C; - int unk_10; - int unk_14; - int unk_18; - UnkStruct_ov86_0223D264 unk_1C[6]; - VecFx32 unk_94[6]; -} UnkStruct_ov86_0223C840; - -typedef struct { - GXDLInfo unk_00; - u32 unk_14[512]; - u32 unk_814; - SysTask *unk_818[8]; - SysTask *unk_838; - int unk_83C; - UnkStruct_ov86_0223B3C8 *unk_840; -} UnkStruct_ov86_0223C9B0; - -typedef struct { - GXDLInfo *unk_00; - u32 unk_04[512]; - u32 unk_804; - fx32 unk_808; - fx32 unk_80C; - int unk_810; - int unk_814; - fx16 unk_818; - VecFx16 unk_81A; - VecFx16 unk_820; - VecFx16 unk_826; - VecFx16 unk_82C; - UnkStruct_ov86_0223B3C8 *unk_834; -} UnkStruct_ov86_0223CAE4; - -static void inline inline_ov86_0223CB74(UnkStruct_ov86_0223CAE4 *wk); -static BOOL ov86_0223B3C8(UnkStruct_ov86_0223B3C8 *param0); -static BOOL ov86_0223B40C(UnkStruct_ov86_0223B3C8 *param0); -static BOOL ov86_0223B464(UnkStruct_ov86_0223B3C8 *param0); -static BOOL ov86_0223B574(UnkStruct_ov86_0223B3C8 *param0); -static BOOL ov86_0223B684(UnkStruct_ov86_0223B3C8 *param0); -static BOOL ov86_0223B6B4(UnkStruct_ov86_0223B3C8 *param0, int param1); -static void ov86_0223B6CC(SysTask *param0, void *param1); -static SysTask *ov86_0223B744(SysTaskFunc param0, void *param1, int param2); -static void ov86_0223B74C(UnkStruct_ov86_0223B3C8 *param0); -static void ov86_0223B8C4(UnkStruct_ov86_0223B3C8 *param0); -static void ov86_0223B900(UnkStruct_ov86_0223B3C8 *param0); -static void ov86_0223B9A8(UnkStruct_ov86_0223B3C8 *param0); -static void ov86_0223BA34(UnkStruct_ov86_0223B3C8 *param0); -static void ov86_0223BA44(UnkStruct_ov86_0223B3C8 *param0); -static void ov86_0223BAC8(UnkStruct_ov86_0223B3C8 *param0, NNSG2dCellDataBank *param1, NNSG2dAnimBankData *param2, NARC *param3); -static void ov86_0223BD68(UnkStruct_ov86_0223B3C8 *param0); -static void ov86_0223BDE0(UnkStruct_ov86_0223B3C8 *param0, int param1, int param2); -static void ov86_0223BE6C(SysTask *param0, void *param1); -static void ov86_0223BEA0(UnkStruct_ov86_0223B3C8 *param0, int param1); -static void ov86_0223BF10(SysTask *param0, void *param1); -static void ov86_0223BF44(SysTask *param0, void *param1); -static void ov86_0223BFAC(SysTask *param0, void *param1); -static void ov86_0223C01C(SysTask *param0, void *param1); -static void ov86_0223C090(SysTask *param0, void *param1); -static void ov86_0223C104(UnkStruct_ov86_0223B3C8 *param0, int param1, int param2); -static void ov86_0223C158(UnkStruct_ov86_0223B3C8 *param0, int param1, int param2); -static void ov86_0223C1B8(UnkStruct_ov86_0223B3C8 *param0, int param1); -static void ov86_0223C20C(UnkStruct_ov86_0223B3C8 *param0, int param1); -static void ov86_0223C26C(UnkStruct_ov86_0223B3C8 *param0, int param1); -static void ov86_0223C2CC(UnkStruct_ov86_0223B3C8 *param0, int param1, BOOL param2, int param3); -static void ov86_0223C398(SysTask *param0, void *param1); -static void ov86_0223C3E4(UnkStruct_ov86_0223B3C8 *param0, int param1, int param2); -static void ov86_0223C58C(SysTask *param0, void *param1); -static void ov86_0223C664(UnkStruct_ov86_0223B3C8 *param0, int param1); -static void ov86_0223C6B4(SysTask *param0, void *param1); -static void ov86_0223C72C(UnkStruct_ov86_0223B3C8 *param0); -static void ov86_0223C840(UnkStruct_ov86_0223B3C8 *param0, int param1); -static void ov86_0223C914(SysTask *param0, void *param1); -static SysTask *ov86_0223C9B0(UnkStruct_ov86_0223B3C8 *param0); -static void ov86_0223CA10(SysTask *param0, void *param1); -static void ov86_0223CA64(SysTask *param0, void *param1); -static void ov86_0223CAA0(SysTask *param0, fx16 param1, fx32 param2); -static void ov86_0223CB74(SysTask *param0, void *param1); -static void ov86_0223CD00(SysTask *param0); -static void ov86_0223CD34(SysTask *param0); -static BOOL ov86_0223CD80(void); -static SysTask *ov86_0223CD94(UnkStruct_ov86_0223B3C8 *param0); -static void ov86_0223CF44(SysTask *param0); -static void ov86_0223CF5C(SysTask *param0); -static void ov86_0223CF6C(SysTask *param0, void *param1); -static void ov86_0223D220(SysTask *param0); -static void ov86_0223D264(UnkStruct_ov86_0223D264 *param0, fx32 param1, fx32 param2, int param3); -static fx32 ov86_0223D284(UnkStruct_ov86_0223D264 *param0); -static BOOL ov86_0223D2A4(UnkStruct_ov86_0223D264 *param0); -static int ov86_0223D2A8(UnkStruct_ov86_0223B3C8 *param0, Pokemon *param1, const TrainerInfo *param2); -static SysTask *ov86_0223CAE4(UnkStruct_ov86_0223C9B0 *param0, fx16 param1, fx32 param2, int param3); - -int ov86_0223B140(ApplicationManager *appMan, int *param1) -{ - UnkStruct_ov86_0223B3C8 *v0; - - SetVBlankCallback(NULL, NULL); - Heap_Create(HEAP_ID_APPLICATION, HEAP_ID_63, 196608); - - v0 = ApplicationManager_NewData(appMan, sizeof(UnkStruct_ov86_0223B3C8), HEAP_ID_63); - - v0->unk_0C = ApplicationManager_Args(appMan); - v0->unk_1C50 = MessageLoader_Init(MESSAGE_LOADER_BANK_HANDLE, NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_UNK_0351, HEAP_ID_63); - v0->unk_1C48 = Strbuf_Init(500, HEAP_ID_63); - v0->unk_1C4C = Strbuf_Init(500, HEAP_ID_63); - v0->unk_1C44 = StringTemplate_Default(HEAP_ID_63); - v0->unk_1C54 = NARC_ctor(NARC_INDEX_POKETOOL__POKE_EDIT__PL_POKE_DATA, HEAP_ID_63); - - { - int v1, v2; - - v0->unk_04 = 0; - v2 = Party_GetCurrentCount(v0->unk_0C->unk_04); - - for (v1 = 0; v1 < v2; v1++) { - if (Pokemon_GetValue(Party_GetPokemonBySlotIndex(v0->unk_0C->unk_04, v1), MON_DATA_IS_EGG, NULL) == 0) { - v0->unk_2C8[v0->unk_04] = v1; - v0->unk_04++; - } - } - } - - ov86_0223B74C(v0); - ov86_0223B900(v0); - ov86_0223BA44(v0); - - v0->unk_1C30 = NULL; - v0->unk_1C2C = ov86_0223C9B0(v0); - - ov86_0223CAA0(v0->unk_1C2C, -FX16_CONST(0.714f), FX32_CONST(20)); - ov86_0223CAA0(v0->unk_1C2C, -FX16_CONST(0.429f), FX32_CONST(60)); - ov86_0223CAA0(v0->unk_1C2C, -FX16_CONST(0.143f), FX32_CONST(40)); - ov86_0223CAA0(v0->unk_1C2C, FX16_CONST(0.143f), FX32_CONST(140)); - ov86_0223CAA0(v0->unk_1C2C, FX16_CONST(0.429f), FX32_CONST(120)); - ov86_0223CAA0(v0->unk_1C2C, FX16_CONST(0.714f), FX32_CONST(160)); - - v0->unk_1C30 = ov86_0223CD94(v0); - - GX_SetDispSelect(GX_DISP_SELECT_MAIN_SUB); - - v0->unk_00 = 0; - v0->unk_1C28 = ov86_0223B744(ov86_0223B6CC, v0, 6); - - Sound_SetSceneAndPlayBGM(SOUND_SCENE_8, SEQ_BLD_EV_DENDO2, 1); - - return 1; -} - -int ov86_0223B2E4(ApplicationManager *appMan, int *param1) -{ - switch (*param1) { - case 0: { - UnkStruct_ov86_0223B3C8 *v0 = ApplicationManager_Data(appMan); - - SysTask_Done(v0->unk_1C28); - - ov86_0223CF44(v0->unk_1C30); - ov86_0223CD34(v0->unk_1C2C); - ov86_0223BD68(v0); - ov86_0223BA34(v0); - ov86_0223B8C4(v0); - - StringTemplate_Free(v0->unk_1C44); - Strbuf_Free(v0->unk_1C48); - Strbuf_Free(v0->unk_1C4C); - MessageLoader_Free(v0->unk_1C50); - NARC_dtor(v0->unk_1C54); - ApplicationManager_FreeData(appMan); - Heap_Destroy(HEAP_ID_63); - } - (*param1)++; - break; - case 1: - if (ov86_0223CD80()) { - return 1; - } - } - - return 0; -} - -int ov86_0223B394(ApplicationManager *appMan, int *param1) -{ - static BOOL (*const v0[])(UnkStruct_ov86_0223B3C8 *) = { - ov86_0223B3C8, - ov86_0223B464, - ov86_0223B574, - ov86_0223B684, - ov86_0223B40C - }; - - UnkStruct_ov86_0223B3C8 *v1 = ApplicationManager_Data(appMan); - - if ((*param1) < NELEMS(v0)) { - if (v0[(*param1)](v1)) { - v1->unk_00 = 0; - v1->unk_08 = 0; - (*param1)++; - } - - return 0; - } - - return 1; -} - -static BOOL ov86_0223B3C8(UnkStruct_ov86_0223B3C8 *param0) -{ - switch (param0->unk_00) { - case 0: - StartScreenFade(FADE_MAIN_ONLY, FADE_TYPE_BRIGHTNESS_IN, FADE_TYPE_BRIGHTNESS_IN, COLOR_BLACK, 16, 1, HEAP_ID_63); - param0->unk_00++; - break; - case 1: - if (IsScreenFadeDone()) { - return 1; - } - } - - return 0; -} - -static BOOL ov86_0223B40C(UnkStruct_ov86_0223B3C8 *param0) -{ - switch (param0->unk_00) { - case 0: - StartScreenFade(FADE_MAIN_ONLY, FADE_TYPE_BRIGHTNESS_OUT, FADE_TYPE_BRIGHTNESS_OUT, COLOR_BLACK, 2, 1, HEAP_ID_63); - Sound_FadeOutBGM(0, 30); - param0->unk_00++; - break; - case 1: - if (IsScreenFadeDone() && (Sound_IsFadeActive() == FALSE)) { - return 1; - } - } - - return 0; -} - -static BOOL ov86_0223B464(UnkStruct_ov86_0223B3C8 *param0) -{ - static int v0 = 0; - - if (param0->unk_08) { - param0->unk_08--; - return 0; - } - - switch (param0->unk_00) { - case 0: - v0 = 0; - param0->unk_00++; - case 1: - ov86_0223BDE0(param0, v0, 0); - ov86_0223C104(param0, v0, 1); - param0->unk_00++; - break; - case 2: - if (ov86_0223B6B4(param0, 0)) { - param0->unk_08 = 20; - param0->unk_00++; - } - break; - case 3: - ov86_0223C2CC(param0, v0, 1, 0); - ov86_0223C3E4(param0, v0, 1); - param0->unk_00++; - break; - case 4: - if (ov86_0223B6B4(param0, 0) && ov86_0223B6B4(param0, 1)) { - param0->unk_08 = 30; - param0->unk_00++; - } - break; - case 5: - ov86_0223C664(param0, 0); - ov86_0223C158(param0, v0, 1); - param0->unk_00++; - break; - case 6: - if (ov86_0223B6B4(param0, 0)) { - Sprite_SetDrawFlag(param0->unk_1B4[v0], FALSE); - - if (++v0 < param0->unk_04) { - param0->unk_08 = 30; - param0->unk_00 = 1; - } else { - return 1; - } - } - break; - } - - return 0; -} - -static BOOL ov86_0223B574(UnkStruct_ov86_0223B3C8 *param0) -{ - if (param0->unk_08) { - param0->unk_08--; - return 0; - } - - switch (param0->unk_00) { - case 0: - Graphics_LoadTilemapToBgLayer(NARC_INDEX_GRAPHIC__DENDOU_DEMO, 1, param0->unk_10, 3, 0, 0, 1, HEAP_ID_63); - param0->unk_00++; - break; - case 1: - ov86_0223BEA0(param0, 0); - ov86_0223C1B8(param0, 1); - param0->unk_00++; - break; - case 2: - if (ov86_0223B6B4(param0, 0) - && ov86_0223B6B4(param0, 1)) { - param0->unk_08 = 20; - param0->unk_00++; - } - break; - case 3: - ov86_0223C20C(param0, 0); - param0->unk_00++; - break; - case 4: - if (ov86_0223B6B4(param0, 0)) { - ov86_0223C72C(param0); - param0->unk_08 = 20; - param0->unk_00++; - } - break; - case 5: - ov86_0223C840(param0, 0); - param0->unk_00++; - break; - case 6: - if (ov86_0223B6B4(param0, 0)) { - param0->unk_08 = 20; - param0->unk_00++; - } - break; - case 7: - ov86_0223CF5C(param0->unk_1C30); - param0->unk_00++; - break; - case 8: - if (gSystem.pressedKeys & (PAD_BUTTON_A | PAD_BUTTON_B)) { - return 1; - } - break; - } - - return 0; -} - -static BOOL ov86_0223B684(UnkStruct_ov86_0223B3C8 *param0) -{ - switch (param0->unk_00) { - case 0: - ov86_0223C26C(param0, 0); - param0->unk_00++; - break; - case 1: - if (ov86_0223B6B4(param0, 0)) { - return 1; - } - } - - return 0; -} - -static BOOL ov86_0223B6B4(UnkStruct_ov86_0223B3C8 *param0, int param1) -{ - return param0->unk_1C34[param1] == NULL; -} - -static void ov86_0223B6CC(SysTask *param0, void *param1) -{ - UnkStruct_ov86_0223B3C8 *v0 = param1; - - if (G3X_IsGeometryBusy()) { - return; - } - - G3X_Reset(); - NNS_G3dGePushMtx(); - - { - ov86_0223CD00(v0->unk_1C2C); - } - - NNS_G3dGePopMtx(1); - NNS_G3dGePushMtx(); - - { - ov86_0223D220(v0->unk_1C30); - } - - NNS_G3dGePopMtx(1); - G3_SwapBuffers(GX_SORTMODE_MANUAL, GX_BUFFERMODE_Z); - - SpriteList_Update(v0->unk_24); - RenderOam_Transfer(); -} - -static SysTask *ov86_0223B744(SysTaskFunc param0, void *param1, int param2) -{ - return SysTask_ExecuteOnVBlank(param0, param1, param2); -} - -static void ov86_0223B74C(UnkStruct_ov86_0223B3C8 *param0) -{ - NARC *v0; - static const UnkStruct_02099F80 v1 = { - GX_VRAM_BG_128_B, - GX_VRAM_BGEXTPLTT_NONE, - GX_VRAM_SUB_BG_128_C, - GX_VRAM_SUB_BGEXTPLTT_NONE, - GX_VRAM_OBJ_64_E, - GX_VRAM_OBJEXTPLTT_NONE, - GX_VRAM_SUB_OBJ_16_I, - GX_VRAM_SUB_OBJEXTPLTT_NONE, - GX_VRAM_TEX_0_A, - GX_VRAM_TEXPLTT_01_FG - }; - static const GraphicsModes v2 = { - GX_DISPMODE_GRAPHICS, - GX_BGMODE_0, - GX_BGMODE_0, - GX_BG0_AS_3D - }; - static const BgTemplate v3 = { - .x = 0, - .y = 0, - .bufferSize = 0x1000, - .baseTile = 0, - .screenSize = BG_SCREEN_SIZE_256x512, - .colorMode = GX_BG_COLORMODE_16, - .screenBase = GX_BG_SCRBASE_0xe000, - .charBase = GX_BG_CHARBASE_0x10000, - .bgExtPltt = GX_BG_EXTPLTT_01, - .priority = 0, - .areaOver = 0, - .mosaic = FALSE, - }; - static const BgTemplate v4 = { - .x = 0, - .y = 0, - .bufferSize = 0, - .baseTile = 0, - .screenSize = BG_SCREEN_SIZE_256x256, - .colorMode = GX_BG_COLORMODE_16, - .screenBase = GX_BG_SCRBASE_0xf000, - .charBase = GX_BG_CHARBASE_0x18000, - .bgExtPltt = GX_BG_EXTPLTT_01, - .priority = 1, - .areaOver = 0, - .mosaic = FALSE, - }; - static const BgTemplate v5 = { - .x = 0, - .y = 0, - .bufferSize = 0, - .baseTile = 0, - .screenSize = BG_SCREEN_SIZE_256x256, - .colorMode = GX_BG_COLORMODE_16, - .screenBase = GX_BG_SCRBASE_0xf800, - .charBase = GX_BG_CHARBASE_0x18000, - .bgExtPltt = GX_BG_EXTPLTT_01, - .priority = 3, - .areaOver = 0, - .mosaic = FALSE, - }; - - param0->unk_10 = BgConfig_New(HEAP_ID_63); - - GXLayers_SetBanks(&v1); - GX_SetDispSelect(GX_DISP_SELECT_SUB_MAIN); - - SetAllGraphicsModes(&v2); - Bg_InitFromTemplate(param0->unk_10, BG_LAYER_MAIN_1, &v3, 0); - Bg_InitFromTemplate(param0->unk_10, BG_LAYER_MAIN_2, &v4, 0); - Bg_InitFromTemplate(param0->unk_10, BG_LAYER_MAIN_3, &v5, 0); - Bg_FillTilesRange(param0->unk_10, 1, 0x0, 1, 0); - Bg_FillTilemapRect(param0->unk_10, 1, 0x0, 0, 0, 32, 32, 0); - Window_Add(param0->unk_10, &(param0->unk_14), 1, 0, 0, 32, 24, 1, 1); - Window_FillTilemap(&(param0->unk_14), 0); - Window_LoadTiles(&(param0->unk_14)); - Window_PutToTilemap(¶m0->unk_14); - - v0 = NARC_ctor(NARC_INDEX_GRAPHIC__DENDOU_DEMO, HEAP_ID_63); - - Graphics_LoadTilesToBgLayerFromOpenNARC(v0, 3, param0->unk_10, 3, 0, 0, 1, HEAP_ID_63); - Graphics_LoadTilemapToBgLayerFromOpenNARC(v0, 0, param0->unk_10, 3, 0, 0, 1, HEAP_ID_63); - Graphics_LoadPaletteFromOpenNARC(v0, 4, 0, 0, 0x60, HEAP_ID_63); - Graphics_LoadTilemapToBgLayerFromOpenNARC(v0, 2, param0->unk_10, 2, 0, 0, 1, HEAP_ID_63); - Bg_CopyTilemapBufferToVRAM(param0->unk_10, 1); - - G2_SetWnd0Position(0, 0, 0, 0); - G2_SetWnd0InsidePlane(GX_WND_PLANEMASK_ALL ^ GX_WND_PLANEMASK_BG2, 1); - G2_SetWndOutsidePlane(GX_WND_PLANEMASK_ALL, 1); - GX_SetVisibleWnd(GX_WNDMASK_W0); - - NARC_dtor(v0); -} - -static void ov86_0223B8C4(UnkStruct_ov86_0223B3C8 *param0) -{ - GX_SetVisibleWnd(GX_WNDMASK_NONE); - - Window_Remove(&(param0->unk_14)); - Bg_FreeTilemapBuffer(param0->unk_10, BG_LAYER_MAIN_1); - Bg_FreeTilemapBuffer(param0->unk_10, BG_LAYER_MAIN_2); - Bg_FreeTilemapBuffer(param0->unk_10, BG_LAYER_MAIN_3); - Heap_Free(param0->unk_10); -} - -static void ov86_0223B900(UnkStruct_ov86_0223B3C8 *param0) -{ - NNS_G3dInit(); - - G3X_InitMtxStack(); - G3X_SetShading(GX_SHADING_TOON); - G3X_AntiAlias(1); - G3X_AlphaTest(0, 0); - G3X_AlphaBlend(1); - G3X_SetClearColor(GX_RGB(0, 0, 0), 0, 0x7fff, 63, 0); - - G3_SwapBuffers(GX_SORTMODE_AUTO, GX_BUFFERMODE_W); - G3_ViewPort(0, 0, 255, 191); - - NNS_GfdInitFrmTexVramManager(1, 1); - NNS_GfdInitFrmPlttVramManager(0x4000, 1); - - GXLayers_EngineAToggleLayers(GX_PLANEMASK_BG0, 1); - - G2_SetBG0Priority(2); - G2_SetBlendAlpha(GX_BLEND_PLANEMASK_NONE, GX_BLEND_PLANEMASK_BG3 | GX_BLEND_PLANEMASK_OBJ, 0, 0); - - ov86_0223B9A8(param0); -} - -static void ov86_0223B9A8(UnkStruct_ov86_0223B3C8 *param0) -{ - VecFx32 v0; - - param0->camera = Camera_Alloc(63); - param0->unk_1C14.x = 0; - param0->unk_1C14.y = 0; - param0->unk_1C14.z = 0; - param0->cameraAngle.x = ((0 * 0xffff) / 360); - param0->cameraAngle.y = ((0 * 0xffff) / 360); - param0->cameraAngle.z = ((0 * 0xffff) / 360); - - Camera_InitWithTarget(&(param0->unk_1C14), 20480, &(param0->cameraAngle), 4004, 0, 1, param0->camera); - - v0.x = 0; - v0.y = FX32_ONE; - v0.z = 0; - - Camera_SetUp(&v0, param0->camera); - Camera_SetAsActive(param0->camera); - Camera_SetClipping(1 << FX32_SHIFT, 500 << FX32_SHIFT, param0->camera); -} - -static void ov86_0223BA34(UnkStruct_ov86_0223B3C8 *param0) -{ - Camera_Delete(param0->camera); -} - -static void ov86_0223BA44(UnkStruct_ov86_0223B3C8 *param0) -{ - NNSG2dCellDataBank *v0; - NNSG2dAnimBankData *v1; - NARC *v2 = NARC_ctor(NARC_INDEX_BATTLE__GRAPHIC__PL_BATT_OBJ, HEAP_ID_63); - - NNS_G2dInitOamManagerModule(); - RenderOam_Init(0, 128, 0, 32, 0, 128, 0, 32, 63); - - param0->unk_24 = SpriteList_InitRendering(64, ¶m0->unk_28, HEAP_ID_63); - param0->unk_1D0 = Graphics_GetCellBankFromOpenNARC(v2, 77, 0, &v0, HEAP_ID_63); - param0->unk_1D4 = Graphics_GetAnimBankFromOpenNARC(v2, 78, 0, &v1, HEAP_ID_63); - - ov86_0223BAC8(param0, v0, v1, v2); - - NARC_dtor(v2); - GXLayers_EngineAToggleLayers(GX_PLANEMASK_OBJ, 1); -} - -static void ov86_0223BAC8(UnkStruct_ov86_0223B3C8 *param0, NNSG2dCellDataBank *param1, NNSG2dAnimBankData *param2, NARC *param3) -{ - static const TileRegion v0[2] = { - FRAME_0_REGION, - FRAME_1_REGION - }; - PokemonSpriteTemplate v1; - SpriteResourcesHeader v2; - SpriteListTemplate v3; - UnkStruct_ov5_021DE5D0 v4; - NNSG2dImageProxy v5; - NNSG2dImagePaletteProxy v6; - NNSG2dCharacterData *v7; - NNSG2dPaletteData *v8; - void *v9; - void *v10; - const Pokemon *v11; - int v12, v13; - - v2.charData = NULL; - v2.multiCellBank = NULL; - v2.multiCellAnimBank = NULL; - v2.isVRamTransfer = 0; - v2.cellBank = param1; - v2.cellAnimBank = param2; - v2.priority = 3; - v2.imageProxy = &v5; - v2.paletteProxy = &v6; - - v3.list = param0->unk_24; - v3.resourceData = &v2; - - VEC_Set(&(v3.position), 0, 0, 0); - - v3.vramType = NNS_G2D_VRAM_TYPE_2DMAIN; - v3.heapID = HEAP_ID_63; - - v9 = Graphics_GetCharDataFromOpenNARC(param3, 76, 0, &v7, HEAP_ID_63); - v10 = Graphics_GetPlttDataFromOpenNARC(param3, 75, &v8, HEAP_ID_63); - - for (v12 = 0; v12 < param0->unk_04; v12++) { - NNS_G2dInitImageProxy(&v5); - NNS_G2dInitImagePaletteProxy(&v6); - NNS_G2dLoadImage1DMapping(v7, v12 * 2 * 3200, NNS_G2D_VRAM_TYPE_2DMAIN, &v5); - NNS_G2dLoadPalette(v8, v12 * 0x20, NNS_G2D_VRAM_TYPE_2DMAIN, &v6); - - v3.priority = 1 + v12; - param0->unk_1B4[v12] = SpriteList_Add(&v3); - - Sprite_SetDrawFlag(param0->unk_1B4[v12], FALSE); - v11 = Party_GetPokemonBySlotIndex(param0->unk_0C->unk_04, param0->unk_2C8[v12]); - Pokemon_BuildSpriteTemplate(&v1, (Pokemon *)v11, 2); - - param0->unk_2E0[v12] = Pokemon_GetValue((Pokemon *)v11, MON_DATA_SPECIES, NULL); - param0->unk_2F8[v12] = Pokemon_GetValue((Pokemon *)v11, MON_DATA_FORM, NULL); - - CharacterSprite_LoadPokemonSpriteRegion(v1.narcID, v1.character, HEAP_ID_63, &v0[0], param0->unk_310, Pokemon_GetValue((Pokemon *)v11, MON_DATA_PERSONALITY, NULL), TRUE, FACE_FRONT, param0->unk_2E0[v12]); - - DC_FlushRange(param0->unk_310, 3200); - GX_LoadOBJ(param0->unk_310, v12 * 2 * 3200, 3200); - - CharacterSprite_LoadPokemonSpriteRegion(v1.narcID, v1.character, HEAP_ID_63, &v0[1], param0->unk_310, Pokemon_GetValue((Pokemon *)v11, MON_DATA_PERSONALITY, NULL), TRUE, FACE_FRONT, param0->unk_2E0[v12]); - - DC_FlushRange(param0->unk_310, 3200); - GX_LoadOBJ(param0->unk_310, v12 * 2 * 3200 + 3200, 3200); - - Graphics_LoadPalette(v1.narcID, v1.palette, 1, v12 * 0x20, 0x20, HEAP_ID_63); - PokeSprite_LoadAnimationFrames(param0->unk_1C54, ¶m0->unk_1D8[v12][0], param0->unk_2E0[v12], 1); - } - - NNS_G2dInitImageProxy(&v5); - NNS_G2dInitImagePaletteProxy(&v6); - NNS_G2dLoadImage1DMapping(v7, 38400, NNS_G2D_VRAM_TYPE_2DMAIN, &v5); - NNS_G2dLoadPalette(v8, 192, NNS_G2D_VRAM_TYPE_2DMAIN, &v6); - - sub_02076AAC((TrainerInfo_Gender(param0->unk_0C->unk_00) == 1) ? 1 : 0, 2, &v4); - CharacterSprite_LoadSpriteRegion(v4.narcID, v4.unk_14, HEAP_ID_63, &v0[0], param0->unk_310); - - DC_FlushRange(param0->unk_310, 3200); - GX_LoadOBJ(param0->unk_310, 38400, 3200); - - Graphics_LoadPalette(v4.narcID, v4.unk_08, 1, 192, 0x20, HEAP_ID_63); - - v3.priority = 0; - param0->unk_1CC = SpriteList_Add(&v3); - - Sprite_SetDrawFlag(param0->unk_1CC, FALSE); - Heap_Free(v10); - Heap_Free(v9); -} - -static void ov86_0223BD68(UnkStruct_ov86_0223B3C8 *param0) -{ - int v0; - - for (v0 = 0; v0 < param0->unk_04; v0++) { - Sprite_Delete(param0->unk_1B4[v0]); - } - - Heap_Free(param0->unk_1D4); - Heap_Free(param0->unk_1D0); - SpriteList_Delete(param0->unk_24); - RenderOam_Free(); -} - -static void ov86_0223BDAC(SysTask *param0, void *param1) -{ - UnkStruct_ov86_0223BDAC *v0 = param1; - - *(v0->unk_04) = NULL; - - Heap_Free(v0->unk_00); - SysTask_Done(param0); -} - -static void ov86_0223BDC4(UnkStruct_ov86_0223BDAC *param0, void *param1, SysTask **param2) -{ - param0->unk_00 = param1; - param0->unk_04 = param2; -} - -static void ov86_0223BDCC(UnkStruct_ov86_0223BDAC *param0) -{ - SysTask_ExecuteAfterVBlank(ov86_0223BDAC, param0, 0); -} - -static void ov86_0223BDE0(UnkStruct_ov86_0223B3C8 *param0, int param1, int param2) -{ - static const struct { - fx32 unk_00; - fx32 unk_04; - } v0[] = { - { 786432, 294912 }, - { 262144, 753664 } - }; - UnkStruct_ov86_0223BDE0 *v1; - int v2; - - v1 = Heap_Alloc(HEAP_ID_63, sizeof(UnkStruct_ov86_0223BDE0)); - v2 = param1 & 1; - - ov86_0223BDC4(&v1->unk_00, v1, &(param0->unk_1C34[param2])); - v1->unk_08 = param0->unk_1B4[param1]; - ov86_0223D264(&v1->unk_18, v0[v2].unk_00, v0[v2].unk_04, 28); - - VEC_Set(&v1->unk_0C, v0[v2].unk_00, 393216, 0); - - Sprite_SetPosition(v1->unk_08, &v1->unk_0C); - Sprite_SetDrawFlag(v1->unk_08, TRUE); - - param0->unk_1C34[param2] = ov86_0223B744(ov86_0223BE6C, v1, 0); -} - -static void ov86_0223BE6C(SysTask *param0, void *param1) -{ - UnkStruct_ov86_0223BDE0 *v0 = param1; - - v0->unk_0C.x = ov86_0223D284(&v0->unk_18); - Sprite_SetPosition(v0->unk_08, &v0->unk_0C); - - if (ov86_0223D2A4(&v0->unk_18)) { - ov86_0223BDCC(&v0->unk_00); - SysTask_Done(param0); - } -} - -static void ov86_0223BEA0(UnkStruct_ov86_0223B3C8 *param0, int param1) -{ - UnkStruct_ov86_0223BEA0 *v0 = Heap_Alloc(HEAP_ID_63, sizeof(UnkStruct_ov86_0223BEA0)); - ov86_0223BDC4(&v0->unk_00, v0, &(param0->unk_1C34[param1])); - - v0->unk_08 = param0->unk_1CC; - ov86_0223D264(&v0->unk_18, FX32_CONST(232), FX32_CONST(104), 28); - - VEC_Set(&v0->unk_0C, FX32_CONST(128), FX32_CONST(232), 0); - - Sprite_SetPosition(v0->unk_08, &v0->unk_0C); - Sprite_SetDrawFlag(v0->unk_08, TRUE); - - param0->unk_1C34[param1] = ov86_0223B744(ov86_0223BF10, v0, 0); -} - -static void ov86_0223BF10(SysTask *param0, void *param1) -{ - UnkStruct_ov86_0223BEA0 *v0 = param1; - - v0->unk_0C.y = ov86_0223D284(&v0->unk_18); - Sprite_SetPosition(v0->unk_08, &v0->unk_0C); - - if (ov86_0223D2A4(&v0->unk_18)) { - ov86_0223BDCC(&v0->unk_00); - SysTask_Done(param0); - } -} - -static void ov86_0223BF44(SysTask *param0, void *param1) -{ - UnkStruct_ov86_0223BF44 *v0 = param1; - int v1 = (ov86_0223D284(&(v0->unk_08)) >> FX32_SHIFT); - int v2 = v1 + 96; - - if (v1 < 0) { - v1 = 0; - } - - if (v2 < 0) { - v2 = 0; - } - - if (v1 > 255) { - v1 = v2 = 0; - } - - if (v2 > 255) { - v2 = 255; - } - - G2_SetWnd0Position(v1, 32, v2, 32 + 128); - - if (ov86_0223D2A4(&(v0->unk_08))) { - ov86_0223BDCC(&v0->unk_00); - SysTask_Done(param0); - } -} - -static void ov86_0223BFAC(SysTask *param0, void *param1) -{ - UnkStruct_ov86_0223BFAC *v0 = param1; - int v1 = (ov86_0223D284(&(v0->unk_08)) >> FX32_SHIFT); - int v2 = v1 + v0->unk_24; - - if (v1 < 0) { - v1 = 0; - } - - if (v2 < 0) { - v2 = 0; - } - - if (v1 > 191) { - v1 = v2 = 0; - } - - if (v2 > 191) { - v2 = 191; - } - - G2_SetWnd0Position(v0->unk_1C, v1, v0->unk_20, v2); - - if (ov86_0223D2A4(&(v0->unk_08))) { - ov86_0223BDCC(&v0->unk_00); - SysTask_Done(param0); - } -} - -static void ov86_0223C01C(SysTask *param0, void *param1) -{ - UnkStruct_ov86_0223C01C *v0 = param1; - int v1 = ov86_0223D284(&v0->unk_08) >> FX32_SHIFT; - int v2 = ov86_0223D284(&v0->unk_1C) >> FX32_SHIFT; - - if (v1 < 0) { - v1 = 0; - } - - if (v2 < 0) { - v2 = 0; - } - - if (v1 > 255) { - v1 = v2 = 0; - } - - if (v2 > 255) { - v2 = 255; - } - - G2_SetWnd0Position(v1, v0->unk_30, v2, v0->unk_34); - - if (ov86_0223D2A4(&(v0->unk_08))) { - ov86_0223BDCC(&v0->unk_00); - SysTask_Done(param0); - } -} - -static void ov86_0223C090(SysTask *param0, void *param1) -{ - UnkStruct_ov86_0223C090 *v0 = param1; - int v1 = ov86_0223D284(&v0->unk_08) >> FX32_SHIFT; - int v2 = ov86_0223D284(&v0->unk_1C) >> FX32_SHIFT; - - if (v1 < 0) { - v1 = 0; - } - - if (v2 < 0) { - v2 = 0; - } - - if (v1 > 191) { - v1 = v2 = 0; - } - - if (v2 > 191) { - v2 = 191; - } - - G2_SetWnd0Position(v0->unk_30, v1, v0->unk_34, v2); - - if (ov86_0223D2A4(&(v0->unk_08))) { - ov86_0223BDCC(&v0->unk_00); - SysTask_Done(param0); - } -} - -static void ov86_0223C104(UnkStruct_ov86_0223B3C8 *param0, int param1, int param2) -{ - static const struct { - fx32 unk_00; - fx32 unk_04; - } v0[] = { - { FX32_CONST(-96), FX32_CONST(24) }, - { FX32_CONST(352), FX32_CONST(136) } - }; - UnkStruct_ov86_0223BF44 *v1; - int v2 = param1 & 1; - v1 = Heap_Alloc(HEAP_ID_63, sizeof(UnkStruct_ov86_0223BF44)); - - ov86_0223BDC4(&v1->unk_00, v1, &(param0->unk_1C34[param2])); - ov86_0223D264(&v1->unk_08, v0[v2].unk_00, v0[v2].unk_04, 28); - - param0->unk_1C34[param2] = ov86_0223B744(ov86_0223BF44, v1, 1); -} - -static void ov86_0223C158(UnkStruct_ov86_0223B3C8 *param0, int param1, int param2) -{ - static const int v0[] = { - 24, - 136, - }; - UnkStruct_ov86_0223BFAC *v1; - int v2 = param1 & 1; - v1 = Heap_Alloc(HEAP_ID_63, sizeof(UnkStruct_ov86_0223BFAC)); - - ov86_0223BDC4(&v1->unk_00, v1, &(param0->unk_1C34[param2])); - ov86_0223D264(&v1->unk_08, FX32_CONST(32), FX32_CONST(-160), 28); - - v1->unk_1C = v0[v2]; - v1->unk_20 = v1->unk_1C + 96; - v1->unk_24 = 128; - - param0->unk_1C34[param2] = ov86_0223B744(ov86_0223BFAC, v1, 1); -} - -static void ov86_0223C1B8(UnkStruct_ov86_0223B3C8 *param0, int param1) -{ - UnkStruct_ov86_0223BFAC *v0 = Heap_Alloc(HEAP_ID_63, sizeof(UnkStruct_ov86_0223BFAC)); - - ov86_0223BDC4(&v0->unk_00, v0, &(param0->unk_1C34[param1])); - ov86_0223D264(&v0->unk_08, FX32_CONST(-144), FX32_CONST(24), 28); - - v0->unk_1C = 88; - v0->unk_20 = 168; - v0->unk_24 = 144; - - param0->unk_1C34[param1] = ov86_0223B744(ov86_0223BFAC, v0, 1); -} - -static void ov86_0223C20C(UnkStruct_ov86_0223B3C8 *param0, int param1) -{ - UnkStruct_ov86_0223C01C *v0 = Heap_Alloc(HEAP_ID_63, sizeof(UnkStruct_ov86_0223C01C)); - - ov86_0223BDC4(&v0->unk_00, v0, &(param0->unk_1C34[param1])); - ov86_0223D264(&v0->unk_08, FX32_CONST(88), 0, 12); - ov86_0223D264(&v0->unk_1C, FX32_CONST(168), FX32_CONST(255), 12); - - v0->unk_30 = 24; - v0->unk_34 = v0->unk_30 + 144; - - param0->unk_1C34[param1] = ov86_0223B744(ov86_0223C01C, v0, 1); -} - -static void ov86_0223C26C(UnkStruct_ov86_0223B3C8 *param0, int param1) -{ - UnkStruct_ov86_0223C090 *v0 = Heap_Alloc(HEAP_ID_63, sizeof(UnkStruct_ov86_0223C090)); - - ov86_0223BDC4(&v0->unk_00, v0, &(param0->unk_1C34[param1])); - ov86_0223D264(&v0->unk_08, FX32_CONST(24), FX32_CONST(96), 24); - ov86_0223D264(&v0->unk_1C, FX32_CONST(24 + 144), FX32_CONST(96), 24); - - v0->unk_30 = 0; - v0->unk_34 = 255; - - param0->unk_1C34[param1] = ov86_0223B744(ov86_0223C090, v0, 1); -} - -static void ov86_0223C2CC(UnkStruct_ov86_0223B3C8 *param0, int param1, BOOL param2, int param3) -{ - UnkStruct_ov86_0223C2CC *v0; - int v1; - - v0 = Heap_Alloc(HEAP_ID_63, sizeof(UnkStruct_ov86_0223C2CC)); - ov86_0223BDC4(&v0->unk_00, v0, &(param0->unk_1C34[param3])); - - v0->unk_08 = param0->unk_1B4[param1]; - v0->unk_0C = ¶m0->unk_1D8[param1][0]; - - PokemonSpriteTaskAnim_Init(&v0->unk_10, v0->unk_0C); - - v0->unk_6C = param2; - v0->unk_70 = param0->unk_2E0[param1]; - v0->unk_74 = param0->unk_2F8[param1]; - v0->unk_24[0] = *Sprite_GetImageProxy(v0->unk_08); - v0->unk_24[1] = v0->unk_24[0]; - - NNS_G2dInitImageProxy(&v0->unk_24[1]); - NNS_G2dSetImageLocation(&(v0->unk_24[1]), NNS_G2D_VRAM_TYPE_2DMAIN, param1 * 2 * 3200 + 3200); - - param0->unk_1C34[param3] = SysTask_Start(ov86_0223C398, v0, 0); -} - -static void ov86_0223C398(SysTask *param0, void *param1) -{ - UnkStruct_ov86_0223C2CC *v0 = param1; - int v1; - - if (v0->unk_6C) { - Sound_PlayPokemonCry(v0->unk_70, v0->unk_74); - v0->unk_6C = 0; - } - - v1 = PokemonSpriteTaskAnim_Tick(&v0->unk_10); - - if (v1 >= 0) { - Sprite_SetImageProxy(v0->unk_08, &v0->unk_24[v1]); - } else { - ov86_0223BDCC(&v0->unk_00); - SysTask_Done(param0); - } -} - -static void ov86_0223C3E4(UnkStruct_ov86_0223B3C8 *param0, int param1, int param2) -{ - UnkStruct_ov86_0223C3E4 *v0; - int v1; - - v0 = Heap_Alloc(HEAP_ID_63, sizeof(UnkStruct_ov86_0223C3E4)); - ov86_0223BDC4(&v0->unk_00, v0, &(param0->unk_1C34[param2])); - - v0->unk_08 = param0; - v0->unk_0C = param0->unk_10; - v0->unk_10 = &(param0->unk_14); - v0->unk_14 = param0->unk_1C44; - v0->unk_18 = param0->unk_1C48; - v0->unk_1C = param0->unk_1C4C; - v0->unk_20 = param0->unk_1C50; - v0->unk_2C = (param1 & 1) ? 0 : 120; - v0->unk_24 = Party_GetPokemonBySlotIndex(param0->unk_0C->unk_04, param0->unk_2C8[param1]); - v0->unk_28 = param0->unk_0C->unk_00; - v0->unk_30 = 0; - v0->unk_34 = 0; - - param0->unk_1C34[param2] = SysTask_Start(ov86_0223C58C, v0, 0); -} - -static void ov86_0223C47C(UnkStruct_ov86_0223C3E4 *param0, int param1) -{ - int v0, v1, v2; - - v1 = Strbuf_NumLines(param0->unk_1C); - - for (v0 = 0; v0 < v1; v0++) { - Strbuf_CopyLineNum(param0->unk_18, param0->unk_1C, v0); - v2 = (136 - Font_CalcStrbufWidth(FONT_SYSTEM, param0->unk_18, 0)) / 2; - Text_AddPrinterWithParamsAndColor(param0->unk_10, FONT_SYSTEM, param0->unk_18, param0->unk_2C + v2, param1 + v0 * 16, TEXT_SPEED_NO_TRANSFER, TEXT_COLOR(1, 2, 0), NULL); - } -} - -static void ov86_0223C4DC(UnkStruct_ov86_0223C3E4 *param0) -{ - StringTemplate_SetSpeciesName(param0->unk_14, 0, Pokemon_GetBoxPokemon(param0->unk_24)); - StringTemplate_SetNumber(param0->unk_14, 1, Pokemon_GetLevel(param0->unk_24), 3, 0, 1); - - switch (Pokemon_GetGender(param0->unk_24)) { - case 0: - MessageLoader_GetStrbuf(param0->unk_20, 1, param0->unk_18); - break; - case 1: - MessageLoader_GetStrbuf(param0->unk_20, 2, param0->unk_18); - break; - case 2: - default: - MessageLoader_GetStrbuf(param0->unk_20, 3, param0->unk_18); - break; - } - - StringTemplate_Format(param0->unk_14, param0->unk_1C, param0->unk_18); -} - -static void ov86_0223C54C(UnkStruct_ov86_0223C3E4 *param0) -{ - int v0 = ov86_0223D2A8(param0->unk_08, param0->unk_24, param0->unk_28); - - switch (v0) { - case 0: - case 1: - StringTemplate_SetLocationName(param0->unk_14, 0, Pokemon_GetValue(param0->unk_24, MON_DATA_HATCH_LOCATION, NULL)); - break; - } - - MessageLoader_GetStrbuf(param0->unk_20, 5 + v0, param0->unk_18); - StringTemplate_Format(param0->unk_14, param0->unk_1C, param0->unk_18); -} - -static void ov86_0223C58C(SysTask *param0, void *param1) -{ - UnkStruct_ov86_0223C3E4 *v0 = param1; - - if (v0->unk_30) { - v0->unk_30--; - return; - } - - switch (v0->unk_34) { - case 0: - MessageLoader_GetStrbuf(v0->unk_20, 0, v0->unk_1C); - ov86_0223C47C(v0, 16); - Window_LoadTiles(v0->unk_10); - v0->unk_30 = 20; - v0->unk_34++; - break; - case 1: - Pokemon_GetValue(v0->unk_24, MON_DATA_NICKNAME_STRBUF, v0->unk_1C); - ov86_0223C47C(v0, 48); - ov86_0223C4DC(v0); - ov86_0223C47C(v0, 64); - Window_LoadTiles(v0->unk_10); - v0->unk_30 = 20; - v0->unk_34++; - break; - case 2: - StringTemplate_SetOTName(v0->unk_14, 0, Pokemon_GetBoxPokemon(v0->unk_24)); - MessageLoader_GetStrbuf(v0->unk_20, 4, v0->unk_18); - StringTemplate_Format(v0->unk_14, v0->unk_1C, v0->unk_18); - ov86_0223C47C(v0, 96); - ov86_0223C54C(v0); - ov86_0223C47C(v0, 112); - Window_LoadTiles(v0->unk_10); - v0->unk_34++; - break; - case 3: - ov86_0223BDCC(&v0->unk_00); - SysTask_Done(param0); - break; - } -} - -static void ov86_0223C664(UnkStruct_ov86_0223B3C8 *param0, int param1) -{ - UnkStruct_ov86_0223C664 *v0; - int v1; - - v0 = Heap_Alloc(HEAP_ID_63, sizeof(UnkStruct_ov86_0223C664)); - - ov86_0223BDC4(&v0->unk_00, v0, &(param0->unk_1C34[param1])); - - v0->unk_0C = param0->unk_10; - v0->unk_10 = &(param0->unk_14); - v0->unk_2C = 1; - v0->unk_28 = 0; - - ov86_0223D264(&(v0->unk_14), FX32_CONST(0), FX32_CONST(256), 28); - - param0->unk_1C34[param1] = ov86_0223B744(ov86_0223C6B4, v0, 0); -} - -static void ov86_0223C6B4(SysTask *param0, void *param1) -{ - UnkStruct_ov86_0223C664 *v0 = param1; - - switch (v0->unk_28) { - case 0: { - int v1 = ov86_0223D284(&v0->unk_14) >> FX32_SHIFT; - - Bg_SetOffset(v0->unk_0C, v0->unk_2C, 3, v1); - - if (ov86_0223D2A4(&v0->unk_14)) { - v0->unk_28++; - } - } break; - case 1: - Window_FillTilemap(v0->unk_10, 0); - Window_LoadTiles(v0->unk_10); - v0->unk_28++; - break; - case 2: - Bg_SetOffset(v0->unk_0C, v0->unk_2C, 3, 0); - ov86_0223BDCC(&v0->unk_00); - SysTask_Done(param0); - break; - } -} - -static void ov86_0223C72C(UnkStruct_ov86_0223B3C8 *param0) -{ - int v0; - - MessageLoader_GetStrbuf(param0->unk_1C50, 12, param0->unk_1C48); - - v0 = (256 - Font_CalcStrbufWidth(FONT_SYSTEM, param0->unk_1C48, 0)) / 2; - Text_AddPrinterWithParamsAndColor(¶m0->unk_14, FONT_SYSTEM, param0->unk_1C48, v0, 4, TEXT_SPEED_NO_TRANSFER, TEXT_COLOR(1, 2, 0), NULL); - StringTemplate_SetPlayerName(param0->unk_1C44, 0, param0->unk_0C->unk_00); - - StringTemplate_SetNumber(param0->unk_1C44, 1, TrainerInfo_ID_LowHalf(param0->unk_0C->unk_00), 5, 2, 1); - StringTemplate_SetNumber(param0->unk_1C44, 2, PlayTime_GetHours(param0->unk_0C->playTime), 3, 0, 1); - StringTemplate_SetNumber(param0->unk_1C44, 3, PlayTime_GetMinutes(param0->unk_0C->playTime), 2, 2, 1); - MessageLoader_GetStrbuf(param0->unk_1C50, 13, param0->unk_1C4C); - StringTemplate_Format(param0->unk_1C44, param0->unk_1C48, param0->unk_1C4C); - - v0 = (256 - Font_CalcStrbufWidth(FONT_SYSTEM, param0->unk_1C48, 0)) / 2; - Text_AddPrinterWithParamsAndColor(¶m0->unk_14, FONT_SYSTEM, param0->unk_1C48, v0, 172, TEXT_SPEED_NO_TRANSFER, TEXT_COLOR(1, 2, 0), NULL); - Window_LoadTiles(¶m0->unk_14); -} - -static void ov86_0223C840(UnkStruct_ov86_0223B3C8 *param0, int param1) -{ - static const VecFx32 v0[] = { - { FX32_CONST(-40), FX32_CONST(104 - 8), 0 }, - { FX32_CONST(296), FX32_CONST(104 - 8), 0 }, - { FX32_CONST(-40), FX32_CONST(104 - 16), 0 }, - { FX32_CONST(296), FX32_CONST(104 - 16), 0 }, - { FX32_CONST(-40), FX32_CONST(104 - 24), 0 }, - { FX32_CONST(296), FX32_CONST(104 - 24), 0 } - }; - static const fx32 v1[] = { - FX32_CONST(128 + 32), - FX32_CONST(128 - 32), - FX32_CONST(128 + 64), - FX32_CONST(128 - 64), - FX32_CONST(128 + 96), - FX32_CONST(128 - 96) - }; - UnkStruct_ov86_0223C840 *v2; - int v3; - - v2 = Heap_Alloc(HEAP_ID_63, sizeof(UnkStruct_ov86_0223C840)); - - ov86_0223BDC4(&v2->unk_00, v2, &(param0->unk_1C34[param1])); - - v2->unk_0C = param0; - v2->unk_08 = param0->unk_1B4; - v2->unk_10 = 0; - v2->unk_18 = 0; - v2->unk_14 = param0->unk_04; - - for (v3 = 0; v3 < v2->unk_14; v3++) { - v2->unk_94[v3] = v0[v3]; - Sprite_SetPosition(v2->unk_08[v3], &v0[v3]); - Sprite_SetDrawFlag(v2->unk_08[v3], TRUE); - } - - for (v3 = 0; v3 < 6; v3++) { - ov86_0223D264(&v2->unk_1C[v3], v0[v3].x, v1[v3], 8); - } - - param0->unk_1C34[param1] = SysTask_Start(ov86_0223C914, v2, 0); -} - -static void ov86_0223C914(SysTask *param0, void *param1) -{ - UnkStruct_ov86_0223C840 *v0 = param1; - int v1; - - for (v1 = 0; v1 < v0->unk_10; v1++) { - v0->unk_94[v1].x = ov86_0223D284(&v0->unk_1C[v1]); - - if (v1 < v0->unk_14) { - Sprite_SetPosition(v0->unk_08[v1], &(v0->unk_94[v1])); - } - } - - if (v0->unk_18) { - v0->unk_18--; - } else { - if (v0->unk_10 < 6) { - v0->unk_18 = 2 * 2; - v0->unk_10++; - } else { - if (ov86_0223D2A4(&v0->unk_1C[v0->unk_14 - 1])) { - ov86_0223BDCC(&v0->unk_00); - SysTask_Done(param0); - } - } - } -} - -static u32 Unk_ov86_0223D564 = 0; -static BOOL Unk_ov86_0223D540 = 1; - -static SysTask *ov86_0223C9B0(UnkStruct_ov86_0223B3C8 *param0) -{ - UnkStruct_ov86_0223C9B0 *v0 = Heap_Alloc(HEAP_ID_63, sizeof(UnkStruct_ov86_0223C9B0)); - - if (v0) { - SysTask *v1; - - Unk_ov86_0223D540 = 1; - Unk_ov86_0223D564 = 2; - - v0->unk_83C = 0; - v0->unk_838 = ov86_0223B744(ov86_0223CA64, v0, 5); - v0->unk_840 = param0; - - return ov86_0223B744(ov86_0223CA10, v0, 3); - } - - return NULL; -} - -static void ov86_0223CA10(SysTask *param0, void *param1) -{ - if (Unk_ov86_0223D540) { - UnkStruct_ov86_0223C9B0 *v0 = param1; - - G3_BeginMakeDL(&v0->unk_00, v0->unk_14, sizeof(v0->unk_14)); - G3B_MaterialColorDiffAmb(&v0->unk_00, GX_RGB(31, 31, 31), GX_RGB(16, 16, 16), 0); - G3B_MaterialColorSpecEmi(&v0->unk_00, GX_RGB(16, 16, 16), GX_RGB(0, 0, 0), 0); - } else { - Unk_ov86_0223D564--; - SysTask_Done(param0); - } -} - -static void ov86_0223CA64(SysTask *param0, void *param1) -{ - if (Unk_ov86_0223D540) { - UnkStruct_ov86_0223C9B0 *v0 = param1; - v0->unk_814 = G3_EndMakeDL(&v0->unk_00); - DC_FlushRange(v0->unk_14, v0->unk_814); - } else { - Unk_ov86_0223D564--; - SysTask_Done(param0); - } -} - -static void ov86_0223CAA0(SysTask *param0, fx16 param1, fx32 param2) -{ - UnkStruct_ov86_0223C9B0 *v0 = SysTask_GetParam(param0); - - if (v0->unk_83C < 8) { - v0->unk_818[v0->unk_83C] = ov86_0223CAE4(v0, param1, param2, v0->unk_83C); - Unk_ov86_0223D564++; - v0->unk_83C++; - } -} - -static SysTask *ov86_0223CAE4(UnkStruct_ov86_0223C9B0 *param0, fx16 param1, fx32 param2, int param3) -{ - static const int v0[] = { - GX_RGB(31, 31, 12), - GX_RGB(31, 31, 16), - GX_RGB(31, 28, 8), - GX_RGB(31, 31, 12), - GX_RGB(31, 31, 16), - GX_RGB(31, 28, 8), - GX_RGB(31, 31, 12), - GX_RGB(31, 31, 12) - }; - static const fx16 v1[] = { - 0xc00, - 0xb00, - 0xa00, - 0xc00, - 0xb00, - 0xa00 - }; - UnkStruct_ov86_0223CAE4 *v2 = Heap_Alloc(HEAP_ID_63, sizeof(UnkStruct_ov86_0223CAE4)); - - if (v2) { - v2->unk_00 = &(param0->unk_00); - v2->unk_818 = param1; - v2->unk_810 = v0[param3]; - v2->unk_804 = 0; - v2->unk_808 = param2; - v2->unk_80C = v1[param3] * (2 / 2); - v2->unk_814 = param3; - - VEC_Fx16Set(&(v2->unk_81A), param1 - 80, -FX16_ONE, 0); - VEC_Fx16Set(&(v2->unk_820), param1 + 80, -FX16_ONE, 0); - - return ov86_0223B744(ov86_0223CB74, v2, 4); - } - - return NULL; -} - -static void inline inline_ov86_0223CB74(UnkStruct_ov86_0223CAE4 *param0) -{ - { - int v0 = param0->unk_808 >> FX32_SHIFT; - fx32 v1, v2; - - v1 = param0->unk_818 + FX_Mul(CalcCosineDegrees(v0), 10240); - v2 = FX_Mul(CalcSineDegrees(v0), 10240) - FX16_ONE; - - VEC_Fx16Set(&(param0->unk_826), v1 - 576, v2, 0); - VEC_Fx16Set(&(param0->unk_82C), v1 + 576, v2, 0); - } -} - -static void ov86_0223CB74(SysTask *param0, void *param1) -{ - if (Unk_ov86_0223D540) { - UnkStruct_ov86_0223CAE4 *v0 = param1; - - v0->unk_808 += v0->unk_80C; - - if (v0->unk_80C > 0) { - if (v0->unk_808 >= 696320) { - v0->unk_80C *= -1; - } - } else { - if (v0->unk_808 <= 40960) { - v0->unk_80C *= -1; - } - } - - inline_ov86_0223CB74(v0); - - G3B_PolygonAttr(v0->unk_00, GX_LIGHTMASK_NONE, GX_POLYGONMODE_MODULATE, GX_CULL_BACK, v0->unk_814, 16, 0); - G3B_Begin(v0->unk_00, GX_BEGIN_QUADS); - - { - G3B_Color(v0->unk_00, v0->unk_810); - G3B_Vtx(v0->unk_00, v0->unk_81A.x, v0->unk_81A.y, v0->unk_81A.z); - G3B_Vtx(v0->unk_00, v0->unk_820.x, v0->unk_820.y, v0->unk_820.z); - G3B_Vtx(v0->unk_00, v0->unk_82C.x, v0->unk_82C.y, v0->unk_82C.z); - G3B_Vtx(v0->unk_00, v0->unk_826.x, v0->unk_826.y, v0->unk_826.z); - } - - G3B_End(v0->unk_00); - } else { - Unk_ov86_0223D564--; - SysTask_Done(param0); - } -} - -static void ov86_0223CD00(SysTask *param0) -{ - if (param0 != NULL) { - UnkStruct_ov86_0223C9B0 *v0 = SysTask_GetParam(param0); - - G3_PushMtx(); - MI_SendGXCommand(3, v0->unk_14, v0->unk_814); - G3_PopMtx(1); - } -} - -static void ov86_0223CD34(SysTask *param0) -{ - Unk_ov86_0223D540 = 0; - - if (param0 != NULL) { - UnkStruct_ov86_0223C9B0 *v0; - int v1; - - v0 = SysTask_GetParam(param0); - - for (v1 = 0; v1 < v0->unk_83C; v1++) { - Heap_Free(SysTask_GetParam(v0->unk_818[v1])); - } - - Heap_Free(v0); - } -} - -static BOOL ov86_0223CD80(void) -{ - return Unk_ov86_0223D564 == 0; -} - -static SysTask *ov86_0223CD94(UnkStruct_ov86_0223B3C8 *param0) -{ - static const int v0[] = { - GX_RGB(16, 28, 21), - GX_RGB(31, 16, 29), - GX_RGB(8, 8, 31), - GX_RGB(6, 31, 31), - GX_RGB(31, 31, 0), - GX_RGB(9, 31, 0), - GX_RGB(31, 18, 0), - GX_RGB(22, 0, 31) - }; - static const VecFx16 v1[4] = { - { -156, -205, 0 }, - { 156, -205, 0 }, - { 156, 205, 0 }, - { -156, 205, 0 } - }; - UnkStruct_ov86_0223CD94 *v2; - int v3, v4, v5, v6; - s16 v7, v8, v9; - - v2 = Heap_Alloc(HEAP_ID_63, sizeof(UnkStruct_ov86_0223CD94)); - v5 = LCRNG_Next(); - - LCRNG_SetSeed(13716); - - for (v3 = 0, v6 = 0; v3 < 48; v3++) { - v2->unk_08[v3].unk_00 = v0[v6]; - - if (++v6 >= NELEMS(v0)) { - v6 = 0; - } - - v7 = -4096 + (LCRNG_Next() % 8192); - v8 = 4096 + (LCRNG_Next() % 8192); - v9 = -328 + (LCRNG_Next() % 656); - - for (v4 = 0; v4 < 4; v4++) { - v2->unk_08[v3].unk_08[v4].x = v7 + v1[v4].x; - v2->unk_08[v3].unk_08[v4].y = v8 + v1[v4].y; - v2->unk_08[v3].unk_08[v4].z = v9 + v1[v4].z; - v2->unk_08[v3].unk_20.x = 0; - v2->unk_08[v3].unk_20.y = 0; - v2->unk_08[v3].unk_20.z = 0; - v2->unk_08[v3].unk_26.x = 512 + LCRNG_Next() % 512; - v2->unk_08[v3].unk_26.y = 512 + LCRNG_Next() % 512; - v2->unk_08[v3].unk_26.z = 512 + LCRNG_Next() % 512; - - MTX_Identity44(&v2->unk_08[v3].unk_2C); - } - - v4 = LCRNG_Next() & 7; - - while (v4--) { - VEC_Fx16Add(&v2->unk_08[v3].unk_20, &v2->unk_08[v3].unk_26, &v2->unk_08[v3].unk_20); - } - } - - LCRNG_SetSeed(v5); - - v2->unk_00 = 0; - v2->unk_04 = 0; - v2->unk_8D20 = 0; - - G3_MtxMode(GX_MTXMODE_POSITION_VECTOR); - - return SysTask_Start(ov86_0223CF6C, v2, 2); -} - -static void ov86_0223CF44(SysTask *param0) -{ - if (param0) { - Heap_Free(SysTask_GetParam(param0)); - SysTask_Done(param0); - } -} - -static void ov86_0223CF5C(SysTask *param0) -{ - if (param0) { - UnkStruct_ov86_0223CD94 *v0 = SysTask_GetParam(param0); - v0->unk_00 = 1; - } -} - -static void ov86_0223CF6C(SysTask *param0, void *param1) -{ - UnkStruct_ov86_0223CD94 *v0 = param1; - - if (v0->unk_00) { - int v1, v2; - - G3_BeginMakeDL(&v0->unk_1508, v0->unk_151C, sizeof(v0->unk_151C)); - G3B_PolygonAttr(&v0->unk_1508, GX_LIGHTMASK_01, GX_POLYGONMODE_MODULATE, GX_CULL_NONE, 63, 31, 0); - G3B_MaterialColorDiffAmb(&v0->unk_1508, GX_RGB(20, 20, 20), GX_RGB(0, 0, 0), 0); - - for (v1 = 0; v1 < 48; v1++) { - v0->unk_08[v1].unk_08[3].y -= 85; - - if (v0->unk_08[v1].unk_08[3].y <= -4096) { - v0->unk_08[v1].unk_08[3].y = 4096 - (-4096 - v0->unk_08[v1].unk_08[3].y); - } - - v0->unk_08[v1].unk_08[0].y = v0->unk_08[v1].unk_08[3].y - (205 * 2); - v0->unk_08[v1].unk_08[1].y = v0->unk_08[v1].unk_08[0].y; - v0->unk_08[v1].unk_08[2].y = v0->unk_08[v1].unk_08[3].y; - - VEC_Fx16Add(&v0->unk_08[v1].unk_20, &v0->unk_08[v1].unk_26, &v0->unk_08[v1].unk_20); - - MTX_Identity44(&(v0->unk_08[v1].unk_2C)); - MTX_TransApply44(&(v0->unk_08[v1].unk_2C), &(v0->unk_08[v1].unk_2C), v0->unk_08[v1].unk_08[0].x, v0->unk_08[v1].unk_08[0].y, v0->unk_08[v1].unk_08[0].z); - - G3B_LightColor(&(v0->unk_1508), GX_LIGHTID_0, GX_RGB(11, 11, 11)); - G3B_LightColor(&(v0->unk_1508), GX_LIGHTID_1, v0->unk_08[v1].unk_00); - - { - VecFx16 v3; - - VEC_Fx16Set(&v3, 0, FX16_ONE - 1, -FX16_ONE + 1); - VEC_Fx16Normalize(&v3, &v3); - - G3B_LightVector(&v0->unk_1508, GX_LIGHTID_0, v3.x, v3.y, v3.z); - - VEC_Fx16Set(&v3, 0, -FX16_ONE + 1, FX16_ONE - 1); - VEC_Fx16Normalize(&v3, &v3); - - G3B_LightVector(&v0->unk_1508, GX_LIGHTID_1, v3.x, v3.y, v3.z); - } - - { - MtxFx44 v4; - - MTX_RotX44(&v4, FX_SinIdx((u16)(v0->unk_08[v1].unk_20.x)), FX_CosIdx((u16)(v0->unk_08[v1].unk_20.x))); - MTX_Concat44(&v4, &(v0->unk_08[v1].unk_2C), &(v0->unk_08[v1].unk_2C)); - - MTX_RotY44(&v4, FX_SinIdx((u16)(v0->unk_08[v1].unk_20.y)), FX_CosIdx((u16)(v0->unk_08[v1].unk_20.y))); - MTX_Concat44(&v4, &(v0->unk_08[v1].unk_2C), &(v0->unk_08[v1].unk_2C)); - - MTX_RotZ44(&v4, FX_SinIdx((u16)(v0->unk_08[v1].unk_20.z)), FX_CosIdx((u16)(v0->unk_08[v1].unk_20.z))); - MTX_Concat44(&v4, &(v0->unk_08[v1].unk_2C), &(v0->unk_08[v1].unk_2C)); - } - - G3B_MaterialColorSpecEmi(&v0->unk_1508, GX_RGB(31, 31, 31), v0->unk_08[v1].unk_00, 0); - G3B_PushMtx(&v0->unk_1508); - G3B_LoadMtx44(&v0->unk_1508, &(v0->unk_08[v1].unk_2C)); - G3B_Begin(&v0->unk_1508, GX_BEGIN_QUADS); - - { - G3B_Normal(&v0->unk_1508, 0, 0, -FX16_ONE + 1); - G3B_Vtx(&v0->unk_1508, -156, -205, 0); - G3B_Vtx(&v0->unk_1508, 156, -205, 0); - G3B_Vtx(&v0->unk_1508, 156, 205, 0); - G3B_Vtx(&v0->unk_1508, -156, 205, 0); - } - - G3B_End(&v0->unk_1508); - G3B_PopMtx(&v0->unk_1508, 1); - } - - v0->unk_8D1C = G3_EndMakeDL(&v0->unk_1508); - DC_FlushRange(v0->unk_151C, v0->unk_8D1C); - - GF_ASSERT(v0->unk_8D1C < sizeof(v0->unk_151C)); - v0->unk_04 = 1; - } -} - -static void ov86_0223D220(SysTask *param0) -{ - if (param0) { - UnkStruct_ov86_0223CD94 *v0 = SysTask_GetParam(param0); - - if (v0->unk_04) { - G3_PushMtx(); - MI_SendGXCommand(3, v0->unk_151C, v0->unk_8D1C); - G3_PopMtx(1); - v0->unk_04 = 0; - } else { - (void)0; - } - } -} - -static void ov86_0223D264(UnkStruct_ov86_0223D264 *param0, fx32 param1, fx32 param2, int param3) -{ - param0->unk_00 = param1; - param0->unk_08 = param2; - param0->unk_04 = (param2 - param1) / param3; - param0->unk_0C = param3 - 1; - param0->unk_10 = 0; -} - -static fx32 ov86_0223D284(UnkStruct_ov86_0223D264 *param0) -{ - if (param0->unk_0C) { - param0->unk_0C--; - param0->unk_00 += param0->unk_04; - return param0->unk_00; - } else { - param0->unk_10 = 1; - return param0->unk_08; - } -} - -static BOOL ov86_0223D2A4(UnkStruct_ov86_0223D264 *param0) -{ - return param0->unk_10; -} - -static int ov86_0223D2A8(UnkStruct_ov86_0223B3C8 *param0, Pokemon *param1, const TrainerInfo *param2) -{ - BOOL v0; - int v1 = 6; - - v0 = Pokemon_EnterDecryptionContext(param1); - - do { - { - int v2 = Pokemon_GetValue(param1, MON_DATA_MET_GAME, NULL); - - if ((v2 == 1) || (v2 == 2) || (v2 == 3)) { - v1 = 4; - break; - } - - if ((v2 == 4) || (v2 == 5)) { - v1 = 3; - break; - } - - if (v2 == 15) { - v1 = 5; - break; - } - } - - if (Pokemon_GetValue(param1, MON_DATA_FATEFUL_ENCOUNTER, NULL)) { - v1 = 6; - break; - } - - { - u32 v3, v4; - - v3 = TrainerInfo_ID(param2); - v4 = Pokemon_GetValue(param1, MON_DATA_OT_ID, NULL); - - if (v3 != v4) { - v1 = 2; - break; - } - - TrainerInfo_NameStrbuf(param2, param0->unk_1C48); - Pokemon_GetValue(param1, MON_DATA_OTNAME_STRBUF, param0->unk_1C4C); - - if (Strbuf_Compare(param0->unk_1C48, param0->unk_1C4C)) { - v1 = 2; - break; - } - } - - if (Pokemon_GetValue(param1, MON_DATA_HATCH_LOCATION, NULL) >= 2000) { - v1 = 6; - } else { - if (Pokemon_GetValue(param1, MON_DATA_MET_MONTH, NULL) == 0) { - v1 = 0; - } else { - v1 = 1; - } - } - } while (0); - - Pokemon_ExitDecryptionContext(param1, v0); - - return v1; -} diff --git a/src/savedata/save_table.c b/src/savedata/save_table.c index 3db046f540..f85fbbd7c3 100644 --- a/src/savedata/save_table.c +++ b/src/savedata/save_table.c @@ -8,7 +8,7 @@ #include "field_overworld_state.h" #include "game_records.h" #include "global_trade.h" -#include "hall_of_fame.h" +#include "hall_of_fame_entries.h" #include "journal.h" #include "mail.h" #include "mystery_gift.h" diff --git a/src/scrcmd.c b/src/scrcmd.c index df69aaeecb..8323e7f08c 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -51,7 +51,7 @@ #include "applications/party_menu/defs.h" #include "applications/pc_boxes/pokemon_storage_session.h" #include "applications/pokemon_summary_screen/main.h" -#include "boat_cutscene/boat_cutscene.h" +#include "cutscenes/boat_cutscene.h" #include "field/field_system.h" #include "field/field_system_sub2_t.h" #include "overlay005/field_menu.h" @@ -113,7 +113,7 @@ #include "field_transition.h" #include "game_records.h" #include "great_marsh_lookout.h" -#include "hall_of_fame.h" +#include "hall_of_fame_entries.h" #include "heap.h" #include "inlines.h" #include "item_use_pokemon.h" @@ -4192,7 +4192,7 @@ static BOOL ScrCmd_0B1(ScriptContext *ctx) { void **v0 = FieldSystem_GetScriptMemberPtr(ctx->fieldSystem, SCRIPT_MANAGER_PARTY_MANAGEMENT_DATA); - *v0 = sub_0203E244(ctx->fieldSystem); + *v0 = FieldTask_OpenPCHallOfFameScreen(ctx->fieldSystem); ScriptContext_Pause(ctx, sub_02041CC8); return TRUE; diff --git a/src/unk_0203D1B8.c b/src/unk_0203D1B8.c index 450c07213f..63e507577f 100644 --- a/src/unk_0203D1B8.c +++ b/src/unk_0203D1B8.c @@ -43,8 +43,9 @@ #include "applications/pokedex/pokedex_main.h" #include "applications/pokemon_summary_screen/main.h" #include "battle/ov16_0223B140.h" -#include "boat_cutscene/boat_cutscene.h" #include "choose_starter/choose_starter_app.h" +#include "cutscenes/boat_cutscene.h" +#include "cutscenes/hall_of_fame.h" #include "dw_warp/dw_warp.h" #include "field/field_system.h" #include "library_tv/library_tv.h" @@ -60,7 +61,6 @@ #include "overlay072/ov72_0223D7A0.h" #include "overlay080/ov80_021D0D80.h" #include "overlay085/ov85_02241440.h" -#include "overlay086/ov86_0223B140.h" #include "overlay088/ov88_0223B140.h" #include "overlay088/struct_ov88_0223C370.h" #include "overlay090/ov90_021D0D80.h" @@ -91,7 +91,7 @@ #include "game_options.h" #include "game_records.h" #include "global_trade.h" -#include "hall_of_fame.h" +#include "hall_of_fame_entries.h" #include "heap.h" #include "item_use_functions.h" #include "mail.h" @@ -157,13 +157,13 @@ FS_EXTERN_OVERLAY(overlay80); FS_EXTERN_OVERLAY(journal_display); FS_EXTERN_OVERLAY(bag); FS_EXTERN_OVERLAY(overlay85); -FS_EXTERN_OVERLAY(overlay86); -FS_EXTERN_OVERLAY(overlay87); +FS_EXTERN_OVERLAY(hall_of_fame); +FS_EXTERN_OVERLAY(pc_hall_of_fame); FS_EXTERN_OVERLAY(overlay88); FS_EXTERN_OVERLAY(overlay90); FS_EXTERN_OVERLAY(overlay91); FS_EXTERN_OVERLAY(overlay92); -FS_EXTERN_OVERLAY(boat_cutscene); +FS_EXTERN_OVERLAY(cutscenes); FS_EXTERN_OVERLAY(overlay94); FS_EXTERN_OVERLAY(overlay95); FS_EXTERN_OVERLAY(overlay96); @@ -1400,27 +1400,27 @@ void sub_0203E224(FieldSystem *fieldSystem) FieldSystem_StartChildProcess(fieldSystem, &Unk_020EA328, fieldSystem->saveData); } -void sub_0203E234(FieldSystem *fieldSystem, UnkStruct_0203E234 *param1) +void FieldTask_StartHallOfFame(FieldSystem *fieldSystem, HallOfFameDisplayData *displayData) { - FS_EXTERN_OVERLAY(overlay86); + FS_EXTERN_OVERLAY(hall_of_fame); - static const ApplicationManagerTemplate v0 = { - ov86_0223B140, - ov86_0223B394, - ov86_0223B2E4, - FS_OVERLAY_ID(overlay86) + static const ApplicationManagerTemplate template = { + .init = HallOfFameManager_Init, + .main = HallOfFameManager_Main, + .exit = HallOfFameManager_Exit, + .overlayID = FS_OVERLAY_ID(hall_of_fame) }; - FieldSystem_StartChildProcess(fieldSystem, &v0, param1); + FieldSystem_StartChildProcess(fieldSystem, &template, displayData); } -void *sub_0203E244(FieldSystem *fieldSystem) +void *FieldTask_OpenPCHallOfFameScreen(FieldSystem *fieldSystem) { - static const ApplicationManagerTemplate v0 = { - PCHallOfFameManager_Init, - PCHallOfFameManager_Main, - PCHallOfFameManager_Exit, - FS_OVERLAY_ID(overlay87), + static const ApplicationManagerTemplate template = { + .init = PCHallOfFameManager_Init, + .main = PCHallOfFameManager_Main, + .exit = PCHallOfFameManager_Exit, + .overlayID = FS_OVERLAY_ID(pc_hall_of_fame), }; HallOfFame *hallOfFame; int resultCode; @@ -1431,7 +1431,7 @@ void *sub_0203E244(FieldSystem *fieldSystem) Heap_Free(hallOfFame); return NULL; } else { - FieldSystem_StartChildProcess(fieldSystem, &v0, hallOfFame); + FieldSystem_StartChildProcess(fieldSystem, &template, hallOfFame); return hallOfFame; } } @@ -1466,13 +1466,13 @@ void sub_0203E284(FieldSystem *fieldSystem, UnkStruct_020997B8 *param1) void FieldTask_PlayBoatCutscene_CanalaveShip(FieldSystem *fieldSystem, void *taskEnv) { - FS_EXTERN_OVERLAY(boat_cutscene); + FS_EXTERN_OVERLAY(cutscenes); const ApplicationManagerTemplate appTemplate = { .init = BoatCutscene_CanalaveShip_Init, .main = BoatCutscene_CanalaveShip_Main, .exit = BoatCutscene_CanalaveShip_Exit, - .overlayID = FS_OVERLAY_ID(boat_cutscene) + .overlayID = FS_OVERLAY_ID(cutscenes) }; FieldSystem_StartChildProcess(fieldSystem, &appTemplate, taskEnv); @@ -1480,13 +1480,13 @@ void FieldTask_PlayBoatCutscene_CanalaveShip(FieldSystem *fieldSystem, void *tas void FieldTask_PlayBoatCutscene_SnowpointShip(FieldSystem *fieldSystem, void *taskEnv) { - FS_EXTERN_OVERLAY(boat_cutscene); + FS_EXTERN_OVERLAY(cutscenes); const ApplicationManagerTemplate appTemplate = { .init = BoatCutscene_SnowpointShip_Init, .main = BoatCutscene_SnowpointShip_Main, .exit = BoatCutscene_SnowpointShip_Exit, - .overlayID = FS_OVERLAY_ID(boat_cutscene) + .overlayID = FS_OVERLAY_ID(cutscenes) }; FieldSystem_StartChildProcess(fieldSystem, &appTemplate, taskEnv); diff --git a/src/unk_02052C6C.c b/src/unk_02052C6C.c index 42aa77e539..79944404e8 100644 --- a/src/unk_02052C6C.c +++ b/src/unk_02052C6C.c @@ -19,7 +19,7 @@ #include "game_options.h" #include "game_records.h" #include "gx_layers.h" -#include "hall_of_fame.h" +#include "hall_of_fame_entries.h" #include "heap.h" #include "item_use_pokemon.h" #include "location.h" @@ -44,7 +44,7 @@ typedef struct { BOOL unk_00; - UnkStruct_0203E234 unk_04; + HallOfFameDisplayData displayData; UnkStruct_0203E274 unk_10; Window unk_1C; Strbuf *unk_2C; @@ -88,11 +88,11 @@ static BOOL sub_02052CBC(FieldTask *param0) FieldSystem *fieldSystem = FieldTask_GetFieldSystem(param0); UnkStruct_0205300C *v3 = FieldTask_GetEnv(param0); int *v4 = FieldTask_GetState(param0); - UnkStruct_0203E234 *v5 = &v3->unk_04; + HallOfFameDisplayData *displayData = &v3->displayData; switch (*v4) { case 0: - sub_0203E234(fieldSystem, v5); + FieldTask_StartHallOfFame(fieldSystem, displayData); (*v4)++; break; case 1: @@ -185,9 +185,9 @@ void sub_02052E58(FieldTask *param0) v2 = FieldOverworldState_GetExitLocation(SaveData_GetFieldOverworldState(fieldSystem->saveData)); v5->unk_00 = SystemFlag_CheckGameCompleted(v3); - v5->unk_04.unk_00 = SaveData_GetTrainerInfo(fieldSystem->saveData); - v5->unk_04.unk_04 = SaveData_GetParty(fieldSystem->saveData); - v5->unk_04.playTime = SaveData_GetPlayTime(fieldSystem->saveData); + v5->displayData.trainerInfo = SaveData_GetTrainerInfo(fieldSystem->saveData); + v5->displayData.party = SaveData_GetParty(fieldSystem->saveData); + v5->displayData.playTime = SaveData_GetPlayTime(fieldSystem->saveData); v5->unk_10.unk_00 = TrainerInfo_Gender(SaveData_GetTrainerInfo(fieldSystem->saveData)); v5->unk_10.unk_04 = SystemFlag_CheckGameCompleted(v3); v5->unk_10.unk_08 = SaveData_GetPokedex(fieldSystem->saveData);