diff --git a/asm/macros/frscrcmd.inc b/asm/macros/frscrcmd.inc index c449775b7e4..5efe1571394 100644 --- a/asm/macros/frscrcmd.inc +++ b/asm/macros/frscrcmd.inc @@ -766,9 +766,9 @@ .short \partySlot2 .endm - .macro FrontierScrCmd_8C arg0 - .short FRSCRCMD_8C - .short \arg0 + .macro BattleHall_SetupNextOpponent unused=VAR_0x8003 + .short FRSCRCMD_BATTLEHALL_SETUP_NEXT_OPPONENT + .short \unused .endm .macro FreeBattleHall @@ -800,11 +800,11 @@ .short \destVar .endm - .macro FrontierScrCmd_93 arg0, arg1, arg2 - .short FRSCRCMD_93 - .short \arg0 - .short \arg1 - .short \arg2 + .macro BattleHall_SendCommMessage command, arg, returnVar + .short FRSCRCMD_BATTLEHALL_SENDCOMMMESSAGE + .short \command + .short \arg + .short \returnVar .endm .macro FrontierScrCmd_94 arg0 @@ -812,9 +812,9 @@ .short \arg0 .endm - .macro FrontierScrCmd_95 arg0 - .short FRSCRCMD_95 - .byte \arg0 + .macro BattleHall_PrintTrainerIntro index + .short FRSCRCMD_BATTLEHALL_PRINTTRAINERINTRO + .byte \index .endm .macro FrontierScrCmd_Dummy96 arg0 diff --git a/include/applications/frontier/battle_hall/main.h b/include/applications/frontier/battle_hall/main.h index 892189830e4..4d183ce3688 100644 --- a/include/applications/frontier/battle_hall/main.h +++ b/include/applications/frontier/battle_hall/main.h @@ -1,7 +1,7 @@ #ifndef POKEPLATINUM_APPLICATIONS_BATTLE_HALL_MAIN_H #define POKEPLATINUM_APPLICATIONS_BATTLE_HALL_MAIN_H -#include "overlay104/struct_battle_hall.h" +#include "overlay104/battle_hall.h" #include "overlay_manager.h" #include "party.h" diff --git a/include/battle_frontier.h b/include/battle_frontier.h index 3d614d29fef..1af33addfe5 100644 --- a/include/battle_frontier.h +++ b/include/battle_frontier.h @@ -16,8 +16,8 @@ extern const ApplicationManagerTemplate gBattleFrontierAppTemplate; FieldFrontierDTO *BattleFrontier_GetFieldData(BattleFrontier *frontier); FrontierGraphics *BattleFrontier_GetGraphics(BattleFrontier *frontier); -void *sub_0209B978(BattleFrontier *frontier); -void sub_0209B980(BattleFrontier *frontier, void *param1); +void *BattleFrontier_GetFacilityStruct(BattleFrontier *frontier); +void BattleFrontier_SetFacilityStruct(BattleFrontier *frontier, void *param1); void sub_0209B988(BattleFrontier *frontier, const ApplicationManagerTemplate *param1, void *param2, int param3, UnkFuncPtr_0209B988 param4); void sub_0209B9B4(BattleFrontier *frontier); void sub_0209B9BC(BattleFrontier *frontier, u16 sceneID, u16 param2); diff --git a/include/battle_hall_save.h b/include/battle_hall_save.h index 32be1d59c28..b32d92b726e 100644 --- a/include/battle_hall_save.h +++ b/include/battle_hall_save.h @@ -1,23 +1,24 @@ #ifndef POKEPLATINUM_BATTLE_HALL_SAVE_H #define POKEPLATINUM_BATTLE_HALL_SAVE_H +#include "constants/battle_frontier.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 +#define HALL_SAVE_CHALLENGE_TYPE 0 +#define HALL_SAVE_CURRENT_BATTLE 1 +#define HALL_SAVE_TRAINER_IDS 2 +#define HALL_SAVE_PARTY_SLOTS 3 +#define HALL_SAVE_POKEMON_INDICES 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 currentBattleNum; u8 partySlots[2]; - u16 trainerIDs[20]; - u16 unk_2C[20]; + u16 trainerIDs[HALL_BATTLES_PER_ROUND * 2]; + u16 monIndices[HALL_BATTLES_PER_ROUND * 2]; } BattleHallSave; typedef struct BattleHallStreakFlags { diff --git a/include/constants/battle_frontier.h b/include/constants/battle_frontier.h index b2a07e7f3fe..0fb67c0c2b4 100644 --- a/include/constants/battle_frontier.h +++ b/include/constants/battle_frontier.h @@ -32,7 +32,16 @@ enum BattleFrontierScene { #define FRONTIER_RECORDS_APP_HALL 5 #define FRONTIER_RECORDS_APP_ARCADE 6 -#define BATTLES_PER_ROUND_HALL 10 +#define HALL_BATTLES_PER_ROUND 10 +#define HALL_STREAK_SILVER_BATTLE 50 +#define HALL_STREAK_GOLD_BATTLE 170 +#define HALL_MAX_DISTINCT_ROUNDS ((HALL_STREAK_GOLD_BATTLE / HALL_BATTLES_PER_ROUND) + 1) + +#define HALL_NEXT_BATTLE_NORMAL 0 +#define HALL_NEXT_BATTLE_SILVER 1 +#define HALL_NEXT_BATTLE_GOLD 2 + +#define HALL_MAX_TYPE_RANK 10 #define BATTLES_PER_ROUND_ARCADE 7 diff --git a/include/constants/battle_hall_functions.h b/include/constants/battle_hall_functions.h index b800e5a525a..ae4dde8b9cb 100644 --- a/include/constants/battle_hall_functions.h +++ b/include/constants/battle_hall_functions.h @@ -11,35 +11,35 @@ enum BattleHallFunction { BH_FUNC_UNK_6, BH_FUNC_RESET_SYSTEM, BH_FUNC_UNK_8, - BH_FUNC_UNK_9, + BH_FUNC_CHECK_HAS_SAVED, BH_FUNC_QUICKSAVE, BH_FUNC_UNK_11, BH_FUNC_UNK_12, BH_FUNC_UNK_13, - BH_FUNC_UNK_14, - BH_FUNC_UNK_15, + BH_FUNC_INCREMENT_CURRENT_BATTLE, + BH_FUNC_GET_PLAYERS_MONS_SPECIES, BH_FUNC_UNK_16, BH_FUNC_GET_CHALLENGE_TYPE, BH_FUNC_UNK_18, - BH_FUNC_UNK_19, - BH_FUNC_UNK_20, - BH_FUNC_UNK_21, - BH_FUNC_UNK_22, - BH_FUNC_UNK_23, + BH_FUNC_GET_CURRENT_ROUND, + BH_FUNC_GET_OPPONENT_OBJECT_ID, + BH_FUNC_SAVE_ON_LOSS, + BH_FUNC_SAVE_ON_COMPLETING_ROUND, + BH_FUNC_GET_CURRENT_BATTLE, BH_FUNC_UNK_24, BH_FUNC_UNK_25, BH_FUNC_UNK_26, BH_FUNC_RESTORE_HELD_ITEMS, - BH_FUNC_UNK_28, + BH_FUNC_INCREMENT_RANK_OF_BEATEN_TYPE, BH_FUNC_UNK_29, BH_FUNC_IS_MULTIPLAYER_CHALLENGE, BH_FUNC_TOGGLE_ENGINE_LAYER, - BH_FUNC_UNK_32, - BH_FUNC_UNK_33, - BH_FUNC_UNK_34, - BH_FUNC_UNK_35, + BH_FUNC_LOAD_TRAINERS, + BH_FUNC_GET_RANK_OF_BEATEN_TYPE, + BH_FUNC_GET_EARNED_BP, + BH_FUNC_CAP_TYPE_RANKS, BH_FUNC_SET_BASE_LEVEL, - BH_FUNC_UNK_37, + BH_FUNC_GET_NEXT_BATTLE_TYPE, BH_FUNC_DUMMY, }; diff --git a/include/data/scripts/frscrcmd.h b/include/data/scripts/frscrcmd.h index 2308e6bf574..9cad5d7f3cd 100644 --- a/include/data/scripts/frscrcmd.h +++ b/include/data/scripts/frscrcmd.h @@ -145,16 +145,16 @@ ScriptCommand(FRSCRCMD_BATTLETOWER_CHECKWONBATTLE, FrontierScrCmd_BattleTo ScriptCommand(FRSCRCMD_89, FrontierScrCmd_89) ScriptCommand(FRSCRCMD_8A, FrontierScrCmd_8A) ScriptCommand(FRSCRCMD_INITBATTLEHALL, FrontierScrCmd_InitBattleHall) -ScriptCommand(FRSCRCMD_8C, FrontierScrCmd_8C) +ScriptCommand(FRSCRCMD_BATTLEHALL_SETUP_NEXT_OPPONENT, FrontierScrCmd_BattleHall_SetupNextOpponent) ScriptCommand(FRSCRCMD_FREEBATTLEHALL, FrontierScrCmd_FreeBattleHall) ScriptCommand(FRSCRCMD_OPENBATTLEHALLAPP, FrontierScrCmd_OpenBattleHallApp) ScriptCommand(FRSCRCMD_BATTLEHALL_CLEANUPBATTLE, FrontierScrCmd_BattleHall_CleanupBattle) ScriptCommand(FRSCRCMD_BATTLEHALL_STARTBATTLE, FrontierScrCmd_BattleHall_StartBattle) ScriptCommand(FRSCRCMD_CALLBATTLEHALLFUNCTION, FrontierScrCmd_CallBattleHallFunction) ScriptCommand(FRSCRCMD_BATTLEHALL_CHECKWONBATTLE, FrontierScrCmd_BattleHall_CheckWonBattle) -ScriptCommand(FRSCRCMD_93, FrontierScrCmd_93) +ScriptCommand(FRSCRCMD_BATTLEHALL_SENDCOMMMESSAGE, FrontierScrCmd_BattleHall_SendCommMessage) ScriptCommand(FRSCRCMD_94, FrontierScrCmd_94) -ScriptCommand(FRSCRCMD_95, FrontierScrCmd_95) +ScriptCommand(FRSCRCMD_BATTLEHALL_PRINTTRAINERINTRO, FrontierScrCmd_BattleHall_PrintTrainerIntro) ScriptCommand(FRSCRCMD_DUMMY96, FrontierScrCmd_Dummy96) ScriptCommand(FRSCRCMD_97, FrontierScrCmd_97) ScriptCommand(FRSCRCMD_98, FrontierScrCmd_98) diff --git a/include/overlay104/battle_hall.h b/include/overlay104/battle_hall.h new file mode 100644 index 00000000000..fdb0251d037 --- /dev/null +++ b/include/overlay104/battle_hall.h @@ -0,0 +1,67 @@ +#ifndef POKEPLATINUM_BATTLE_HALL_H +#define POKEPLATINUM_BATTLE_HALL_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 "savedata.h" + +typedef struct BattleHall { + int unused; + u8 challengeType; + u8 currentBattle; + u8 saveStreak; + u8 opponentsLevel; + u16 currentStreak; + u16 currentRound; + fx32 playerLevelSqrt; + u32 unk_10; + int wonBattle; + u16 trainerIDs[HALL_BATTLES_PER_ROUND * 2]; + FrontierDataDTO opponents[2]; + u8 partySlots[2]; + Party *party; + u16 monIndices[HALL_BATTLES_PER_ROUND * 2]; + FrontierPokemonDataDTO opponentMons[HALL_BATTLES_PER_ROUND * 2]; + u16 unk_6F0; + u16 selectedTypeIdx2; + u8 selectedType; + u8 selectedTypeIdx; + BattleHallSave *hallSave; + SaveData *saveData; + FieldBattleDTO *dto; + 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 *partnersMon; + u8 unk_D90; + u32 unk_D94; +} BattleHall; + +BattleHall *BattleHall_Init(SaveData *saveData, u16 resumingFromSave, u8 challengeType, u8 partySlot1, u8 partySlot2); +void BattleHall_SetupNextOpponent(BattleHall *battleHall, u16 unused); +void BattleHall_Free(BattleHall *battleHall); +void BattleHall_GetTypeSelectionAppResult(BattleHall *battleHall, void *args); +void BattleHall_UpdateWinRecordForCurrentMon(BattleHall *battleHall, u16 *updated); +void BattleHall_Save(BattleHall *battleHall, u8 saveType); +u16 BattleHall_IncrementCurrentBattle(BattleHall *battleHall); +u16 BattleHall_GetCurrentBattle(BattleHall *battleHall); +u16 BattleHall_GetNextOpponentObjectID(BattleHall *battleHall, u8 trainerSlot); +void BattleHall_SaveOnLoss(BattleHall *battleHall); +void BattleHall_SaveOnCompletingRound(BattleHall *battleHall); +BOOL BattleHall_SendCommMessage(BattleHall *battleHall, u16 command, u16 arg); +u16 BattleHall_GetEarnedBP(BattleHall *battleHall); +void BattleHall_CapTypeRanks(BattleHall *battleHall); +void BattleHall_CalcPlayerLevelSqrt(BattleHall *battleHall); + +#endif // POKEPLATINUM_BATTLE_HALL_H diff --git a/include/overlay104/battle_hall_helpers.h b/include/overlay104/battle_hall_helpers.h new file mode 100644 index 00000000000..4dfc0c85254 --- /dev/null +++ b/include/overlay104/battle_hall_helpers.h @@ -0,0 +1,23 @@ +#ifndef POKEPLATINUM_BATTLE_HALL_HELPERS_H +#define POKEPLATINUM_BATTLE_HALL_HELPERS_H + +#include "overlay104/battle_hall.h" +#include "overlay104/struct_ov104_02230BE4.h" + +#include "field_battle_data_transfer.h" + +#define BATTLE_HALL_MON_SUMMARY 0xfe + +void BattleHall_PickOpponentTrainerClasses(u8 selectedTypeIdx, u8 numTrainers, u8 typeRank, u8 currentBattle, u16 trainerIDs[]); +void BattleHall_PickOpponentTrainers(u8 challengeType, u8 numTrainers, int currentRound, u8 rank, u8 currentBattle, u16 trainerIDs[]); +void BattleHall_PickNextOpponentPokemon(u8 numOpponentsToPick, u8 selectedType, u8 typeRank, u8 currentBattle, u16 playersSpecies, u16 opponentIndices[], u8 battleType); +FieldBattleDTO *BattleHall_SetupBattle(BattleHall *battleHall, FieldFrontierDTO *fieldData); +u8 BattleHall_GetPlayerPartySize(u8 challengeType); +u8 BattleHall_GetOpponentPartySize(u8 challengeType); +u8 BattleHall_CursorPosToType(u8 cursorPos); +BOOL BattleHall_IsMultiPlayerChallenge(u8 challengeType); +u8 BattleHall_GetHallMatronTypeRank(BattleHall *battleHall); +u16 BattleHall_GetHighestLevelInParty(BattleHall *battleHall); +fx32 BattleHall_GetLevelSquareRoot(u32 level); + +#endif // POKEPLATINUM_BATTLE_HALL_HELPERS_H diff --git a/include/overlay104/frscrcmd_battle_hall.h b/include/overlay104/frscrcmd_battle_hall.h index 38f59e330b6..9bfb4607e7c 100644 --- a/include/overlay104/frscrcmd_battle_hall.h +++ b/include/overlay104/frscrcmd_battle_hall.h @@ -4,16 +4,16 @@ #include "overlay104/defs.h" BOOL FrontierScrCmd_InitBattleHall(FrontierScriptContext *ctx); -BOOL FrontierScrCmd_8C(FrontierScriptContext *param0); +BOOL FrontierScrCmd_BattleHall_SetupNextOpponent(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 *ctx); -BOOL FrontierScrCmd_93(FrontierScriptContext *param0); +BOOL FrontierScrCmd_BattleHall_SendCommMessage(FrontierScriptContext *param0); BOOL FrontierScrCmd_94(FrontierScriptContext *param0); -BOOL FrontierScrCmd_95(FrontierScriptContext *param0); +BOOL FrontierScrCmd_BattleHall_PrintTrainerIntro(FrontierScriptContext *param0); BOOL FrontierScrCmd_BattleHall_UpdateWinRecord(FrontierScriptContext *ctx); BOOL FrontierScrCmd_C7(FrontierScriptContext *param0); diff --git a/include/overlay104/ov104_0222DCE0.h b/include/overlay104/ov104_0222DCE0.h index 74021352da9..88c115ba3e3 100644 --- a/include/overlay104/ov104_0222DCE0.h +++ b/include/overlay104/ov104_0222DCE0.h @@ -17,9 +17,9 @@ #include "trainer_info.h" BattleFrontierTrainerData *BattleFrontier_GetTrainerDataFromTrainerIDAndNarcID(u16 battleTowerTrainerID, enum HeapID heapID, enum NarcID narcID); -void BattleTower_GetMonDataFromSetIDAndNarcID(BattleFrontierPokemonData *monData, int setID, enum NarcID narcID); +void BattleTower_GetMonDataFromSetIDAndNarcID(BattleFrontierPokemonData *monData, int narcIdx, enum NarcID narcID); BattleFrontierTrainerData *BattleFrontier_GetTrainerData(FrontierTrainerDataDTO *trDataDTO, int battleTowerTrainerID, enum HeapID heapID, enum NarcID narcID); -u32 ov104_0222DD6C(FrontierPokemonDataDTO *param0, u16 param1, u32 param2, u32 param3, u8 param4, u8 param5, BOOL param6, int param7, enum NarcID narcID); +u32 ov104_0222DD6C(FrontierPokemonDataDTO *param0, u16 narcIdx, u32 otID, u32 param3, u8 ivs, u8 param5, BOOL param6, int heapID, enum NarcID narcID); void FrontierPokemonDataDTO_InitPokemon(const FrontierPokemonDataDTO *pokemonDTO, Pokemon *mon, u8 param2); u16 BattleTower_GetObjectIDFromTrainerClass(u8 trainerClass); void ov104_0222E134(SaveData *saveData, Pokemon *param1); @@ -27,15 +27,15 @@ void ov104_0222E1C0(SaveData *saveData, Party *party, Pokemon *param2); void BattleCastle_UpdateMonSpriteAnimID(Sprite *sprite, u8 animID); void BattleCastle_UpdateMonSpritePosition(Sprite *sprite, s16 x, s16 y, u8 isSelected); u8 BattleCastle_GetPokeIconAnimID(u16 hp, u16 maxHp); -void ov104_0222E278(FrontierDataDTO *param0, u16 param1, enum HeapID heapID, int param3); +void BattleFrontier_LoadTrainer(FrontierDataDTO *opponent, u16 trainerID, enum HeapID heapID, enum NarcID narcID); void FieldBattleDTO_InitFrontierTrainer(FieldBattleDTO *battleDTO, FrontierTrainerDataDTO *trDataDTO, int unused, int battlerId, enum HeapID heapID); -u32 ov104_0222E2F0(FrontierPokemonDataDTO *param0, u16 param1, int param2, u8 param3, u32 param4, int param5, int param6); +u32 BattleFrontier_LoadOpponentMonData(FrontierPokemonDataDTO *mon, u16 narcIdx, int item, u8 ivs, u32 personality, int heapID, int narcID); void ov104_0222E330(FrontierPokemonDataDTO *param0, u16 param1[], u8 param2[], u32 param3[], u32 param4[], int param5, int param6, int param7); 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 BattleFrontier_SetPartnerInStrTemplate(StringTemplate *template, u32 idx); -enum ObjectEventGfx BattleFrontier_GetPlayerObjEventGfx(const TrainerInfo *param0); +enum ObjectEventGfx BattleFrontier_GetPlayerObjEventGfx(const TrainerInfo *playerInfo); void BattleFrontier_FlagGeonetLinkInfo(SaveData *saveData); #endif // POKEPLATINUM_OV104_0222DCE0_H diff --git a/include/overlay104/ov104_0222ECE8.h b/include/overlay104/ov104_0222ECE8.h index 4b452b6cb91..f762112206f 100644 --- a/include/overlay104/ov104_0222ECE8.h +++ b/include/overlay104/ov104_0222ECE8.h @@ -1,10 +1,10 @@ #ifndef POKEPLATINUM_OV104_0222ECE8_H #define POKEPLATINUM_OV104_0222ECE8_H +#include "overlay104/battle_hall.h" #include "overlay104/struct_battle_arcade.h" #include "overlay104/struct_battle_castle.h" #include "overlay104/struct_battle_factory.h" -#include "overlay104/struct_battle_hall.h" void ov104_0222ECE8(int param0, int param1, void *param2, void *param3); BOOL ov104_0222ED00(BattleHall *param0); diff --git a/include/overlay104/ov104_02231F74.h b/include/overlay104/ov104_02231F74.h index e28300d215d..730762a1ce9 100644 --- a/include/overlay104/ov104_02231F74.h +++ b/include/overlay104/ov104_02231F74.h @@ -51,8 +51,8 @@ void ov104_02232FEC(FrontierGraphics *param0); void ov104_0223307C(FrontierGraphics *param0); ManagedSprite *ov104_022330AC(FrontierGraphics *param0, int param1, int param2); void ov104_022330F0(FrontierGraphics *param0, ManagedSprite *param1); -void ov104_022330FC(FrontierScriptContext *ctx, u16 *args); -void ov104_0223310C(FrontierScriptContext *ctx, u16 *args, u32 bankID); +void BattleFrontier_PrintNormalTrainerMessage(FrontierScriptContext *ctx, u16 *args); +void BattleFrontier_PrintTrainerMessage(FrontierScriptContext *ctx, u16 *args, u32 bankID); void ov104_0223319C(SysTask *param0, void *param1); void ov104_022331E8(SysTask *param0, void *param1); void FrontierMenuManager_SetHorizontalAnchor(FrontierMenuManager *menuManager, BOOL anchorRight); diff --git a/include/overlay104/ov104_02234DB4.h b/include/overlay104/ov104_02234DB4.h deleted file mode 100644 index 6f7388fbce5..00000000000 --- a/include/overlay104/ov104_02234DB4.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef POKEPLATINUM_OV104_02234DB4_H -#define POKEPLATINUM_OV104_02234DB4_H - -#include "overlay104/struct_battle_hall.h" - -#include "savedata.h" - -BattleHall *BattleHall_Init(SaveData *saveData, u16 resumingFromSave, u8 challengeType, u8 partySlot1, u8 partySlot2); -void ov104_022350B0(BattleHall *param0, u16 param1); -void BattleHall_Free(BattleHall *battleHall); -void BattleHall_GetTypeSelectionAppResult(BattleHall *battleHall, void *args); -void BattleHall_UpdateWinRecordForCurrentMon(BattleHall *battleHall, u16 *updated); -void BattleHall_Save(BattleHall *battleHall, u8 saveType); -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); -BOOL ov104_02235534(BattleHall *param0, u16 param1, u16 param2); -u16 ov104_02235578(BattleHall *param0); -void ov104_022356A0(BattleHall *param0); -void BattleHall_CalcPlayerLevelSqrt(BattleHall *battleHall); - -#endif // POKEPLATINUM_OV104_02234DB4_H diff --git a/include/overlay104/ov104_0223AF58.h b/include/overlay104/ov104_0223AF58.h deleted file mode 100644 index ba8ce0c7d9f..00000000000 --- a/include/overlay104/ov104_0223AF58.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef POKEPLATINUM_OV104_0223AF58_H -#define POKEPLATINUM_OV104_0223AF58_H - -#include "overlay104/struct_battle_hall.h" -#include "overlay104/struct_ov104_02230BE4.h" - -#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 *FieldBattleDTO_NewBattleHall(BattleHall *battleHall, FieldFrontierDTO *fieldData); -u8 BattleHall_GetPlayerPartySize(u8 challengeType); -u8 BattleHall_GetOpponentPartySize(u8 challengeType); -u8 BattleHall_CursorPosToType(u8 cursorPos); -BOOL BattleHall_IsMultiPlayerChallenge(u8 challengeType); -u8 ov104_0223B5C0(BattleHall *battleHall); -u16 BattleHall_GetHighestLevelInParty(BattleHall *battleHall); -fx32 BattleHall_GetLevelSquareRoot(u32 level); - -#endif // POKEPLATINUM_OV104_0223AF58_H diff --git a/include/overlay104/struct_battle_hall.h b/include/overlay104/struct_battle_hall.h deleted file mode 100644 index d36f86310c4..00000000000 --- a/include/overlay104/struct_battle_hall.h +++ /dev/null @@ -1,51 +0,0 @@ -#ifndef POKEPLATINUM_STRUCT_BATTLE_HALL_H -#define POKEPLATINUM_STRUCT_BATTLE_HALL_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 "savedata.h" - -typedef struct BattleHall { - int unused; - u8 challengeType; - u8 unk_05; - u8 streakActive; - u8 unk_07; - u16 currentStreak; - u16 currentRound; - fx32 playerLevelSqrt; - u32 unk_10; - int wonBattle; - u16 trainerIDs[BATTLES_PER_ROUND_HALL * 2]; - FrontierDataDTO unk_40[2]; - u8 partySlots[2]; - Party *party; - u16 unk_268[20]; - FrontierPokemonDataDTO unk_290[20]; - u16 unk_6F0; - u16 selectedTypeIdx2; - u8 selectedType; - u8 selectedTypeIdx; - BattleHallSave *hallSave; - SaveData *saveData; - FieldBattleDTO *dto; - 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 *partnersMon; - u8 unk_D90; - u32 unk_D94; -} BattleHall; - -#endif // POKEPLATINUM_STRUCT_BATTLE_HALL_H diff --git a/include/overlay104/struct_ov104_02230BE4.h b/include/overlay104/struct_ov104_02230BE4.h index c18752a4553..084e98481d5 100644 --- a/include/overlay104/struct_ov104_02230BE4.h +++ b/include/overlay104/struct_ov104_02230BE4.h @@ -9,7 +9,7 @@ #include "savedata.h" typedef struct FieldFrontierDTO { - void *unk_00; + void *facilityData; const Options *options; SaveData *saveData; JournalEntry *journalEntry; diff --git a/platinum.us/main.lsf b/platinum.us/main.lsf index 5a670784658..0e49c75752a 100644 --- a/platinum.us/main.lsf +++ b/platinum.us/main.lsf @@ -1544,7 +1544,7 @@ Overlay overlay104 Object main.nef.p/src_overlay104_frscrcmd_battle_factory.c.o Object main.nef.p/src_overlay104_ov104_022339B4.c.o Object main.nef.p/src_overlay104_frscrcmd_battle_hall.c.o - Object main.nef.p/src_overlay104_ov104_02234DB4.c.o + Object main.nef.p/src_overlay104_battle_hall.c.o Object main.nef.p/src_overlay104_frscrcmd_battle_castle.c.o Object main.nef.p/src_overlay104_ov104_022361B4.c.o Object main.nef.p/src_overlay104_frscrcmd_battle_arcade.c.o @@ -1556,7 +1556,7 @@ Overlay overlay104 Object main.nef.p/src_overlay104_ov104_02239C58.c.o Object main.nef.p/src_overlay104_ov104_0223A0C4.c.o Object main.nef.p/src_overlay104_ov104_0223A7F4.c.o - Object main.nef.p/src_overlay104_ov104_0223AF58.c.o + Object main.nef.p/src_overlay104_battle_hall_helpers.c.o Object main.nef.p/src_overlay104_ov104_0223B6F4.c.o Object main.nef.p/src_overlay104_ov104_0223BCBC.c.o Object main.nef.p/src_overlay104_ov104_0223C164.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 4fed3a6e35d..669e186c25f 100644 --- a/res/field/frontier_scripts/frontier_scripts_battle_hall.s +++ b/res/field/frontier_scripts/frontier_scripts_battle_hall.s @@ -579,7 +579,7 @@ _0532: FreeParticleSystem 0 FadeScreenIn COLOR_WHITE FrontierScrCmd_46 0xC350 - CallBattleHallFunction BH_FUNC_UNK_23, 0, 0, VAR_0x8008 + CallBattleHallFunction BH_FUNC_GET_CURRENT_BATTLE, 0, 0, VAR_0x8008 GoToIfEq VAR_0x8008, 0, _0595 SetVar VAR_0x8003, 1 GoTo _0B48 @@ -587,7 +587,7 @@ _0532: _0595: Message BattleHallScene_Text_ChooseType - CallBattleHallFunction BH_FUNC_UNK_35, 0, 0, VAR_0x8008 + CallBattleHallFunction BH_FUNC_CAP_TYPE_RANKS, 0, 0, VAR_0x8008 CallBattleHallFunction BH_FUNC_IS_MULTIPLAYER_CHALLENGE, 0, 0, VAR_0x8008 GoToIfEq VAR_0x8008, 1, _05BC GoTo _0611 @@ -604,7 +604,7 @@ _05BC: _05D4: SetVar VAR_0x8006, 7 - FrontierScrCmd_93 VAR_0x8006, 0, VAR_0x8008 + BattleHall_SendCommMessage VAR_0x8006, 0, VAR_0x8008 GoToIfEq VAR_0x8008, 0, _05D4 FrontierScrCmd_94 VAR_0x8006 ClearReceivedTempDataAllPlayers @@ -627,7 +627,7 @@ _0611: CallBattleHallFunction BH_FUNC_TOGGLE_ENGINE_LAYER, 0, 0, VAR_0x8008 CallBattleHallFunction BH_FUNC_SET_BASE_LEVEL, 0, 0, VAR_0x8008 FadeScreenIn - FrontierScrCmd_8C VAR_0x8003 + BattleHall_SetupNextOpponent GoTo _0665 End @@ -642,9 +642,9 @@ _0665: GoToIfEq VAR_0x8008, 1, _0708 CallIfNe FR_VAR_0x800E, 0, _080D SetVar FR_VAR_0x800E, 1 - CallBattleHallFunction BH_FUNC_UNK_37, 0, 0, VAR_0x8008 - GoToIfEq VAR_0x8008, 1, _1199 - GoToIfEq VAR_0x8008, 2, _11BE + CallBattleHallFunction BH_FUNC_GET_NEXT_BATTLE_TYPE, 0, 0, VAR_0x8008 + GoToIfEq VAR_0x8008, HALL_NEXT_BATTLE_SILVER, _1199 + GoToIfEq VAR_0x8008, HALL_NEXT_BATTLE_GOLD, _11BE Call _13C3 BufferNumber 0, VAR_0x8008 Call _083D @@ -653,8 +653,8 @@ _0665: WaitTime 15, VAR_0x8008 ApplyMovement 98, _01A4 WaitMovement - CallBattleHallFunction BH_FUNC_UNK_32, 0, 0, VAR_0x8008 - FrontierScrCmd_95 0 + CallBattleHallFunction BH_FUNC_LOAD_TRAINERS, 0, 0, VAR_0x8008 + BattleHall_PrintTrainerIntro 0 WaitABPress CloseMessage ApplyMovement 10, _0214 @@ -679,7 +679,7 @@ _0708: _0731: SetVar VAR_0x8006, 1 - FrontierScrCmd_93 VAR_0x8006, 0, VAR_0x8008 + BattleHall_SendCommMessage VAR_0x8006, 0, VAR_0x8008 GoToIfEq VAR_0x8008, 0, _0731 FrontierScrCmd_94 VAR_0x8006 ClearReceivedTempDataAllPlayers @@ -691,7 +691,7 @@ _0731: _0762: SetVar VAR_0x8006, 2 - FrontierScrCmd_93 VAR_0x8006, 0, VAR_0x8008 + BattleHall_SendCommMessage VAR_0x8006, 0, VAR_0x8008 GoToIfEq VAR_0x8008, 0, _0762 FrontierScrCmd_94 VAR_0x8006 ClearReceivedTempDataAllPlayers @@ -704,14 +704,14 @@ _0762: WaitTime 15, VAR_0x8008 ApplyMovement 98, _01A4 WaitMovement - CallBattleHallFunction BH_FUNC_UNK_32, 0, 0, VAR_0x8008 - FrontierScrCmd_95 0 + CallBattleHallFunction BH_FUNC_LOAD_TRAINERS, 0, 0, VAR_0x8008 + BattleHall_PrintTrainerIntro 0 WaitTime 30, VAR_0x8008 CloseMessage ApplyMovement 99, _01A4 WaitMovement - CallBattleHallFunction BH_FUNC_UNK_32, 0, 0, VAR_0x8008 - FrontierScrCmd_95 1 + CallBattleHallFunction BH_FUNC_LOAD_TRAINERS, 0, 0, VAR_0x8008 + BattleHall_PrintTrainerIntro 1 WaitTime 30, VAR_0x8008 CloseMessage ApplyMovement 1, _0214 @@ -737,18 +737,18 @@ _0821: Return _083D: - CallBattleHallFunction BH_FUNC_UNK_20, 0, 0, VAR_0x8008 + CallBattleHallFunction BH_FUNC_GET_OPPONENT_OBJECT_ID, 0, 0, VAR_0x8008 SetVar VAR_0x800B, VAR_0x8008 FrontierScrCmd_22 _0114 FrontierScrCmd_24 _0124 Return _0858: - CallBattleHallFunction BH_FUNC_UNK_20, 0, 0, VAR_0x8008 + CallBattleHallFunction BH_FUNC_GET_OPPONENT_OBJECT_ID, 0, 0, VAR_0x8008 SetVar VAR_0x800B, VAR_0x8008 FrontierScrCmd_22 _0114 FrontierScrCmd_24 _0124 - CallBattleHallFunction BH_FUNC_UNK_20, 1, 0, VAR_0x8008 + CallBattleHallFunction BH_FUNC_GET_OPPONENT_OBJECT_ID, 1, 0, VAR_0x8008 SetVar VAR_0x800C, VAR_0x8008 FrontierScrCmd_22 _011C FrontierScrCmd_24 _0134 @@ -763,9 +763,9 @@ _088C: _08A0: CallBattleHallFunction BH_FUNC_IS_MULTIPLAYER_CHALLENGE, 0, 0, VAR_0x8008 GoToIfEq VAR_0x8008, 1, _08F1 - CallBattleHallFunction BH_FUNC_UNK_37, 0, 0, VAR_0x8008 - GoToIfEq VAR_0x8008, 1, _08E1 - GoToIfEq VAR_0x8008, 2, _08E1 + CallBattleHallFunction BH_FUNC_GET_NEXT_BATTLE_TYPE, 0, 0, VAR_0x8008 + GoToIfEq VAR_0x8008, HALL_NEXT_BATTLE_SILVER, _08E1 + GoToIfEq VAR_0x8008, HALL_NEXT_BATTLE_GOLD, _08E1 FrontierScrCmd_3F 1 GoTo _0907 End @@ -794,14 +794,14 @@ _0907: BattleHall_CheckWonBattle VAR_0x8008 GoToIfEq VAR_0x8008, 0, _0F5D IncrementRecordValue RECORD_BATTLE_HALL_VICTORIES - CallBattleHallFunction BH_FUNC_UNK_28, 0, 0, VAR_0x8008 - CallBattleHallFunction BH_FUNC_UNK_33, 0, 0, VAR_0x8008 + CallBattleHallFunction BH_FUNC_INCREMENT_RANK_OF_BEATEN_TYPE, 0, 0, VAR_0x8008 + CallBattleHallFunction BH_FUNC_GET_RANK_OF_BEATEN_TYPE, 0, 0, VAR_0x8008 CallIfEq VAR_0x8008, 10, _09B1 CallBattleHallFunction BH_FUNC_IS_MULTIPLAYER_CHALLENGE, 0, 0, VAR_0x8008 GoToIfEq VAR_0x8008, 1, _09E3 - CallBattleHallFunction BH_FUNC_UNK_37, 0, 0, VAR_0x8008 - GoToIfEq VAR_0x8008, 1, _1333 - GoToIfEq VAR_0x8008, 2, _137B + CallBattleHallFunction BH_FUNC_GET_NEXT_BATTLE_TYPE, 0, 0, VAR_0x8008 + GoToIfEq VAR_0x8008, HALL_NEXT_BATTLE_SILVER, _1333 + GoToIfEq VAR_0x8008, HALL_NEXT_BATTLE_GOLD, _137B Call _13C3 BufferNumber 0, VAR_0x8008 InitParticleSystem 0, battle_hall_spa @@ -851,9 +851,9 @@ _0A41: End _0A49: - CallBattleHallFunction BH_FUNC_UNK_14, 1, 0, VAR_0x8008 + CallBattleHallFunction BH_FUNC_INCREMENT_CURRENT_BATTLE, 1, 0, VAR_0x8008 CallBattleHallFunction BH_FUNC_INCREMENT_CURRENT_STREAK, 0, 0, VAR_0x8008 - CallBattleHallFunction BH_FUNC_UNK_23, 0, 0, VAR_0x8008 + CallBattleHallFunction BH_FUNC_GET_CURRENT_BATTLE, 0, 0, VAR_0x8008 GoToIfNe VAR_0x8008, 10, _0B25 GoTo _0A73 End @@ -880,13 +880,13 @@ _0AC8: End _0AD6: - CallBattleHallFunction BH_FUNC_UNK_22, 0, 0, VAR_0x8008 + CallBattleHallFunction BH_FUNC_SAVE_ON_COMPLETING_ROUND, 0, 0, VAR_0x8008 SetSystemVar VAR_BATTLE_HALL_LOBBY_LOAD_ACTION, 1 - CallBattleHallFunction BH_FUNC_UNK_15, 0, 0, VAR_0x8008 + CallBattleHallFunction BH_FUNC_GET_PLAYERS_MONS_SPECIES, 0, 0, VAR_0x8008 BufferSpeciesName 0, VAR_0x8008 Message BattleHallScene_Text_BPEarned BufferPlayerName 0 - CallBattleHallFunction BH_FUNC_UNK_34, 0, 0, VAR_0x8008 + CallBattleHallFunction BH_FUNC_GET_EARNED_BP, 0, 0, VAR_0x8008 BufferNumber 1, VAR_0x8008 GiveBattlePoints VAR_0x8008 Message BattleHallScene_Text_ReceiveBP @@ -901,7 +901,7 @@ _0B1D: End _0B25: - CallBattleHallFunction BH_FUNC_UNK_15, 0, 0, VAR_0x8008 + CallBattleHallFunction BH_FUNC_GET_PLAYERS_MONS_SPECIES, 0, 0, VAR_0x8008 BufferSpeciesName 0, VAR_0x8008 Message BattleHallScene_Text_FullRestore PlayFanfare SEQ_ASA @@ -917,7 +917,7 @@ _0B48: End _0B5B: - CallBattleHallFunction BH_FUNC_UNK_23, 0, 0, VAR_0x8008 + CallBattleHallFunction BH_FUNC_GET_CURRENT_BATTLE, 0, 0, VAR_0x8008 AddVar VAR_0x8008, 1 BufferNumber 0, VAR_0x8008 Message BattleHallScene_Text_AreYouReady @@ -1025,7 +1025,7 @@ _0D2C: _0D3B: SetVar VAR_0x8006, 3 - FrontierScrCmd_93 VAR_0x8006, 0, VAR_0x8008 + BattleHall_SendCommMessage VAR_0x8006, 0, VAR_0x8008 GoToIfEq VAR_0x8008, 0, _0D3B FrontierScrCmd_94 VAR_0x8006 ClearReceivedTempDataAllPlayers @@ -1154,7 +1154,7 @@ _0F01: _0F0D: SetVar VAR_0x8006, 3 - FrontierScrCmd_93 VAR_0x8006, 1, VAR_0x8008 + BattleHall_SendCommMessage VAR_0x8006, 1, VAR_0x8008 GoToIfEq VAR_0x8008, 0, _0F0D GoTo _0F30 End @@ -1167,7 +1167,7 @@ _0F30: End _0F40: - CallBattleHallFunction BH_FUNC_UNK_21, 0, 0, VAR_0x8008 + CallBattleHallFunction BH_FUNC_SAVE_ON_LOSS, 0, 0, VAR_0x8008 SetSystemVar VAR_BATTLE_HALL_LOBBY_LOAD_ACTION, 3 GoTo _100D End @@ -1202,7 +1202,7 @@ _0FC0: End _0FC8: - CallBattleHallFunction BH_FUNC_UNK_21, 0, 0, VAR_0x8008 + CallBattleHallFunction BH_FUNC_SAVE_ON_LOSS, 0, 0, VAR_0x8008 SetSystemVar VAR_BATTLE_HALL_LOBBY_LOAD_ACTION, 3 GoTo _0FDD End @@ -1280,7 +1280,7 @@ _10C2: _10C8: PlaySoundEffect SEQ_SE_DP_DENDOU - CallBattleHallFunction BH_FUNC_UNK_19, 0, 0, VAR_0x8008 + CallBattleHallFunction BH_FUNC_GET_CURRENT_ROUND, 0, 0, VAR_0x8008 GoToIfLt VAR_0x8008, 2, _10F5 GoToIfLt VAR_0x8008, 5, _1109 GoTo _1117 @@ -1303,7 +1303,7 @@ _1117: Return _1125: - CallBattleHallFunction BH_FUNC_UNK_23, 0, 0, VAR_0x8008 + CallBattleHallFunction BH_FUNC_GET_CURRENT_BATTLE, 0, 0, VAR_0x8008 AddVar VAR_0x8008, 1 GoToIfEq VAR_0x8008, 10, _1159 PlaySoundEffect SEQ_SE_DP_UG_022 diff --git a/res/trainers/frontier/meson.build b/res/trainers/frontier/meson.build index 9fc96f6cd3b..f70f99a5cf4 100644 --- a/res/trainers/frontier/meson.build +++ b/res/trainers/frontier/meson.build @@ -24,8 +24,9 @@ frontier_data = custom_target('datagen_frontier_out', output: [ 'pl_btdtr.narc', 'pl_btdpm.narc', + 'frontier_trainer_classes.h', 'frontier_trainer_names.json', - 'frontier_trainer_messages.json' + 'frontier_trainer_messages.json', ], command: [ frontierproc_exe, @@ -43,4 +44,4 @@ frontier_data = custom_target('datagen_frontier_out', nitrofs_files += frontier_data frontier_data_outputs = frontier_data.to_list() -frontier_text_banks = frontier_data_outputs.slice(2, frontier_data_outputs.length()) +frontier_text_banks = frontier_data_outputs.slice(3, frontier_data_outputs.length()) diff --git a/src/applications/frontier/battle_hall/main.c b/src/applications/frontier/battle_hall/main.c index ce7a792f307..2ac8be23c7e 100644 --- a/src/applications/frontier/battle_hall/main.c +++ b/src/applications/frontier/battle_hall/main.c @@ -8,8 +8,8 @@ #include "applications/frontier/battle_hall/sprites.h" #include "applications/frontier/battle_hall/windows.h" #include "applications/pokemon_summary_screen/main.h" +#include "overlay104/battle_hall_helpers.h" #include "overlay104/ov104_0222DCE0.h" -#include "overlay104/ov104_0223AF58.h" #include "battle_hall_save.h" #include "bg_window.h" @@ -90,8 +90,6 @@ enum BattleHallAppMultiConfirmSubState { #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 @@ -444,7 +442,7 @@ static BOOL State_SelectNextBattle(BattleHallApp *app) return FALSE; } } else { - if (BattleHall_GetRankOfType(GetCursorPos(app->cursorPos), app->typeRanks) >= MAX_RANK) { + if (BattleHall_GetRankOfType(GetCursorPos(app->cursorPos), app->typeRanks) >= HALL_MAX_TYPE_RANK) { Sound_PlayEffect(SEQ_SE_DP_BOX03); return FALSE; @@ -1138,8 +1136,8 @@ static void PrintTypesRanks(BattleHallApp *app, Window *window) u8 v3 = r * GRID_WIDTH + c; u8 rank = BattleHall_GetRankOfType(GetCursorPos(v3), app->typeRanks) + 1; - if (rank > MAX_RANK) { - rank = MAX_RANK; + if (rank > HALL_MAX_TYPE_RANK) { + rank = HALL_MAX_TYPE_RANK; } PrintRank(app, window, rank, 18 + (COL_WIDTH * c), 4 + (ROW_HEIGHT * r)); @@ -1513,8 +1511,8 @@ static void DrawMessageWithYesNoMenu(BattleHallApp *app) u8 rank = BattleHall_GetRankOfType(GetCursorPos(app->cursorPos), app->typeRanks) + 1; - if (rank > MAX_RANK) { - rank = MAX_RANK; + if (rank > HALL_MAX_TYPE_RANK) { + rank = HALL_MAX_TYPE_RANK; } SetStringTemplateNumber(app, 1, rank); diff --git a/src/battle_frontier.c b/src/battle_frontier.c index 9c52c3f1121..6e3f31ca49e 100644 --- a/src/battle_frontier.c +++ b/src/battle_frontier.c @@ -239,14 +239,14 @@ FrontierGraphics *BattleFrontier_GetGraphics(BattleFrontier *frontier) return frontier->graphics; } -void *sub_0209B978(BattleFrontier *frontier) +void *BattleFrontier_GetFacilityStruct(BattleFrontier *frontier) { - return frontier->fieldData->unk_00; + return frontier->fieldData->facilityData; } -void sub_0209B980(BattleFrontier *frontier, void *param1) +void BattleFrontier_SetFacilityStruct(BattleFrontier *frontier, void *facilityData) { - frontier->fieldData->unk_00 = param1; + frontier->fieldData->facilityData = facilityData; } void sub_0209B988(BattleFrontier *frontier, const ApplicationManagerTemplate *param1, void *param2, int param3, UnkFuncPtr_0209B988 param4) @@ -305,7 +305,7 @@ FieldFrontierDTO *sub_0209BA18(FieldSystem *fieldSystem, void *param1) MI_CpuClear8(fieldData, sizeof(FieldFrontierDTO)); - fieldData->unk_00 = param1; + fieldData->facilityData = param1; fieldData->options = SaveData_GetOptions(fieldSystem->saveData); fieldData->saveData = fieldSystem->saveData; fieldData->journalEntry = fieldSystem->journalEntry; diff --git a/src/battle_hall_save.c b/src/battle_hall_save.c index d62e807c419..bb21a64c9d8 100644 --- a/src/battle_hall_save.c +++ b/src/battle_hall_save.c @@ -35,8 +35,8 @@ void BattleHallSave_SetMember(BattleHallSave *save, u8 field, u8 index, u8 unuse case HALL_SAVE_CHALLENGE_TYPE: save->challengeType = *(u8 *)value; break; - case HALL_SAVE_UNK_1: - save->unk_01 = *(u8 *)value; + case HALL_SAVE_CURRENT_BATTLE: + save->currentBattleNum = *(u8 *)value; break; case HALL_SAVE_TRAINER_IDS: save->trainerIDs[index] = *(u16 *)value; @@ -44,8 +44,8 @@ void BattleHallSave_SetMember(BattleHallSave *save, u8 field, u8 index, u8 unuse case HALL_SAVE_PARTY_SLOTS: save->partySlots[index] = *(u8 *)value; break; - case HALL_SAVE_UNK_4: - save->unk_2C[index] = *(u16 *)value; + case HALL_SAVE_POKEMON_INDICES: + save->monIndices[index] = *(u16 *)value; break; default: GF_ASSERT(FALSE); @@ -58,14 +58,14 @@ u32 BattleHallSave_GetMember(BattleHallSave *save, u8 field, u8 index, u8 unused switch (field) { case HALL_SAVE_CHALLENGE_TYPE: return save->challengeType; - case HALL_SAVE_UNK_1: - return save->unk_01; + case HALL_SAVE_CURRENT_BATTLE: + return save->currentBattleNum; 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]; + case HALL_SAVE_POKEMON_INDICES: + return save->monIndices[index]; default: GF_ASSERT(FALSE); break; diff --git a/src/meson.build b/src/meson.build index 0da1bc171c3..e75c05e84ee 100644 --- a/src/meson.build +++ b/src/meson.build @@ -928,7 +928,7 @@ pokeplatinum_c = files( 'overlay104/frscrcmd_battle_factory.c', 'overlay104/ov104_022339B4.c', 'overlay104/frscrcmd_battle_hall.c', - 'overlay104/ov104_02234DB4.c', + 'overlay104/battle_hall.c', 'overlay104/frscrcmd_battle_castle.c', 'overlay104/ov104_022361B4.c', 'overlay104/frscrcmd_battle_arcade.c', @@ -940,7 +940,7 @@ pokeplatinum_c = files( 'overlay104/ov104_02239C58.c', 'overlay104/ov104_0223A0C4.c', 'overlay104/ov104_0223A7F4.c', - 'overlay104/ov104_0223AF58.c', + 'overlay104/battle_hall_helpers.c', 'overlay104/ov104_0223B6F4.c', 'overlay104/ov104_0223BCBC.c', 'overlay104/ov104_0223C164.c', diff --git a/src/overlay104/ov104_02234DB4.c b/src/overlay104/battle_hall.c similarity index 57% rename from src/overlay104/ov104_02234DB4.c rename to src/overlay104/battle_hall.c index 0c10340871d..562aebd7029 100644 --- a/src/overlay104/ov104_02234DB4.c +++ b/src/overlay104/battle_hall.c @@ -1,4 +1,4 @@ -#include "overlay104/ov104_02234DB4.h" +#include "overlay104/battle_hall.h" #include @@ -7,15 +7,16 @@ #include "struct_defs/battle_frontier.h" #include "applications/frontier/battle_hall/main.h" +#include "overlay104/battle_hall.h" +#include "overlay104/battle_hall_helpers.h" #include "overlay104/ov104_0222DCE0.h" #include "overlay104/ov104_0222ECE8.h" -#include "overlay104/ov104_0223AF58.h" -#include "overlay104/struct_battle_hall.h" #include "battle_frontier_save.h" #include "battle_frontier_stats.h" #include "battle_hall_save.h" #include "battle_hall_win_records.h" +#include "frontier_trainers.h" #include "heap.h" #include "party.h" #include "pokemon.h" @@ -23,11 +24,11 @@ #include "system_vars.h" #include "vars_flags.h" -static void ov104_022350B8(BattleHall *param0); +static void SetupNextOpponent(BattleHall *battleHall); static u16 GetBattleHallAppSelectedCell(BattleHallAppArgs *args, u8 unused); 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); +static u16 BattleHall_CalcOpponentsLevel(BattleHall *battleHall); BattleHall *BattleHall_Init(SaveData *saveData, u16 resumingFromSave, u8 challengeType, u8 partySlot1, u8 partySlot2) { @@ -51,7 +52,7 @@ BattleHall *BattleHall_Init(SaveData *saveData, u16 resumingFromSave, u8 challen if (!resumingFromSave) { battleHall->challengeType = challengeType; partySize = BattleHall_GetPlayerPartySize(battleHall->challengeType); - battleHall->unk_05 = 0; + battleHall->currentBattle = 0; BattleHallSave_Init(currentChallenge); @@ -76,19 +77,19 @@ BattleHall *BattleHall_Init(SaveData *saveData, u16 resumingFromSave, u8 challen } else { 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->currentBattle = BattleHallSave_GetMember(currentChallenge, HALL_SAVE_CURRENT_BATTLE, 0, 0, NULL); battleHall->currentStreak = BattleFrontierSave_GetStatAutoHostIdx(SaveData_GetBattleFrontier(battleHall->saveData), BattleFrontierStats_GetHallLatestStreakIndex(battleHall->challengeType)); for (i = 0; i < partySize; i++) { battleHall->partySlots[i] = BattleHallSave_GetMember(currentChallenge, HALL_SAVE_PARTY_SLOTS, i, 0, NULL); } - for (i = 0; i < BATTLES_PER_ROUND_HALL * 2; i++) { + for (i = 0; i < HALL_BATTLES_PER_ROUND * 2; i++) { battleHall->trainerIDs[i] = BattleHallSave_GetMember(currentChallenge, HALL_SAVE_TRAINER_IDS, i, 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 (i = 0; i < HALL_BATTLES_PER_ROUND * 2; i++) { + battleHall->monIndices[i] = (u8)BattleHallSave_GetMember(currentChallenge, HALL_SAVE_POKEMON_INDICES, i, 0, NULL); } } @@ -98,11 +99,11 @@ BattleHall *BattleHall_Init(SaveData *saveData, u16 resumingFromSave, u8 challen } battleHall->unk_10 = 0; - battleHall->currentRound = battleHall->currentStreak / 10; + battleHall->currentRound = battleHall->currentStreak / HALL_BATTLES_PER_ROUND; if (battleHall->challengeType == FRONTIER_CHALLENGE_MULTI) { for (i = 0; i < NUM_POKEMON_TYPES; i++) { - BattleHall_SetRankOfType(i, &battleHall->typeRanks[2][0], 10 - 1); + BattleHall_SetRankOfType(i, &battleHall->typeRanks[2][0], HALL_MAX_TYPE_RANK - 1); } } else { for (i = 0; i < NUM_POKEMON_TYPES; i++) { @@ -120,55 +121,42 @@ BattleHall *BattleHall_Init(SaveData *saveData, u16 resumingFromSave, u8 challen return battleHall; } -void ov104_022350B0(BattleHall *param0, u16 param1) +void BattleHall_SetupNextOpponent(BattleHall *battleHall, u16 unused) { - if (param1 == 0) { - ov104_022350B8(param0); - } else { - ov104_022350B8(param0); - } - - return; + SetupNextOpponent(battleHall); } -static void ov104_022350B8(BattleHall *param0) +static void SetupNextOpponent(BattleHall *battleHall) { - u8 v0, v1, v2, v3; - int v4, v5; - Pokemon *v6; + u8 battleType = HALL_NEXT_BATTLE_NORMAL; - v3 = 0; - v1 = 1; - - if (param0->challengeType != 0) { - v1 = 2; + u8 numOppTrainers = 1; + if (battleHall->challengeType != FRONTIER_CHALLENGE_SINGLE) { + numOppTrainers = 2; } - v0 = BattleHall_GetRankOfType(param0->selectedTypeIdx, ¶m0->typeRanks[param0->challengeType][0]); - param0->unk_07 = ov104_02235704(param0); + u8 typeRank = BattleHall_GetRankOfType(battleHall->selectedTypeIdx, &battleHall->typeRanks[battleHall->challengeType][0]); + battleHall->opponentsLevel = BattleHall_CalcOpponentsLevel(battleHall); - ov104_0223AF58(param0->selectedTypeIdx, v1, v0, param0->unk_05, param0->trainerIDs); - ov104_0223AFB4(param0->challengeType, v1, param0->currentRound, v0, param0->unk_05, param0->trainerIDs); + BattleHall_PickOpponentTrainerClasses(battleHall->selectedTypeIdx, numOppTrainers, typeRank, battleHall->currentBattle, battleHall->trainerIDs); + BattleHall_PickOpponentTrainers(battleHall->challengeType, numOppTrainers, battleHall->currentRound, typeRank, battleHall->currentBattle, battleHall->trainerIDs); - v2 = (param0->unk_05 * 2); + u8 offset = battleHall->currentBattle * 2; - if ((param0->trainerIDs[v2] == 307) || (param0->trainerIDs[v2] == 308)) { - v5 = ov104_0223B5C0(param0); - v0 = v5; + if (battleHall->trainerIDs[offset] == FRONTIER_TRAINER_HALL_MATRON_ARGENTA_SILVER || battleHall->trainerIDs[offset] == FRONTIER_TRAINER_HALL_MATRON_ARGENTA_GOLD) { + typeRank = (int)BattleHall_GetHallMatronTypeRank(battleHall); } - if (param0->trainerIDs[v2] == 307) { - v3 = 1; + if (battleHall->trainerIDs[offset] == FRONTIER_TRAINER_HALL_MATRON_ARGENTA_SILVER) { + battleType = HALL_NEXT_BATTLE_SILVER; } - if (param0->trainerIDs[v2] == 308) { - v3 = 2; + if (battleHall->trainerIDs[offset] == FRONTIER_TRAINER_HALL_MATRON_ARGENTA_GOLD) { + battleType = HALL_NEXT_BATTLE_GOLD; } - 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; + Pokemon *playersMon = Party_GetPokemonBySlotIndex(battleHall->party, 0); + BattleHall_PickNextOpponentPokemon(1, battleHall->selectedType, typeRank, battleHall->currentBattle, Pokemon_GetValue(playersMon, MON_DATA_SPECIES, NULL), battleHall->monIndices, battleType); } void BattleHall_Free(BattleHall *battleHall) @@ -238,8 +226,8 @@ void BattleHall_Save(BattleHall *battleHall, u8 saveType) u16 currentSpecies = Pokemon_GetValue(mon, MON_DATA_SPECIES, NULL); u16 speciesOnRecord = BattleFrontierSave_GetStatAutoHostIdx(frontier, BattleFrontierStats_GetHallLatestSpeciesIndex(battleHall->challengeType)); - *u8Ptr = battleHall->unk_05; - BattleHallSave_SetMember(battleHall->hallSave, HALL_SAVE_UNK_1, 0, 0, u8Ptr); + *u8Ptr = battleHall->currentBattle; + BattleHallSave_SetMember(battleHall->hallSave, HALL_SAVE_CURRENT_BATTLE, 0, 0, u8Ptr); BattleFrontierSave_SetStatAutoHostIdx(frontier, BattleFrontierStats_GetHallLatestStreakIndex(battleHall->challengeType), battleHall->currentStreak); if (saveType != 2) { @@ -253,15 +241,15 @@ void BattleHall_Save(BattleHall *battleHall, u8 saveType) } } - *u8Ptr = battleHall->streakActive; + *u8Ptr = battleHall->saveStreak; BattleHallStreakFlags_SetFlag(streakFlags, HALL_SAVE_STREAK_FLAGS, battleHall->challengeType, 0, u8Ptr); if (battleHall->challengeType == FRONTIER_CHALLENGE_MULTI_WFC) { - BattleFrontierSave_SetStatAutoHostIdx(frontier, STAT_HALL_WFC_STREAK_ACTIVE, battleHall->streakActive); + BattleFrontierSave_SetStatAutoHostIdx(frontier, STAT_HALL_WFC_STREAK_ACTIVE, battleHall->saveStreak); } } - for (i = 0; i < (10 * 2); i++) { + for (i = 0; i < HALL_BATTLES_PER_ROUND * 2; i++) { *u16Ptr = battleHall->trainerIDs[i]; BattleHallSave_SetMember(battleHall->hallSave, HALL_SAVE_TRAINER_IDS, i, 0, u16Ptr); } @@ -276,115 +264,107 @@ void BattleHall_Save(BattleHall *battleHall, u8 saveType) BattleHall_SaveTypeRank(battleHall->saveData, battleHall->challengeType, i, *u8Ptr); } - for (i = 0; i < (10 * 2); i++) { - *u16Ptr = battleHall->unk_268[i]; - BattleHallSave_SetMember(battleHall->hallSave, HALL_SAVE_UNK_4, i, 0, u16Ptr); + for (i = 0; i < HALL_BATTLES_PER_ROUND * 2; i++) { + *u16Ptr = battleHall->monIndices[i]; + BattleHallSave_SetMember(battleHall->hallSave, HALL_SAVE_POKEMON_INDICES, i, 0, u16Ptr); } BattleFrontierSave_SetStatAutoHostIdx(frontier, BattleFrontierStats_GetHallLatestSpeciesIndex(battleHall->challengeType), Pokemon_GetValue(mon, MON_DATA_SPECIES, NULL)); } -u16 ov104_022354B0(BattleHall *param0) +u16 BattleHall_IncrementCurrentBattle(BattleHall *battleHall) { - param0->unk_05++; - return param0->unk_05; + battleHall->currentBattle++; + return battleHall->currentBattle; } -u16 ov104_022354BC(BattleHall *param0) +u16 BattleHall_GetCurrentBattle(BattleHall *battleHall) { - return param0->unk_05; + return battleHall->currentBattle; } -u16 ov104_022354C0(BattleHall *param0, u8 param1) +u16 BattleHall_GetNextOpponentObjectID(BattleHall *battleHall, u8 trainerSlot) { - FrontierTrainerDataDTO v0; - u8 v2 = (param0->unk_05 * 2) + param1; + FrontierTrainerDataDTO trainer; + u8 offset = (battleHall->currentBattle * 2) + trainerSlot; - Heap_Free(BattleFrontier_GetTrainerData(&v0, param0->trainerIDs[v2], HEAP_ID_FIELD2, NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDTR)); + Heap_Free(BattleFrontier_GetTrainerData(&trainer, battleHall->trainerIDs[offset], HEAP_ID_FIELD2, NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDTR)); - return BattleTower_GetObjectIDFromTrainerClass(v0.trainerType); + return BattleTower_GetObjectIDFromTrainerClass(trainer.trainerType); } -void ov104_022354F4(BattleHall *param0) +void BattleHall_SaveOnLoss(BattleHall *battleHall) { - int v0; - - BattleHall_ResetRankOfAllTypes(¶m0->typeRanks[param0->challengeType][0]); - BattleHall_Save(param0, 1); - - return; + BattleHall_ResetRankOfAllTypes(&battleHall->typeRanks[battleHall->challengeType][0]); + BattleHall_Save(battleHall, 1); } -void ov104_02235518(BattleHall *param0) +void BattleHall_SaveOnCompletingRound(BattleHall *battleHall) { - Pokemon *v0; - - param0->streakActive = 1; + battleHall->saveStreak = TRUE; - if (param0->currentRound < 18) { - param0->currentRound++; + if (battleHall->currentRound < HALL_MAX_DISTINCT_ROUNDS) { + battleHall->currentRound++; } - param0->unk_05 = 0; - BattleHall_Save(param0, 0); - - return; + battleHall->currentBattle = 0; + BattleHall_Save(battleHall, 0); } -BOOL ov104_02235534(BattleHall *param0, u16 param1, u16 param2) +BOOL BattleHall_SendCommMessage(BattleHall *battleHall, u16 command, u16 arg) { - int v0; + int success; - switch (param1) { + switch (command) { case 0: - v0 = ov104_0222ED00(param0); + success = ov104_0222ED00(battleHall); break; case 1: - v0 = ov104_0222ED44(param0); + success = ov104_0222ED44(battleHall); break; case 2: - v0 = ov104_0222EDA8(param0); + success = ov104_0222EDA8(battleHall); break; case 3: - v0 = ov104_0222EE14(param0, param2); + success = ov104_0222EE14(battleHall, arg); break; case 7: - v0 = ov104_0222EE60(param0); + success = ov104_0222EE60(battleHall); break; } - return v0; + return success; } -u16 ov104_02235578(BattleHall *param0) +u16 BattleHall_GetEarnedBP(BattleHall *battleHall) { - u8 v0; - static const u8 v1[18 + 1] = { 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 6, 6, 8, 8, 10, 10, 12 }; - 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 }; + u8 bp; + static const u8 sBPPerRoundSolo[HALL_MAX_DISTINCT_ROUNDS + 1] = { 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 6, 6, 8, 8, 10, 10, 12 }; + static const u8 sBPPerRoundWiFi[HALL_MAX_DISTINCT_ROUNDS + 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->currentRound >= 18) { - v0 = v1[18]; + if (battleHall->challengeType == FRONTIER_CHALLENGE_SINGLE || battleHall->challengeType == FRONTIER_CHALLENGE_DOUBLE) { + if (battleHall->currentRound >= HALL_MAX_DISTINCT_ROUNDS) { + bp = sBPPerRoundSolo[HALL_MAX_DISTINCT_ROUNDS]; } else { - v0 = v1[param0->currentRound]; + bp = sBPPerRoundSolo[battleHall->currentRound]; } } else { - if (param0->currentRound >= 18) { - v0 = v2[18]; + if (battleHall->currentRound >= HALL_MAX_DISTINCT_ROUNDS) { + bp = sBPPerRoundWiFi[HALL_MAX_DISTINCT_ROUNDS]; } else { - v0 = v2[param0->currentRound]; + bp = sBPPerRoundWiFi[battleHall->currentRound]; } } - if (param0->challengeType == 0) { - if ((param0->currentStreak == 50) || (param0->currentStreak == 170)) { - v0 = 20; + if (battleHall->challengeType == FRONTIER_CHALLENGE_SINGLE) { + if (battleHall->currentStreak == HALL_STREAK_SILVER_BATTLE || battleHall->currentStreak == HALL_STREAK_GOLD_BATTLE) { + bp = 20; } - } else if (param0->challengeType == 2) { - v0 = 12; + } else if (battleHall->challengeType == FRONTIER_CHALLENGE_MULTI) { + bp = 12; } - return v0; + return bp; } static u16 BattleHall_LoadTypeRanks(SaveData *saveData, u8 challengeType, u8 type, u16 *type1Rank, u16 *type2Rank) @@ -422,28 +402,25 @@ static void BattleHall_SaveTypeRank(SaveData *saveData, u8 challengeType, u8 typ BattleFrontierSave_SetStatAutoHostIdx(SaveData_GetBattleFrontier(saveData), BattleFrontierStats_GetHallCurrentTypeRanksIndex(challengeType, type), currentRanks); } -void ov104_022356A0(BattleHall *param0) +void BattleHall_CapTypeRanks(BattleHall *battleHall) { - u8 v0; - int v1; + int type; - if (param0->challengeType != 2) { - for (v1 = 0; v1 < (18 - 1); v1++) { - v0 = BattleHall_GetRankOfType(v1, ¶m0->typeRanks[param0->challengeType][0]); + if (battleHall->challengeType != FRONTIER_CHALLENGE_MULTI) { + for (type = 0; type < NUM_POKEMON_TYPES - 1; type++) { + u8 rank = BattleHall_GetRankOfType(type, &battleHall->typeRanks[battleHall->challengeType][0]); - if (v0 < 10) { + if (rank < HALL_MAX_TYPE_RANK) { break; } } - if (v1 == (18 - 1)) { - for (v1 = 0; v1 < (18 - 1); v1++) { - BattleHall_SetRankOfType(v1, ¶m0->typeRanks[param0->challengeType][0], 10 - 1); + if (type == NUM_POKEMON_TYPES - 1) { + for (type = 0; type < NUM_POKEMON_TYPES - 1; type++) { + BattleHall_SetRankOfType(type, &battleHall->typeRanks[battleHall->challengeType][0], HALL_MAX_TYPE_RANK - 1); } } } - - return; } void BattleHall_CalcPlayerLevelSqrt(BattleHall *battleHall) @@ -452,64 +429,60 @@ void BattleHall_CalcPlayerLevelSqrt(BattleHall *battleHall) battleHall->playerLevelSqrt = BattleHall_GetLevelSquareRoot(level); } -static u16 ov104_02235704(BattleHall *param0) +static u16 BattleHall_CalcOpponentsLevel(BattleHall *battleHall) { - fx32 v0, v1; - int v2, v3; - int v4; - u8 v5; - float v6, v7; + fx32 baseLevel; + int type; - v5 = BattleHall_GetRankOfType(param0->selectedTypeIdx, ¶m0->typeRanks[param0->challengeType][0]); - v2 = BattleHall_GetHighestLevelInParty(param0); + u8 typeRank = BattleHall_GetRankOfType(battleHall->selectedTypeIdx, &battleHall->typeRanks[battleHall->challengeType][0]); + int playersLevel = BattleHall_GetHighestLevelInParty(battleHall); - if (param0->challengeType == 2) { - return v2; + if (battleHall->challengeType == FRONTIER_CHALLENGE_MULTI) { + return playersLevel; } - v0 = (FX32_CONST(v2) - (param0->playerLevelSqrt * 3)); - v6 = (FX_FX32_TO_F32(param0->playerLevelSqrt) * 5.0); + baseLevel = FX32_CONST(playersLevel) - battleHall->playerLevelSqrt * 3; + float rankFactor = FX_FX32_TO_F32(battleHall->playerLevelSqrt) * 5.0; - if ((v2 / v6) < 1.0) { - v6 = 1.0; - v6 = (float)(v5 + 1 - 1); + if (playersLevel / rankFactor < 1.0) { + rankFactor = typeRank + 1 - 1; } else { - v1 = FX32_CONST((v5 + 1 - 1) * v2); - v6 = (FX_FX32_TO_F32(v1) / v6); + fx32 product = FX32_CONST(typeRank * playersLevel); + rankFactor = FX_FX32_TO_F32(product) / rankFactor; } - v7 = 0.0; + float numBattledTypesFactor = 0.0; - for (v3 = 0; v3 < 18; v3++) { - if (v3 == param0->selectedTypeIdx) { - v7 += 1.0; + for (type = 0; type < NUM_POKEMON_TYPES; type++) { + if (type == battleHall->selectedTypeIdx) { + numBattledTypesFactor += 1.0; } else { - if (BattleHall_GetRankOfType(v3, ¶m0->typeRanks[param0->challengeType][0]) > 0) { - v7 += 1.0; + if (BattleHall_GetRankOfType(type, &battleHall->typeRanks[battleHall->challengeType][0]) > 0) { + numBattledTypesFactor += 1.0; } } } - if (v7 != 0.0) { - v7 -= 1.0; + if (numBattledTypesFactor != 0.0) { + numBattledTypesFactor -= 1.0; } - v7 *= 0.5; + numBattledTypesFactor *= 0.5; - v6 = (FX_FX32_TO_F32(v0) + v6 + v7); - v4 = (int)(v6); + float opponentsLevelFloat = FX_FX32_TO_F32(baseLevel) + rankFactor + numBattledTypesFactor; - if (v6 != (int)v6) { - v4++; + int opponentsLevel = (int)(opponentsLevelFloat); + if (opponentsLevelFloat != (int)opponentsLevelFloat) { + opponentsLevel++; } - if (v4 > v2) { - v4 = v2; + if (opponentsLevel > playersLevel) { + opponentsLevel = playersLevel; } - if (v4 > 100) { - v4 = 100; + if (opponentsLevel > MAX_POKEMON_LEVEL) { + opponentsLevel = MAX_POKEMON_LEVEL; } - return v4; + return opponentsLevel; } diff --git a/src/overlay104/battle_hall_helpers.c b/src/overlay104/battle_hall_helpers.c new file mode 100644 index 00000000000..b63600b5346 --- /dev/null +++ b/src/overlay104/battle_hall_helpers.c @@ -0,0 +1,1625 @@ +#include "overlay104/battle_hall_helpers.h" + +#include + +#include "constants/battle_frontier.h" +#include "generated/ai_flags.h" +#include "generated/frontier_trainers.h" +#include "generated/trainer_classes.h" + +#include "overlay104/battle_hall.h" +#include "overlay104/ov104_0222DCE0.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" +#include "heap.h" +#include "item_use_pokemon.h" +#include "math_util.h" +#include "party.h" +#include "pokemon.h" + +#define GROUP_1_START 1 +#define GROUP_2_START 155 +#define GROUP_3_START 271 +#define GROUP_4_START 376 + +typedef struct { + u16 min; + u16 max; +} BattleHallGroupRange; + +static u32 BattleHall_GetBattleType(u8 challengeType); +static void BattleHall_LoadOpponentMonData(FrontierPokemonDataDTO *monDto, u8 typeRank, u16 trainerID, u16 opponentIndices[], int partySize, int heapID, int narcID); +static u32 BattleHall_GetOpponentLevel(BattleHall *battleHall, u8 unused); +static u8 BattleHall_GetIVsOfOpponentAtRank(u8 typeRank); +static u16 BattleHall_GetAIMask(BattleHall *battleHall, u8 battleNum, u8 rank); +static u16 BattleHall_CheckTypeRank(u8 typeRank); +static BOOL BattleHall_SetMonsPersonality(BattleHall *battleHall, u8 index); + +static const u16 sHallTrainerClassesByRank[HALL_MAX_TYPE_RANK][8] = { + { + TRAINER_CLASS_YOUNGSTER, + TRAINER_CLASS_LASS, + TRAINER_CLASS_POKEFAN_MALE, + TRAINER_CLASS_POKEFAN_FEMALE, + TRAINER_CLASS_COLLECTOR, + TRAINER_CLASS_BEAUTY, + TRAINER_CLASS_POKE_KID, + TRAINER_CLASS_NINJA_BOY, + }, + { + TRAINER_CLASS_YOUNGSTER, + TRAINER_CLASS_LASS, + TRAINER_CLASS_WAITER, + TRAINER_CLASS_WAITRESS, + TRAINER_CLASS_JOGGER, + TRAINER_CLASS_PARASOL_LADY, + TRAINER_CLASS_POKE_KID, + TRAINER_CLASS_NINJA_BOY, + }, + { + TRAINER_CLASS_RICH_BOY, + TRAINER_CLASS_LADY, + TRAINER_CLASS_POKEFAN_MALE, + TRAINER_CLASS_POKEFAN_FEMALE, + TRAINER_CLASS_COLLECTOR, + TRAINER_CLASS_BEAUTY, + TRAINER_CLASS_CLOWN, + TRAINER_CLASS_IDOL, + }, + { + TRAINER_CLASS_RICH_BOY, + TRAINER_CLASS_LADY, + TRAINER_CLASS_WAITER, + TRAINER_CLASS_WAITRESS, + TRAINER_CLASS_JOGGER, + TRAINER_CLASS_PARASOL_LADY, + TRAINER_CLASS_CLOWN, + TRAINER_CLASS_IDOL, + }, + { + TRAINER_CLASS_CAMPER, + TRAINER_CLASS_PICNICKER, + TRAINER_CLASS_RANCHER, + TRAINER_CLASS_COWGIRL, + TRAINER_CLASS_GENTLEMAN, + TRAINER_CLASS_SOCIALITE, + TRAINER_CLASS_COLLECTOR, + TRAINER_CLASS_BEAUTY, + }, + { + TRAINER_CLASS_CAMPER, + TRAINER_CLASS_PICNICKER, + TRAINER_CLASS_BREEDER_MALE, + TRAINER_CLASS_BREEDER_FEMALE, + TRAINER_CLASS_GENTLEMAN, + TRAINER_CLASS_SOCIALITE, + TRAINER_CLASS_ROUGHNECK, + TRAINER_CLASS_GUITARIST, + }, + { + TRAINER_CLASS_SCHOOL_KID_MALE, + TRAINER_CLASS_SCHOOL_KID_FEMALE, + TRAINER_CLASS_RANCHER, + TRAINER_CLASS_COWGIRL, + TRAINER_CLASS_POKEFAN_MALE, + TRAINER_CLASS_POKEFAN_FEMALE, + TRAINER_CLASS_JOGGER, + TRAINER_CLASS_PARASOL_LADY, + }, + { + TRAINER_CLASS_SCHOOL_KID_MALE, + TRAINER_CLASS_SCHOOL_KID_FEMALE, + TRAINER_CLASS_BREEDER_MALE, + TRAINER_CLASS_BREEDER_FEMALE, + TRAINER_CLASS_POKEFAN_MALE, + TRAINER_CLASS_POKEFAN_FEMALE, + TRAINER_CLASS_ROUGHNECK, + TRAINER_CLASS_GUITARIST, + }, + { + TRAINER_CLASS_ACE_TRAINER_MALE, + TRAINER_CLASS_ACE_TRAINER_FEMALE, + TRAINER_CLASS_RANCHER, + TRAINER_CLASS_COWGIRL, + TRAINER_CLASS_RANGER_MALE, + TRAINER_CLASS_RANGER_FEMALE, + TRAINER_CLASS_PI, + TRAINER_CLASS_VETERAN, + }, + { + TRAINER_CLASS_ACE_TRAINER_MALE, + TRAINER_CLASS_ACE_TRAINER_FEMALE, + TRAINER_CLASS_BREEDER_MALE, + TRAINER_CLASS_BREEDER_FEMALE, + TRAINER_CLASS_RANGER_MALE, + TRAINER_CLASS_RANGER_FEMALE, + TRAINER_CLASS_PI, + TRAINER_CLASS_VETERAN, + } +}; + +static const u16 sHallTrainerClassesBySelectedType[NUM_POKEMON_TYPES][4] = { + { TRAINER_CLASS_POKEFAN_MALE, TRAINER_CLASS_POKEFAN_FEMALE, TRAINER_CLASS_YOUNGSTER, TRAINER_CLASS_LASS }, + { TRAINER_CLASS_VETERAN, TRAINER_CLASS_VETERAN, TRAINER_CLASS_POLICEMAN, TRAINER_CLASS_POLICEMAN }, + { TRAINER_CLASS_TUBER_MALE, TRAINER_CLASS_TUBER_FEMALE, TRAINER_CLASS_SAILOR, TRAINER_CLASS_FISHERMAN }, + { TRAINER_CLASS_POKE_KID, TRAINER_CLASS_POKE_KID, TRAINER_CLASS_WORKER, TRAINER_CLASS_WORKER }, + { TRAINER_CLASS_AROMA_LADY, TRAINER_CLASS_AROMA_LADY, TRAINER_CLASS_CAMPER, TRAINER_CLASS_PICNICKER }, + { TRAINER_CLASS_ACE_TRAINER_SNOW_MALE, TRAINER_CLASS_ACE_TRAINER_SNOW_MALE, TRAINER_CLASS_ACE_TRAINER_SNOW_FEMALE, TRAINER_CLASS_ACE_TRAINER_SNOW_FEMALE }, + { TRAINER_CLASS_BLACK_BELT, TRAINER_CLASS_BLACK_BELT, TRAINER_CLASS_BATTLE_GIRL, TRAINER_CLASS_BATTLE_GIRL }, + { TRAINER_CLASS_NINJA_BOY, TRAINER_CLASS_NINJA_BOY, TRAINER_CLASS_SCIENTIST, TRAINER_CLASS_SCIENTIST }, + { TRAINER_CLASS_HIKER, TRAINER_CLASS_HIKER, TRAINER_CLASS_RUIN_MANIAC, TRAINER_CLASS_RUIN_MANIAC }, + { TRAINER_CLASS_BIRD_KEEPER, TRAINER_CLASS_BIRD_KEEPER, TRAINER_CLASS_BIRD_KEEPER, TRAINER_CLASS_BIRD_KEEPER }, + { TRAINER_CLASS_PSYCHIC_MALE, TRAINER_CLASS_PSYCHIC_MALE, TRAINER_CLASS_PSYCHIC_FEMALE, TRAINER_CLASS_PSYCHIC_FEMALE }, + { TRAINER_CLASS_BUG_CATCHER, TRAINER_CLASS_BUG_CATCHER, TRAINER_CLASS_BUG_CATCHER, TRAINER_CLASS_BUG_CATCHER }, + { TRAINER_CLASS_HIKER, TRAINER_CLASS_HIKER, TRAINER_CLASS_RUIN_MANIAC, TRAINER_CLASS_RUIN_MANIAC }, + { TRAINER_CLASS_PSYCHIC_MALE, TRAINER_CLASS_PSYCHIC_MALE, TRAINER_CLASS_PSYCHIC_FEMALE, TRAINER_CLASS_PSYCHIC_FEMALE }, + { TRAINER_CLASS_DRAGON_TAMER, TRAINER_CLASS_DRAGON_TAMER, TRAINER_CLASS_DRAGON_TAMER, TRAINER_CLASS_DRAGON_TAMER }, + { TRAINER_CLASS_ROUGHNECK, TRAINER_CLASS_ROUGHNECK, TRAINER_CLASS_GUITARIST, TRAINER_CLASS_GUITARIST }, + { TRAINER_CLASS_REPORTER, TRAINER_CLASS_CAMERAMAN, TRAINER_CLASS_CYCLIST_MALE, TRAINER_CLASS_CYCLIST_FEMALE }, + { TRAINER_CLASS_IDOL, TRAINER_CLASS_CLOWN, TRAINER_CLASS_WAITER, TRAINER_CLASS_WAITRESS } +}; + +#include "res/trainers/frontier/frontier_trainer_classes.h" + +static const u16 sBattleHallPotentialOpponentTypes[][2] = { + { TYPE_GRASS, TYPE_POISON }, + { TYPE_FIRE, TYPE_FIRE }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_BUG, TYPE_BUG }, + { TYPE_BUG, TYPE_BUG }, + { TYPE_BUG, TYPE_POISON }, + { TYPE_BUG, TYPE_POISON }, + { TYPE_NORMAL, TYPE_FLYING }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_NORMAL, TYPE_FLYING }, + { TYPE_POISON, TYPE_POISON }, + { TYPE_ELECTRIC, TYPE_ELECTRIC }, + { TYPE_GROUND, TYPE_GROUND }, + { TYPE_POISON, TYPE_POISON }, + { TYPE_POISON, TYPE_POISON }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_FIRE, TYPE_FIRE }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_POISON, TYPE_FLYING }, + { TYPE_GRASS, TYPE_POISON }, + { TYPE_BUG, TYPE_GRASS }, + { TYPE_BUG, TYPE_POISON }, + { TYPE_GROUND, TYPE_GROUND }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_FIGHTING, TYPE_FIGHTING }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_PSYCHIC, TYPE_PSYCHIC }, + { TYPE_FIGHTING, TYPE_FIGHTING }, + { TYPE_GRASS, TYPE_POISON }, + { TYPE_WATER, TYPE_POISON }, + { TYPE_ROCK, TYPE_GROUND }, + { TYPE_WATER, TYPE_PSYCHIC }, + { TYPE_ELECTRIC, TYPE_STEEL }, + { TYPE_NORMAL, TYPE_FLYING }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_POISON, TYPE_POISON }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_GHOST, TYPE_POISON }, + { TYPE_PSYCHIC, TYPE_PSYCHIC }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_ELECTRIC, TYPE_ELECTRIC }, + { TYPE_GRASS, TYPE_PSYCHIC }, + { TYPE_GROUND, TYPE_GROUND }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_DRAGON, TYPE_DRAGON }, + { TYPE_GRASS, TYPE_GRASS }, + { TYPE_FIRE, TYPE_FIRE }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_NORMAL, TYPE_FLYING }, + { TYPE_BUG, TYPE_FLYING }, + { TYPE_BUG, TYPE_POISON }, + { TYPE_WATER, TYPE_ELECTRIC }, + { TYPE_ELECTRIC, TYPE_ELECTRIC }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_PSYCHIC, TYPE_FLYING }, + { TYPE_ELECTRIC, TYPE_ELECTRIC }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_GRASS, TYPE_FLYING }, + { TYPE_GRASS, TYPE_GRASS }, + { TYPE_WATER, TYPE_GROUND }, + { TYPE_PSYCHIC, TYPE_PSYCHIC }, + { TYPE_BUG, TYPE_BUG }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_FIRE, TYPE_FIRE }, + { TYPE_ICE, TYPE_GROUND }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_ICE, TYPE_FLYING }, + { TYPE_DARK, TYPE_FIRE }, + { TYPE_GROUND, TYPE_GROUND }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_FIGHTING, TYPE_FIGHTING }, + { TYPE_ICE, TYPE_PSYCHIC }, + { TYPE_ROCK, TYPE_GROUND }, + { TYPE_GRASS, TYPE_GRASS }, + { TYPE_FIRE, TYPE_FIRE }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_DARK, TYPE_DARK }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_BUG, TYPE_BUG }, + { TYPE_BUG, TYPE_BUG }, + { TYPE_BUG, TYPE_BUG }, + { TYPE_WATER, TYPE_GRASS }, + { TYPE_GRASS, TYPE_GRASS }, + { TYPE_NORMAL, TYPE_FLYING }, + { TYPE_WATER, TYPE_FLYING }, + { TYPE_PSYCHIC, TYPE_PSYCHIC }, + { TYPE_PSYCHIC, TYPE_PSYCHIC }, + { TYPE_BUG, TYPE_WATER }, + { TYPE_GRASS, TYPE_GRASS }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_BUG, TYPE_GROUND }, + { TYPE_BUG, TYPE_GHOST }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_FIGHTING, TYPE_FIGHTING }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_STEEL, TYPE_ROCK }, + { TYPE_FIGHTING, TYPE_PSYCHIC }, + { TYPE_ELECTRIC, TYPE_ELECTRIC }, + { TYPE_POISON, TYPE_POISON }, + { TYPE_WATER, TYPE_DARK }, + { TYPE_FIRE, TYPE_GROUND }, + { TYPE_PSYCHIC, TYPE_PSYCHIC }, + { TYPE_GROUND, TYPE_GROUND }, + { TYPE_GRASS, TYPE_GRASS }, + { TYPE_NORMAL, TYPE_FLYING }, + { TYPE_WATER, TYPE_GROUND }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_GROUND, TYPE_PSYCHIC }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_GHOST, TYPE_GHOST }, + { TYPE_GHOST, TYPE_GHOST }, + { TYPE_PSYCHIC, TYPE_PSYCHIC }, + { TYPE_ICE, TYPE_ICE }, + { TYPE_ICE, TYPE_WATER }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_DRAGON, TYPE_DRAGON }, + { TYPE_STEEL, TYPE_PSYCHIC }, + { TYPE_GRASS, TYPE_GRASS }, + { TYPE_FIRE, TYPE_FIRE }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_NORMAL, TYPE_FLYING }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_BUG, TYPE_BUG }, + { TYPE_ELECTRIC, TYPE_ELECTRIC }, + { TYPE_GRASS, TYPE_POISON }, + { TYPE_BUG, TYPE_BUG }, + { TYPE_BUG, TYPE_FLYING }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_GRASS, TYPE_GRASS }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_PSYCHIC, TYPE_PSYCHIC }, + { TYPE_POISON, TYPE_DARK }, + { TYPE_STEEL, TYPE_PSYCHIC }, + { TYPE_ROCK, TYPE_ROCK }, + { TYPE_PSYCHIC, TYPE_PSYCHIC }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_DRAGON, TYPE_GROUND }, + { TYPE_FIGHTING, TYPE_FIGHTING }, + { TYPE_GROUND, TYPE_GROUND }, + { TYPE_POISON, TYPE_BUG }, + { TYPE_POISON, TYPE_FIGHTING }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_GRASS, TYPE_ICE }, + { TYPE_GRASS, TYPE_POISON }, + { TYPE_FIRE, TYPE_FIRE }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_BUG, TYPE_FLYING }, + { TYPE_BUG, TYPE_POISON }, + { TYPE_NORMAL, TYPE_FLYING }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_POISON, TYPE_POISON }, + { TYPE_POISON, TYPE_POISON }, + { TYPE_POISON, TYPE_POISON }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_GRASS, TYPE_POISON }, + { TYPE_BUG, TYPE_GRASS }, + { TYPE_GROUND, TYPE_GROUND }, + { TYPE_FIRE, TYPE_FIRE }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_PSYCHIC, TYPE_PSYCHIC }, + { TYPE_FIGHTING, TYPE_FIGHTING }, + { TYPE_GRASS, TYPE_POISON }, + { TYPE_ROCK, TYPE_GROUND }, + { TYPE_FIRE, TYPE_FIRE }, + { TYPE_NORMAL, TYPE_FLYING }, + { TYPE_GHOST, TYPE_POISON }, + { TYPE_ROCK, TYPE_GROUND }, + { TYPE_GROUND, TYPE_GROUND }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_POISON, TYPE_POISON }, + { TYPE_GROUND, TYPE_ROCK }, + { TYPE_GRASS, TYPE_GRASS }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_ROCK, TYPE_WATER }, + { TYPE_ROCK, TYPE_WATER }, + { TYPE_DRAGON, TYPE_DRAGON }, + { TYPE_GRASS, TYPE_GRASS }, + { TYPE_FIRE, TYPE_FIRE }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_BUG, TYPE_FLYING }, + { TYPE_BUG, TYPE_POISON }, + { TYPE_NORMAL, TYPE_FLYING }, + { TYPE_ELECTRIC, TYPE_ELECTRIC }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_ROCK, TYPE_ROCK }, + { TYPE_GRASS, TYPE_FLYING }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_GRASS, TYPE_GRASS }, + { TYPE_BUG, TYPE_FLYING }, + { TYPE_WATER, TYPE_GROUND }, + { TYPE_DARK, TYPE_FLYING }, + { TYPE_GHOST, TYPE_GHOST }, + { TYPE_PSYCHIC, TYPE_PSYCHIC }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_GROUND, TYPE_FLYING }, + { TYPE_WATER, TYPE_POISON }, + { TYPE_DARK, TYPE_ICE }, + { TYPE_FIRE, TYPE_ROCK }, + { TYPE_WATER, TYPE_ROCK }, + { TYPE_ELECTRIC, TYPE_ELECTRIC }, + { TYPE_FIRE, TYPE_FIRE }, + { TYPE_ROCK, TYPE_GROUND }, + { TYPE_GRASS, TYPE_GRASS }, + { TYPE_FIRE, TYPE_FIGHTING }, + { TYPE_WATER, TYPE_GROUND }, + { TYPE_DARK, TYPE_DARK }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_BUG, TYPE_FLYING }, + { TYPE_BUG, TYPE_POISON }, + { TYPE_WATER, TYPE_GRASS }, + { TYPE_GRASS, TYPE_DARK }, + { TYPE_NORMAL, TYPE_FLYING }, + { TYPE_WATER, TYPE_FLYING }, + { TYPE_BUG, TYPE_FLYING }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_ROCK, TYPE_ROCK }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_DARK, TYPE_GHOST }, + { TYPE_STEEL, TYPE_STEEL }, + { TYPE_STEEL, TYPE_ROCK }, + { TYPE_FIGHTING, TYPE_PSYCHIC }, + { TYPE_ELECTRIC, TYPE_ELECTRIC }, + { TYPE_ELECTRIC, TYPE_ELECTRIC }, + { TYPE_BUG, TYPE_BUG }, + { TYPE_BUG, TYPE_BUG }, + { TYPE_GRASS, TYPE_POISON }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_GROUND, TYPE_DRAGON }, + { TYPE_ROCK, TYPE_GRASS }, + { TYPE_ROCK, TYPE_BUG }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_PSYCHIC, TYPE_PSYCHIC }, + { TYPE_ICE, TYPE_WATER }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_DRAGON, TYPE_DRAGON }, + { TYPE_STEEL, TYPE_PSYCHIC }, + { TYPE_GRASS, TYPE_GRASS }, + { TYPE_FIRE, TYPE_FIGHTING }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_NORMAL, TYPE_FLYING }, + { TYPE_NORMAL, TYPE_WATER }, + { TYPE_BUG, TYPE_BUG }, + { TYPE_ELECTRIC, TYPE_ELECTRIC }, + { TYPE_ROCK, TYPE_ROCK }, + { TYPE_ROCK, TYPE_STEEL }, + { TYPE_BUG, TYPE_GRASS }, + { TYPE_BUG, TYPE_FLYING }, + { TYPE_ELECTRIC, TYPE_ELECTRIC }, + { TYPE_GHOST, TYPE_FLYING }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_NORMAL, TYPE_FLYING }, + { TYPE_DRAGON, TYPE_GROUND }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_WATER, TYPE_FLYING }, + { TYPE_BUG, TYPE_GROUND }, + { TYPE_BUG, TYPE_STEEL }, + { TYPE_ELECTRIC, TYPE_ELECTRIC }, + { TYPE_GROUND, TYPE_GROUND }, + { TYPE_POISON, TYPE_GROUND }, + { TYPE_POISON, TYPE_GROUND }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_POISON, TYPE_FLYING }, + { TYPE_GRASS, TYPE_POISON }, + { TYPE_BUG, TYPE_POISON }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_FIGHTING, TYPE_FIGHTING }, + { TYPE_PSYCHIC, TYPE_PSYCHIC }, + { TYPE_GRASS, TYPE_POISON }, + { TYPE_ROCK, TYPE_GROUND }, + { TYPE_WATER, TYPE_PSYCHIC }, + { TYPE_ELECTRIC, TYPE_STEEL }, + { TYPE_NORMAL, TYPE_FLYING }, + { TYPE_WATER, TYPE_ICE }, + { TYPE_PSYCHIC, TYPE_PSYCHIC }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_ELECTRIC, TYPE_ELECTRIC }, + { TYPE_FIGHTING, TYPE_FIGHTING }, + { TYPE_FIGHTING, TYPE_FIGHTING }, + { TYPE_POISON, TYPE_POISON }, + { TYPE_GROUND, TYPE_ROCK }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_PSYCHIC, TYPE_PSYCHIC }, + { TYPE_ICE, TYPE_PSYCHIC }, + { TYPE_ELECTRIC, TYPE_ELECTRIC }, + { TYPE_FIRE, TYPE_FIRE }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_ROCK, TYPE_WATER }, + { TYPE_ROCK, TYPE_WATER }, + { TYPE_NORMAL, TYPE_FLYING }, + { TYPE_WATER, TYPE_ELECTRIC }, + { TYPE_PSYCHIC, TYPE_FLYING }, + { TYPE_GRASS, TYPE_GRASS }, + { TYPE_GRASS, TYPE_FLYING }, + { TYPE_WATER, TYPE_PSYCHIC }, + { TYPE_NORMAL, TYPE_PSYCHIC }, + { TYPE_BUG, TYPE_STEEL }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_ICE, TYPE_GROUND }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_WATER, TYPE_FLYING }, + { TYPE_STEEL, TYPE_FLYING }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_FIGHTING, TYPE_FIGHTING }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_WATER, TYPE_GRASS }, + { TYPE_GRASS, TYPE_DARK }, + { TYPE_GRASS, TYPE_FIGHTING }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_BUG, TYPE_FLYING }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_FIGHTING, TYPE_FIGHTING }, + { TYPE_ELECTRIC, TYPE_ELECTRIC }, + { TYPE_POISON, TYPE_POISON }, + { TYPE_WATER, TYPE_DARK }, + { TYPE_FIRE, TYPE_GROUND }, + { TYPE_FIRE, TYPE_FIRE }, + { TYPE_PSYCHIC, TYPE_PSYCHIC }, + { TYPE_GRASS, TYPE_DARK }, + { TYPE_DRAGON, TYPE_FLYING }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_POISON, TYPE_POISON }, + { TYPE_ROCK, TYPE_PSYCHIC }, + { TYPE_ROCK, TYPE_PSYCHIC }, + { TYPE_WATER, TYPE_GROUND }, + { TYPE_WATER, TYPE_DARK }, + { TYPE_ROCK, TYPE_GRASS }, + { TYPE_ROCK, TYPE_BUG }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_GHOST, TYPE_GHOST }, + { TYPE_GHOST, TYPE_GHOST }, + { TYPE_GRASS, TYPE_FLYING }, + { TYPE_DARK, TYPE_DARK }, + { TYPE_ICE, TYPE_ICE }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_WATER, TYPE_ROCK }, + { TYPE_NORMAL, TYPE_FLYING }, + { TYPE_ROCK, TYPE_ROCK }, + { TYPE_ROCK, TYPE_STEEL }, + { TYPE_BUG, TYPE_FLYING }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_GRASS, TYPE_GRASS }, + { TYPE_WATER, TYPE_GROUND }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_GHOST, TYPE_FLYING }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_GHOST, TYPE_GHOST }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_POISON, TYPE_DARK }, + { TYPE_GHOST, TYPE_DARK }, + { TYPE_POISON, TYPE_FIGHTING }, + { TYPE_GRASS, TYPE_GRASS }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_GRASS, TYPE_ICE }, + { TYPE_ICE, TYPE_GHOST }, + { TYPE_ELECTRIC, TYPE_GHOST }, + { TYPE_NORMAL, TYPE_FLYING }, + { TYPE_NORMAL, TYPE_FLYING }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_FIRE, TYPE_FIRE }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_FIRE, TYPE_FIRE }, + { TYPE_WATER, TYPE_FIGHTING }, + { TYPE_FIGHTING, TYPE_FIGHTING }, + { TYPE_WATER, TYPE_POISON }, + { TYPE_FIRE, TYPE_FIRE }, + { TYPE_POISON, TYPE_POISON }, + { TYPE_WATER, TYPE_ICE }, + { TYPE_GHOST, TYPE_POISON }, + { TYPE_GRASS, TYPE_PSYCHIC }, + { TYPE_WATER, TYPE_PSYCHIC }, + { TYPE_BUG, TYPE_FLYING }, + { TYPE_BUG, TYPE_BUG }, + { TYPE_WATER, TYPE_FLYING }, + { TYPE_WATER, TYPE_ICE }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_ELECTRIC, TYPE_ELECTRIC }, + { TYPE_FIRE, TYPE_FIRE }, + { TYPE_ROCK, TYPE_FLYING }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_ICE, TYPE_FLYING }, + { TYPE_ELECTRIC, TYPE_FLYING }, + { TYPE_FIRE, TYPE_FLYING }, + { TYPE_DRAGON, TYPE_FLYING }, + { TYPE_GRASS, TYPE_GRASS }, + { TYPE_FIRE, TYPE_FIRE }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_POISON, TYPE_FLYING }, + { TYPE_ELECTRIC, TYPE_ELECTRIC }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_PSYCHIC, TYPE_PSYCHIC }, + { TYPE_DARK, TYPE_DARK }, + { TYPE_STEEL, TYPE_GROUND }, + { TYPE_BUG, TYPE_STEEL }, + { TYPE_BUG, TYPE_ROCK }, + { TYPE_BUG, TYPE_FIGHTING }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_DARK, TYPE_FIRE }, + { TYPE_WATER, TYPE_DRAGON }, + { TYPE_GROUND, TYPE_GROUND }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_ELECTRIC, TYPE_ELECTRIC }, + { TYPE_FIRE, TYPE_FIRE }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_ROCK, TYPE_DARK }, + { TYPE_GRASS, TYPE_GRASS }, + { TYPE_FIRE, TYPE_FIGHTING }, + { TYPE_WATER, TYPE_GROUND }, + { TYPE_PSYCHIC, TYPE_PSYCHIC }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_STEEL, TYPE_ROCK }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_GROUND, TYPE_DRAGON }, + { TYPE_GROUND, TYPE_PSYCHIC }, + { TYPE_WATER, TYPE_WATER }, + { TYPE_ICE, TYPE_WATER }, + { TYPE_PSYCHIC, TYPE_PSYCHIC }, + { TYPE_DRAGON, TYPE_FLYING }, + { TYPE_STEEL, TYPE_PSYCHIC }, + { TYPE_ROCK, TYPE_ROCK }, + { TYPE_ICE, TYPE_ICE }, + { TYPE_STEEL, TYPE_STEEL }, + { TYPE_DRAGON, TYPE_PSYCHIC }, + { TYPE_DRAGON, TYPE_PSYCHIC }, + { TYPE_GRASS, TYPE_GROUND }, + { TYPE_FIRE, TYPE_FIGHTING }, + { TYPE_WATER, TYPE_STEEL }, + { TYPE_ELECTRIC, TYPE_ELECTRIC }, + { TYPE_GRASS, TYPE_POISON }, + { TYPE_DARK, TYPE_FLYING }, + { TYPE_STEEL, TYPE_PSYCHIC }, + { TYPE_DRAGON, TYPE_GROUND }, + { TYPE_FIGHTING, TYPE_STEEL }, + { TYPE_GROUND, TYPE_GROUND }, + { TYPE_POISON, TYPE_DARK }, + { TYPE_DARK, TYPE_ICE }, + { TYPE_ELECTRIC, TYPE_STEEL }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_GROUND, TYPE_ROCK }, + { TYPE_GRASS, TYPE_GRASS }, + { TYPE_ELECTRIC, TYPE_ELECTRIC }, + { TYPE_FIRE, TYPE_FIRE }, + { TYPE_NORMAL, TYPE_FLYING }, + { TYPE_BUG, TYPE_FLYING }, + { TYPE_GRASS, TYPE_GRASS }, + { TYPE_ICE, TYPE_ICE }, + { TYPE_GROUND, TYPE_FLYING }, + { TYPE_ICE, TYPE_GROUND }, + { TYPE_NORMAL, TYPE_NORMAL }, + { TYPE_PSYCHIC, TYPE_FIGHTING }, + { TYPE_ROCK, TYPE_STEEL }, + { TYPE_GHOST, TYPE_GHOST }, + { TYPE_PSYCHIC, TYPE_PSYCHIC }, + { TYPE_PSYCHIC, TYPE_PSYCHIC }, + { TYPE_PSYCHIC, TYPE_PSYCHIC }, + { TYPE_FIRE, TYPE_STEEL }, + { TYPE_GRASS, TYPE_POISON }, + { TYPE_FIRE, TYPE_FLYING }, + { TYPE_NORMAL, TYPE_NORMAL } +}; + +// TODO unpack pl_bsdpm.narc and generate this list from it +static const u16 sBattleHallPotentialOpponents[] = { + SPECIES_BULBASAUR, + SPECIES_CHARMANDER, + SPECIES_SQUIRTLE, + SPECIES_CATERPIE, + SPECIES_METAPOD, + SPECIES_WEEDLE, + SPECIES_KAKUNA, + SPECIES_PIDGEY, + SPECIES_RATTATA, + SPECIES_SPEAROW, + SPECIES_EKANS, + SPECIES_PIKACHU, + SPECIES_SANDSHREW, + SPECIES_NIDORAN_F, + SPECIES_NIDORAN_M, + SPECIES_CLEFAIRY, + SPECIES_VULPIX, + SPECIES_JIGGLYPUFF, + SPECIES_ZUBAT, + SPECIES_ODDISH, + SPECIES_PARAS, + SPECIES_VENONAT, + SPECIES_DIGLETT, + SPECIES_MEOWTH, + SPECIES_PSYDUCK, + SPECIES_MANKEY, + SPECIES_POLIWAG, + SPECIES_ABRA, + SPECIES_MACHOP, + SPECIES_BELLSPROUT, + SPECIES_TENTACOOL, + SPECIES_GEODUDE, + SPECIES_SLOWPOKE, + SPECIES_MAGNEMITE, + SPECIES_DODUO, + SPECIES_SEEL, + SPECIES_GRIMER, + SPECIES_SHELLDER, + SPECIES_GASTLY, + SPECIES_DROWZEE, + SPECIES_KRABBY, + SPECIES_VOLTORB, + SPECIES_EXEGGCUTE, + SPECIES_CUBONE, + SPECIES_HORSEA, + SPECIES_GOLDEEN, + SPECIES_MAGIKARP, + SPECIES_DITTO, + SPECIES_EEVEE, + SPECIES_DRATINI, + SPECIES_CHIKORITA, + SPECIES_CYNDAQUIL, + SPECIES_TOTODILE, + SPECIES_SENTRET, + SPECIES_HOOTHOOT, + SPECIES_LEDYBA, + SPECIES_SPINARAK, + SPECIES_CHINCHOU, + SPECIES_PICHU, + SPECIES_CLEFFA, + SPECIES_IGGLYBUFF, + SPECIES_TOGEPI, + SPECIES_NATU, + SPECIES_MAREEP, + SPECIES_MARILL, + SPECIES_HOPPIP, + SPECIES_SUNKERN, + SPECIES_WOOPER, + SPECIES_UNOWN, + SPECIES_PINECO, + SPECIES_SNUBBULL, + SPECIES_TEDDIURSA, + SPECIES_SLUGMA, + SPECIES_SWINUB, + SPECIES_REMORAID, + SPECIES_DELIBIRD, + SPECIES_HOUNDOUR, + SPECIES_PHANPY, + SPECIES_SMEARGLE, + SPECIES_TYROGUE, + SPECIES_SMOOCHUM, + SPECIES_LARVITAR, + SPECIES_TREECKO, + SPECIES_TORCHIC, + SPECIES_MUDKIP, + SPECIES_POOCHYENA, + SPECIES_ZIGZAGOON, + SPECIES_WURMPLE, + SPECIES_SILCOON, + SPECIES_CASCOON, + SPECIES_LOTAD, + SPECIES_SEEDOT, + SPECIES_TAILLOW, + SPECIES_WINGULL, + SPECIES_RALTS, + SPECIES_KIRLIA, + SPECIES_SURSKIT, + SPECIES_SHROOMISH, + SPECIES_SLAKOTH, + SPECIES_NINCADA, + SPECIES_SHEDINJA, + SPECIES_WHISMUR, + SPECIES_MAKUHITA, + SPECIES_AZURILL, + SPECIES_SKITTY, + SPECIES_ARON, + SPECIES_MEDITITE, + SPECIES_ELECTRIKE, + SPECIES_GULPIN, + SPECIES_CARVANHA, + SPECIES_NUMEL, + SPECIES_SPOINK, + SPECIES_TRAPINCH, + SPECIES_CACNEA, + SPECIES_SWABLU, + SPECIES_BARBOACH, + SPECIES_CORPHISH, + SPECIES_BALTOY, + SPECIES_FEEBAS, + SPECIES_SHUPPET, + SPECIES_DUSKULL, + SPECIES_WYNAUT, + SPECIES_SNORUNT, + SPECIES_SPHEAL, + SPECIES_LUVDISC, + SPECIES_BAGON, + SPECIES_BELDUM, + SPECIES_TURTWIG, + SPECIES_CHIMCHAR, + SPECIES_PIPLUP, + SPECIES_STARLY, + SPECIES_BIDOOF, + SPECIES_KRICKETOT, + SPECIES_SHINX, + SPECIES_BUDEW, + SPECIES_BURMY, + SPECIES_COMBEE, + SPECIES_BUIZEL, + SPECIES_CHERUBI, + SPECIES_SHELLOS, + SPECIES_GLAMEOW, + SPECIES_CHINGLING, + SPECIES_STUNKY, + SPECIES_BRONZOR, + SPECIES_BONSLY, + SPECIES_MIME_JR, + SPECIES_HAPPINY, + SPECIES_GIBLE, + SPECIES_RIOLU, + SPECIES_HIPPOPOTAS, + SPECIES_SKORUPI, + SPECIES_CROAGUNK, + SPECIES_FINNEON, + SPECIES_SNOVER, + SPECIES_IVYSAUR, + SPECIES_CHARMELEON, + SPECIES_WARTORTLE, + SPECIES_BUTTERFREE, + SPECIES_BEEDRILL, + SPECIES_PIDGEOTTO, + SPECIES_RATICATE, + SPECIES_ARBOK, + SPECIES_NIDORINA, + SPECIES_NIDORINO, + SPECIES_WIGGLYTUFF, + SPECIES_GLOOM, + SPECIES_PARASECT, + SPECIES_DUGTRIO, + SPECIES_GROWLITHE, + SPECIES_POLIWHIRL, + SPECIES_KADABRA, + SPECIES_MACHOKE, + SPECIES_WEEPINBELL, + SPECIES_GRAVELER, + SPECIES_PONYTA, + SPECIES_FARFETCHD, + SPECIES_HAUNTER, + SPECIES_ONIX, + SPECIES_MAROWAK, + SPECIES_LICKITUNG, + SPECIES_KOFFING, + SPECIES_RHYHORN, + SPECIES_TANGELA, + SPECIES_STARYU, + SPECIES_PORYGON, + SPECIES_OMANYTE, + SPECIES_KABUTO, + SPECIES_DRAGONAIR, + SPECIES_BAYLEEF, + SPECIES_QUILAVA, + SPECIES_CROCONAW, + SPECIES_FURRET, + SPECIES_LEDIAN, + SPECIES_ARIADOS, + SPECIES_TOGETIC, + SPECIES_FLAAFFY, + SPECIES_AZUMARILL, + SPECIES_SUDOWOODO, + SPECIES_SKIPLOOM, + SPECIES_AIPOM, + SPECIES_SUNFLORA, + SPECIES_YANMA, + SPECIES_QUAGSIRE, + SPECIES_MURKROW, + SPECIES_MISDREAVUS, + SPECIES_WOBBUFFET, + SPECIES_DUNSPARCE, + SPECIES_GLIGAR, + SPECIES_QWILFISH, + SPECIES_SNEASEL, + SPECIES_MAGCARGO, + SPECIES_CORSOLA, + SPECIES_ELEKID, + SPECIES_MAGBY, + SPECIES_PUPITAR, + SPECIES_GROVYLE, + SPECIES_COMBUSKEN, + SPECIES_MARSHTOMP, + SPECIES_MIGHTYENA, + SPECIES_LINOONE, + SPECIES_BEAUTIFLY, + SPECIES_DUSTOX, + SPECIES_LOMBRE, + SPECIES_NUZLEAF, + SPECIES_SWELLOW, + SPECIES_PELIPPER, + SPECIES_MASQUERAIN, + SPECIES_LOUDRED, + SPECIES_NOSEPASS, + SPECIES_DELCATTY, + SPECIES_SABLEYE, + SPECIES_MAWILE, + SPECIES_LAIRON, + SPECIES_MEDICHAM, + SPECIES_PLUSLE, + SPECIES_MINUN, + SPECIES_VOLBEAT, + SPECIES_ILLUMISE, + SPECIES_ROSELIA, + SPECIES_WAILMER, + SPECIES_SPINDA, + SPECIES_VIBRAVA, + SPECIES_LILEEP, + SPECIES_ANORITH, + SPECIES_CASTFORM, + SPECIES_CHIMECHO, + SPECIES_SEALEO, + SPECIES_CLAMPERL, + SPECIES_SHELGON, + SPECIES_METANG, + SPECIES_GROTLE, + SPECIES_MONFERNO, + SPECIES_PRINPLUP, + SPECIES_STARAVIA, + SPECIES_BIBAREL, + SPECIES_KRICKETUNE, + SPECIES_LUXIO, + SPECIES_CRANIDOS, + SPECIES_SHIELDON, + SPECIES_WORMADAM, + SPECIES_MOTHIM, + SPECIES_PACHIRISU, + SPECIES_DRIFLOON, + SPECIES_BUNEARY, + SPECIES_CHATOT, + SPECIES_GABITE, + SPECIES_MUNCHLAX, + SPECIES_MANTYKE, + SPECIES_WORMADAM, + SPECIES_WORMADAM, + SPECIES_RAICHU, + SPECIES_SANDSLASH, + SPECIES_NIDOQUEEN, + SPECIES_NIDOKING, + SPECIES_CLEFABLE, + SPECIES_GOLBAT, + SPECIES_VILEPLUME, + SPECIES_VENOMOTH, + SPECIES_PERSIAN, + SPECIES_PRIMEAPE, + SPECIES_ALAKAZAM, + SPECIES_VICTREEBEL, + SPECIES_GOLEM, + SPECIES_SLOWBRO, + SPECIES_MAGNETON, + SPECIES_DODRIO, + SPECIES_DEWGONG, + SPECIES_HYPNO, + SPECIES_KINGLER, + SPECIES_ELECTRODE, + SPECIES_HITMONLEE, + SPECIES_HITMONCHAN, + SPECIES_WEEZING, + SPECIES_RHYDON, + SPECIES_CHANSEY, + SPECIES_KANGASKHAN, + SPECIES_SEADRA, + SPECIES_SEAKING, + SPECIES_MR_MIME, + SPECIES_JYNX, + SPECIES_ELECTABUZZ, + SPECIES_MAGMAR, + SPECIES_TAUROS, + SPECIES_OMASTAR, + SPECIES_KABUTOPS, + SPECIES_NOCTOWL, + SPECIES_LANTURN, + SPECIES_XATU, + SPECIES_BELLOSSOM, + SPECIES_JUMPLUFF, + SPECIES_SLOWKING, + SPECIES_GIRAFARIG, + SPECIES_FORRETRESS, + SPECIES_GRANBULL, + SPECIES_PILOSWINE, + SPECIES_OCTILLERY, + SPECIES_MANTINE, + SPECIES_SKARMORY, + SPECIES_STANTLER, + SPECIES_HITMONTOP, + SPECIES_MILTANK, + SPECIES_LUDICOLO, + SPECIES_SHIFTRY, + SPECIES_BRELOOM, + SPECIES_VIGOROTH, + SPECIES_NINJASK, + SPECIES_EXPLOUD, + SPECIES_HARIYAMA, + SPECIES_MANECTRIC, + SPECIES_SWALOT, + SPECIES_SHARPEDO, + SPECIES_CAMERUPT, + SPECIES_TORKOAL, + SPECIES_GRUMPIG, + SPECIES_CACTURNE, + SPECIES_ALTARIA, + SPECIES_ZANGOOSE, + SPECIES_SEVIPER, + SPECIES_LUNATONE, + SPECIES_SOLROCK, + SPECIES_WHISCASH, + SPECIES_CRAWDAUNT, + SPECIES_CRADILY, + SPECIES_ARMALDO, + SPECIES_KECLEON, + SPECIES_BANETTE, + SPECIES_DUSCLOPS, + SPECIES_TROPIUS, + SPECIES_ABSOL, + SPECIES_GLALIE, + SPECIES_HUNTAIL, + SPECIES_GOREBYSS, + SPECIES_RELICANTH, + SPECIES_STARAPTOR, + SPECIES_RAMPARDOS, + SPECIES_BASTIODON, + SPECIES_VESPIQUEN, + SPECIES_FLOATZEL, + SPECIES_CHERRIM, + SPECIES_GASTRODON, + SPECIES_AMBIPOM, + SPECIES_DRIFBLIM, + SPECIES_LOPUNNY, + SPECIES_MISMAGIUS, + SPECIES_PURUGLY, + SPECIES_SKUNTANK, + SPECIES_SPIRITOMB, + SPECIES_TOXICROAK, + SPECIES_CARNIVINE, + SPECIES_LUMINEON, + SPECIES_ABOMASNOW, + SPECIES_FROSLASS, + SPECIES_ROTOM, + SPECIES_PIDGEOT, + SPECIES_FEAROW, + SPECIES_BLASTOISE, + SPECIES_NINETALES, + SPECIES_GOLDUCK, + SPECIES_ARCANINE, + SPECIES_POLIWRATH, + SPECIES_MACHAMP, + SPECIES_TENTACRUEL, + SPECIES_RAPIDASH, + SPECIES_MUK, + SPECIES_CLOYSTER, + SPECIES_GENGAR, + SPECIES_EXEGGUTOR, + SPECIES_STARMIE, + SPECIES_SCYTHER, + SPECIES_PINSIR, + SPECIES_GYARADOS, + SPECIES_LAPRAS, + SPECIES_VAPOREON, + SPECIES_JOLTEON, + SPECIES_FLAREON, + SPECIES_AERODACTYL, + SPECIES_SNORLAX, + SPECIES_ARTICUNO, + SPECIES_ZAPDOS, + SPECIES_MOLTRES, + SPECIES_DRAGONITE, + SPECIES_MEGANIUM, + SPECIES_TYPHLOSION, + SPECIES_FERALIGATR, + SPECIES_CROBAT, + SPECIES_AMPHAROS, + SPECIES_POLITOED, + SPECIES_ESPEON, + SPECIES_UMBREON, + SPECIES_STEELIX, + SPECIES_SCIZOR, + SPECIES_SHUCKLE, + SPECIES_HERACROSS, + SPECIES_URSARING, + SPECIES_HOUNDOOM, + SPECIES_KINGDRA, + SPECIES_DONPHAN, + SPECIES_PORYGON2, + SPECIES_BLISSEY, + SPECIES_RAIKOU, + SPECIES_ENTEI, + SPECIES_SUICUNE, + SPECIES_TYRANITAR, + SPECIES_SCEPTILE, + SPECIES_BLAZIKEN, + SPECIES_SWAMPERT, + SPECIES_GARDEVOIR, + SPECIES_SLAKING, + SPECIES_AGGRON, + SPECIES_WAILORD, + SPECIES_FLYGON, + SPECIES_CLAYDOL, + SPECIES_MILOTIC, + SPECIES_WALREIN, + SPECIES_CRESSELIA, + SPECIES_SALAMENCE, + SPECIES_METAGROSS, + SPECIES_REGIROCK, + SPECIES_REGICE, + SPECIES_REGISTEEL, + SPECIES_LATIAS, + SPECIES_LATIOS, + SPECIES_TORTERRA, + SPECIES_INFERNAPE, + SPECIES_EMPOLEON, + SPECIES_LUXRAY, + SPECIES_ROSERADE, + SPECIES_HONCHKROW, + SPECIES_BRONZONG, + SPECIES_GARCHOMP, + SPECIES_LUCARIO, + SPECIES_HIPPOWDON, + SPECIES_DRAPION, + SPECIES_WEAVILE, + SPECIES_MAGNEZONE, + SPECIES_LICKILICKY, + SPECIES_RHYPERIOR, + SPECIES_TANGROWTH, + SPECIES_ELECTIVIRE, + SPECIES_MAGMORTAR, + SPECIES_TOGEKISS, + SPECIES_YANMEGA, + SPECIES_LEAFEON, + SPECIES_GLACEON, + SPECIES_GLISCOR, + SPECIES_MAMOSWINE, + SPECIES_PORYGON_Z, + SPECIES_GALLADE, + SPECIES_PROBOPASS, + SPECIES_DUSKNOIR, + SPECIES_UXIE, + SPECIES_MESPRIT, + SPECIES_AZELF, + SPECIES_HEATRAN, + SPECIES_VENUSAUR, + SPECIES_CHARIZARD, + SPECIES_REGIGIGAS, +}; + +static const struct { + u8 unused; + u8 ivs; + u16 unused2; +} sIVsPerTypeRank[HALL_MAX_TYPE_RANK] = { + { 0, 8, 0 }, + { 0, 10, 0 }, + { 0, 12, 0 }, + { 0, 14, 0 }, + { 0, 16, 0 }, + { 0, 18, 0 }, + { 0, 20, 0 }, + { 0, 22, 0 }, + { 0, 24, 0 }, + { 0, 26, 0 } +}; + +void BattleHall_PickOpponentTrainerClasses(u8 selectedTypeIdx, u8 numTrainers, u8 typeRank, u8 currentBattle, u16 trainerIDs[]) +{ + int i = 0; + + u8 offset = currentBattle * 2; + typeRank = BattleHall_CheckTypeRank(typeRank); + + do { + u16 rand = LCRNG_Next() % (8 + 4); + + if (rand < 8) { + trainerIDs[offset + i] = sHallTrainerClassesByRank[typeRank][rand]; + } else { + trainerIDs[offset + i] = sHallTrainerClassesBySelectedType[selectedTypeIdx][rand - 8]; + } + + i++; + } while (i < numTrainers); +} + +void BattleHall_PickOpponentTrainers(u8 challengeType, u8 numTrainers, int currentRound, u8 rank, u8 currentBattle, u16 trainerIDs[]) +{ + int startingIndex; + int selectedTrainers = 0; + u8 offset = currentBattle * 2; + u8 typeRank = BattleHall_CheckTypeRank(rank); + + if (challengeType == FRONTIER_CHALLENGE_SINGLE) { + int currentStreak = (currentRound * HALL_BATTLES_PER_ROUND) + (currentBattle + 1); + + if (currentStreak == HALL_STREAK_SILVER_BATTLE) { + trainerIDs[offset] = FRONTIER_TRAINER_HALL_MATRON_ARGENTA_SILVER; + return; + } else if (currentStreak == HALL_STREAK_GOLD_BATTLE) { + trainerIDs[offset] = FRONTIER_TRAINER_HALL_MATRON_ARGENTA_GOLD; + return; + } + } + + do { + u16 trainerID = LCRNG_Next() % NELEMS(sFrontierTrainerClasses); + startingIndex = trainerID; + + while (TRUE) { + int trainerClass = trainerIDs[offset + selectedTrainers]; + + if (trainerClass == sFrontierTrainerClasses[trainerID]) { + int pastTrainersIdx; + for (pastTrainersIdx = 0; pastTrainersIdx < (offset + selectedTrainers); pastTrainersIdx++) { + if (trainerIDs[pastTrainersIdx] == trainerID) { + break; + } + } + + if (pastTrainersIdx == (offset + selectedTrainers)) { + trainerIDs[offset + selectedTrainers] = trainerID; + selectedTrainers++; + break; + } + } + + trainerID++; + + if (trainerID >= NELEMS(sFrontierTrainerClasses)) { + trainerID = 0; + } + + if (trainerID == startingIndex) { + while (TRUE) { + u16 newIdx = LCRNG_Next() % 8; + + if (trainerClass != sHallTrainerClassesByRank[typeRank][newIdx]) { + trainerIDs[offset + selectedTrainers] = sHallTrainerClassesByRank[typeRank][newIdx]; + break; + } + } + } + } + } while (selectedTrainers < numTrainers); +} + +static const BattleHallGroupRange sPotentialMatchupRangesByRank[HALL_MAX_TYPE_RANK] = { + { GROUP_1_START, GROUP_2_START - 1 }, + { GROUP_1_START, GROUP_2_START - 1 }, + { GROUP_1_START, GROUP_3_START - 1 }, + { GROUP_1_START, GROUP_3_START - 1 }, + { GROUP_1_START, GROUP_3_START - 1 }, + { GROUP_2_START, GROUP_4_START - 1 }, + { GROUP_2_START, GROUP_4_START - 1 }, + { GROUP_2_START, GROUP_4_START - 1 }, + { GROUP_3_START, NELEMS(sBattleHallPotentialOpponents) }, + { GROUP_3_START, NELEMS(sBattleHallPotentialOpponents) } +}; + +static const BattleHallGroupRange sMatchupGroupRanges[] = { + { GROUP_1_START, GROUP_2_START - 1 }, + { GROUP_2_START, GROUP_3_START - 1 }, + { GROUP_3_START, GROUP_4_START - 1 }, + { GROUP_4_START, NELEMS(sBattleHallPotentialOpponents) } +}; + +void BattleHall_PickNextOpponentPokemon(u8 numOpponentsToPick, u8 selectedType, u8 typeRank, u8 currentBattle, u16 playersSpecies, u16 opponentIndices[], u8 battleType) +{ + const BattleHallGroupRange *matchupRange; + int opponentsFound = 0; + + u8 loopedThrough = FALSE; + u8 currentBattleIndex = currentBattle * 2; + typeRank = BattleHall_CheckTypeRank(typeRank); + + // For normal battles, the group of potential opponents is determined by + // the rank of the next battle + // For the Silver print battle, the opponent is selected from the group in + // which the player's species is + // For the Gold print battle, the opponent is from Group 4 + if (battleType != HALL_NEXT_BATTLE_NORMAL) { + u16 i, playersMonIndex; + for (i = 0; i < NELEMS(sBattleHallPotentialOpponents); i++) { + if (playersSpecies == sBattleHallPotentialOpponents[i]) { + playersMonIndex = i; + break; + } + } + + if (i == NELEMS(sBattleHallPotentialOpponents)) { + playersMonIndex = sMatchupGroupRanges[NELEMS(sMatchupGroupRanges) - 1].min; + } + + u16 playersMonsGroup; + for (playersMonsGroup = 0; playersMonsGroup < NELEMS(sMatchupGroupRanges); playersMonsGroup++) { + if (playersMonIndex < sMatchupGroupRanges[playersMonsGroup].max) { + break; + } + } + + if (playersMonsGroup == NELEMS(sMatchupGroupRanges)) { + playersMonsGroup = NELEMS(sMatchupGroupRanges) - 1; + } + + if (battleType == HALL_NEXT_BATTLE_GOLD) { + matchupRange = &sMatchupGroupRanges[NELEMS(sMatchupGroupRanges) - 1]; + } else { + matchupRange = &sMatchupGroupRanges[playersMonsGroup]; + } + } else { + matchupRange = &sPotentialMatchupRangesByRank[typeRank]; + } + + u16 groupSize = matchupRange->max - matchupRange->min + 1; + u16 opponentIndex = matchupRange->min + LCRNG_Next() % groupSize; + opponentIndex -= 1; + u16 startingIndex = opponentIndex; + + while (opponentsFound < numOpponentsToPick) { + // First try to select a pokemon that has not been fought yet this + // round. If no such pokemon is found after a full search through the + // group, then just make sure the next opponent is not the same as the + // previous one. + u16 pastOpponentsIndex; + if (!loopedThrough) { + for (pastOpponentsIndex = 0; pastOpponentsIndex < currentBattleIndex; pastOpponentsIndex++) { + if (opponentIndices[pastOpponentsIndex] == (opponentIndex + 1)) { + break; + } + } + } else { + if (opponentIndices[currentBattleIndex - 2] == (opponentIndex + 1)) { + pastOpponentsIndex = 0; + } else { + pastOpponentsIndex = currentBattleIndex; + } + } + + if (pastOpponentsIndex == currentBattleIndex) { + if (battleType != 0) { + if (playersSpecies != sBattleHallPotentialOpponents[opponentIndex]) { + opponentIndices[currentBattleIndex + opponentsFound] = opponentIndex + 1; + opponentsFound++; + } + } else if (selectedType == sBattleHallPotentialOpponentTypes[opponentIndex][0] || selectedType == sBattleHallPotentialOpponentTypes[opponentIndex][1]) { + if (playersSpecies != sBattleHallPotentialOpponents[opponentIndex]) { + opponentIndices[currentBattleIndex + opponentsFound] = opponentIndex + 1; + + opponentsFound++; + } + } + } + + opponentIndex++; + + if (opponentIndex + 1 >= matchupRange->max) { + opponentIndex = matchupRange->min - 1; + } + + if (opponentIndex == startingIndex) { + loopedThrough = TRUE; + } + } +} + +FieldBattleDTO *BattleHall_SetupBattle(BattleHall *battleHall, FieldFrontierDTO *fieldData) +{ + int i; + u8 rank; + Pokemon *mon; + FrontierTrainerDataDTO trDataDTO; + + u8 offset = battleHall->currentBattle * 2; + u8 playerPartySize = BattleHall_GetPlayerPartySize(battleHall->challengeType); + u8 opponentPartySize = BattleHall_GetOpponentPartySize(battleHall->challengeType); + Party *party = SaveData_GetParty(battleHall->saveData); + + Party_HealAllMembers(party); + + FieldBattleDTO *battleDTO = FieldBattleDTO_New(HEAP_ID_FIELD2, BattleHall_GetBattleType(battleHall->challengeType)); + FieldBattleDTO_InitFromGameState(battleDTO, NULL, fieldData->saveData, fieldData->mapHeaderID, fieldData->journalEntry, fieldData->bagCursor, fieldData->subscreenCursorOn); + + battleDTO->background = BACKGROUND_BATTLE_HALL; + battleDTO->terrain = TERRAIN_BATTLE_HALL; + Party_InitWithCapacity(battleDTO->parties[BATTLER_PLAYER_1], playerPartySize); + + mon = Pokemon_New(HEAP_ID_FIELD2); + + for (i = 0; i < playerPartySize; i++) { + Pokemon_Copy(Party_GetPokemonBySlotIndex(party, battleHall->partySlots[i]), mon); + FieldBattleDTO_AddPokemonToBattler(battleDTO, mon, BATTLER_PLAYER_1); + } + + Heap_Free(mon); + FieldBattleDTO_CopyPlayerInfoToTrainerData(battleDTO); + + Heap_Free(BattleFrontier_GetTrainerData(&trDataDTO, battleHall->trainerIDs[offset], HEAP_ID_FIELD2, NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDTR)); + 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->typeRanks[battleHall->challengeType][0]); + + if (battleHall->challengeType == FRONTIER_CHALLENGE_MULTI) { + rank = HALL_MAX_TYPE_RANK - 1; + } + + u16 aiMask = BattleHall_GetAIMask(battleHall, offset, rank); + + for (i = 0; i < MAX_BATTLERS; i++) { + battleDTO->trainer[i].header.aiMask = aiMask; + } + + BattleHall_LoadOpponentMonData(&battleHall->opponentMons[offset], rank, battleHall->trainerIDs[offset], &battleHall->monIndices[offset], opponentPartySize, HEAP_ID_FIELD2, NARC_INDEX_BATTLE__B_PL_STAGE__PL_BSDPM); + + mon = Pokemon_New(HEAP_ID_FIELD2); + + for (i = 0; i < opponentPartySize; i++) { + while (BattleHall_SetMonsPersonality(battleHall, offset) != 0) {} + + FrontierPokemonDataDTO_InitPokemon(&battleHall->opponentMons[offset], mon, BattleHall_GetOpponentLevel(battleHall, rank)); + + Pokemon_CalcAbility(mon); + FieldBattleDTO_AddPokemonToBattler(battleDTO, mon, BATTLER_ENEMY_1); + } + + Heap_Free(mon); + + switch (battleHall->challengeType) { + case FRONTIER_CHALLENGE_MULTI: + case FRONTIER_CHALLENGE_MULTI_WFC: + FieldBattleDTO_CopyPlayerInfoToTrainerData(battleDTO); + + TrainerInfo_Copy(CommInfo_TrainerInfo(1 - CommSys_CurNetId()), battleDTO->trainerInfo[BATTLER_PLAYER_2]); + + Heap_Free(BattleFrontier_GetTrainerData(&trDataDTO, battleHall->trainerIDs[offset + 1], HEAP_ID_FIELD2, NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDTR)); + + FieldBattleDTO_InitFrontierTrainer(battleDTO, &trDataDTO, opponentPartySize, BATTLER_ENEMY_2, HEAP_ID_FIELD2); + Party_InitWithCapacity(battleDTO->parties[BATTLER_ENEMY_2], opponentPartySize); + + mon = Pokemon_New(HEAP_ID_FIELD2); + + while (BattleHall_SetMonsPersonality(battleHall, offset) != 0) {} + + FrontierPokemonDataDTO_InitPokemon(&battleHall->opponentMons[offset], mon, BattleHall_GetOpponentLevel(battleHall, rank)); + + Pokemon_CalcAbility(mon); + FieldBattleDTO_AddPokemonToBattler(battleDTO, mon, BATTLER_ENEMY_2); + Heap_Free(mon); + break; + } + + return battleDTO; +} + +static BOOL BattleHall_SetMonsPersonality(BattleHall *battleHall, u8 index) +{ + if (battleHall->opponentMons[index].personality > ((24 + 1) * 10001)) { + battleHall->opponentMons[index].personality -= ((24 + 1) * 10001); + } else { + battleHall->opponentMons[index].personality += ((24 + 1) * 10001); + } + + return Pokemon_IsPersonalityShiny(battleHall->opponentMons[index].otID, battleHall->opponentMons[index].personality); +} + +static u32 BattleHall_GetBattleType(u8 challengeType) +{ + switch (challengeType) { + case FRONTIER_CHALLENGE_SINGLE: + return BATTLE_TYPE_FRONTIER_SINGLES; + case FRONTIER_CHALLENGE_DOUBLE: + return BATTLE_TYPE_FRONTIER_DOUBLES; + case FRONTIER_CHALLENGE_MULTI: + return BATTLE_TYPE_FRONTIER_LINK | BATTLE_TYPE_TRAINER_DOUBLES | BATTLE_TYPE_2vs2; + case FRONTIER_CHALLENGE_MULTI_WFC: + return BATTLE_TYPE_FRONTIER_LINK | BATTLE_TYPE_TRAINER_DOUBLES | BATTLE_TYPE_2vs2; + } + + return BATTLE_TYPE_FRONTIER_SINGLES; +} + +u8 BattleHall_GetPlayerPartySize(u8 challengeType) +{ + if (challengeType == FRONTIER_CHALLENGE_DOUBLE) { + return 2; + } + return 1; +} + +u8 BattleHall_GetOpponentPartySize(u8 challengeType) +{ + if (challengeType == FRONTIER_CHALLENGE_DOUBLE) { + return 2; + } + return 1; +} + +static void BattleHall_LoadOpponentMonData(FrontierPokemonDataDTO *frontierMon, u8 typeRank, u16 trainerID, u16 opponentIndices[], int partySize, int heapID, int narcID) +{ + u32 ivs; + if (trainerID == FRONTIER_TRAINER_HALL_MATRON_ARGENTA_SILVER) { + ivs = MAX_IVS_SINGLE_STAT; + } else if (trainerID == FRONTIER_TRAINER_HALL_MATRON_ARGENTA_GOLD) { + ivs = MAX_IVS_SINGLE_STAT; + } else { + ivs = BattleHall_GetIVsOfOpponentAtRank(typeRank); + } + + for (int i = 0; i < partySize; i++) { + BattleFrontier_LoadOpponentMonData(&frontierMon[i], opponentIndices[i], i, ivs, 0, heapID, narcID); + } +} + +static u32 BattleHall_GetOpponentLevel(BattleHall *battleHall, u8 unused) +{ + u32 level; + + u8 offset = battleHall->currentBattle * 2; + + if (battleHall->trainerIDs[offset] == FRONTIER_TRAINER_HALL_MATRON_ARGENTA_SILVER + || battleHall->trainerIDs[offset] == FRONTIER_TRAINER_HALL_MATRON_ARGENTA_GOLD) { + level = BattleHall_GetHighestLevelInParty(battleHall); + } else { + level = battleHall->opponentsLevel; + } + + return level; +} + +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 BattleHall_CursorPosToType(u8 cursorPos) +{ + return sBattleHallAppGridOrder[cursorPos]; +} + +BOOL BattleHall_IsMultiPlayerChallenge(u8 challengeType) +{ + return challengeType == FRONTIER_CHALLENGE_MULTI || challengeType == FRONTIER_CHALLENGE_MULTI_WFC; +} + +u8 BattleHall_GetHallMatronTypeRank(BattleHall *battleHall) +{ + Party *party = SaveData_GetParty(battleHall->saveData); + Pokemon *mon = Party_GetPokemonBySlotIndex(party, battleHall->partySlots[0]); + int level = Pokemon_GetValue(mon, MON_DATA_LEVEL, NULL); + + return level / 10; +} + +static u8 BattleHall_GetIVsOfOpponentAtRank(u8 typeRank) +{ + return sIVsPerTypeRank[BattleHall_CheckTypeRank(typeRank)].ivs; +} + +static u16 BattleHall_GetAIMask(BattleHall *battleHall, u8 battleNum, u8 rank) +{ + u16 aiMask; + + if (rank + 1 >= 8) { + aiMask = AI_FLAG_BASIC | AI_FLAG_EVAL_ATTACK | AI_FLAG_EXPERT; + } else if (rank + 1 >= 4) { + aiMask = AI_FLAG_BASIC; + } else { + aiMask = 0; + } + + if (battleHall->challengeType == FRONTIER_CHALLENGE_SINGLE) { + u8 offset = battleNum * 2; + + if (battleHall->trainerIDs[offset] == FRONTIER_TRAINER_HALL_MATRON_ARGENTA_SILVER + || battleHall->trainerIDs[offset] == FRONTIER_TRAINER_HALL_MATRON_ARGENTA_GOLD) { + aiMask = AI_FLAG_BASIC | AI_FLAG_EVAL_ATTACK | AI_FLAG_EXPERT; + } + } + + if (battleHall->challengeType == FRONTIER_CHALLENGE_MULTI) { + aiMask = AI_FLAG_BASIC | AI_FLAG_EVAL_ATTACK | AI_FLAG_EXPERT; + } + + return aiMask; +} + +static u16 BattleHall_CheckTypeRank(u8 typeRank) +{ + if (typeRank >= HALL_MAX_TYPE_RANK) { + typeRank = HALL_MAX_TYPE_RANK - 1; + } + + return typeRank; +} + +u16 BattleHall_GetHighestLevelInParty(BattleHall *battleHall) +{ + Party *party = SaveData_GetParty(battleHall->saveData); + 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->partySlots[1]); + u16 secondMonsLevel = Pokemon_GetValue(mon, MON_DATA_LEVEL, NULL); + + if (firstMonsLevel > secondMonsLevel) { + return firstMonsLevel; + } else { + return secondMonsLevel; + } + } else { + if (BattleHall_IsMultiPlayerChallenge(battleHall->challengeType) == TRUE) { + if (firstMonsLevel > battleHall->unk_D84[0]) { + return firstMonsLevel; + } else { + return battleHall->unk_D84[0]; + } + } + } + + return firstMonsLevel; +} + +fx32 BattleHall_GetLevelSquareRoot(u32 level) +{ + return FX_Sqrt(FX32_CONST(level)); +} diff --git a/src/overlay104/frscrcmd.c b/src/overlay104/frscrcmd.c index 4fb1297abef..0bcb21cd0c4 100644 --- a/src/overlay104/frscrcmd.c +++ b/src/overlay104/frscrcmd.c @@ -2155,12 +2155,12 @@ static BOOL FrontierScrCmd_3F(FrontierScriptContext *ctx) Sound_SetSceneAndPlayBGM(SOUND_SCENE_BATTLE, SEQ_BATTLE_TRAINER, 1); v1 = Heap_Alloc(HEAP_ID_FIELD2, sizeof(UnkStruct_ov104_02231148)); - v1->unk_14 = sub_0209B978(ctx->scriptMan->frontier); + v1->unk_14 = BattleFrontier_GetFacilityStruct(ctx->scriptMan->frontier); v1->unk_04 = 0; v1->unk_08 = ctx->data[0]; v1->unk_00 = FrontierScriptManager_GetGraphics(ctx->scriptMan); - sub_0209B980(ctx->scriptMan->frontier, v1); + BattleFrontier_SetFacilityStruct(ctx->scriptMan->frontier, v1); FrontierScriptContext_Pause(ctx, ov104_02231AA8); PaletteData_FillBufferRange(v1->unk_00->plttData, 0, 2, 0x0, 0, 1); @@ -2170,14 +2170,14 @@ static BOOL FrontierScrCmd_3F(FrontierScriptContext *ctx) static BOOL ov104_02231AA8(FrontierScriptContext *ctx) { BOOL v0; - UnkStruct_ov104_02231148 *v1 = sub_0209B978(ctx->scriptMan->frontier); + UnkStruct_ov104_02231148 *v1 = BattleFrontier_GetFacilityStruct(ctx->scriptMan->frontier); v0 = Unk_ov104_0223F65C[v1->unk_08](v1); if (v0 == 0) { SetScreenColorBrightness(DS_SCREEN_MAIN, COLOR_BLACK); SetScreenColorBrightness(DS_SCREEN_SUB, COLOR_BLACK); - sub_0209B980(ctx->scriptMan->frontier, v1->unk_14); + BattleFrontier_SetFacilityStruct(ctx->scriptMan->frontier, v1->unk_14); Heap_Free(v1); } diff --git a/src/overlay104/frscrcmd_battle_arcade.c b/src/overlay104/frscrcmd_battle_arcade.c index 7a1898b5172..e93292c0dbf 100644 --- a/src/overlay104/frscrcmd_battle_arcade.c +++ b/src/overlay104/frscrcmd_battle_arcade.c @@ -64,7 +64,7 @@ BOOL FrontierScrCmd_B8(FrontierScriptContext *param0) fieldData = BattleFrontier_GetFieldData(param0->scriptMan->frontier); v0 = ov104_02237DD8(fieldData->saveData, v2, v3, v4, v5, v6, v7); - sub_0209B980(param0->scriptMan->frontier, v0); + BattleFrontier_SetFacilityStruct(param0->scriptMan->frontier, v0); return 0; } @@ -73,7 +73,7 @@ BOOL FrontierScrCmd_B9(FrontierScriptContext *param0) BattleArcade *v0; u16 v1 = FrontierScriptContext_GetVar(param0); - v0 = sub_0209B978(param0->scriptMan->frontier); + v0 = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); ov104_0223806C(v0, v1); return 0; @@ -81,7 +81,7 @@ BOOL FrontierScrCmd_B9(FrontierScriptContext *param0) BOOL FrontierScrCmd_BA(FrontierScriptContext *param0) { - BattleArcade *v0 = sub_0209B978(param0->scriptMan->frontier); + BattleArcade *v0 = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); ov104_02238210(v0); return 0; @@ -100,7 +100,7 @@ BOOL FrontierScrCmd_OpenBattleArcadeApp(FrontierScriptContext *ctx) FS_OVERLAY_ID(battle_arcade_app) }; - BattleArcade *battleArcade = sub_0209B978(ctx->scriptMan->frontier); + BattleArcade *battleArcade = BattleFrontier_GetFacilityStruct(ctx->scriptMan->frontier); BattleArcadeAppArgs *args = Heap_Alloc(HEAP_ID_FIELD2, sizeof(BattleArcadeAppArgs)); MI_CpuClear8(args, sizeof(BattleArcadeAppArgs)); @@ -116,7 +116,7 @@ BOOL FrontierScrCmd_BattleArcade_CleanupBattle(FrontierScriptContext *ctx) { int i, partyIdx1, partyIdx2, numMons, stat; - BattleArcade *battleArcade = sub_0209B978(ctx->scriptMan->frontier); + BattleArcade *battleArcade = BattleFrontier_GetFacilityStruct(ctx->scriptMan->frontier); FieldBattleDTO *dto = battleArcade->dto; battleArcade->unk_1D = ov104_02238538(battleArcade, dto->parties[0], dto->parties[2], dto->totalTurnsElapsed); @@ -185,7 +185,7 @@ BOOL FrontierScrCmd_BattleArcade_CleanupBattle(FrontierScriptContext *ctx) BOOL FrontierScrCmd_BattleArcade_StartBattle(FrontierScriptContext *ctx) { FieldFrontierDTO *fieldData = BattleFrontier_GetFieldData(ctx->scriptMan->frontier); - BattleArcade *battleArcade = sub_0209B978(ctx->scriptMan->frontier); + BattleArcade *battleArcade = BattleFrontier_GetFacilityStruct(ctx->scriptMan->frontier); FieldBattleDTO *dto = FieldBattleDTO_NewBattleArcade(battleArcade, fieldData); battleArcade->dto = dto; @@ -236,7 +236,7 @@ static void StoreBattleArcadeAppResults(void *data) BOOL FrontierScrCmd_BD(FrontierScriptContext *param0) { - BattleArcade *v0 = sub_0209B978(param0->scriptMan->frontier); + BattleArcade *v0 = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); ov104_022384D4(v0); return 0; @@ -244,7 +244,7 @@ BOOL FrontierScrCmd_BD(FrontierScriptContext *param0) BOOL FrontierScrCmd_BE(FrontierScriptContext *param0) { - BattleArcade *v0 = sub_0209B978(param0->scriptMan->frontier); + BattleArcade *v0 = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); ov104_022384DC(v0); return 0; @@ -259,7 +259,7 @@ BOOL FrontierScrCmd_CallBattleArcadeFunction(FrontierScriptContext *ctx) u8 arg2 = FrontierScriptContext_GetVar(ctx); u16 *destVar = FrontierScriptContext_TryGetVarPointer(ctx); - BattleArcade *battleArcade = sub_0209B978(ctx->scriptMan->frontier); + BattleArcade *battleArcade = BattleFrontier_GetFacilityStruct(ctx->scriptMan->frontier); FieldFrontierDTO *fieldData = BattleFrontier_GetFieldData(ctx->scriptMan->frontier); FrontierGraphics *graphics = FrontierScriptManager_GetGraphics(ctx->scriptMan); @@ -439,8 +439,8 @@ BOOL FrontierScrCmd_CallBattleArcadeFunction(FrontierScriptContext *ctx) ov104_02237C0C(ctx, battleArcade, arg1); break; case BA_FUNC_UNK_40: - ov104_0222E278(&(battleArcade->unk_F4[0]), battleArcade->trainerIDs[battleArcade->unk_11], HEAP_ID_FIELD2, 178); - ov104_0222E278(&(battleArcade->unk_F4[1]), battleArcade->trainerIDs[battleArcade->unk_11 + 7], HEAP_ID_FIELD2, 178); + BattleFrontier_LoadTrainer(&(battleArcade->unk_F4[0]), battleArcade->trainerIDs[battleArcade->unk_11], HEAP_ID_FIELD2, 178); + BattleFrontier_LoadTrainer(&(battleArcade->unk_F4[1]), battleArcade->trainerIDs[battleArcade->unk_11 + 7], HEAP_ID_FIELD2, 178); break; case BA_FUNC_UNK_41: ov104_0223886C(battleArcade, graphics, arg1, arg2); @@ -537,7 +537,7 @@ BOOL FrontierScrCmd_BattleArcade_CheckWonBattle(FrontierScriptContext *ctx) { u16 *destVar = FrontierScriptContext_TryGetVarPointer(ctx); - BattleArcade *battleArcade = sub_0209B978(ctx->scriptMan->frontier); + BattleArcade *battleArcade = BattleFrontier_GetFacilityStruct(ctx->scriptMan->frontier); *destVar = battleArcade->wonBattle; return FALSE; @@ -550,7 +550,7 @@ BOOL FrontierScrCmd_C1(FrontierScriptContext *param0) u16 v2 = FrontierScriptContext_GetVar(param0); u16 *v3 = FrontierScriptContext_TryGetVarPointer(param0); - v0 = sub_0209B978(param0->scriptMan->frontier); + v0 = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); *v3 = ov104_02238B40(v0, v1, v2); return 1; @@ -571,7 +571,7 @@ static BOOL ov104_02237D18(FrontierScriptContext *param0) BattleArcade *v0; u16 v1 = FrontierScriptContext_TryGetVar(param0, param0->data[0]); - v0 = sub_0209B978(param0->scriptMan->frontier); + v0 = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); if (v0->unk_A7C >= 2) { v0->unk_A7C = 0; @@ -588,21 +588,21 @@ BOOL FrontierScrCmd_C4(FrontierScriptContext *param0) FieldFrontierDTO *fieldData = BattleFrontier_GetFieldData(param0->scriptMan->frontier); u16 v3 = FrontierScriptContext_ReadByte(param0); - v1 = sub_0209B978(param0->scriptMan->frontier); + v1 = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); if (v1 == NULL) { return 0; } v0 = v1->unk_F4[v3].trDataDTO.introMsg; - ov104_022330FC(param0, v0); + BattleFrontier_PrintNormalTrainerMessage(param0, v0); return 1; } BOOL FrontierScrCmd_C5(FrontierScriptContext *param0) { - BattleArcade *v0 = sub_0209B978(param0->scriptMan->frontier); + BattleArcade *v0 = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); ov104_02238B88(v0, v0->activeEffect); return 1; @@ -616,7 +616,7 @@ BOOL FrontierScrCmd_C6(FrontierScriptContext *param0) u16 v3 = FrontierScriptContext_GetVar(param0); u16 v4 = FrontierScriptContext_GetVar(param0); - v0 = sub_0209B978(param0->scriptMan->frontier); + v0 = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); ov104_022389F4(v0, v1, v2, v3, v4); return 0; diff --git a/src/overlay104/frscrcmd_battle_castle.c b/src/overlay104/frscrcmd_battle_castle.c index c28b2eff1b7..b8ed4a14303 100644 --- a/src/overlay104/frscrcmd_battle_castle.c +++ b/src/overlay104/frscrcmd_battle_castle.c @@ -53,7 +53,7 @@ BOOL FrontierScrCmd_97(FrontierScriptContext *param0) fieldData = BattleFrontier_GetFieldData(param0->scriptMan->frontier); v0 = ov104_022361B4(fieldData->saveData, v2, v3, v4, v5, v6, v7); - sub_0209B980(param0->scriptMan->frontier, v0); + BattleFrontier_SetFacilityStruct(param0->scriptMan->frontier, v0); return 0; } @@ -63,7 +63,7 @@ BOOL FrontierScrCmd_98(FrontierScriptContext *param0) BattleCastle *v0; u16 v1 = FrontierScriptContext_GetVar(param0); - v0 = sub_0209B978(param0->scriptMan->frontier); + v0 = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); ov104_02236514(v0, v1); return 0; @@ -71,7 +71,7 @@ BOOL FrontierScrCmd_98(FrontierScriptContext *param0) BOOL FrontierScrCmd_99(FrontierScriptContext *param0) { - BattleCastle *v0 = sub_0209B978(param0->scriptMan->frontier); + BattleCastle *v0 = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); ov104_022367AC(v0); return 0; @@ -90,7 +90,7 @@ BOOL FrontierScrCmd_OpenBattleCastleSelfApp(FrontierScriptContext *ctx) FS_OVERLAY_ID(battle_castle_app) }; - BattleCastle *battleCastle = sub_0209B978(ctx->scriptMan->frontier); + BattleCastle *battleCastle = BattleFrontier_GetFacilityStruct(ctx->scriptMan->frontier); BattleCastleAppArgs *args = Heap_Alloc(HEAP_ID_FIELD2, sizeof(BattleCastleAppArgs)); MI_CpuClear8(args, sizeof(BattleCastleAppArgs)); @@ -114,7 +114,7 @@ BOOL FrontierScrCmd_A4(FrontierScriptContext *ctx) FS_OVERLAY_ID(battle_castle_app) }; - BattleCastle *battleCastle = sub_0209B978(ctx->scriptMan->frontier); + BattleCastle *battleCastle = BattleFrontier_GetFacilityStruct(ctx->scriptMan->frontier); BattleCastleAppArgs *args = Heap_Alloc(HEAP_ID_FIELD2, sizeof(BattleCastleAppArgs)); MI_CpuClear8(args, sizeof(BattleCastleAppArgs)); @@ -128,7 +128,7 @@ BOOL FrontierScrCmd_A4(FrontierScriptContext *ctx) BOOL FrontierScrCmd_BattleCastle_CleanupBattle(FrontierScriptContext *ctx) { - BattleCastle *battleCastle = sub_0209B978(ctx->scriptMan->frontier); + BattleCastle *battleCastle = BattleFrontier_GetFacilityStruct(ctx->scriptMan->frontier); FieldBattleDTO *dto = battleCastle->dto; Pokemon *mon = Party_GetPokemonBySlotIndex(dto->parties[BATTLER_PLAYER_1], 0); @@ -156,7 +156,7 @@ BOOL FrontierScrCmd_BattleCastle_CleanupBattle(FrontierScriptContext *ctx) BOOL FrontierScrCmd_BattleCastle_StartBattle(FrontierScriptContext *ctx) { FieldFrontierDTO *fieldData = BattleFrontier_GetFieldData(ctx->scriptMan->frontier); - BattleCastle *battleCastle = sub_0209B978(ctx->scriptMan->frontier); + BattleCastle *battleCastle = BattleFrontier_GetFacilityStruct(ctx->scriptMan->frontier); FieldBattleDTO *dto = FieldBattleDTO_NewBattleCastle(battleCastle, fieldData); battleCastle->dto = dto; @@ -178,7 +178,7 @@ BOOL FrontierScrCmd_OpenBattleCastleOpponentApp(FrontierScriptContext *ctx) FS_OVERLAY_ID(battle_castle_app) }; - BattleCastle *battleCastle = sub_0209B978(ctx->scriptMan->frontier); + BattleCastle *battleCastle = BattleFrontier_GetFacilityStruct(ctx->scriptMan->frontier); BattleCastleAppArgs *args = Heap_Alloc(HEAP_ID_FIELD2, sizeof(BattleCastleAppArgs)); MI_CpuClear8(args, sizeof(BattleCastleAppArgs)); @@ -214,7 +214,7 @@ static void StoreBattleCastleAppResult(void *data) BOOL FrontierScrCmd_9E(FrontierScriptContext *param0) { - BattleCastle *v0 = sub_0209B978(param0->scriptMan->frontier); + BattleCastle *v0 = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); ov104_02236BF0(v0); return 0; @@ -222,7 +222,7 @@ BOOL FrontierScrCmd_9E(FrontierScriptContext *param0) BOOL FrontierScrCmd_9F(FrontierScriptContext *param0) { - BattleCastle *v0 = sub_0209B978(param0->scriptMan->frontier); + BattleCastle *v0 = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); ov104_02236BF8(v0); return 0; @@ -236,7 +236,7 @@ BOOL FrontierScrCmd_CallBattleCastleFunction(FrontierScriptContext *ctx) u8 arg2 = FrontierScriptContext_ReadByte(ctx); u16 *returnVar = FrontierScriptContext_TryGetVarPointer(ctx); - BattleCastle *battleCastle = sub_0209B978(ctx->scriptMan->frontier); + BattleCastle *battleCastle = BattleFrontier_GetFacilityStruct(ctx->scriptMan->frontier); fieldData = BattleFrontier_GetFieldData(ctx->scriptMan->frontier); switch (command) { @@ -374,8 +374,8 @@ BOOL FrontierScrCmd_CallBattleCastleFunction(FrontierScriptContext *ctx) ov104_0223BB84(v12->bgConfig, battleCastle, 3); } break; case BC_FUNC_UNK_37: - ov104_0222E278(&(battleCastle->unk_4C[0]), battleCastle->trainerIDs[battleCastle->unk_11], HEAP_ID_FIELD2, 178); - ov104_0222E278(&(battleCastle->unk_4C[1]), battleCastle->trainerIDs[battleCastle->unk_11 + 7], HEAP_ID_FIELD2, 178); + BattleFrontier_LoadTrainer(&(battleCastle->unk_4C[0]), battleCastle->trainerIDs[battleCastle->unk_11], HEAP_ID_FIELD2, 178); + BattleFrontier_LoadTrainer(&(battleCastle->unk_4C[1]), battleCastle->trainerIDs[battleCastle->unk_11 + 7], HEAP_ID_FIELD2, 178); break; case BC_FUNC_UNK_38: *returnVar = ov104_02237338(battleCastle); @@ -427,7 +427,7 @@ BOOL FrontierScrCmd_BattleCastle_CheckWonBattle(FrontierScriptContext *ctx) BattleCastle *battleCastle; u16 *destVar = FrontierScriptContext_TryGetVarPointer(ctx); - battleCastle = sub_0209B978(ctx->scriptMan->frontier); + battleCastle = BattleFrontier_GetFacilityStruct(ctx->scriptMan->frontier); *destVar = battleCastle->wonBattle; return FALSE; @@ -440,7 +440,7 @@ BOOL FrontierScrCmd_A2(FrontierScriptContext *param0) u16 v2 = FrontierScriptContext_GetVar(param0); u16 *v3 = FrontierScriptContext_TryGetVarPointer(param0); - v0 = sub_0209B978(param0->scriptMan->frontier); + v0 = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); *v3 = ov104_02236F70(v0, v1, v2); return 1; @@ -461,7 +461,7 @@ static BOOL ov104_02236008(FrontierScriptContext *param0) BattleCastle *v0; u16 v1 = FrontierScriptContext_TryGetVar(param0, param0->data[0]); - v0 = sub_0209B978(param0->scriptMan->frontier); + v0 = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); if (v0->unk_A1A >= 2) { v0->unk_A1A = 0; @@ -486,7 +486,7 @@ static BOOL ov104_02236058(FrontierScriptContext *param0) BattleCastle *v0; u16 *v1 = FrontierScriptContext_GetVarPointer(param0, param0->data[0]); - v0 = sub_0209B978(param0->scriptMan->frontier); + v0 = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); if (v0->unk_A1B == 0) { return 0; @@ -500,7 +500,7 @@ static BOOL ov104_02236058(FrontierScriptContext *param0) BOOL FrontierScrCmd_50(FrontierScriptContext *param0) { - BattleCastle *v0 = sub_0209B978(param0->scriptMan->frontier); + BattleCastle *v0 = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); ov104_02236FC0(param0->scriptMan, v0); return 0; @@ -508,7 +508,7 @@ BOOL FrontierScrCmd_50(FrontierScriptContext *param0) BOOL FrontierScrCmd_51(FrontierScriptContext *param0) { - BattleCastle *v0 = sub_0209B978(param0->scriptMan->frontier); + BattleCastle *v0 = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); ov104_022370E0(param0->scriptMan, v0); return 0; @@ -516,7 +516,7 @@ BOOL FrontierScrCmd_51(FrontierScriptContext *param0) BOOL FrontierScrCmd_52(FrontierScriptContext *param0) { - BattleCastle *v0 = sub_0209B978(param0->scriptMan->frontier); + BattleCastle *v0 = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); ov104_02237180(param0->scriptMan, v0); return 0; @@ -566,7 +566,7 @@ BOOL FrontierScrCmd_A9(FrontierScriptContext *param0) FieldFrontierDTO *fieldData = BattleFrontier_GetFieldData(param0->scriptMan->frontier); u16 v3 = FrontierScriptContext_ReadByte(param0); - v1 = sub_0209B978(param0->scriptMan->frontier); + v1 = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); if (v1 == NULL) { return 0; @@ -574,6 +574,6 @@ BOOL FrontierScrCmd_A9(FrontierScriptContext *param0) v0 = v1->unk_4C[v3].trDataDTO.introMsg; - ov104_022330FC(param0, v0); + BattleFrontier_PrintNormalTrainerMessage(param0, v0); return 1; } diff --git a/src/overlay104/frscrcmd_battle_factory.c b/src/overlay104/frscrcmd_battle_factory.c index e83decac13d..4ea96973da3 100644 --- a/src/overlay104/frscrcmd_battle_factory.c +++ b/src/overlay104/frscrcmd_battle_factory.c @@ -49,7 +49,7 @@ BOOL FrontierScrCmd_5C(FrontierScriptContext *param0) fieldData = BattleFrontier_GetFieldData(param0->scriptMan->frontier); v0 = ov104_022339B4(fieldData->saveData, v2, v3, v4); - sub_0209B980(param0->scriptMan->frontier, v0); + BattleFrontier_SetFacilityStruct(param0->scriptMan->frontier, v0); return 0; } @@ -59,7 +59,7 @@ BOOL FrontierScrCmd_5D(FrontierScriptContext *param0) BattleFactory *v0; u16 v1 = FrontierScriptContext_GetVar(param0); - v0 = sub_0209B978(param0->scriptMan->frontier); + v0 = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); ov104_02233B98(v0, v1); return 0; @@ -67,7 +67,7 @@ BOOL FrontierScrCmd_5D(FrontierScriptContext *param0) BOOL FrontierScrCmd_5E(FrontierScriptContext *param0) { - BattleFactory *v0 = sub_0209B978(param0->scriptMan->frontier); + BattleFactory *v0 = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); ov104_022340D0(v0); return 0; @@ -86,7 +86,7 @@ BOOL FrontierScrCmd_OpenBattleFactoryAppInitial(FrontierScriptContext *ctx) FS_OVERLAY_ID(battle_factory_app) }; - BattleFactory *battleFactory = sub_0209B978(ctx->scriptMan->frontier); + BattleFactory *battleFactory = BattleFrontier_GetFacilityStruct(ctx->scriptMan->frontier); BattleFactoryAppArgs *args = Heap_Alloc(HEAP_ID_FIELD2, sizeof(BattleFactoryAppArgs)); MI_CpuClear8(args, sizeof(BattleFactoryAppArgs)); @@ -105,7 +105,7 @@ BOOL FrontierScrCmd_OpenBattleFactoryAppInitial(FrontierScriptContext *ctx) BOOL FrontierScrCmd_BattleFactory_CleanupBattle(FrontierScriptContext *ctx) { - BattleFactory *battleFactory = sub_0209B978(ctx->scriptMan->frontier); + BattleFactory *battleFactory = BattleFrontier_GetFacilityStruct(ctx->scriptMan->frontier); FieldBattleDTO *dto = battleFactory->dto; battleFactory->wonBattle = CheckPlayerWonBattle(dto->resultMask); @@ -117,7 +117,7 @@ BOOL FrontierScrCmd_BattleFactory_CleanupBattle(FrontierScriptContext *ctx) BOOL FrontierScrCmd_BattleFactory_StartBattle(FrontierScriptContext *ctx) { FieldFrontierDTO *fieldData = BattleFrontier_GetFieldData(ctx->scriptMan->frontier); - BattleFactory *battleFactory = sub_0209B978(ctx->scriptMan->frontier); + BattleFactory *battleFactory = BattleFrontier_GetFacilityStruct(ctx->scriptMan->frontier); FieldBattleDTO *dto = FieldBattleDTO_NewBattleFactory(battleFactory, fieldData); battleFactory->dto = dto; @@ -140,7 +140,7 @@ BOOL FrontierScrCmd_OpenBattleFactoryAppForTrade(FrontierScriptContext *ctx) FS_OVERLAY_ID(battle_factory_app) }; - BattleFactory *battleFactory = sub_0209B978(ctx->scriptMan->frontier); + BattleFactory *battleFactory = BattleFrontier_GetFacilityStruct(ctx->scriptMan->frontier); for (int i = 0; i < 6; i++) { battleFactory->unk_4DC[i] = 0; @@ -170,7 +170,7 @@ static void StoreBattleFactoryAppResult(void *data) BOOL FrontierScrCmd_63(FrontierScriptContext *param0) { - BattleFactory *v0 = sub_0209B978(param0->scriptMan->frontier); + BattleFactory *v0 = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); ov104_0223449C(v0); return 0; @@ -178,7 +178,7 @@ BOOL FrontierScrCmd_63(FrontierScriptContext *param0) BOOL FrontierScrCmd_64(FrontierScriptContext *param0) { - BattleFactory *v0 = sub_0209B978(param0->scriptMan->frontier); + BattleFactory *v0 = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); ov104_02234570(v0); return 0; @@ -186,7 +186,7 @@ BOOL FrontierScrCmd_64(FrontierScriptContext *param0) BOOL FrontierScrCmd_65(FrontierScriptContext *param0) { - BattleFactory *v0 = sub_0209B978(param0->scriptMan->frontier); + BattleFactory *v0 = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); ov104_022346A4(v0); return 0; @@ -194,7 +194,7 @@ BOOL FrontierScrCmd_65(FrontierScriptContext *param0) BOOL FrontierScrCmd_66(FrontierScriptContext *param0) { - BattleFactory *v0 = sub_0209B978(param0->scriptMan->frontier); + BattleFactory *v0 = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); ov104_0223470C(v0); return 0; @@ -208,7 +208,7 @@ BOOL FrontierScrCmd_CallBattleFactoryFunction(FrontierScriptContext *ctx) u8 arg2 = FrontierScriptContext_ReadByte(ctx); u16 *returnVar = FrontierScriptContext_TryGetVarPointer(ctx); - BattleFactory *battleFactory = sub_0209B978(ctx->scriptMan->frontier); + BattleFactory *battleFactory = BattleFrontier_GetFacilityStruct(ctx->scriptMan->frontier); FrontierGraphics *graphics = FrontierScriptManager_GetGraphics(ctx->scriptMan); switch (command) { @@ -343,8 +343,8 @@ BOOL FrontierScrCmd_CallBattleFactoryFunction(FrontierScriptContext *ctx) } break; case BF_FUNC_UNK_33: - ov104_0222E278(&(battleFactory->unk_34[0]), battleFactory->trainerIDs[battleFactory->unk_06], HEAP_ID_FIELD2, 178); - ov104_0222E278(&(battleFactory->unk_34[1]), battleFactory->trainerIDs[battleFactory->unk_06 + 7], HEAP_ID_FIELD2, 178); + BattleFrontier_LoadTrainer(&(battleFactory->unk_34[0]), battleFactory->trainerIDs[battleFactory->unk_06], HEAP_ID_FIELD2, 178); + BattleFrontier_LoadTrainer(&(battleFactory->unk_34[1]), battleFactory->trainerIDs[battleFactory->unk_06 + 7], HEAP_ID_FIELD2, 178); break; case BF_FUNC_UNK_34: { u8 v6 = BattleFactory_GetPlayerPartySize(battleFactory->challengeType); @@ -409,7 +409,7 @@ BOOL FrontierScrCmd_BattleFactory_CheckWonBattle(FrontierScriptContext *ctx) { u16 *destVar = FrontierScriptContext_TryGetVarPointer(ctx); - BattleFactory *battleFactory = sub_0209B978(ctx->scriptMan->frontier); + BattleFactory *battleFactory = BattleFrontier_GetFacilityStruct(ctx->scriptMan->frontier); *destVar = battleFactory->wonBattle; return FALSE; @@ -422,7 +422,7 @@ BOOL FrontierScrCmd_69(FrontierScriptContext *param0) u16 v2 = FrontierScriptContext_GetVar(param0); u16 *v3 = FrontierScriptContext_TryGetVarPointer(param0); - v0 = sub_0209B978(param0->scriptMan->frontier); + v0 = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); *v3 = ov104_022347A4(v0, v1, v2); return 1; @@ -443,7 +443,7 @@ static BOOL ov104_0223394C(FrontierScriptContext *param0) BattleFactory *v0; u16 v1 = FrontierScriptContext_TryGetVar(param0, param0->data[0]); - v0 = sub_0209B978(param0->scriptMan->frontier); + v0 = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); if (v0->unk_702 >= 2) { v0->unk_702 = 0; @@ -460,7 +460,7 @@ BOOL FrontierScrCmd_6B(FrontierScriptContext *param0) FieldFrontierDTO *fieldData = BattleFrontier_GetFieldData(param0->scriptMan->frontier); u16 v3 = FrontierScriptContext_ReadByte(param0); - v1 = sub_0209B978(param0->scriptMan->frontier); + v1 = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); if (v1 == NULL) { return 0; @@ -468,6 +468,6 @@ BOOL FrontierScrCmd_6B(FrontierScriptContext *param0) v0 = v1->unk_34[v3].trDataDTO.introMsg; - ov104_022330FC(param0, v0); + BattleFrontier_PrintNormalTrainerMessage(param0, v0); return 1; } diff --git a/src/overlay104/frscrcmd_battle_hall.c b/src/overlay104/frscrcmd_battle_hall.c index ae3ea3bfa82..c0cb50f48eb 100644 --- a/src/overlay104/frscrcmd_battle_hall.c +++ b/src/overlay104/frscrcmd_battle_hall.c @@ -8,14 +8,14 @@ #include "struct_decls/tv_broadcast.h" #include "applications/frontier/battle_hall/main.h" +#include "global/utility.h" +#include "overlay104/battle_hall.h" +#include "overlay104/battle_hall_helpers.h" #include "overlay104/defs.h" #include "overlay104/frontier_script_context.h" #include "overlay104/frscrcmd.h" #include "overlay104/ov104_0222DCE0.h" #include "overlay104/ov104_02231F74.h" -#include "overlay104/ov104_02234DB4.h" -#include "overlay104/ov104_0223AF58.h" -#include "overlay104/struct_battle_hall.h" #include "overlay104/struct_ov104_02230BE4.h" #include "savedata/save_table.h" @@ -49,25 +49,24 @@ BOOL FrontierScrCmd_InitBattleHall(FrontierScriptContext *ctx) FieldFrontierDTO *fieldData = BattleFrontier_GetFieldData(ctx->scriptMan->frontier); BattleHall *battleHall = BattleHall_Init(fieldData->saveData, resumingFromSave, challengeType, partySlot1, partySlot2); - sub_0209B980(ctx->scriptMan->frontier, battleHall); + BattleFrontier_SetFacilityStruct(ctx->scriptMan->frontier, battleHall); return FALSE; } -BOOL FrontierScrCmd_8C(FrontierScriptContext *param0) +BOOL FrontierScrCmd_BattleHall_SetupNextOpponent(FrontierScriptContext *ctx) { - BattleHall *v0; - u16 v1 = FrontierScriptContext_GetVar(param0); + u16 unused = FrontierScriptContext_GetVar(ctx); - v0 = sub_0209B978(param0->scriptMan->frontier); - ov104_022350B0(v0, v1); + BattleHall *battleHall = BattleFrontier_GetFacilityStruct(ctx->scriptMan->frontier); + BattleHall_SetupNextOpponent(battleHall, unused); - return 0; + return FALSE; } BOOL FrontierScrCmd_FreeBattleHall(FrontierScriptContext *ctx) { - BattleHall *battleHall = sub_0209B978(ctx->scriptMan->frontier); + BattleHall *battleHall = BattleFrontier_GetFacilityStruct(ctx->scriptMan->frontier); BattleHall_Free(battleHall); return FALSE; @@ -86,7 +85,7 @@ BOOL FrontierScrCmd_OpenBattleHallApp(FrontierScriptContext *ctx) FS_OVERLAY_ID(battle_hall_app) }; - BattleHall *battleHall = sub_0209B978(ctx->scriptMan->frontier); + BattleHall *battleHall = BattleFrontier_GetFacilityStruct(ctx->scriptMan->frontier); BattleHallAppArgs *args = Heap_Alloc(HEAP_ID_FIELD2, sizeof(BattleHallAppArgs)); MI_CpuClear8(args, sizeof(BattleHallAppArgs)); @@ -120,7 +119,7 @@ BOOL FrontierScrCmd_OpenBattleHallApp(FrontierScriptContext *ctx) BOOL FrontierScrCmd_BattleHall_CleanupBattle(FrontierScriptContext *ctx) { - BattleHall *battleHall = sub_0209B978(ctx->scriptMan->frontier); + BattleHall *battleHall = BattleFrontier_GetFacilityStruct(ctx->scriptMan->frontier); FieldBattleDTO *dto = battleHall->dto; battleHall->wonBattle = CheckPlayerWonBattle(dto->resultMask); @@ -132,9 +131,9 @@ BOOL FrontierScrCmd_BattleHall_CleanupBattle(FrontierScriptContext *ctx) BOOL FrontierScrCmd_BattleHall_StartBattle(FrontierScriptContext *ctx) { FieldFrontierDTO *fieldData = BattleFrontier_GetFieldData(ctx->scriptMan->frontier); - BattleHall *battleHall = sub_0209B978(ctx->scriptMan->frontier); + BattleHall *battleHall = BattleFrontier_GetFacilityStruct(ctx->scriptMan->frontier); - FieldBattleDTO *dto = FieldBattleDTO_NewBattleHall(battleHall, fieldData); + FieldBattleDTO *dto = BattleHall_SetupBattle(battleHall, fieldData); battleHall->dto = dto; Sound_SetSceneAndPlayBGM(SOUND_SCENE_BATTLE, SEQ_BATTLE_TRAINER, 1); @@ -152,15 +151,14 @@ static void StoreBattleHallAppResult(void *data) BOOL FrontierScrCmd_CallBattleHallFunction(FrontierScriptContext *ctx) { - u8 v4, partySize; - u32 v6; + u8 rank, partySize; u8 command = FrontierScriptContext_ReadByte(ctx); u8 arg1 = FrontierScriptContext_ReadByte(ctx); u8 arg2 = FrontierScriptContext_ReadByte(ctx); u16 *returnVar = FrontierScriptContext_TryGetVarPointer(ctx); FieldFrontierDTO *fieldData = BattleFrontier_GetFieldData(ctx->scriptMan->frontier); - BattleHall *battleHall = sub_0209B978(ctx->scriptMan->frontier); + BattleHall *battleHall = BattleFrontier_GetFacilityStruct(ctx->scriptMan->frontier); switch (command) { case BH_FUNC_SET_CHALLENGE_TYPE: @@ -180,33 +178,33 @@ BOOL FrontierScrCmd_CallBattleHallFunction(FrontierScriptContext *ctx) case BH_FUNC_RESET_SYSTEM: OS_ResetSystem(0); break; - case BH_FUNC_UNK_9: + case BH_FUNC_CHECK_HAS_SAVED: *returnVar = BattleHallSave_HasSaved(battleHall->hallSave); break; case BH_FUNC_QUICKSAVE: BattleHall_Save(battleHall, 2); break; - case BH_FUNC_UNK_14: - *returnVar = ov104_022354B0(battleHall); + case BH_FUNC_INCREMENT_CURRENT_BATTLE: + *returnVar = BattleHall_IncrementCurrentBattle(battleHall); break; - case BH_FUNC_UNK_19: - if (battleHall->challengeType == 2) { + case BH_FUNC_GET_CURRENT_ROUND: + if (battleHall->challengeType == FRONTIER_CHALLENGE_MULTI) { *returnVar = 10; } else { *returnVar = battleHall->currentRound; } break; - case BH_FUNC_UNK_20: - *returnVar = ov104_022354C0(battleHall, arg1); + case BH_FUNC_GET_OPPONENT_OBJECT_ID: + *returnVar = BattleHall_GetNextOpponentObjectID(battleHall, arg1); break; - case BH_FUNC_UNK_21: - ov104_022354F4(battleHall); + case BH_FUNC_SAVE_ON_LOSS: + BattleHall_SaveOnLoss(battleHall); break; - case BH_FUNC_UNK_22: - ov104_02235518(battleHall); + case BH_FUNC_SAVE_ON_COMPLETING_ROUND: + BattleHall_SaveOnCompletingRound(battleHall); break; - case BH_FUNC_UNK_23: - *returnVar = ov104_022354BC(battleHall); + case BH_FUNC_GET_CURRENT_BATTLE: + *returnVar = BattleHall_GetCurrentBattle(battleHall); break; case BH_FUNC_UNK_24: *returnVar = battleHall->unk_D88; @@ -220,11 +218,11 @@ BOOL FrontierScrCmd_CallBattleHallFunction(FrontierScriptContext *ctx) Pokemon_SetValue(mon, MON_DATA_HELD_ITEM, &battleHall->heldItems[i]); } } break; - case BH_FUNC_UNK_28: - v4 = BattleHall_GetRankOfType(battleHall->selectedTypeIdx, &battleHall->typeRanks[battleHall->challengeType][0]); + case BH_FUNC_INCREMENT_RANK_OF_BEATEN_TYPE: + rank = BattleHall_GetRankOfType(battleHall->selectedTypeIdx, &battleHall->typeRanks[battleHall->challengeType][0]); - if (v4 < 10) { - BattleHall_SetRankOfType(battleHall->selectedTypeIdx, &battleHall->typeRanks[battleHall->challengeType][0], v4 + 1); + if (rank < HALL_MAX_TYPE_RANK) { + BattleHall_SetRankOfType(battleHall->selectedTypeIdx, &battleHall->typeRanks[battleHall->challengeType][0], rank + 1); } break; case BH_FUNC_UNK_29: @@ -243,35 +241,35 @@ BOOL FrontierScrCmd_CallBattleHallFunction(FrontierScriptContext *ctx) GXLayers_EngineAToggleLayers(GX_PLANEMASK_BG2, FALSE); } break; - case BH_FUNC_UNK_32: - ov104_0222E278(&(battleHall->unk_40[0]), battleHall->trainerIDs[battleHall->unk_05 * 2], HEAP_ID_FIELD2, 178); - ov104_0222E278(&(battleHall->unk_40[1]), battleHall->trainerIDs[battleHall->unk_05 * 2 + 1], HEAP_ID_FIELD2, 178); + case BH_FUNC_LOAD_TRAINERS: + BattleFrontier_LoadTrainer(&battleHall->opponents[0], battleHall->trainerIDs[battleHall->currentBattle * 2], HEAP_ID_FIELD2, NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDTR); + BattleFrontier_LoadTrainer(&battleHall->opponents[1], battleHall->trainerIDs[battleHall->currentBattle * 2 + 1], HEAP_ID_FIELD2, NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDTR); break; - case BH_FUNC_UNK_33: + case BH_FUNC_GET_RANK_OF_BEATEN_TYPE: *returnVar = BattleHall_GetRankOfType(battleHall->selectedTypeIdx, &battleHall->typeRanks[battleHall->challengeType][0]); break; - case BH_FUNC_UNK_34: - *returnVar = ov104_02235578(battleHall); + case BH_FUNC_GET_EARNED_BP: + *returnVar = BattleHall_GetEarnedBP(battleHall); break; - case BH_FUNC_UNK_15: { - Party *v2 = SaveData_GetParty(fieldData->saveData); - Pokemon *v1 = Party_GetPokemonBySlotIndex(v2, battleHall->partySlots[0]); - *returnVar = Pokemon_GetValue(v1, MON_DATA_SPECIES, NULL); + case BH_FUNC_GET_PLAYERS_MONS_SPECIES: { + Party *party = SaveData_GetParty(fieldData->saveData); + Pokemon *mon = Party_GetPokemonBySlotIndex(party, battleHall->partySlots[0]); + *returnVar = Pokemon_GetValue(mon, MON_DATA_SPECIES, NULL); } break; - case BH_FUNC_UNK_35: - ov104_022356A0(battleHall); + case BH_FUNC_CAP_TYPE_RANKS: + BattleHall_CapTypeRanks(battleHall); break; case BH_FUNC_SET_BASE_LEVEL: BattleHall_CalcPlayerLevelSqrt(battleHall); break; - case BH_FUNC_UNK_37: - *returnVar = 0; - - if (battleHall->challengeType == 0) { - if ((battleHall->currentStreak + 1) == 50) { - *returnVar = 1; - } else if ((battleHall->currentStreak + 1) == 170) { - *returnVar = 2; + case BH_FUNC_GET_NEXT_BATTLE_TYPE: + *returnVar = HALL_NEXT_BATTLE_NORMAL; + + if (battleHall->challengeType == FRONTIER_CHALLENGE_SINGLE) { + if (battleHall->currentStreak + 1 == HALL_STREAK_SILVER_BATTLE) { + *returnVar = HALL_NEXT_BATTLE_SILVER; + } else if (battleHall->currentStreak + 1 == HALL_STREAK_GOLD_BATTLE) { + *returnVar = HALL_NEXT_BATTLE_GOLD; } } break; @@ -286,96 +284,87 @@ BOOL FrontierScrCmd_BattleHall_CheckWonBattle(FrontierScriptContext *ctx) { u16 *destVar = FrontierScriptContext_TryGetVarPointer(ctx); - BattleHall *battleHall = sub_0209B978(ctx->scriptMan->frontier); + BattleHall *battleHall = BattleFrontier_GetFacilityStruct(ctx->scriptMan->frontier); *destVar = battleHall->wonBattle; return FALSE; } -BOOL FrontierScrCmd_93(FrontierScriptContext *param0) +BOOL FrontierScrCmd_BattleHall_SendCommMessage(FrontierScriptContext *ctx) { - BattleHall *v0; - u16 v1 = FrontierScriptContext_GetVar(param0); - u16 v2 = FrontierScriptContext_GetVar(param0); - u16 *v3 = FrontierScriptContext_TryGetVarPointer(param0); + u16 command = FrontierScriptContext_GetVar(ctx); + u16 arg = FrontierScriptContext_GetVar(ctx); + u16 *success = FrontierScriptContext_TryGetVarPointer(ctx); - v0 = sub_0209B978(param0->scriptMan->frontier); - *v3 = ov104_02235534(v0, v1, v2); + BattleHall *battleHall = BattleFrontier_GetFacilityStruct(ctx->scriptMan->frontier); + *success = BattleHall_SendCommMessage(battleHall, command, arg); - return 1; + return TRUE; } -BOOL FrontierScrCmd_94(FrontierScriptContext *param0) +BOOL FrontierScrCmd_94(FrontierScriptContext *ctx) { - u16 v0 = FrontierScriptContext_ReadHalfWord(param0); + u16 v0 = FrontierScriptContext_ReadHalfWord(ctx); - param0->data[0] = v0; - FrontierScriptContext_Pause(param0, ov104_02234CEC); + ctx->data[0] = v0; + FrontierScriptContext_Pause(ctx, ov104_02234CEC); - return 1; + return TRUE; } -static BOOL ov104_02234CEC(FrontierScriptContext *param0) +static BOOL ov104_02234CEC(FrontierScriptContext *ctx) { - BattleHall *v0; - u16 v1 = FrontierScriptContext_TryGetVar(param0, param0->data[0]); + u16 v1 = FrontierScriptContext_TryGetVar(ctx, ctx->data[0]); - v0 = sub_0209B978(param0->scriptMan->frontier); + BattleHall *battleHall = BattleFrontier_GetFacilityStruct(ctx->scriptMan->frontier); - if (v0->unk_D90 >= 2) { - v0->unk_D90 = 0; - return 1; + if (battleHall->unk_D90 >= 2) { + battleHall->unk_D90 = 0; + return TRUE; } - return 0; + return FALSE; } -BOOL FrontierScrCmd_95(FrontierScriptContext *param0) +BOOL FrontierScrCmd_BattleHall_PrintTrainerIntro(FrontierScriptContext *ctx) { - u16 *v0; - BattleHall *v1; - FieldFrontierDTO *fieldData = BattleFrontier_GetFieldData(param0->scriptMan->frontier); - u16 v3 = FrontierScriptContext_ReadByte(param0); + FieldFrontierDTO *fieldData = BattleFrontier_GetFieldData(ctx->scriptMan->frontier); + u16 index = FrontierScriptContext_ReadByte(ctx); - v1 = sub_0209B978(param0->scriptMan->frontier); + BattleHall *battleHall = BattleFrontier_GetFacilityStruct(ctx->scriptMan->frontier); - if (v1 == NULL) { + if (battleHall == NULL) { return 0; } - v0 = v1->unk_40[v3].trDataDTO.introMsg; + u16 *introMsg = battleHall->opponents[index].trDataDTO.introMsg; - ov104_022330FC(param0, v0); - return 1; + BattleFrontier_PrintNormalTrainerMessage(ctx, introMsg); + return TRUE; } BOOL FrontierScrCmd_BattleHall_UpdateWinRecord(FrontierScriptContext *ctx) { u16 *destVar = FrontierScriptContext_TryGetVarPointer(ctx); - BattleHall *battleHall = sub_0209B978(ctx->scriptMan->frontier); + BattleHall *battleHall = BattleFrontier_GetFacilityStruct(ctx->scriptMan->frontier); BattleHall_UpdateWinRecordForCurrentMon(battleHall, destVar); return TRUE; } -BOOL FrontierScrCmd_C7(FrontierScriptContext *param0) +BOOL FrontierScrCmd_C7(FrontierScriptContext *ctx) { - TVBroadcast *broadcast; - u16 v1; - Party *v2; - Pokemon *v3; - BattleHall *v4; - FieldFrontierDTO *fieldData = BattleFrontier_GetFieldData(param0->scriptMan->frontier); - - v4 = sub_0209B978(param0->scriptMan->frontier); - v2 = SaveData_GetParty(fieldData->saveData); - v3 = Party_GetPokemonBySlotIndex(v2, v4->partySlots[0]); - v1 = Pokemon_GetValue(v3, MON_DATA_SPECIES, NULL); - - if (v4->challengeType == 0) { - broadcast = SaveData_GetTVBroadcast(fieldData->saveData); - sub_0206D048(broadcast, v3); + FieldFrontierDTO *fieldData = BattleFrontier_GetFieldData(ctx->scriptMan->frontier); + + BattleHall *battleHall = BattleFrontier_GetFacilityStruct(ctx->scriptMan->frontier); + Party *party = SaveData_GetParty(fieldData->saveData); + Pokemon *mon = Party_GetPokemonBySlotIndex(party, battleHall->partySlots[0]); + UNUSED(Pokemon_GetValue(mon, MON_DATA_SPECIES, NULL)); + + if (battleHall->challengeType == 0) { + TVBroadcast *broadcast = SaveData_GetTVBroadcast(fieldData->saveData); + sub_0206D048(broadcast, mon); } - return 0; + return FALSE; } diff --git a/src/overlay104/frscrcmd_battle_tower.c b/src/overlay104/frscrcmd_battle_tower.c index 6e8c7d4639c..bab0a01b636 100644 --- a/src/overlay104/frscrcmd_battle_tower.c +++ b/src/overlay104/frscrcmd_battle_tower.c @@ -46,7 +46,7 @@ BOOL FrontierScrCmd_CallBattleTowerFunction(FrontierScriptContext *ctx) functionIndex = FrontierScriptContext_ReadHalfWord(ctx); functionArgument = FrontierScriptContext_GetVar(ctx); destVar = FrontierScriptContext_TryGetVarPointer(ctx); - BattleTower *battleTower = sub_0209B978(ctx->scriptMan->frontier); + BattleTower *battleTower = BattleFrontier_GetFacilityStruct(ctx->scriptMan->frontier); switch (functionIndex) { case BT_FUNC_RESET_SYSTEM: @@ -156,7 +156,7 @@ BOOL FrontierScrCmd_85(FrontierScriptContext *param0) FieldFrontierDTO *fieldData = BattleFrontier_GetFieldData(param0->scriptMan->frontier); u16 v4 = FrontierScriptContext_ReadByte(param0); - battleTower = sub_0209B978(param0->scriptMan->frontier); + battleTower = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); if (battleTower == NULL) { return 0; @@ -164,13 +164,13 @@ BOOL FrontierScrCmd_85(FrontierScriptContext *param0) v1 = battleTower->opponentsDataDTO[v4].trDataDTO.introMsg; - ov104_0223310C(param0, v1, BattleTower_GetTrainerMessagesBankID(battleTower->challengeMode)); + BattleFrontier_PrintTrainerMessage(param0, v1, BattleTower_GetTrainerMessagesBankID(battleTower->challengeMode)); return 1; } BOOL FrontierScrCmd_FreeTowerStruct(FrontierScriptContext *ctx) { - BattleTower *battleTower = sub_0209B978(ctx->scriptMan->frontier); + BattleTower *battleTower = BattleFrontier_GetFacilityStruct(ctx->scriptMan->frontier); BattleTower_Free(battleTower); return FALSE; @@ -179,7 +179,7 @@ BOOL FrontierScrCmd_FreeTowerStruct(FrontierScriptContext *ctx) BOOL FrontierScrCmd_BattleTower_StartBattle(FrontierScriptContext *ctx) { FieldFrontierDTO *fieldData = BattleFrontier_GetFieldData(ctx->scriptMan->frontier); - BattleTower *battleTower = sub_0209B978(ctx->scriptMan->frontier); + BattleTower *battleTower = BattleFrontier_GetFacilityStruct(ctx->scriptMan->frontier); FieldBattleDTO *dto = FieldBattleDTO_NewBattleTower(battleTower, fieldData); battleTower->dto = dto; @@ -192,7 +192,7 @@ BOOL FrontierScrCmd_BattleTower_StartBattle(FrontierScriptContext *ctx) BOOL FrontierScrCmd_BattleTower_CheckWonBattle(FrontierScriptContext *ctx) { - BattleTower *battleTower = sub_0209B978(ctx->scriptMan->frontier); + BattleTower *battleTower = BattleFrontier_GetFacilityStruct(ctx->scriptMan->frontier); u16 *destVar = FrontierScriptContext_TryGetVarPointer(ctx); FieldBattleDTO *dto = battleTower->dto; @@ -211,7 +211,7 @@ BOOL FrontierScrCmd_89(FrontierScriptContext *param0) u16 v3 = FrontierScriptContext_GetVar(param0); u16 *v4 = FrontierScriptContext_TryGetVarPointer(param0); - battleTower = sub_0209B978(param0->scriptMan->frontier); + battleTower = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); switch (v2) { case 2: @@ -249,7 +249,7 @@ static BOOL ov104_0223942C(FrontierScriptContext *param0) BattleTower *battleTower; FieldFrontierDTO *fieldData = BattleFrontier_GetFieldData(param0->scriptMan->frontier); - battleTower = sub_0209B978(param0->scriptMan->frontier); + battleTower = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); if (ov104_02239464(param0, battleTower, fieldData->saveData, param0->data[0], param0->data[1]) == 1) { return 1; diff --git a/src/overlay104/ov104_0222DCE0.c b/src/overlay104/ov104_0222DCE0.c index 3101f0437dc..bc54b7709f9 100644 --- a/src/overlay104/ov104_0222DCE0.c +++ b/src/overlay104/ov104_0222DCE0.c @@ -106,9 +106,9 @@ BattleFrontierTrainerData *BattleFrontier_GetTrainerDataFromTrainerIDAndNarcID(u return NARC_AllocAndReadWholeMemberByIndexPair(narcID, battleTowerTrainerID, heapID); } -void BattleTower_GetMonDataFromSetIDAndNarcID(BattleFrontierPokemonData *monData, int setID, enum NarcID narcID) +void BattleTower_GetMonDataFromSetIDAndNarcID(BattleFrontierPokemonData *monData, int narcIdx, enum NarcID narcID) { - NARC_ReadWholeMemberByIndexPair(monData, narcID, setID); + NARC_ReadWholeMemberByIndexPair(monData, narcID, narcIdx); } BattleFrontierTrainerData *BattleFrontier_GetTrainerData(FrontierTrainerDataDTO *trDataDTO, int battleTowerTrainerID, enum HeapID heapID, enum NarcID narcID) @@ -140,15 +140,11 @@ static const u16 Unk_ov104_0223F290[] = { ITEM_QUICK_CLAW }; -u32 ov104_0222DD6C(FrontierPokemonDataDTO *param0, u16 param1, u32 param2, u32 param3, u8 param4, u8 param5, BOOL param6, int param7, enum NarcID narcID) +u32 ov104_0222DD6C(FrontierPokemonDataDTO *param0, u16 narcIdx, u32 otID, u32 param3, u8 ivs, u8 param5, BOOL param6, int heapID, enum NarcID narcID) { - int v0; - int v1; - u32 v2; - BattleFrontierPokemonData v4; - MI_CpuClear8(param0, sizeof(FrontierPokemonDataDTO)); - BattleTower_GetMonDataFromSetIDAndNarcID(&v4, param1, narcID); + BattleFrontierPokemonData v4; + BattleTower_GetMonDataFromSetIDAndNarcID(&v4, narcIdx, narcID); param0->species = v4.species; param0->form = v4.form; @@ -165,7 +161,7 @@ u32 ov104_0222DD6C(FrontierPokemonDataDTO *param0, u16 param1, u32 param2, u32 p u8 friendship = MAX_FRIENDSHIP_VALUE; - for (v0 = 0; v0 < LEARNED_MOVES_MAX; v0++) { + for (int v0 = 0; v0 < LEARNED_MOVES_MAX; v0++) { param0->moves[v0] = v4.moves[v0]; if (v4.moves[v0] == MOVE_FRUSTRATION) { @@ -173,12 +169,13 @@ u32 ov104_0222DD6C(FrontierPokemonDataDTO *param0, u16 param1, u32 param2, u32 p } } - param0->otID = param2; + param0->otID = otID; + u32 v2; if (param3 == 0) { do { v2 = (LCRNG_Next() | LCRNG_Next() << 16); - } while ((v4.nature != Pokemon_GetNatureOf(v2)) || (Pokemon_IsPersonalityShiny(param2, v2) == TRUE)); + } while ((v4.nature != Pokemon_GetNatureOf(v2)) || (Pokemon_IsPersonalityShiny(otID, v2) == TRUE)); param0->personality = v2; } else { @@ -186,16 +183,16 @@ u32 ov104_0222DD6C(FrontierPokemonDataDTO *param0, u16 param1, u32 param2, u32 p v2 = param3; } - param0->hpIV = param4; - param0->atkIV = param4; - param0->defIV = param4; - param0->speedIV = param4; - param0->spAtkIV = param4; - param0->spDefIV = param4; + param0->hpIV = ivs; + param0->atkIV = ivs; + param0->defIV = ivs; + param0->speedIV = ivs; + param0->spAtkIV = ivs; + param0->spDefIV = ivs; - v1 = 0; + int v1 = 0; - for (v0 = 0; v0 < 6; v0++) { + for (int v0 = 0; v0 < 6; v0++) { if (v4.evFlags & FlagIndex(v0)) { v1++; } @@ -207,7 +204,7 @@ u32 ov104_0222DD6C(FrontierPokemonDataDTO *param0, u16 param1, u32 param2, u32 p v1 = 510 / v1; } - for (v0 = 0; v0 < 6; v0++) { + for (int v0 = 0; v0 < 6; v0++) { if (v4.evFlags & FlagIndex(v0)) { param0->evList[v0] = v1; } @@ -216,7 +213,7 @@ u32 ov104_0222DD6C(FrontierPokemonDataDTO *param0, u16 param1, u32 param2, u32 p param0->combinedPPUps = 0; param0->language = gGameLanguage; - v0 = SpeciesData_GetSpeciesValue(param0->species, SPECIES_DATA_ABILITY_2); + int v0 = SpeciesData_GetSpeciesValue(param0->species, SPECIES_DATA_ABILITY_2); if (v0) { if (param0->personality & 1) { @@ -229,7 +226,7 @@ u32 ov104_0222DD6C(FrontierPokemonDataDTO *param0, u16 param1, u32 param2, u32 p } param0->friendship = friendship; - MessageLoader_GetSpeciesName(param0->species, param7, &(param0->nickname[0])); + MessageLoader_GetSpeciesName(param0->species, heapID, &(param0->nickname[0])); return v2; } @@ -404,11 +401,9 @@ u8 BattleCastle_GetPokeIconAnimID(u16 hp, u16 maxHp) return POKEICON_ANIM_HP_MAX; } -void ov104_0222E278(FrontierDataDTO *param0, u16 param1, enum HeapID heapID, int param3) +void BattleFrontier_LoadTrainer(FrontierDataDTO *opponent, u16 trainerID, enum HeapID heapID, enum NarcID narcID) { - Heap_Free(BattleFrontier_GetTrainerData(¶m0->trDataDTO, param1, heapID, param3)); - - return; + Heap_Free(BattleFrontier_GetTrainerData(&opponent->trDataDTO, trainerID, heapID, narcID)); } void FieldBattleDTO_InitFrontierTrainer(FieldBattleDTO *battleDTO, FrontierTrainerDataDTO *trDataDTO, int unused, int battlerId, enum HeapID heapID) @@ -429,14 +424,10 @@ void FieldBattleDTO_InitFrontierTrainer(FieldBattleDTO *battleDTO, FrontierTrain return; } -u32 ov104_0222E2F0(FrontierPokemonDataDTO *param0, u16 param1, int param2, u8 param3, u32 param4, int param5, int param6) +u32 BattleFrontier_LoadOpponentMonData(FrontierPokemonDataDTO *frontierMon, u16 narcIdx, int item, u8 ivs, u32 personality, int heapID, int narcID) { - u32 v0, v1, v2; - - v0 = LCRNG_Next() | (LCRNG_Next() << 16); - v2 = ov104_0222DD6C(param0, param1, v0, param4, param3, param2, 0, param5, param6); - - return v2; + u32 otID = LCRNG_Next() | (LCRNG_Next() << 16); + return ov104_0222DD6C(frontierMon, narcIdx, otID, personality, ivs, item, FALSE, heapID, narcID); } void ov104_0222E330(FrontierPokemonDataDTO *param0, u16 param1[], u8 param2[], u32 param3[], u32 param4[], int param5, int param6, int param7) @@ -452,7 +443,7 @@ void ov104_0222E330(FrontierPokemonDataDTO *param0, u16 param1[], u8 param2[], u for (v0 = 0; v0 < param5; v0++) { v2 = (param2 == NULL) ? 0 : param2[v0]; v1 = (param3 == NULL) ? 0 : param3[v0]; - v1 = ov104_0222E2F0(¶m0[v0], param1[v0], v0, v2, v1, param6, param7); + v1 = BattleFrontier_LoadOpponentMonData(¶m0[v0], param1[v0], v0, v2, v1, param6, param7); if (param4 != NULL) { param4[v0] = v1; diff --git a/src/overlay104/ov104_0222ECE8.c b/src/overlay104/ov104_0222ECE8.c index 4f110438417..c1ddb2c8b09 100644 --- a/src/overlay104/ov104_0222ECE8.c +++ b/src/overlay104/ov104_0222ECE8.c @@ -6,13 +6,13 @@ #include "struct_decls/struct_0203041C_decl.h" #include "struct_decls/struct_020305B8_decl.h" +#include "overlay104/battle_hall.h" #include "overlay104/ov104_0223A7F4.h" #include "overlay104/ov104_0223B6F4.h" #include "overlay104/ov104_0223BCBC.h" #include "overlay104/struct_battle_arcade.h" #include "overlay104/struct_battle_castle.h" #include "overlay104/struct_battle_factory.h" -#include "overlay104/struct_battle_hall.h" #include "battle_frontier_save.h" #include "battle_frontier_stats.h" @@ -195,7 +195,7 @@ BOOL ov104_0222EDA8(BattleHall *param0) v1 = 0; for (v0 = 0; v0 < (10 * 2); v0++) { - v2[v0] = param0->unk_268[v0]; + v2[v0] = param0->monIndices[v0]; } v1 += (10 * 2); @@ -227,7 +227,7 @@ void ov104_0222EDDC(int param0, int param1, void *param2, void *param3) } for (v0 = 0; v0 < (10 * 2); v0++) { - v2->unk_268[v0] = v3[v0]; + v2->monIndices[v0] = v3[v0]; } v1 += (10 * 2); diff --git a/src/overlay104/ov104_02231F74.c b/src/overlay104/ov104_02231F74.c index 9d3117c1e32..4fa3f131ec5 100644 --- a/src/overlay104/ov104_02231F74.c +++ b/src/overlay104/ov104_02231F74.c @@ -944,12 +944,12 @@ void ov104_022330F0(FrontierGraphics *param0, ManagedSprite *param1) Sprite_DeleteAndFreeResources(param1); } -void ov104_022330FC(FrontierScriptContext *ctx, u16 *args) +void BattleFrontier_PrintNormalTrainerMessage(FrontierScriptContext *ctx, u16 *args) { - ov104_0223310C(ctx, args, TEXT_BANK_FRONTIER_TRAINER_MESSAGES); + BattleFrontier_PrintTrainerMessage(ctx, args, TEXT_BANK_FRONTIER_TRAINER_MESSAGES); } -void ov104_0223310C(FrontierScriptContext *ctx, u16 *args, u32 bankID) +void BattleFrontier_PrintTrainerMessage(FrontierScriptContext *ctx, u16 *args, u32 bankID) { MessageLoader *msgLoader; FieldFrontierDTO *fieldData = BattleFrontier_GetFieldData(ctx->scriptMan->frontier); diff --git a/src/overlay104/ov104_022395F0.c b/src/overlay104/ov104_022395F0.c index 3416e65e4d4..bde4f10ec2c 100644 --- a/src/overlay104/ov104_022395F0.c +++ b/src/overlay104/ov104_022395F0.c @@ -38,13 +38,13 @@ BOOL FrontierScrCmd_AA(FrontierScriptContext *param0) FieldFrontierDTO *fieldData = BattleFrontier_GetFieldData(param0->scriptMan->frontier); UnkStruct_0209BBA4 *v0 = ov104_02239C58(fieldData->saveData); - sub_0209B980(param0->scriptMan->frontier, v0); + BattleFrontier_SetFacilityStruct(param0->scriptMan->frontier, v0); return 0; } BOOL FrontierScrCmd_AB(FrontierScriptContext *param0) { - UnkStruct_0209BBA4 *v0 = sub_0209B978(param0->scriptMan->frontier); + UnkStruct_0209BBA4 *v0 = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); ov104_02239C7C(v0); return 0; @@ -58,7 +58,7 @@ BOOL FrontierScrCmd_AC(FrontierScriptContext *param0) u16 v3 = FrontierScriptContext_GetVar(param0); u16 *v4 = FrontierScriptContext_TryGetVarPointer(param0); - v0 = sub_0209B978(param0->scriptMan->frontier); + v0 = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); *v4 = ov104_02239C88(v0, v1, v2, v3); return 1; @@ -76,7 +76,7 @@ BOOL FrontierScrCmd_AD(FrontierScriptContext *param0) static BOOL ov104_02239680(FrontierScriptContext *param0) { - UnkStruct_0209BBA4 *v0 = sub_0209B978(param0->scriptMan->frontier); + UnkStruct_0209BBA4 *v0 = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); if (v0->unk_6F >= 2) { v0->unk_6F = 0; @@ -92,7 +92,7 @@ BOOL FrontierScrCmd_AE(FrontierScriptContext *param0) u16 v1 = FrontierScriptContext_GetVar(param0); u16 *v2 = FrontierScriptContext_TryGetVarPointer(param0); - v0 = sub_0209B978(param0->scriptMan->frontier); + v0 = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); if (v1 == v0->unk_6E) { *v2 = 1; @@ -111,7 +111,7 @@ BOOL FrontierScrCmd_AF(FrontierScriptContext *param0) u16 v3 = FrontierScriptContext_GetVar(param0); u16 *v4 = FrontierScriptContext_TryGetVarPointer(param0); - v0 = sub_0209B978(param0->scriptMan->frontier); + v0 = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); fieldData = BattleFrontier_GetFieldData(param0->scriptMan->frontier); v0->fieldSystem = fieldData->fieldSystem; @@ -130,7 +130,7 @@ BOOL FrontierScrCmd_B0(FrontierScriptContext *param0) u16 *v3 = FrontierScriptContext_TryGetVarPointer(param0); u16 *v4 = FrontierScriptContext_TryGetVarPointer(param0); - v1 = sub_0209B978(param0->scriptMan->frontier); + v1 = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); if (v1->partyMenu->selectedMonSlot == 7) { *v3 = 0xff; @@ -160,7 +160,7 @@ BOOL FrontierScrCmd_B1(FrontierScriptContext *param0) UnkStruct_0209BBA4 *v0; u16 *v1 = FrontierScriptContext_TryGetVarPointer(param0); - v0 = sub_0209B978(param0->scriptMan->frontier); + v0 = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); *v1 = v0->unk_59; return 0; @@ -178,7 +178,7 @@ BOOL FrontierScrCmd_B2(FrontierScriptContext *param0) u8 v8 = FrontierScriptContext_ReadByte(param0); u16 *v9 = FrontierScriptContext_TryGetVarPointer(param0); - v4 = sub_0209B978(param0->scriptMan->frontier); + v4 = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); fieldData = BattleFrontier_GetFieldData(param0->scriptMan->frontier); switch (v6) { @@ -307,13 +307,13 @@ BOOL FrontierScrCmd_B3(FrontierScriptContext *param0) UnkStruct_0209BBA4 v4; fieldData = BattleFrontier_GetFieldData(param0->scriptMan->frontier); - v3 = sub_0209B978(param0->scriptMan->frontier); + v3 = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); v4 = *v3; ov104_02239C7C(v3); battleTower = BattleTower_Init(fieldData->saveData, 0, BATTLE_TOWER_MODE_6); - sub_0209B980(param0->scriptMan->frontier, battleTower); + BattleFrontier_SetFacilityStruct(param0->scriptMan->frontier, battleTower); if (battleTower->challengeMode == BATTLE_TOWER_MODE_6) { BattleFrontier_FlagGeonetLinkInfo(fieldData->saveData); @@ -347,7 +347,7 @@ BOOL FrontierScrCmd_B4(FrontierScriptContext *param0) BattleTower *battleTower; u16 *v1 = FrontierScriptContext_TryGetVarPointer(param0); - battleTower = sub_0209B978(param0->scriptMan->frontier); + battleTower = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); *v1 = sub_0209BB08(battleTower); return 1; @@ -361,7 +361,7 @@ BOOL FrontierScrCmd_B5(FrontierScriptContext *param0) static BOOL ov104_02239C20(FrontierScriptContext *param0) { - BattleTower *battleTower = sub_0209B978(param0->scriptMan->frontier); + BattleTower *battleTower = BattleFrontier_GetFacilityStruct(param0->scriptMan->frontier); if (battleTower->unk_8D4 < 2) { return 0; @@ -373,7 +373,7 @@ static BOOL ov104_02239C20(FrontierScriptContext *param0) BOOL FrontierScrCmd_ClearTowerStruct(FrontierScriptContext *ctx) { - BattleTower *battleTower = sub_0209B978(ctx->scriptMan->frontier); + BattleTower *battleTower = BattleFrontier_GetFacilityStruct(ctx->scriptMan->frontier); BattleTower_Free(battleTower); battleTower = NULL; diff --git a/src/overlay104/ov104_0223AF58.c b/src/overlay104/ov104_0223AF58.c deleted file mode 100644 index 5581bb6c1be..00000000000 --- a/src/overlay104/ov104_0223AF58.c +++ /dev/null @@ -1,1868 +0,0 @@ -#include "overlay104/ov104_0223AF58.h" - -#include -#include - -#include "constants/battle_frontier.h" -#include "generated/ai_flags.h" -#include "generated/frontier_trainers.h" - -#include "overlay104/ov104_0222DCE0.h" -#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" -#include "heap.h" -#include "item_use_pokemon.h" -#include "math_util.h" -#include "party.h" -#include "pokemon.h" - -typedef struct { - u8 unk_00; - u8 unk_01; - u16 unk_02; -} UnkStruct_ov104_0224033C; - -typedef struct { - u16 unk_00; - u16 unk_02; -} UnkStruct_ov104_02240364; - -void FieldBattleDTO_CopyPlayerInfoToTrainerData(FieldBattleDTO *param0); -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); -u8 BattleHall_GetPlayerPartySize(u8 challengeType); -u8 BattleHall_GetOpponentPartySize(u8 challengeType); -static u32 BattleHall_GetBattleType(u8 challengeType); -static void ov104_0223B518(FrontierPokemonDataDTO *param0, u8 param1, u16 param2, u16 param3[], int param4, int param5, int param6); -static u32 BattleHall_GetOpponentLevel(BattleHall *battleHall, u8 param1); -u8 ov104_0223B5C0(BattleHall *battleHall); -static u8 ov104_0223B5F0(u8 param0); -static u16 BattleHall_GetAIMask(BattleHall *battleHall, u8 param1, u8 rank); -static u16 ov104_0223B644(u8 param0); -u16 BattleHall_GetHighestLevelInParty(BattleHall *battleHall); -static BOOL ov104_0223B4A4(BattleHall *battleHall, u8 param1); - -static const u16 Unk_ov104_0224041C[10][8] = { - { 0x2, 0x3, 0x14, 0x15, 0x25, 0x24, 0x16, 0x1C }, - { 0x2, 0x3, 0x51, 0x1A, 0x13, 0x50, 0x16, 0x1C }, - { 0x20, 0x21, 0x14, 0x15, 0x25, 0x24, 0x3A, 0x55 }, - { 0x20, 0x21, 0x51, 0x1A, 0x13, 0x50, 0x3A, 0x55 }, - { 0x4, 0x5, 0x47, 0x12, 0x22, 0x23, 0x25, 0x24 }, - { 0x4, 0x5, 0x10, 0x11, 0x22, 0x23, 0x39, 0x34 }, - { 0x3C, 0x3D, 0x47, 0x12, 0x14, 0x15, 0x13, 0x50 }, - { 0x3C, 0x3D, 0x10, 0x11, 0x14, 0x15, 0x39, 0x34 }, - { 0x18, 0x19, 0x47, 0x12, 0x27, 0x28, 0x33, 0x1B }, - { 0x18, 0x19, 0x10, 0x11, 0x27, 0x28, 0x33, 0x1B } -}; - -static const u16 Unk_ov104_0224038C[18][4] = { - { 0x14, 0x15, 0x2, 0x3 }, - { 0x1B, 0x1B, 0x26, 0x26 }, - { 0x2C, 0x2D, 0x2E, 0xB }, - { 0x16, 0x16, 0x3B, 0x3B }, - { 0x7, 0x7, 0x4, 0x5 }, - { 0x35, 0x35, 0x36, 0x36 }, - { 0xE, 0xE, 0xA, 0xA }, - { 0x1C, 0x1C, 0x29, 0x29 }, - { 0x9, 0x9, 0x30, 0x30 }, - { 0x1E, 0x1E, 0x1E, 0x1E }, - { 0x31, 0x31, 0x32, 0x32 }, - { 0x6, 0x6, 0x6, 0x6 }, - { 0x9, 0x9, 0x30, 0x30 }, - { 0x31, 0x31, 0x32, 0x32 }, - { 0x1D, 0x1D, 0x1D, 0x1D }, - { 0x39, 0x39, 0x34, 0x34 }, - { 0x54, 0x53, 0xC, 0xD }, - { 0x55, 0x3A, 0x51, 0x1A } -}; - -static const u16 Unk_ov104_022404BC[] = { - 0x2, - 0x2, - 0x2, - 0x3, - 0x3, - 0x3, - 0x3C, - 0x3C, - 0x3C, - 0x3D, - 0x3D, - 0x3D, - 0x20, - 0x20, - 0x20, - 0x21, - 0x21, - 0x21, - 0x4, - 0x4, - 0x4, - 0x5, - 0x5, - 0x5, - 0x2C, - 0x2C, - 0x2C, - 0x2D, - 0x2D, - 0x2D, - 0x34, - 0x34, - 0x34, - 0x55, - 0x55, - 0x55, - 0x14, - 0x14, - 0x14, - 0x15, - 0x15, - 0x15, - 0x51, - 0x51, - 0x51, - 0x1A, - 0x1A, - 0x1A, - 0x6, - 0x6, - 0x6, - 0x1C, - 0x1C, - 0x1C, - 0x16, - 0x16, - 0x16, - 0xB, - 0xB, - 0x30, - 0x30, - 0x25, - 0x25, - 0x50, - 0x50, - 0x50, - 0x24, - 0x24, - 0x24, - 0x7, - 0x7, - 0x7, - 0x34, - 0x34, - 0x1E, - 0x1E, - 0x1E, - 0x2E, - 0x2E, - 0x9, - 0x9, - 0x55, - 0x55, - 0x55, - 0x13, - 0x13, - 0x3B, - 0x3B, - 0x47, - 0x47, - 0x47, - 0x12, - 0x12, - 0x12, - 0x53, - 0x53, - 0x53, - 0x54, - 0x54, - 0x54, - 0xC, - 0xC, - 0xD, - 0xD, - 0xE, - 0xE, - 0xA, - 0xA, - 0xE, - 0xE, - 0xE, - 0xA, - 0xA, - 0xA, - 0x1B, - 0x1B, - 0x1B, - 0x23, - 0x23, - 0x23, - 0x31, - 0x31, - 0x31, - 0x32, - 0x32, - 0x32, - 0x10, - 0x10, - 0x10, - 0x11, - 0x11, - 0x11, - 0x22, - 0x22, - 0x39, - 0x39, - 0x29, - 0x29, - 0x3A, - 0x3A, - 0x18, - 0x18, - 0x18, - 0x19, - 0x19, - 0x19, - 0x27, - 0x27, - 0x27, - 0x28, - 0x28, - 0x28, - 0x1D, - 0x1D, - 0x1D, - 0x1D, - 0x35, - 0x35, - 0x36, - 0x36, - 0x2, - 0x2, - 0x3, - 0x3, - 0x3C, - 0x3C, - 0x3D, - 0x3D, - 0x20, - 0x20, - 0x21, - 0x21, - 0x6, - 0x6, - 0x1C, - 0x1C, - 0x16, - 0x16, - 0x55, - 0x55, - 0x13, - 0x13, - 0xB, - 0xB, - 0x30, - 0x30, - 0x25, - 0x25, - 0x34, - 0x34, - 0x1E, - 0x1E, - 0x2E, - 0x2E, - 0x9, - 0x9, - 0x26, - 0x26, - 0x33, - 0x33, - 0x4, - 0x4, - 0x5, - 0x5, - 0x34, - 0x34, - 0x55, - 0x55, - 0x14, - 0x14, - 0x15, - 0x15, - 0x47, - 0x47, - 0x12, - 0x12, - 0x10, - 0x10, - 0x11, - 0x11, - 0x18, - 0x18, - 0x19, - 0x19, - 0x35, - 0x35, - 0x36, - 0x36, - 0x27, - 0x27, - 0x28, - 0x28, - 0x1D, - 0x1D, - 0xE, - 0xE, - 0xA, - 0xA, - 0x1B, - 0x1B, - 0x23, - 0x23, - 0x31, - 0x31, - 0x32, - 0x32, - 0x51, - 0x51, - 0x1A, - 0x1A, - 0x53, - 0x53, - 0x54, - 0x54, - 0xC, - 0xC, - 0xD, - 0xD, - 0x33, - 0x33, - 0x55, - 0x55, - 0x13, - 0x13, - 0xB, - 0xB, - 0x2E, - 0x2E, - 0x9, - 0x9, - 0x30, - 0x30, - 0x34, - 0x34, - 0x25, - 0x25, - 0x39, - 0x39, - 0x29, - 0x29, - 0x22, - 0x22, - 0x3B, - 0x3B, - 0x3A, - 0x3A, - 0x26, - 0x26, - 0x33, - 0x33, - 0x1E, - 0x1E, - 0x50, - 0x50, - 0x24, - 0x24, - 0x7, - 0x7, - 0x55, - 0x55 -}; - -static const u16 Unk_ov104_02240ACE[][2] = { - { 0xC, 0x3 }, - { 0xA, 0xA }, - { 0xB, 0xB }, - { 0x6, 0x6 }, - { 0x6, 0x6 }, - { 0x6, 0x3 }, - { 0x6, 0x3 }, - { 0x0, 0x2 }, - { 0x0, 0x0 }, - { 0x0, 0x2 }, - { 0x3, 0x3 }, - { 0xD, 0xD }, - { 0x4, 0x4 }, - { 0x3, 0x3 }, - { 0x3, 0x3 }, - { 0x0, 0x0 }, - { 0xA, 0xA }, - { 0x0, 0x0 }, - { 0x3, 0x2 }, - { 0xC, 0x3 }, - { 0x6, 0xC }, - { 0x6, 0x3 }, - { 0x4, 0x4 }, - { 0x0, 0x0 }, - { 0xB, 0xB }, - { 0x1, 0x1 }, - { 0xB, 0xB }, - { 0xE, 0xE }, - { 0x1, 0x1 }, - { 0xC, 0x3 }, - { 0xB, 0x3 }, - { 0x5, 0x4 }, - { 0xB, 0xE }, - { 0xD, 0x8 }, - { 0x0, 0x2 }, - { 0xB, 0xB }, - { 0x3, 0x3 }, - { 0xB, 0xB }, - { 0x7, 0x3 }, - { 0xE, 0xE }, - { 0xB, 0xB }, - { 0xD, 0xD }, - { 0xC, 0xE }, - { 0x4, 0x4 }, - { 0xB, 0xB }, - { 0xB, 0xB }, - { 0xB, 0xB }, - { 0x0, 0x0 }, - { 0x0, 0x0 }, - { 0x10, 0x10 }, - { 0xC, 0xC }, - { 0xA, 0xA }, - { 0xB, 0xB }, - { 0x0, 0x0 }, - { 0x0, 0x2 }, - { 0x6, 0x2 }, - { 0x6, 0x3 }, - { 0xB, 0xD }, - { 0xD, 0xD }, - { 0x0, 0x0 }, - { 0x0, 0x0 }, - { 0x0, 0x0 }, - { 0xE, 0x2 }, - { 0xD, 0xD }, - { 0xB, 0xB }, - { 0xC, 0x2 }, - { 0xC, 0xC }, - { 0xB, 0x4 }, - { 0xE, 0xE }, - { 0x6, 0x6 }, - { 0x0, 0x0 }, - { 0x0, 0x0 }, - { 0xA, 0xA }, - { 0xF, 0x4 }, - { 0xB, 0xB }, - { 0xF, 0x2 }, - { 0x11, 0xA }, - { 0x4, 0x4 }, - { 0x0, 0x0 }, - { 0x1, 0x1 }, - { 0xF, 0xE }, - { 0x5, 0x4 }, - { 0xC, 0xC }, - { 0xA, 0xA }, - { 0xB, 0xB }, - { 0x11, 0x11 }, - { 0x0, 0x0 }, - { 0x6, 0x6 }, - { 0x6, 0x6 }, - { 0x6, 0x6 }, - { 0xB, 0xC }, - { 0xC, 0xC }, - { 0x0, 0x2 }, - { 0xB, 0x2 }, - { 0xE, 0xE }, - { 0xE, 0xE }, - { 0x6, 0xB }, - { 0xC, 0xC }, - { 0x0, 0x0 }, - { 0x6, 0x4 }, - { 0x6, 0x7 }, - { 0x0, 0x0 }, - { 0x1, 0x1 }, - { 0x0, 0x0 }, - { 0x0, 0x0 }, - { 0x8, 0x5 }, - { 0x1, 0xE }, - { 0xD, 0xD }, - { 0x3, 0x3 }, - { 0xB, 0x11 }, - { 0xA, 0x4 }, - { 0xE, 0xE }, - { 0x4, 0x4 }, - { 0xC, 0xC }, - { 0x0, 0x2 }, - { 0xB, 0x4 }, - { 0xB, 0xB }, - { 0x4, 0xE }, - { 0xB, 0xB }, - { 0x7, 0x7 }, - { 0x7, 0x7 }, - { 0xE, 0xE }, - { 0xF, 0xF }, - { 0xF, 0xB }, - { 0xB, 0xB }, - { 0x10, 0x10 }, - { 0x8, 0xE }, - { 0xC, 0xC }, - { 0xA, 0xA }, - { 0xB, 0xB }, - { 0x0, 0x2 }, - { 0x0, 0x0 }, - { 0x6, 0x6 }, - { 0xD, 0xD }, - { 0xC, 0x3 }, - { 0x6, 0x6 }, - { 0x6, 0x2 }, - { 0xB, 0xB }, - { 0xC, 0xC }, - { 0xB, 0xB }, - { 0x0, 0x0 }, - { 0xE, 0xE }, - { 0x3, 0x11 }, - { 0x8, 0xE }, - { 0x5, 0x5 }, - { 0xE, 0xE }, - { 0x0, 0x0 }, - { 0x10, 0x4 }, - { 0x1, 0x1 }, - { 0x4, 0x4 }, - { 0x3, 0x6 }, - { 0x3, 0x1 }, - { 0xB, 0xB }, - { 0xC, 0xF }, - { 0xC, 0x3 }, - { 0xA, 0xA }, - { 0xB, 0xB }, - { 0x6, 0x2 }, - { 0x6, 0x3 }, - { 0x0, 0x2 }, - { 0x0, 0x0 }, - { 0x3, 0x3 }, - { 0x3, 0x3 }, - { 0x3, 0x3 }, - { 0x0, 0x0 }, - { 0xC, 0x3 }, - { 0x6, 0xC }, - { 0x4, 0x4 }, - { 0xA, 0xA }, - { 0xB, 0xB }, - { 0xE, 0xE }, - { 0x1, 0x1 }, - { 0xC, 0x3 }, - { 0x5, 0x4 }, - { 0xA, 0xA }, - { 0x0, 0x2 }, - { 0x7, 0x3 }, - { 0x5, 0x4 }, - { 0x4, 0x4 }, - { 0x0, 0x0 }, - { 0x3, 0x3 }, - { 0x4, 0x5 }, - { 0xC, 0xC }, - { 0xB, 0xB }, - { 0x0, 0x0 }, - { 0x5, 0xB }, - { 0x5, 0xB }, - { 0x10, 0x10 }, - { 0xC, 0xC }, - { 0xA, 0xA }, - { 0xB, 0xB }, - { 0x0, 0x0 }, - { 0x6, 0x2 }, - { 0x6, 0x3 }, - { 0x0, 0x2 }, - { 0xD, 0xD }, - { 0xB, 0xB }, - { 0x5, 0x5 }, - { 0xC, 0x2 }, - { 0x0, 0x0 }, - { 0xC, 0xC }, - { 0x6, 0x2 }, - { 0xB, 0x4 }, - { 0x11, 0x2 }, - { 0x7, 0x7 }, - { 0xE, 0xE }, - { 0x0, 0x0 }, - { 0x4, 0x2 }, - { 0xB, 0x3 }, - { 0x11, 0xF }, - { 0xA, 0x5 }, - { 0xB, 0x5 }, - { 0xD, 0xD }, - { 0xA, 0xA }, - { 0x5, 0x4 }, - { 0xC, 0xC }, - { 0xA, 0x1 }, - { 0xB, 0x4 }, - { 0x11, 0x11 }, - { 0x0, 0x0 }, - { 0x6, 0x2 }, - { 0x6, 0x3 }, - { 0xB, 0xC }, - { 0xC, 0x11 }, - { 0x0, 0x2 }, - { 0xB, 0x2 }, - { 0x6, 0x2 }, - { 0x0, 0x0 }, - { 0x5, 0x5 }, - { 0x0, 0x0 }, - { 0x11, 0x7 }, - { 0x8, 0x8 }, - { 0x8, 0x5 }, - { 0x1, 0xE }, - { 0xD, 0xD }, - { 0xD, 0xD }, - { 0x6, 0x6 }, - { 0x6, 0x6 }, - { 0xC, 0x3 }, - { 0xB, 0xB }, - { 0x0, 0x0 }, - { 0x4, 0x10 }, - { 0x5, 0xC }, - { 0x5, 0x6 }, - { 0x0, 0x0 }, - { 0xE, 0xE }, - { 0xF, 0xB }, - { 0xB, 0xB }, - { 0x10, 0x10 }, - { 0x8, 0xE }, - { 0xC, 0xC }, - { 0xA, 0x1 }, - { 0xB, 0xB }, - { 0x0, 0x2 }, - { 0x0, 0xB }, - { 0x6, 0x6 }, - { 0xD, 0xD }, - { 0x5, 0x5 }, - { 0x5, 0x8 }, - { 0x6, 0xC }, - { 0x6, 0x2 }, - { 0xD, 0xD }, - { 0x7, 0x2 }, - { 0x0, 0x0 }, - { 0x0, 0x2 }, - { 0x10, 0x4 }, - { 0x0, 0x0 }, - { 0xB, 0x2 }, - { 0x6, 0x4 }, - { 0x6, 0x8 }, - { 0xD, 0xD }, - { 0x4, 0x4 }, - { 0x3, 0x4 }, - { 0x3, 0x4 }, - { 0x0, 0x0 }, - { 0x3, 0x2 }, - { 0xC, 0x3 }, - { 0x6, 0x3 }, - { 0x0, 0x0 }, - { 0x1, 0x1 }, - { 0xE, 0xE }, - { 0xC, 0x3 }, - { 0x5, 0x4 }, - { 0xB, 0xE }, - { 0xD, 0x8 }, - { 0x0, 0x2 }, - { 0xB, 0xF }, - { 0xE, 0xE }, - { 0xB, 0xB }, - { 0xD, 0xD }, - { 0x1, 0x1 }, - { 0x1, 0x1 }, - { 0x3, 0x3 }, - { 0x4, 0x5 }, - { 0x0, 0x0 }, - { 0x0, 0x0 }, - { 0xB, 0xB }, - { 0xB, 0xB }, - { 0xE, 0xE }, - { 0xF, 0xE }, - { 0xD, 0xD }, - { 0xA, 0xA }, - { 0x0, 0x0 }, - { 0x5, 0xB }, - { 0x5, 0xB }, - { 0x0, 0x2 }, - { 0xB, 0xD }, - { 0xE, 0x2 }, - { 0xC, 0xC }, - { 0xC, 0x2 }, - { 0xB, 0xE }, - { 0x0, 0xE }, - { 0x6, 0x8 }, - { 0x0, 0x0 }, - { 0xF, 0x4 }, - { 0xB, 0xB }, - { 0xB, 0x2 }, - { 0x8, 0x2 }, - { 0x0, 0x0 }, - { 0x1, 0x1 }, - { 0x0, 0x0 }, - { 0xB, 0xC }, - { 0xC, 0x11 }, - { 0xC, 0x1 }, - { 0x0, 0x0 }, - { 0x6, 0x2 }, - { 0x0, 0x0 }, - { 0x1, 0x1 }, - { 0xD, 0xD }, - { 0x3, 0x3 }, - { 0xB, 0x11 }, - { 0xA, 0x4 }, - { 0xA, 0xA }, - { 0xE, 0xE }, - { 0xC, 0x11 }, - { 0x10, 0x2 }, - { 0x0, 0x0 }, - { 0x3, 0x3 }, - { 0x5, 0xE }, - { 0x5, 0xE }, - { 0xB, 0x4 }, - { 0xB, 0x11 }, - { 0x5, 0xC }, - { 0x5, 0x6 }, - { 0x0, 0x0 }, - { 0x7, 0x7 }, - { 0x7, 0x7 }, - { 0xC, 0x2 }, - { 0x11, 0x11 }, - { 0xF, 0xF }, - { 0xB, 0xB }, - { 0xB, 0xB }, - { 0xB, 0x5 }, - { 0x0, 0x2 }, - { 0x5, 0x5 }, - { 0x5, 0x8 }, - { 0x6, 0x2 }, - { 0xB, 0xB }, - { 0xC, 0xC }, - { 0xB, 0x4 }, - { 0x0, 0x0 }, - { 0x7, 0x2 }, - { 0x0, 0x0 }, - { 0x7, 0x7 }, - { 0x0, 0x0 }, - { 0x3, 0x11 }, - { 0x7, 0x11 }, - { 0x3, 0x1 }, - { 0xC, 0xC }, - { 0xB, 0xB }, - { 0xC, 0xF }, - { 0xF, 0x7 }, - { 0xD, 0x7 }, - { 0x0, 0x2 }, - { 0x0, 0x2 }, - { 0xB, 0xB }, - { 0xA, 0xA }, - { 0xB, 0xB }, - { 0xA, 0xA }, - { 0xB, 0x1 }, - { 0x1, 0x1 }, - { 0xB, 0x3 }, - { 0xA, 0xA }, - { 0x3, 0x3 }, - { 0xB, 0xF }, - { 0x7, 0x3 }, - { 0xC, 0xE }, - { 0xB, 0xE }, - { 0x6, 0x2 }, - { 0x6, 0x6 }, - { 0xB, 0x2 }, - { 0xB, 0xF }, - { 0xB, 0xB }, - { 0xD, 0xD }, - { 0xA, 0xA }, - { 0x5, 0x2 }, - { 0x0, 0x0 }, - { 0xF, 0x2 }, - { 0xD, 0x2 }, - { 0xA, 0x2 }, - { 0x10, 0x2 }, - { 0xC, 0xC }, - { 0xA, 0xA }, - { 0xB, 0xB }, - { 0x3, 0x2 }, - { 0xD, 0xD }, - { 0xB, 0xB }, - { 0xE, 0xE }, - { 0x11, 0x11 }, - { 0x8, 0x4 }, - { 0x6, 0x8 }, - { 0x6, 0x5 }, - { 0x6, 0x1 }, - { 0x0, 0x0 }, - { 0x11, 0xA }, - { 0xB, 0x10 }, - { 0x4, 0x4 }, - { 0x0, 0x0 }, - { 0x0, 0x0 }, - { 0xD, 0xD }, - { 0xA, 0xA }, - { 0xB, 0xB }, - { 0x5, 0x11 }, - { 0xC, 0xC }, - { 0xA, 0x1 }, - { 0xB, 0x4 }, - { 0xE, 0xE }, - { 0x0, 0x0 }, - { 0x8, 0x5 }, - { 0xB, 0xB }, - { 0x4, 0x10 }, - { 0x4, 0xE }, - { 0xB, 0xB }, - { 0xF, 0xB }, - { 0xE, 0xE }, - { 0x10, 0x2 }, - { 0x8, 0xE }, - { 0x5, 0x5 }, - { 0xF, 0xF }, - { 0x8, 0x8 }, - { 0x10, 0xE }, - { 0x10, 0xE }, - { 0xC, 0x4 }, - { 0xA, 0x1 }, - { 0xB, 0x8 }, - { 0xD, 0xD }, - { 0xC, 0x3 }, - { 0x11, 0x2 }, - { 0x8, 0xE }, - { 0x10, 0x4 }, - { 0x1, 0x8 }, - { 0x4, 0x4 }, - { 0x3, 0x11 }, - { 0x11, 0xF }, - { 0xD, 0x8 }, - { 0x0, 0x0 }, - { 0x4, 0x5 }, - { 0xC, 0xC }, - { 0xD, 0xD }, - { 0xA, 0xA }, - { 0x0, 0x2 }, - { 0x6, 0x2 }, - { 0xC, 0xC }, - { 0xF, 0xF }, - { 0x4, 0x2 }, - { 0xF, 0x4 }, - { 0x0, 0x0 }, - { 0xE, 0x1 }, - { 0x5, 0x8 }, - { 0x7, 0x7 }, - { 0xE, 0xE }, - { 0xE, 0xE }, - { 0xE, 0xE }, - { 0xA, 0x8 }, - { 0xC, 0x3 }, - { 0xA, 0x2 }, - { 0x0, 0x0 } -}; - -static const u16 Unk_ov104_02240714[] = { - 0x1, - 0x4, - 0x7, - 0xA, - 0xB, - 0xD, - 0xE, - 0x10, - 0x13, - 0x15, - 0x17, - 0x19, - 0x1B, - 0x1D, - 0x20, - 0x23, - 0x25, - 0x27, - 0x29, - 0x2B, - 0x2E, - 0x30, - 0x32, - 0x34, - 0x36, - 0x38, - 0x3C, - 0x3F, - 0x42, - 0x45, - 0x48, - 0x4A, - 0x4F, - 0x51, - 0x54, - 0x56, - 0x58, - 0x5A, - 0x5C, - 0x60, - 0x62, - 0x64, - 0x66, - 0x68, - 0x74, - 0x76, - 0x81, - 0x84, - 0x85, - 0x93, - 0x98, - 0x9B, - 0x9E, - 0xA1, - 0xA3, - 0xA5, - 0xA7, - 0xAA, - 0xAC, - 0xAD, - 0xAE, - 0xAF, - 0xB1, - 0xB3, - 0xB7, - 0xBB, - 0xBF, - 0xC2, - 0xC9, - 0xCC, - 0xD1, - 0xD8, - 0xDA, - 0xDC, - 0xDF, - 0xE1, - 0xE4, - 0xE7, - 0xEB, - 0xEC, - 0xEE, - 0xF6, - 0xFC, - 0xFF, - 0x102, - 0x105, - 0x107, - 0x109, - 0x10A, - 0x10C, - 0x10E, - 0x111, - 0x114, - 0x116, - 0x118, - 0x119, - 0x11B, - 0x11D, - 0x11F, - 0x122, - 0x124, - 0x125, - 0x128, - 0x12A, - 0x12C, - 0x130, - 0x133, - 0x135, - 0x13C, - 0x13E, - 0x142, - 0x145, - 0x148, - 0x14B, - 0x14D, - 0x153, - 0x155, - 0x157, - 0x15D, - 0x161, - 0x163, - 0x168, - 0x169, - 0x16B, - 0x172, - 0x173, - 0x176, - 0x183, - 0x186, - 0x189, - 0x18C, - 0x18F, - 0x191, - 0x193, - 0x196, - 0x19C, - 0x19F, - 0x1A2, - 0x1A4, - 0x1A6, - 0x1AF, - 0x1B1, - 0x1B2, - 0x1B4, - 0x1B6, - 0x1B7, - 0x1B8, - 0x1BB, - 0x1BF, - 0x1C1, - 0x1C3, - 0x1C5, - 0x1C8, - 0x1CB, - 0x2, - 0x5, - 0x8, - 0xC, - 0xF, - 0x11, - 0x14, - 0x18, - 0x1E, - 0x21, - 0x28, - 0x2C, - 0x2F, - 0x33, - 0x3A, - 0x3D, - 0x40, - 0x43, - 0x46, - 0x4B, - 0x4D, - 0x53, - 0x5D, - 0x5F, - 0x69, - 0x6C, - 0x6D, - 0x6F, - 0x72, - 0x78, - 0x89, - 0x8A, - 0x8C, - 0x94, - 0x99, - 0x9C, - 0x9F, - 0xA2, - 0xA6, - 0xA8, - 0xB0, - 0xB4, - 0xB8, - 0xB9, - 0xBC, - 0xBE, - 0xC0, - 0xC1, - 0xC3, - 0xC6, - 0xC8, - 0xCA, - 0xCE, - 0xCF, - 0xD3, - 0xD7, - 0xDB, - 0xDE, - 0xEF, - 0xF0, - 0xF7, - 0xFD, - 0x100, - 0x103, - 0x106, - 0x108, - 0x10B, - 0x10D, - 0x10F, - 0x112, - 0x115, - 0x117, - 0x11C, - 0x126, - 0x12B, - 0x12D, - 0x12E, - 0x12F, - 0x131, - 0x134, - 0x137, - 0x138, - 0x139, - 0x13A, - 0x13B, - 0x140, - 0x147, - 0x149, - 0x159, - 0x15B, - 0x15F, - 0x166, - 0x16C, - 0x16E, - 0x174, - 0x177, - 0x184, - 0x187, - 0x18A, - 0x18D, - 0x190, - 0x192, - 0x194, - 0x198, - 0x19A, - 0x19D, - 0x19E, - 0x1A1, - 0x1A9, - 0x1AB, - 0x1B9, - 0x1BC, - 0x1BE, - 0x1CA, - 0x19D, - 0x19D, - 0x1A, - 0x1C, - 0x1F, - 0x22, - 0x24, - 0x2A, - 0x2D, - 0x31, - 0x35, - 0x39, - 0x41, - 0x47, - 0x4C, - 0x50, - 0x52, - 0x55, - 0x57, - 0x61, - 0x63, - 0x65, - 0x6A, - 0x6B, - 0x6E, - 0x70, - 0x71, - 0x73, - 0x75, - 0x77, - 0x7A, - 0x7C, - 0x7D, - 0x7E, - 0x80, - 0x8B, - 0x8D, - 0xA4, - 0xAB, - 0xB2, - 0xB6, - 0xBD, - 0xC7, - 0xCB, - 0xCD, - 0xD2, - 0xDD, - 0xE0, - 0xE2, - 0xE3, - 0xEA, - 0xED, - 0xF1, - 0x110, - 0x113, - 0x11E, - 0x120, - 0x123, - 0x127, - 0x129, - 0x136, - 0x13D, - 0x13F, - 0x143, - 0x144, - 0x146, - 0x14C, - 0x14E, - 0x14F, - 0x150, - 0x151, - 0x152, - 0x154, - 0x156, - 0x15A, - 0x15C, - 0x160, - 0x162, - 0x164, - 0x165, - 0x167, - 0x16A, - 0x16F, - 0x170, - 0x171, - 0x18E, - 0x199, - 0x19B, - 0x1A0, - 0x1A3, - 0x1A5, - 0x1A7, - 0x1A8, - 0x1AA, - 0x1AC, - 0x1AD, - 0x1B0, - 0x1B3, - 0x1BA, - 0x1C6, - 0x1C7, - 0x1C9, - 0x1CC, - 0x1DE, - 0x1DF, - 0x12, - 0x16, - 0x9, - 0x26, - 0x37, - 0x3B, - 0x3E, - 0x44, - 0x49, - 0x4E, - 0x59, - 0x5B, - 0x5E, - 0x67, - 0x79, - 0x7B, - 0x7F, - 0x82, - 0x83, - 0x86, - 0x87, - 0x88, - 0x8E, - 0x8F, - 0x90, - 0x91, - 0x92, - 0x95, - 0x9A, - 0x9D, - 0xA0, - 0xA9, - 0xB5, - 0xBA, - 0xC4, - 0xC5, - 0xD0, - 0xD4, - 0xD5, - 0xD6, - 0xD9, - 0xE5, - 0xE6, - 0xE8, - 0xE9, - 0xF2, - 0xF3, - 0xF4, - 0xF5, - 0xF8, - 0xFE, - 0x101, - 0x104, - 0x11A, - 0x121, - 0x132, - 0x141, - 0x14A, - 0x158, - 0x15E, - 0x16D, - 0x1E8, - 0x175, - 0x178, - 0x179, - 0x17A, - 0x17B, - 0x17C, - 0x17D, - 0x185, - 0x188, - 0x18B, - 0x195, - 0x197, - 0x1AE, - 0x1B5, - 0x1BD, - 0x1C0, - 0x1C2, - 0x1C4, - 0x1CD, - 0x1CE, - 0x1CF, - 0x1D0, - 0x1D1, - 0x1D2, - 0x1D3, - 0x1D4, - 0x1D5, - 0x1D6, - 0x1D7, - 0x1D8, - 0x1D9, - 0x1DA, - 0x1DB, - 0x1DC, - 0x1DD, - 0x1E0, - 0x1E1, - 0x1E2, - 0x1E5, - 0x3, - 0x6, - 0x1E6 -}; - -static const UnkStruct_ov104_0224033C Unk_ov104_0224033C[10] = { - { 0x0, 0x8, 0x0 }, - { 0x0, 0xA, 0x0 }, - { 0x0, 0xC, 0x0 }, - { 0x0, 0xE, 0x0 }, - { 0x0, 0x10, 0x0 }, - { 0x0, 0x12, 0x0 }, - { 0x0, 0x14, 0x0 }, - { 0x0, 0x16, 0x0 }, - { 0x0, 0x18, 0x0 }, - { 0x0, 0x1A, 0x0 } -}; - -void ov104_0223AF58(u8 param0, u8 param1, u8 param2, u8 param3, u16 param4[]) -{ - int v0; - u16 v1; - u8 v2, v3; - int v4 = 0; - - v2 = (param3 * 2); - v3 = ov104_0223B644(param2); - - do { - v1 = (LCRNG_Next() % (8 + 4)); - - if (v1 < 8) { - param4[v2 + v4] = Unk_ov104_0224041C[v3][v1]; - } else { - param4[v2 + v4] = Unk_ov104_0224038C[param0][v1 - 8]; - } - - v4++; - } while (v4 < param1); - - return; -} - -void ov104_0223AFB4(u8 param0, u8 param1, int param2, u8 param3, u8 param4, u16 param5[]) -{ - int v0, v1, v2, v3, v4; - u16 v5, v6; - u8 v7, v8; - - v3 = 0; - v7 = (param4 * 2); - v8 = ov104_0223B644(param3); - - if (param0 == 0) { - v2 = (param2 * 10) + (param4 + 1); - - if (v2 == 50) { - param5[v7] = FRONTIER_TRAINER_HALL_MATRON_ARGENTA_SILVER; - return; - } else if (v2 == 170) { - param5[v7] = FRONTIER_TRAINER_HALL_MATRON_ARGENTA_GOLD; - return; - } - } - - do { - v5 = (LCRNG_Next() % (NELEMS(Unk_ov104_022404BC))); - v1 = v5; - - while (TRUE) { - v4 = param5[v7 + v3]; - - if (v4 == Unk_ov104_022404BC[v5]) { - for (v0 = 0; v0 < (v7 + v3); v0++) { - if (param5[v0] == v5) { - break; - } - } - - if (v0 == (v7 + v3)) { - param5[v7 + v3] = v5; - v3++; - break; - } - } - - v5++; - - if (v5 >= (NELEMS(Unk_ov104_022404BC))) { - v5 = 0; - } - - if (v5 == v1) { - while (TRUE) { - v6 = (LCRNG_Next() % 8); - - if (v4 != Unk_ov104_0224041C[v8][v6]) { - param5[v7 + v3] = Unk_ov104_0224041C[v8][v6]; - break; - } - } - } - } - } while (v3 < param1); - - return; -} - -static const UnkStruct_ov104_02240364 Unk_ov104_02240364[] = { - { 0x1, 0x9A }, - { 0x1, 0x9A }, - { 0x1, 0x10E }, - { 0x1, 0x10E }, - { 0x1, 0x10E }, - { 0x9B, 0x177 }, - { 0x9B, 0x177 }, - { 0x9B, 0x177 }, - { 0x10F, 0x1DD }, - { 0x10F, 0x1DD } -}; - -static const UnkStruct_ov104_02240364 Unk_ov104_0224032C[] = { - { 0x1, 0x9A }, - { 0x9B, 0x10E }, - { 0x10F, 0x177 }, - { 0x178, 0x1DD } -}; - -void ov104_0223B0C8(u8 param0, u8 param1, u8 param2, u8 param3, u16 param4, u16 param5[], u8 param6) -{ - const UnkStruct_ov104_02240364 *v0; - u8 v1, v2, v3; - u16 v4, v5, v6, v7, v8, v9; - int v10 = 0; - u16 v11 = 0; - - v3 = 0; - v1 = (param3 * 2); - v2 = ov104_0223B644(param2); - - if (param6 != 0) { - for (v7 = 0; v7 < (NELEMS(Unk_ov104_02240714)); v7++) { - if (param4 == Unk_ov104_02240714[v7]) { - v9 = v7; - break; - } - } - - if (v7 == (NELEMS(Unk_ov104_02240714))) { - v9 = Unk_ov104_0224032C[NELEMS(Unk_ov104_0224032C) - 1].unk_00; - } - - for (v7 = 0; v7 < (NELEMS(Unk_ov104_0224032C)); v7++) { - if (v9 < Unk_ov104_0224032C[v7].unk_02) { - break; - } - } - - if (v7 == (NELEMS(Unk_ov104_0224032C))) { - v7 = (NELEMS(Unk_ov104_0224032C) - 1); - } - - if (param6 == 2) { - v0 = &Unk_ov104_0224032C[(NELEMS(Unk_ov104_0224032C) - 1)]; - } else { - v0 = &Unk_ov104_0224032C[v7]; - } - } else { - v0 = &Unk_ov104_02240364[v2]; - } - - v5 = (v0->unk_02 - v0->unk_00) + 1; - v4 = v0->unk_00 + (LCRNG_Next() % v5); - v4 -= 1; - v6 = v4; - - while (v10 < param0) { - if (v3 == 0) { - for (v8 = 0; v8 < v1; v8++) { - if (param5[v8] == (v4 + 1)) { - break; - } - } - } else { - if (param5[v1 - 2] == (v4 + 1)) { - v8 = 0; - } else { - v8 = v1; - } - } - - if (v8 == v1) { - if (param6 != 0) { - if (param4 != Unk_ov104_02240714[v4]) { - param5[v1 + v10] = (v4 + 1); - v10++; - } - } else { - if ((param1 == Unk_ov104_02240ACE[v4][0]) || (param1 == Unk_ov104_02240ACE[v4][1])) { - if (param4 != Unk_ov104_02240714[v4]) { - param5[v1 + v10] = (v4 + 1); - - v10++; - } - } - } - } - - v4++; - - if ((v4 + 1) >= v0->unk_02) { - v4 = (v0->unk_00 - 1); - } - - if (v4 == v6) { - v3 = 1; - } - } - - return; -} - -FieldBattleDTO *FieldBattleDTO_NewBattleHall(BattleHall *battleHall, FieldFrontierDTO *fieldData) -{ - int i; - u8 rank; - Pokemon *mon; - FrontierTrainerDataDTO trDataDTO; - - u8 v6 = battleHall->unk_05 * 2; - u8 playerPartySize = BattleHall_GetPlayerPartySize(battleHall->challengeType); - u8 opponentPartySize = BattleHall_GetOpponentPartySize(battleHall->challengeType); - Party *party = SaveData_GetParty(battleHall->saveData); - - Party_HealAllMembers(party); - - FieldBattleDTO *battleDTO = FieldBattleDTO_New(HEAP_ID_FIELD2, BattleHall_GetBattleType(battleHall->challengeType)); - FieldBattleDTO_InitFromGameState(battleDTO, NULL, fieldData->saveData, fieldData->mapHeaderID, fieldData->journalEntry, fieldData->bagCursor, fieldData->subscreenCursorOn); - - battleDTO->background = BACKGROUND_BATTLE_HALL; - battleDTO->terrain = TERRAIN_BATTLE_HALL; - Party_InitWithCapacity(battleDTO->parties[BATTLER_PLAYER_1], playerPartySize); - - mon = Pokemon_New(HEAP_ID_FIELD2); - - for (i = 0; i < playerPartySize; i++) { - Pokemon_Copy(Party_GetPokemonBySlotIndex(party, battleHall->partySlots[i]), mon); - FieldBattleDTO_AddPokemonToBattler(battleDTO, mon, BATTLER_PLAYER_1); - } - - Heap_Free(mon); - FieldBattleDTO_CopyPlayerInfoToTrainerData(battleDTO); - - Heap_Free(BattleFrontier_GetTrainerData(&trDataDTO, battleHall->trainerIDs[v6], HEAP_ID_FIELD2, NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDTR)); - 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->typeRanks[battleHall->challengeType][0]); - - if (battleHall->challengeType == FRONTIER_CHALLENGE_MULTI) { - rank = 9; - } - - u16 aiMask = BattleHall_GetAIMask(battleHall, v6, rank); - - for (i = 0; i < MAX_BATTLERS; i++) { - battleDTO->trainer[i].header.aiMask = aiMask; - } - - ov104_0223B518(&battleHall->unk_290[v6], rank, battleHall->trainerIDs[v6], &battleHall->unk_268[v6], opponentPartySize, HEAP_ID_FIELD2, NARC_INDEX_BATTLE__B_PL_STAGE__PL_BSDPM); - - mon = Pokemon_New(HEAP_ID_FIELD2); - - for (i = 0; i < opponentPartySize; i++) { - while (TRUE) { - if (ov104_0223B4A4(battleHall, v6) == 0) { - break; - } - } - - FrontierPokemonDataDTO_InitPokemon(&battleHall->unk_290[v6], mon, BattleHall_GetOpponentLevel(battleHall, rank)); - - Pokemon_CalcAbility(mon); - FieldBattleDTO_AddPokemonToBattler(battleDTO, mon, BATTLER_ENEMY_1); - } - - Heap_Free(mon); - - switch (battleHall->challengeType) { - case FRONTIER_CHALLENGE_MULTI: - case FRONTIER_CHALLENGE_MULTI_WFC: - FieldBattleDTO_CopyPlayerInfoToTrainerData(battleDTO); - - TrainerInfo_Copy(CommInfo_TrainerInfo(1 - CommSys_CurNetId()), battleDTO->trainerInfo[BATTLER_PLAYER_2]); - - Heap_Free(BattleFrontier_GetTrainerData(&trDataDTO, battleHall->trainerIDs[v6 + 1], HEAP_ID_FIELD2, NARC_INDEX_BATTLE__B_PL_TOWER__PL_BTDTR)); - - FieldBattleDTO_InitFrontierTrainer(battleDTO, &trDataDTO, opponentPartySize, BATTLER_ENEMY_2, HEAP_ID_FIELD2); - Party_InitWithCapacity(battleDTO->parties[BATTLER_ENEMY_2], opponentPartySize); - - mon = Pokemon_New(HEAP_ID_FIELD2); - - while (TRUE) { - if (ov104_0223B4A4(battleHall, v6) == 0) { - break; - } - } - - FrontierPokemonDataDTO_InitPokemon(&battleHall->unk_290[v6], mon, BattleHall_GetOpponentLevel(battleHall, rank)); - - Pokemon_CalcAbility(mon); - FieldBattleDTO_AddPokemonToBattler(battleDTO, mon, BATTLER_ENEMY_2); - Heap_Free(mon); - break; - } - - return battleDTO; -} - -static BOOL ov104_0223B4A4(BattleHall *battleHall, u8 param1) -{ - if (battleHall->unk_290[param1].personality > ((24 + 1) * 10001)) { - battleHall->unk_290[param1].personality -= ((24 + 1) * 10001); - } else { - battleHall->unk_290[param1].personality += ((24 + 1) * 10001); - } - - return Pokemon_IsPersonalityShiny(battleHall->unk_290[param1].otID, battleHall->unk_290[param1].personality); -} - -static u32 BattleHall_GetBattleType(u8 challengeType) -{ - switch (challengeType) { - case FRONTIER_CHALLENGE_SINGLE: - return BATTLE_TYPE_FRONTIER_SINGLES; - case FRONTIER_CHALLENGE_DOUBLE: - return BATTLE_TYPE_FRONTIER_DOUBLES; - case FRONTIER_CHALLENGE_MULTI: - return BATTLE_TYPE_FRONTIER_LINK | BATTLE_TYPE_TRAINER_DOUBLES | BATTLE_TYPE_2vs2; - case FRONTIER_CHALLENGE_MULTI_WFC: - return BATTLE_TYPE_FRONTIER_LINK | BATTLE_TYPE_TRAINER_DOUBLES | BATTLE_TYPE_2vs2; - } - - return BATTLE_TYPE_FRONTIER_SINGLES; -} - -u8 BattleHall_GetPlayerPartySize(u8 challengeType) -{ - switch (challengeType) { - case FRONTIER_CHALLENGE_DOUBLE: - return 2; - } - - return 1; -} - -u8 BattleHall_GetOpponentPartySize(u8 challengeType) -{ - switch (challengeType) { - case FRONTIER_CHALLENGE_DOUBLE: - return 2; - } - - return 1; -} - -static void ov104_0223B518(FrontierPokemonDataDTO *param0, u8 param1, u16 param2, u16 param3[], int param4, int param5, int param6) -{ - int v0; - u32 v1; - u8 v2; - u32 v3; - - if (param2 == FRONTIER_TRAINER_HALL_MATRON_ARGENTA_SILVER) { - v3 = 31; - } else if (param2 == FRONTIER_TRAINER_HALL_MATRON_ARGENTA_GOLD) { - v3 = 31; - } else { - v3 = ov104_0223B5F0(param1); - } - - for (v0 = 0; v0 < param4; v0++) { - ov104_0222E2F0(¶m0[v0], param3[v0], v0, v3, 0, param5, param6); - } - - return; -} - -static u32 BattleHall_GetOpponentLevel(BattleHall *battleHall, u8 param1) -{ - u8 v0; - u32 level; - - v0 = (battleHall->unk_05 * 2); - - if (battleHall->trainerIDs[v0] == FRONTIER_TRAINER_HALL_MATRON_ARGENTA_SILVER - || battleHall->trainerIDs[v0] == FRONTIER_TRAINER_HALL_MATRON_ARGENTA_GOLD) { - level = BattleHall_GetHighestLevelInParty(battleHall); - } else { - level = battleHall->unk_07; - } - - return level; -} - -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 BattleHall_CursorPosToType(u8 cursorPos) -{ - return sBattleHallAppGridOrder[cursorPos]; -} - -BOOL BattleHall_IsMultiPlayerChallenge(u8 challengeType) -{ - return challengeType == FRONTIER_CHALLENGE_MULTI || challengeType == FRONTIER_CHALLENGE_MULTI_WFC; -} - -u8 ov104_0223B5C0(BattleHall *battleHall) -{ - u32 v0; - int v1; - Party *v2 = SaveData_GetParty(battleHall->saveData); - Pokemon *v3 = Party_GetPokemonBySlotIndex(v2, battleHall->partySlots[0]); - v1 = Pokemon_GetValue(v3, MON_DATA_LEVEL, NULL); - - return v1 / 10; -} - -static u8 ov104_0223B5F0(u8 param0) -{ - return Unk_ov104_0224033C[ov104_0223B644(param0)].unk_01; -} - -static u16 BattleHall_GetAIMask(BattleHall *battleHall, u8 param1, u8 rank) -{ - u8 v0; - u16 aiMask; - - if (rank + 1 >= 8) { - aiMask = AI_FLAG_BASIC | AI_FLAG_EVAL_ATTACK | AI_FLAG_EXPERT; - } else if (rank + 1 >= 4) { - aiMask = AI_FLAG_BASIC; - } else { - aiMask = 0; - } - - if (battleHall->challengeType == FRONTIER_CHALLENGE_SINGLE) { - v0 = param1 * 2; - - if (battleHall->trainerIDs[v0] == FRONTIER_TRAINER_HALL_MATRON_ARGENTA_SILVER - || battleHall->trainerIDs[v0] == FRONTIER_TRAINER_HALL_MATRON_ARGENTA_GOLD) { - aiMask = AI_FLAG_BASIC | AI_FLAG_EVAL_ATTACK | AI_FLAG_EXPERT; - } - } - - if (battleHall->challengeType == FRONTIER_CHALLENGE_MULTI) { - aiMask = AI_FLAG_BASIC | AI_FLAG_EVAL_ATTACK | AI_FLAG_EXPERT; - } - - return aiMask; -} - -static u16 ov104_0223B644(u8 param0) -{ - u8 v0 = param0; - - if (v0 >= 10) { - v0 = (10 - 1); - } - - return v0; -} - -u16 BattleHall_GetHighestLevelInParty(BattleHall *battleHall) -{ - Party *party = SaveData_GetParty(battleHall->saveData); - 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->partySlots[1]); - u16 secondMonsLevel = Pokemon_GetValue(mon, MON_DATA_LEVEL, NULL); - - if (firstMonsLevel > secondMonsLevel) { - return firstMonsLevel; - } else { - return secondMonsLevel; - } - } else { - if (BattleHall_IsMultiPlayerChallenge(battleHall->challengeType) == TRUE) { - if (firstMonsLevel > battleHall->unk_D84[0]) { - return firstMonsLevel; - } else { - return battleHall->unk_D84[0]; - } - } - } - - return firstMonsLevel; -} - -fx32 BattleHall_GetLevelSquareRoot(u32 level) -{ - return FX_Sqrt(FX32_CONST(level)); -} diff --git a/src/scrcmd.c b/src/scrcmd.c index 4f9bdedc9f7..21251b1283c 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -6580,9 +6580,9 @@ static BOOL ScrCmd_LaunchBattleFrontierScene(ScriptContext *ctx) *dataPtr = fieldData; if (sceneID == FRONTIER_SCENE_TOWER_CORRIDOR || sceneID == FRONTIER_SCENE_TOWER_MULTI_CORRIDOR) { - fieldData->unk_00 = ctx->fieldSystem->battleTower; + fieldData->facilityData = ctx->fieldSystem->battleTower; } else { - fieldData->unk_00 = NULL; + fieldData->facilityData = NULL; } fieldData->options = SaveData_GetOptions(ctx->fieldSystem->saveData); diff --git a/tools/dataproc/data/frontier_trainer_classes.h.template b/tools/dataproc/data/frontier_trainer_classes.h.template new file mode 100644 index 00000000000..593c501af04 --- /dev/null +++ b/tools/dataproc/data/frontier_trainer_classes.h.template @@ -0,0 +1,8 @@ +#ifndef POKEPLATINUM_GENERATED_FRONTIER_TRAINER_CLASSES +#define POKEPLATINUM_GENERATED_FRONTIER_TRAINER_CLASSES + +static const u16 sFrontierTrainerClasses[] = { +/* =========== MAGIC CONTENT MARKER =========== */ +}; + +#endif // POKEPLATINUM_GENERATED_FRONTIER_TRAINER_CLASSES diff --git a/tools/dataproc/src/frontierproc.c b/tools/dataproc/src/frontierproc.c index e78641fc5b3..5d069496bf9 100644 --- a/tools/dataproc/src/frontierproc.c +++ b/tools/dataproc/src/frontierproc.c @@ -10,6 +10,7 @@ #include "nitroarc.h" #include "constants/moves.h" +#include "generated/frontier_trainers.h" #include "struct_defs/battle_frontier_pokemon_data.h" @@ -34,6 +35,11 @@ static archive_template_t archives[] = { { .out_filename = NULL }, }; +static header_template_t headers[] = { + { .out_filename = "frontier_trainer_classes.h" }, + { .out_filename = NULL }, +}; + enum { T_TRAINER_MESSAGES, T_TRAINER_NAMES, @@ -61,6 +67,7 @@ static void pack_pokemon_set(datafile_t *df); static void pack_trainer(datafile_t *df); static void emit_trainer_name(datafile_t *df, const char *stem); static void emit_trainer_messages(datafile_t *df, const char *stem); +static void emit_trainer_classes(datafile_t *df, size_t trainer_idx); typedef struct dynlookup dynlookup_t; struct dynlookup { @@ -77,7 +84,7 @@ int main(int argc, char *argv[]) { archives[A_FRONTIER_TRAINERS].num_files = (u16)len_tr_registry; archives[A_FRONTIER_POKEMON].num_files = (u16)len_pk_registry; - common_init(DATAPROC_F_JSON, enums, archives, NULL, textbanks, __FILE__, depfile_fpath, output_dir, NULL, NULL); + common_init(DATAPROC_F_JSON, enums, archives, headers, textbanks, __FILE__, depfile_fpath, output_dir, NULL, NULL); char buf[BUFSIZE]; datafile_t df = { 0 }; @@ -108,6 +115,7 @@ int main(int argc, char *argv[]) { pack_trainer(&df); emit_trainer_name(&df, tr_registry[i]); emit_trainer_messages(&df, tr_registry[i]); + emit_trainer_classes(&df, i); } if (dp_report(&df) == DIAG_ERROR) errc = EXIT_FAILURE; @@ -205,6 +213,16 @@ static void emit_trainer_messages(datafile_t *df, const char *stem) { } } +static FILE **f_trainer_classes = &headers[0].out_file; + +static void emit_trainer_classes(datafile_t *df, size_t trainer_idx) { + const char *trainer_class = string(".class"); + + if (trainer_idx < FRONTIER_TRAINER_TRAINER_CHERYL_CHERYL) { + fprintf(*f_trainer_classes, " %s,\n", trainer_class); + } +} + static int sort_strcmp(const void *lhs, const void *rhs) { const lookup_t *l = lhs; const lookup_t *r = rhs;