diff --git a/asm/macros/frscrcmd.inc b/asm/macros/frscrcmd.inc index 7de9085904..0dca7b9f50 100644 --- a/asm/macros/frscrcmd.inc +++ b/asm/macros/frscrcmd.inc @@ -758,12 +758,12 @@ .short \arg1 .endm - .macro FrontierScrCmd_8B arg0, arg1, arg2, arg3 - .short FRSCRCMD_8B - .short \arg0 - .short \arg1 - .short \arg2 - .short \arg3 + .macro InitBattleHall resumingFromSave, challengeType, partySlot1, partySlot2 + .short FRSCRCMD_INITBATTLEHALL + .short \resumingFromSave + .short \challengeType + .short \partySlot1 + .short \partySlot2 .endm .macro FrontierScrCmd_8C arg0 @@ -771,8 +771,8 @@ .short \arg0 .endm - .macro FrontierScrCmd_8D - .short FRSCRCMD_8D + .macro FreeBattleHall + .short FRSCRCMD_FREEBATTLEHALL .endm .macro OpenBattleHallApp diff --git a/include/battle_hall_save.h b/include/battle_hall_save.h new file mode 100644 index 0000000000..32be1d59c2 --- /dev/null +++ b/include/battle_hall_save.h @@ -0,0 +1,42 @@ +#ifndef POKEPLATINUM_BATTLE_HALL_SAVE_H +#define POKEPLATINUM_BATTLE_HALL_SAVE_H + +#include "savedata.h" + +#define HALL_SAVE_CHALLENGE_TYPE 0 +#define HALL_SAVE_UNK_1 1 +#define HALL_SAVE_TRAINER_IDS 2 +#define HALL_SAVE_PARTY_SLOTS 3 +#define HALL_SAVE_UNK_4 4 +#define HALL_SAVE_STREAK_FLAGS 5 + +typedef struct BattleHallSave { + u8 challengeType : 3; + u8 didSave : 1; + u8 unk_00_4 : 4; + u8 unk_01; + u8 partySlots[2]; + u16 trainerIDs[20]; + u16 unk_2C[20]; +} BattleHallSave; + +typedef struct BattleHallStreakFlags { + u8 streakActiveFlags; + u8 unused[3]; +} BattleHallStreakFlags; + +void BattleHallSave_Init(BattleHallSave *challenge); +BattleHallSave *BattleHallSave_Get(SaveData *saveData); +BOOL BattleHallSave_HasSaved(BattleHallSave *save); +void BattleHallSave_RecordSave(BattleHallSave *save, BOOL didSave); +void BattleHallSave_SetMember(BattleHallSave *save, u8 field, u8 index, u8 unused, void *value); +u32 BattleHallSave_GetMember(BattleHallSave *save, u8 field, u8 index, u8 unused, void *unused2); +u8 BattleHall_GetRankOfType(u8 idx, u8 *typeRanks); +void BattleHall_SetRankOfType(u8 pokemonType, u8 *typeRanks, u8 value); +void BattleHall_ResetRankOfAllTypes(u8 *typeRanks); +void BattleHallStreakFlags_Init(BattleHallStreakFlags *flags); +BattleHallStreakFlags *BattleHallStreakFlags_Get(SaveData *saveData); +void BattleHallStreakFlags_SetFlag(BattleHallStreakFlags *flags, u8 field, u8 challengeType, u8 unused, u8 *value); +u32 BattleHallStreakFlags_GetFlag(BattleHallStreakFlags *flags, u8 field, u8 challengeType, u8 unused, void *unused2); + +#endif // POKEPLATINUM_BATTLE_HALL_SAVE_H diff --git a/include/constants/battle_frontier.h b/include/constants/battle_frontier.h index 68aae2fb81..09826f2e10 100644 --- a/include/constants/battle_frontier.h +++ b/include/constants/battle_frontier.h @@ -12,6 +12,8 @@ #define FRONTIER_RECORDS_APP_HALL 5 #define FRONTIER_RECORDS_APP_ARCADE 6 +#define BATTLES_PER_ROUND_HALL 10 + #define BATTLES_PER_ROUND_ARCADE 7 #define ARCADE_PARTY_SIZE_SOLO 3 diff --git a/include/constants/battle_frontier_stats.h b/include/constants/battle_frontier_stats.h index 97bdf667c1..2cba72ccf3 100644 --- a/include/constants/battle_frontier_stats.h +++ b/include/constants/battle_frontier_stats.h @@ -36,42 +36,42 @@ enum BattleFrontierStatsIndex { STAT_FACTORY_LATEST_STREAK_OPEN_MULTI, STAT_FACTORY_RECORD_TRADE_COUNT_OPEN_MULTI, STAT_FACTORY_LATEST_TRADE_COUNT_OPEN_MULTI, - STAT_HALL_UNK_34, + STAT_HALL_CURRENT_STREAK_SINGLE, STAT_HALL_LATEST_STREAK_SINGLE, STAT_HALL_LATEST_SPECIES_SINGLE, - STAT_HALL_UNK_37, - STAT_HALL_UNK_38, - STAT_HALL_UNK_39, - STAT_HALL_UNK_40, - STAT_HALL_UNK_41, - STAT_HALL_UNK_42, - STAT_HALL_UNK_43, - STAT_HALL_UNK_44, - STAT_HALL_UNK_45, - STAT_HALL_UNK_46, + STAT_HALL_CURRENT_RANKS_NORMAL_FIGHTING_SINGLE, + STAT_HALL_CURRENT_RANKS_FLYING_POISON_SINGLE, + STAT_HALL_CURRENT_RANKS_GROUND_ROCK_SINGLE, + STAT_HALL_CURRENT_RANKS_BUG_GHOST_SINGLE, + STAT_HALL_CURRENT_RANKS_STEEL_MYSTERY_SINGLE, + STAT_HALL_CURRENT_RANKS_FIRE_WATER_SINGLE, + STAT_HALL_CURRENT_RANKS_GRASS_ELECTRIC_SINGLE, + STAT_HALL_CURRENT_RANKS_PSYCHIC_ICE_SINGLE, + STAT_HALL_CURRENT_RANKS_DRAGON_DARK_SINGLE, + STAT_HALL_CURRENT_STREAK_DOUBLE, STAT_HALL_LATEST_STREAK_DOUBLE, STAT_HALL_LATEST_SPECIES_DOUBLE, - STAT_HALL_UNK_49, - STAT_HALL_UNK_50, - STAT_HALL_UNK_51, - STAT_HALL_UNK_52, - STAT_HALL_UNK_53, - STAT_HALL_UNK_54, - STAT_HALL_UNK_55, - STAT_HALL_UNK_56, - STAT_HALL_UNK_57, - STAT_HALL_UNK_58, + STAT_HALL_CURRENT_RANKS_NORMAL_FIGHTING_DOUBLE, + STAT_HALL_CURRENT_RANKS_FLYING_POISON_DOUBLE, + STAT_HALL_CURRENT_RANKS_GROUND_ROCK_DOUBLE, + STAT_HALL_CURRENT_RANKS_BUG_GHOST_DOUBLE, + STAT_HALL_CURRENT_RANKS_STEEL_MYSTERY_DOUBLE, + STAT_HALL_CURRENT_RANKS_FIRE_WATER_DOUBLE, + STAT_HALL_CURRENT_RANKS_GRASS_ELECTRIC_DOUBLE, + STAT_HALL_CURRENT_RANKS_PSYCHIC_ICE_DOUBLE, + STAT_HALL_CURRENT_RANKS_DRAGON_DARK_DOUBLE, + STAT_HALL_CURRENT_STREAK_MULTI, STAT_HALL_LATEST_STREAK_MULTI, STAT_HALL_LATEST_SPECIES_MULTI, - STAT_HALL_UNK_61, - STAT_HALL_UNK_62, - STAT_HALL_UNK_63, - STAT_HALL_UNK_64, - STAT_HALL_UNK_65, - STAT_HALL_UNK_66, - STAT_HALL_UNK_67, - STAT_HALL_UNK_68, - STAT_HALL_UNK_69, + STAT_HALL_CURRENT_RANKS_NORMAL_FIGHTING_MULTI, + STAT_HALL_CURRENT_RANKS_FLYING_POISON_MULTI, + STAT_HALL_CURRENT_RANKS_GROUND_ROCK_MULTI, + STAT_HALL_CURRENT_RANKS_BUG_GHOST_MULTI, + STAT_HALL_CURRENT_RANKS_STEEL_MYSTERY_MULTI, + STAT_HALL_CURRENT_RANKS_FIRE_WATER_MULTI, + STAT_HALL_CURRENT_RANKS_GRASS_ELECTRIC_MULTI, + STAT_HALL_CURRENT_RANKS_PSYCHIC_ICE_MULTI, + STAT_HALL_CURRENT_RANKS_DRAGON_DARK_MULTI, STAT_CASTLE_RECORD_STREAK_SINGLE, STAT_CASTLE_LATEST_STREAK_SINGLE, STAT_CASTLE_LATEST_CP_SINGLE, @@ -132,18 +132,18 @@ enum BattleFrontierStatsIndex { STAT_FACTORY_LATEST_STREAK_OPEN_MULTI_WFC, STAT_FACTORY_RECORD_TRADE_COUNT_OPEN_MULTI_WFC, STAT_FACTORY_LATEST_TRADE_COUNT_OPEN_MULTI_WFC, - STAT_HALL_UNK_122, + STAT_HALL_CURRENT_STREAK_MULTI_WFC, STAT_HALL_LATEST_STREAK_MULTI_WFC, STAT_HALL_LATEST_SPECIES_MULTI_WFC, - STAT_HALL_UNK_125, - STAT_HALL_UNK_126, - STAT_HALL_UNK_127, - STAT_HALL_UNK_128, - STAT_HALL_UNK_129, - STAT_HALL_UNK_130, - STAT_HALL_UNK_131, - STAT_HALL_UNK_132, - STAT_HALL_UNK_133, + STAT_HALL_CURRENT_RANKS_NORMAL_FIGHTING_MULTI_WFC, + STAT_HALL_CURRENT_RANKS_FLYING_POISON_MULTI_WFC, + STAT_HALL_CURRENT_RANKS_GROUND_ROCK_MULTI_WFC, + STAT_HALL_CURRENT_RANKS_BUG_GHOST_MULTI_WFC, + STAT_HALL_CURRENT_RANKS_STEEL_MYSTERY_MULTI_WFC, + STAT_HALL_CURRENT_RANKS_FIRE_WATER_MULTI_WFC, + STAT_HALL_CURRENT_RANKS_GRASS_ELECTRIC_MULTI_WFC, + STAT_HALL_CURRENT_RANKS_PSYCHIC_ICE_MULTI_WFC, + STAT_HALL_CURRENT_RANKS_DRAGON_DARK_MULTI_WFC, STAT_CASTLE_RECORD_STREAK_MULTI_WFC, STAT_CASTLE_LATEST_STREAK_MULTI_WFC, STAT_CASTLE_LATEST_CP_MULTI_WFC, diff --git a/include/constants/battle_hall_functions.h b/include/constants/battle_hall_functions.h index 0157f76bda..b800e5a525 100644 --- a/include/constants/battle_hall_functions.h +++ b/include/constants/battle_hall_functions.h @@ -12,7 +12,7 @@ enum BattleHallFunction { BH_FUNC_RESET_SYSTEM, BH_FUNC_UNK_8, BH_FUNC_UNK_9, - BH_FUNC_UNK_10, + BH_FUNC_QUICKSAVE, BH_FUNC_UNK_11, BH_FUNC_UNK_12, BH_FUNC_UNK_13, @@ -29,7 +29,7 @@ enum BattleHallFunction { BH_FUNC_UNK_24, BH_FUNC_UNK_25, BH_FUNC_UNK_26, - BH_FUNC_UPDATE_HELD_ITEMS, + BH_FUNC_RESTORE_HELD_ITEMS, BH_FUNC_UNK_28, BH_FUNC_UNK_29, BH_FUNC_IS_MULTIPLAYER_CHALLENGE, diff --git a/include/data/scripts/frscrcmd.h b/include/data/scripts/frscrcmd.h index 5af080132c..2308e6bf57 100644 --- a/include/data/scripts/frscrcmd.h +++ b/include/data/scripts/frscrcmd.h @@ -144,9 +144,9 @@ ScriptCommand(FRSCRCMD_BATTLETOWER_STARTBATTLE, FrontierScrCmd_BattleTo ScriptCommand(FRSCRCMD_BATTLETOWER_CHECKWONBATTLE, FrontierScrCmd_BattleTower_CheckWonBattle) ScriptCommand(FRSCRCMD_89, FrontierScrCmd_89) ScriptCommand(FRSCRCMD_8A, FrontierScrCmd_8A) -ScriptCommand(FRSCRCMD_8B, FrontierScrCmd_8B) +ScriptCommand(FRSCRCMD_INITBATTLEHALL, FrontierScrCmd_InitBattleHall) ScriptCommand(FRSCRCMD_8C, FrontierScrCmd_8C) -ScriptCommand(FRSCRCMD_8D, FrontierScrCmd_8D) +ScriptCommand(FRSCRCMD_FREEBATTLEHALL, FrontierScrCmd_FreeBattleHall) ScriptCommand(FRSCRCMD_OPENBATTLEHALLAPP, FrontierScrCmd_OpenBattleHallApp) ScriptCommand(FRSCRCMD_BATTLEHALL_CLEANUPBATTLE, FrontierScrCmd_BattleHall_CleanupBattle) ScriptCommand(FRSCRCMD_BATTLEHALL_STARTBATTLE, FrontierScrCmd_BattleHall_StartBattle) diff --git a/include/overlay104/frscrcmd_battle_hall.h b/include/overlay104/frscrcmd_battle_hall.h index 787ad9d67d..38f59e330b 100644 --- a/include/overlay104/frscrcmd_battle_hall.h +++ b/include/overlay104/frscrcmd_battle_hall.h @@ -3,14 +3,14 @@ #include "overlay104/defs.h" -BOOL FrontierScrCmd_8B(FrontierScriptContext *param0); +BOOL FrontierScrCmd_InitBattleHall(FrontierScriptContext *ctx); BOOL FrontierScrCmd_8C(FrontierScriptContext *param0); -BOOL FrontierScrCmd_8D(FrontierScriptContext *param0); +BOOL FrontierScrCmd_FreeBattleHall(FrontierScriptContext *ctx); BOOL FrontierScrCmd_OpenBattleHallApp(FrontierScriptContext *ctx); BOOL FrontierScrCmd_BattleHall_CleanupBattle(FrontierScriptContext *ctx); BOOL FrontierScrCmd_BattleHall_StartBattle(FrontierScriptContext *ctx); BOOL FrontierScrCmd_CallBattleHallFunction(FrontierScriptContext *ctx); -BOOL FrontierScrCmd_BattleHall_CheckWonBattle(FrontierScriptContext *param0); +BOOL FrontierScrCmd_BattleHall_CheckWonBattle(FrontierScriptContext *ctx); BOOL FrontierScrCmd_93(FrontierScriptContext *param0); BOOL FrontierScrCmd_94(FrontierScriptContext *param0); BOOL FrontierScrCmd_95(FrontierScriptContext *param0); diff --git a/include/overlay104/ov104_0222DCE0.h b/include/overlay104/ov104_0222DCE0.h index 7b30453f4c..74021352da 100644 --- a/include/overlay104/ov104_0222DCE0.h +++ b/include/overlay104/ov104_0222DCE0.h @@ -36,6 +36,6 @@ BOOL ov104_0222E3E4(BattleFrontierTrainerData *param0, const u16 param1[], const void ov104_0222E4BC(u8 param0, u16 param1, u16 param2, u16 *param3, FrontierPokemonDataDTO *param4, u8 *param5, u32 *param6, u8 param7); void BattleFrontier_SetPartnerInStrTemplate(StringTemplate *template, u32 idx); enum ObjectEventGfx BattleFrontier_GetPlayerObjEventGfx(const TrainerInfo *param0); -void ov104_0222E630(SaveData *saveData); +void BattleFrontier_FlagGeonetLinkInfo(SaveData *saveData); #endif // POKEPLATINUM_OV104_0222DCE0_H diff --git a/include/overlay104/ov104_02234DB4.h b/include/overlay104/ov104_02234DB4.h index c96ef580ae..6f7388fbce 100644 --- a/include/overlay104/ov104_02234DB4.h +++ b/include/overlay104/ov104_02234DB4.h @@ -5,12 +5,12 @@ #include "savedata.h" -BattleHall *ov104_02234DB4(SaveData *saveData, u16 param1, u8 param2, u8 param3, u8 param4); +BattleHall *BattleHall_Init(SaveData *saveData, u16 resumingFromSave, u8 challengeType, u8 partySlot1, u8 partySlot2); void ov104_022350B0(BattleHall *param0, u16 param1); -void ov104_02235190(BattleHall *param0); +void BattleHall_Free(BattleHall *battleHall); void BattleHall_GetTypeSelectionAppResult(BattleHall *battleHall, void *args); void BattleHall_UpdateWinRecordForCurrentMon(BattleHall *battleHall, u16 *updated); -void ov104_0223526C(BattleHall *param0, u8 param1); +void BattleHall_Save(BattleHall *battleHall, u8 saveType); u16 ov104_022354B0(BattleHall *param0); u16 ov104_022354BC(BattleHall *param0); u16 ov104_022354C0(BattleHall *param0, u8 param1); diff --git a/include/overlay104/struct_battle_hall.h b/include/overlay104/struct_battle_hall.h index 98aa15923a..d36f86310c 100644 --- a/include/overlay104/struct_battle_hall.h +++ b/include/overlay104/struct_battle_hall.h @@ -1,47 +1,49 @@ #ifndef POKEPLATINUM_STRUCT_BATTLE_HALL_H #define POKEPLATINUM_STRUCT_BATTLE_HALL_H -#include "struct_decls/struct_02030114_decl.h" +#include "constants/battle_frontier.h" + +#include "struct_defs/pokemon.h" #include "overlay104/frontier_data_transfer.h" +#include "battle_hall_save.h" #include "field_battle_data_transfer.h" #include "party.h" -#include "pokemon.h" #include "savedata.h" typedef struct BattleHall { - int unk_00; + int unused; u8 challengeType; u8 unk_05; - u8 unk_06; + u8 streakActive; u8 unk_07; u16 currentStreak; - u16 unk_0A; + u16 currentRound; fx32 playerLevelSqrt; u32 unk_10; int wonBattle; - u16 trainerIDs[20]; + u16 trainerIDs[BATTLES_PER_ROUND_HALL * 2]; FrontierDataDTO unk_40[2]; - u8 unk_260[2]; - Party *unk_264; + u8 partySlots[2]; + Party *party; u16 unk_268[20]; FrontierPokemonDataDTO unk_290[20]; u16 unk_6F0; u16 selectedTypeIdx2; u8 selectedType; u8 selectedTypeIdx; - UnkStruct_02030114 *unk_6F8; + BattleHallSave *hallSave; SaveData *saveData; FieldBattleDTO *dto; - u8 unk_704[4][9]; - u16 unk_728[2]; + u8 typeRanks[4][9]; + u16 heldItems[2]; u16 unk_72C[44]; u8 unk_784[512]; u8 unk_984[2][512]; u16 unk_D84[2]; u8 unk_D88; - Pokemon *unk_D8C; + Pokemon *partnersMon; u8 unk_D90; u32 unk_D94; } BattleHall; diff --git a/include/struct_decls/struct_02030114_decl.h b/include/struct_decls/struct_02030114_decl.h deleted file mode 100644 index 450c93b4c8..0000000000 --- a/include/struct_decls/struct_02030114_decl.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef POKEPLATINUM_STRUCT_02030114_DECL_H -#define POKEPLATINUM_STRUCT_02030114_DECL_H - -typedef struct UnkStruct_02030114_t UnkStruct_02030114; - -#endif // POKEPLATINUM_STRUCT_02030114_DECL_H diff --git a/include/struct_decls/struct_0203026C_decl.h b/include/struct_decls/struct_0203026C_decl.h deleted file mode 100644 index 69591a63f4..0000000000 --- a/include/struct_decls/struct_0203026C_decl.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef POKEPLATINUM_STRUCT_0203026C_DECL_H -#define POKEPLATINUM_STRUCT_0203026C_DECL_H - -typedef struct UnkStruct_0203026C_t UnkStruct_0203026C; - -#endif // POKEPLATINUM_STRUCT_0203026C_DECL_H diff --git a/include/struct_defs/battle_frontier.h b/include/struct_defs/battle_frontier.h index cfabafda63..a42d4c62ef 100644 --- a/include/struct_defs/battle_frontier.h +++ b/include/struct_defs/battle_frontier.h @@ -9,13 +9,12 @@ #include "struct_defs/struct_0202D764.h" #include "struct_defs/struct_0202FF58.h" #include "struct_defs/struct_020300F4.h" -#include "struct_defs/struct_02030114.h" -#include "struct_defs/struct_0203026C.h" #include "struct_defs/struct_020302DC.h" #include "struct_defs/struct_0203041C.h" #include "struct_defs/struct_020304A0.h" #include "struct_defs/struct_020305B8.h" +#include "battle_hall_save.h" #include "wifi_list.h" typedef struct BattleFrontierStats { @@ -28,7 +27,7 @@ typedef struct BattleFrontier { union { UnkStruct_0202D060 unk_8E0_val1; UnkStruct_0202FF58 unk_8E0_val2; - UnkStruct_02030114 unk_8E0_val3; + BattleHallSave hallSave; UnkStruct_020302DC unk_8E0_val4; UnkStruct_020304A0 unk_8E0_val5; }; @@ -41,8 +40,8 @@ typedef struct BattleFrontier { UnkStruct_020300F4 unk_00; } unk_1614; struct { - UnkStruct_0203026C unk_00; - } unk_1618; + BattleHallStreakFlags streakFlags; + } hall; struct { UnkStruct_0203041C unk_00; } unk_161C; diff --git a/include/struct_defs/struct_02030114.h b/include/struct_defs/struct_02030114.h deleted file mode 100644 index 58726fb911..0000000000 --- a/include/struct_defs/struct_02030114.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef POKEPLATINUM_STRUCT_02030114_H -#define POKEPLATINUM_STRUCT_02030114_H - -typedef struct UnkStruct_02030114_t { - u8 unk_00_0 : 3; - u8 unk_00_3 : 1; - u8 unk_00_4 : 4; - u8 unk_01; - u8 unk_02[2]; - u16 unk_04[20]; - u16 unk_2C[20]; -} UnkStruct_02030114; - -#endif // POKEPLATINUM_STRUCT_02030114_H diff --git a/include/struct_defs/struct_0203026C.h b/include/struct_defs/struct_0203026C.h deleted file mode 100644 index f78127f7d4..0000000000 --- a/include/struct_defs/struct_0203026C.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef POKEPLATINUM_STRUCT_0203026C_H -#define POKEPLATINUM_STRUCT_0203026C_H - -typedef struct UnkStruct_0203026C_t { - u8 unk_00; - u8 unk_01; - u16 unk_02; -} UnkStruct_0203026C; - -#endif // POKEPLATINUM_STRUCT_0203026C_H diff --git a/include/unk_02030108.h b/include/unk_02030108.h deleted file mode 100644 index 467d69bcc2..0000000000 --- a/include/unk_02030108.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef POKEPLATINUM_UNK_02030108_H -#define POKEPLATINUM_UNK_02030108_H - -#include "struct_decls/struct_02030114_decl.h" -#include "struct_decls/struct_0203026C_decl.h" - -#include "savedata.h" - -void sub_02030108(UnkStruct_02030114 *param0); -UnkStruct_02030114 *sub_02030114(SaveData *saveData); -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 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); -UnkStruct_0203026C *sub_0203026C(SaveData *saveData); -void sub_02030280(UnkStruct_0203026C *param0, u8 param1, u8 param2, u8 param3, const void *param4); -u32 sub_020302B4(UnkStruct_0203026C *param0, u8 param1, u8 param2, u8 param3, void *param4); - -#endif // POKEPLATINUM_UNK_02030108_H diff --git a/include/unk_0204FA34.h b/include/unk_0204FA34.h index c988aae71a..4210e94e48 100644 --- a/include/unk_0204FA34.h +++ b/include/unk_0204FA34.h @@ -1,7 +1,7 @@ #ifndef POKEPLATINUM_UNK_0204FA34_H #define POKEPLATINUM_UNK_0204FA34_H -#include "struct_decls/struct_0203026C_decl.h" +#include "struct_defs/battle_frontier.h" #include "savedata.h" @@ -15,6 +15,6 @@ typedef struct BattleHallSameSpeciesCheck { } BattleHallSameSpeciesCheck; void BattleHall_ProcessSelectedSpeciesMsg(int netID, int unused, void *data, void *context); -void sub_0204FA50(SaveData *saveData, UnkStruct_0203026C *param1, u8 param2); +void sub_0204FA50(SaveData *saveData, BattleHallStreakFlags *param1, u8 param2); #endif // POKEPLATINUM_UNK_0204FA34_H diff --git a/include/unk_0205DFC4.h b/include/unk_0205DFC4.h index 988c1555da..7d9581af91 100644 --- a/include/unk_0205DFC4.h +++ b/include/unk_0205DFC4.h @@ -20,9 +20,9 @@ enum BattleFrontierStatsIndex BattleFrontierStats_GetFactoryLatestStreakIdx(u8 i enum BattleFrontierStatsIndex BattleFrontierStats_GetFactoryRecordStreakIdx(u8 isOpenLevel, u8 challengeType); enum BattleFrontierStatsIndex BattleFrontierStats_GetFactoryLatestTradeCountIndex(u8 isOpenLevel, u8 challengeType); enum BattleFrontierStatsIndex BattleFrontierStats_GetFactoryRecordTradeCountIndex(u8 isOpenLevel, u8 challengeType); -enum BattleFrontierStatsIndex sub_0205E4E0(u8 param0, u8 param1); +enum BattleFrontierStatsIndex BattleFrontierStats_GetHallCurrentTypeRanksIndex(u8 challengeType, u8 pokemonType); enum BattleFrontierStatsIndex BattleFrontierStats_GetHallLatestStreakIndex(u8 challengeType); -enum BattleFrontierStatsIndex sub_0205E534(u8 param0); +enum BattleFrontierStatsIndex BattleFrontierStats_GetHallCurrentStreakIndex(u8 challengeType); enum BattleFrontierStatsIndex BattleFrontierStats_GetHallLatestSpeciesIndex(u8 challengeType); enum BattleFrontierStatsIndex BattleFrontierStats_GetHallRecordStreakIndex(u8 challengeType); enum BattleFrontierStatsIndex BattleFrontierStats_GetCastleRankIndex(u8 challengeType, u8 rankType); diff --git a/platinum.us/main.lsf b/platinum.us/main.lsf index 557da66640..510b69afc8 100644 --- a/platinum.us/main.lsf +++ b/platinum.us/main.lsf @@ -143,7 +143,7 @@ Static main Object main.nef.p/src_save_catchrecords.c.o Object main.nef.p/src_unk_0202F1D4.c.o Object main.nef.p/src_unk_0202FF4C.c.o - Object main.nef.p/src_unk_02030108.c.o + Object main.nef.p/src_battle_hall_save.c.o Object main.nef.p/src_unk_020302D0.c.o Object main.nef.p/src_unk_02030494.c.o Object main.nef.p/src_battle_frontier_stats.c.o diff --git a/res/field/frontier_scripts/frontier_scripts_battle_hall.s b/res/field/frontier_scripts/frontier_scripts_battle_hall.s index 1d51c6f4ca..61069b5557 100644 --- a/res/field/frontier_scripts/frontier_scripts_battle_hall.s +++ b/res/field/frontier_scripts/frontier_scripts_battle_hall.s @@ -471,7 +471,7 @@ _0326: GetPlayerObjEventGfx VAR_0x800A SetVar FR_VAR_0x800E, 0 InitNewBattleRecording - FrontierScrCmd_8B VAR_0x8003, VAR_0x8001, VAR_0x8002, VAR_0x8000 + InitBattleHall VAR_0x8003, VAR_0x8001, VAR_0x8002, VAR_0x8000 CallBattleHallFunction BH_FUNC_IS_MULTIPLAYER_CHALLENGE, 0, 0, VAR_0x8008 GoToIfEq VAR_0x8008, 1, _0382 SetVar FR_VAR_0x800F, 231 @@ -787,7 +787,7 @@ _08F1: _0907: BattleHall_StartBattle BattleHall_CleanupBattle - CallBattleHallFunction BH_FUNC_UPDATE_HELD_ITEMS, 0, 0, VAR_0x8008 + CallBattleHallFunction BH_FUNC_RESTORE_HELD_ITEMS, 0, 0, VAR_0x8008 CallBattleHallFunction BH_FUNC_TOGGLE_ENGINE_LAYER, 0, 0, VAR_0x8008 FadeScreenIn BattleHall_CheckWonBattle VAR_0x8008 @@ -1124,10 +1124,10 @@ _0E7B: _0E99: SetSystemVar VAR_BATTLE_HALL_LOBBY_LOAD_ACTION, 2 - CallBattleHallFunction BH_FUNC_UNK_10, 0, 0, VAR_0x8008 + CallBattleHallFunction BH_FUNC_QUICKSAVE, 0, 0, VAR_0x8008 Call _1087 FreeBattleRecording - FrontierScrCmd_8D + FreeBattleHall FadeScreenOut CloseMessage CallBattleHallFunction BH_FUNC_RESET_SYSTEM, 0, 0, VAR_0x8008 @@ -1235,7 +1235,7 @@ _101D: CallBattleHallFunction BH_FUNC_GET_CHALLENGE_TYPE, 0, 0, VAR_0x8008 GoToIfEq VAR_0x8008, 3, _107B FreeBattleRecording - FrontierScrCmd_8D + FreeBattleHall FrontierScrCmd_02 _106B: @@ -1250,7 +1250,7 @@ _1071: _107B: FreeBattleRecording - FrontierScrCmd_8D + FreeBattleHall FrontierScrCmd_04 14, 1 End diff --git a/src/applications/frontier/battle_hall/main.c b/src/applications/frontier/battle_hall/main.c index b35d1df4e1..ce7a792f30 100644 --- a/src/applications/frontier/battle_hall/main.c +++ b/src/applications/frontier/battle_hall/main.c @@ -11,6 +11,7 @@ #include "overlay104/ov104_0222DCE0.h" #include "overlay104/ov104_0223AF58.h" +#include "battle_hall_save.h" #include "bg_window.h" #include "communication_system.h" #include "dexmode_checker.h" @@ -44,7 +45,6 @@ #include "system.h" #include "text.h" #include "trainer_info.h" -#include "unk_02030108.h" #include "unk_020363E8.h" #include "unk_0209BA80.h" #include "vram_transfer.h" diff --git a/src/battle_frontier_stats.c b/src/battle_frontier_stats.c index e6f94e53ec..99d522dd33 100644 --- a/src/battle_frontier_stats.c +++ b/src/battle_frontier_stats.c @@ -4,10 +4,10 @@ #include "struct_defs/battle_frontier.h" +#include "battle_hall_save.h" #include "savedata.h" #include "unk_0202D05C.h" #include "unk_0202FF4C.h" -#include "unk_02030108.h" #include "unk_020302D0.h" #include "unk_02030494.h" #include "wifi_list.h" @@ -25,7 +25,7 @@ void BattleFrontier_Init(BattleFrontier *frontier) sub_0202D080(&frontier->unk_950.unk_168); sub_0202D0AC(&frontier->unk_950.unk_188); sub_020300A4(&frontier->unk_1614.unk_00); - sub_02030260(&frontier->unk_1618.unk_00); + BattleHallStreakFlags_Init(&frontier->hall.streakFlags); sub_02030410(&frontier->unk_161C.unk_00); sub_020305AC(&frontier->unk_1620.unk_00); } diff --git a/src/battle_hall_save.c b/src/battle_hall_save.c new file mode 100644 index 0000000000..c20c038704 --- /dev/null +++ b/src/battle_hall_save.c @@ -0,0 +1,147 @@ +#include "battle_hall_save.h" + +#include + +#include "generated/pokemon_types.h" + +#include "struct_defs/battle_frontier.h" + +#include "savedata.h" + +void BattleHallSave_Init(BattleHallSave *challenge) +{ + MI_CpuClear8(challenge, sizeof(BattleHallSave)); +} + +BattleHallSave *BattleHallSave_Get(SaveData *saveData) +{ + BattleFrontier *frontier = SaveData_SaveTable(saveData, SAVE_TABLE_ENTRY_FRONTIER); + return &frontier->hallSave; +} + +BOOL BattleHallSave_HasSaved(BattleHallSave *save) +{ + return save->didSave; +} + +void BattleHallSave_RecordSave(BattleHallSave *save, BOOL didSave) +{ + save->didSave = didSave; +} + +void BattleHallSave_SetMember(BattleHallSave *save, u8 field, u8 index, u8 unused, void *value) +{ + switch (field) { + case HALL_SAVE_CHALLENGE_TYPE: + save->challengeType = *(u8 *)value; + break; + case HALL_SAVE_UNK_1: + save->unk_01 = *(u8 *)value; + break; + case HALL_SAVE_TRAINER_IDS: + save->trainerIDs[index] = *(u16 *)value; + break; + case HALL_SAVE_PARTY_SLOTS: + save->partySlots[index] = *(u8 *)value; + break; + case HALL_SAVE_UNK_4: + save->unk_2C[index] = *(u16 *)value; + break; + default: + GF_ASSERT(FALSE); + break; + } +} + +u32 BattleHallSave_GetMember(BattleHallSave *save, u8 field, u8 index, u8 unused, void *unused2) +{ + switch (field) { + case HALL_SAVE_CHALLENGE_TYPE: + return save->challengeType; + case HALL_SAVE_UNK_1: + return save->unk_01; + case HALL_SAVE_TRAINER_IDS: + return save->trainerIDs[index]; + case HALL_SAVE_PARTY_SLOTS: + return save->partySlots[index]; + case HALL_SAVE_UNK_4: + return save->unk_2C[index]; + default: + GF_ASSERT(FALSE); + break; + } + + return 0; +} + +u8 BattleHall_GetRankOfType(u8 idx, u8 *typeRanks) +{ + u8 byte = idx / 2; + u8 nybble = idx % 2; + u8 rank = (typeRanks[byte] >> (4 * nybble)) & 0xf; + + return rank; +} + +void BattleHall_SetRankOfType(u8 pokemonType, u8 *typeRanks, u8 value) +{ + u8 byte = pokemonType / 2; + u8 nybble = pokemonType % 2; + + if (nybble == 0) { + typeRanks[byte] = typeRanks[byte] & 0xf0; + } else { + typeRanks[byte] = typeRanks[byte] & 0xf; + } + + u8 rankPair = value << (4 * nybble); + typeRanks[byte] |= rankPair; +} + +void BattleHall_ResetRankOfAllTypes(u8 *typeRanks) +{ + for (int i = 0; i < NUM_POKEMON_TYPES; i++) { + BattleHall_SetRankOfType(i, typeRanks, 0); + } +} + +void BattleHallStreakFlags_Init(BattleHallStreakFlags *flags) +{ + MI_CpuClear8(flags, sizeof(BattleHallStreakFlags)); +} + +BattleHallStreakFlags *BattleHallStreakFlags_Get(SaveData *saveData) +{ + BattleFrontier *frontier = SaveData_SaveTable(saveData, SAVE_TABLE_ENTRY_FRONTIER); + return &frontier->hall.streakFlags; +} + +void BattleHallStreakFlags_SetFlag(BattleHallStreakFlags *flags, u8 field, u8 challengeType, u8 unused, u8 *value) +{ + u8 *value_dupe = (u8 *)value; + switch (field) { + case HALL_SAVE_STREAK_FLAGS: + if (*value_dupe >= 1) { + flags->streakActiveFlags |= (1 << challengeType); + } else { + flags->streakActiveFlags &= (0xff ^ (1 << challengeType)); + } + break; + default: + GF_ASSERT(FALSE); + break; + } +} + +u32 BattleHallStreakFlags_GetFlag(BattleHallStreakFlags *flags, u8 field, u8 challengeType, u8 unused, void *unused2) +{ + switch (field) { + case HALL_SAVE_STREAK_FLAGS: + return (flags->streakActiveFlags >> challengeType) & 0x1; + default: + GF_ASSERT(FALSE); + break; + } + + return FALSE; +} diff --git a/src/meson.build b/src/meson.build index 62126fd609..163438641b 100644 --- a/src/meson.build +++ b/src/meson.build @@ -132,7 +132,7 @@ pokeplatinum_c = files( 'save_catchrecords.c', 'unk_0202F1D4.c', 'unk_0202FF4C.c', - 'unk_02030108.c', + 'battle_hall_save.c', 'unk_020302D0.c', 'unk_02030494.c', 'battle_frontier_stats.c', diff --git a/src/overlay104/frscrcmd_battle_hall.c b/src/overlay104/frscrcmd_battle_hall.c index e430bd72e5..6c2d9d088a 100644 --- a/src/overlay104/frscrcmd_battle_hall.c +++ b/src/overlay104/frscrcmd_battle_hall.c @@ -19,6 +19,7 @@ #include "overlay104/struct_ov104_02230BE4.h" #include "savedata/save_table.h" +#include "battle_hall_save.h" #include "field_battle_data_transfer.h" #include "gx_layers.h" #include "heap.h" @@ -26,7 +27,6 @@ #include "pokemon.h" #include "sound.h" #include "tv_segment.h" -#include "unk_02030108.h" #include "unk_0209B6F8.h" #include "unk_0209BA80.h" @@ -39,21 +39,19 @@ FS_EXTERN_OVERLAY(battle_hall_app); static BOOL ov104_02234CEC(FrontierScriptContext *param0); static void StoreBattleHallAppResult(void *data); -BOOL FrontierScrCmd_8B(FrontierScriptContext *param0) +BOOL FrontierScrCmd_InitBattleHall(FrontierScriptContext *ctx) { - BattleHall *v0; - UnkStruct_ov104_02230BE4 *v1; - u16 v2 = FrontierScriptContext_GetVar(param0); - u16 v3 = FrontierScriptContext_GetVar(param0); - u16 v4 = FrontierScriptContext_GetVar(param0); - u16 v5 = FrontierScriptContext_GetVar(param0); + u16 resumingFromSave = FrontierScriptContext_GetVar(ctx); + u16 challengeType = FrontierScriptContext_GetVar(ctx); + u16 partySlot1 = FrontierScriptContext_GetVar(ctx); + u16 partySlot2 = FrontierScriptContext_GetVar(ctx); - v1 = sub_0209B970(param0->scriptMan->unk_00); - v0 = ov104_02234DB4(v1->saveData, v2, v3, v4, v5); + UnkStruct_ov104_02230BE4 *v1 = sub_0209B970(ctx->scriptMan->unk_00); + BattleHall *battleHall = BattleHall_Init(v1->saveData, resumingFromSave, challengeType, partySlot1, partySlot2); - sub_0209B980(param0->scriptMan->unk_00, v0); + sub_0209B980(ctx->scriptMan->unk_00, battleHall); - return 0; + return FALSE; } BOOL FrontierScrCmd_8C(FrontierScriptContext *param0) @@ -67,12 +65,12 @@ BOOL FrontierScrCmd_8C(FrontierScriptContext *param0) return 0; } -BOOL FrontierScrCmd_8D(FrontierScriptContext *param0) +BOOL FrontierScrCmd_FreeBattleHall(FrontierScriptContext *ctx) { - BattleHall *v0 = sub_0209B978(param0->scriptMan->unk_00); - ov104_02235190(v0); + BattleHall *battleHall = sub_0209B978(ctx->scriptMan->unk_00); + BattleHall_Free(battleHall); - return 0; + return FALSE; } BOOL FrontierScrCmd_OpenBattleHallApp(FrontierScriptContext *ctx) @@ -96,8 +94,8 @@ BOOL FrontierScrCmd_OpenBattleHallApp(FrontierScriptContext *ctx) args->saveData = v5->saveData; args->challengeType = battleHall->challengeType; args->battleHall = battleHall; - args->typeRanks = &battleHall->unk_704[battleHall->challengeType][0]; - args->party = battleHall->unk_264; + args->typeRanks = &battleHall->typeRanks[battleHall->challengeType][0]; + args->party = battleHall->party; args->currentStreak = battleHall->currentStreak; args->cursorPos = battleHall->selectedTypeIdx; args->partnersLevel = &battleHall->unk_D84[0]; @@ -105,15 +103,15 @@ BOOL FrontierScrCmd_OpenBattleHallApp(FrontierScriptContext *ctx) Party_Init(args->party); Party *party = SaveData_GetParty(v5->saveData); - Pokemon *mon = Party_GetPokemonBySlotIndex(party, battleHall->unk_260[0]); + Pokemon *mon = Party_GetPokemonBySlotIndex(party, battleHall->partySlots[0]); Party_AddPokemon(args->party, mon); if (args->challengeType == FRONTIER_CHALLENGE_DOUBLE) { - mon = Party_GetPokemonBySlotIndex(party, battleHall->unk_260[1]); + mon = Party_GetPokemonBySlotIndex(party, battleHall->partySlots[1]); Party_AddPokemon(args->party, mon); } else if (args->challengeType == FRONTIER_CHALLENGE_MULTI || args->challengeType == FRONTIER_CHALLENGE_MULTI_WFC) { - Party_AddPokemon(args->party, battleHall->unk_D8C); + Party_AddPokemon(args->party, battleHall->partnersMon); } sub_0209B988(ctx->scriptMan->unk_00, &sBattleHallAppTemplate, args, 0, StoreBattleHallAppResult); @@ -183,10 +181,10 @@ BOOL FrontierScrCmd_CallBattleHallFunction(FrontierScriptContext *ctx) OS_ResetSystem(0); break; case BH_FUNC_UNK_9: - *returnVar = sub_02030124(battleHall->unk_6F8); + *returnVar = BattleHallSave_HasSaved(battleHall->hallSave); break; - case BH_FUNC_UNK_10: - ov104_0223526C(battleHall, 2); + case BH_FUNC_QUICKSAVE: + BattleHall_Save(battleHall, 2); break; case BH_FUNC_UNK_14: *returnVar = ov104_022354B0(battleHall); @@ -195,7 +193,7 @@ BOOL FrontierScrCmd_CallBattleHallFunction(FrontierScriptContext *ctx) if (battleHall->challengeType == 2) { *returnVar = 10; } else { - *returnVar = battleHall->unk_0A; + *returnVar = battleHall->currentRound; } break; case BH_FUNC_UNK_20: @@ -213,20 +211,20 @@ BOOL FrontierScrCmd_CallBattleHallFunction(FrontierScriptContext *ctx) case BH_FUNC_UNK_24: *returnVar = battleHall->unk_D88; break; - case BH_FUNC_UPDATE_HELD_ITEMS: { + case BH_FUNC_RESTORE_HELD_ITEMS: { Party *party = SaveData_GetParty(v0->saveData); partySize = BattleHall_GetPlayerPartySize(battleHall->challengeType); for (int i = 0; i < partySize; i++) { - Pokemon *mon = Party_GetPokemonBySlotIndex(party, battleHall->unk_260[i]); - Pokemon_SetValue(mon, MON_DATA_HELD_ITEM, &battleHall->unk_728[i]); + Pokemon *mon = Party_GetPokemonBySlotIndex(party, battleHall->partySlots[i]); + Pokemon_SetValue(mon, MON_DATA_HELD_ITEM, &battleHall->heldItems[i]); } } break; case BH_FUNC_UNK_28: - v4 = BattleHall_GetRankOfType(battleHall->selectedTypeIdx, &battleHall->unk_704[battleHall->challengeType][0]); + v4 = BattleHall_GetRankOfType(battleHall->selectedTypeIdx, &battleHall->typeRanks[battleHall->challengeType][0]); if (v4 < 10) { - sub_02030204(battleHall->selectedTypeIdx, &battleHall->unk_704[battleHall->challengeType][0], v4 + 1); + BattleHall_SetRankOfType(battleHall->selectedTypeIdx, &battleHall->typeRanks[battleHall->challengeType][0], v4 + 1); } break; case BH_FUNC_UNK_29: @@ -250,14 +248,14 @@ BOOL FrontierScrCmd_CallBattleHallFunction(FrontierScriptContext *ctx) ov104_0222E278(&(battleHall->unk_40[1]), battleHall->trainerIDs[battleHall->unk_05 * 2 + 1], HEAP_ID_FIELD2, 178); break; case BH_FUNC_UNK_33: - *returnVar = BattleHall_GetRankOfType(battleHall->selectedTypeIdx, &battleHall->unk_704[battleHall->challengeType][0]); + *returnVar = BattleHall_GetRankOfType(battleHall->selectedTypeIdx, &battleHall->typeRanks[battleHall->challengeType][0]); break; case BH_FUNC_UNK_34: *returnVar = ov104_02235578(battleHall); break; case BH_FUNC_UNK_15: { Party *v2 = SaveData_GetParty(v0->saveData); - Pokemon *v1 = Party_GetPokemonBySlotIndex(v2, battleHall->unk_260[0]); + Pokemon *v1 = Party_GetPokemonBySlotIndex(v2, battleHall->partySlots[0]); *returnVar = Pokemon_GetValue(v1, MON_DATA_SPECIES, NULL); } break; case BH_FUNC_UNK_35: @@ -371,7 +369,7 @@ BOOL FrontierScrCmd_C7(FrontierScriptContext *param0) v4 = sub_0209B978(param0->scriptMan->unk_00); v2 = SaveData_GetParty(v5->saveData); - v3 = Party_GetPokemonBySlotIndex(v2, v4->unk_260[0]); + v3 = Party_GetPokemonBySlotIndex(v2, v4->partySlots[0]); v1 = Pokemon_GetValue(v3, MON_DATA_SPECIES, NULL); if (v4->challengeType == 0) { diff --git a/src/overlay104/ov104_0222DCE0.c b/src/overlay104/ov104_0222DCE0.c index 056ba6c4d0..50d0475cf3 100644 --- a/src/overlay104/ov104_0222DCE0.c +++ b/src/overlay104/ov104_0222DCE0.c @@ -599,10 +599,8 @@ enum ObjectEventGfx BattleFrontier_GetPlayerObjEventGfx(const TrainerInfo *playe } } -void ov104_0222E630(SaveData *saveData) +void BattleFrontier_FlagGeonetLinkInfo(SaveData *saveData) { WiFiHistory *wiFiHistory = SaveData_WiFiHistory(saveData); - WiFiHistory_FlagGeonetLinkInfo(wiFiHistory); - return; } diff --git a/src/overlay104/ov104_0222ECE8.c b/src/overlay104/ov104_0222ECE8.c index fa41ff16b9..fa584e0553 100644 --- a/src/overlay104/ov104_0222ECE8.c +++ b/src/overlay104/ov104_0222ECE8.c @@ -278,7 +278,7 @@ BOOL ov104_0222EE60(BattleHall *param0) v3 = 512; v4 = Pokemon_StructSize(); v6 = SaveData_GetParty(param0->saveData); - v5 = Party_GetPokemonBySlotIndex(v6, param0->unk_260[0]); + v5 = Party_GetPokemonBySlotIndex(v6, param0->partySlots[0]); MI_CpuCopy8(v5, ¶m0->unk_784[0], v4); @@ -305,7 +305,7 @@ void ov104_0222EEA8(int param0, int param1, void *param2, void *param3) } v2 = Pokemon_StructSize(); - MI_CpuCopy8(&v4[0], v3->unk_D8C, v2); + MI_CpuCopy8(&v4[0], v3->partnersMon, v2); return; } diff --git a/src/overlay104/ov104_022339B4.c b/src/overlay104/ov104_022339B4.c index 4b2b3c0a44..b6cb876fed 100644 --- a/src/overlay104/ov104_022339B4.c +++ b/src/overlay104/ov104_022339B4.c @@ -107,7 +107,7 @@ BattleFactory *ov104_022339B4(SaveData *saveData, u16 param1, u8 param2, u8 para v7->unk_0E = (u16)(v7->currentStreak / 7); if (BattleFactory_IsMultiplayerChallenge(v7->challengeType) == 1) { - ov104_0222E630(v7->saveData); + BattleFrontier_FlagGeonetLinkInfo(v7->saveData); } return v7; diff --git a/src/overlay104/ov104_02234DB4.c b/src/overlay104/ov104_02234DB4.c index cecdd721e0..f2e1a3f373 100644 --- a/src/overlay104/ov104_02234DB4.c +++ b/src/overlay104/ov104_02234DB4.c @@ -4,8 +4,6 @@ #include "constants/battle_frontier.h" -#include "struct_decls/struct_02030114_decl.h" -#include "struct_decls/struct_0203026C_decl.h" #include "struct_defs/battle_frontier.h" #include "applications/frontier/battle_hall/main.h" @@ -15,124 +13,111 @@ #include "overlay104/struct_battle_hall.h" #include "battle_frontier_stats.h" +#include "battle_hall_save.h" #include "battle_hall_win_records.h" #include "heap.h" #include "party.h" #include "pokemon.h" #include "savedata.h" #include "system_vars.h" -#include "unk_02030108.h" #include "unk_0205DFC4.h" #include "vars_flags.h" -BattleHall *ov104_02234DB4(SaveData *saveData, u16 param1, u8 param2, u8 param3, u8 param4); -void ov104_022350B0(BattleHall *param0, u16 param1); static void ov104_022350B8(BattleHall *param0); -void ov104_02235190(BattleHall *param0); static u16 GetBattleHallAppSelectedCell(BattleHallAppArgs *args, u8 unused); -BOOL ov104_02235534(BattleHall *param0, u16 param1, u16 param2); -static u16 ov104_022355C0(SaveData *saveData, u8 param1, u8 param2, u16 *param3, u16 *param4); -static void ov104_02235620(SaveData *saveData, u8 param1, u8 param2, u8 param3); -void ov104_022356A0(BattleHall *param0); +static u16 BattleHall_LoadTypeRanks(SaveData *saveData, u8 challengeType, u8 type, u16 *type1Rank, u16 *type2Rank); +static void BattleHall_SaveTypeRank(SaveData *saveData, u8 challengeType, u8 type, u8 value); static u16 ov104_02235704(BattleHall *param0); -void ov104_0223526C(BattleHall *param0, u8 param1); -u16 ov104_022354B0(BattleHall *param0); -u16 ov104_022354BC(BattleHall *param0); -u16 ov104_022354C0(BattleHall *param0, u8 param1); -void ov104_022354F4(BattleHall *param0); -void ov104_02235518(BattleHall *param0); -u16 ov104_02235578(BattleHall *param0); -BattleHall *ov104_02234DB4(SaveData *saveData, u16 param1, u8 param2, u8 param3, u8 param4) +BattleHall *BattleHall_Init(SaveData *saveData, u16 resumingFromSave, u8 challengeType, u8 partySlot1, u8 partySlot2) { - UnkStruct_02030114 *v0; - UnkStruct_0203026C *v1; - u8 v2, v3, v4; - u16 v5, v6, v7, v8; - Pokemon *v9; - static BattleHall *v10; + u16 i; - v10 = Heap_Alloc(HEAP_ID_FIELD2, sizeof(BattleHall)); - MI_CpuClear8(v10, sizeof(BattleHall)); + static BattleHall *battleHall; + battleHall = Heap_Alloc(HEAP_ID_FIELD2, sizeof(BattleHall)); - v10->unk_6F8 = sub_02030114(saveData); - v10->saveData = saveData; - v10->unk_00 = 11; - v10->unk_264 = Party_New(HEAP_ID_FIELD2); - v10->unk_D8C = Pokemon_New(HEAP_ID_FIELD2); + MI_CpuClear8(battleHall, sizeof(BattleHall)); - v0 = v10->unk_6F8; - v1 = sub_0203026C(saveData); + battleHall->hallSave = BattleHallSave_Get(saveData); + battleHall->saveData = saveData; + battleHall->unused = 11; + battleHall->party = Party_New(HEAP_ID_FIELD2); + battleHall->partnersMon = Pokemon_New(HEAP_ID_FIELD2); - if (param1 == 0) { - v10->challengeType = param2; - v4 = BattleHall_GetPlayerPartySize(v10->challengeType); - v10->unk_05 = 0; + BattleHallSave *currentChallenge = battleHall->hallSave; + BattleHallStreakFlags *streakFlags = BattleHallStreakFlags_Get(saveData); - sub_02030108(v0); + u8 streakActive, partySize; + if (!resumingFromSave) { + battleHall->challengeType = challengeType; + partySize = BattleHall_GetPlayerPartySize(battleHall->challengeType); + battleHall->unk_05 = 0; - if (v10->challengeType == 3) { - v2 = SystemVars_GetWiFiFrontierCleared(SaveData_GetVarsFlags(v10->saveData)); + BattleHallSave_Init(currentChallenge); + + if (battleHall->challengeType == FRONTIER_CHALLENGE_MULTI_WFC) { + streakActive = SystemVars_GetWiFiFrontierCleared(SaveData_GetVarsFlags(battleHall->saveData)); } else { - v2 = (u8)sub_020302B4(v1, 5, v10->challengeType, 0, NULL); + streakActive = BattleHallStreakFlags_GetFlag(streakFlags, HALL_SAVE_STREAK_FLAGS, battleHall->challengeType, 0, NULL); } - if (v2 == 1) { - v10->currentStreak = BattleFrontierStats_GetStat(SaveData_GetBattleFrontier(v10->saveData), BattleFrontierStats_GetHallLatestStreakIndex(v10->challengeType), BattleFrontierStats_GetHostFriendIdx(BattleFrontierStats_GetHallLatestStreakIndex(v10->challengeType))); + if (streakActive == TRUE) { + battleHall->currentStreak = BattleFrontierStats_GetStat(SaveData_GetBattleFrontier(battleHall->saveData), BattleFrontierStats_GetHallLatestStreakIndex(battleHall->challengeType), BattleFrontierStats_GetHostFriendIdx(BattleFrontierStats_GetHallLatestStreakIndex(battleHall->challengeType))); } else { - v10->currentStreak = 0; + battleHall->currentStreak = 0; - for (v5 = 0; v5 < 18; v5++) { - ov104_02235620(v10->saveData, v10->challengeType, v5, 0); + for (i = 0; i < NUM_POKEMON_TYPES; i++) { + BattleHall_SaveTypeRank(battleHall->saveData, battleHall->challengeType, i, 0); } } - v10->unk_260[0] = param3; - v10->unk_260[1] = param4; + battleHall->partySlots[0] = partySlot1; + battleHall->partySlots[1] = partySlot2; } else { - v10->challengeType = (u8)sub_02030198(v0, 0, 0, 0, NULL); - v4 = BattleHall_GetPlayerPartySize(v10->challengeType); - v10->unk_05 = (u8)sub_02030198(v0, 1, 0, 0, NULL); - v10->currentStreak = BattleFrontierStats_GetStat(SaveData_GetBattleFrontier(v10->saveData), BattleFrontierStats_GetHallLatestStreakIndex(v10->challengeType), BattleFrontierStats_GetHostFriendIdx(BattleFrontierStats_GetHallLatestStreakIndex(v10->challengeType))); + battleHall->challengeType = BattleHallSave_GetMember(currentChallenge, HALL_SAVE_CHALLENGE_TYPE, 0, 0, NULL); + partySize = BattleHall_GetPlayerPartySize(battleHall->challengeType); + battleHall->unk_05 = BattleHallSave_GetMember(currentChallenge, HALL_SAVE_UNK_1, 0, 0, NULL); + battleHall->currentStreak = BattleFrontierStats_GetStat(SaveData_GetBattleFrontier(battleHall->saveData), BattleFrontierStats_GetHallLatestStreakIndex(battleHall->challengeType), BattleFrontierStats_GetHostFriendIdx(BattleFrontierStats_GetHallLatestStreakIndex(battleHall->challengeType))); - for (v5 = 0; v5 < v4; v5++) { - v10->unk_260[v5] = (u8)sub_02030198(v0, 3, v5, 0, NULL); + for (i = 0; i < partySize; i++) { + battleHall->partySlots[i] = BattleHallSave_GetMember(currentChallenge, HALL_SAVE_PARTY_SLOTS, i, 0, NULL); } - for (v5 = 0; v5 < (10 * 2); v5++) { - v10->trainerIDs[v5] = (u16)sub_02030198(v0, 2, v5, 0, NULL); + for (i = 0; i < BATTLES_PER_ROUND_HALL * 2; i++) { + battleHall->trainerIDs[i] = BattleHallSave_GetMember(currentChallenge, HALL_SAVE_TRAINER_IDS, i, 0, NULL); } - for (v5 = 0; v5 < (10 * 2); v5++) { - v10->unk_268[v5] = (u8)sub_02030198(v0, 4, v5, 0, NULL); + for (i = 0; i < (10 * 2); i++) { + battleHall->unk_268[i] = (u8)BattleHallSave_GetMember(currentChallenge, HALL_SAVE_UNK_4, i, 0, NULL); } } - for (v5 = 0; v5 < v4; v5++) { - v9 = Party_GetPokemonBySlotIndex(SaveData_GetParty(v10->saveData), v10->unk_260[v5]); - v10->unk_728[v5] = Pokemon_GetValue(v9, MON_DATA_HELD_ITEM, NULL); + for (i = 0; i < partySize; i++) { + Pokemon *mon = Party_GetPokemonBySlotIndex(SaveData_GetParty(battleHall->saveData), battleHall->partySlots[i]); + battleHall->heldItems[i] = Pokemon_GetValue(mon, MON_DATA_HELD_ITEM, NULL); } - v10->unk_10 = 0; - v10->unk_0A = (u16)(v10->currentStreak / 10); + battleHall->unk_10 = 0; + battleHall->currentRound = battleHall->currentStreak / 10; - if (v10->challengeType == 2) { - for (v5 = 0; v5 < 18; v5++) { - sub_02030204(v5, &v10->unk_704[2][0], 10 - 1); + if (battleHall->challengeType == FRONTIER_CHALLENGE_MULTI) { + for (i = 0; i < NUM_POKEMON_TYPES; i++) { + BattleHall_SetRankOfType(i, &battleHall->typeRanks[2][0], 10 - 1); } } else { - for (v5 = 0; v5 < 18; v5++) { - v8 = ov104_022355C0(saveData, v10->challengeType, v5, &v6, &v7); + for (i = 0; i < NUM_POKEMON_TYPES; i++) { + u16 ptr1, ptr2; + u16 rank = BattleHall_LoadTypeRanks(saveData, battleHall->challengeType, i, &ptr1, &ptr2); - sub_02030204(v5, &v10->unk_704[v10->challengeType][0], v8); + BattleHall_SetRankOfType(i, &battleHall->typeRanks[battleHall->challengeType][0], rank); } } - if (BattleHall_IsMultiPlayerChallenge(v10->challengeType) == 1) { - ov104_0222E630(v10->saveData); + if (BattleHall_IsMultiPlayerChallenge(battleHall->challengeType) == TRUE) { + BattleFrontier_FlagGeonetLinkInfo(battleHall->saveData); } - return v10; + return battleHall; } void ov104_022350B0(BattleHall *param0, u16 param1) @@ -159,11 +144,11 @@ static void ov104_022350B8(BattleHall *param0) v1 = 2; } - v0 = BattleHall_GetRankOfType(param0->selectedTypeIdx, ¶m0->unk_704[param0->challengeType][0]); + v0 = BattleHall_GetRankOfType(param0->selectedTypeIdx, ¶m0->typeRanks[param0->challengeType][0]); param0->unk_07 = ov104_02235704(param0); ov104_0223AF58(param0->selectedTypeIdx, v1, v0, param0->unk_05, param0->trainerIDs); - ov104_0223AFB4(param0->challengeType, v1, param0->unk_0A, v0, param0->unk_05, param0->trainerIDs); + ov104_0223AFB4(param0->challengeType, v1, param0->currentRound, v0, param0->unk_05, param0->trainerIDs); v2 = (param0->unk_05 * 2); @@ -180,32 +165,30 @@ static void ov104_022350B8(BattleHall *param0) v3 = 2; } - v6 = Party_GetPokemonBySlotIndex(param0->unk_264, 0); + v6 = Party_GetPokemonBySlotIndex(param0->party, 0); ov104_0223B0C8(1, param0->selectedType, v0, param0->unk_05, Pokemon_GetValue(v6, MON_DATA_SPECIES, NULL), param0->unk_268, v3); return; } -void ov104_02235190(BattleHall *param0) +void BattleHall_Free(BattleHall *battleHall) { - if (param0 == NULL) { + if (battleHall == NULL) { return; } - if (param0->unk_264 != NULL) { - Heap_Free(param0->unk_264); + if (battleHall->party != NULL) { + Heap_Free(battleHall->party); } - if (param0->unk_D8C != NULL) { - Heap_Free(param0->unk_D8C); + if (battleHall->partnersMon != NULL) { + Heap_Free(battleHall->partnersMon); } - MI_CpuClear8(param0, sizeof(BattleHall)); + MI_CpuClear8(battleHall, sizeof(BattleHall)); - Heap_Free(param0); - param0 = NULL; - - return; + Heap_Free(battleHall); + battleHall = NULL; } void BattleHall_GetTypeSelectionAppResult(BattleHall *battleHall, void *args) @@ -229,79 +212,76 @@ void BattleHall_UpdateWinRecordForCurrentMon(BattleHall *battleHall, u16 *update int unused, unused2; if (battleHall->challengeType != FRONTIER_CHALLENGE_MULTI_WFC) { - *updated = BattleHallWinRecords_UpdateRecord(battleHall->saveData, sub_0205E534(battleHall->challengeType), BattleFrontierStats_GetHallLatestSpeciesIndex(battleHall->challengeType), BattleFrontierStats_GetHostFriendIdx(sub_0205E534(battleHall->challengeType)), BattleFrontierStats_GetHallRecordStreakIndex(battleHall->challengeType), HEAP_ID_FIELD2, &unused, &unused2); + *updated = BattleHallWinRecords_UpdateRecord(battleHall->saveData, BattleFrontierStats_GetHallCurrentStreakIndex(battleHall->challengeType), BattleFrontierStats_GetHallLatestSpeciesIndex(battleHall->challengeType), BattleFrontierStats_GetHostFriendIdx(BattleFrontierStats_GetHallCurrentStreakIndex(battleHall->challengeType)), BattleFrontierStats_GetHallRecordStreakIndex(battleHall->challengeType), HEAP_ID_FIELD2, &unused, &unused2); } else { *updated = 0; } } -void ov104_0223526C(BattleHall *param0, u8 param1) +void BattleHall_Save(BattleHall *battleHall, u8 saveType) { - u16 v0; - u8 v1[4]; - u16 v2[4]; - u32 v3[4]; + u16 i; + u8 u8Ptr[4]; + u16 u16Ptr[4]; + u32 u32Ptr[4]; BattleFrontier *frontier; - u16 v5, v6, v7, v8, v9; - Pokemon *v10; - UnkStruct_02030114 *v11 = param0->unk_6F8; - UnkStruct_0203026C *v12 = sub_0203026C(param0->saveData); + Pokemon *mon; + BattleHallStreakFlags *streakFlags = BattleHallStreakFlags_Get(battleHall->saveData); - frontier = SaveData_GetBattleFrontier(param0->saveData); - v1[0] = param0->challengeType; + frontier = SaveData_GetBattleFrontier(battleHall->saveData); - sub_02030140(param0->unk_6F8, 0, 0, 0, v1); - sub_0203012C(param0->unk_6F8, 1); + *u8Ptr = battleHall->challengeType; + BattleHallSave_SetMember(battleHall->hallSave, HALL_SAVE_CHALLENGE_TYPE, 0, 0, u8Ptr); + BattleHallSave_RecordSave(battleHall->hallSave, TRUE); - v10 = Party_GetPokemonBySlotIndex(SaveData_GetParty(param0->saveData), param0->unk_260[0]); - v9 = Pokemon_GetValue(v10, MON_DATA_SPECIES, NULL); - v8 = BattleFrontierStats_GetStat(frontier, BattleFrontierStats_GetHallLatestSpeciesIndex(param0->challengeType), BattleFrontierStats_GetHostFriendIdx(BattleFrontierStats_GetHallLatestSpeciesIndex(param0->challengeType))); - v1[0] = param0->unk_05; + mon = Party_GetPokemonBySlotIndex(SaveData_GetParty(battleHall->saveData), battleHall->partySlots[0]); + u16 currentSpecies = Pokemon_GetValue(mon, MON_DATA_SPECIES, NULL); + u16 speciesOnRecord = BattleFrontierStats_GetStat(frontier, BattleFrontierStats_GetHallLatestSpeciesIndex(battleHall->challengeType), BattleFrontierStats_GetHostFriendIdx(BattleFrontierStats_GetHallLatestSpeciesIndex(battleHall->challengeType))); - sub_02030140(param0->unk_6F8, 1, 0, 0, v1); - BattleFrontierStats_SetStat(frontier, BattleFrontierStats_GetHallLatestStreakIndex(param0->challengeType), BattleFrontierStats_GetHostFriendIdx(BattleFrontierStats_GetHallLatestStreakIndex(param0->challengeType)), param0->currentStreak); + *u8Ptr = battleHall->unk_05; + BattleHallSave_SetMember(battleHall->hallSave, HALL_SAVE_UNK_1, 0, 0, u8Ptr); + BattleFrontierStats_SetStat(frontier, BattleFrontierStats_GetHallLatestStreakIndex(battleHall->challengeType), BattleFrontierStats_GetHostFriendIdx(BattleFrontierStats_GetHallLatestStreakIndex(battleHall->challengeType)), battleHall->currentStreak); - if (param1 != 2) { - if (param0->challengeType != 3) { - BattleFrontierStats_SetStat(frontier, sub_0205E534(param0->challengeType), BattleFrontierStats_GetHostFriendIdx(sub_0205E534(param0->challengeType)), param0->currentStreak); + if (saveType != 2) { + if (battleHall->challengeType != FRONTIER_CHALLENGE_MULTI_WFC) { + BattleFrontierStats_SetStat(frontier, BattleFrontierStats_GetHallCurrentStreakIndex(battleHall->challengeType), BattleFrontierStats_GetHostFriendIdx(BattleFrontierStats_GetHallCurrentStreakIndex(battleHall->challengeType)), battleHall->currentStreak); } else { - if (v8 != v9) { - BattleFrontierStats_SetStat(frontier, sub_0205E534(param0->challengeType), BattleFrontierStats_GetHostFriendIdx(sub_0205E534(param0->challengeType)), param0->currentStreak); + if (speciesOnRecord != currentSpecies) { + BattleFrontierStats_SetStat(frontier, BattleFrontierStats_GetHallCurrentStreakIndex(battleHall->challengeType), BattleFrontierStats_GetHostFriendIdx(BattleFrontierStats_GetHallCurrentStreakIndex(battleHall->challengeType)), battleHall->currentStreak); } else { - BattleFrontierStats_SetIfBetter(frontier, sub_0205E534(param0->challengeType), BattleFrontierStats_GetHostFriendIdx(sub_0205E534(param0->challengeType)), param0->currentStreak); + BattleFrontierStats_SetIfBetter(frontier, BattleFrontierStats_GetHallCurrentStreakIndex(battleHall->challengeType), BattleFrontierStats_GetHostFriendIdx(BattleFrontierStats_GetHallCurrentStreakIndex(battleHall->challengeType)), battleHall->currentStreak); } } - v1[0] = param0->unk_06; - sub_02030280(v12, 5, param0->challengeType, 0, v1); + *u8Ptr = battleHall->streakActive; + BattleHallStreakFlags_SetFlag(streakFlags, HALL_SAVE_STREAK_FLAGS, battleHall->challengeType, 0, u8Ptr); - if (param0->challengeType == 3) { - BattleFrontierStats_SetStat(frontier, STAT_HALL_WFC_STREAK_ACTIVE, BattleFrontierStats_GetHostFriendIdx(STAT_HALL_WFC_STREAK_ACTIVE), param0->unk_06); + if (battleHall->challengeType == FRONTIER_CHALLENGE_MULTI_WFC) { + BattleFrontierStats_SetStat(frontier, STAT_HALL_WFC_STREAK_ACTIVE, BattleFrontierStats_GetHostFriendIdx(STAT_HALL_WFC_STREAK_ACTIVE), battleHall->streakActive); } } - for (v0 = 0; v0 < (10 * 2); v0++) { - v2[0] = param0->trainerIDs[v0]; - sub_02030140(param0->unk_6F8, 2, v0, 0, v2); + for (i = 0; i < (10 * 2); i++) { + *u16Ptr = battleHall->trainerIDs[i]; + BattleHallSave_SetMember(battleHall->hallSave, HALL_SAVE_TRAINER_IDS, i, 0, u16Ptr); } - for (v0 = 0; v0 < 2; v0++) { - v1[0] = param0->unk_260[v0]; - sub_02030140(param0->unk_6F8, 3, v0, 0, v1); + for (i = 0; i < 2; i++) { + *u8Ptr = battleHall->partySlots[i]; + BattleHallSave_SetMember(battleHall->hallSave, HALL_SAVE_PARTY_SLOTS, i, 0, u8Ptr); } - for (v0 = 0; v0 < 18; v0++) { - v1[0] = BattleHall_GetRankOfType(v0, ¶m0->unk_704[param0->challengeType][0]); - ov104_02235620(param0->saveData, param0->challengeType, v0, v1[0]); + for (i = 0; i < NUM_POKEMON_TYPES; i++) { + *u8Ptr = BattleHall_GetRankOfType(i, &battleHall->typeRanks[battleHall->challengeType][0]); + BattleHall_SaveTypeRank(battleHall->saveData, battleHall->challengeType, i, *u8Ptr); } - for (v0 = 0; v0 < (10 * 2); v0++) { - v2[0] = param0->unk_268[v0]; - sub_02030140(param0->unk_6F8, 4, v0, 0, v2); + for (i = 0; i < (10 * 2); i++) { + *u16Ptr = battleHall->unk_268[i]; + BattleHallSave_SetMember(battleHall->hallSave, HALL_SAVE_UNK_4, i, 0, u16Ptr); } - BattleFrontierStats_SetStat(frontier, BattleFrontierStats_GetHallLatestSpeciesIndex(param0->challengeType), BattleFrontierStats_GetHostFriendIdx(BattleFrontierStats_GetHallLatestSpeciesIndex(param0->challengeType)), Pokemon_GetValue(v10, MON_DATA_SPECIES, NULL)); - return; + BattleFrontierStats_SetStat(frontier, BattleFrontierStats_GetHallLatestSpeciesIndex(battleHall->challengeType), BattleFrontierStats_GetHostFriendIdx(BattleFrontierStats_GetHallLatestSpeciesIndex(battleHall->challengeType)), Pokemon_GetValue(mon, MON_DATA_SPECIES, NULL)); } u16 ov104_022354B0(BattleHall *param0) @@ -329,8 +309,8 @@ void ov104_022354F4(BattleHall *param0) { int v0; - sub_02030244(¶m0->unk_704[param0->challengeType][0]); - ov104_0223526C(param0, 1); + BattleHall_ResetRankOfAllTypes(¶m0->typeRanks[param0->challengeType][0]); + BattleHall_Save(param0, 1); return; } @@ -339,14 +319,14 @@ void ov104_02235518(BattleHall *param0) { Pokemon *v0; - param0->unk_06 = 1; + param0->streakActive = 1; - if (param0->unk_0A < 18) { - param0->unk_0A++; + if (param0->currentRound < 18) { + param0->currentRound++; } param0->unk_05 = 0; - ov104_0223526C(param0, 0); + BattleHall_Save(param0, 0); return; } @@ -383,16 +363,16 @@ u16 ov104_02235578(BattleHall *param0) static const u8 v2[18 + 1] = { 0, 6, 6, 6, 8, 8, 8, 10, 10, 10, 12, 12, 14, 15, 17, 17, 20, 20, 23 }; if ((param0->challengeType == 0) || (param0->challengeType == 1)) { - if (param0->unk_0A >= 18) { + if (param0->currentRound >= 18) { v0 = v1[18]; } else { - v0 = v1[param0->unk_0A]; + v0 = v1[param0->currentRound]; } } else { - if (param0->unk_0A >= 18) { + if (param0->currentRound >= 18) { v0 = v2[18]; } else { - v0 = v2[param0->unk_0A]; + v0 = v2[param0->currentRound]; } } @@ -407,45 +387,39 @@ u16 ov104_02235578(BattleHall *param0) return v0; } -static u16 ov104_022355C0(SaveData *saveData, u8 param1, u8 param2, u16 *param3, u16 *param4) +static u16 BattleHall_LoadTypeRanks(SaveData *saveData, u8 challengeType, u8 type, u16 *type1Rank, u16 *type2Rank) { - u16 v0 = BattleFrontierStats_GetStat(SaveData_GetBattleFrontier(saveData), sub_0205E4E0(param1, param2), BattleFrontierStats_GetHostFriendIdx(sub_0205E4E0(param1, param2))); - v0 &= 0xff; + u16 rankPair = BattleFrontierStats_GetStat(SaveData_GetBattleFrontier(saveData), BattleFrontierStats_GetHallCurrentTypeRanksIndex(challengeType, type), BattleFrontierStats_GetHostFriendIdx(BattleFrontierStats_GetHallCurrentTypeRanksIndex(challengeType, type))); + rankPair &= 0xff; - *param3 = (v0 & 0xf); - *param4 = (v0 >> 4); + *type1Rank = rankPair & 0xf; + *type2Rank = rankPair >> 4; - if ((param2 % 2) == 0) { - return *param3; + if (type % 2 == 0) { + return *type1Rank; } else { - return *param4; + return *type2Rank; } } -static void ov104_02235620(SaveData *saveData, u8 param1, u8 param2, u8 param3) +static void BattleHall_SaveTypeRank(SaveData *saveData, u8 challengeType, u8 type, u8 value) { - u8 v0; - u8 v1; - u8 v2, v3; - u16 v4, v5; + u16 type1Rank, type2Rank; + BattleHall_LoadTypeRanks(saveData, challengeType, type, &type1Rank, &type2Rank); - ov104_022355C0(saveData, param1, param2, &v4, &v5); + u8 currentRanks = (type2Rank << 4) | type1Rank; + u8 nybble = type % 2; - v3 = ((v5 << 4) | v4); - v0 = (param2 / 2); - v1 = (param2 % 2); - - if (v1 == 0) { - v3 = v3 & 0xf0; + if (nybble == 0) { + currentRanks = currentRanks & 0xf0; } else { - v3 = v3 & 0xf; + currentRanks = currentRanks & 0xf; } - v2 = (param3 << (4 * v1)); - v3 |= v2; + u8 newRank = value << (4 * nybble); + currentRanks |= newRank; - BattleFrontierStats_SetStat(SaveData_GetBattleFrontier(saveData), sub_0205E4E0(param1, param2), BattleFrontierStats_GetHostFriendIdx(sub_0205E4E0(param1, param2)), v3); - return; + BattleFrontierStats_SetStat(SaveData_GetBattleFrontier(saveData), BattleFrontierStats_GetHallCurrentTypeRanksIndex(challengeType, type), BattleFrontierStats_GetHostFriendIdx(BattleFrontierStats_GetHallCurrentTypeRanksIndex(challengeType, type)), currentRanks); } void ov104_022356A0(BattleHall *param0) @@ -455,7 +429,7 @@ void ov104_022356A0(BattleHall *param0) if (param0->challengeType != 2) { for (v1 = 0; v1 < (18 - 1); v1++) { - v0 = BattleHall_GetRankOfType(v1, ¶m0->unk_704[param0->challengeType][0]); + v0 = BattleHall_GetRankOfType(v1, ¶m0->typeRanks[param0->challengeType][0]); if (v0 < 10) { break; @@ -464,7 +438,7 @@ void ov104_022356A0(BattleHall *param0) if (v1 == (18 - 1)) { for (v1 = 0; v1 < (18 - 1); v1++) { - sub_02030204(v1, ¶m0->unk_704[param0->challengeType][0], 10 - 1); + BattleHall_SetRankOfType(v1, ¶m0->typeRanks[param0->challengeType][0], 10 - 1); } } } @@ -486,7 +460,7 @@ static u16 ov104_02235704(BattleHall *param0) u8 v5; float v6, v7; - v5 = BattleHall_GetRankOfType(param0->selectedTypeIdx, ¶m0->unk_704[param0->challengeType][0]); + v5 = BattleHall_GetRankOfType(param0->selectedTypeIdx, ¶m0->typeRanks[param0->challengeType][0]); v2 = BattleHall_GetHighestLevelInParty(param0); if (param0->challengeType == 2) { @@ -510,7 +484,7 @@ static u16 ov104_02235704(BattleHall *param0) if (v3 == param0->selectedTypeIdx) { v7 += 1.0; } else { - if (BattleHall_GetRankOfType(v3, ¶m0->unk_704[param0->challengeType][0]) > 0) { + if (BattleHall_GetRankOfType(v3, ¶m0->typeRanks[param0->challengeType][0]) > 0) { v7 += 1.0; } } diff --git a/src/overlay104/ov104_022361B4.c b/src/overlay104/ov104_022361B4.c index a7d8c6a33a..ce4798076f 100644 --- a/src/overlay104/ov104_022361B4.c +++ b/src/overlay104/ov104_022361B4.c @@ -148,7 +148,7 @@ BattleCastle *ov104_022361B4(SaveData *saveData, u16 param1, u8 param2, u16 para } if (BattleCastle_IsMultiPlayerChallenge(v9->challengeType) == 1) { - ov104_0222E630(v9->saveData); + BattleFrontier_FlagGeonetLinkInfo(v9->saveData); } return v9; diff --git a/src/overlay104/ov104_02237DD8.c b/src/overlay104/ov104_02237DD8.c index 3df8ed8abc..dd6fb3135e 100644 --- a/src/overlay104/ov104_02237DD8.c +++ b/src/overlay104/ov104_02237DD8.c @@ -222,7 +222,7 @@ BattleArcade *ov104_02237DD8(SaveData *saveData, u16 param1, u8 param2, u16 para } if (BattleArcade_IsMultiPlayerChallenge(v9->challengeType) == 1) { - ov104_0222E630(v9->saveData); + BattleFrontier_FlagGeonetLinkInfo(v9->saveData); } return v9; diff --git a/src/overlay104/ov104_022395F0.c b/src/overlay104/ov104_022395F0.c index 4890355574..7b996caf1a 100644 --- a/src/overlay104/ov104_022395F0.c +++ b/src/overlay104/ov104_022395F0.c @@ -18,12 +18,12 @@ #include "overlay104/struct_ov104_02230BE4.h" #include "battle_frontier_stats.h" +#include "battle_hall_save.h" #include "communication_system.h" #include "heap.h" #include "item_use_pokemon.h" #include "party.h" #include "unk_0202D05C.h" -#include "unk_02030108.h" #include "unk_02049D08.h" #include "unk_0204FA34.h" #include "unk_0205DFC4.h" @@ -229,7 +229,7 @@ BOOL FrontierScrCmd_B2(FrontierScriptContext *param0) *v9 = v4->unk_76[v7]; break; case 6: - sub_0204FA50(v5->saveData, sub_0203026C(v5->saveData), 3); + sub_0204FA50(v5->saveData, BattleHallStreakFlags_Get(v5->saveData), 3); break; case 7: v4->unk_A0 = v7; @@ -316,7 +316,7 @@ BOOL FrontierScrCmd_B3(FrontierScriptContext *param0) sub_0209B980(param0->scriptMan->unk_00, battleTower); if (battleTower->challengeMode == BATTLE_TOWER_MODE_6) { - ov104_0222E630(v2->saveData); + BattleFrontier_FlagGeonetLinkInfo(v2->saveData); } for (v0 = 0; v0 < battleTower->partySize; v0++) { diff --git a/src/overlay104/ov104_0223AF58.c b/src/overlay104/ov104_0223AF58.c index 798bb83e41..e8b6208113 100644 --- a/src/overlay104/ov104_0223AF58.c +++ b/src/overlay104/ov104_0223AF58.c @@ -11,6 +11,7 @@ #include "overlay104/struct_battle_hall.h" #include "overlay104/struct_ov104_02230BE4.h" +#include "battle_hall_save.h" #include "communication_information.h" #include "communication_system.h" #include "field_battle_data_transfer.h" @@ -19,7 +20,6 @@ #include "math_util.h" #include "party.h" #include "pokemon.h" -#include "unk_02030108.h" typedef struct { u8 unk_00; @@ -1587,7 +1587,7 @@ FieldBattleDTO *FieldBattleDTO_NewBattleHall(BattleHall *battleHall, UnkStruct_o mon = Pokemon_New(HEAP_ID_FIELD2); for (i = 0; i < playerPartySize; i++) { - Pokemon_Copy(Party_GetPokemonBySlotIndex(party, battleHall->unk_260[i]), mon); + Pokemon_Copy(Party_GetPokemonBySlotIndex(party, battleHall->partySlots[i]), mon); FieldBattleDTO_AddPokemonToBattler(battleDTO, mon, BATTLER_PLAYER_1); } @@ -1598,7 +1598,7 @@ FieldBattleDTO *FieldBattleDTO_NewBattleHall(BattleHall *battleHall, UnkStruct_o FieldBattleDTO_InitFrontierTrainer(battleDTO, &trDataDTO, opponentPartySize, BATTLER_ENEMY_1, HEAP_ID_FIELD2); Party_InitWithCapacity(battleDTO->parties[BATTLER_ENEMY_1], opponentPartySize); - rank = BattleHall_GetRankOfType(battleHall->selectedTypeIdx, &battleHall->unk_704[battleHall->challengeType][0]); + rank = BattleHall_GetRankOfType(battleHall->selectedTypeIdx, &battleHall->typeRanks[battleHall->challengeType][0]); if (battleHall->challengeType == FRONTIER_CHALLENGE_MULTI) { rank = 9; @@ -1784,7 +1784,7 @@ u8 ov104_0223B5C0(BattleHall *battleHall) u32 v0; int v1; Party *v2 = SaveData_GetParty(battleHall->saveData); - Pokemon *v3 = Party_GetPokemonBySlotIndex(v2, battleHall->unk_260[0]); + Pokemon *v3 = Party_GetPokemonBySlotIndex(v2, battleHall->partySlots[0]); v1 = Pokemon_GetValue(v3, MON_DATA_LEVEL, NULL); return v1 / 10; @@ -1838,11 +1838,11 @@ static u16 ov104_0223B644(u8 param0) u16 BattleHall_GetHighestLevelInParty(BattleHall *battleHall) { Party *party = SaveData_GetParty(battleHall->saveData); - Pokemon *mon = Party_GetPokemonBySlotIndex(party, battleHall->unk_260[0]); + Pokemon *mon = Party_GetPokemonBySlotIndex(party, battleHall->partySlots[0]); u16 firstMonsLevel = Pokemon_GetValue(mon, MON_DATA_LEVEL, NULL); if (BattleHall_GetPlayerPartySize(battleHall->challengeType) == 2) { - mon = Party_GetPokemonBySlotIndex(party, battleHall->unk_260[1]); + mon = Party_GetPokemonBySlotIndex(party, battleHall->partySlots[1]); u16 secondMonsLevel = Pokemon_GetValue(mon, MON_DATA_LEVEL, NULL); if (firstMonsLevel > secondMonsLevel) { diff --git a/src/scrcmd_battle_hall.c b/src/scrcmd_battle_hall.c index 42d3b8fe1b..080b8bdb4f 100644 --- a/src/scrcmd_battle_hall.c +++ b/src/scrcmd_battle_hall.c @@ -6,9 +6,6 @@ #include "constants/battle_frontier.h" #include "generated/game_records.h" -#include "struct_decls/struct_02030114_decl.h" -#include "struct_decls/struct_0203026C_decl.h" - #include "applications/party_menu/defs.h" #include "applications/party_menu/main.h" #include "applications/pokemon_summary_screen/main.h" @@ -16,6 +13,7 @@ #include "bag.h" #include "battle_frontier_stats.h" +#include "battle_hall_save.h" #include "battle_hall_win_records.h" #include "communication_system.h" #include "dexmode_checker.h" @@ -34,7 +32,6 @@ #include "string_template.h" #include "unk_0202D05C.h" #include "unk_0202D778.h" -#include "unk_02030108.h" #include "unk_0204FA34.h" #include "unk_0205DFC4.h" #include "unk_02099500.h" @@ -77,8 +74,8 @@ BOOL ScrCmd_2CC(ScriptContext *ctx) u16 arg = ScriptContext_GetVar(ctx); u16 *result = FieldSystem_GetVarPointer(ctx->fieldSystem, ScriptContext_ReadHalfWord(ctx)); - UnkStruct_02030114 *v10 = sub_02030114(ctx->fieldSystem->saveData); - UnkStruct_0203026C *v11 = sub_0203026C(ctx->fieldSystem->saveData); + BattleHallSave *v10 = BattleHallSave_Get(ctx->fieldSystem->saveData); + BattleHallStreakFlags *v11 = BattleHallStreakFlags_Get(ctx->fieldSystem->saveData); void **partySelect = FieldSystem_GetScriptMemberPtr(ctx->fieldSystem, SCRIPT_MANAGER_PARTY_MANAGEMENT_DATA); switch (action) { @@ -91,7 +88,7 @@ BOOL ScrCmd_2CC(ScriptContext *ctx) 106, BattleFrontierStats_GetHostFriendIdx(106)); } else { - *result = sub_020302B4(v11, 5, arg, 0, NULL); + *result = BattleHallStreakFlags_GetFlag(v11, 5, arg, 0, NULL); } break; case 2: @@ -186,7 +183,7 @@ static BOOL CheckPartyIsBattleHallEligible(u16 numPokemonNeeded, SaveData *saveD BOOL ScrCmd_2D1(ScriptContext *ctx) { u16 challengeType = ScriptContext_GetVar(ctx); - UnkStruct_0203026C *v0 = sub_0203026C(ctx->fieldSystem->saveData); + BattleHallStreakFlags *v0 = BattleHallStreakFlags_Get(ctx->fieldSystem->saveData); sub_0204FA50(ctx->fieldSystem->saveData, v0, challengeType); return FALSE; diff --git a/src/unk_02030108.c b/src/unk_02030108.c deleted file mode 100644 index 133554cbc0..0000000000 --- a/src/unk_02030108.c +++ /dev/null @@ -1,183 +0,0 @@ -#include "unk_02030108.h" - -#include -#include - -#include "struct_defs/battle_frontier.h" -#include "struct_defs/struct_02030114.h" -#include "struct_defs/struct_0203026C.h" - -#include "savedata.h" - -void sub_02030108(UnkStruct_02030114 *param0); -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); -void sub_02030204(u8 param0, u8 *param1, u8 param2); -void sub_02030244(u8 *param0); -void sub_02030260(UnkStruct_0203026C *param0); -void sub_02030280(UnkStruct_0203026C *param0, u8 param1, u8 param2, u8 param3, const void *param4); -u32 sub_020302B4(UnkStruct_0203026C *param0, u8 param1, u8 param2, u8 param3, void *param4); - -void sub_02030108(UnkStruct_02030114 *param0) -{ - MI_CpuClear8(param0, sizeof(UnkStruct_02030114)); - return; -} - -UnkStruct_02030114 *sub_02030114(SaveData *saveData) -{ - BattleFrontier *frontier = SaveData_SaveTable(saveData, SAVE_TABLE_ENTRY_FRONTIER); - return &frontier->unk_8E0_val3; -} - -BOOL sub_02030124(UnkStruct_02030114 *param0) -{ - return param0->unk_00_3; -} - -void sub_0203012C(UnkStruct_02030114 *param0, BOOL param1) -{ - param0->unk_00_3 = param1; - return; -} - -void sub_02030140(UnkStruct_02030114 *param0, u8 param1, u8 param2, u8 param3, const void *param4) -{ - u32 *v0 = (u32 *)param4; - u16 *v1 = (u16 *)param4; - u8 *v2 = (u8 *)param4; - - switch (param1) { - case 0: - param0->unk_00_0 = v2[0]; - break; - case 1: - param0->unk_01 = v2[0]; - break; - case 2: - param0->unk_04[param2] = v1[0]; - break; - case 3: - param0->unk_02[param2] = v2[0]; - break; - case 4: - param0->unk_2C[param2] = v1[0]; - break; - default: - GF_ASSERT(FALSE); - break; - } - - return; -} - -u32 sub_02030198(UnkStruct_02030114 *param0, u8 param1, u8 param2, u8 param3, void *param4) -{ - switch (param1) { - case 0: - return (u32)param0->unk_00_0; - case 1: - return (u32)param0->unk_01; - case 2: - return (u32)param0->unk_04[param2]; - case 3: - return param0->unk_02[param2]; - case 4: - return param0->unk_2C[param2]; - default: - GF_ASSERT(FALSE); - break; - } - - return 0; -} - -u8 BattleHall_GetRankOfType(u8 idx, u8 *typeRanks) -{ - u8 byte = idx / 2; - u8 nybble = idx % 2; - u8 rank = (typeRanks[byte] >> (4 * nybble)) & 0xf; - - return rank; -} - -void sub_02030204(u8 param0, u8 *param1, u8 param2) -{ - u8 v0; - u8 v1; - u8 v2; - - v0 = (param0 / 2); - v1 = (param0 % 2); - - if (v1 == 0) { - param1[v0] = param1[v0] & 0xf0; - } else { - param1[v0] = param1[v0] & 0xf; - } - - v2 = (param2 << (4 * v1)); - param1[v0] |= v2; - - return; -} - -void sub_02030244(u8 *param0) -{ - int v0; - - for (v0 = 0; v0 < 18; v0++) { - sub_02030204(v0, param0, 0); - } - - return; -} - -void sub_02030260(UnkStruct_0203026C *param0) -{ - MI_CpuClear8(param0, sizeof(UnkStruct_0203026C)); - return; -} - -UnkStruct_0203026C *sub_0203026C(SaveData *saveData) -{ - BattleFrontier *frontier = SaveData_SaveTable(saveData, SAVE_TABLE_ENTRY_FRONTIER); - return &frontier->unk_1618.unk_00; -} - -void sub_02030280(UnkStruct_0203026C *param0, u8 param1, u8 param2, u8 param3, const void *param4) -{ - u32 *v0 = (u32 *)param4; - u16 *v1 = (u16 *)param4; - u8 *v2 = (u8 *)param4; - - switch (param1) { - case 5: - if (v2[0] >= 1) { - param0->unk_00 |= (1 << param2); - } else { - param0->unk_00 &= (0xff ^ (1 << param2)); - } - break; - default: - GF_ASSERT(FALSE); - break; - } - - return; -} - -u32 sub_020302B4(UnkStruct_0203026C *param0, u8 param1, u8 param2, u8 param3, void *param4) -{ - switch (param1) { - case 5: - return (u32)((param0->unk_00 >> param2) & 0x1); - default: - GF_ASSERT(FALSE); - break; - } - - return 0; -} diff --git a/src/unk_0204FA34.c b/src/unk_0204FA34.c index 595b1871e9..9bc1738009 100644 --- a/src/unk_0204FA34.c +++ b/src/unk_0204FA34.c @@ -4,12 +4,12 @@ #include "constants/battle_frontier.h" -#include "struct_decls/struct_0203026C_decl.h" +#include "struct_defs/battle_frontier.h" #include "battle_frontier_stats.h" +#include "battle_hall_save.h" #include "communication_system.h" #include "savedata.h" -#include "unk_02030108.h" #include "unk_0205DFC4.h" void BattleHall_ProcessSelectedSpeciesMsg(int netID, int unused, void *data, void *context) @@ -27,12 +27,12 @@ void BattleHall_ProcessSelectedSpeciesMsg(int netID, int unused, void *data, voi return; } -void sub_0204FA50(SaveData *saveData, UnkStruct_0203026C *param1, u8 challengeType) +void sub_0204FA50(SaveData *saveData, BattleHallStreakFlags *param1, u8 challengeType) { u8 v1[4]; v1[0] = 0; - sub_02030280(param1, 5, challengeType, 0, v1); + BattleHallStreakFlags_SetFlag(param1, 5, challengeType, 0, v1); if (challengeType == FRONTIER_CHALLENGE_MULTI_WFC) { BattleFrontierStats_SetStat(SaveData_GetBattleFrontier(saveData), STAT_HALL_WFC_STREAK_ACTIVE, BattleFrontierStats_GetHostFriendIdx(STAT_HALL_WFC_STREAK_ACTIVE), 0); diff --git a/src/unk_0205DFC4.c b/src/unk_0205DFC4.c index d19627e537..35e147b5f6 100644 --- a/src/unk_0205DFC4.c +++ b/src/unk_0205DFC4.c @@ -434,27 +434,27 @@ enum BattleFrontierStatsIndex BattleFrontierStats_GetFactoryRecordTradeCountInde return index + (isOpenLevel * 4); } -enum BattleFrontierStatsIndex sub_0205E4E0(u8 param0, u8 param1) +enum BattleFrontierStatsIndex BattleFrontierStats_GetHallCurrentTypeRanksIndex(u8 challengeType, u8 pokemonType) { - int v0; + enum BattleFrontierStatsIndex index; - switch (param0) { - case 0: - v0 = 37; + switch (challengeType) { + case FRONTIER_CHALLENGE_SINGLE: + index = STAT_HALL_CURRENT_RANKS_NORMAL_FIGHTING_SINGLE; break; - case 1: - v0 = 49; + case FRONTIER_CHALLENGE_DOUBLE: + index = STAT_HALL_CURRENT_RANKS_NORMAL_FIGHTING_DOUBLE; break; - case 2: - v0 = 61; + case FRONTIER_CHALLENGE_MULTI: + index = STAT_HALL_CURRENT_RANKS_NORMAL_FIGHTING_MULTI; break; - case 3: - v0 = 125; + case FRONTIER_CHALLENGE_MULTI_WFC: + index = STAT_HALL_CURRENT_RANKS_NORMAL_FIGHTING_MULTI_WFC; break; } - v0 += (param1 / 2); - return v0; + index += pokemonType / 2; + return index; } enum BattleFrontierStatsIndex BattleFrontierStats_GetHallLatestStreakIndex(u8 challengeType) @@ -479,26 +479,26 @@ enum BattleFrontierStatsIndex BattleFrontierStats_GetHallLatestStreakIndex(u8 ch return index; } -enum BattleFrontierStatsIndex sub_0205E534(u8 param0) +enum BattleFrontierStatsIndex BattleFrontierStats_GetHallCurrentStreakIndex(u8 challengeType) { - int v0; + enum BattleFrontierStatsIndex index; - switch (param0) { - case 0: - v0 = 34; + switch (challengeType) { + case FRONTIER_CHALLENGE_SINGLE: + index = STAT_HALL_CURRENT_STREAK_SINGLE; break; - case 1: - v0 = 46; + case FRONTIER_CHALLENGE_DOUBLE: + index = STAT_HALL_CURRENT_STREAK_DOUBLE; break; - case 2: - v0 = 58; + case FRONTIER_CHALLENGE_MULTI: + index = STAT_HALL_CURRENT_STREAK_MULTI; break; - case 3: - v0 = 122; + case FRONTIER_CHALLENGE_MULTI_WFC: + index = STAT_HALL_CURRENT_STREAK_MULTI_WFC; break; } - return v0; + return index; } enum BattleFrontierStatsIndex BattleFrontierStats_GetHallLatestSpeciesIndex(u8 challengeType)