diff --git a/asm/macros/frscrcmd.inc b/asm/macros/frscrcmd.inc index 80075f3851..52fd1334cd 100644 --- a/asm/macros/frscrcmd.inc +++ b/asm/macros/frscrcmd.inc @@ -766,7 +766,7 @@ .short 0x08D .endm - .macro FrontierScrCmd_8E + .macro OpenBattleHallApp .short 0x08E .endm diff --git a/include/applications/frontier/battle_hall/main.h b/include/applications/frontier/battle_hall/main.h new file mode 100644 index 0000000000..de03d69262 --- /dev/null +++ b/include/applications/frontier/battle_hall/main.h @@ -0,0 +1,13 @@ +#ifndef POKEPLATINUM_APPLICATIONS_BATTLE_HALL_MAIN_H +#define POKEPLATINUM_APPLICATIONS_BATTLE_HALL_MAIN_H + +#include "overlay_manager.h" + +BOOL BattleHallApp_Init(ApplicationManager *appMan, int *state); +BOOL BattleHallApp_Main(ApplicationManager *appMan, int *state); +BOOL BattleHallApp_Exit(ApplicationManager *appMan, int *state); +void BattleHall_DummyCommCommand(int netID, int unused, void *unused2, void *unused3); +void BattleHall_HandleTypeSelectionMsg(int netID, int unused, void *data, void *context); +void BattleHall_HandlePartnerDecisionCmd(int netID, int unused, void *data, void *context); + +#endif // POKEPLATINUM_APPLICATIONS_BATTLE_HALL_MAIN_H diff --git a/include/applications/frontier/battle_hall/sprite_manager.h b/include/applications/frontier/battle_hall/sprite_manager.h new file mode 100644 index 0000000000..51ae3c6d6f --- /dev/null +++ b/include/applications/frontier/battle_hall/sprite_manager.h @@ -0,0 +1,21 @@ +#ifndef POKEPLATINUM_APPLIcATIONS_BATTLE_HALL_SPRITE_MANAGER_H +#define POKEPLATINUM_APPLIcATIONS_BATTLE_HALL_SPRITE_MANAGER_H + +#include "struct_defs/pokemon.h" + +#include "sprite.h" +#include "sprite_resource.h" +#include "sprite_util.h" + +typedef struct BattleHallAppSpriteManager { + SpriteList *spriteList; + G2dRenderer renderer; + SpriteResourceCollection *resourceCollection[4]; + SpriteResource *resources[2][4]; +} BattleHallAppSpriteManager; + +void BattleHallApp_InitSpriteManager(BattleHallAppSpriteManager *sprites, Pokemon *mon); +Sprite *BattleHallApp_InitSprite(BattleHallAppSpriteManager *spriteMan, u32 resourceID, u32 animID, u32 priority, u8 onSubScreen); +void BattleHallApp_FreeSprites(BattleHallAppSpriteManager *spriteMan); + +#endif // POKEPLATINUM_APPLIcATIONS_BATTLE_HALL_SPRITE_MANAGER_H diff --git a/include/applications/frontier/battle_hall/sprites.h b/include/applications/frontier/battle_hall/sprites.h new file mode 100644 index 0000000000..66b835d8fa --- /dev/null +++ b/include/applications/frontier/battle_hall/sprites.h @@ -0,0 +1,21 @@ +#ifndef POKEPLATINUM_APPLICATIONS_BATTLE_HALL_SPRITES_H +#define POKEPLATINUM_APPLICATIONS_BATTLE_HALL_SPRITES_H + +#include "struct_defs/pokemon.h" + +#include "applications/frontier/battle_hall/sprite_manager.h" + +typedef struct BattleHallAppSprite { + u32 unused[3]; + const u8 *isAlwaysNull; + Sprite *sprite; +} BattleHallAppSprite; + +BattleHallAppSprite *BattleHallAppSprite_New(BattleHallAppSpriteManager *spriteMan, u32 resourceID, u32 animID, u16 x, u16 y, const u8 *null); +void *BattleHallAppSprite_Free(BattleHallAppSprite *sprite); +void BattleHallAppSprite_SetDrawFlag(BattleHallAppSprite *sprite, BOOL draw); +void BattleHallAppSprite_SetPosition(BattleHallAppSprite *sprite, u16 x, u16 y); +void BattleHallAppSprite_SetAnim(BattleHallAppSprite *sprite, u32 animID); +void BattleHallAppSprite_UpdatePalette(BattleHallAppSprite *sprite, Pokemon *mon); + +#endif // POKEPLATINUM_APPLICATIONS_BATTLE_HALL_SPRITES_H diff --git a/include/applications/frontier/battle_hall/windows.h b/include/applications/frontier/battle_hall/windows.h new file mode 100644 index 0000000000..3dfaa37c27 --- /dev/null +++ b/include/applications/frontier/battle_hall/windows.h @@ -0,0 +1,11 @@ +#ifndef POKEPLATINUM_APPLICATIONS_BATTLE_HALL_WINDOWS_H +#define POKEPLATINUM_APPLICATIONS_BATTLE_HALL_WINDOWS_H + +#include "bg_window.h" + +void BattleHallApp_InitWindows(BgConfig *bgConfig, Window *windows); +void BattleHallApp_FreeWindows(Window *windows); +void BattleHallApp_DrawWindow(BgConfig *bgConfig, Window *window); +void BattleHallApp_DrawMessageBox(Window *window, int frame); + +#endif // POKEPLATINUM_APPLICATIONS_BATTLE_HALL_WINDOWS_H diff --git a/include/constants/heap.h b/include/constants/heap.h index 03b02fbd80..559b7a3de8 100644 --- a/include/constants/heap.h +++ b/include/constants/heap.h @@ -100,7 +100,7 @@ enum HeapID { HEAP_ID_95, HEAP_ID_96, HEAP_ID_97, - HEAP_ID_98, + HEAP_ID_BATTLE_HALL_APP, HEAP_ID_99, HEAP_ID_100, HEAP_ID_101, @@ -134,6 +134,7 @@ enum HeapSize { HEAP_SIZE_DEBUG = 0x10, HEAP_SIZE_APPLICATION = 0x10D800, + HEAP_SIZE_BATTLE_HALL_APP = 0x20000, HEAP_SIZE_BAG = 0x30000, HEAP_SIZE_PRE_POKETCH_SUBSCREEN = 0x18000, diff --git a/include/narc_frontier_bg.h b/include/narc_frontier_bg.h new file mode 100644 index 0000000000..d6cb176ce5 --- /dev/null +++ b/include/narc_frontier_bg.h @@ -0,0 +1,52 @@ +#ifndef POKEPLATINUM_NARC_FRONTIER_BG_H +#define POKEPLATINUM_NARC_FRONTIER_BG_H +// TODO This is a temporary header file for recording NARC indexes of +// frontier_bg.narc. This file should eventually be deleted and the constants +// replaced with those from a naix.h file once the NARC is unpacked. + +#define BATTLE_FACTORY_TILES 0 +#define BATTLE_FACTORY_BATTLE_ROOM_TILEMAP 1 +#define BATTLE_FACTORY_CORRIDOR_TILEMAP 2 +#define BATTLE_FACTORY_CORRIDOR_FLOOR_TILEMAP 3 +#define BATTLE_HALL_BATTLE_ROOM_TILES 14 +#define BATTLE_HALL_CORRIDOR_TILES 16 +#define BATTLE_HALL_CORRIDOR_TILEMAP 17 +#define BATTLE_HALL_BATTLE_ROOM_LIGHTS_TILES 19 +#define BATTLE_HALL_BATTLE_ROOM_TILEMAP 20 +#define BATTLE_HALL_BATTLE_ROOM_LIGHTS_TILEMAP 22 +#define BATTLE_HALL_APP_TILES 23 +#define BATTLE_HALL_APP_TILEMAP 24 +#define BATTLE_CASTLE_CORRIDOR_TILES 25 +#define BATTLE_CASTLE_CORRIDOR_TILEMAP 26 +#define BATTLE_CASTLE_BATTLE_ROOM_TILES 29 +#define BATTLE_CASTLE_BATTLE_ROOM_TILEMAP 30 +#define BATTLE_CASTLE_BATTLE_ROOM_CURTAINS_TILEMAP 33 +#define BATTLE_TOWER_TILES 45 +#define BATTLE_TOWER_MULTI_BATTLE_ROOM_TILEMAP 46 +#define BATTLE_TOWER_MULTI_CORRIDOR_TILEMAP 47 +#define BATTLE_TOWER_MULTI_CORRIDOR_FG_TILEMAP 48 +#define BATTLE_TOWER_BATTLE_ROOM_TILEMAP 49 +#define BATTLE_TOWER_CORRIDOR_TILEMAP 50 +#define BATTLE_TOWER_CORRIDOR_FG_TILEMAP 51 +#define BATTLE_ARCADE_BATTLE_ROOM_TILEMAP 52 +#define BATTLE_ARCADE_BATTLE_ROOM_TILES 54 +#define BATTLE_ARCADE_CORRIDOR_TILEMAP 55 +#define BATTLE_ARCADE_CORRIDOR_TILES 56 +#define BATTLE_ARCADE_BATTLE_ROOM_HP_SCREEN_TILEMAP 57 +#define BATTLE_ARCADE_BATTLE_ROOM_HP_SCREEN_TILES 89 +#define BATTLE_FRONTIER_APP_SUB_SCREEN_TILES 125 +#define BATTLE_FRONTIER_APP_SUB_SCREEN_TILEMAP 126 +#define BATTLE_FACTORY_PLTT 129 +#define BATTLE_HALL_BATTLE_ROOM_PLTT 131 +#define BATTLE_HALL_CORRIDOR_PLTT 132 +#define BATTLE_HALL_BATTLE_ROOM_LIGHTS_PLTT 133 +#define BATTLE_HALL_APP_PLTT 134 +#define BATTLE_CASTLE_CORRIDOR_PLTT 135 +#define BATTLE_CASTLE_BATTLE_ROOM_PLTT 140 +#define BATTLE_TOWER_PLTT 141 +#define BATTLE_ARCADE_BATTLE_ROOM_PLTT 142 +#define BATTLE_ARCADE_CORRIDOR_PLTT 143 +#define BATTLE_ARCADE_BATTLE_ROOM_HP_SCREEN_PLTT 169 +#define BATTLE_FRONTIER_APP_SUB_SCREEN_PLTT 171 + +#endif diff --git a/include/narc_frontier_obj.h b/include/narc_frontier_obj.h new file mode 100644 index 0000000000..2349f140a8 --- /dev/null +++ b/include/narc_frontier_obj.h @@ -0,0 +1,12 @@ +#ifndef POKEPLATINUM_NARC_FRONTIER_OBJ_H +#define POKEPLATINUM_NARC_FRONTIER_OBJ_H +// TODO This is a temporary header file for recording NARC indexes of +// frontier_obj.narc. This file should eventually be deleted and the constants +// replaced with those from a naix.h file once the NARC is unpacked. + +#define BATTLE_HALL_APP_CURSOR_BOX_NCGR 12 +#define BATTLE_HALL_APP_CURSOR_BOX_NANR 13 +#define BATTLE_HALL_APP_CURSOR_BOX_NCER 14 +#define BATTLE_HALL_APP_CURSOR_BOX_PLTT 38 + +#endif diff --git a/include/overlay104/ov104_0222DCE0.h b/include/overlay104/ov104_0222DCE0.h index 416bf322eb..b2fda53607 100644 --- a/include/overlay104/ov104_0222DCE0.h +++ b/include/overlay104/ov104_0222DCE0.h @@ -32,7 +32,7 @@ void ov104_0222E330(FrontierPokemonDataDTO *param0, u16 param1[], u8 param2[], u u8 ov104_0222E3A8(u16 param0); BOOL ov104_0222E3E4(BattleFrontierTrainerData *param0, const u16 param1[], const u16 param2[], int param3, int param4, u16 param5[], int param6); void ov104_0222E4BC(u8 param0, u16 param1, u16 param2, u16 *param3, FrontierPokemonDataDTO *param4, u8 *param5, u32 *param6, u8 param7); -void ov104_0222E5D0(StringTemplate *param0, u32 param1); +void BattleFrontier_SetPartnerInStrTemplate(StringTemplate *template, u32 idx); int ov104_0222E5F0(const TrainerInfo *param0); void ov104_0222E630(SaveData *saveData); diff --git a/include/overlay104/ov104_02234838.h b/include/overlay104/ov104_02234838.h index 24dcc5ab9c..a65869ad70 100644 --- a/include/overlay104/ov104_02234838.h +++ b/include/overlay104/ov104_02234838.h @@ -6,7 +6,7 @@ BOOL FrontierScrCmd_8B(FrontierScriptContext *param0); BOOL FrontierScrCmd_8C(FrontierScriptContext *param0); BOOL FrontierScrCmd_8D(FrontierScriptContext *param0); -BOOL FrontierScrCmd_8E(FrontierScriptContext *param0); +BOOL FrontierScrCmd_OpenBattleHallApp(FrontierScriptContext *ctx); BOOL FrontierScrCmd_8F(FrontierScriptContext *param0); BOOL FrontierScrCmd_90(FrontierScriptContext *param0); BOOL FrontierScrCmd_91(FrontierScriptContext *param0); diff --git a/include/overlay104/ov104_0223AF58.h b/include/overlay104/ov104_0223AF58.h index 81afde647c..b8e461f227 100644 --- a/include/overlay104/ov104_0223AF58.h +++ b/include/overlay104/ov104_0223AF58.h @@ -6,14 +6,16 @@ #include "field_battle_data_transfer.h" +#define BATTLE_HALL_MON_SUMMARY 0xfe + void ov104_0223AF58(u8 param0, u8 param1, u8 param2, u8 param3, u16 param4[]); void ov104_0223AFB4(u8 param0, u8 param1, int param2, u8 param3, u8 param4, u16 param5[]); void ov104_0223B0C8(u8 param0, u8 param1, u8 param2, u8 param3, u16 param4, u16 param5[], u8 param6); FieldBattleDTO *ov104_0223B250(UnkStruct_ov104_0223B5C0 *param0, UnkStruct_ov104_02230BE4 *param1); u8 ov104_0223B500(u8 param0); u8 ov104_0223B50C(u8 param0); -u8 ov104_0223B5A4(u8 param0); -BOOL ov104_0223B5B0(u8 param0); +u8 BattleHall_CursorPosToType(u8 cursorPos); +BOOL BattleFrontier_IsMultiPlayerChallenge(u8 challengeMode); u8 ov104_0223B5C0(UnkStruct_ov104_0223B5C0 *param0); u16 ov104_0223B64C(UnkStruct_ov104_0223B5C0 *param0); fx32 ov104_0223B6C4(u32 param0); diff --git a/include/overlay104/struct_ov104_02235208.h b/include/overlay104/struct_ov104_02235208.h index ffc40ca51b..21c5c5de21 100644 --- a/include/overlay104/struct_ov104_02235208.h +++ b/include/overlay104/struct_ov104_02235208.h @@ -10,7 +10,7 @@ typedef struct { u8 unk_05; u16 unk_06; u8 *unk_08; - Party *unk_0C; + Party *party; void *unk_10; u16 *unk_14; u16 unk_18; diff --git a/include/overlay106/ov106_02241AE0.h b/include/overlay106/ov106_02241AE0.h deleted file mode 100644 index 38fb69eed0..0000000000 --- a/include/overlay106/ov106_02241AE0.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef POKEPLATINUM_OV106_02241AE0_H -#define POKEPLATINUM_OV106_02241AE0_H - -#include "overlay106/struct_ov106_02243118_decl.h" - -#include "overlay_manager.h" - -int ov106_02241AE0(ApplicationManager *appMan, int *param1); -int ov106_02241B9C(ApplicationManager *appMan, int *param1); -int ov106_02241CF0(ApplicationManager *appMan, int *param1); -void ov106_02243118(UnkStruct_ov106_02243118 *param0, u16 param1); -void ov106_02243130(int param0, int param1, void *param2, void *param3); -void ov106_0224313C(UnkStruct_ov106_02243118 *param0, u16 param1, u16 param2); -void ov106_02243180(int param0, int param1, void *param2, void *param3); -void ov106_022431D4(UnkStruct_ov106_02243118 *param0, u16 param1, u16 param2); -void ov106_022431E0(int param0, int param1, void *param2, void *param3); - -#endif // POKEPLATINUM_OV106_02241AE0_H diff --git a/include/overlay106/ov106_02243310.h b/include/overlay106/ov106_02243310.h deleted file mode 100644 index 24cc402268..0000000000 --- a/include/overlay106/ov106_02243310.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef POKEPLATINUM_OV106_02243310_H -#define POKEPLATINUM_OV106_02243310_H - -#include "overlay106/struct_ov106_02243310.h" - -#include "pokemon.h" -#include "sprite.h" - -void ov106_02243310(UnkStruct_ov106_02243310 *param0, Pokemon *param1); -Sprite *ov106_022434BC(UnkStruct_ov106_02243310 *param0, u32 param1, u32 param2, u32 param3, u8 param4); -void ov106_02243570(UnkStruct_ov106_02243310 *param0); - -#endif // POKEPLATINUM_OV106_02243310_H diff --git a/include/overlay106/ov106_022435FC.h b/include/overlay106/ov106_022435FC.h deleted file mode 100644 index c6741178de..0000000000 --- a/include/overlay106/ov106_022435FC.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef POKEPLATINUM_OV106_022435FC_H -#define POKEPLATINUM_OV106_022435FC_H - -#include "overlay106/struct_ov106_02243310.h" -#include "overlay106/struct_ov106_02243650_decl.h" - -#include "pokemon.h" - -UnkStruct_ov106_02243650 *ov106_022435FC(UnkStruct_ov106_02243310 *param0, u32 param1, u32 param2, u16 param3, u16 param4, const u8 *param5); -void *ov106_02243650(UnkStruct_ov106_02243650 *param0); -void ov106_02243664(UnkStruct_ov106_02243650 *param0, int param1); -void ov106_02243670(UnkStruct_ov106_02243650 *param0, u16 param1, u16 param2); -void ov106_022436B0(UnkStruct_ov106_02243650 *param0, u32 param1); -void ov106_022436CC(UnkStruct_ov106_02243650 *param0, Pokemon *param1); - -#endif // POKEPLATINUM_OV106_022435FC_H diff --git a/include/overlay106/ov106_022436E0.h b/include/overlay106/ov106_022436E0.h deleted file mode 100644 index 31c607bb66..0000000000 --- a/include/overlay106/ov106_022436E0.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef POKEPLATINUM_OV106_022436E0_H -#define POKEPLATINUM_OV106_022436E0_H - -#include "bg_window.h" - -void ov106_022436E0(BgConfig *param0, Window *param1); -void ov106_02243710(Window *param0); -void ov106_0224372C(BgConfig *param0, Window *param1); -void ov106_02243758(Window *param0, int param1); - -#endif // POKEPLATINUM_OV106_022436E0_H diff --git a/include/overlay106/struct_ov106_02243118_decl.h b/include/overlay106/struct_ov106_02243118_decl.h deleted file mode 100644 index 8e7de492b9..0000000000 --- a/include/overlay106/struct_ov106_02243118_decl.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef POKEPLATINUM_STRUCT_OV106_02243118_DECL_H -#define POKEPLATINUM_STRUCT_OV106_02243118_DECL_H - -typedef struct UnkStruct_ov106_02243118_t UnkStruct_ov106_02243118; - -#endif // POKEPLATINUM_STRUCT_OV106_02243118_DECL_H diff --git a/include/overlay106/struct_ov106_02243310.h b/include/overlay106/struct_ov106_02243310.h deleted file mode 100644 index 55a53d90a6..0000000000 --- a/include/overlay106/struct_ov106_02243310.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef POKEPLATINUM_STRUCT_OV106_02243310_H -#define POKEPLATINUM_STRUCT_OV106_02243310_H - -#include "sprite.h" -#include "sprite_resource.h" -#include "sprite_util.h" - -typedef struct { - SpriteList *unk_00; - G2dRenderer unk_04; - SpriteResourceCollection *unk_190[4]; - SpriteResource *unk_1A0[2][4]; -} UnkStruct_ov106_02243310; - -#endif // POKEPLATINUM_STRUCT_OV106_02243310_H diff --git a/include/overlay106/struct_ov106_02243650_decl.h b/include/overlay106/struct_ov106_02243650_decl.h deleted file mode 100644 index 0601d7914a..0000000000 --- a/include/overlay106/struct_ov106_02243650_decl.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef POKEPLATINUM_STRUCT_OV106_02243650_DECL_H -#define POKEPLATINUM_STRUCT_OV106_02243650_DECL_H - -typedef struct UnkStruct_ov106_02243650_t UnkStruct_ov106_02243650; - -#endif // POKEPLATINUM_STRUCT_OV106_02243650_DECL_H diff --git a/include/unk_02030108.h b/include/unk_02030108.h index 53bc09d7b7..467d69bcc2 100644 --- a/include/unk_02030108.h +++ b/include/unk_02030108.h @@ -12,7 +12,7 @@ BOOL sub_02030124(UnkStruct_02030114 *param0); void sub_0203012C(UnkStruct_02030114 *param0, BOOL param1); void sub_02030140(UnkStruct_02030114 *param0, u8 param1, u8 param2, u8 param3, const void *param4); u32 sub_02030198(UnkStruct_02030114 *param0, u8 param1, u8 param2, u8 param3, void *param4); -u8 sub_020301E0(u8 param0, u8 *param1); +u8 BattleHall_GetRankOfType(u8 idx, u8 *typeRanks); void sub_02030204(u8 param0, u8 *param1, u8 param2); void sub_02030244(u8 *param0); void sub_02030260(UnkStruct_0203026C *param0); diff --git a/platinum.us/main.lsf b/platinum.us/main.lsf index 0dcf20f03b..19fabde8d9 100644 --- a/platinum.us/main.lsf +++ b/platinum.us/main.lsf @@ -1588,13 +1588,13 @@ Overlay overlay105 Object main.nef.p/src_overlay105_ov105_02246214.c.o } -Overlay overlay106 +Overlay battle_hall_app { After overlay104 - Object main.nef.p/src_overlay106_ov106_02241AE0.c.o - Object main.nef.p/src_overlay106_ov106_02243310.c.o - Object main.nef.p/src_overlay106_ov106_022435FC.c.o - Object main.nef.p/src_overlay106_ov106_022436E0.c.o + Object main.nef.p/src_applications_frontier_battle_hall_main.c.o + Object main.nef.p/src_applications_frontier_battle_hall_sprite_manager.c.o + Object main.nef.p/src_applications_frontier_battle_hall_sprites.c.o + Object main.nef.p/src_applications_frontier_battle_hall_windows.c.o } Overlay overlay107 diff --git a/platinum.us/sbins_shared.sha1 b/platinum.us/sbins_shared.sha1 index 22f635a6e7..821deca069 100644 --- a/platinum.us/sbins_shared.sha1 +++ b/platinum.us/sbins_shared.sha1 @@ -103,7 +103,7 @@ e93f9eb3382856feb76c8b0ba400b7d2593db5c5 *overlay99.sbin de8a847bff8c343d69b853a215e6ee775ef2ef96 *overlay103.sbin a3f4dcf6634992ff3367fe5a377825fb913a39f6 *overlay104.sbin 0e6e923a1a359b9482646b3dd0a7a2562e140672 *overlay105.sbin -c3a66997e55fb3e761d521136a42f07f4761f5da *overlay106.sbin +c3a66997e55fb3e761d521136a42f07f4761f5da *battle_hall_app.sbin f8d3fd65261098ff45b3a31319c904b520814fa2 *overlay107.sbin 901f6afe6c1b0b54dc42af812f13560758814d2b *overlay108.sbin 5acaa19b61120f72d546a83e36c361b2e383c0bd *overlay109.sbin diff --git a/res/field/frontier_scripts/frontier_scripts_battle_hall.s b/res/field/frontier_scripts/frontier_scripts_battle_hall.s index ba610b1a8d..08788862cf 100644 --- a/res/field/frontier_scripts/frontier_scripts_battle_hall.s +++ b/res/field/frontier_scripts/frontier_scripts_battle_hall.s @@ -707,7 +707,7 @@ _0611: CloseMessage FrontierScrCmd_91 30, 0, 0, 0x8008 CallIfEq 0x8008, 1, _065B - FrontierScrCmd_8E + OpenBattleHallApp FrontierScrCmd_91 31, 0, 0, 0x8008 FrontierScrCmd_91 36, 0, 0, 0x8008 FadeScreenIn diff --git a/src/applications/frontier/battle_hall/main.c b/src/applications/frontier/battle_hall/main.c new file mode 100644 index 0000000000..058cd6c110 --- /dev/null +++ b/src/applications/frontier/battle_hall/main.c @@ -0,0 +1,1547 @@ +#include "applications/frontier/battle_hall/main.h" + +#include + +#include "constants/scrcmd.h" + +#include "struct_defs/struct_02099F80.h" + +#include "applications/frontier/battle_hall/sprite_manager.h" +#include "applications/frontier/battle_hall/sprites.h" +#include "applications/frontier/battle_hall/windows.h" +#include "applications/pokemon_summary_screen/main.h" +#include "overlay104/ov104_0222DCE0.h" +#include "overlay104/ov104_0223AF58.h" +#include "overlay104/struct_ov104_02235208.h" + +#include "bg_window.h" +#include "communication_system.h" +#include "dexmode_checker.h" +#include "font.h" +#include "font_special_chars.h" +#include "game_options.h" +#include "game_overlay.h" +#include "graphics.h" +#include "gx_layers.h" +#include "heap.h" +#include "menu.h" +#include "message.h" +#include "narc.h" +#include "narc_frontier_bg.h" +#include "overlay_manager.h" +#include "palette.h" +#include "party.h" +#include "pokemon.h" +#include "render_oam.h" +#include "render_window.h" +#include "save_player.h" +#include "savedata.h" +#include "screen_fade.h" +#include "sound_playback.h" +#include "sprite.h" +#include "sprite_util.h" +#include "string_gf.h" +#include "string_list.h" +#include "string_template.h" +#include "system.h" +#include "text.h" +#include "trainer_info.h" +#include "unk_02030108.h" +#include "unk_020363E8.h" +#include "unk_020393C8.h" +#include "unk_0209BA80.h" +#include "vram_transfer.h" + +#include "constdata/const_020F410C.h" +#include "res/text/bank/battle_hall_scene.h" + +// States of the overall app +enum BattleHallAppState { + STATE_FADE_IN = 0, + STATE_MON_SUMMARY, + STATE_SELECT_BATTLE, + STATE_MULTI_CONFIRM, + STATE_SYNC_BEFORE_EXIT, + STATE_FADE_OUT, + STATE_CLOSE_MESSAGE, +}; + +// Substates of the STATE_SELECT_BATTLE state +enum BattleHallAppSelectBattleSubState { + SELECT_STATE_INIT = 0, + SELECT_STATE_MAKE_PICK, + SELECT_STATE_OPEN_YES_NO, + SELECT_STATE_PROCESS_YES_NO, + SELECT_STATE_PRINT_MATRON_MSG, + SELECT_STATE_HIGHLIGHT_MATRON_CELL, + SELECT_STATE_OPEN_MON_SUMMARY, +}; + +// Substates of the STATE_MULTI_CONFIRM state +enum BattleHallAppMultiConfirmSubState { + MCONFIRM_STATE_SEND_COMM, + MCONFIRM_STATE_WAIT_FOR_PARTNER_ACK, + MCONFIRM_STATE_OPEN_YES_NO, + MCONFIRM_STATE_PARTNER_IS_CHOOSING, + MCONFIRM_STATE_HANDLE_PARTNERS_DECISION, + MCONFIRM_STATE_PROCESS_YES_NO, + MCONFIRM_STATE_SEND_CONFIRM_COMM, + MCONFIRM_STATE_SEND_CANCELED_COMM, +}; + +#define PARTNER_DECISION_PENDING 0 +#define PARTNER_DECISION_CONFIRM 1 +#define PARTNER_DECISION_CANCEL 2 + +#define MAX_RANK 10 + +#define WINDOW_MSG_BOX 0 +#define WINDOW_YES_NO_MENU 1 +#define WINDOW_MON_NAME 2 +#define WINDOW_TYPE_INFO 3 + +#define GRID_WIDTH 4 +#define GRID_HEIGHT 5 +#define GRID_TOTAL_CELLS (GRID_WIDTH * GRID_HEIGHT) +#define COL_WIDTH 64 +#define ROW_HEIGHT 36 + +#define CELL_BACKGROUND_NORMAL 0 +#define CELL_BACKGROUND_SELECTED 1 +#define CELL_BACKGROUND_PARTNER_SELECTED 2 +#define CELL_BACKGROUND_UNSELECTABLE 3 + +#define COMM_CMD_DUMMY 4 +#define COMM_CMD_TYPE_SELECTION 5 +#define COMM_CMD_PARTNER_DECISION 6 + +FS_EXTERN_OVERLAY(overlay104); + +typedef struct BattleHallApp { + ApplicationManager *unused; + ApplicationManager *monSummaryAppMan; + u8 subState; + u8 challengeType; + u8 printerID; + u8 summaryScreenOpened; + u8 prevCursorPos; + u8 cursorPos; + u8 unused2; + u8 yesNoMenuOpen; + u16 summaryScreenOpen; + u16 isSynced; + u16 openMenuDelay; + u8 numSelectionMsgsReceived; + u8 startMultiSelectionConfirm; + u8 selectionID; + u8 selectionCanceled; + u8 selectedCursorPos; + u8 fadeOutDelay; + u16 currentStreak; + u8 matronBattleAvailable; + u8 savedCursorPos; + MessageLoader *msgLoader; + StringTemplate *strTemplate; + String *displayStr; + String *fmtStr; + String *yesNoStrs[2]; + u16 unused3[8]; + BgConfig *bgConfig; + Window windows[4]; + MenuTemplate yesNoMenuTemplate; + Menu *yesNoMenu; + StringList yesNoStrList[2]; + PaletteData *plttData; + FontSpecialCharsContext *specialChars; + Options *options; + SaveData *saveData; + PokemonSummary *monSummary; + BattleHallAppSpriteManager spriteMan; + BattleHallAppSprite *cursorSprite; + BattleHallAppSprite *monSprite; + int monIndex; + u16 *selectedCellPtr; + Party *party; + u8 *typeRanks; + u16 *partnersLevel; + NARC *narc; + u16 commPayload[44]; + u8 partnersSelectedCell; + u8 partnersDecision; + u8 unused4; + u32 unused5; +} BattleHallApp; + +static BOOL State_FadeInApp(BattleHallApp *app); +static BOOL State_RunMonSummaryApp(BattleHallApp *app); +static BOOL State_SelectNextBattle(BattleHallApp *app); +static BOOL State_MultiplayerConfirmSelection(BattleHallApp *app); +static BOOL State_SyncBeforeExit(BattleHallApp *app); +static BOOL State_FadeOutApp(BattleHallApp *app); +static BOOL State_CloseMessageBox(BattleHallApp *app); +static void ChangeState(BattleHallApp *app, int *state, enum BattleHallAppState nextState); + +static void ReInitApp(BattleHallApp *app); +static void VBlankCallback(void *data); +static void InitGraphicsPlane(void); +static void SetGXBanks(void); +static void InitBackgrounds(BgConfig *bgConfig); +static void LoadAssets(BattleHallApp *app); +static void FreeAssets(BattleHallApp *app); +static void LoadBackgrounds(BattleHallApp *app); +static void FreeBackgrounds(BgConfig *bgConfig); +static void LoadMainScreenBackground(BattleHallApp *app, enum BgLayer bgLayer); +static void LoadPalette(void); +static void LoadSubScreenBackground(BattleHallApp *app, enum BgLayer bgLayer); +static void InitSpriteManager(BattleHallApp *app); + +static void PrintAppStrings(BattleHallApp *app); +static void PrintPokemonsName(BattleHallApp *app, Window *window, u32 x, u32 y, u8 textColor, u8 shadowColor, u8 bgColor, u8 fontID); +static void PrintTypeStrings(BattleHallApp *app, Window *window, u8 textColor, u8 shadowColor, u8 bgColor, u8 fontID); +static u8 PrintMessage(BattleHallApp *app, Window *window, int messageID, u32 x, u32 y, u32 renderDelay, u8 textColor, u8 shadowColor, u8 bgColor, u8 fontID); +static u8 PrintMessageAndCopyToVRAM(BattleHallApp *app, int messageID, u8 fontID); +static void PrintRank(BattleHallApp *app, Window *window, u8 rank, u32 x, u32 y); +static void PrintTypesRanks(BattleHallApp *app, Window *window); +static void SetStringTemplateNumber(BattleHallApp *app, u32 idx, s32 num); +static void DrawMonSpriteAndName(BattleHallApp *app); +static void ChangeCellBackground(BgConfig *bgConfig, u8 boxIdx, u8 background); +static void GrayOutUnselectableCells(BattleHallApp *app, BgConfig *bgConfig); +static void DeselectCell(BattleHallApp *app); + +static void InitYesNoMenu(BattleHallApp *app, Window *window, u8 numOptions); +static void AddStringToYesNoMenu(BattleHallApp *app, u8 strIndex, u8 listIndex, int messageID); +static void OpenYesNoMenu(BattleHallApp *app); +static void DrawMessageWithYesNoMenu(BattleHallApp *app); +static void FreeYesNoMenu(BattleHallApp *app); + +static void UpdateCursorPosition(BattleHallApp *app, int _); +static u8 GetCursorPos(u8 cursorPos); +static u16 GetCursorX(BattleHallApp *app); +static u16 GetCursorY(BattleHallApp *app); + +static void SetupMonSummaryApp(BattleHallApp *app); +static BOOL NextOpponentIsHallMatron(BattleHallApp *app); +static BOOL IsHallMatronBattleAvailable(BattleHallApp *app); + +static BOOL SendCommMessage(BattleHallApp *app, u16 cmd, u16 arg); +static void DummyCreatePayload(BattleHallApp *app, u16 dummy); +static void CreateTypeSelectionPayload(BattleHallApp *app, u16 cmd, u16 cursorPos); +static void CreateDecisionPayload(BattleHallApp *app, u16 cmd, u16 decision); + +static const u8 sSummaryPages[] = { + SUMMARY_PAGE_INFO, + SUMMARY_PAGE_MEMO, + SUMMARY_PAGE_SKILLS, + SUMMARY_PAGE_CONDITION, + SUMMARY_PAGE_BATTLE_MOVES, + SUMMARY_PAGE_CONTEST_MOVES, + SUMMARY_PAGE_RIBBONS, + SUMMARY_PAGE_EXIT, + SUMMARY_PAGE_MAX, +}; + +BOOL BattleHallApp_Init(ApplicationManager *appMan, int *state) +{ + Overlay_LoadByID(FS_OVERLAY_ID(overlay104), OVERLAY_LOAD_ASYNC); + InitGraphicsPlane(); + Heap_Create(HEAP_ID_APPLICATION, HEAP_ID_BATTLE_HALL_APP, HEAP_SIZE_BATTLE_HALL_APP); + + BattleHallApp *app = ApplicationManager_NewData(appMan, sizeof(BattleHallApp), HEAP_ID_BATTLE_HALL_APP); + memset(app, 0, sizeof(BattleHallApp)); + + app->bgConfig = BgConfig_New(HEAP_ID_BATTLE_HALL_APP); + app->unused = appMan; + + UnkStruct_ov104_02235208 *v2 = ApplicationManager_Args(appMan); + + app->saveData = v2->saveData; + app->challengeType = v2->unk_04; + app->selectedCellPtr = &v2->unk_06; + app->options = SaveData_GetOptions(app->saveData); + app->party = v2->party; + app->typeRanks = v2->unk_08; + app->partnersLevel = v2->unk_14; + app->currentStreak = v2->unk_18 + 1; + app->cursorPos = v2->unk_05; + app->partnersSelectedCell = 0xff; + app->selectionID = 0xff; + app->savedCursorPos = 0x75; + + LoadAssets(app); + + if (BattleFrontier_IsMultiPlayerChallenge(app->challengeType) == TRUE) { + sub_0209BA80(app); + } + + *state = 0; + + return TRUE; +} + +BOOL BattleHallApp_Main(ApplicationManager *appMan, int *state) +{ + BattleHallApp *app = ApplicationManager_Data(appMan); + + if (app->selectionID != 0xff && *state == STATE_SELECT_BATTLE && !app->summaryScreenOpen) { + FreeYesNoMenu(app); + ChangeState(app, state, STATE_MULTI_CONFIRM); + } + + switch (*state) { + case STATE_MON_SUMMARY: + if (State_RunMonSummaryApp(app) == TRUE) { + ChangeState(app, state, STATE_FADE_IN); + } else { + return FALSE; + } + case STATE_FADE_IN: + if (State_FadeInApp(app) == TRUE) { + ChangeState(app, state, STATE_SELECT_BATTLE); + } + break; + case STATE_SELECT_BATTLE: + if (State_SelectNextBattle(app) == TRUE) { + if (app->startMultiSelectionConfirm == TRUE) { + ChangeState(app, state, STATE_MULTI_CONFIRM); + } else if (app->summaryScreenOpened == TRUE) { + ChangeState(app, state, STATE_MON_SUMMARY); + return FALSE; + } else if (BattleFrontier_IsMultiPlayerChallenge(app->challengeType) == TRUE) { + ChangeState(app, state, STATE_SYNC_BEFORE_EXIT); + } else { + ChangeState(app, state, STATE_FADE_OUT); + } + } + break; + case STATE_MULTI_CONFIRM: + if (State_MultiplayerConfirmSelection(app) == TRUE) { + if (app->selectionCanceled == TRUE) { + app->selectionCanceled = FALSE; + ChangeState(app, state, STATE_SELECT_BATTLE); + } else if (BattleFrontier_IsMultiPlayerChallenge(app->challengeType) == TRUE) { + ChangeState(app, state, STATE_SYNC_BEFORE_EXIT); + } else { + ChangeState(app, state, STATE_FADE_OUT); + } + } + break; + case STATE_SYNC_BEFORE_EXIT: + if (State_SyncBeforeExit(app) == TRUE) { + ChangeState(app, state, STATE_FADE_OUT); + } + break; + case STATE_FADE_OUT: + if (State_FadeOutApp(app) == TRUE) { + return TRUE; + } + break; + case STATE_CLOSE_MESSAGE: + if (State_CloseMessageBox(app) == TRUE) { + ChangeState(app, state, STATE_SYNC_BEFORE_EXIT); + } + break; + } + + SpriteList_Update(app->spriteMan.spriteList); + return FALSE; +} + +BOOL BattleHallApp_Exit(ApplicationManager *appMan, int *state) +{ + BattleHallApp *app = ApplicationManager_Data(appMan); + + *app->selectedCellPtr = app->cursorPos; + + FreeAssets(app); + + ApplicationManager_FreeData(appMan); + SetVBlankCallback(NULL, NULL); + Heap_Destroy(HEAP_ID_BATTLE_HALL_APP); + Overlay_UnloadByID(FS_OVERLAY_ID(overlay104)); + + return TRUE; +} + +static BOOL State_FadeInApp(BattleHallApp *app) +{ + switch (app->subState) { + case 0: + if (!app->isSynced && BattleFrontier_IsMultiPlayerChallenge(app->challengeType) == TRUE) { + CommTool_ClearReceivedTempDataAllPlayers(); + CommTiming_StartSync(112); + } + + app->subState++; + break; + case 1: + if (!app->isSynced && BattleFrontier_IsMultiPlayerChallenge(app->challengeType) == TRUE) { + if (CommTiming_IsSyncState(112) == TRUE) { + CommTool_ClearReceivedTempDataAllPlayers(); + app->isSynced = TRUE; + app->subState++; + } + } else { + app->subState++; + } + break; + case 2: + PrintAppStrings(app); + StartScreenFade(FADE_BOTH_SCREENS, FADE_TYPE_BRIGHTNESS_IN, FADE_TYPE_BRIGHTNESS_IN, COLOR_BLACK, 6, 3, HEAP_ID_BATTLE_HALL_APP); + app->subState++; + break; + case 3: + if (IsScreenFadeDone() == TRUE) { + return TRUE; + } + break; + } + + return FALSE; +} + +static void PrintAppStrings(BattleHallApp *app) +{ + PrintTypeStrings(app, &app->windows[WINDOW_TYPE_INFO], 1, 2, 0, FONT_SYSTEM); + PrintTypesRanks(app, &app->windows[WINDOW_TYPE_INFO]); + PrintPokemonsName(app, &app->windows[WINDOW_MON_NAME], 0, 0, 1, 2, 0, FONT_SYSTEM); +} + +static BOOL State_RunMonSummaryApp(BattleHallApp *app) +{ + if (app->subState == 0) { + if (ApplicationManager_Exec(app->monSummaryAppMan) == TRUE) { + app->monIndex = app->monSummary->monIndex; + Heap_Free(app->monSummary); + Heap_Free(app->monSummaryAppMan); + app->monSummaryAppMan = NULL; + ReInitApp(app); + app->summaryScreenOpen = FALSE; + return TRUE; + } + } + + return FALSE; +} + +static BOOL State_SelectNextBattle(BattleHallApp *app) +{ + switch (app->subState) { + case SELECT_STATE_INIT: + app->summaryScreenOpened = FALSE; + app->subState = SELECT_STATE_MAKE_PICK; + break; + case SELECT_STATE_MAKE_PICK: + UpdateCursorPosition(app, gSystem.pressedKeys); + + if (JOY_NEW(PAD_BUTTON_A)) { + if (BattleHall_CursorPosToType(app->cursorPos) == BATTLE_HALL_MON_SUMMARY) { + Sound_PlayEffect(SEQ_SE_DP_DECIDE); + StartScreenFade(FADE_BOTH_SCREENS, FADE_TYPE_BRIGHTNESS_OUT, FADE_TYPE_BRIGHTNESS_OUT, COLOR_BLACK, 6, 1, HEAP_ID_BATTLE_HALL_APP); + + app->summaryScreenOpen = TRUE; + app->subState = SELECT_STATE_OPEN_MON_SUMMARY; + } else { + if (IsHallMatronBattleAvailable(app) == TRUE) { + if (BattleHall_CursorPosToType(app->cursorPos) != TYPE_MYSTERY) { + Sound_PlayEffect(SEQ_SE_DP_BOX03); + return FALSE; + } + } else { + if (BattleHall_GetRankOfType(GetCursorPos(app->cursorPos), app->typeRanks) >= MAX_RANK) { + Sound_PlayEffect(SEQ_SE_DP_BOX03); + + return FALSE; + } + + if (BattleHall_CursorPosToType(app->cursorPos) == TYPE_MYSTERY) { + Sound_PlayEffect(SEQ_SE_DP_BOX03); + return FALSE; + } + } + + Sound_PlayEffect(SEQ_SE_DP_DECIDE); + + if (!BattleFrontier_IsMultiPlayerChallenge(app->challengeType)) { + ChangeCellBackground(app->bgConfig, app->cursorPos, CELL_BACKGROUND_SELECTED); + Bg_ScheduleTilemapTransfer(app->bgConfig, BG_LAYER_MAIN_3); + } + + app->openMenuDelay = 8; + app->subState = SELECT_STATE_OPEN_YES_NO; + } + } + break; + case SELECT_STATE_OPEN_YES_NO: + app->openMenuDelay--; + + if (app->openMenuDelay == 0) { + if (!BattleFrontier_IsMultiPlayerChallenge(app->challengeType)) { + DrawMessageWithYesNoMenu(app); + app->subState = SELECT_STATE_PROCESS_YES_NO; + break; + } else { + BattleHallApp_DrawMessageBox(&app->windows[WINDOW_MSG_BOX], Options_Frame(app->options)); + app->printerID = PrintMessageAndCopyToVRAM(app, BattleHallScene_Text_PleaseWait, FONT_MESSAGE); + app->selectedCursorPos = app->cursorPos; + app->startMultiSelectionConfirm = TRUE; + return TRUE; + } + } + break; + case SELECT_STATE_PROCESS_YES_NO: + switch (Menu_ProcessInput(app->yesNoMenu)) { + case MENU_NOTHING_CHOSEN: + break; + case MENU_YES: + FreeYesNoMenu(app); + + if (NextOpponentIsHallMatron(app) == TRUE && !IsHallMatronBattleAvailable(app)) { + app->savedCursorPos = app->cursorPos; + app->subState = SELECT_STATE_PRINT_MATRON_MSG; + } else { + Sound_StopEffect(SEQ_SE_CONFIRM, 0); + Sound_PlayEffect(SEQ_SE_DP_UG_020); + + if (app->savedCursorPos != 0x75) { + app->cursorPos = app->savedCursorPos; + } + + return TRUE; + } + break; + case MENU_NO: + case MENU_CANCELED: + FreeYesNoMenu(app); + DeselectCell(app); + app->subState = SELECT_STATE_MAKE_PICK; + break; + } + break; + case SELECT_STATE_PRINT_MATRON_MSG: + BattleHallApp_DrawMessageBox(&app->windows[WINDOW_MSG_BOX], Options_Frame(app->options)); + app->printerID = PrintMessage(app, &app->windows[WINDOW_MSG_BOX], BattleHallScene_Text_HallMatronApproaching, 1, 1, Options_TextFrameDelay(SaveData_GetOptions(app->saveData)), 1, 2, 15, FONT_MESSAGE); + Window_CopyToVRAM(&app->windows[WINDOW_MSG_BOX]); + app->subState = SELECT_STATE_HIGHLIGHT_MATRON_CELL; + break; + case SELECT_STATE_HIGHLIGHT_MATRON_CELL: + if (!Text_IsPrinterActive(app->printerID)) { + app->matronBattleAvailable = TRUE; + DrawMonSpriteAndName(app); + BattleHallAppSprite_SetAnim(app->cursorSprite, 1); + ChangeCellBackground(app->bgConfig, GRID_TOTAL_CELLS - 1, CELL_BACKGROUND_NORMAL); + GrayOutUnselectableCells(app, app->bgConfig); + app->cursorPos = GRID_TOTAL_CELLS - 1; + BattleHallAppSprite_SetPosition(app->cursorSprite, GetCursorX(app), GetCursorY(app)); + app->subState = SELECT_STATE_INIT; + } + break; + case SELECT_STATE_OPEN_MON_SUMMARY: + if (IsScreenFadeDone() == TRUE) { + SetupMonSummaryApp(app); + FreeAssets(app); + app->monSummaryAppMan = ApplicationManager_New(&gPokemonSummaryScreenApp, app->monSummary, HEAP_ID_BATTLE_HALL_APP); + app->summaryScreenOpened = TRUE; + return TRUE; + } + break; + } + + return FALSE; +} + +static BOOL State_MultiplayerConfirmSelection(BattleHallApp *app) +{ + switch (app->subState) { + case MCONFIRM_STATE_SEND_COMM: + // After the first player sends this message the second player will move + // to this state and send the same message. After the exchange, both + // games' app->selectionID will contain the first player's selected + // cursorPos if the Host made the selection, otherwise it will contain + // cursorPos + 20. This distinction is used in MCONFIRM_STATE_WAIT_FOR_PARTNER_ACK + // to determine which game gets to confirm the selection and which has to wait. + if (SendCommMessage(app, COMM_CMD_TYPE_SELECTION, GetCursorPos(app->selectedCursorPos)) == TRUE) { + app->fadeOutDelay = 0; + app->selectedCursorPos = 0; + app->startMultiSelectionConfirm = FALSE; + app->subState = MCONFIRM_STATE_WAIT_FOR_PARTNER_ACK; + } + break; + case MCONFIRM_STATE_WAIT_FOR_PARTNER_ACK: + if (app->fadeOutDelay > 0) { + app->fadeOutDelay--; + break; + } + + // Wait until both players have acknowledged the pending selection + if (app->numSelectionMsgsReceived < 2) { + break; + } + app->numSelectionMsgsReceived = 0; + + if (app->selectionID < GRID_TOTAL_CELLS) { + if (CommSys_CurNetId() == 0) { + app->subState = MCONFIRM_STATE_OPEN_YES_NO; + } else { + app->subState = MCONFIRM_STATE_PARTNER_IS_CHOOSING; + } + } else { + if (CommSys_CurNetId() == 0) { + app->subState = MCONFIRM_STATE_PARTNER_IS_CHOOSING; + } else { + app->subState = MCONFIRM_STATE_OPEN_YES_NO; + } + } + break; + case MCONFIRM_STATE_PARTNER_IS_CHOOSING: + BattleHallAppSprite_SetDrawFlag(app->monSprite, FALSE); + BattleHallApp_DrawMessageBox(&app->windows[WINDOW_MSG_BOX], Options_Frame(app->options)); + BattleFrontier_SetPartnerInStrTemplate(app->strTemplate, 0); + + app->printerID = PrintMessageAndCopyToVRAM(app, BattleHallScene_Text_PartnerIsChoosing, FONT_MESSAGE); + app->fadeOutDelay = 10; + + ChangeCellBackground(app->bgConfig, app->partnersSelectedCell, CELL_BACKGROUND_PARTNER_SELECTED); + Bg_ScheduleTilemapTransfer(app->bgConfig, BG_LAYER_MAIN_3); + + app->subState = MCONFIRM_STATE_HANDLE_PARTNERS_DECISION; + break; + case MCONFIRM_STATE_HANDLE_PARTNERS_DECISION: + if (app->partnersDecision == PARTNER_DECISION_PENDING) { + break; + } + + if (app->partnersDecision == PARTNER_DECISION_CONFIRM) { + app->cursorPos = app->partnersSelectedCell; + return TRUE; + } else { + DrawMonSpriteAndName(app); + ChangeCellBackground(app->bgConfig, app->partnersSelectedCell, CELL_BACKGROUND_NORMAL); + + Bg_ScheduleTilemapTransfer(app->bgConfig, BG_LAYER_MAIN_3); + + app->partnersSelectedCell = 0xff; + app->partnersDecision = PARTNER_DECISION_PENDING; + app->selectionID = 0xff; + app->selectionCanceled = TRUE; + + return TRUE; + } + break; + case MCONFIRM_STATE_OPEN_YES_NO: + ChangeCellBackground(app->bgConfig, app->cursorPos, CELL_BACKGROUND_SELECTED); + Bg_ScheduleTilemapTransfer(app->bgConfig, BG_LAYER_MAIN_3); + DrawMessageWithYesNoMenu(app); + app->subState = MCONFIRM_STATE_PROCESS_YES_NO; + break; + case MCONFIRM_STATE_PROCESS_YES_NO: + switch (Menu_ProcessInput(app->yesNoMenu)) { + case MENU_NOTHING_CHOSEN: + break; + case MENU_YES: + Sound_StopEffect(SEQ_SE_CONFIRM, 0); + Sound_PlayEffect(SEQ_SE_DP_UG_020); + FreeYesNoMenu(app); + app->subState = MCONFIRM_STATE_SEND_CONFIRM_COMM; + break; + case MENU_NO: + case MENU_CANCELED: + FreeYesNoMenu(app); + app->subState = MCONFIRM_STATE_SEND_CANCELED_COMM; + break; + } + break; + case MCONFIRM_STATE_SEND_CONFIRM_COMM: + if (SendCommMessage(app, COMM_CMD_PARTNER_DECISION, PARTNER_DECISION_CONFIRM) == TRUE) { + return TRUE; + } + break; + case MCONFIRM_STATE_SEND_CANCELED_COMM: + if (SendCommMessage(app, COMM_CMD_PARTNER_DECISION, PARTNER_DECISION_CANCEL) == TRUE) { + DeselectCell(app); + app->partnersSelectedCell = 0xff; + app->selectionID = 0xff; + app->selectionCanceled = TRUE; + return TRUE; + } + break; + // These last two cases are never reached. + case 8: + CommTool_ClearReceivedTempDataAllPlayers(); + CommTiming_StartSync(104); + app->subState = 9; + break; + case 9: + if (CommTiming_IsSyncState(104) == TRUE) { + CommTool_ClearReceivedTempDataAllPlayers(); + CommTool_Init(HEAP_ID_BATTLE_HALL_APP); + app->selectionID = 0xff; + return TRUE; + } + break; + } + + return FALSE; +} + +static BOOL State_SyncBeforeExit(BattleHallApp *app) +{ + switch (app->subState) { + case 0: + CommTool_ClearReceivedTempDataAllPlayers(); + CommTiming_StartSync(104); + app->subState++; + break; + case 1: + if (CommTiming_IsSyncState(104) == TRUE) { + CommTool_ClearReceivedTempDataAllPlayers(); + return TRUE; + } + break; + } + + return FALSE; +} + +static BOOL State_FadeOutApp(BattleHallApp *app) +{ + switch (app->subState) { + case 0: + app->fadeOutDelay = 10; + app->subState++; + break; + case 1: + app->fadeOutDelay--; + + if (app->fadeOutDelay == 0) { + DrawMonSpriteAndName(app); + StartScreenFade(FADE_BOTH_SCREENS, FADE_TYPE_BRIGHTNESS_OUT, FADE_TYPE_BRIGHTNESS_OUT, COLOR_BLACK, 6, 1, HEAP_ID_BATTLE_HALL_APP); + app->subState++; + } + break; + case 2: + if (IsScreenFadeDone() == TRUE) { + return TRUE; + } + break; + } + + return FALSE; +} + +static BOOL State_CloseMessageBox(BattleHallApp *app) +{ + switch (app->subState) { + case 0: + FreeYesNoMenu(app); + BattleHallAppSprite_SetDrawFlag(app->monSprite, TRUE); + Window_EraseMessageBox(&app->windows[WINDOW_MSG_BOX], FALSE); + + app->subState++; + break; + case 1: + return TRUE; + } + + return FALSE; +} + +static void FreeAssets(BattleHallApp *app) +{ + if (app->cursorSprite != NULL) { + BattleHallAppSprite_Free(app->cursorSprite); + } + + if (app->monSprite != NULL) { + BattleHallAppSprite_Free(app->monSprite); + } + + NetworkIcon_Destroy(); + PaletteData_FreeBuffer(app->plttData, PLTTBUF_MAIN_OBJ); + PaletteData_FreeBuffer(app->plttData, PLTTBUF_MAIN_BG); + PaletteData_Free(app->plttData); + + app->plttData = NULL; + + BattleHallApp_FreeSprites(&app->spriteMan); + + MessageLoader_Free(app->msgLoader); + StringTemplate_Free(app->strTemplate); + String_Free(app->displayStr); + String_Free(app->fmtStr); + FontSpecialChars_Free(app->specialChars); + + for (int i = 0; i < 2; i++) { + String_Free(app->yesNoStrs[i]); + } + + BattleHallApp_FreeWindows(app->windows); + FreeBackgrounds(app->bgConfig); + NARC_dtor(app->narc); +} + +static void ReInitApp(BattleHallApp *app) +{ + InitGraphicsPlane(); + app->bgConfig = BgConfig_New(HEAP_ID_BATTLE_HALL_APP); + LoadAssets(app); + + if (BattleHall_CursorPosToType(app->cursorPos) == BATTLE_HALL_MON_SUMMARY) { + BattleHallAppSprite_SetAnim(app->cursorSprite, 2); + BattleHallAppSprite_SetPosition(app->cursorSprite, 128, 168); + } +} + +static void InitGraphicsPlane(void) +{ + SetVBlankCallback(NULL, NULL); + SetHBlankCallback(NULL, NULL); + + GXLayers_DisableEngineALayers(); + GXLayers_DisableEngineBLayers(); + + GX_SetVisiblePlane(0); + GXS_SetVisiblePlane(0); +} + +static void LoadAssets(BattleHallApp *app) +{ + app->narc = NARC_ctor(NARC_INDEX_RESOURCE__ENG__FRONTIER_GRAPHIC__FRONTIER_BG, HEAP_ID_BATTLE_HALL_APP); + + LoadBackgrounds(app); + InitSpriteManager(app); + + app->msgLoader = MessageLoader_Init(MSG_LOADER_LOAD_ON_DEMAND, NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_BATTLE_HALL_SCENE, HEAP_ID_BATTLE_HALL_APP); + app->strTemplate = StringTemplate_Default(HEAP_ID_BATTLE_HALL_APP); + app->displayStr = String_Init(600, HEAP_ID_BATTLE_HALL_APP); + app->fmtStr = String_Init(600, HEAP_ID_BATTLE_HALL_APP); + + for (int i = 0; i < 2; i++) { + app->yesNoStrs[i] = String_Init(32, HEAP_ID_BATTLE_HALL_APP); + } + + Font_LoadTextPalette(0, 13 * PALETTE_SIZE_BYTES, HEAP_ID_BATTLE_HALL_APP); + Font_LoadScreenIndicatorsPalette(0, 12 * PALETTE_SIZE_BYTES, HEAP_ID_BATTLE_HALL_APP); + + app->specialChars = FontSpecialChars_Init(15, 14, 0, HEAP_ID_BATTLE_HALL_APP); + + BattleHallApp_InitWindows(app->bgConfig, app->windows); + GrayOutUnselectableCells(app, app->bgConfig); + + GXLayers_TurnBothDispOn(); + + app->cursorSprite = BattleHallAppSprite_New(&app->spriteMan, 0, 1, GetCursorX(app), GetCursorY(app), NULL); + app->monSprite = BattleHallAppSprite_New(&app->spriteMan, 1, 1, 160, 160, NULL); + + BattleHallAppSprite_UpdatePalette(app->monSprite, Party_GetPokemonBySlotIndex(app->party, 0)); + + if (CommSys_IsInitialized()) { + ReserveVramForWirelessIconChars(NNS_G2D_VRAM_TYPE_2DMAIN, GX_OBJVRAMMODE_CHAR_1D_32K); + ReserveSlotsForWirelessIconPalette(NNS_G2D_VRAM_TYPE_2DMAIN); + sub_02039734(); + } + + SetVBlankCallback(VBlankCallback, app); +} + +static void LoadBackgrounds(BattleHallApp *app) +{ + SetGXBanks(); + InitBackgrounds(app->bgConfig); + + app->plttData = PaletteData_New(HEAP_ID_BATTLE_HALL_APP); + + PaletteData_AllocBuffer(app->plttData, PLTTBUF_MAIN_OBJ, PALETTE_SIZE_BYTES * SLOTS_PER_PALETTE, HEAP_ID_BATTLE_HALL_APP); + PaletteData_AllocBuffer(app->plttData, PLTTBUF_MAIN_BG, PALETTE_SIZE_BYTES * SLOTS_PER_PALETTE, HEAP_ID_BATTLE_HALL_APP); + + LoadMainScreenBackground(app, BG_LAYER_MAIN_3); + LoadPalette(); + + GXLayers_EngineAToggleLayers(GX_PLANEMASK_BG2, 0); + LoadSubScreenBackground(app, BG_LAYER_SUB_0); +} + +static void InitSpriteManager(BattleHallApp *app) +{ + BattleHallApp_InitSpriteManager(&app->spriteMan, Party_GetPokemonBySlotIndex(app->party, 0)); +} + +static void FreeBackgrounds(BgConfig *bgConfig) +{ + GXLayers_EngineAToggleLayers(GX_PLANEMASK_BG0 | GX_PLANEMASK_BG1 | GX_PLANEMASK_BG2 | GX_PLANEMASK_BG3 | GX_PLANEMASK_OBJ, FALSE); + GXLayers_EngineBToggleLayers(GX_PLANEMASK_BG0 | GX_PLANEMASK_BG1 | GX_PLANEMASK_BG2 | GX_PLANEMASK_BG3 | GX_PLANEMASK_OBJ, FALSE); + + Bg_FreeTilemapBuffer(bgConfig, BG_LAYER_MAIN_3); + Bg_FreeTilemapBuffer(bgConfig, BG_LAYER_MAIN_1); + Bg_FreeTilemapBuffer(bgConfig, BG_LAYER_MAIN_0); + Bg_FreeTilemapBuffer(bgConfig, BG_LAYER_SUB_0); + Heap_Free(bgConfig); +} + +static void VBlankCallback(void *data) +{ + BattleHallApp *app = data; + + if (app->monSummaryAppMan != NULL) { + return; + } + + if (app->plttData != NULL) { + PaletteData_CommitFadedBuffers(app->plttData); + } + + Bg_RunScheduledUpdates(app->bgConfig); + VramTransfer_Process(); + RenderOam_Transfer(); + + OS_SetIrqCheckFlag(OS_IE_V_BLANK); +} + +static void SetGXBanks(void) +{ + UnkStruct_02099F80 banks = { + GX_VRAM_BG_128_C, + GX_VRAM_BGEXTPLTT_NONE, + GX_VRAM_SUB_BG_32_H, + 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_01_AB, + GX_VRAM_TEXPLTT_01_FG + }; + + GXLayers_SetBanks(&banks); +} + +static void InitBackgrounds(BgConfig *bgConfig) +{ + GraphicsModes graphicsModes = { + GX_DISPMODE_GRAPHICS, + GX_BGMODE_0, + GX_BGMODE_0, + GX_BG0_AS_2D + }; + + SetAllGraphicsModes(&graphicsModes); + + BgTemplate bgTemplate0 = { + .x = 0, + .y = 0, + .bufferSize = 0x800, + .baseTile = 0, + .screenSize = BG_SCREEN_SIZE_256x256, + .colorMode = GX_BG_COLORMODE_16, + .screenBase = GX_BG_SCRBASE_0x0000, + .charBase = GX_BG_CHARBASE_0x04000, + .bgExtPltt = GX_BG_EXTPLTT_01, + .priority = 0, + .areaOver = 0, + .mosaic = FALSE, + }; + + Bg_InitFromTemplate(bgConfig, BG_LAYER_MAIN_0, &bgTemplate0, BG_TYPE_STATIC); + Bg_ClearTilesRange(BG_LAYER_MAIN_0, 32, 0, HEAP_ID_BATTLE_HALL_APP); + Bg_ClearTilemap(bgConfig, BG_LAYER_MAIN_0); + + BgTemplate bgTemplate1 = { + .x = 0, + .y = 0, + .bufferSize = 0x800, + .baseTile = 0, + .screenSize = BG_SCREEN_SIZE_256x256, + .colorMode = GX_BG_COLORMODE_16, + .screenBase = GX_BG_SCRBASE_0x0800, + .charBase = GX_BG_CHARBASE_0x0c000, + .bgExtPltt = GX_BG_EXTPLTT_01, + .priority = 1, + .areaOver = 0, + .mosaic = FALSE, + }; + + Bg_InitFromTemplate(bgConfig, BG_LAYER_MAIN_1, &bgTemplate1, BG_TYPE_STATIC); + Bg_ClearTilesRange(BG_LAYER_MAIN_1, 32, 0, HEAP_ID_BATTLE_HALL_APP); + Bg_ClearTilemap(bgConfig, BG_LAYER_MAIN_1); + + BgTemplate bgTemplate3 = { + .x = 0, + .y = 0, + .bufferSize = 0x800, + .baseTile = 0, + .screenSize = BG_SCREEN_SIZE_256x256, + .colorMode = GX_BG_COLORMODE_16, + .screenBase = GX_BG_SCRBASE_0x2000, + .charBase = GX_BG_CHARBASE_0x08000, + .bgExtPltt = GX_BG_EXTPLTT_01, + .priority = 2, + .areaOver = 0, + .mosaic = FALSE, + }; + + Bg_InitFromTemplate(bgConfig, BG_LAYER_MAIN_3, &bgTemplate3, BG_TYPE_STATIC); + Bg_ClearTilemap(bgConfig, BG_LAYER_MAIN_3); + + BgTemplate bgTemplateSub0 = { + .x = 0, + .y = 0, + .bufferSize = 0x800, + .baseTile = 0, + .screenSize = BG_SCREEN_SIZE_256x256, + .colorMode = GX_BG_COLORMODE_16, + .screenBase = GX_BG_SCRBASE_0x3000, + .charBase = GX_BG_CHARBASE_0x10000, + .bgExtPltt = GX_BG_EXTPLTT_01, + .priority = 0, + .areaOver = 0, + .mosaic = FALSE, + }; + + Bg_InitFromTemplate(bgConfig, BG_LAYER_SUB_0, &bgTemplateSub0, BG_TYPE_STATIC); + Bg_ClearTilemap(bgConfig, BG_LAYER_SUB_0); + + G2_SetBG0Priority(0); + GXLayers_EngineAToggleLayers(GX_PLANEMASK_BG0, TRUE); +} + +static void LoadMainScreenBackground(BattleHallApp *app, enum BgLayer bgLayer) +{ + Graphics_LoadTilesToBgLayerFromOpenNARC(app->narc, BATTLE_HALL_APP_TILES, app->bgConfig, bgLayer, 0, 0, TRUE, HEAP_ID_BATTLE_HALL_APP); + Graphics_LoadTilemapToBgLayerFromOpenNARC(app->narc, BATTLE_HALL_APP_TILEMAP, app->bgConfig, bgLayer, 0, 0, TRUE, HEAP_ID_BATTLE_HALL_APP); +} + +static void LoadPalette(void) +{ + NNSG2dPaletteData *plttData; + + void *pltt = Graphics_GetPlttData(NARC_INDEX_RESOURCE__ENG__FRONTIER_GRAPHIC__FRONTIER_BG, BATTLE_HALL_APP_PLTT, &plttData, HEAP_ID_BATTLE_HALL_APP); + + DC_FlushRange(plttData->pRawData, PALETTE_SIZE_BYTES * 6); + GX_LoadBGPltt(plttData->pRawData, 0, PALETTE_SIZE_BYTES * 6); + Heap_Free(pltt); +} + +static void LoadSubScreenBackground(BattleHallApp *app, enum BgLayer bgLayer) +{ + Graphics_LoadTilesToBgLayerFromOpenNARC(app->narc, BATTLE_FRONTIER_APP_SUB_SCREEN_TILES, app->bgConfig, bgLayer, 0, 0, TRUE, HEAP_ID_BATTLE_HALL_APP); + Graphics_LoadTilemapToBgLayerFromOpenNARC(app->narc, BATTLE_FRONTIER_APP_SUB_SCREEN_TILEMAP, app->bgConfig, bgLayer, 0, 0, TRUE, HEAP_ID_BATTLE_HALL_APP); + Graphics_LoadPaletteFromOpenNARC(app->narc, BATTLE_FRONTIER_APP_SUB_SCREEN_PLTT, PAL_LOAD_SUB_BG, 0, 0x20, HEAP_ID_BATTLE_HALL_APP); +} + +static u8 PrintMessage(BattleHallApp *app, Window *window, int messageID, u32 x, u32 y, u32 renderDelay, u8 textColor, u8 shadowColor, u8 bgColor, u8 fontID) +{ + Window_FillTilemap(window, bgColor); + MessageLoader_GetString(app->msgLoader, messageID, app->fmtStr); + StringTemplate_Format(app->strTemplate, app->displayStr, app->fmtStr); + + return Text_AddPrinterWithParamsAndColor(window, fontID, app->displayStr, x, y, renderDelay, TEXT_COLOR(textColor, shadowColor, bgColor), NULL); +} + +static u8 PrintMessageAndCopyToVRAM(BattleHallApp *app, int messageID, u8 fontID) +{ + u8 printerID = PrintMessage(app, &app->windows[WINDOW_MSG_BOX], messageID, 1, 1, TEXT_SPEED_INSTANT, 1, 2, 15, fontID); + Window_CopyToVRAM(&app->windows[WINDOW_MSG_BOX]); + + return printerID; +} + +static void InitYesNoMenu(BattleHallApp *app, Window *window, u8 numOptions) +{ + for (int i = 0; i < 2; i++) { + app->yesNoStrList[i].entry = NULL; + app->yesNoStrList[i].index = 0; + } + + app->yesNoMenuTemplate.choices = app->yesNoStrList; + app->yesNoMenuTemplate.window = window; + app->yesNoMenuTemplate.fontID = FONT_SYSTEM; + app->yesNoMenuTemplate.xSize = 1; + app->yesNoMenuTemplate.ySize = numOptions; + app->yesNoMenuTemplate.lineSpacing = 0; + app->yesNoMenuTemplate.suppressCursor = FALSE; + app->yesNoMenuTemplate.loopAround = TRUE; +} + +static void AddStringToYesNoMenu(BattleHallApp *app, u8 strIndex, u8 listIndex, int messageID) +{ + MessageLoader_GetString(app->msgLoader, messageID, app->yesNoStrs[strIndex]); + + app->yesNoStrList[strIndex].entry = app->yesNoStrs[strIndex]; + app->yesNoStrList[strIndex].index = listIndex; +} + +static void OpenYesNoMenu(BattleHallApp *app) +{ + app->yesNoMenuOpen = TRUE; + + BattleHallApp_DrawWindow(app->bgConfig, &app->windows[WINDOW_YES_NO_MENU]); + InitYesNoMenu(app, &app->windows[WINDOW_YES_NO_MENU], 2); + AddStringToYesNoMenu(app, 0, 0, BattleHallScene_Text_Yes); + AddStringToYesNoMenu(app, 1, 1, BattleHallScene_Text_No); + + app->yesNoMenu = Menu_NewAndCopyToVRAM(&app->yesNoMenuTemplate, 8, 0, 0, HEAP_ID_BATTLE_HALL_APP, PAD_BUTTON_B); +} + +static void SetStringTemplateNumber(BattleHallApp *app, u32 idx, s32 num) +{ + StringTemplate_SetNumber(app->strTemplate, idx, num, 2, PADDING_MODE_NONE, CHARSET_MODE_EN); +} + +static void PrintPokemonsName(BattleHallApp *app, Window *window, u32 x, u32 y, u8 textColor, u8 shadowColor, u8 bgColor, u8 fontID) +{ + u16 name[11]; + + Pokemon *mon = Party_GetPokemonBySlotIndex(app->party, 0); + Pokemon_GetValue(mon, MON_DATA_SPECIES_NAME, name); + Window_FillTilemap(window, bgColor); + + String *strBuf = String_Init(11, HEAP_ID_BATTLE_HALL_APP); + String_CopyChars(strBuf, name); + Text_AddPrinterWithParamsAndColor(window, fontID, strBuf, x, y, TEXT_SPEED_INSTANT, TEXT_COLOR(textColor, shadowColor, bgColor), NULL); + String_Free(strBuf); + Window_CopyToVRAM(window); +} + +static void PrintTypeStrings(BattleHallApp *app, Window *window, u8 textColor, u8 shadowColor, u8 bgColor, u8 fontID) +{ + int row, col; + + Window_FillTilemap(window, bgColor); + + MessageLoader *loader = MessageLoader_Init(MSG_LOADER_LOAD_ON_DEMAND, NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_POKEMON_TYPE_NAMES, HEAP_ID_BATTLE_HALL_APP); + String *strBuf = String_Init(11, HEAP_ID_BATTLE_HALL_APP); + + for (row = 0; row < GRID_HEIGHT; row++) { + for (col = 0; col < GRID_WIDTH; col++) { + if (BattleHall_CursorPosToType(row * GRID_WIDTH + col) != BATTLE_HALL_MON_SUMMARY) { + String_Clear(strBuf); + MessageLoader_GetString(loader, BattleHall_CursorPosToType(row * GRID_WIDTH + col), strBuf); + Text_AddPrinterWithParamsAndColor(window, fontID, strBuf, 1 + (COL_WIDTH * col), 16 + (ROW_HEIGHT * row), TEXT_SPEED_INSTANT, TEXT_COLOR(textColor, shadowColor, bgColor), NULL); + } + } + } + + String_Free(strBuf); + MessageLoader_Free(loader); + Window_CopyToVRAM(window); +} + +static void PrintRank(BattleHallApp *app, Window *window, u8 rank, u32 x, u32 y) +{ + FontSpecialChars_DrawPartyScreenHPText(app->specialChars, rank, 2, PADDING_MODE_NONE, window, x, y); + Window_ScheduleCopyToVRAM(window); +} + +static void PrintTypesRanks(BattleHallApp *app, Window *window) +{ + for (int r = 0; r < GRID_HEIGHT; r++) { + for (int c = 0; c < GRID_WIDTH; c++) { + u8 type = BattleHall_CursorPosToType(r * GRID_WIDTH + c); + + if (type != BATTLE_HALL_MON_SUMMARY && type != TYPE_MYSTERY) { + u8 v3 = r * GRID_WIDTH + c; + u8 rank = BattleHall_GetRankOfType(GetCursorPos(v3), app->typeRanks) + 1; + + if (rank > MAX_RANK) { + rank = MAX_RANK; + } + + PrintRank(app, window, rank, 18 + (COL_WIDTH * c), 4 + (ROW_HEIGHT * r)); + } + } + } +} + +static void SetupMonSummaryApp(BattleHallApp *app) +{ + app->monSummary = Heap_Alloc(HEAP_ID_BATTLE_HALL_APP, sizeof(PokemonSummary)); + memset(app->monSummary, 0, sizeof(PokemonSummary)); + + app->monSummary->monData = app->party; + app->monSummary->dataType = SUMMARY_DATA_PARTY_MON; + app->monSummary->options = app->options; + app->monSummary->mode = SUMMARY_MODE_LOCK_MOVES; + app->monSummary->monMax = Party_GetCurrentCount(app->party); + app->monSummary->monIndex = 0; + app->monSummary->move = 0; + app->monSummary->dexMode = SaveData_GetDexMode(app->saveData); + app->monSummary->showContest = PokemonSummaryScreen_ShowContestData(app->saveData); + + PokemonSummaryScreen_FlagVisiblePages(app->monSummary, sSummaryPages); + PokemonSummaryScreen_SetPlayerProfile(app->monSummary, SaveData_GetTrainerInfo(app->saveData)); +} + +static void ChangeState(BattleHallApp *app, int *state, enum BattleHallAppState nextState) +{ + app->subState = 0; + *state = nextState; +} + +static void UpdateCursorPosition(BattleHallApp *app, int _) +{ + BOOL updateMade = FALSE; + + if (JOY_NEW(PAD_KEY_LEFT)) { + if (BattleHall_CursorPosToType(app->cursorPos) != BATTLE_HALL_MON_SUMMARY) { + app->prevCursorPos = app->cursorPos; + } + + if (app->cursorPos % GRID_WIDTH == 0) { + app->cursorPos += GRID_WIDTH - 1; + } else if (BattleHall_CursorPosToType(app->cursorPos) == BATTLE_HALL_MON_SUMMARY) { + app->cursorPos = 16; + } else { + app->cursorPos--; + } + + updateMade = TRUE; + } + + if (JOY_NEW(PAD_KEY_RIGHT)) { + if (BattleHall_CursorPosToType(app->cursorPos) != BATTLE_HALL_MON_SUMMARY) { + app->prevCursorPos = app->cursorPos; + } + + if (app->cursorPos % GRID_WIDTH == GRID_WIDTH - 1) { + app->cursorPos -= GRID_WIDTH - 1; + } else if (BattleHall_CursorPosToType(app->cursorPos) == BATTLE_HALL_MON_SUMMARY) { + app->cursorPos = 19; + } else { + app->cursorPos++; + } + + updateMade = TRUE; + } + + if (JOY_NEW(PAD_KEY_UP)) { + if (BattleHall_CursorPosToType(app->cursorPos) != BATTLE_HALL_MON_SUMMARY) { + app->prevCursorPos = app->cursorPos; + } + + if (app->cursorPos < GRID_WIDTH) { + app->cursorPos += GRID_WIDTH * (GRID_HEIGHT - 1); + } else if (BattleHall_CursorPosToType(app->cursorPos) == BATTLE_HALL_MON_SUMMARY) { + if (app->prevCursorPos == 16) { + app->cursorPos = 13; + } else if (app->prevCursorPos == 19) { + app->cursorPos = 14; + } else if (app->prevCursorPos == 13 || app->prevCursorPos == 1) { + app->cursorPos = 13; + } else if (app->prevCursorPos == 14 || app->prevCursorPos == 2) { + app->cursorPos = 14; + } + } else { + app->cursorPos -= GRID_WIDTH; + } + + updateMade = TRUE; + } + + if (JOY_NEW(PAD_KEY_DOWN)) { + if (BattleHall_CursorPosToType(app->cursorPos) != BATTLE_HALL_MON_SUMMARY) { + app->prevCursorPos = app->cursorPos; + } + + if (app->cursorPos >= GRID_WIDTH * (GRID_HEIGHT - 1)) { + app->cursorPos -= GRID_WIDTH * (GRID_HEIGHT - 1); + } else if (BattleHall_CursorPosToType(app->cursorPos) == BATTLE_HALL_MON_SUMMARY) { + if (app->prevCursorPos == 16) { + app->cursorPos = 1; + } else if (app->prevCursorPos == 19) { + app->cursorPos = 2; + } else if (app->prevCursorPos == 13 || app->prevCursorPos == 1) { + app->cursorPos = 1; + } else if (app->prevCursorPos == 14 || app->prevCursorPos == 2) { + app->cursorPos = 2; + } + } else { + app->cursorPos += GRID_WIDTH; + } + + updateMade = TRUE; + } + + if (updateMade == TRUE) { + Sound_PlayEffect(SEQ_SE_CONFIRM); + BattleHallAppSprite_SetPosition(app->cursorSprite, GetCursorX(app), GetCursorY(app)); + } + + if (BattleHall_CursorPosToType(app->cursorPos) == BATTLE_HALL_MON_SUMMARY) { + BattleHallAppSprite_SetAnim(app->cursorSprite, 2); + BattleHallAppSprite_SetPosition(app->cursorSprite, 128, 168); + } else { + BattleHallAppSprite_SetAnim(app->cursorSprite, 1); + } +} + +static u16 GetCursorX(BattleHallApp *app) +{ + return (app->cursorPos % GRID_WIDTH) * COL_WIDTH + 32; +} + +static u16 GetCursorY(BattleHallApp *app) +{ + return (app->cursorPos / GRID_WIDTH) * ROW_HEIGHT + 16; +} + +static void GrayOutUnselectableCells(BattleHallApp *app, BgConfig *bgConfig) +{ + if (IsHallMatronBattleAvailable(app) == TRUE) { + for (int i = 0; i < GRID_TOTAL_CELLS - 3; i++) { + ChangeCellBackground(bgConfig, i, CELL_BACKGROUND_UNSELECTABLE); + } + } else { + for (int i = 0; i < (NUM_POKEMON_TYPES - 1); i++) { + if (BattleHall_GetRankOfType(i, app->typeRanks) >= 10) { + ChangeCellBackground(bgConfig, i, CELL_BACKGROUND_UNSELECTABLE); + } + } + + ChangeCellBackground(bgConfig, GRID_TOTAL_CELLS - 1, CELL_BACKGROUND_UNSELECTABLE); + } + + Bg_ScheduleTilemapTransfer(bgConfig, BG_LAYER_MAIN_3); +} + +static void ChangeCellBackground(BgConfig *bgConfig, u8 boxIdx, u8 background) +{ + u8 x, y, height, palette; + + if (background == CELL_BACKGROUND_NORMAL) { + palette = 0; + } else if (background == CELL_BACKGROUND_SELECTED) { + palette = 5; + } else if (background == CELL_BACKGROUND_PARTNER_SELECTED) { + palette = 4; + } else { + palette = 3; + } + + u8 width = 8; + x = (boxIdx % GRID_WIDTH) * width; + + if (boxIdx % (2 * GRID_WIDTH) < GRID_WIDTH) { + height = 5; + } else { + height = 4; + } + + if (boxIdx < GRID_WIDTH) { + y = 0; + } else if (boxIdx < GRID_WIDTH * 2) { + y = 5; + } else if (boxIdx < GRID_WIDTH * 3) { + y = 9; + } else if (boxIdx < GRID_WIDTH * 4) { + y = 14; + } else { + y = 18; + } + + Bg_ChangeTilemapRectPalette(bgConfig, BG_LAYER_MAIN_3, x, y, width, height, palette); + + // Update the color strip + if (background == 0) { + palette = 0; + width = 1; + x = (boxIdx % GRID_WIDTH) * 8; + + if (boxIdx % (2 * GRID_WIDTH) < 4) { + height = 2; + } else { + height = 3; + } + + if (boxIdx < GRID_WIDTH) { + y = 2; + } else if (boxIdx < (GRID_WIDTH * 2)) { + y = 6; + } else if (boxIdx < (GRID_WIDTH * 3)) { + y = 11; + } else if (boxIdx < (GRID_WIDTH * 4)) { + y = 15; + } else { + y = 20; + } + + if (boxIdx < 9) { + Bg_ChangeTilemapRectPalette(bgConfig, BG_LAYER_MAIN_3, x, y, width, height, 1); + } else { + Bg_ChangeTilemapRectPalette(bgConfig, BG_LAYER_MAIN_3, x, y, width, height, 2); + } + } +} + +static u8 GetCursorPos(u8 cursorPos) +{ + if (cursorPos >= 17) { + return 17; + } + + return cursorPos; +} + +static BOOL NextOpponentIsHallMatron(BattleHallApp *app) +{ + if (app->challengeType == 0) { + if (app->currentStreak == 50 || app->currentStreak == 170) { + return TRUE; + } + } + + return FALSE; +} + +static BOOL IsHallMatronBattleAvailable(BattleHallApp *app) +{ + return app->matronBattleAvailable; +} + +BOOL SendCommMessage(BattleHallApp *app, u16 cmd, u16 arg) +{ + if (!BattleFrontier_IsMultiPlayerChallenge(app->challengeType)) { + return FALSE; + } + + int commCmd; + switch (cmd) { + case COMM_CMD_DUMMY: + commCmd = 39; + DummyCreatePayload(app, cmd); + break; + case COMM_CMD_TYPE_SELECTION: + commCmd = 40; + CreateTypeSelectionPayload(app, cmd, arg); + break; + case COMM_CMD_PARTNER_DECISION: + commCmd = 41; + CreateDecisionPayload(app, cmd, arg); + break; + } + + return CommSys_SendData(commCmd, app->commPayload, 44) == TRUE; +} + +static void DummyCreatePayload(BattleHallApp *app, u16 dummy) +{ + TrainerInfo *info = SaveData_GetTrainerInfo(app->saveData); + app->commPayload[0] = dummy; +} + +void BattleHall_DummyCommCommand(int netID, int unused, void *unused2, void *unused3) +{ + if (CommSys_CurNetId() == netID) { + return; + } +} + +static void CreateTypeSelectionPayload(BattleHallApp *app, u16 cmd, u16 cursorPos) +{ + app->commPayload[0] = cmd; + app->commPayload[1] = cursorPos; + + if (CommSys_CurNetId() == 0) { + if (app->selectionID == 0xff) { + app->selectionID = cursorPos; + } + } + + app->commPayload[2] = app->selectionID; + Pokemon *mon = Party_GetPokemonBySlotIndex(app->party, 0); + app->commPayload[3] = Pokemon_GetValue(mon, MON_DATA_LEVEL, NULL); +} + +void BattleHall_HandleTypeSelectionMsg(int netID, int unused, void *data, void *context) +{ + BattleHallApp *app = context; + const u16 *payload = data; + + app->numSelectionMsgsReceived++; + + if (CommSys_CurNetId() == netID) { + return; + } + + app->partnersSelectedCell = payload[1]; + + if (CommSys_CurNetId() == 0) { + if (app->selectionID != 0xff) { + app->partnersSelectedCell = 0; + } else { + app->selectionID = app->partnersSelectedCell + (4 * 5); + } + } else { + app->selectionID = payload[2]; + } + + *app->partnersLevel = payload[3]; +} + +static void CreateDecisionPayload(BattleHallApp *app, u16 cmd, u16 decision) +{ + app->commPayload[0] = cmd; + app->commPayload[1] = decision; +} + +void BattleHall_HandlePartnerDecisionCmd(int netID, int unused, void *data, void *context) +{ + BattleHallApp *app = context; + const u16 *payload = data; + + if (CommSys_CurNetId() == netID) { + return; + } + + if (payload[1] == PARTNER_DECISION_PENDING) { + return; + } + + app->partnersDecision = payload[1]; +} + +static void FreeYesNoMenu(BattleHallApp *app) +{ + if (app->yesNoMenuOpen == TRUE) { + app->yesNoMenuOpen = FALSE; + Menu_Free(app->yesNoMenu, NULL); + Window_EraseStandardFrame(app->yesNoMenuTemplate.window, FALSE); + } +} + +static void DrawMessageWithYesNoMenu(BattleHallApp *app) +{ + + BattleHallAppSprite_SetDrawFlag(app->monSprite, FALSE); + BattleHallApp_DrawMessageBox(&app->windows[WINDOW_MSG_BOX], Options_Frame(app->options)); + StringTemplate_SetPokemonTypeName(app->strTemplate, 0, BattleHall_CursorPosToType(app->cursorPos)); + + u8 rank = BattleHall_GetRankOfType(GetCursorPos(app->cursorPos), app->typeRanks) + 1; + + if (rank > MAX_RANK) { + rank = MAX_RANK; + } + + SetStringTemplateNumber(app, 1, rank); + + int messageID = IsHallMatronBattleAvailable(app) == TRUE ? BattleHallScene_Text_BattleHallMatron : BattleHallScene_Text_ConfirmSelection; + app->printerID = PrintMessageAndCopyToVRAM(app, messageID, FONT_MESSAGE); + + BattleHallAppSprite_SetAnim(app->cursorSprite, 0); + OpenYesNoMenu(app); +} + +static void DeselectCell(BattleHallApp *app) +{ + DrawMonSpriteAndName(app); + ChangeCellBackground(app->bgConfig, app->cursorPos, CELL_BACKGROUND_NORMAL); + + Bg_ScheduleTilemapTransfer(app->bgConfig, BG_LAYER_MAIN_3); + BattleHallAppSprite_SetAnim(app->cursorSprite, 1); +} + +static void DrawMonSpriteAndName(BattleHallApp *app) +{ + BattleHallAppSprite_SetDrawFlag(app->monSprite, TRUE); + Window_EraseMessageBox(&app->windows[WINDOW_MSG_BOX], FALSE); + + PrintPokemonsName(app, &app->windows[WINDOW_MON_NAME], 0, 0, 1, 2, 0, FONT_SYSTEM); +} diff --git a/src/applications/frontier/battle_hall/sprite_manager.c b/src/applications/frontier/battle_hall/sprite_manager.c new file mode 100644 index 0000000000..0ed5b4c73d --- /dev/null +++ b/src/applications/frontier/battle_hall/sprite_manager.c @@ -0,0 +1,123 @@ +#include "applications/frontier/battle_hall/sprite_manager.h" + +#include + +#include "char_transfer.h" +#include "gx_layers.h" +#include "narc.h" +#include "narc_frontier_obj.h" +#include "pltt_transfer.h" +#include "pokemon_icon.h" +#include "render_oam.h" +#include "sprite.h" +#include "sprite_resource.h" +#include "sprite_transfer.h" +#include "sprite_util.h" + +static void InitCharPlttTransferBuffers(void); + +static const u8 sCapacities[4] = { 2, 2, 2, 2 }; + +void BattleHallApp_InitSpriteManager(BattleHallAppSpriteManager *sprites, Pokemon *mon) +{ + InitCharPlttTransferBuffers(); + NNS_G2dInitOamManagerModule(); + RenderOam_Init(0, 128, 0, 32, 0, 128, 0, 32, HEAP_ID_BATTLE_HALL_APP); + + sprites->spriteList = SpriteList_InitRendering(2, &sprites->renderer, HEAP_ID_BATTLE_HALL_APP); + + for (int i = 0; i < 4; i++) { + sprites->resourceCollection[i] = SpriteResourceCollection_New(sCapacities[i], i, HEAP_ID_BATTLE_HALL_APP); + } + + sprites->resources[0][0] = SpriteResourceCollection_AddTiles(sprites->resourceCollection[SPRITE_RESOURCE_CHAR], NARC_INDEX_RESOURCE__ENG__FRONTIER_GRAPHIC__FRONTIER_OBJ, BATTLE_HALL_APP_CURSOR_BOX_NCGR, TRUE, 0, NNS_G2D_VRAM_TYPE_2DMAIN, HEAP_ID_BATTLE_HALL_APP); + sprites->resources[0][1] = SpriteResourceCollection_AddPalette(sprites->resourceCollection[SPRITE_RESOURCE_PLTT], NARC_INDEX_RESOURCE__ENG__FRONTIER_GRAPHIC__FRONTIER_OBJ, BATTLE_HALL_APP_CURSOR_BOX_PLTT, FALSE, 0, NNS_G2D_VRAM_TYPE_2DMAIN, 1, HEAP_ID_BATTLE_HALL_APP); + sprites->resources[0][2] = SpriteResourceCollection_Add(sprites->resourceCollection[SPRITE_RESOURCE_CELL], NARC_INDEX_RESOURCE__ENG__FRONTIER_GRAPHIC__FRONTIER_OBJ, BATTLE_HALL_APP_CURSOR_BOX_NCER, TRUE, 0, SPRITE_RESOURCE_CELL, HEAP_ID_BATTLE_HALL_APP); + sprites->resources[0][3] = SpriteResourceCollection_Add(sprites->resourceCollection[SPRITE_RESOURCE_ANIM], NARC_INDEX_RESOURCE__ENG__FRONTIER_GRAPHIC__FRONTIER_OBJ, BATTLE_HALL_APP_CURSOR_BOX_NANR, TRUE, 0, SPRITE_RESOURCE_ANIM, HEAP_ID_BATTLE_HALL_APP); + + NARC *narc = NARC_ctor(NARC_INDEX_POKETOOL__ICONGRA__PL_POKE_ICON, HEAP_ID_BATTLE_HALL_APP); + + sprites->resources[1][0] = SpriteResourceCollection_AddTilesFrom(sprites->resourceCollection[SPRITE_RESOURCE_CHAR], narc, Pokemon_IconSpriteIndex(mon), FALSE, 1, NNS_G2D_VRAM_TYPE_2DMAIN, HEAP_ID_BATTLE_HALL_APP); + sprites->resources[1][1] = SpriteResourceCollection_AddPalette(sprites->resourceCollection[SPRITE_RESOURCE_PLTT], NARC_INDEX_POKETOOL__ICONGRA__PL_POKE_ICON, PokeIconPalettesFileIndex(), FALSE, 1, NNS_G2D_VRAM_TYPE_2DMAIN, 3, HEAP_ID_BATTLE_HALL_APP); + sprites->resources[1][2] = SpriteResourceCollection_AddFrom(sprites->resourceCollection[SPRITE_RESOURCE_CELL], narc, PokeIcon32KCellsFileIndex(), FALSE, 1, SPRITE_RESOURCE_CELL, HEAP_ID_BATTLE_HALL_APP); + sprites->resources[1][3] = SpriteResourceCollection_AddFrom(sprites->resourceCollection[SPRITE_RESOURCE_ANIM], narc, PokeIcon32KAnimationFileIndex(), FALSE, 1, SPRITE_RESOURCE_ANIM, HEAP_ID_BATTLE_HALL_APP); + + for (int i = 0; i < 2; i++) { + SpriteTransfer_RequestChar(sprites->resources[i][0]); + SpriteTransfer_RequestPlttWholeRange(sprites->resources[i][1]); + } + + GXLayers_EngineBToggleLayers(GX_PLANEMASK_OBJ, TRUE); + GXLayers_EngineAToggleLayers(GX_PLANEMASK_OBJ, TRUE); + NARC_dtor(narc); +} + +Sprite *BattleHallApp_InitSprite(BattleHallAppSpriteManager *spriteMan, u32 resourceID, u32 animID, u32 priority, u8 onSubScreen) +{ + SpriteResourcesHeader resourceHeader; + SpriteResourcesHeader_Init(&resourceHeader, resourceID, resourceID, resourceID, resourceID, -1, -1, FALSE, 1, spriteMan->resourceCollection[SPRITE_RESOURCE_CHAR], spriteMan->resourceCollection[SPRITE_RESOURCE_PLTT], spriteMan->resourceCollection[SPRITE_RESOURCE_CELL], spriteMan->resourceCollection[SPRITE_RESOURCE_ANIM], NULL, NULL); + + AffineSpriteListTemplate spriteTemplate; + + spriteTemplate.list = spriteMan->spriteList; + spriteTemplate.resourceData = &resourceHeader; + + spriteTemplate.position.x = 0; + spriteTemplate.position.y = 0; + spriteTemplate.position.z = 0; + spriteTemplate.affineScale.x = FX32_ONE; + spriteTemplate.affineScale.y = FX32_ONE; + spriteTemplate.affineScale.z = FX32_ONE; + spriteTemplate.affineZRotation = 0; + spriteTemplate.priority = priority; + + if (!onSubScreen) { + spriteTemplate.vramType = NNS_G2D_VRAM_TYPE_2DMAIN; + } else { + spriteTemplate.vramType = NNS_G2D_VRAM_TYPE_2DSUB; + } + + spriteTemplate.heapID = HEAP_ID_BATTLE_HALL_APP; + + if (onSubScreen == TRUE) { + spriteTemplate.position.y += FX32_CONST(192); + } + + Sprite *sprite = SpriteList_AddAffine(&spriteTemplate); + + Sprite_SetAnimateFlag(sprite, TRUE); + Sprite_SetAnimSpeed(sprite, FX32_ONE); + Sprite_SetAnim(sprite, animID); + + return sprite; +} + +void BattleHallApp_FreeSprites(BattleHallAppSpriteManager *spriteMan) +{ + for (u8 i = 0; i < 2; i++) { + SpriteTransfer_ResetCharTransfer(spriteMan->resources[i][SPRITE_RESOURCE_CHAR]); + SpriteTransfer_ResetPlttTransfer(spriteMan->resources[i][SPRITE_RESOURCE_PLTT]); + } + + for (u8 i = 0; i < 4; i++) { + SpriteResourceCollection_Delete(spriteMan->resourceCollection[i]); + } + + SpriteList_Delete(spriteMan->spriteList); + RenderOam_Free(); + CharTransfer_Free(); + PlttTransfer_Free(); +} + +static void InitCharPlttTransferBuffers(void) +{ + CharTransferTemplate transferTemplate = { + 3, 2048, 2048, HEAP_ID_BATTLE_HALL_APP + }; + + CharTransfer_InitWithVramModes(&transferTemplate, GX_OBJVRAMMODE_CHAR_1D_32K, GX_OBJVRAMMODE_CHAR_1D_32K); + + PlttTransfer_Init(4, HEAP_ID_BATTLE_HALL_APP); + CharTransfer_ClearBuffers(); + PlttTransfer_Clear(); +} diff --git a/src/applications/frontier/battle_hall/sprites.c b/src/applications/frontier/battle_hall/sprites.c new file mode 100644 index 0000000000..07f59e999c --- /dev/null +++ b/src/applications/frontier/battle_hall/sprites.c @@ -0,0 +1,63 @@ +#include "applications/frontier/battle_hall/sprites.h" + +#include + +#include "applications/frontier/battle_hall/sprite_manager.h" + +#include "heap.h" +#include "pokemon_icon.h" +#include "sprite.h" + +BattleHallAppSprite *BattleHallAppSprite_New(BattleHallAppSpriteManager *spriteMan, u32 resourceID, u32 animID, u16 x, u16 y, const u8 *null) +{ + BattleHallAppSprite *sprite = Heap_Alloc(HEAP_ID_BATTLE_HALL_APP, sizeof(BattleHallAppSprite)); + memset(sprite, 0, sizeof(BattleHallAppSprite)); + + sprite->isAlwaysNull = null; + sprite->sprite = BattleHallApp_InitSprite(spriteMan, resourceID, animID, 0, FALSE); + + VecFx32 position; + position.x = x * FX32_ONE; + position.y = y * FX32_ONE; + + Sprite_SetPosition(sprite->sprite, &position); + + return sprite; +} + +void *BattleHallAppSprite_Free(BattleHallAppSprite *sprite) +{ + Sprite_Delete(sprite->sprite); + Heap_Free(sprite); + return NULL; +} + +void BattleHallAppSprite_SetDrawFlag(BattleHallAppSprite *sprite, BOOL draw) +{ + Sprite_SetDrawFlag(sprite->sprite, draw); +} + +void BattleHallAppSprite_SetPosition(BattleHallAppSprite *sprite, u16 x, u16 y) +{ + if (sprite->isAlwaysNull != NULL) { + Sprite_SetAnimNoRestart(sprite->sprite, sprite->isAlwaysNull[0]); + } + + VecFx32 position = *Sprite_GetPosition(sprite->sprite); + + position.x = x * FX32_ONE; + position.y = y * FX32_ONE; + + Sprite_SetPosition(sprite->sprite, &position); +} + +void BattleHallAppSprite_SetAnim(BattleHallAppSprite *sprite, u32 animID) +{ + Sprite_SetAnimSpeed(sprite->sprite, FX32_ONE); + Sprite_SetAnimNoRestart(sprite->sprite, animID); +} + +void BattleHallAppSprite_UpdatePalette(BattleHallAppSprite *sprite, Pokemon *mon) +{ + Sprite_SetExplicitPaletteOffsetAutoAdjust(sprite->sprite, Pokemon_IconPaletteIndex(mon)); +} diff --git a/src/applications/frontier/battle_hall/windows.c b/src/applications/frontier/battle_hall/windows.c new file mode 100644 index 0000000000..34bc6e213b --- /dev/null +++ b/src/applications/frontier/battle_hall/windows.c @@ -0,0 +1,41 @@ +#include "applications/frontier/battle_hall/windows.h" + +#include + +#include "bg_window.h" +#include "render_window.h" + +void BattleHallApp_InitWindows(BgConfig *bgConfig, Window *windows) +{ + static const WindowTemplate sWinTemplates[] = { + { BG_LAYER_MAIN_0, 2, 19, 27, 4, 12, 1 }, + { BG_LAYER_MAIN_0, 24, 13, 7, 4, 13, 109 }, + { BG_LAYER_MAIN_0, 10, 20, 9, 2, 13, 137 }, + { BG_LAYER_MAIN_1, 1, 0, 31, 22, 13, 1 } + }; + + for (u8 i = 0; i < 4; i++) { + Window_AddFromTemplate(bgConfig, &windows[i], &sWinTemplates[i]); + Window_FillTilemap(&windows[i], 0); + } +} + +void BattleHallApp_FreeWindows(Window *windows) +{ + for (u16 i = 0; i < 4; i++) { + Window_Remove(&windows[i]); + } +} + +void BattleHallApp_DrawWindow(BgConfig *bgConfig, Window *window) +{ + LoadStandardWindowGraphics(bgConfig, BG_LAYER_MAIN_0, 1015, 11, STANDARD_WINDOW_SYSTEM, HEAP_ID_BATTLE_HALL_APP); + Window_DrawStandardFrame(window, TRUE, 1015, 11); +} + +void BattleHallApp_DrawMessageBox(Window *window, int frame) +{ + LoadMessageBoxGraphics(window->bgConfig, Window_GetBgLayer(window), 985, 10, frame, HEAP_ID_BATTLE_HALL_APP); + Window_FillTilemap(window, 15); + Window_DrawMessageBoxWithScrollCursor(window, FALSE, 985, 10); +} diff --git a/src/meson.build b/src/meson.build index 091372aec8..c65e6c322a 100644 --- a/src/meson.build +++ b/src/meson.build @@ -965,10 +965,10 @@ pokeplatinum_c = files( 'overlay105/ov105_02245E54.c', 'overlay105/ov105_02245FB8.c', 'overlay105/ov105_02246214.c', - 'overlay106/ov106_02241AE0.c', - 'overlay106/ov106_02243310.c', - 'overlay106/ov106_022435FC.c', - 'overlay106/ov106_022436E0.c', + 'applications/frontier/battle_hall/main.c', + 'applications/frontier/battle_hall/sprite_manager.c', + 'applications/frontier/battle_hall/sprites.c', + 'applications/frontier/battle_hall/windows.c', 'overlay107/ov107_02241AE0.c', 'overlay107/ov107_02245EB0.c', 'overlay107/ov107_02249604.c', diff --git a/src/overlay104/ov104_0222DCE0.c b/src/overlay104/ov104_0222DCE0.c index 442b649c79..847fd3fb54 100644 --- a/src/overlay104/ov104_0222DCE0.c +++ b/src/overlay104/ov104_0222DCE0.c @@ -580,9 +580,9 @@ void ov104_0222E4BC(u8 param0, u16 param1, u16 param2, u16 *param3, FrontierPoke return; } -void ov104_0222E5D0(StringTemplate *param0, u32 param1) +void BattleFrontier_SetPartnerInStrTemplate(StringTemplate *template, u32 idx) { - StringTemplate_SetPlayerName(param0, param1, CommInfo_TrainerInfo(CommSys_CurNetId() ^ 1)); + StringTemplate_SetPlayerName(template, idx, CommInfo_TrainerInfo(CommSys_CurNetId() ^ 1)); return; } diff --git a/src/overlay104/ov104_0222EA90.c b/src/overlay104/ov104_0222EA90.c index 5559d7bc5a..778711d68a 100644 --- a/src/overlay104/ov104_0222EA90.c +++ b/src/overlay104/ov104_0222EA90.c @@ -12,49 +12,10 @@ #include "bg_window.h" #include "gx_layers.h" #include "heap.h" +#include "narc_frontier_bg.h" #include "res/field/frontier_scripts/fr_script.naix.h" -// TODO Replace and remove these once frontier_bg.narc is unpacked -#define BATTLE_FACTORY_TILES 0 -#define BATTLE_FACTORY_BATTLE_ROOM_TILEMAP 1 -#define BATTLE_FACTORY_CORRIDOR_TILEMAP 2 -#define BATTLE_FACTORY_CORRIDOR_FLOOR_TILEMAP 3 -#define BATTLE_HALL_BATTLE_ROOM_TILES 14 -#define BATTLE_HALL_CORRIDOR_TILES 16 -#define BATTLE_HALL_CORRIDOR_TILEMAP 17 -#define BATTLE_HALL_BATTLE_ROOM_LIGHTS_TILES 19 -#define BATTLE_HALL_BATTLE_ROOM_TILEMAP 20 -#define BATTLE_HALL_BATTLE_ROOM_LIGHTS_TILEMAP 22 -#define BATTLE_CASTLE_CORRIDOR_TILES 25 -#define BATTLE_CASTLE_CORRIDOR_TILEMAP 26 -#define BATTLE_CASTLE_BATTLE_ROOM_TILES 29 -#define BATTLE_CASTLE_BATTLE_ROOM_TILEMAP 30 -#define BATTLE_CASTLE_BATTLE_ROOM_CURTAINS_TILEMAP 33 -#define BATTLE_TOWER_TILES 45 -#define BATTLE_TOWER_MULTI_BATTLE_ROOM_TILEMAP 46 -#define BATTLE_TOWER_MULTI_CORRIDOR_TILEMAP 47 -#define BATTLE_TOWER_MULTI_CORRIDOR_FG_TILEMAP 48 -#define BATTLE_TOWER_BATTLE_ROOM_TILEMAP 49 -#define BATTLE_TOWER_CORRIDOR_TILEMAP 50 -#define BATTLE_TOWER_CORRIDOR_FG_TILEMAP 51 -#define BATTLE_ARCADE_BATTLE_ROOM_TILEMAP 52 -#define BATTLE_ARCADE_BATTLE_ROOM_TILES 54 -#define BATTLE_ARCADE_CORRIDOR_TILEMAP 55 -#define BATTLE_ARCADE_CORRIDOR_TILES 56 -#define BATTLE_ARCADE_BATTLE_ROOM_HP_SCREEN_TILEMAP 57 -#define BATTLE_ARCADE_BATTLE_ROOM_HP_SCREEN_TILES 89 -#define BATTLE_FACTORY_PLTT 129 -#define BATTLE_HALL_BATTLE_ROOM_PLTT 131 -#define BATTLE_HALL_CORRIDOR_PLTT 132 -#define BATTLE_HALL_BATTLE_ROOM_LIGHTS_PLTT 133 -#define BATTLE_CASTLE_CORRIDOR_PLTT 135 -#define BATTLE_CASTLE_BATTLE_ROOM_PLTT 140 -#define BATTLE_TOWER_PLTT 141 -#define BATTLE_ARCADE_BATTLE_ROOM_PLTT 142 -#define BATTLE_ARCADE_CORRIDOR_PLTT 143 -#define BATTLE_ARCADE_BATTLE_ROOM_HP_SCREEN_PLTT 169 - typedef void (*UnkFuncPtr_ov104_0223F394)(UnkStruct_ov104_0223C4CC *, void **); typedef struct FrontierScene { diff --git a/src/overlay104/ov104_0222FBE4.c b/src/overlay104/ov104_0222FBE4.c index e0c90553f0..cf8a18ef06 100644 --- a/src/overlay104/ov104_0222FBE4.c +++ b/src/overlay104/ov104_0222FBE4.c @@ -436,7 +436,7 @@ const FrontierScrCmdFunc Unk_ov104_0223F674[] = { FrontierScrCmd_8B, FrontierScrCmd_8C, FrontierScrCmd_8D, - FrontierScrCmd_8E, + FrontierScrCmd_OpenBattleHallApp, FrontierScrCmd_8F, FrontierScrCmd_90, FrontierScrCmd_91, diff --git a/src/overlay104/ov104_02234838.c b/src/overlay104/ov104_02234838.c index 78dfc6dcfa..0c4375d699 100644 --- a/src/overlay104/ov104_02234838.c +++ b/src/overlay104/ov104_02234838.c @@ -3,6 +3,7 @@ #include "struct_decls/struct_0202440C_decl.h" +#include "applications/frontier/battle_hall/main.h" #include "overlay104/frontier_script_context.h" #include "overlay104/ov104_0222DCE0.h" #include "overlay104/ov104_0222FBE4.h" @@ -13,7 +14,6 @@ #include "overlay104/struct_ov104_022320B4_t.h" #include "overlay104/struct_ov104_02235208.h" #include "overlay104/struct_ov104_0223B5C0.h" -#include "overlay106/ov106_02241AE0.h" #include "savedata/save_table.h" #include "field_battle_data_transfer.h" @@ -29,7 +29,7 @@ #include "constdata/const_020EA358.h" -FS_EXTERN_OVERLAY(overlay106); +FS_EXTERN_OVERLAY(battle_hall_app); #include @@ -72,26 +72,21 @@ BOOL FrontierScrCmd_8D(FrontierScriptContext *param0) return 0; } -BOOL FrontierScrCmd_8E(FrontierScriptContext *param0) +BOOL FrontierScrCmd_OpenBattleHallApp(FrontierScriptContext *ctx) { - int v0; - Party *v1; - Pokemon *v2; - UnkStruct_ov104_0223B5C0 *v3; - UnkStruct_ov104_02235208 *v4; - UnkStruct_ov104_02230BE4 *v5 = sub_0209B970(param0->unk_00->unk_00); + UnkStruct_ov104_02230BE4 *v5 = sub_0209B970(ctx->unk_00->unk_00); - FS_EXTERN_OVERLAY(overlay106); + FS_EXTERN_OVERLAY(battle_hall_app); - static const ApplicationManagerTemplate v6 = { - ov106_02241AE0, - ov106_02241B9C, - ov106_02241CF0, - FS_OVERLAY_ID(overlay106) + static const ApplicationManagerTemplate sBattleHallAppTemplate = { + BattleHallApp_Init, + BattleHallApp_Main, + BattleHallApp_Exit, + FS_OVERLAY_ID(battle_hall_app) }; - v3 = sub_0209B978(param0->unk_00->unk_00); - v4 = Heap_Alloc(HEAP_ID_FIELD2, sizeof(UnkStruct_ov104_02235208)); + UnkStruct_ov104_0223B5C0 *v3 = sub_0209B978(ctx->unk_00->unk_00); + UnkStruct_ov104_02235208 *v4 = Heap_Alloc(HEAP_ID_FIELD2, sizeof(UnkStruct_ov104_02235208)); MI_CpuClear8(v4, sizeof(UnkStruct_ov104_02235208)); @@ -99,27 +94,27 @@ BOOL FrontierScrCmd_8E(FrontierScriptContext *param0) v4->unk_04 = v3->unk_04; v4->unk_10 = v3; v4->unk_08 = &v3->unk_704[v3->unk_04][0]; - v4->unk_0C = v3->unk_264; + v4->party = v3->unk_264; v4->unk_18 = v3->unk_08; v4->unk_05 = v3->unk_6F5; v4->unk_14 = &v3->unk_D84[0]; - Party_Init(v4->unk_0C); + Party_Init(v4->party); - v1 = SaveData_GetParty(v5->saveData); - v2 = Party_GetPokemonBySlotIndex(v1, v3->unk_260[0]); + Party *party = SaveData_GetParty(v5->saveData); + Pokemon *mon = Party_GetPokemonBySlotIndex(party, v3->unk_260[0]); - Party_AddPokemon(v4->unk_0C, v2); + Party_AddPokemon(v4->party, mon); if (v4->unk_04 == 1) { - v2 = Party_GetPokemonBySlotIndex(v1, v3->unk_260[1]); - Party_AddPokemon(v4->unk_0C, v2); + mon = Party_GetPokemonBySlotIndex(party, v3->unk_260[1]); + Party_AddPokemon(v4->party, mon); } else if ((v4->unk_04 == 2) || (v4->unk_04 == 3)) { - Party_AddPokemon(v4->unk_0C, v3->unk_D8C); + Party_AddPokemon(v4->party, v3->unk_D8C); } - sub_0209B988(param0->unk_00->unk_00, &v6, v4, 0, ov104_02234A08); - return 1; + sub_0209B988(ctx->unk_00->unk_00, &sBattleHallAppTemplate, v4, 0, ov104_02234A08); + return TRUE; } BOOL FrontierScrCmd_8F(FrontierScriptContext *param0) @@ -238,7 +233,7 @@ BOOL FrontierScrCmd_91(FrontierScriptContext *param0) } break; case 28: - v4 = sub_020301E0(v3->unk_6F5, &v3->unk_704[v3->unk_04][0]); + v4 = BattleHall_GetRankOfType(v3->unk_6F5, &v3->unk_704[v3->unk_04][0]); if (v4 < 10) { sub_02030204(v3->unk_6F5, &v3->unk_704[v3->unk_04][0], v4 + 1); @@ -248,7 +243,7 @@ BOOL FrontierScrCmd_91(FrontierScriptContext *param0) sub_0209BA80(v3); break; case 30: - *v11 = ov104_0223B5B0(v3->unk_04); + *v11 = BattleFrontier_IsMultiPlayerChallenge(v3->unk_04); break; case 17: *v11 = v3->unk_04; @@ -265,7 +260,7 @@ BOOL FrontierScrCmd_91(FrontierScriptContext *param0) ov104_0222E278(&(v3->unk_40[1]), v3->unk_18[v3->unk_05 * 2 + 1], HEAP_ID_FIELD2, 178); break; case 33: - *v11 = sub_020301E0(v3->unk_6F5, &v3->unk_704[v3->unk_04][0]); + *v11 = BattleHall_GetRankOfType(v3->unk_6F5, &v3->unk_704[v3->unk_04][0]); break; case 34: *v11 = ov104_02235578(v3); diff --git a/src/overlay104/ov104_02234DB4.c b/src/overlay104/ov104_02234DB4.c index 039ba0b4bf..2093338aa1 100644 --- a/src/overlay104/ov104_02234DB4.c +++ b/src/overlay104/ov104_02234DB4.c @@ -129,7 +129,7 @@ UnkStruct_ov104_0223B5C0 *ov104_02234DB4(SaveData *saveData, u16 param1, u8 para } } - if (ov104_0223B5B0(v10->unk_04) == 1) { + if (BattleFrontier_IsMultiPlayerChallenge(v10->unk_04) == 1) { ov104_0222E630(v10->saveData); } @@ -160,7 +160,7 @@ static void ov104_022350B8(UnkStruct_ov104_0223B5C0 *param0) v1 = 2; } - v0 = sub_020301E0(param0->unk_6F5, ¶m0->unk_704[param0->unk_04][0]); + v0 = BattleHall_GetRankOfType(param0->unk_6F5, ¶m0->unk_704[param0->unk_04][0]); param0->unk_07 = ov104_02235704(param0); ov104_0223AF58(param0->unk_6F5, v1, v0, param0->unk_05, param0->unk_18); @@ -215,7 +215,7 @@ void ov104_022351CC(UnkStruct_ov104_0223B5C0 *param0, void *param1) param0->unk_6F2 = ov104_02235208(param1, 0); param0->unk_6F5 = param0->unk_6F2; - param0->unk_6F4 = ov104_0223B5A4(param0->unk_6F2); + param0->unk_6F4 = BattleHall_CursorPosToType(param0->unk_6F2); if (param0->unk_6F5 >= 17) { param0->unk_6F5 = 18 - 1; @@ -300,7 +300,7 @@ void ov104_0223526C(UnkStruct_ov104_0223B5C0 *param0, u8 param1) } for (v0 = 0; v0 < 18; v0++) { - v1[0] = sub_020301E0(v0, ¶m0->unk_704[param0->unk_04][0]); + v1[0] = BattleHall_GetRankOfType(v0, ¶m0->unk_704[param0->unk_04][0]); ov104_02235620(param0->saveData, param0->unk_04, v0, v1[0]); } @@ -464,7 +464,7 @@ void ov104_022356A0(UnkStruct_ov104_0223B5C0 *param0) if (param0->unk_04 != 2) { for (v1 = 0; v1 < (18 - 1); v1++) { - v0 = sub_020301E0(v1, ¶m0->unk_704[param0->unk_04][0]); + v0 = BattleHall_GetRankOfType(v1, ¶m0->unk_704[param0->unk_04][0]); if (v0 < 10) { break; @@ -497,7 +497,7 @@ static u16 ov104_02235704(UnkStruct_ov104_0223B5C0 *param0) u8 v5; float v6, v7; - v5 = sub_020301E0(param0->unk_6F5, ¶m0->unk_704[param0->unk_04][0]); + v5 = BattleHall_GetRankOfType(param0->unk_6F5, ¶m0->unk_704[param0->unk_04][0]); v2 = ov104_0223B64C(param0); if (param0->unk_04 == 2) { @@ -521,7 +521,7 @@ static u16 ov104_02235704(UnkStruct_ov104_0223B5C0 *param0) if (v3 == param0->unk_6F5) { v7 += 1.0; } else { - if (sub_020301E0(v3, ¶m0->unk_704[param0->unk_04][0]) > 0) { + if (BattleHall_GetRankOfType(v3, ¶m0->unk_704[param0->unk_04][0]) > 0) { v7 += 1.0; } } diff --git a/src/overlay104/ov104_0223AF58.c b/src/overlay104/ov104_0223AF58.c index 76d678756d..035c38079e 100644 --- a/src/overlay104/ov104_0223AF58.c +++ b/src/overlay104/ov104_0223AF58.c @@ -38,14 +38,12 @@ FieldBattleDTO *ov104_0223B250(UnkStruct_ov104_0223B5C0 *param0, UnkStruct_ov104 static u32 ov104_0223B4D4(u8 param0); static void ov104_0223B518(FrontierPokemonDataDTO *param0, u8 param1, u16 param2, u16 param3[], int param4, int param5, int param6); static u32 ov104_0223B57C(UnkStruct_ov104_0223B5C0 *param0, u8 param1); -u8 ov104_0223B5A4(u8 param0); u8 ov104_0223B5C0(UnkStruct_ov104_0223B5C0 *param0); static u8 ov104_0223B5F0(u8 param0); static u16 ov104_0223B604(UnkStruct_ov104_0223B5C0 *param0, u8 param1, u8 param2); static u16 ov104_0223B644(u8 param0); u16 ov104_0223B64C(UnkStruct_ov104_0223B5C0 *param0); static BOOL ov104_0223B4A4(UnkStruct_ov104_0223B5C0 *param0, u8 param1); -BOOL ov104_0223B5B0(u8 param0); static const u16 Unk_ov104_0224041C[10][8] = { { 0x2, 0x3, 0x14, 0x15, 0x25, 0x24, 0x16, 0x1C }, @@ -1596,7 +1594,7 @@ FieldBattleDTO *ov104_0223B250(UnkStruct_ov104_0223B5C0 *param0, UnkStruct_ov104 ov104_0222E284(v8, &v10, v5, 1, 11); Party_InitWithCapacity(v8->parties[1], v5); - v7 = sub_020301E0(param0->unk_6F5, ¶m0->unk_704[param0->unk_04][0]); + v7 = BattleHall_GetRankOfType(param0->unk_6F5, ¶m0->unk_704[param0->unk_04][0]); if (param0->unk_04 == 2) { v7 = (10 - 1); @@ -1743,43 +1741,37 @@ static u32 ov104_0223B57C(UnkStruct_ov104_0223B5C0 *param0, u8 param1) return v1; } -static const u8 Unk_ov104_02241244[20] = { - 0x0, - 0xA, - 0xB, - 0xD, - 0xC, - 0xF, - 0x1, - 0x3, - 0x4, - 0x2, - 0xE, - 0x6, - 0x5, - 0x7, - 0x10, - 0x11, - 0x8, - 0xfe, - 0xfe, - 0x9 +static const u8 sBattleHallAppGridOrder[20] = { + TYPE_NORMAL, + TYPE_FIRE, + TYPE_WATER, + TYPE_ELECTRIC, + TYPE_GRASS, + TYPE_ICE, + TYPE_FIGHTING, + TYPE_POISON, + TYPE_GROUND, + TYPE_FLYING, + TYPE_PSYCHIC, + TYPE_BUG, + TYPE_ROCK, + TYPE_GHOST, + TYPE_DRAGON, + TYPE_DARK, + TYPE_STEEL, + BATTLE_HALL_MON_SUMMARY, + BATTLE_HALL_MON_SUMMARY, + TYPE_MYSTERY }; -u8 ov104_0223B5A4(u8 param0) +u8 BattleHall_CursorPosToType(u8 cursorPos) { - return Unk_ov104_02241244[param0]; + return sBattleHallAppGridOrder[cursorPos]; } -BOOL ov104_0223B5B0(u8 param0) +BOOL BattleFrontier_IsMultiPlayerChallenge(u8 challengeMode) { - switch (param0) { - case 2: - case 3: - return 1; - } - - return 0; + return challengeMode == 2 || challengeMode == 3; } u8 ov104_0223B5C0(UnkStruct_ov104_0223B5C0 *param0) @@ -1857,7 +1849,7 @@ u16 ov104_0223B64C(UnkStruct_ov104_0223B5C0 *param0) return v3; } } else { - if (ov104_0223B5B0(param0->unk_04) == 1) { + if (BattleFrontier_IsMultiPlayerChallenge(param0->unk_04) == 1) { if (v2 > param0->unk_D84[0]) { return v2; } else { diff --git a/src/overlay105/ov105_02241AE0.c b/src/overlay105/ov105_02241AE0.c index d508155f21..1c7850b58f 100644 --- a/src/overlay105/ov105_02241AE0.c +++ b/src/overlay105/ov105_02241AE0.c @@ -2076,7 +2076,7 @@ static BOOL ov105_02244424(UnkStruct_ov105_02241FF4 *param0) param0->unk_310 = NULL; } - ov104_0222E5D0(param0->unk_20, 0); + BattleFrontier_SetPartnerInStrTemplate(param0->unk_20, 0); v1 = Party_GetPokemonBySlotIndex(param0->unk_31C, 2 + param0->unk_324[0]); v2 = Pokemon_GetBoxPokemon(v1); diff --git a/src/overlay106/ov106_02241AE0.c b/src/overlay106/ov106_02241AE0.c deleted file mode 100644 index 4a1bc21cc2..0000000000 --- a/src/overlay106/ov106_02241AE0.c +++ /dev/null @@ -1,1660 +0,0 @@ -#include "overlay106/ov106_02241AE0.h" - -#include -#include - -#include "struct_defs/struct_02099F80.h" - -#include "applications/pokemon_summary_screen/main.h" -#include "overlay104/ov104_0222DCE0.h" -#include "overlay104/ov104_0223AF58.h" -#include "overlay104/struct_ov104_02235208.h" -#include "overlay106/ov106_02243310.h" -#include "overlay106/ov106_022435FC.h" -#include "overlay106/ov106_022436E0.h" -#include "overlay106/struct_ov106_02243118_decl.h" -#include "overlay106/struct_ov106_02243310.h" -#include "overlay106/struct_ov106_02243650_decl.h" - -#include "bg_window.h" -#include "communication_system.h" -#include "dexmode_checker.h" -#include "font.h" -#include "font_special_chars.h" -#include "game_options.h" -#include "game_overlay.h" -#include "graphics.h" -#include "gx_layers.h" -#include "heap.h" -#include "menu.h" -#include "message.h" -#include "narc.h" -#include "overlay_manager.h" -#include "palette.h" -#include "party.h" -#include "pokemon.h" -#include "render_oam.h" -#include "render_window.h" -#include "save_player.h" -#include "savedata.h" -#include "screen_fade.h" -#include "sound_playback.h" -#include "sprite.h" -#include "sprite_util.h" -#include "string_gf.h" -#include "string_list.h" -#include "string_template.h" -#include "system.h" -#include "text.h" -#include "trainer_info.h" -#include "unk_02030108.h" -#include "unk_020363E8.h" -#include "unk_020393C8.h" -#include "unk_0209BA80.h" -#include "vram_transfer.h" - -#include "constdata/const_020F410C.h" - -FS_EXTERN_OVERLAY(overlay104); - -struct UnkStruct_ov106_02243118_t { - ApplicationManager *unk_00; - ApplicationManager *unk_04; - u8 unk_08; - u8 unk_09; - u8 unk_0A; - u8 unk_0B; - u8 unk_0C; - u8 unk_0D; - u8 unk_0E; - u8 unk_0F; - u16 unk_10; - u16 unk_12; - u16 unk_14; - u8 unk_16; - u8 unk_17; - u8 unk_18; - u8 unk_19; - u8 unk_1A; - u8 unk_1B; - u16 unk_1C; - u8 unk_1E; - u8 unk_1F; - MessageLoader *unk_20; - StringTemplate *unk_24; - String *unk_28; - String *unk_2C; - String *unk_30[2]; - u16 unk_38[8]; - BgConfig *unk_48; - Window unk_4C[4]; - MenuTemplate unk_8C; - Menu *unk_98; - StringList unk_9C[2]; - PaletteData *unk_AC; - FontSpecialCharsContext *unk_B0; - Options *options; - SaveData *saveData; - PokemonSummary *unk_BC; - UnkStruct_ov106_02243310 unk_C0; - UnkStruct_ov106_02243650 *unk_280; - UnkStruct_ov106_02243650 *unk_284; - int unk_288; - u16 *unk_28C; - Party *unk_290; - u8 *unk_294; - u16 *unk_298; - NARC *unk_29C; - u16 unk_2A0[44]; - u8 unk_2F8; - u8 unk_2F9; - u8 unk_2FA; - u32 unk_2FC; -}; - -int ov106_02241AE0(ApplicationManager *appMan, int *param1); -int ov106_02241B9C(ApplicationManager *appMan, int *param1); -int ov106_02241CF0(ApplicationManager *appMan, int *param1); -static BOOL ov106_02241D28(UnkStruct_ov106_02243118 *param0); -static BOOL ov106_02241E14(UnkStruct_ov106_02243118 *param0); -static void ov106_02241DD4(UnkStruct_ov106_02243118 *param0); -static BOOL ov106_02241E5C(UnkStruct_ov106_02243118 *param0); -static BOOL ov106_02242108(UnkStruct_ov106_02243118 *param0); -static BOOL ov106_0224230C(UnkStruct_ov106_02243118 *param0); -static BOOL ov106_02242344(UnkStruct_ov106_02243118 *param0); -static BOOL ov106_022423AC(UnkStruct_ov106_02243118 *param0); -static void ov106_022423E8(UnkStruct_ov106_02243118 *param0); -static void ov106_0224248C(UnkStruct_ov106_02243118 *param0); -static void ov106_022424C8(void); -static void ov106_02242500(UnkStruct_ov106_02243118 *param0); -static void ov106_02242688(UnkStruct_ov106_02243118 *param0); -static void ov106_0224262C(UnkStruct_ov106_02243118 *param0); -static void ov106_022426A4(BgConfig *param0); -static void ov106_022426E0(void *param0); -static void ov106_0224271C(void); -static void ov106_0224273C(BgConfig *param0); -static void ov106_0224283C(UnkStruct_ov106_02243118 *param0, u32 param1); -static void ov106_02242884(void); -static void ov106_022428B8(UnkStruct_ov106_02243118 *param0, u32 param1); -static u8 ov106_02242918(UnkStruct_ov106_02243118 *param0, Window *param1, int param2, u32 param3, u32 param4, u32 param5, u8 param6, u8 param7, u8 param8, u8 param9); -static u8 ov106_02242978(UnkStruct_ov106_02243118 *param0, int param1, u8 param2); -static void ov106_022429B0(UnkStruct_ov106_02243118 *param0, Window *param1, u8 param2); -static void ov106_02242A28(UnkStruct_ov106_02243118 *param0, u8 param1, u8 param2, int param3); -static void ov106_02242A54(UnkStruct_ov106_02243118 *param0); -static void ov106_02242AAC(UnkStruct_ov106_02243118 *param0, u32 param1, s32 param2); -static void ov106_02242AC4(UnkStruct_ov106_02243118 *param0, Window *param1, u32 param2, u32 param3, u8 param4, u8 param5, u8 param6, u8 param7); -static void ov106_02242B38(UnkStruct_ov106_02243118 *param0, Window *param1, u8 param2, u8 param3, u8 param4, u8 param5); -static void ov106_02242C04(UnkStruct_ov106_02243118 *param0, Window *param1, u8 param2, u32 param3, u32 param4); -static void ov106_02242C2C(UnkStruct_ov106_02243118 *param0, Window *param1); -static void ov106_02242CA4(UnkStruct_ov106_02243118 *param0); -static void ov106_02242D5C(UnkStruct_ov106_02243118 *param0, int *param1, int param2); -static void ov106_02242D64(UnkStruct_ov106_02243118 *param0, int param1); -static u16 ov106_02242F24(UnkStruct_ov106_02243118 *param0); -static u16 ov106_02242F3C(UnkStruct_ov106_02243118 *param0); -static void ov106_02242FAC(BgConfig *param0, u8 param1, u8 param2); -static void ov106_02242F4C(UnkStruct_ov106_02243118 *param0, BgConfig *param1); -static u8 ov106_02243090(u8 param0); -static BOOL ov106_02243098(UnkStruct_ov106_02243118 *param0); -static BOOL ov106_022430B0(UnkStruct_ov106_02243118 *param0); -BOOL ov106_022430B4(UnkStruct_ov106_02243118 *param0, u16 param1, u16 param2); -void ov106_02243118(UnkStruct_ov106_02243118 *param0, u16 param1); -void ov106_02243130(int param0, int param1, void *param2, void *param3); -void ov106_0224313C(UnkStruct_ov106_02243118 *param0, u16 param1, u16 param2); -void ov106_02243180(int param0, int param1, void *param2, void *param3); -void ov106_022431D4(UnkStruct_ov106_02243118 *param0, u16 param1, u16 param2); -void ov106_022431E0(int param0, int param1, void *param2, void *param3); -static void ov106_02243200(UnkStruct_ov106_02243118 *param0); -static void ov106_02243224(UnkStruct_ov106_02243118 *param0); -static void ov106_022432AC(UnkStruct_ov106_02243118 *param0); -static void ov106_022432D4(UnkStruct_ov106_02243118 *param0); - -static const u8 Unk_ov106_02243798[] = { - 0x0, - 0x1, - 0x2, - 0x4, - 0x3, - 0x5, - 0x6, - 0x7, - 0x8 -}; - -int ov106_02241AE0(ApplicationManager *appMan, int *param1) -{ - int v0; - UnkStruct_ov106_02243118 *v1; - UnkStruct_ov104_02235208 *v2; - - Overlay_LoadByID(FS_OVERLAY_ID(overlay104), 2); - ov106_022424C8(); - Heap_Create(HEAP_ID_APPLICATION, HEAP_ID_98, 0x20000); - - v1 = ApplicationManager_NewData(appMan, sizeof(UnkStruct_ov106_02243118), HEAP_ID_98); - memset(v1, 0, sizeof(UnkStruct_ov106_02243118)); - - v1->unk_48 = BgConfig_New(HEAP_ID_98); - v1->unk_00 = appMan; - - v2 = (UnkStruct_ov104_02235208 *)ApplicationManager_Args(appMan); - - v1->saveData = v2->saveData; - v1->unk_09 = v2->unk_04; - v1->unk_28C = &v2->unk_06; - v1->options = SaveData_GetOptions(v1->saveData); - v1->unk_290 = v2->unk_0C; - v1->unk_294 = v2->unk_08; - v1->unk_298 = v2->unk_14; - v1->unk_1C = (v2->unk_18 + 1); - v1->unk_0D = v2->unk_05; - v1->unk_2F8 = 0xff; - v1->unk_18 = 0xff; - v1->unk_1F = 0x75; - - ov106_02242500(v1); - - if (ov104_0223B5B0(v1->unk_09) == 1) { - sub_0209BA80(v1); - } - - (*param1) = 0; - - return 1; -} - -int ov106_02241B9C(ApplicationManager *appMan, int *param1) -{ - UnkStruct_ov106_02243118 *v0 = ApplicationManager_Data(appMan); - - if (v0->unk_18 != 0xff) { - switch (*param1) { - case 2: - if (v0->unk_10 == 0) { - ov106_02243200(v0); - ov106_02242D5C(v0, param1, 3); - } - break; - } - } - - switch (*param1) { - case 1: - if (ov106_02241E14(v0) == 1) { - ov106_02242D5C(v0, param1, 0); - } else { - return 0; - } - case 0: - if (ov106_02241D28(v0) == 1) { - ov106_02242D5C(v0, param1, 2); - } - break; - case 2: - if (ov106_02241E5C(v0) == 1) { - if (v0->unk_17 == 1) { - ov106_02242D5C(v0, param1, 3); - } else { - if (v0->unk_0B == 1) { - ov106_02242D5C(v0, param1, 1); - return 0; - } else { - if (ov104_0223B5B0(v0->unk_09) == 1) { - ov106_02242D5C(v0, param1, 4); - } else { - ov106_02242D5C(v0, param1, 5); - } - } - } - } - break; - case 3: - if (ov106_02242108(v0) == 1) { - if (v0->unk_19 == 1) { - v0->unk_19 = 0; - ov106_02242D5C(v0, param1, 2); - } else { - if (ov104_0223B5B0(v0->unk_09) == 1) { - ov106_02242D5C(v0, param1, 4); - } else { - ov106_02242D5C(v0, param1, 5); - } - } - } - break; - case 4: - if (ov106_0224230C(v0) == 1) { - ov106_02242D5C(v0, param1, 5); - } - break; - case 5: - if (ov106_02242344(v0) == 1) { - return 1; - } - break; - case 6: - if (ov106_022423AC(v0) == 1) { - ov106_02242D5C(v0, param1, 4); - } - break; - } - - SpriteList_Update(v0->unk_C0.unk_00); - return 0; -} - -int ov106_02241CF0(ApplicationManager *appMan, int *param1) -{ - int v0; - UnkStruct_ov106_02243118 *v1 = ApplicationManager_Data(appMan); - - *(v1->unk_28C) = v1->unk_0D; - - ov106_022423E8(v1); - - ApplicationManager_FreeData(appMan); - SetVBlankCallback(NULL, NULL); - Heap_Destroy(HEAP_ID_98); - Overlay_UnloadByID(FS_OVERLAY_ID(overlay104)); - - return 1; -} - -static BOOL ov106_02241D28(UnkStruct_ov106_02243118 *param0) -{ - switch (param0->unk_08) { - case 0: - if ((param0->unk_12 == 0) && (ov104_0223B5B0(param0->unk_09) == 1)) { - CommTool_ClearReceivedTempDataAllPlayers(); - CommTiming_StartSync(112); - } - - param0->unk_08++; - break; - case 1: - if ((param0->unk_12 == 0) && (ov104_0223B5B0(param0->unk_09) == 1)) { - if (CommTiming_IsSyncState(112) == 1) { - CommTool_ClearReceivedTempDataAllPlayers(); - param0->unk_12 = 1; - param0->unk_08++; - } - } else { - param0->unk_08++; - } - break; - case 2: - ov106_02241DD4(param0); - StartScreenFade(FADE_BOTH_SCREENS, FADE_TYPE_BRIGHTNESS_IN, FADE_TYPE_BRIGHTNESS_IN, COLOR_BLACK, 6, 1 * 3, HEAP_ID_98); - param0->unk_08++; - break; - case 3: - if (IsScreenFadeDone() == TRUE) { - return 1; - } - break; - } - - return 0; -} - -static void ov106_02241DD4(UnkStruct_ov106_02243118 *param0) -{ - int v0; - - ov106_02242B38(param0, ¶m0->unk_4C[3], 1, 2, 0, FONT_SYSTEM); - ov106_02242C2C(param0, ¶m0->unk_4C[3]); - ov106_02242AC4(param0, ¶m0->unk_4C[2], 0, 0, 1, 2, 0, FONT_SYSTEM); - - if (param0->unk_0B == 1) { - (void)0; - } - - return; -} - -static BOOL ov106_02241E14(UnkStruct_ov106_02243118 *param0) -{ - switch (param0->unk_08) { - case 0: - - if (ApplicationManager_Exec(param0->unk_04) == 1) { - param0->unk_288 = param0->unk_BC->monIndex; - Heap_Free(param0->unk_BC); - Heap_Free(param0->unk_04); - param0->unk_04 = NULL; - ov106_0224248C(param0); - param0->unk_10 = 0; - return 1; - } - break; - } - - return 0; -} - -static BOOL ov106_02241E5C(UnkStruct_ov106_02243118 *param0) -{ - int v0; - u32 v1, v2; - - switch (param0->unk_08) { - case 0: - param0->unk_0B = 0; - param0->unk_08 = 1; - break; - case 1: - ov106_02242D64(param0, gSystem.pressedKeys); - - if (gSystem.pressedKeys & PAD_BUTTON_A) { - if (ov104_0223B5A4(param0->unk_0D) == 0xfe) { - Sound_PlayEffect(SEQ_SE_DP_DECIDE); - StartScreenFade(FADE_BOTH_SCREENS, FADE_TYPE_BRIGHTNESS_OUT, FADE_TYPE_BRIGHTNESS_OUT, COLOR_BLACK, 6, 1, HEAP_ID_98); - - param0->unk_10 = 1; - param0->unk_08 = 6; - } else { - if (ov106_022430B0(param0) == 1) { - if (ov104_0223B5A4(param0->unk_0D) != 9) { - Sound_PlayEffect(SEQ_SE_DP_BOX03); - return 0; - } - } else { - if (sub_020301E0(ov106_02243090(param0->unk_0D), param0->unk_294) >= 10) { - Sound_PlayEffect(SEQ_SE_DP_BOX03); - - return 0; - } - - if (ov104_0223B5A4(param0->unk_0D) == 9) { - Sound_PlayEffect(SEQ_SE_DP_BOX03); - return 0; - } - } - - Sound_PlayEffect(SEQ_SE_DP_DECIDE); - - if (ov104_0223B5B0(param0->unk_09) == 0) { - ov106_02242FAC(param0->unk_48, param0->unk_0D, 1); - Bg_ScheduleTilemapTransfer(param0->unk_48, 3); - } - - param0->unk_14 = 8; - param0->unk_08 = 2; - } - } - break; - case 2: - param0->unk_14--; - - if (param0->unk_14 == 0) { - if (ov104_0223B5B0(param0->unk_09) == 0) { - ov106_02243224(param0); - param0->unk_08 = 3; - break; - } else { - ov106_02243758(¶m0->unk_4C[0], Options_Frame(param0->options)); - param0->unk_0A = ov106_02242978(param0, 0, FONT_MESSAGE); - param0->unk_1A = param0->unk_0D; - param0->unk_17 = 1; - return 1; - } - } - break; - case 3: - v1 = Menu_ProcessInput(param0->unk_98); - - switch (v1) { - case 0xffffffff: - break; - case 0: - ov106_02243200(param0); - - if ((ov106_02243098(param0) == 1) && (ov106_022430B0(param0) == 0)) { - param0->unk_1F = param0->unk_0D; - param0->unk_08 = 4; - } else { - Sound_StopEffect(1500, 0); - Sound_PlayEffect(SEQ_SE_DP_UG_020); - - if (param0->unk_1F != 0x75) { - param0->unk_0D = param0->unk_1F; - } - - return 1; - } - break; - case 1: - case 0xfffffffe: - ov106_02243200(param0); - ov106_022432AC(param0); - param0->unk_08 = 1; - break; - } - break; - case 4: - ov106_02243758(¶m0->unk_4C[0], Options_Frame(param0->options)); - param0->unk_0A = ov106_02242918(param0, ¶m0->unk_4C[0], 32, 1, 1, Options_TextFrameDelay(SaveData_GetOptions(param0->saveData)), 1, 2, 15, FONT_MESSAGE); - Window_CopyToVRAM(¶m0->unk_4C[0]); - param0->unk_08 = 5; - break; - case 5: - if (Text_IsPrinterActive(param0->unk_0A) == 0) { - param0->unk_1E = 1; - ov106_022432D4(param0); - ov106_022436B0(param0->unk_280, 1); - ov106_02242FAC(param0->unk_48, (4 * 5) - 1, 0); - ov106_02242F4C(param0, param0->unk_48); - param0->unk_0D = ((4 * 5) - 1); - ov106_02243670(param0->unk_280, ov106_02242F24(param0), ov106_02242F3C(param0)); - param0->unk_08 = 0; - } - break; - case 6: - if (IsScreenFadeDone() == TRUE) { - ov106_02242CA4(param0); - ov106_022423E8(param0); - param0->unk_04 = ApplicationManager_New(&gPokemonSummaryScreenApp, param0->unk_BC, HEAP_ID_98); - param0->unk_0B = 1; - return 1; - } - break; - } - - return 0; -} - -static BOOL ov106_02242108(UnkStruct_ov106_02243118 *param0) -{ - u8 v0; - u32 v1; - - switch (param0->unk_08) { - case 0: - v0 = ov106_02243090(param0->unk_1A); - - if (ov106_022430B4(param0, 5, v0) == 1) { - param0->unk_1B = 0; - param0->unk_1A = 0; - param0->unk_17 = 0; - param0->unk_08 = 1; - } - break; - case 1: - if (param0->unk_1B > 0) { - param0->unk_1B--; - break; - } - - if (param0->unk_16 < 2) { - break; - } - - param0->unk_16 = 0; - - if (param0->unk_18 < (4 * 5)) { - if (CommSys_CurNetId() == 0) { - param0->unk_08 = 2; - } else { - param0->unk_08 = 3; - } - } else { - if (CommSys_CurNetId() == 0) { - param0->unk_08 = 3; - } else { - param0->unk_08 = 2; - } - } - break; - case 3: - ov106_02243664(param0->unk_284, 0); - ov106_02243758(¶m0->unk_4C[0], Options_Frame(param0->options)); - ov104_0222E5D0(param0->unk_24, 0); - - param0->unk_0A = ov106_02242978(param0, 11, FONT_MESSAGE); - param0->unk_1B = 10; - - ov106_02242FAC(param0->unk_48, param0->unk_2F8, 2); - Bg_ScheduleTilemapTransfer(param0->unk_48, 3); - - param0->unk_08 = 4; - break; - case 4: - if (param0->unk_2F9 == 0) { - break; - } - - if (param0->unk_2F9 == 1) { - param0->unk_0D = param0->unk_2F8; - return 1; - } else { - ov106_022432D4(param0); - ov106_02242FAC(param0->unk_48, param0->unk_2F8, 0); - - Bg_ScheduleTilemapTransfer(param0->unk_48, 3); - - param0->unk_2F8 = 0xff; - param0->unk_2F9 = 0; - param0->unk_18 = 0xff; - param0->unk_19 = 1; - - return 1; - } - break; - case 2: - ov106_02242FAC(param0->unk_48, param0->unk_0D, 1); - Bg_ScheduleTilemapTransfer(param0->unk_48, 3); - ov106_02243224(param0); - param0->unk_08 = 5; - break; - case 5: - v1 = Menu_ProcessInput(param0->unk_98); - - switch (v1) { - case 0xffffffff: - break; - case 0: - Sound_StopEffect(1500, 0); - Sound_PlayEffect(SEQ_SE_DP_UG_020); - ov106_02243200(param0); - param0->unk_08 = 6; - break; - case 1: - case 0xfffffffe: - ov106_02243200(param0); - param0->unk_08 = 7; - break; - } - break; - case 6: - if (ov106_022430B4(param0, 6, 1) == 1) { - return 1; - } - break; - case 7: - if (ov106_022430B4(param0, 6, 2) == 1) { - ov106_022432AC(param0); - param0->unk_2F8 = 0xff; - param0->unk_18 = 0xff; - param0->unk_19 = 1; - return 1; - } - break; - case 8: - CommTool_ClearReceivedTempDataAllPlayers(); - CommTiming_StartSync(104); - param0->unk_08 = 9; - break; - case 9: - if (CommTiming_IsSyncState(104) == 1) { - CommTool_ClearReceivedTempDataAllPlayers(); - CommTool_Init(98); - param0->unk_18 = 0xff; - return 1; - } - break; - } - - return 0; -} - -static BOOL ov106_0224230C(UnkStruct_ov106_02243118 *param0) -{ - int v0; - - switch (param0->unk_08) { - case 0: - CommTool_ClearReceivedTempDataAllPlayers(); - CommTiming_StartSync(104); - param0->unk_08++; - break; - case 1: - if (CommTiming_IsSyncState(104) == 1) { - CommTool_ClearReceivedTempDataAllPlayers(); - return 1; - } - break; - } - - return 0; -} - -static BOOL ov106_02242344(UnkStruct_ov106_02243118 *param0) -{ - int v0; - - switch (param0->unk_08) { - case 0: - param0->unk_1B = 10; - param0->unk_08++; - break; - case 1: - param0->unk_1B--; - - if (param0->unk_1B == 0) { - ov106_022432D4(param0); - StartScreenFade(FADE_BOTH_SCREENS, FADE_TYPE_BRIGHTNESS_OUT, FADE_TYPE_BRIGHTNESS_OUT, COLOR_BLACK, 6, 1, HEAP_ID_98); - param0->unk_08++; - } - break; - case 2: - if (IsScreenFadeDone() == TRUE) { - return 1; - } - break; - } - - return 0; -} - -static BOOL ov106_022423AC(UnkStruct_ov106_02243118 *param0) -{ - int v0; - - switch (param0->unk_08) { - case 0: - ov106_02243200(param0); - ov106_02243664(param0->unk_284, 1); - Window_EraseMessageBox(¶m0->unk_4C[0], 0); - - param0->unk_08++; - break; - case 1: - return 1; - } - - return 0; -} - -static void ov106_022423E8(UnkStruct_ov106_02243118 *param0) -{ - int v0; - - if (param0->unk_280 != NULL) { - ov106_02243650(param0->unk_280); - } - - if (param0->unk_284 != NULL) { - ov106_02243650(param0->unk_284); - } - - NetworkIcon_Destroy(); - PaletteData_FreeBuffer(param0->unk_AC, 2); - PaletteData_FreeBuffer(param0->unk_AC, 0); - PaletteData_Free(param0->unk_AC); - - param0->unk_AC = NULL; - - ov106_02243570(¶m0->unk_C0); - - MessageLoader_Free(param0->unk_20); - StringTemplate_Free(param0->unk_24); - String_Free(param0->unk_28); - String_Free(param0->unk_2C); - FontSpecialChars_Free(param0->unk_B0); - - for (v0 = 0; v0 < 2; v0++) { - String_Free(param0->unk_30[v0]); - } - - ov106_02243710(param0->unk_4C); - ov106_022426A4(param0->unk_48); - NARC_dtor(param0->unk_29C); - - return; -} - -static void ov106_0224248C(UnkStruct_ov106_02243118 *param0) -{ - int v0; - - ov106_022424C8(); - param0->unk_48 = BgConfig_New(HEAP_ID_98); - ov106_02242500(param0); - - if (ov104_0223B5A4(param0->unk_0D) == 0xfe) { - ov106_022436B0(param0->unk_280, 2); - ov106_02243670(param0->unk_280, 128, 168); - } - - return; -} - -static void ov106_022424C8(void) -{ - SetVBlankCallback(NULL, NULL); - SetHBlankCallback(NULL, NULL); - - GXLayers_DisableEngineALayers(); - GXLayers_DisableEngineBLayers(); - - GX_SetVisiblePlane(0); - GXS_SetVisiblePlane(0); - - return; -} - -static void ov106_02242500(UnkStruct_ov106_02243118 *param0) -{ - int v0, v1; - - param0->unk_29C = NARC_ctor(NARC_INDEX_RESOURCE__ENG__FRONTIER_GRAPHIC__FRONTIER_BG, HEAP_ID_98); - - ov106_0224262C(param0); - ov106_02242688(param0); - - param0->unk_20 = MessageLoader_Init(MSG_LOADER_LOAD_ON_DEMAND, NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_BATTLE_HALL_SCENE, HEAP_ID_98); - param0->unk_24 = StringTemplate_Default(HEAP_ID_98); - param0->unk_28 = String_Init(600, HEAP_ID_98); - param0->unk_2C = String_Init(600, HEAP_ID_98); - - for (v0 = 0; v0 < 2; v0++) { - param0->unk_30[v0] = String_Init(32, HEAP_ID_98); - } - - Font_LoadTextPalette(0, 13 * 32, HEAP_ID_98); - Font_LoadScreenIndicatorsPalette(0, 12 * 32, HEAP_ID_98); - - param0->unk_B0 = FontSpecialChars_Init(15, 14, 0, HEAP_ID_98); - - ov106_022436E0(param0->unk_48, param0->unk_4C); - ov106_02242F4C(param0, param0->unk_48); - - GXLayers_TurnBothDispOn(); - - param0->unk_280 = ov106_022435FC(¶m0->unk_C0, 0, 1, ov106_02242F24(param0), ov106_02242F3C(param0), NULL); - param0->unk_284 = ov106_022435FC(¶m0->unk_C0, 1, 1, 160, 160, NULL); - - ov106_022436CC(param0->unk_284, Party_GetPokemonBySlotIndex(param0->unk_290, 0)); - - if (CommSys_IsInitialized()) { - ReserveVramForWirelessIconChars(NNS_G2D_VRAM_TYPE_2DMAIN, GX_OBJVRAMMODE_CHAR_1D_32K); - ReserveSlotsForWirelessIconPalette(NNS_G2D_VRAM_TYPE_2DMAIN); - sub_02039734(); - } - - SetVBlankCallback(ov106_022426E0, (void *)param0); - return; -} - -static void ov106_0224262C(UnkStruct_ov106_02243118 *param0) -{ - ov106_0224271C(); - ov106_0224273C(param0->unk_48); - - param0->unk_AC = PaletteData_New(HEAP_ID_98); - - PaletteData_AllocBuffer(param0->unk_AC, 2, 32 * 16, HEAP_ID_98); - PaletteData_AllocBuffer(param0->unk_AC, 0, 32 * 16, HEAP_ID_98); - - ov106_0224283C(param0, 3); - ov106_02242884(); - - GXLayers_EngineAToggleLayers(GX_PLANEMASK_BG2, 0); - ov106_022428B8(param0, 4); - - return; -} - -static void ov106_02242688(UnkStruct_ov106_02243118 *param0) -{ - ov106_02243310(¶m0->unk_C0, Party_GetPokemonBySlotIndex(param0->unk_290, 0)); - return; -} - -static void ov106_022426A4(BgConfig *param0) -{ - GXLayers_EngineAToggleLayers(GX_PLANEMASK_BG0 | GX_PLANEMASK_BG1 | GX_PLANEMASK_BG2 | GX_PLANEMASK_BG3 | GX_PLANEMASK_OBJ, 0); - GXLayers_EngineBToggleLayers(GX_PLANEMASK_BG0 | GX_PLANEMASK_BG1 | GX_PLANEMASK_BG2 | GX_PLANEMASK_BG3 | GX_PLANEMASK_OBJ, 0); - - Bg_FreeTilemapBuffer(param0, BG_LAYER_MAIN_3); - Bg_FreeTilemapBuffer(param0, BG_LAYER_MAIN_1); - Bg_FreeTilemapBuffer(param0, BG_LAYER_MAIN_0); - Bg_FreeTilemapBuffer(param0, BG_LAYER_SUB_0); - Heap_Free(param0); - - return; -} - -static void ov106_022426E0(void *param0) -{ - UnkStruct_ov106_02243118 *v0 = param0; - - if (v0->unk_04 != NULL) { - return; - } - - if (v0->unk_AC != NULL) { - PaletteData_CommitFadedBuffers(v0->unk_AC); - } - - Bg_RunScheduledUpdates(v0->unk_48); - VramTransfer_Process(); - RenderOam_Transfer(); - - OS_SetIrqCheckFlag(OS_IE_V_BLANK); -} - -static void ov106_0224271C(void) -{ - UnkStruct_02099F80 v0 = { - GX_VRAM_BG_128_C, - GX_VRAM_BGEXTPLTT_NONE, - GX_VRAM_SUB_BG_32_H, - 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_01_AB, - GX_VRAM_TEXPLTT_01_FG - }; - - GXLayers_SetBanks(&v0); - return; -} - -static void ov106_0224273C(BgConfig *param0) -{ - { - GraphicsModes v0 = { - GX_DISPMODE_GRAPHICS, - GX_BGMODE_0, - GX_BGMODE_0, - GX_BG0_AS_2D - }; - - SetAllGraphicsModes(&v0); - } - - { - BgTemplate v1 = { - .x = 0, - .y = 0, - .bufferSize = 0x800, - .baseTile = 0, - .screenSize = BG_SCREEN_SIZE_256x256, - .colorMode = GX_BG_COLORMODE_16, - .screenBase = GX_BG_SCRBASE_0x0000, - .charBase = GX_BG_CHARBASE_0x04000, - .bgExtPltt = GX_BG_EXTPLTT_01, - .priority = 0, - .areaOver = 0, - .mosaic = FALSE, - }; - - Bg_InitFromTemplate(param0, BG_LAYER_MAIN_0, &v1, 0); - Bg_ClearTilesRange(BG_LAYER_MAIN_0, 32, 0, HEAP_ID_98); - Bg_ClearTilemap(param0, BG_LAYER_MAIN_0); - } - - { - BgTemplate v2 = { - .x = 0, - .y = 0, - .bufferSize = 0x800, - .baseTile = 0, - .screenSize = BG_SCREEN_SIZE_256x256, - .colorMode = GX_BG_COLORMODE_16, - .screenBase = GX_BG_SCRBASE_0x0800, - .charBase = GX_BG_CHARBASE_0x0c000, - .bgExtPltt = GX_BG_EXTPLTT_01, - .priority = 1, - .areaOver = 0, - .mosaic = FALSE, - }; - - Bg_InitFromTemplate(param0, BG_LAYER_MAIN_1, &v2, 0); - Bg_ClearTilesRange(BG_LAYER_MAIN_1, 32, 0, HEAP_ID_98); - Bg_ClearTilemap(param0, BG_LAYER_MAIN_1); - } - - { - BgTemplate v3 = { - .x = 0, - .y = 0, - .bufferSize = 0x800, - .baseTile = 0, - .screenSize = BG_SCREEN_SIZE_256x256, - .colorMode = GX_BG_COLORMODE_16, - .screenBase = GX_BG_SCRBASE_0x2000, - .charBase = GX_BG_CHARBASE_0x08000, - .bgExtPltt = GX_BG_EXTPLTT_01, - .priority = 2, - .areaOver = 0, - .mosaic = FALSE, - }; - - Bg_InitFromTemplate(param0, BG_LAYER_MAIN_3, &v3, 0); - Bg_ClearTilemap(param0, BG_LAYER_MAIN_3); - } - - { - BgTemplate v4 = { - .x = 0, - .y = 0, - .bufferSize = 0x800, - .baseTile = 0, - .screenSize = BG_SCREEN_SIZE_256x256, - .colorMode = GX_BG_COLORMODE_16, - .screenBase = GX_BG_SCRBASE_0x3000, - .charBase = GX_BG_CHARBASE_0x10000, - .bgExtPltt = GX_BG_EXTPLTT_01, - .priority = 0, - .areaOver = 0, - .mosaic = FALSE, - }; - - Bg_InitFromTemplate(param0, BG_LAYER_SUB_0, &v4, 0); - Bg_ClearTilemap(param0, BG_LAYER_SUB_0); - } - - G2_SetBG0Priority(0); - GXLayers_EngineAToggleLayers(GX_PLANEMASK_BG0, 1); - - return; -} - -static void ov106_0224283C(UnkStruct_ov106_02243118 *param0, u32 param1) -{ - Graphics_LoadTilesToBgLayerFromOpenNARC(param0->unk_29C, 23, param0->unk_48, param1, 0, 0, 1, HEAP_ID_98); - Graphics_LoadTilemapToBgLayerFromOpenNARC(param0->unk_29C, 24, param0->unk_48, param1, 0, 0, 1, HEAP_ID_98); - - return; -} - -static void ov106_02242884(void) -{ - void *v0; - NNSG2dPaletteData *v1; - - v0 = Graphics_GetPlttData(NARC_INDEX_RESOURCE__ENG__FRONTIER_GRAPHIC__FRONTIER_BG, 134, &v1, HEAP_ID_98); - - DC_FlushRange(v1->pRawData, sizeof(u16) * 16 * 6); - GX_LoadBGPltt(v1->pRawData, 0, sizeof(u16) * 16 * 6); - Heap_Free(v0); - - return; -} - -static void ov106_022428B8(UnkStruct_ov106_02243118 *param0, u32 param1) -{ - Graphics_LoadTilesToBgLayerFromOpenNARC(param0->unk_29C, 125, param0->unk_48, param1, 0, 0, 1, HEAP_ID_98); - Graphics_LoadTilemapToBgLayerFromOpenNARC(param0->unk_29C, 126, param0->unk_48, param1, 0, 0, 1, HEAP_ID_98); - Graphics_LoadPaletteFromOpenNARC(param0->unk_29C, 171, 4, 0, 0x20, HEAP_ID_98); - - return; -} - -static u8 ov106_02242918(UnkStruct_ov106_02243118 *param0, Window *param1, int param2, u32 param3, u32 param4, u32 param5, u8 param6, u8 param7, u8 param8, u8 param9) -{ - Window_FillTilemap(param1, param8); - MessageLoader_GetString(param0->unk_20, param2, param0->unk_2C); - StringTemplate_Format(param0->unk_24, param0->unk_28, param0->unk_2C); - - return Text_AddPrinterWithParamsAndColor(param1, param9, param0->unk_28, param3, param4, param5, TEXT_COLOR(param6, param7, param8), NULL); -} - -static u8 ov106_02242978(UnkStruct_ov106_02243118 *param0, int param1, u8 param2) -{ - u8 v0 = ov106_02242918(param0, ¶m0->unk_4C[0], param1, 1, 1, TEXT_SPEED_INSTANT, 1, 2, 15, param2); - Window_CopyToVRAM(¶m0->unk_4C[0]); - - return v0; -} - -static void ov106_022429B0(UnkStruct_ov106_02243118 *param0, Window *param1, u8 param2) -{ - int v0; - - for (v0 = 0; v0 < 2; v0++) { - param0->unk_9C[v0].entry = NULL; - param0->unk_9C[v0].index = 0; - } - - param0->unk_8C.choices = param0->unk_9C; - param0->unk_8C.window = param1; - param0->unk_8C.fontID = FONT_SYSTEM; - param0->unk_8C.xSize = 1; - param0->unk_8C.ySize = param2; - param0->unk_8C.lineSpacing = 0; - param0->unk_8C.suppressCursor = FALSE; - param0->unk_8C.loopAround = TRUE; - - return; -} - -static void ov106_02242A28(UnkStruct_ov106_02243118 *param0, u8 param1, u8 param2, int param3) -{ - int v0; - void *v1; - - MessageLoader_GetString(param0->unk_20, param3, param0->unk_30[param1]); - - param0->unk_9C[param1].entry = (const void *)param0->unk_30[param1]; - param0->unk_9C[param1].index = param2; - - return; -} - -static void ov106_02242A54(UnkStruct_ov106_02243118 *param0) -{ - param0->unk_0F = 1; - - ov106_0224372C(param0->unk_48, ¶m0->unk_4C[1]); - ov106_022429B0(param0, ¶m0->unk_4C[1], 2); - ov106_02242A28(param0, 0, 0, 27); - ov106_02242A28(param0, 1, 1, 28); - - param0->unk_98 = Menu_NewAndCopyToVRAM(¶m0->unk_8C, 8, 0, 0, 98, PAD_BUTTON_B); - return; -} - -static void ov106_02242AAC(UnkStruct_ov106_02243118 *param0, u32 param1, s32 param2) -{ - StringTemplate_SetNumber(param0->unk_24, param1, param2, 2, 0, 1); - return; -} - -static void ov106_02242AC4(UnkStruct_ov106_02243118 *param0, Window *param1, u32 param2, u32 param3, u8 param4, u8 param5, u8 param6, u8 param7) -{ - u8 v0; - u32 v1, v2, v3; - String *v4; - Pokemon *v5; - u16 v6[(10 + 1)]; - - v5 = Party_GetPokemonBySlotIndex(param0->unk_290, 0); - Pokemon_GetValue(v5, MON_DATA_SPECIES_NAME, v6); - Window_FillTilemap(param1, param6); - - v4 = String_Init(10 + 1, HEAP_ID_98); - String_CopyChars(v4, v6); - Text_AddPrinterWithParamsAndColor(param1, param7, v4, param2, param3, TEXT_SPEED_INSTANT, TEXT_COLOR(param4, param5, param6), NULL); - String_Free(v4); - Window_CopyToVRAM(param1); - - return; -} - -static void ov106_02242B38(UnkStruct_ov106_02243118 *param0, Window *param1, u8 param2, u8 param3, u8 param4, u8 param5) -{ - int v0, v1; - String *v2; - MessageLoader *v3; - - Window_FillTilemap(param1, param4); - - v3 = MessageLoader_Init(MSG_LOADER_LOAD_ON_DEMAND, NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_POKEMON_TYPE_NAMES, HEAP_ID_98); - v2 = String_Init(10 + 1, HEAP_ID_98); - - for (v0 = 0; v0 < 5; v0++) { - for (v1 = 0; v1 < 4; v1++) { - if (ov104_0223B5A4(v0 * 4 + v1) != 0xfe) { - String_Clear(v2); - MessageLoader_GetString(v3, ov104_0223B5A4(v0 * 4 + v1), v2); - Text_AddPrinterWithParamsAndColor(param1, param5, v2, 1 + (64 * v1), 16 + (36 * v0), TEXT_SPEED_INSTANT, TEXT_COLOR(param2, param3, param4), NULL); - } - } - } - - String_Free(v2); - MessageLoader_Free(v3); - Window_CopyToVRAM(param1); - - return; -} - -static void ov106_02242C04(UnkStruct_ov106_02243118 *param0, Window *param1, u8 param2, u32 param3, u32 param4) -{ - FontSpecialChars_DrawPartyScreenHPText(param0->unk_B0, param2, 2, 0, param1, param3, param4); - Window_ScheduleCopyToVRAM(param1); - return; -} - -static void ov106_02242C2C(UnkStruct_ov106_02243118 *param0, Window *param1) -{ - int v0, v1; - u8 v2, v3, v4; - - for (v0 = 0; v0 < 5; v0++) { - for (v1 = 0; v1 < 4; v1++) { - v4 = ov104_0223B5A4(v0 * 4 + v1); - - if ((v4 != 0xfe) && (v4 != 9)) { - v3 = (v0 * 4 + v1); - v2 = sub_020301E0(ov106_02243090(v3), param0->unk_294); - - v2++; - - if (v2 > 10) { - v2 = 10; - } - - ov106_02242C04(param0, param1, v2, 18 + (64 * v1), 4 + (36 * v0)); - } - } - } - - return; -} - -static void ov106_02242CA4(UnkStruct_ov106_02243118 *param0) -{ - param0->unk_BC = Heap_Alloc(HEAP_ID_98, sizeof(PokemonSummary)); - memset(param0->unk_BC, 0, sizeof(PokemonSummary)); - - param0->unk_BC->monData = param0->unk_290; - param0->unk_BC->dataType = SUMMARY_DATA_PARTY_MON; - param0->unk_BC->options = param0->options; - param0->unk_BC->mode = SUMMARY_MODE_LOCK_MOVES; - param0->unk_BC->monMax = Party_GetCurrentCount(param0->unk_290); - param0->unk_BC->monIndex = 0; - param0->unk_BC->move = 0; - param0->unk_BC->dexMode = SaveData_GetDexMode(param0->saveData); - param0->unk_BC->showContest = PokemonSummaryScreen_ShowContestData(param0->saveData); - - PokemonSummaryScreen_FlagVisiblePages(param0->unk_BC, Unk_ov106_02243798); - PokemonSummaryScreen_SetPlayerProfile(param0->unk_BC, SaveData_GetTrainerInfo(param0->saveData)); - - return; -} - -static void ov106_02242D5C(UnkStruct_ov106_02243118 *param0, int *param1, int param2) -{ - param0->unk_08 = 0; - *param1 = param2; - return; -} - -static void ov106_02242D64(UnkStruct_ov106_02243118 *param0, int param1) -{ - int v0 = 0; - - if (gSystem.pressedKeys & PAD_KEY_LEFT) { - if (ov104_0223B5A4(param0->unk_0D) != 0xfe) { - param0->unk_0C = param0->unk_0D; - } else { - (void)0; - } - - if ((param0->unk_0D % 4) == 0) { - param0->unk_0D += (4 - 1); - } else if (ov104_0223B5A4(param0->unk_0D) == 0xfe) { - param0->unk_0D = 16; - } else { - param0->unk_0D--; - } - - v0 = 1; - } - - if (gSystem.pressedKeys & PAD_KEY_RIGHT) { - if (ov104_0223B5A4(param0->unk_0D) != 0xfe) { - param0->unk_0C = param0->unk_0D; - } else { - (void)0; - } - - if ((param0->unk_0D % 4) == (4 - 1)) { - param0->unk_0D -= (4 - 1); - } else if (ov104_0223B5A4(param0->unk_0D) == 0xfe) { - param0->unk_0D = 19; - } else { - param0->unk_0D++; - } - - v0 = 1; - } - - if (gSystem.pressedKeys & PAD_KEY_UP) { - if (ov104_0223B5A4(param0->unk_0D) != 0xfe) { - param0->unk_0C = param0->unk_0D; - } else { - (void)0; - } - - if (param0->unk_0D < 4) { - param0->unk_0D += (4 * (5 - 1)); - } else if (ov104_0223B5A4(param0->unk_0D) == 0xfe) { - if (param0->unk_0C == 16) { - param0->unk_0D = 13; - } else if (param0->unk_0C == 19) { - param0->unk_0D = 14; - } else if ((param0->unk_0C == 13) || (param0->unk_0C == 1)) { - param0->unk_0D = 13; - } else if ((param0->unk_0C == 14) || (param0->unk_0C == 2)) { - param0->unk_0D = 14; - } - } else { - param0->unk_0D -= 4; - } - - v0 = 1; - } - - if (gSystem.pressedKeys & PAD_KEY_DOWN) { - if (ov104_0223B5A4(param0->unk_0D) != 0xfe) { - param0->unk_0C = param0->unk_0D; - } else { - (void)0; - } - - if (param0->unk_0D >= 4 * (5 - 1)) { - param0->unk_0D -= (4 * (5 - 1)); - } else if (ov104_0223B5A4(param0->unk_0D) == 0xfe) { - if (param0->unk_0C == 16) { - param0->unk_0D = 1; - } else if (param0->unk_0C == 19) { - param0->unk_0D = 2; - } else if ((param0->unk_0C == 13) || (param0->unk_0C == 1)) { - param0->unk_0D = 1; - } else if ((param0->unk_0C == 14) || (param0->unk_0C == 2)) { - param0->unk_0D = 2; - } - } else { - param0->unk_0D += 4; - } - - v0 = 1; - } - - if (v0 == 1) { - Sound_PlayEffect(SEQ_SE_CONFIRM); - ov106_02243670(param0->unk_280, ov106_02242F24(param0), ov106_02242F3C(param0)); - } - - if (ov104_0223B5A4(param0->unk_0D) == 0xfe) { - ov106_022436B0(param0->unk_280, 2); - ov106_02243670(param0->unk_280, 128, 168); - } else { - ov106_022436B0(param0->unk_280, 1); - } - - return; -} - -static u16 ov106_02242F24(UnkStruct_ov106_02243118 *param0) -{ - u8 v0 = param0->unk_0D; - return (v0 % 4) * 64 + 32; -} - -static u16 ov106_02242F3C(UnkStruct_ov106_02243118 *param0) -{ - return (param0->unk_0D / 4) * 36 + 16; -} - -static void ov106_02242F4C(UnkStruct_ov106_02243118 *param0, BgConfig *param1) -{ - int v0; - - if (ov106_022430B0(param0) == 1) { - for (v0 = 0; v0 < ((4 * 5) - 3); v0++) { - ov106_02242FAC(param1, v0, 3); - } - } else { - for (v0 = 0; v0 < (18 - 1); v0++) { - if (sub_020301E0(v0, param0->unk_294) >= 10) { - ov106_02242FAC(param1, v0, 3); - } - } - - ov106_02242FAC(param1, (4 * 5) - 1, 3); - } - - Bg_ScheduleTilemapTransfer(param1, 3); - return; -} - -static void ov106_02242FAC(BgConfig *param0, u8 param1, u8 param2) -{ - u8 v0, v1, v2, v3, v4; - - if (param2 == 0) { - v4 = 0; - } else if (param2 == 1) { - v4 = 5; - } else if (param2 == 2) { - v4 = 4; - } else { - v4 = 3; - } - - v2 = 8; - v0 = (param1 % 4) * v2; - - if ((param1 % 8) < 4) { - v3 = 5; - } else { - v3 = 4; - } - - if (param1 < 4) { - v1 = 0; - } else if (param1 < (4 * 2)) { - v1 = 5; - } else if (param1 < (4 * 3)) { - v1 = 9; - } else if (param1 < (4 * 4)) { - v1 = 14; - } else { - v1 = 18; - } - - Bg_ChangeTilemapRectPalette(param0, 3, v0, v1, v2, v3, v4); - - if (param2 == 0) { - v4 = 0; - v2 = 1; - v0 = (param1 % 4) * 8; - - if ((param1 % 8) < 4) { - v3 = 2; - } else { - v3 = 3; - } - - if (param1 < 4) { - v1 = 2; - } else if (param1 < (4 * 2)) { - v1 = 6; - } else if (param1 < (4 * 3)) { - v1 = 11; - } else if (param1 < (4 * 4)) { - v1 = 15; - } else { - v1 = 20; - } - - if (param1 < 9) { - Bg_ChangeTilemapRectPalette(param0, 3, v0, v1, v2, v3, 1); - } else { - Bg_ChangeTilemapRectPalette(param0, 3, v0, v1, v2, v3, 2); - } - } - - return; -} - -static u8 ov106_02243090(u8 param0) -{ - if (param0 >= 17) { - return 18 - 1; - } - - return param0; -} - -static BOOL ov106_02243098(UnkStruct_ov106_02243118 *param0) -{ - if (param0->unk_09 == 0) { - if ((param0->unk_1C == 50) || (param0->unk_1C == 170)) { - return 1; - } - } - - return 0; -} - -static BOOL ov106_022430B0(UnkStruct_ov106_02243118 *param0) -{ - return param0->unk_1E; -} - -BOOL ov106_022430B4(UnkStruct_ov106_02243118 *param0, u16 param1, u16 param2) -{ - int v0, v1; - - if (ov104_0223B5B0(param0->unk_09) == 0) { - return 0; - } - - switch (param1) { - case 4: - v1 = 39; - ov106_02243118(param0, param1); - break; - case 5: - v1 = 40; - ov106_0224313C(param0, param1, param2); - break; - case 6: - v1 = 41; - ov106_022431D4(param0, param1, param2); - break; - } - - if (CommSys_SendData(v1, param0->unk_2A0, 44) == 1) { - v0 = 1; - } else { - v0 = 0; - } - - return v0; -} - -void ov106_02243118(UnkStruct_ov106_02243118 *param0, u16 param1) -{ - TrainerInfo *v0 = SaveData_GetTrainerInfo(param0->saveData); - param0->unk_2A0[0] = param1; - - return; -} - -void ov106_02243130(int param0, int param1, void *param2, void *param3) -{ - int v0, v1; - UnkStruct_ov106_02243118 *v2 = param3; - const u16 *v3 = param2; - - v1 = 0; - - if (CommSys_CurNetId() == param0) { - return; - } - - return; -} - -void ov106_0224313C(UnkStruct_ov106_02243118 *param0, u16 param1, u16 param2) -{ - int v0, v1; - Pokemon *v2; - Party *v3; - - v1 = 0; - - param0->unk_2A0[0] = param1; - param0->unk_2A0[1] = param2; - - if (CommSys_CurNetId() == 0) { - if (param0->unk_18 == 0xff) { - param0->unk_18 = param2; - } - } - - param0->unk_2A0[2] = param0->unk_18; - v2 = Party_GetPokemonBySlotIndex(param0->unk_290, 0); - param0->unk_2A0[3] = Pokemon_GetValue(v2, MON_DATA_LEVEL, NULL); - - return; -} - -void ov106_02243180(int param0, int param1, void *param2, void *param3) -{ - int v0, v1; - UnkStruct_ov106_02243118 *v2 = param3; - const u16 *v3 = param2; - - v1 = 0; - v2->unk_16++; - - if (CommSys_CurNetId() == param0) { - return; - } - - v2->unk_2F8 = v3[1]; - - if (CommSys_CurNetId() == 0) { - if (v2->unk_18 != 0xff) { - v2->unk_2F8 = 0; - } else { - v2->unk_18 = v2->unk_2F8 + (4 * 5); - } - } else { - v2->unk_18 = v3[2]; - } - - *(v2->unk_298) = v3[3]; - return; -} - -void ov106_022431D4(UnkStruct_ov106_02243118 *param0, u16 param1, u16 param2) -{ - param0->unk_2A0[0] = param1; - param0->unk_2A0[1] = param2; - - return; -} - -void ov106_022431E0(int param0, int param1, void *param2, void *param3) -{ - int v0, v1; - UnkStruct_ov106_02243118 *v2 = param3; - const u16 *v3 = param2; - - v1 = 0; - - if (CommSys_CurNetId() == param0) { - return; - } - - if (v3[1] == 0) { - return; - } - - v2->unk_2F9 = v3[1]; - return; -} - -static void ov106_02243200(UnkStruct_ov106_02243118 *param0) -{ - if (param0->unk_0F == 1) { - param0->unk_0F = 0; - Menu_Free(param0->unk_98, NULL); - Window_EraseStandardFrame(param0->unk_8C.window, 0); - } - - return; -} - -static void ov106_02243224(UnkStruct_ov106_02243118 *param0) -{ - u8 v0; - int v1; - - ov106_02243664(param0->unk_284, 0); - ov106_02243758(¶m0->unk_4C[0], Options_Frame(param0->options)); - StringTemplate_SetPokemonTypeName(param0->unk_24, 0, ov104_0223B5A4(param0->unk_0D)); - - v0 = sub_020301E0(ov106_02243090(param0->unk_0D), param0->unk_294); - v0++; - - if (v0 > 10) { - v0 = 10; - } - - ov106_02242AAC(param0, 1, v0); - - if (ov106_022430B0(param0) == 1) { - v1 = 31; - } else { - v1 = 24; - } - - param0->unk_0A = ov106_02242978(param0, v1, FONT_MESSAGE); - - ov106_022436B0(param0->unk_280, 0); - ov106_02242A54(param0); - - return; -} - -static void ov106_022432AC(UnkStruct_ov106_02243118 *param0) -{ - ov106_022432D4(param0); - ov106_02242FAC(param0->unk_48, param0->unk_0D, 0); - - Bg_ScheduleTilemapTransfer(param0->unk_48, 3); - ov106_022436B0(param0->unk_280, 1); - - return; -} - -static void ov106_022432D4(UnkStruct_ov106_02243118 *param0) -{ - ov106_02243664(param0->unk_284, 1); - Window_EraseMessageBox(¶m0->unk_4C[0], 0); - - ov106_02242AC4(param0, ¶m0->unk_4C[2], 0, 0, 1, 2, 0, FONT_SYSTEM); - return; -} diff --git a/src/overlay106/ov106_02243310.c b/src/overlay106/ov106_02243310.c deleted file mode 100644 index 292db003ee..0000000000 --- a/src/overlay106/ov106_02243310.c +++ /dev/null @@ -1,152 +0,0 @@ -#include "overlay106/ov106_02243310.h" - -#include -#include - -#include "overlay106/struct_ov106_02243310.h" - -#include "char_transfer.h" -#include "gx_layers.h" -#include "narc.h" -#include "pltt_transfer.h" -#include "pokemon.h" -#include "pokemon_icon.h" -#include "render_oam.h" -#include "sprite.h" -#include "sprite_resource.h" -#include "sprite_transfer.h" -#include "sprite_util.h" - -void ov106_02243310(UnkStruct_ov106_02243310 *param0, Pokemon *param1); -Sprite *ov106_022434BC(UnkStruct_ov106_02243310 *param0, u32 param1, u32 param2, u32 param3, u8 param4); -void ov106_02243570(UnkStruct_ov106_02243310 *param0); -static void ov106_022435C8(void); - -static const u8 Unk_ov106_0224384C[4] = { - 0x2, - 0x2, - 0x2, - 0x2 -}; - -void ov106_02243310(UnkStruct_ov106_02243310 *param0, Pokemon *param1) -{ - int v0; - NARC *v1; - - ov106_022435C8(); - NNS_G2dInitOamManagerModule(); - RenderOam_Init(0, 128, 0, 32, 0, 128, 0, 32, 98); - - param0->unk_00 = SpriteList_InitRendering(2, ¶m0->unk_04, HEAP_ID_98); - - for (v0 = 0; v0 < 4; v0++) { - param0->unk_190[v0] = SpriteResourceCollection_New(Unk_ov106_0224384C[v0], v0, HEAP_ID_98); - } - - param0->unk_1A0[0][0] = SpriteResourceCollection_AddTiles(param0->unk_190[0], 151, 12, 1, 0, NNS_G2D_VRAM_TYPE_2DMAIN, HEAP_ID_98); - param0->unk_1A0[0][1] = SpriteResourceCollection_AddPalette(param0->unk_190[1], 151, 38, 0, 0, NNS_G2D_VRAM_TYPE_2DMAIN, 1, HEAP_ID_98); - param0->unk_1A0[0][2] = SpriteResourceCollection_Add(param0->unk_190[2], 151, 14, 1, 0, 2, HEAP_ID_98); - - param0->unk_1A0[0][3] = SpriteResourceCollection_Add(param0->unk_190[3], 151, 13, 1, 0, 3, HEAP_ID_98); - v1 = NARC_ctor(NARC_INDEX_POKETOOL__ICONGRA__PL_POKE_ICON, HEAP_ID_98); - - param0->unk_1A0[1][0] = SpriteResourceCollection_AddTilesFrom(param0->unk_190[0], v1, Pokemon_IconSpriteIndex(param1), 0, 1, NNS_G2D_VRAM_TYPE_2DMAIN, HEAP_ID_98); - param0->unk_1A0[1][1] = SpriteResourceCollection_AddPalette(param0->unk_190[1], 19, PokeIconPalettesFileIndex(), 0, 1, NNS_G2D_VRAM_TYPE_2DMAIN, 3, HEAP_ID_98); - param0->unk_1A0[1][2] = SpriteResourceCollection_AddFrom(param0->unk_190[2], v1, PokeIcon32KCellsFileIndex(), 0, 1, 2, HEAP_ID_98); - param0->unk_1A0[1][3] = SpriteResourceCollection_AddFrom(param0->unk_190[3], v1, PokeIcon32KAnimationFileIndex(), 0, 1, 3, HEAP_ID_98); - - for (v0 = 0; v0 < 2; v0++) { - SpriteTransfer_RequestChar(param0->unk_1A0[v0][0]); - SpriteTransfer_RequestPlttWholeRange(param0->unk_1A0[v0][1]); - } - - GXLayers_EngineBToggleLayers(GX_PLANEMASK_OBJ, 1); - GXLayers_EngineAToggleLayers(GX_PLANEMASK_OBJ, 1); - NARC_dtor(v1); - - return; -} - -Sprite *ov106_022434BC(UnkStruct_ov106_02243310 *param0, u32 param1, u32 param2, u32 param3, u8 param4) -{ - int v0; - SpriteResourcesHeader v1; - Sprite *v2; - - SpriteResourcesHeader_Init(&v1, param1, param1, param1, param1, 0xffffffff, 0xffffffff, 0, 1, param0->unk_190[0], param0->unk_190[1], param0->unk_190[2], param0->unk_190[3], NULL, NULL); - - { - AffineSpriteListTemplate v3; - - v3.list = param0->unk_00; - v3.resourceData = &v1; - - v3.position.x = 0; - v3.position.y = 0; - v3.position.z = 0; - v3.affineScale.x = FX32_ONE; - v3.affineScale.y = FX32_ONE; - v3.affineScale.z = FX32_ONE; - v3.affineZRotation = 0; - v3.priority = param3; - - if (param4 == 0) { - v3.vramType = NNS_G2D_VRAM_TYPE_2DMAIN; - } else { - v3.vramType = NNS_G2D_VRAM_TYPE_2DSUB; - } - - v3.heapID = HEAP_ID_98; - - if (param4 == 1) { - v3.position.y += (192 << FX32_SHIFT); - } - - v2 = SpriteList_AddAffine(&v3); - - Sprite_SetAnimateFlag(v2, 1); - Sprite_SetAnimSpeed(v2, FX32_ONE); - Sprite_SetAnim(v2, param2); - } - - return v2; -} - -void ov106_02243570(UnkStruct_ov106_02243310 *param0) -{ - u8 v0; - - for (v0 = 0; v0 < 2; v0++) { - SpriteTransfer_ResetCharTransfer(param0->unk_1A0[v0][0]); - SpriteTransfer_ResetPlttTransfer(param0->unk_1A0[v0][1]); - } - - for (v0 = 0; v0 < 4; v0++) { - SpriteResourceCollection_Delete(param0->unk_190[v0]); - } - - SpriteList_Delete(param0->unk_00); - RenderOam_Free(); - CharTransfer_Free(); - PlttTransfer_Free(); - - return; -} - -static void ov106_022435C8(void) -{ - { - CharTransferTemplate v0 = { - 3, 2048, 2048, 98 - }; - - CharTransfer_InitWithVramModes(&v0, GX_OBJVRAMMODE_CHAR_1D_32K, GX_OBJVRAMMODE_CHAR_1D_32K); - } - - PlttTransfer_Init((1 + 3), HEAP_ID_98); - CharTransfer_ClearBuffers(); - PlttTransfer_Clear(); - - return; -} diff --git a/src/overlay106/ov106_022435FC.c b/src/overlay106/ov106_022435FC.c deleted file mode 100644 index b74af58481..0000000000 --- a/src/overlay106/ov106_022435FC.c +++ /dev/null @@ -1,97 +0,0 @@ -#include "overlay106/ov106_022435FC.h" - -#include -#include - -#include "overlay106/ov106_02243310.h" -#include "overlay106/struct_ov106_02243310.h" -#include "overlay106/struct_ov106_02243650_decl.h" - -#include "heap.h" -#include "pokemon.h" -#include "pokemon_icon.h" -#include "sprite.h" - -struct UnkStruct_ov106_02243650_t { - u32 unk_00; - u32 unk_04; - u32 unk_08; - const u8 *unk_0C; - Sprite *unk_10; -}; - -UnkStruct_ov106_02243650 *ov106_022435FC(UnkStruct_ov106_02243310 *param0, u32 param1, u32 param2, u16 param3, u16 param4, const u8 *param5); -void *ov106_02243650(UnkStruct_ov106_02243650 *param0); -void ov106_02243664(UnkStruct_ov106_02243650 *param0, int param1); -void ov106_02243670(UnkStruct_ov106_02243650 *param0, u16 param1, u16 param2); -void ov106_022436B0(UnkStruct_ov106_02243650 *param0, u32 param1); -void ov106_022436CC(UnkStruct_ov106_02243650 *param0, Pokemon *param1); - -UnkStruct_ov106_02243650 *ov106_022435FC(UnkStruct_ov106_02243310 *param0, u32 param1, u32 param2, u16 param3, u16 param4, const u8 *param5) -{ - UnkStruct_ov106_02243650 *v0; - VecFx32 v1; - - v0 = Heap_Alloc(HEAP_ID_98, sizeof(UnkStruct_ov106_02243650)); - memset(v0, 0, sizeof(UnkStruct_ov106_02243650)); - - v0->unk_0C = param5; - - if (param5 != NULL) { - v0->unk_10 = ov106_022434BC(param0, param1, param2, 0, 0); - } else { - v0->unk_10 = ov106_022434BC(param0, param1, param2, 0, 0); - } - - v1.x = (param3 * FX32_ONE); - v1.y = (param4 * FX32_ONE); - - Sprite_SetPosition(v0->unk_10, &v1); - - return v0; -} - -void *ov106_02243650(UnkStruct_ov106_02243650 *param0) -{ - Sprite_Delete(param0->unk_10); - Heap_Free(param0); - - return NULL; -} - -void ov106_02243664(UnkStruct_ov106_02243650 *param0, int param1) -{ - Sprite_SetDrawFlag(param0->unk_10, param1); - return; -} - -void ov106_02243670(UnkStruct_ov106_02243650 *param0, u16 param1, u16 param2) -{ - VecFx32 v0; - - if (param0->unk_0C != NULL) { - Sprite_SetAnimNoRestart(param0->unk_10, param0->unk_0C[0]); - } - - v0 = *(Sprite_GetPosition(param0->unk_10)); - - v0.x = (param1 * FX32_ONE); - v0.y = (param2 * FX32_ONE); - - Sprite_SetPosition(param0->unk_10, &v0); - return; -} - -void ov106_022436B0(UnkStruct_ov106_02243650 *param0, u32 param1) -{ - Sprite_SetAnimSpeed(param0->unk_10, FX32_ONE); - Sprite_SetAnimNoRestart(param0->unk_10, param1); - - return; -} - -void ov106_022436CC(UnkStruct_ov106_02243650 *param0, Pokemon *param1) -{ - Sprite_SetExplicitPaletteOffsetAutoAdjust(param0->unk_10, Pokemon_IconPaletteIndex(param1)); - return; -} diff --git a/src/overlay106/ov106_022436E0.c b/src/overlay106/ov106_022436E0.c deleted file mode 100644 index 105304914e..0000000000 --- a/src/overlay106/ov106_022436E0.c +++ /dev/null @@ -1,60 +0,0 @@ -#include "overlay106/ov106_022436E0.h" - -#include -#include - -#include "bg_window.h" -#include "render_window.h" - -void ov106_022436E0(BgConfig *param0, Window *param1); -void ov106_02243710(Window *param0); -void ov106_0224372C(BgConfig *param0, Window *param1); -void ov106_02243758(Window *param0, int param1); - -static const WindowTemplate Unk_ov106_02243860[] = { - { 0x0, 0x2, 0x13, 0x1B, 0x4, 0xC, 0x1 }, - { 0x0, 0x18, 0xD, 0x7, 0x4, 0xD, 0x6D }, - { 0x0, 0xA, 0x14, 0x9, 0x2, 0xD, 0x89 }, - { 0x1, 0x1, 0x0, 0x1F, 0x16, 0xD, 0x1 } -}; - -void ov106_022436E0(BgConfig *param0, Window *param1) -{ - u8 v0; - const WindowTemplate *v1 = Unk_ov106_02243860; - - for (v0 = 0; v0 < 4; v0++) { - Window_AddFromTemplate(param0, ¶m1[v0], &v1[v0]); - Window_FillTilemap(¶m1[v0], 0); - } - - return; -} - -void ov106_02243710(Window *param0) -{ - u16 v0; - - for (v0 = 0; v0 < 4; v0++) { - Window_Remove(¶m0[v0]); - } - - return; -} - -void ov106_0224372C(BgConfig *param0, Window *param1) -{ - LoadStandardWindowGraphics(param0, BG_LAYER_MAIN_0, (1024 - 9), 11, 0, HEAP_ID_98); - Window_DrawStandardFrame(param1, 1, (1024 - 9), 11); - - return; -} - -void ov106_02243758(Window *param0, int param1) -{ - LoadMessageBoxGraphics(param0->bgConfig, Window_GetBgLayer(param0), ((1024 - 9) - (18 + 12)), 10, param1, HEAP_ID_98); - Window_FillTilemap(param0, 15); - Window_DrawMessageBoxWithScrollCursor(param0, 0, ((1024 - 9) - (18 + 12)), 10); - - return; -} diff --git a/src/overlay107/ov107_02241AE0.c b/src/overlay107/ov107_02241AE0.c index f362fa53e9..6112254943 100644 --- a/src/overlay107/ov107_02241AE0.c +++ b/src/overlay107/ov107_02241AE0.c @@ -511,7 +511,7 @@ int ov107_02241BD4(ApplicationManager *appMan, int *param1) } ov107_02249DBC(&v0->unk_50[6], Options_Frame(v0->options)); - ov104_0222E5D0(v0->unk_24, 0); + BattleFrontier_SetPartnerInStrTemplate(v0->unk_24, 0); v0->unk_0A = ov107_02243918(v0, 8, FONT_MESSAGE); diff --git a/src/overlay107/ov107_02245EB0.c b/src/overlay107/ov107_02245EB0.c index 64ecf2b9ac..667e512d36 100644 --- a/src/overlay107/ov107_02245EB0.c +++ b/src/overlay107/ov107_02245EB0.c @@ -307,7 +307,7 @@ int ov107_02245FD0(ApplicationManager *appMan, int *param1) } ov107_02249DBC(&v0->unk_50[7], Options_Frame(v0->options)); - ov104_0222E5D0(v0->unk_24, 0); + BattleFrontier_SetPartnerInStrTemplate(v0->unk_24, 0); v0->unk_0A = ov107_022477CC(v0, 7, FONT_MESSAGE); ov107_02248350(v0, param1, 3); break; diff --git a/src/unk_02030108.c b/src/unk_02030108.c index d51ebe244c..d9170e4589 100644 --- a/src/unk_02030108.c +++ b/src/unk_02030108.c @@ -14,7 +14,6 @@ BOOL sub_02030124(UnkStruct_02030114 *param0); void sub_0203012C(UnkStruct_02030114 *param0, BOOL param1); void sub_02030140(UnkStruct_02030114 *param0, u8 param1, u8 param2, u8 param3, const void *param4); u32 sub_02030198(UnkStruct_02030114 *param0, u8 param1, u8 param2, u8 param3, void *param4); -u8 sub_020301E0(u8 param0, u8 *param1); void sub_02030204(u8 param0, u8 *param1, u8 param2); void sub_02030244(u8 *param0); void sub_02030260(UnkStruct_0203026C *param0); @@ -95,17 +94,13 @@ u32 sub_02030198(UnkStruct_02030114 *param0, u8 param1, u8 param2, u8 param3, vo return 0; } -u8 sub_020301E0(u8 param0, u8 *param1) +u8 BattleHall_GetRankOfType(u8 idx, u8 *typeRanks) { - u8 v0; - u8 v1; - u8 v2; + u8 byte = idx / 2; + u8 nybble = idx % 2; + u8 rank = (typeRanks[byte] >> (4 * nybble)) & 0xf; - v0 = (param0 / 2); - v1 = (param0 % 2); - v2 = (param1[v0] >> (4 * v1)) & 0xf; - - return v2; + return rank; } void sub_02030204(u8 param0, u8 *param1, u8 param2) diff --git a/src/unk_0209BA80.c b/src/unk_0209BA80.c index 7759a2004f..77d88e2bb1 100644 --- a/src/unk_0209BA80.c +++ b/src/unk_0209BA80.c @@ -9,10 +9,10 @@ #include "struct_defs/struct_02039A58.h" #include "struct_defs/struct_0209BBA4.h" +#include "applications/frontier/battle_hall/main.h" #include "overlay104/ov104_0222ECE8.h" #include "overlay104/ov104_0223C164.h" #include "overlay105/ov105_02241AE0.h" -#include "overlay106/ov106_02241AE0.h" #include "overlay107/ov107_02241AE0.h" #include "overlay107/ov107_02245EB0.h" #include "overlay108/ov108_02241AE0.h" @@ -57,9 +57,9 @@ static const CommCmdTable Unk_020F8BF0[] = { { ov104_0222EDDC, CommPacketSizeOf_Variable, NULL }, { ov104_0222EE38, CommPacketSizeOf_Variable, NULL }, { ov104_0222EEA8, CommPacketSizeOf_Variable, ov104_0222EED8 }, - { ov106_02243130, CommPacketSizeOf_Variable, NULL }, - { ov106_02243180, CommPacketSizeOf_Variable, NULL }, - { ov106_022431E0, CommPacketSizeOf_Variable, NULL }, + { BattleHall_DummyCommCommand, CommPacketSizeOf_Variable, NULL }, + { BattleHall_HandleTypeSelectionMsg, CommPacketSizeOf_Variable, NULL }, + { BattleHall_HandlePartnerDecisionCmd, CommPacketSizeOf_Variable, NULL }, { ov104_0222F418, CommPacketSizeOf_Variable, NULL }, { ov104_0222F480, CommPacketSizeOf_Variable, NULL }, { ov104_0222F530, CommPacketSizeOf_Variable, NULL },