diff --git a/asm/include/overlay_80_02235438.inc b/asm/include/overlay_80_02235438.inc index 84ae3ea35..a0f68870c 100644 --- a/asm/include/overlay_80_02235438.inc +++ b/asm/include/overlay_80_02235438.inc @@ -9,15 +9,15 @@ .public sub_0203769C .public sub_02037C0C .public sub_02037C44 -.public sub_0204A68C -.public sub_0204AA2C -.public sub_0204AC78 -.public sub_0204AC7C -.public sub_0204AD04 -.public sub_0204AE20 -.public sub_0204AF2C -.public sub_0204B05C -.public sub_0204B068 +.public ResetSystem +.public FrontierFieldSystem_Free +.public FrontierFieldSystem_GetFrontierBattleNumber +.public FrontierFieldSystem_0204AC7C +.public FrontierFieldSystem_0204AD04 +.public FrontierFieldSystem_0204AE20 +.public FrontierFieldSystem_0204AF2C +.public FrontierFieldSystem_GetBattleTowerMode +.public FrontierFieldSystem_AwardTowerBattlePoints .public BattleSetup_Delete .public IsBattleResultWin .public Frontier_GetLaunchArgs diff --git a/asm/include/overlay_80_02235900.inc b/asm/include/overlay_80_02235900.inc index 190f3cad2..49d82f419 100644 --- a/asm/include/overlay_80_02235900.inc +++ b/asm/include/overlay_80_02235900.inc @@ -9,9 +9,9 @@ .public sub_02031108 .public sub_0203769C .public sub_02037B5C -.public sub_0204A824 -.public sub_0204AA2C -.public sub_0204ABC8 +.public FrontierFieldSystem_New +.public FrontierFieldSystem_Free +.public FrontierFieldSystem_SetRandomFrontierTrainers .public sub_0204F878 .public sub_0205C048 .public sub_0205C11C diff --git a/asm/include/overlay_80_02236450.inc b/asm/include/overlay_80_02236450.inc index a06f32dbd..6ab9934b3 100644 --- a/asm/include/overlay_80_02236450.inc +++ b/asm/include/overlay_80_02236450.inc @@ -8,8 +8,8 @@ .public sub_0202D804 .public sub_0202D928 .public sub_02034818 -.public sub_0204B4D4 -.public sub_0204B510 +.public GetFrontierTrainerIVs +.public FrontierFieldSystem_0204B510 .public BattleSetup_New .public BattleSetup_AddMonToParty .public sub_02051D18 diff --git a/asm/overlay_80_02235438.s b/asm/overlay_80_02235438.s index dd37087a8..de223b1f5 100644 --- a/asm/overlay_80_02235438.s +++ b/asm/overlay_80_02235438.s @@ -83,10 +83,10 @@ _022354CC: beq _0223556A b _0223557A _022354D2: - bl sub_0204A68C + bl ResetSystem b _0223557E _022354D8: - bl sub_0204B068 + bl FrontierFieldSystem_AwardTowerBattlePoints strh r0, [r4] ldr r0, [r5, #8] bl Save_GameStats_Get @@ -102,7 +102,7 @@ _022354EE: strh r0, [r4] b _0223557E _022354FC: - bl sub_0204AC78 + bl FrontierFieldSystem_GetFrontierBattleNumber strh r0, [r4] b _0223557E _02235504: @@ -110,7 +110,7 @@ _02235504: strh r0, [r4] b _0223557E _0223550C: - bl sub_0204AC7C + bl FrontierFieldSystem_0204AC7C strh r0, [r4] b _0223557E _02235514: @@ -118,7 +118,7 @@ _02235514: strh r0, [r4] b _0223557E _0223551C: - bl sub_0204B05C + bl FrontierFieldSystem_GetBattleTowerMode strh r0, [r4] b _0223557E _02235524: @@ -136,14 +136,14 @@ _02235536: b _0223557E _0223553E: ldr r1, [r5, #8] - bl sub_0204AD04 + bl FrontierFieldSystem_0204AD04 b _0223557E _02235546: ldr r1, [r5, #8] - bl sub_0204AE20 + bl FrontierFieldSystem_0204AE20 b _0223557E _0223554E: - bl sub_0204AF2C + bl FrontierFieldSystem_0204AF2C b _0223557E _02235554: ldr r1, _02235584 ; =0x00000884 @@ -259,7 +259,7 @@ FrtCmd_134: ; 0x02235610 ldr r0, [r0] ldr r0, [r0] bl Frontier_GetData - bl sub_0204AA2C + bl FrontierFieldSystem_Free mov r0, #0 pop {r3, pc} .balign 4, 0 diff --git a/asm/overlay_80_02235900.s b/asm/overlay_80_02235900.s index d02351fcd..5e384271a 100644 --- a/asm/overlay_80_02235900.s +++ b/asm/overlay_80_02235900.s @@ -738,7 +738,7 @@ _02235EA4: ldr r0, [r7, #8] mov r1, #0 mov r2, #6 - bl sub_0204A824 + bl FrontierFieldSystem_New add r4, r0, #0 ldr r0, [r5] add r1, r4, #0 @@ -803,7 +803,7 @@ _02235F10: bne _02235F44 ldr r1, [r7, #8] add r0, r4, #0 - bl sub_0204ABC8 + bl FrontierFieldSystem_SetRandomFrontierTrainers _02235F44: ldr r0, [r7, #8] bl SaveArray_Party_Get @@ -872,7 +872,7 @@ FrtCmd_182: ; 0x02235FB4 ldr r0, [r0] ldr r0, [r0] bl Frontier_GetData - bl sub_0204AA2C + bl FrontierFieldSystem_Free mov r0, #0 pop {r3, pc} .balign 4, 0 diff --git a/asm/overlay_80_02236450.s b/asm/overlay_80_02236450.s index 27f5d6c6a..cc3723426 100644 --- a/asm/overlay_80_02236450.s +++ b/asm/overlay_80_02236450.s @@ -82,7 +82,7 @@ _022364DE: str r0, [sp, #0x24] _022364E2: add r0, r7, #0 - bl sub_0204B510 + bl FrontierFieldSystem_0204B510 ldr r1, [sp, #0x14] ldrh r1, [r1, #2] bl _s32_div_f @@ -223,13 +223,13 @@ _022365E8: b _022364E2 _022365EE: ldr r0, [sp, #0x18] - bl sub_0204B4D4 + bl GetFrontierTrainerIVs str r0, [sp, #0x3c] add r0, r7, #0 - bl sub_0204B510 + bl FrontierFieldSystem_0204B510 add r5, r0, #0 add r0, r7, #0 - bl sub_0204B510 + bl FrontierFieldSystem_0204B510 lsl r0, r0, #0x10 orr r0, r5 str r0, [sp, #0x38] @@ -462,10 +462,10 @@ _022367AA: bne _022367F0 _022367BE: add r0, r4, #0 - bl sub_0204B510 + bl FrontierFieldSystem_0204B510 add r6, r0, #0 add r0, r4, #0 - bl sub_0204B510 + bl FrontierFieldSystem_0204B510 lsl r0, r0, #0x10 add r7, r6, #0 orr r7, r0 diff --git a/include/field_system.h b/include/field_system.h index 61174eb6c..5474c28f7 100644 --- a/include/field_system.h +++ b/include/field_system.h @@ -148,7 +148,7 @@ struct FieldSystem { BagCursor *bagCursor; u8 filler_98[0x4]; void *unk9C; - UnkStruct_Fsys_A0 *unkA0; + FrontierFieldSystem *frontierFsys; Save_LinkBattleRuleset *linkBattleRuleset; UnkStruct_02092BB8 *unkA8; u32 unkAC; diff --git a/include/frontier_data.h b/include/frontier_data.h index 3bfab0e87..b545305d7 100644 --- a/include/frontier_data.h +++ b/include/frontier_data.h @@ -3,9 +3,9 @@ #include "save.h" -typedef struct FRONTIERDATA FRONTIERDATA; +typedef struct FrontierData FrontierData; -FRONTIERDATA *Save_FrontierData_Get(SaveData *saveData); -u32 FrontierData_BattlePointAction(FRONTIERDATA *frontierData, u32 param, u32 action); +FrontierData *Save_FrontierData_Get(SaveData *saveData); +u32 FrontierData_BattlePointAction(FrontierData *frontierData, u32 param, u32 action); #endif // POKEHEARTGOLD_FRONTIER_DATA_H diff --git a/include/overlay_72.h b/include/overlay_72.h index 02a17c8a9..cea238492 100644 --- a/include/overlay_72.h +++ b/include/overlay_72.h @@ -8,7 +8,7 @@ #include "save.h" typedef struct NintendoWifiConnectArgs { - FRONTIERDATA *frontierData; + FrontierData *frontierData; u32 unk4; SysInfo *sysInfo; SaveData *saveData; diff --git a/include/scrcmd_9.h b/include/scrcmd_9.h index c00994dbe..2c79d767d 100644 --- a/include/scrcmd_9.h +++ b/include/scrcmd_9.h @@ -2,9 +2,18 @@ #define POKEHEARTGOLD_SCRCMD_9_H #include "frontier_data.h" +#include "mail_message.h" #include "save.h" -typedef struct UnkStruct_0204B470 { +#define TOWER_MODE_SINGLE 0 +#define TOWER_MODE_DOUBLE 1 +#define TOWER_MODE_MULTI 2 +#define TOWER_MODE_LINK 3 +#define TOWER_MODE_WIFI 4 +#define TOWER_MODE_WIFI_PRACTICE 5 +#define TOWER_MODE_6 6 + +typedef struct FrontierMon { u16 species : 11; u16 form : 5; u16 item; @@ -29,72 +38,70 @@ typedef struct UnkStruct_0204B470 { u8 ability; u8 friendship; u16 nickname[11]; -} UnkStruct_0204B470; +} FrontierMon; -typedef struct UnkStruct_0204B7D0 { - u32 unk00; - u16 unk04; +typedef struct FrontierTrainer { + u32 index; + u16 trainerClass; u8 filler06[2]; - u16 unk08[8]; - u16 unk18; - u16 unk1a; - u8 filler1c[0x14]; - UnkStruct_0204B470 unk30[2]; + u16 name[8]; + MailMessage introMessage; + u8 filler20[0x10]; + FrontierMon frontierMons[2]; u8 fillera0[0x70]; -} UnkStruct_0204B7D0; +} FrontierTrainer; // size: 0x110 -typedef struct UnkStruct_0204A824_7E8 { +typedef struct FrontierMultiBattleAllyData { u32 otId; - u16 unk04[2]; - u32 unk08[2]; -} UnkStruct_0204A824_7E8; + u16 frontierMonIDs[2]; + u32 frontierMonPIDs[2]; +} FrontierMultiBattleAllyData; -typedef struct UnkStruct_Fsys_A0 { - u32 unk00; +typedef struct FrontierFieldSystem { + u32 initMagicNumber; enum HeapID heapID; u32 unk08; - u8 unk0c; + u8 currentBattleNumber; // Total battles won on current streak. u8 curWinStreak; - u8 unk0e; - u8 unk0f; + u8 numMons; + u8 towerMode; u8 unk10_0 : 1; - u8 unk10_1 : 2; + u8 palmerDefeated : 2; u8 unk10_3 : 1; u8 unk10_4 : 1; - u8 unk10_5 : 3; - u8 unk11; - u8 unk12; + u8 multiBattleAllyID : 3; + u8 trainerGender; + u8 linkAllyGender; u8 filler13; - u16 unk14; - u16 unk16; - u16 unk18; - u16 unk1a; - u16 unk1c; + u16 linkAllyRound; // Takes precedence over currentRound in Link Mode if it is higher. + u16 linkAllyMonSpecies[2]; + u16 currentBattleInSession; // Battles won in this session. + u16 currentRound; // Rounds (sets of 7 battles) won in the current streak. u8 filler1e[2]; - u32 unk20; + u32 totalTowerWins; u16 unk24; u16 unk26; u16 unk28; - u8 unk2a[4]; - u16 unk2e[4]; - u16 unk36[4]; - u16 unk3e[0xe]; + u8 partyMonIndexes[4]; + u16 partyMonSpecies[4]; + u16 partyMonItems[4]; + u16 trainersInCurrentRound[14]; u8 filler5a[0x13]; - u32 unk70; - FRONTIERDATA *unk74; - UnkStruct_0204B7D0 unk78[2]; - UnkStruct_0204B7D0 unk298[5]; - UnkStruct_0204A824_7E8 unk7e8[5]; - u8 unk838[5]; + u32 unk70; // Seems to be some sort of frontier save data. + FrontierData *frontierData; + FrontierTrainer unk78[2]; + FrontierTrainer frontierStatTrainers[5]; + FrontierMultiBattleAllyData multiBattleAllyData[5]; + u8 unk838[5]; // Related to multi battle allies' replaced items. u8 filler83d; - u16 unk83e[0x23]; - u16 unk884[0x23]; + u16 unk83e[0x23]; // Related to unk10_3 somehow. Also player gender? Also species??? these seem to be some sort of struct? + u16 unk884[0x23]; // Seemingly never set. Probably relates to tag partner somehow. u8 filler8CA[0xa]; u8 unk8D4; u8 unk8D5; u8 filler8D6[2]; u16 unk8D8; u16 unk8DA; -} UnkStruct_Fsys_A0; +} FrontierFieldSystem; #endif // POKEHEARTGOLD_SCRCMD_9_H diff --git a/include/unk_0202D230.h b/include/unk_0202D230.h index 8bc09c716..ad53fb5fa 100644 --- a/include/unk_0202D230.h +++ b/include/unk_0202D230.h @@ -12,15 +12,15 @@ void sub_0202D308(u32 a0, u32 a1, void *a2); void sub_0202D3B0(u32 a0, u8 a1, u32 a2, u32 a3); u32 sub_0202D3DC(void); void sub_0202D3E4(u32 a0, u32 a1); -u32 sub_0202D450(FRONTIERDATA *a0, u32 a1); -u32 sub_0202D488(FRONTIERDATA *a0, u32 a1); -void sub_0202D4B8(FRONTIERDATA *a0, u32 a1, void *a2); -void sub_0202D4DC(FRONTIERDATA *a0, s32 a1, UnkStruct_02069528 *a2); -void sub_0202D4FC(FRONTIERDATA *a0, u32 a1); -s16 sub_0202D564(FRONTIERDATA *a0); +u32 sub_0202D450(FrontierData *frontierData, u32 a1); +u32 sub_0202D488(FrontierData *frontierData, u32 a1); +void sub_0202D4B8(FrontierData *frontierData, u32 a1, void *a2); +void sub_0202D4DC(FrontierData *frontierData, s32 a1, UnkStruct_02069528 *a2); +void sub_0202D4FC(FrontierData *frontierData, u32 a1); +s16 sub_0202D564(FrontierData *frontierData); u32 sub_0202D57C(void *a0, u32 a1, u32 a2); -u32 sub_0202D5C4(FRONTIERDATA *a0, u32 a1, u16 a2); -u32 sub_0202D5DC(FRONTIERDATA *a0, u16 a1, u32 a2); +u32 sub_0202D5C4(FrontierData *frontierData, u32 a1, u16 a2); +u32 sub_0202D5DC(FrontierData *frontierData, u16 a1, u32 a2); void sub_0202D640(SaveData *saveData, int a1, MailMessage *mailMessage); u32 sub_0202D7B0(u32 a0); u32 sub_0202D7B8(u32 a0); diff --git a/include/unk_0204A3F4.h b/include/unk_0204A3F4.h index 0313565f2..87c88907d 100644 --- a/include/unk_0204A3F4.h +++ b/include/unk_0204A3F4.h @@ -4,8 +4,8 @@ #include "field_system.h" #include "scrcmd_9.h" -BOOL sub_0204A5B0(u16 numRequired, SaveData *saveData, BOOL checkDuplicateItems); -void sub_0204A68C(void); +BOOL PartyIsValidForFrontier(u16 numRequired, SaveData *saveData, BOOL checkDuplicateItems); +void ResetSystem(void); void sub_0204A698(u32 a0); u32 sub_0204A6A0(u32 a0); void sub_0204A6A8(FieldSystem *fieldSystem); @@ -15,29 +15,29 @@ void sub_0204A730(SaveData *saveData, u8 a1); u16 sub_0204A750(SaveData *saveData); u32 sub_0204A764(SaveData *saveData); u16 sub_0204A800(SaveData *saveData); -void sub_0204A810(UnkStruct_Fsys_A0 **a0); -UnkStruct_Fsys_A0 *sub_0204A824(SaveData *saveData, BOOL resumeFromPrevious, u32 a2); -void sub_0204AA2C(UnkStruct_Fsys_A0 *a0); -void sub_0204AA58(UnkStruct_Fsys_A0 *a0, TaskManager *taskManager, void *a2); -BOOL sub_0204AA78(UnkStruct_Fsys_A0 *a0, void **a1, SaveData *saveData); -u32 sub_0204AB10(UnkStruct_Fsys_A0 *a0, SaveData *saveData); -void sub_0204ABC8(UnkStruct_Fsys_A0 *a0, SaveData *saveData); -u8 sub_0204AC78(UnkStruct_Fsys_A0 *a0); -BOOL sub_0204AC7C(UnkStruct_Fsys_A0 *a0); -void sub_0204AD04(UnkStruct_Fsys_A0 *a0, SaveData *saveData); -void sub_0204AE20(UnkStruct_Fsys_A0 *a0, SaveData *saveData); -void sub_0204AF2C(UnkStruct_Fsys_A0 *a0); -void sub_0204AFE0(UnkStruct_Fsys_A0 *a0); -u32 sub_0204B044(UnkStruct_Fsys_A0 *a0, u32 a1); -u32 sub_0204B05C(UnkStruct_Fsys_A0 *a0); -u32 sub_0204B060(UnkStruct_Fsys_A0 *a0); -u32 sub_0204B068(UnkStruct_Fsys_A0 *a0); -BOOL sub_0204B0E0(UnkStruct_Fsys_A0 *a0, SaveData *saveData); -u32 sub_0204B120(UnkStruct_Fsys_A0 *a0, SaveData *saveData, u32 a2); -BOOL sub_0204B1CC(UnkStruct_Fsys_A0 *a0, SaveData *saveData); -BOOL sub_0204B204(UnkStruct_Fsys_A0 *a0, SaveData *saveData); -u16 sub_0204B258(UnkStruct_Fsys_A0 *a0, SaveData *saveData); -u8 sub_0204B4D4(u32 a0); -u16 sub_0204B510(UnkStruct_Fsys_A0 *a0); +void FrontierFieldSystem_0204A810(FrontierFieldSystem **frontierFsys); +FrontierFieldSystem *FrontierFieldSystem_New(SaveData *saveData, BOOL resumeFromPrevious, u32 a2); +void FrontierFieldSystem_Free(FrontierFieldSystem *frontierFsys); +void FrontierFieldSystem_0204AA58(FrontierFieldSystem *frontierFsys, TaskManager *taskManager, void *a2); +BOOL FrontierFieldSystem_0204AA78(FrontierFieldSystem *frontierFsys, void **a1, SaveData *saveData); +u32 FrontierFieldSystem_PartyHasDuplicateSpeciesOrItems(FrontierFieldSystem *frontierFsys, SaveData *saveData); +void FrontierFieldSystem_SetRandomFrontierTrainers(FrontierFieldSystem *frontierFsys, SaveData *saveData); +u8 FrontierFieldSystem_GetFrontierBattleNumber(FrontierFieldSystem *frontierFsys); +BOOL FrontierFieldSystem_0204AC7C(FrontierFieldSystem *frontierFsys); +void FrontierFieldSystem_0204AD04(FrontierFieldSystem *frontierFsys, SaveData *saveData); +void FrontierFieldSystem_0204AE20(FrontierFieldSystem *frontierFsys, SaveData *saveData); +void FrontierFieldSystem_0204AF2C(FrontierFieldSystem *frontierFsys); +void FrontierFieldSystem_0204AFE0(FrontierFieldSystem *frontierFsys); +u32 FrontierFieldSystem_0204B044(FrontierFieldSystem *frontierFsys, u32 a1); +u32 FrontierFieldSystem_GetBattleTowerMode(FrontierFieldSystem *frontierFsys); +u32 FrontierFieldSystem_GetPalmerDefeated(FrontierFieldSystem *frontierFsys); +u32 FrontierFieldSystem_AwardTowerBattlePoints(FrontierFieldSystem *frontierFsys); +BOOL FrontierFieldSystem_0204B0E0(FrontierFieldSystem *frontierFsys, SaveData *saveData); +u32 FrontierFieldSystem_0204B120(FrontierFieldSystem *frontierFsys, SaveData *saveData, u32 a2); +BOOL FrontierFieldSystem_TryGivePalmerRibbons(FrontierFieldSystem *frontierFsys, SaveData *saveData); +BOOL FrontierFieldSystem_TryGiveOtherTowerRibbons(FrontierFieldSystem *frontierFsys, SaveData *saveData); +u16 FrontierFieldSystem_0204B258(FrontierFieldSystem *frontierFsys, SaveData *saveData); +u8 GetFrontierTrainerIVs(u32 frontierTrainerIndex); +u16 FrontierFieldSystem_0204B510(FrontierFieldSystem *frontierFsys); #endif // POKEHEARTGOLD_UNK_0204A3F4_H diff --git a/include/unk_0204B538.h b/include/unk_0204B538.h index e4759a86f..eb21142e8 100644 --- a/include/unk_0204B538.h +++ b/include/unk_0204B538.h @@ -6,15 +6,15 @@ #include "scrcmd_9.h" MessageFormat *sub_0204B538(SaveData *saveData, u16 numEligiblePokemon, u16 a2, u8 a3, u8 *numLegendaryPokemonSeen); -u32 sub_0204B5E8(u8 a0); -u16 sub_0204B610(FieldSystem *fieldSystem, u16 *a1); +u32 GetFrontierTrainerOverworld(u8 trainerClass); +u16 sub_0204B610(FieldSystem *fieldSystem, u16 *linkAllyData); // SetLinkAllyData? BOOL sub_0204B66C(FieldSystem *fieldSystem, u16 *a1); BOOL sub_0204B690(FieldSystem *fieldSystem, u16 *a1); -void sub_0204B6AC(UnkStruct_Fsys_A0 *a0, SaveData *saveData); -void sub_0204B708(UnkStruct_Fsys_A0 *a0); -void sub_0204B720(UnkStruct_Fsys_A0 *a0, u32 a1); -u16 sub_0204B73C(UnkStruct_Fsys_A0 *a0, u8 a1, u8 a2, u32 a3); -u32 sub_0204BA04(UnkStruct_Fsys_A0 *a0, UnkStruct_0204B7D0 *a1, u16 a2, u32 a3, u16 *a4, u16 *a5, UnkStruct_0204A824_7E8 *a6, enum HeapID heapID); -void sub_0204BA50(UnkStruct_Fsys_A0 *a0, UnkStruct_0204B7D0 *a1, u16 a2, u32 a3, UnkStruct_0204A824_7E8 *a4, enum HeapID heapID); +void FrontierFieldSystem_0204B6AC(FrontierFieldSystem *frontierFsys, SaveData *saveData); +void FrontierFieldSystem_0204B708(FrontierFieldSystem *frontierFsys); +void FrontierFieldSystem_0204B720(FrontierFieldSystem *frontierFsys, u32 a1); +u16 FrontierFieldSystem_GetRandomFrontierTrainerID(FrontierFieldSystem *frontierFsys, u8 difficultyBracket, u8 winsThisRound, u32 towerMode); +u32 FrontierFieldSystem_0204BA04(FrontierFieldSystem *frontierFsys, FrontierTrainer *frontierTrainer, u16 frontierTrainerIndex, u32 numPokemon, u16 *partySpecies, u16 *partyItems, FrontierMultiBattleAllyData *allyData, enum HeapID heapID); +void FrontierFieldSystem_GenerateAllyFrontierMons(FrontierFieldSystem *frontierFsys, FrontierTrainer *frontierTrainer, u16 frontierTrainerIndex, u32 replaceItem, FrontierMultiBattleAllyData *allyData, enum HeapID heapID); #endif // POKEHEARTGOLD_UNK_0204B538_H diff --git a/src/encounter.c b/src/encounter.c index e72f5b3c7..1495c51cd 100644 --- a/src/encounter.c +++ b/src/encounter.c @@ -271,7 +271,7 @@ static BOOL Task_020509F0(TaskManager *taskManager) { break; case 3: sub_02052444(encounter->setup, fieldSystem); - if (fieldSystem->unkA0 != NULL) { + if (fieldSystem->frontierFsys != NULL) { sub_02067484(fieldSystem, &encounter->setup->unk138); } Encounter_GetResult(encounter, fieldSystem); diff --git a/src/field/scrcmd_message.c b/src/field/scrcmd_message.c index b1d547f80..7a1ca8b3e 100644 --- a/src/field/scrcmd_message.c +++ b/src/field/scrcmd_message.c @@ -98,18 +98,18 @@ BOOL ScrCmd_442(ScriptContext *ctx) { } BOOL ScrCmd_443(ScriptContext *ctx) { - u8 r1 = ScriptReadByte(ctx); - void *r2 = ctx->fieldSystem->unkA0; - if (r2 == NULL) { + u8 index = ScriptReadByte(ctx); + FrontierFieldSystem *frontierFsys = ctx->fieldSystem->frontierFsys; + if (frontierFsys == NULL) { return FALSE; } - u16 *r4 = r2 + 0x90 + r1 * 0x110; - if (r4[0] == 0xFFFF) { + MailMessage *intro = &frontierFsys->unk78[index].introMessage; + if (intro->msg_bank == 0xFFFF) { MsgData *messageData = NewMsgDataFromNarc(MSGDATA_LOAD_LAZY, NARC_msgdata_msg, 723, HEAP_ID_FIELD3); - ov01_021EF4DC(ctx, messageData, r4[1], TRUE, NULL); + ov01_021EF4DC(ctx, messageData, intro->msg_no, TRUE, NULL); DestroyMsgData(messageData); } else { - ov01_021EF564(ctx, r4[0], r4[1], r4[2], (s16)r4[3], TRUE); + ov01_021EF564(ctx, intro->msg_bank, intro->msg_no, intro->fields[0], intro->fields[1], TRUE); } SetupNativeScript(ctx, ov01_021EF348); return TRUE; diff --git a/src/overlay_25.c b/src/overlay_25.c index b0fe5ccbf..a0ccd5625 100644 --- a/src/overlay_25.c +++ b/src/overlay_25.c @@ -205,7 +205,7 @@ void TrainerHouse_StartBattle(FieldSystem *fieldSystem, u32 trainerNum) { } else { setup = TrainerHouse_NewBattleSetup(fieldSystem, &trainerHouse->sets[trainerNum]); } - fieldSystem->unkA0 = NULL; + fieldSystem->frontierFsys = NULL; u32 effect = BattleSetup_GetWildTransitionEffect(setup); u32 bgm = BattleSetup_GetWildBattleMusic(setup); u32 *winFlag = FieldSysGetAttrAddr(fieldSystem, SCRIPTENV_BATTLE_WIN_FLAG); diff --git a/src/scrcmd_9.c b/src/scrcmd_9.c index 5e7c3e8bb..ca4f736d1 100644 --- a/src/scrcmd_9.c +++ b/src/scrcmd_9.c @@ -36,25 +36,25 @@ #include "unk_02096910.h" static BOOL sub_0204A1E8(ScriptContext *ctx); -static u32 sub_0204A2A8(UnkStruct_Fsys_A0 *unkStruct, u8 a1); +static u32 FrontierFieldSystem_0204A2A8(FrontierFieldSystem *frontierFsys, u8 a1); -static const u16 _020FBF70[] = { 141, 145, 142, 143, 144 }; +static const u16 StatTrainerOverworlds[] = { SPRITE_SEVEN1, SPRITE_SEVEN5, SPRITE_SEVEN2, SPRITE_SEVEN3, SPRITE_SEVEN4 }; BOOL ScrCmd_410(ScriptContext *ctx) { - u16 unk4 = ScriptReadHalfword(ctx); - u16 unk6 = ScriptReadHalfword(ctx); - ctx->fieldSystem->unkA0 = sub_0204A824(FieldSystem_GetSaveData(ctx->fieldSystem), unk4, unk6); + u16 resumeFromPrevious = ScriptReadHalfword(ctx); + u16 towerMode = ScriptReadHalfword(ctx); + ctx->fieldSystem->frontierFsys = FrontierFieldSystem_New(FieldSystem_GetSaveData(ctx->fieldSystem), resumeFromPrevious, towerMode); return FALSE; } BOOL ScrCmd_409(ScriptContext *ctx) { - sub_0204A810(&(ctx->fieldSystem->unkA0)); + FrontierFieldSystem_0204A810(&ctx->fieldSystem->frontierFsys); return FALSE; } BOOL ScrCmd_411(ScriptContext *ctx) { - sub_0204AA2C(ctx->fieldSystem->unkA0); - ctx->fieldSystem->unkA0 = NULL; + FrontierFieldSystem_Free(ctx->fieldSystem->frontierFsys); + ctx->fieldSystem->frontierFsys = NULL; return FALSE; } @@ -64,17 +64,17 @@ BOOL ScrCmd_412(ScriptContext *ctx) { u16 arg = ScriptGetVar(ctx); u16 resultVarId = ScriptReadHalfword(ctx); u16 *result = GetVarPointer(ctx->fieldSystem, resultVarId); - UnkStruct_Fsys_A0 *unkStruct = ctx->fieldSystem->unkA0; + FrontierFieldSystem *frontierFsys = ctx->fieldSystem->frontierFsys; switch (id) { case 1: if (arg == 0) { - *result = sub_0204A5B0(unkStruct->unk0e, ctx->fieldSystem->saveData, TRUE); + *result = PartyIsValidForFrontier(frontierFsys->numMons, ctx->fieldSystem->saveData, TRUE); } else { - *result = sub_0204A5B0(arg, ctx->fieldSystem->saveData, TRUE); + *result = PartyIsValidForFrontier(arg, ctx->fieldSystem->saveData, TRUE); } break; case 2: - sub_0204A68C(); + ResetSystem(); break; case 3: sub_0204A698(sub_0202D908(ctx->fieldSystem->saveData)); @@ -92,10 +92,10 @@ BOOL ScrCmd_412(ScriptContext *ctx) { *result = sub_0204A6F8(ctx->fieldSystem->saveData, arg); break; case 9: - *result = sub_0204B120(NULL, ctx->fieldSystem->saveData, 2); + *result = FrontierFieldSystem_0204B120(NULL, ctx->fieldSystem->saveData, 2); break; case 10: - *result = sub_0204B120(NULL, ctx->fieldSystem->saveData, 0); + *result = FrontierFieldSystem_0204B120(NULL, ctx->fieldSystem->saveData, 0); break; case 11: sub_0204A730(ctx->fieldSystem->saveData, arg); @@ -114,78 +114,78 @@ BOOL ScrCmd_412(ScriptContext *ctx) { return TRUE; case 30: unk = FieldSysGetAttrAddr(ctx->fieldSystem, SCRIPTENV_RUNNING_APP_DATA); - sub_0204AA58(unkStruct, ctx->taskman, unk); + FrontierFieldSystem_0204AA58(frontierFsys, ctx->taskman, unk); return TRUE; case 31: unk = FieldSysGetAttrAddr(ctx->fieldSystem, SCRIPTENV_RUNNING_APP_DATA); - *result = sub_0204AA78(unkStruct, unk, ctx->fieldSystem->saveData); + *result = FrontierFieldSystem_0204AA78(frontierFsys, unk, ctx->fieldSystem->saveData); break; case 32: - *result = sub_0204AB10(unkStruct, ctx->fieldSystem->saveData); + *result = FrontierFieldSystem_PartyHasDuplicateSpeciesOrItems(frontierFsys, ctx->fieldSystem->saveData); break; case 35: - *result = sub_0204AC7C(unkStruct); + *result = FrontierFieldSystem_0204AC7C(frontierFsys); break; case 37: // unused - sub_0204AD04(unkStruct, ctx->fieldSystem->saveData); + FrontierFieldSystem_0204AD04(frontierFsys, ctx->fieldSystem->saveData); break; case 38: // unused - sub_0204AE20(unkStruct, ctx->fieldSystem->saveData); + FrontierFieldSystem_0204AE20(frontierFsys, ctx->fieldSystem->saveData); break; case 39: - sub_0204AF2C(unkStruct); + FrontierFieldSystem_0204AF2C(frontierFsys); break; case 56: - sub_0204AFE0(unkStruct); + FrontierFieldSystem_0204AFE0(frontierFsys); break; case 41: // unused - *result = sub_0204B044(unkStruct, arg); + *result = FrontierFieldSystem_0204B044(frontierFsys, arg); break; case 43: - *result = sub_0204B05C(unkStruct); + *result = FrontierFieldSystem_GetBattleTowerMode(frontierFsys); break; case 45: - *result = sub_0204B060(unkStruct); + *result = FrontierFieldSystem_GetPalmerDefeated(frontierFsys); break; case 47: // unused - sub_0204B0E0(unkStruct, ctx->fieldSystem->saveData); + FrontierFieldSystem_0204B0E0(frontierFsys, ctx->fieldSystem->saveData); break; case 48: - *result = sub_0204B1CC(unkStruct, ctx->fieldSystem->saveData); + *result = FrontierFieldSystem_TryGivePalmerRibbons(frontierFsys, ctx->fieldSystem->saveData); break; case 49: - *result = sub_0204B204(unkStruct, ctx->fieldSystem->saveData); + *result = FrontierFieldSystem_TryGiveOtherTowerRibbons(frontierFsys, ctx->fieldSystem->saveData); break; case 50: - unkStruct->unk10_5 = arg; + frontierFsys->multiBattleAllyID = arg; break; case 51: - *result = unkStruct->unk10_5; + *result = frontierFsys->multiBattleAllyID; break; case 52: - sub_0204ABC8(unkStruct, ctx->fieldSystem->saveData); + FrontierFieldSystem_SetRandomFrontierTrainers(frontierFsys, ctx->fieldSystem->saveData); break; case 53: - *result = unkStruct->unk2a[arg]; + *result = frontierFsys->partyMonIndexes[arg]; break; case 54: - *result = sub_0204B120(unkStruct, ctx->fieldSystem->saveData, 1); + *result = FrontierFieldSystem_0204B120(frontierFsys, ctx->fieldSystem->saveData, 1); break; case 55: - *result = sub_0204A2A8(unkStruct, arg); + *result = FrontierFieldSystem_0204A2A8(frontierFsys, arg); break; case 57: - *result = sub_0204B258(unkStruct, ctx->fieldSystem->saveData); + *result = FrontierFieldSystem_0204B258(frontierFsys, ctx->fieldSystem->saveData); break; case 100: - if (unkStruct == NULL) { + if (frontierFsys == NULL) { *result = TRUE; } else { *result = FALSE; } break; case 58: - MI_CpuClear8(unkStruct->unk884, sizeof(unkStruct->unk884)); + MI_CpuClear8(frontierFsys->unk884, sizeof(frontierFsys->unk884)); break; default: GF_ASSERT(FALSE); @@ -196,13 +196,13 @@ BOOL ScrCmd_412(ScriptContext *ctx) { } BOOL ScrCmd_413(ScriptContext *ctx) { - UnkStruct_Fsys_A0 *unkStruct = ctx->fieldSystem->unkA0; - u16 unk6 = ScriptGetVar(ctx); - u16 unk7 = ScriptGetVar(ctx); + FrontierFieldSystem *frontierFsys = ctx->fieldSystem->frontierFsys; + u16 multiBattleAllyIndex = ScriptGetVar(ctx); + u16 allyMonIndex = ScriptGetVar(ctx); u16 *speciesPtr = ScriptGetVarPointer(ctx); u16 *movePtr = ScriptGetVarPointer(ctx); - *speciesPtr = unkStruct->unk298[unk6].unk30[unk7].species; - *movePtr = unkStruct->unk298[unk6].unk30[unk7].moves[0]; + *speciesPtr = frontierFsys->frontierStatTrainers[multiBattleAllyIndex].frontierMons[allyMonIndex].species; + *movePtr = frontierFsys->frontierStatTrainers[multiBattleAllyIndex].frontierMons[allyMonIndex].moves[0]; return FALSE; } @@ -222,32 +222,32 @@ BOOL ScrCmd_416(ScriptContext *ctx) { u16 unk7 = ScriptGetVar(ctx); u16 unk4 = ScriptGetVar(ctx); u16 *unkPtr = ScriptGetVarPointer(ctx); - UnkStruct_Fsys_A0 *unkStruct = ctx->fieldSystem->unkA0; + FrontierFieldSystem *frontierFsys = ctx->fieldSystem->frontierFsys; *unkPtr = FALSE; u32 unk0; switch (unk7) { case 0: unk0 = 62; - sub_0204B6AC(ctx->fieldSystem->unkA0, ctx->fieldSystem->saveData); + FrontierFieldSystem_0204B6AC(ctx->fieldSystem->frontierFsys, ctx->fieldSystem->saveData); break; case 1: unk0 = 63; - sub_0204B708(ctx->fieldSystem->unkA0); + FrontierFieldSystem_0204B708(ctx->fieldSystem->frontierFsys); break; case 2: unk0 = 64; - sub_0204B720(ctx->fieldSystem->unkA0, unk4); + FrontierFieldSystem_0204B720(ctx->fieldSystem->frontierFsys, unk4); break; } if (sub_0205C298(ctx->fieldSystem->saveData) == 1) { - if (sub_02037C0C(sub_0203769C(), unkStruct->unk83e) == 1) { + if (sub_02037C0C(sub_0203769C(), frontierFsys->unk83e) == 1) { *unkPtr = TRUE; } else { return TRUE; } } else { - sub_02096910((void *)unkStruct); - if (sub_02037030(unk0, unkStruct->unk83e, sizeof(unkStruct->unk83e)) == 1) { + sub_02096910((void *)frontierFsys); + if (sub_02037030(unk0, frontierFsys->unk83e, sizeof(frontierFsys->unk83e)) == 1) { *unkPtr = TRUE; } } @@ -255,26 +255,26 @@ BOOL ScrCmd_416(ScriptContext *ctx) { } BOOL ScrCmd_417(ScriptContext *ctx) { - UnkStruct_Fsys_A0 *unkStruct = ctx->fieldSystem->unkA0; + FrontierFieldSystem *frontierFsys = ctx->fieldSystem->frontierFsys; u16 unk6 = ScriptGetVar(ctx); u16 unk7 = ScriptReadHalfword(ctx); if (sub_0205C298(ctx->fieldSystem->saveData) == 1) { sub_020672A4(ctx->fieldSystem->taskman, unk6, unk7); } else { - unkStruct->unk8DA = unk7; - unkStruct->unk8D5 = unk6; + frontierFsys->unk8DA = unk7; + frontierFsys->unk8D5 = unk6; SetupNativeScript(ctx, sub_0204A1E8); } return TRUE; } static BOOL sub_0204A1E8(ScriptContext *ctx) { - UnkStruct_Fsys_A0 *unkStruct = ctx->fieldSystem->unkA0; - u16 *unkPtr = GetVarPointer(ctx->fieldSystem, unkStruct->unk8DA); - u32 unk = unkStruct->unk8D5 == 1 ? 1 : 2; - if (unkStruct->unk8D4 == unk) { - unkStruct->unk8D4 = 0; - *unkPtr = unkStruct->unk8D8; + FrontierFieldSystem *frontierFsys = ctx->fieldSystem->frontierFsys; + u16 *unkPtr = GetVarPointer(ctx->fieldSystem, frontierFsys->unk8DA); + u32 unk = frontierFsys->unk8D5 == 1 ? 1 : 2; + if (frontierFsys->unk8D4 == unk) { + frontierFsys->unk8D4 = 0; + *unkPtr = frontierFsys->unk8D8; return TRUE; } else { return FALSE; @@ -297,16 +297,16 @@ BOOL ScrCmd_419(ScriptContext *ctx) { return FALSE; } -static u32 sub_0204A2A8(UnkStruct_Fsys_A0 *unkStruct, u8 a1) { +static u32 FrontierFieldSystem_0204A2A8(FrontierFieldSystem *frontierFsys, u8 a1) { if (a1 == 2) { - return unkStruct->unk10_5; + return frontierFsys->multiBattleAllyID; } else if (a1 == 1) { - if (unkStruct->unk0f == 2) { - return _020FBF70[unkStruct->unk10_5]; + if (frontierFsys->towerMode == TOWER_MODE_MULTI) { + return StatTrainerOverworlds[frontierFsys->multiBattleAllyID]; } - return unkStruct->unk12 ? 97 : 0; + return frontierFsys->linkAllyGender ? SPRITE_HEROINE : SPRITE_HERO; } else { - return unkStruct->unk11 ? 97 : 0; + return frontierFsys->trainerGender ? SPRITE_HEROINE : SPRITE_HERO; } } diff --git a/src/scrcmd_battle_arcade.c b/src/scrcmd_battle_arcade.c index a2616bec6..4d83656b1 100644 --- a/src/scrcmd_battle_arcade.c +++ b/src/scrcmd_battle_arcade.c @@ -72,7 +72,7 @@ BOOL ScrCmd_643(ScriptContext *ctx) { void *unk1 = FieldSysGetAttrAddr(ctx->fieldSystem, SCRIPTENV_RUNNING_APP_DATA); switch (arg0) { case 0: - *result = sub_0204A5B0(arg1, ctx->fieldSystem->saveData, 0); + *result = PartyIsValidForFrontier(arg1, ctx->fieldSystem->saveData, 0); break; case 1: // Unused if (arg1 == 3) { diff --git a/src/scrcmd_battle_castle.c b/src/scrcmd_battle_castle.c index c91266d7f..7b86639d6 100644 --- a/src/scrcmd_battle_castle.c +++ b/src/scrcmd_battle_castle.c @@ -72,7 +72,7 @@ BOOL ScrCmd_637(ScriptContext *ctx) { void *unk1 = FieldSysGetAttrAddr(ctx->fieldSystem, SCRIPTENV_RUNNING_APP_DATA); switch (arg0) { case 0: - *result = sub_0204A5B0(arg1, ctx->fieldSystem->saveData, 0); + *result = PartyIsValidForFrontier(arg1, ctx->fieldSystem->saveData, 0); break; case 1: // Unused if (arg1 == 3) { diff --git a/src/scrcmd_c.c b/src/scrcmd_c.c index 6054c2034..ba6f5d7be 100644 --- a/src/scrcmd_c.c +++ b/src/scrcmd_c.c @@ -4152,7 +4152,7 @@ BOOL ScrCmd_627(ScriptContext *ctx) { MI_CpuClear8(args, sizeof(FrontierLaunchArgs)); *pArgs = args; if (r6 == 5 || r6 == 6) { - args->unk0 = ctx->fieldSystem->unkA0; + args->unk0 = ctx->fieldSystem->frontierFsys; } else { args->unk0 = NULL; } diff --git a/src/unk_0204A3F4.c b/src/unk_0204A3F4.c index 29fded35f..196a41af1 100644 --- a/src/unk_0204A3F4.c +++ b/src/unk_0204A3F4.c @@ -28,34 +28,34 @@ typedef struct SpeciesAndItem { u16 item; } SpeciesAndItem; -static u32 sub_0204B318(UnkStruct_Fsys_A0 *a0); -static void sub_0204B470(UnkStruct_Fsys_A0 *a0, SaveData *saveData, u32 a2); -static BOOL sub_0204B2B8(SaveData *saveData, u32 ribbon, UnkStruct_Fsys_A0 *a2); +static u32 FrontierFieldSystem_0204B318(FrontierFieldSystem *frontierFsys); +static void FrontierFieldSystem_SetFrontierMons(FrontierFieldSystem *frontierFsys, SaveData *saveData, BOOL isWifiRoom); +static BOOL TryGiveTowerRibbons(SaveData *saveData, u32 ribbon, FrontierFieldSystem *frontierFsys); -static const u8 _020FBF98[] = { 0, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 0 }; +static const u8 WifiBattlePointRewards[] = { 0, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 0 }; static const u8 _020FBF8C[] = { 0, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0 }; -static const u8 _020FBF84[] = { 0, 3, 3, 4, 4, 5, 5, 7 }; -static const u8 _020FBF7C[] = { 0, 8, 9, 11, 12, 14, 15, 18 }; +static const u8 RegularBattlePointRewards[] = { 0, 3, 3, 4, 4, 5, 5, 7 }; +static const u8 LinkBattlePointRewards[] = { 0, 8, 9, 11, 12, 14, 15, 18 }; -static u32 sub_0204A3F4(u32 a0) { - switch (a0) { - case 0: - case 4: - case 5: +static u32 NumMonsForTowerMode(u32 towerMode) { + switch (towerMode) { + case TOWER_MODE_SINGLE: + case TOWER_MODE_WIFI: + case TOWER_MODE_WIFI_PRACTICE: return 3; - case 1: + case TOWER_MODE_DOUBLE: return 4; - case 2: - case 3: - case 6: + case TOWER_MODE_MULTI: + case TOWER_MODE_LINK: + case TOWER_MODE_6: return 2; default: return 0; } } -static BOOL sub_0204A424(SpeciesAndItem *validMons, u32 species, u32 item, s32 size) { - for (s32 i = 0; i < size; i++) { +static BOOL SpeciesAndItem_Contains(SpeciesAndItem *validMons, u32 species, u32 item, s32 partySize) { + for (s32 i = 0; i < partySize; i++) { if (species == validMons[i].species && item != ITEM_NONE && item == validMons[i].item) { @@ -65,7 +65,7 @@ static BOOL sub_0204A424(SpeciesAndItem *validMons, u32 species, u32 item, s32 s return FALSE; } -static BOOL sub_0204A450(SpeciesAndItem *mons, s32 size) { +static BOOL SpeciesAndItem_ValidateUnique(SpeciesAndItem *mons, s32 size) { for (s32 i = 0; i < size - 1; i++) { for (s32 j = i + 1; j < size; j++) { if (mons[i].species == mons[j].species) { @@ -79,8 +79,7 @@ static BOOL sub_0204A450(SpeciesAndItem *mons, s32 size) { return TRUE; } -static BOOL sub_0204A4A0(SpeciesAndItem *validMons, u32 numRequired, s32 numValid, s32 n) { - // this assumes that numRequired is always either 2, 3, or 4 +static BOOL SpeciesAndItem_ValidateAllUnique(SpeciesAndItem *validMons, u32 numRequired, s32 numValid, s32 n) { SpeciesAndItem mons[4]; MI_CpuClear8(mons, sizeof(SpeciesAndItem) * NELEMS(mons)); for (s32 i = 0; i < n; i++) { @@ -88,7 +87,7 @@ static BOOL sub_0204A4A0(SpeciesAndItem *validMons, u32 numRequired, s32 numVali for (s32 j = i + 1; j < numValid; j++) { mons[1] = validMons[j]; if (numRequired == 2) { - if (sub_0204A450(mons, numRequired)) { + if (SpeciesAndItem_ValidateUnique(mons, numRequired)) { return TRUE; } continue; @@ -96,14 +95,14 @@ static BOOL sub_0204A4A0(SpeciesAndItem *validMons, u32 numRequired, s32 numVali for (s32 k = j + 1; k < numValid; k++) { mons[2] = validMons[k]; if (numRequired == 3) { - if (sub_0204A450(mons, numRequired)) { + if (SpeciesAndItem_ValidateUnique(mons, numRequired)) { return TRUE; } continue; } for (s32 l = k + 1; l < numValid; l++) { mons[3] = validMons[l]; - if (sub_0204A450(mons, numRequired)) { + if (SpeciesAndItem_ValidateUnique(mons, numRequired)) { return TRUE; } } @@ -113,7 +112,7 @@ static BOOL sub_0204A4A0(SpeciesAndItem *validMons, u32 numRequired, s32 numVali return FALSE; } -BOOL sub_0204A5B0(u16 numRequired, SaveData *saveData, BOOL checkDuplicateItems) { +BOOL PartyIsValidForFrontier(u16 numRequired, SaveData *saveData, BOOL checkDuplicateItems) { u8 i; u8 partyCount; u8 numValid; @@ -138,7 +137,7 @@ BOOL sub_0204A5B0(u16 numRequired, SaveData *saveData, BOOL checkDuplicateItems) if (IsPokemonBannedFromBattleFrontier(species, form) == TRUE) { continue; } - if (checkDuplicateItems == TRUE && sub_0204A424(validMons, species, item, numValid) == TRUE) { + if (checkDuplicateItems == TRUE && SpeciesAndItem_Contains(validMons, species, item, numValid) == TRUE) { continue; } validMons[numValid].species = species; @@ -148,10 +147,10 @@ BOOL sub_0204A5B0(u16 numRequired, SaveData *saveData, BOOL checkDuplicateItems) if (numValid < numRequired) { return FALSE; } - return sub_0204A4A0(validMons, numRequired, numValid, numValid - numRequired + 1); + return SpeciesAndItem_ValidateAllUnique(validMons, numRequired, numValid, numValid - numRequired + 1); } -void sub_0204A68C(void) { +void ResetSystem(void) { OS_ResetSystem(0); } @@ -159,7 +158,7 @@ void sub_0204A698(u32 a0) { sub_0202D234(a0); } -u32 sub_0204A6A0(u32 a0) { +u32 sub_0204A6A0(u32 unused_0) { return sub_0202D3DC(); } @@ -179,18 +178,18 @@ void sub_0204A6E8(FieldSystem *fieldSystem) { ClearFlag966(Save_VarsFlags_Get(fieldSystem->saveData)); } -u32 sub_0204A6F8(SaveData *saveData, u32 a1) { - if (a1 == 5) { +u32 sub_0204A6F8(SaveData *saveData, u32 towerMode) { + if (towerMode == TOWER_MODE_WIFI_PRACTICE) { return FALSE; - } else if (a1 == 6) { + } else if (towerMode == TOWER_MODE_6) { return FrontierSave_GetStat(Save_Frontier_GetStatic(saveData), 113, sub_0205C268(113)); } else { - return FrontierSave_GetStat(Save_Frontier_GetStatic(saveData), 2 * a1 + 1, 0xff); + return FrontierSave_GetStat(Save_Frontier_GetStatic(saveData), 2 * towerMode + 1, 0xff); } } void sub_0204A730(SaveData *saveData, u8 a1) { - FRONTIERDATA *frontierData = Save_FrontierData_Get(saveData); + FrontierData *frontierData = Save_FrontierData_Get(saveData); if (a1 == 0) { sub_0202D5DC(frontierData, 5, 2); } else { @@ -204,116 +203,116 @@ u16 sub_0204A750(SaveData *saveData) { u32 sub_0204A764(SaveData *saveData) { u32 unk = sub_0202D908(saveData); - FRONTIERDATA *frontierData = Save_FrontierData_Get(saveData); - u8 unk4 = sub_0202D284(unk, 0, 0); - if (unk4 == 5) { - return unk4; + FrontierData *frontierData = Save_FrontierData_Get(saveData); + u8 towerMode = sub_0202D284(unk, 0, 0); + if (towerMode == TOWER_MODE_WIFI_PRACTICE) { + return towerMode; } - if (unk4 == 6) { + if (towerMode == TOWER_MODE_6) { sub_02031108(Save_Frontier_GetStatic(saveData), 100, sub_0205C268(100), 0); } else { - sub_0202D5DC(frontierData, unk4 + 8, 2); + sub_0202D5DC(frontierData, towerMode + 8, 2); } - sub_0202D57C(frontierData, unk4, 2); - sub_02031108(Save_Frontier_GetStatic(saveData), sub_0205C310(unk4), sub_0205C268(sub_0205C310(unk4)), 0); - if (unk4 != 4 && unk4 != 6) { + sub_0202D57C(frontierData, towerMode, 2); + sub_02031108(Save_Frontier_GetStatic(saveData), sub_0205C310(towerMode), sub_0205C268(sub_0205C310(towerMode)), 0); + if (towerMode != TOWER_MODE_WIFI && towerMode != TOWER_MODE_6) { sub_020674E0(saveData); } - return unk4; + return towerMode; } u16 sub_0204A800(SaveData *saveData) { return sub_0202D7B0(sub_0202D928(saveData)); } -void sub_0204A810(UnkStruct_Fsys_A0 **a0) { - GF_ASSERT(*a0 == NULL); - *a0 = NULL; +void FrontierFieldSystem_0204A810(FrontierFieldSystem **frontierFsys) { + GF_ASSERT(*frontierFsys == NULL); + *frontierFsys = NULL; } -UnkStruct_Fsys_A0 *sub_0204A824(SaveData *saveData, BOOL resumeFromPrevious, u32 a2) { - UnkStruct_Fsys_A0 *unkStruct = Heap_Alloc(HEAP_ID_FIELD2, sizeof(UnkStruct_Fsys_A0)); - MI_CpuClear8(unkStruct, sizeof(UnkStruct_Fsys_A0)); - unkStruct->heapID = HEAP_ID_FIELD2; - unkStruct->unk70 = sub_0202D908(saveData); - unkStruct->unk74 = Save_FrontierData_Get(saveData); - unkStruct->unk00 = 0x12345678; - sub_0202D3E4(unkStruct->unk70, 0); +FrontierFieldSystem *FrontierFieldSystem_New(SaveData *saveData, BOOL resumeFromPrevious, u32 towerMode) { + FrontierFieldSystem *frontierFsys = Heap_Alloc(HEAP_ID_FIELD2, sizeof(FrontierFieldSystem)); + MI_CpuClear8(frontierFsys, sizeof(FrontierFieldSystem)); + frontierFsys->heapID = HEAP_ID_FIELD2; + frontierFsys->unk70 = sub_0202D908(saveData); + frontierFsys->frontierData = Save_FrontierData_Get(saveData); + frontierFsys->initMagicNumber = 0x12345678; + sub_0202D3E4(frontierFsys->unk70, 0); if (!resumeFromPrevious) { - unkStruct->unk0f = a2; - unkStruct->unk0e = sub_0204A3F4(unkStruct->unk0f); - unkStruct->unk0c = 1; - unkStruct->curWinStreak = 0; + frontierFsys->towerMode = towerMode; + frontierFsys->numMons = NumMonsForTowerMode(frontierFsys->towerMode); + frontierFsys->currentBattleNumber = 1; + frontierFsys->curWinStreak = 0; for (u16 i = 0; i < 4; i++) { - unkStruct->unk2a[i] = 0xff; + frontierFsys->partyMonIndexes[i] = 0xff; } for (u16 i = 0; i < 14; i++) { - unkStruct->unk3e[i] = 0xffff; + frontierFsys->trainersInCurrentRound[i] = 0xffff; } - sub_0202D234(unkStruct->unk70); - u8 unk = unkStruct->unk0f; - sub_0202D308(unkStruct->unk70, 0, &unk); + sub_0202D234(frontierFsys->unk70); + u8 data = frontierFsys->towerMode; + sub_0202D308(frontierFsys->unk70, 0, &data); } else { - unkStruct->unk0f = sub_0202D284(unkStruct->unk70, 0, 0); - unkStruct->unk0c = sub_0202D284(unkStruct->unk70, 1, 0); - unkStruct->curWinStreak = unkStruct->unk0c - 1; - unkStruct->unk0e = sub_0204A3F4(unkStruct->unk0f); - sub_0202D284(unkStruct->unk70, 5, unkStruct->unk2a); - sub_0202D284(unkStruct->unk70, 8, unkStruct->unk3e); - unkStruct->unk08 = sub_0202D284(unkStruct->unk70, 10, 0); - if (unkStruct->unk0f == 2) { - unkStruct->unk10_5 = sub_0202D284(unkStruct->unk70, 9, 0); - sub_0202D284(unkStruct->unk70, 6, &unkStruct->unk7e8[unkStruct->unk10_5]); - sub_0204BA50(unkStruct, - &unkStruct->unk298[unkStruct->unk10_5], - 300 + unkStruct->unk10_5, - sub_0202D284(unkStruct->unk70, 7, 0), - &unkStruct->unk7e8[unkStruct->unk10_5], - unkStruct->heapID); + frontierFsys->towerMode = sub_0202D284(frontierFsys->unk70, 0, 0); + frontierFsys->currentBattleNumber = sub_0202D284(frontierFsys->unk70, 1, 0); + frontierFsys->curWinStreak = frontierFsys->currentBattleNumber - 1; + frontierFsys->numMons = NumMonsForTowerMode(frontierFsys->towerMode); + sub_0202D284(frontierFsys->unk70, 5, frontierFsys->partyMonIndexes); + sub_0202D284(frontierFsys->unk70, 8, frontierFsys->trainersInCurrentRound); + frontierFsys->unk08 = sub_0202D284(frontierFsys->unk70, 10, 0); + if (frontierFsys->towerMode == TOWER_MODE_MULTI) { + frontierFsys->multiBattleAllyID = sub_0202D284(frontierFsys->unk70, 9, 0); + sub_0202D284(frontierFsys->unk70, 6, &frontierFsys->multiBattleAllyData[frontierFsys->multiBattleAllyID]); + FrontierFieldSystem_GenerateAllyFrontierMons(frontierFsys, + &frontierFsys->frontierStatTrainers[frontierFsys->multiBattleAllyID], + 300 + frontierFsys->multiBattleAllyID, + sub_0202D284(frontierFsys->unk70, 7, 0), + &frontierFsys->multiBattleAllyData[frontierFsys->multiBattleAllyID], + frontierFsys->heapID); } } - unkStruct->unk11 = PlayerProfile_GetTrainerGender(Save_PlayerData_GetProfile(saveData)); - if (unkStruct->unk0f != 5) { + frontierFsys->trainerGender = PlayerProfile_GetTrainerGender(Save_PlayerData_GetProfile(saveData)); + if (frontierFsys->towerMode != TOWER_MODE_WIFI_PRACTICE) { FrontierSave *frontierSaveData = Save_Frontier_GetStatic(saveData); GameStats *gameStats = Save_GameStats_Get(saveData); u16 unk0; - if (unkStruct->unk0f == 6) { + if (frontierFsys->towerMode == TOWER_MODE_6) { unk0 = Save_VarsFlags_GetVar4052(Save_VarsFlags_Get(saveData)); } else { - unk0 = sub_0202D5DC(unkStruct->unk74, unkStruct->unk0f + 8, 0); + unk0 = sub_0202D5DC(frontierFsys->frontierData, frontierFsys->towerMode + 8, 0); } if (unk0 != 0) { u32 unk0; - if (unkStruct->unk0f == 6) { + if (frontierFsys->towerMode == TOWER_MODE_6) { unk0 = FrontierSave_GetStat(frontierSaveData, 113, sub_0205C268(113)); } else { - unk0 = FrontierSave_GetStat(frontierSaveData, 2 * unkStruct->unk0f + 1, 0xff); + unk0 = FrontierSave_GetStat(frontierSaveData, 2 * frontierFsys->towerMode + 1, 0xff); } - unkStruct->unk1a = unk0; - unkStruct->unk1c = sub_0202D57C(unkStruct->unk74, unkStruct->unk0f, 0); + frontierFsys->currentBattleInSession = unk0; + frontierFsys->currentRound = sub_0202D57C(frontierFsys->frontierData, frontierFsys->towerMode, 0); } - unkStruct->unk20 = GameStats_GetCapped(gameStats, GAME_STAT_BATTLE_TOWER_WIN_COUNT); + frontierFsys->totalTowerWins = GameStats_GetCapped(gameStats, GAME_STAT_BATTLE_TOWER_WIN_COUNT); } - if (unkStruct->unk0f == 6) { - unkStruct->unk1c = sub_0202D5C4(unkStruct->unk74, 6, unkStruct->unk1a / 7); + if (frontierFsys->towerMode == TOWER_MODE_6) { + frontierFsys->currentRound = sub_0202D5C4(frontierFsys->frontierData, 6, frontierFsys->currentBattleInSession / 7); } - return unkStruct; + return frontierFsys; } -void sub_0204AA2C(UnkStruct_Fsys_A0 *a0) { - if (a0 == NULL) { +void FrontierFieldSystem_Free(FrontierFieldSystem *frontierFsys) { + if (frontierFsys == NULL) { return; } - GF_ASSERT(a0->unk00 == 0x12345678); - MI_CpuClear8(a0, sizeof(UnkStruct_Fsys_A0)); - Heap_Free(a0); + GF_ASSERT(frontierFsys->initMagicNumber == 0x12345678); + MI_CpuClear8(frontierFsys, sizeof(FrontierFieldSystem)); + Heap_Free(frontierFsys); } -void sub_0204AA58(UnkStruct_Fsys_A0 *a0, TaskManager *taskManager, void *a2) { - sub_02067118(taskManager, a2, 17, 0, a0->unk0e, a0->unk0e, 100, 0); +void FrontierFieldSystem_0204AA58(FrontierFieldSystem *frontierFsys, TaskManager *taskManager, void *a2) { + sub_02067118(taskManager, a2, 17, 0, frontierFsys->numMons, frontierFsys->numMons, 100, 0); } -BOOL sub_0204AA78(UnkStruct_Fsys_A0 *a0, void **a1, SaveData *saveData) { +BOOL FrontierFieldSystem_0204AA78(FrontierFieldSystem *frontierFsys, void **a1, SaveData *saveData) { Party *party; u8 *unk = *a1; if (unk[0x27] != 0 || unk[0x26] == 7) { @@ -322,23 +321,23 @@ BOOL sub_0204AA78(UnkStruct_Fsys_A0 *a0, void **a1, SaveData *saveData) { return FALSE; } party = SaveArray_Party_Get(saveData); - for (u16 i = 0; i < a0->unk0e; i++) { - a0->unk2a[i] = unk[0x30 + i] - 1; - Pokemon *mon = Party_GetMonByIndex(party, a0->unk2a[i]); - a0->unk2e[i] = GetMonData(mon, MON_DATA_SPECIES, NULL); - a0->unk36[i] = GetMonData(mon, MON_DATA_HELD_ITEM, NULL); + for (u16 i = 0; i < frontierFsys->numMons; i++) { + frontierFsys->partyMonIndexes[i] = unk[0x30 + i] - 1; + Pokemon *mon = Party_GetMonByIndex(party, frontierFsys->partyMonIndexes[i]); + frontierFsys->partyMonSpecies[i] = GetMonData(mon, MON_DATA_SPECIES, NULL); + frontierFsys->partyMonItems[i] = GetMonData(mon, MON_DATA_HELD_ITEM, NULL); } Heap_Free(*a1); *a1 = NULL; return TRUE; } -u32 sub_0204AB10(UnkStruct_Fsys_A0 *a0, SaveData *saveData) { +u32 FrontierFieldSystem_PartyHasDuplicateSpeciesOrItems(FrontierFieldSystem *frontierFsys, SaveData *saveData) { u16 species[4]; u16 items[4]; Party *party = SaveArray_Party_Get(saveData); - for (u16 i = 0; i < a0->unk0e; i++) { - Pokemon *mon = Party_GetMonByIndex(party, a0->unk2a[i]); + for (u16 i = 0; i < frontierFsys->numMons; i++) { + Pokemon *mon = Party_GetMonByIndex(party, frontierFsys->partyMonIndexes[i]); species[i] = GetMonData(mon, MON_DATA_SPECIES, NULL); items[i] = GetMonData(mon, MON_DATA_HELD_ITEM, NULL); if (i == 0) { @@ -356,240 +355,238 @@ u32 sub_0204AB10(UnkStruct_Fsys_A0 *a0, SaveData *saveData) { return 0; } -static BOOL sub_0204ABA0(u16 *a0, u32 a1, u16 a2) { - for (u16 i = 0; i < a2; i++) { - if (a1 == a0[i]) { +static BOOL FrontierTrainerAlreadyInCurrentRound(u16 *existingIDs, u32 frontierTrainerID, u16 comparisons) { + for (u16 i = 0; i < comparisons; i++) { + if (frontierTrainerID == existingIDs[i]) { return TRUE; } } return FALSE; } -void sub_0204ABC8(UnkStruct_Fsys_A0 *a0, SaveData *saveData) { +void FrontierFieldSystem_SetRandomFrontierTrainers(FrontierFieldSystem *frontierFsys, SaveData *saveData) { // saveData is unused s32 i; - u32 unk; - u8 sp00; - if (a0->unk0f == 2 || a0->unk0f == 6 || a0->unk0f == 3) { - u32 temp; - if ((a0->unk0f == 3 && a0->unk14 > a0->unk1c) - || (a0->unk0f == 6 && a0->unk14 > a0->unk1c)) { - temp = a0->unk14; + u32 frontierTrainerID; + u8 difficultyBracket; + if (frontierFsys->towerMode == TOWER_MODE_MULTI || frontierFsys->towerMode == TOWER_MODE_6 || frontierFsys->towerMode == TOWER_MODE_LINK) { + u32 round; + if ((frontierFsys->towerMode == TOWER_MODE_LINK && frontierFsys->linkAllyRound > frontierFsys->currentRound) + || (frontierFsys->towerMode == TOWER_MODE_6 && frontierFsys->linkAllyRound > frontierFsys->currentRound)) { + round = frontierFsys->linkAllyRound; } else { - temp = a0->unk1c; + round = frontierFsys->currentRound; } - sp00 = temp; + difficultyBracket = round; for (i = 0; i < 14; i++) { do { - unk = sub_0204B73C(a0, sp00, i / 2, a0->unk0f); - } while (sub_0204ABA0(a0->unk3e, unk, i)); - a0->unk3e[i] = unk; + frontierTrainerID = FrontierFieldSystem_GetRandomFrontierTrainerID(frontierFsys, difficultyBracket, i / 2, frontierFsys->towerMode); + } while (FrontierTrainerAlreadyInCurrentRound(frontierFsys->trainersInCurrentRound, frontierTrainerID, i)); + frontierFsys->trainersInCurrentRound[i] = frontierTrainerID; } } else { for (i = 0; i < 7; i++) { do { - unk = sub_0204B73C(a0, a0->unk1c, i, a0->unk0f); - } while (sub_0204ABA0(a0->unk3e, unk, i)); - a0->unk3e[i] = unk; + frontierTrainerID = FrontierFieldSystem_GetRandomFrontierTrainerID(frontierFsys, frontierFsys->currentRound, i, frontierFsys->towerMode); + } while (FrontierTrainerAlreadyInCurrentRound(frontierFsys->trainersInCurrentRound, frontierTrainerID, i)); + frontierFsys->trainersInCurrentRound[i] = frontierTrainerID; } } } -u8 sub_0204AC78(UnkStruct_Fsys_A0 *a0) { - return a0->unk0c; +u8 FrontierFieldSystem_GetFrontierBattleNumber(FrontierFieldSystem *frontierFsys) { + return frontierFsys->currentBattleNumber; } -BOOL sub_0204AC7C(UnkStruct_Fsys_A0 *a0) { - if (a0->unk10_0) { +BOOL FrontierFieldSystem_0204AC7C(FrontierFieldSystem *frontierFsys) { + if (frontierFsys->unk10_0) { return TRUE; } - if (a0->unk0c > 7) { - a0->unk10_0 = TRUE; + if (frontierFsys->currentBattleNumber > 7) { + frontierFsys->unk10_0 = TRUE; return TRUE; } return FALSE; } -static void sub_0204ACA0(UnkStruct_Fsys_A0 *a0, SaveData *saveData, BOOL a2, u16 a3) { - // a2 and a3 are unused - switch (a0->unk0f) { - case 0: - sub_0204B470(a0, saveData, 0); +static void sub_0204ACA0(FrontierFieldSystem *frontierFsys, SaveData *saveData, BOOL unused_2, u16 unused_3) { + switch (frontierFsys->towerMode) { + case TOWER_MODE_SINGLE: + FrontierFieldSystem_SetFrontierMons(frontierFsys, saveData, FALSE); break; - case 1: + case TOWER_MODE_DOUBLE: break; - case 4: - sub_0204B470(a0, saveData, 1); - sub_0202D3B0(a0->unk70, a0->unk28, a0->unk24, a0->unk26); - u8 unk = a0->unk0f; - sub_0202D308(a0->unk70, 0, &unk); - unk = a0->unk0c; - sub_0202D308(a0->unk70, 1, &unk); - sub_0202D4FC(a0->unk74, a0->unk70); + case TOWER_MODE_WIFI: + FrontierFieldSystem_SetFrontierMons(frontierFsys, saveData, TRUE); + sub_0202D3B0(frontierFsys->unk70, frontierFsys->unk28, frontierFsys->unk24, frontierFsys->unk26); + u8 data = frontierFsys->towerMode; + sub_0202D308(frontierFsys->unk70, 0, &data); + data = frontierFsys->currentBattleNumber; + sub_0202D308(frontierFsys->unk70, 1, &data); + sub_0202D4FC(frontierFsys->frontierData, frontierFsys->unk70); } } -void sub_0204AD04(UnkStruct_Fsys_A0 *a0, SaveData *saveData) { +void FrontierFieldSystem_0204AD04(FrontierFieldSystem *frontierFsys, SaveData *saveData) { GameStats *gameStats = Save_GameStats_Get(saveData); FrontierSave *frontierSaveData = Save_Frontier_GetStatic(saveData); - if (a0->unk0f == 5) { + if (frontierFsys->towerMode == TOWER_MODE_WIFI_PRACTICE) { return; } - u32 unk4 = a0->unk0f == 6 ? 112 : a0->unk0f * 2; + u32 unk4 = frontierFsys->towerMode == TOWER_MODE_6 ? 112 : frontierFsys->towerMode * 2; FrontierSave_GetStat(frontierSaveData, unk4, sub_0205C268(unk4)); - sub_0203126C(frontierSaveData, unk4, sub_0205C268(unk4), a0->unk1a + a0->curWinStreak); - if (a0->unk0f == 6) { + sub_0203126C(frontierSaveData, unk4, sub_0205C268(unk4), frontierFsys->currentBattleInSession + frontierFsys->curWinStreak); + if (frontierFsys->towerMode == TOWER_MODE_6) { FrontierSave_GetStat(Save_Frontier_GetStatic(saveData), 100, sub_0205C268(100)); } else { - sub_0202D5DC(a0->unk74, a0->unk0f + 8, 0); + sub_0202D5DC(frontierFsys->frontierData, frontierFsys->towerMode + 8, 0); } - u32 unk = sub_02031108(frontierSaveData, unk4 + 1, sub_0205C268(unk4 + 1), a0->unk1a + a0->curWinStreak); - if (a0->unk0f == 6) { + u32 unk = sub_02031108(frontierSaveData, unk4 + 1, sub_0205C268(unk4 + 1), frontierFsys->currentBattleInSession + frontierFsys->curWinStreak); + if (frontierFsys->towerMode == TOWER_MODE_6) { sub_02031108(Save_Frontier_GetStatic(saveData), 100, sub_0205C268(100), 0); } else { - sub_0202D5DC(a0->unk74, a0->unk0f + 8, 2); + sub_0202D5DC(frontierFsys->frontierData, frontierFsys->towerMode + 8, 2); } - GameStats_Add(gameStats, GAME_STAT_BATTLE_TOWER_WIN_COUNT, a0->curWinStreak); - sub_0202D57C(a0->unk74, a0->unk0f, 2); - if (a0->unk0f != 6) { + GameStats_Add(gameStats, GAME_STAT_BATTLE_TOWER_WIN_COUNT, frontierFsys->curWinStreak); + sub_0202D57C(frontierFsys->frontierData, frontierFsys->towerMode, 2); + if (frontierFsys->towerMode != TOWER_MODE_6) { GameStats_Add(Save_GameStats_Get(saveData), GAME_STAT_BATTLE_TOWER_BATTLE_COUNT, 1); } - sub_0204B318(a0); + FrontierFieldSystem_0204B318(frontierFsys); unk++; if (unk > 9999) { unk = 9999; } - sub_0204ACA0(a0, saveData, 0, unk); + sub_0204ACA0(frontierFsys, saveData, 0, unk); } -void sub_0204AE20(UnkStruct_Fsys_A0 *a0, SaveData *saveData) { - if (a0->unk0f == 5) { +void FrontierFieldSystem_0204AE20(FrontierFieldSystem *frontierFsys, SaveData *saveData) { + if (frontierFsys->towerMode == TOWER_MODE_WIFI_PRACTICE) { return; } GameStats *gameStats = Save_GameStats_Get(saveData); FrontierSave *frontierSaveData = Save_Frontier_GetStatic(saveData); - u32 unk4 = a0->unk0f == 6 ? 112 : a0->unk0f * 2; - if (a0->unk0f == 6) { + u32 unk4 = frontierFsys->towerMode == TOWER_MODE_6 ? 112 : frontierFsys->towerMode * 2; + if (frontierFsys->towerMode == TOWER_MODE_6) { FrontierSave_GetStat(Save_Frontier_GetStatic(saveData), 100, sub_0205C268(100)); } else { - sub_0202D5DC(a0->unk74, a0->unk0f + 8, 0); + sub_0202D5DC(frontierFsys->frontierData, frontierFsys->towerMode + 8, 0); } - u32 unk6 = sub_02031108(frontierSaveData, unk4 + 1, sub_0205C268(unk4 + 1), a0->unk1a + a0->curWinStreak); - if (a0->unk0f == 6) { + u32 unk6 = sub_02031108(frontierSaveData, unk4 + 1, sub_0205C268(unk4 + 1), frontierFsys->currentBattleInSession + frontierFsys->curWinStreak); + if (frontierFsys->towerMode == TOWER_MODE_6) { sub_02031108(Save_Frontier_GetStatic(saveData), 100, sub_0205C268(100), 1); } else { - sub_0202D5DC(a0->unk74, a0->unk0f + 8, 1); + sub_0202D5DC(frontierFsys->frontierData, frontierFsys->towerMode + 8, 1); } FrontierSave_GetStat(frontierSaveData, unk4, sub_0205C268(unk4)); sub_0203126C(frontierSaveData, unk4, sub_0205C268(unk4), unk6); GameStats_Add(gameStats, GAME_STAT_BATTLE_TOWER_WIN_COUNT, 7); - sub_0202D57C(a0->unk74, a0->unk0f, 3); - if (a0->unk0f != 6) { + sub_0202D57C(frontierFsys->frontierData, frontierFsys->towerMode, 3); + if (frontierFsys->towerMode != TOWER_MODE_6) { GameStats_Add(gameStats, GAME_STAT_BATTLE_TOWER_BATTLE_COUNT, 1); } GameStats_AddScore(gameStats, SCORE_EVENT_14); - sub_0204B318(a0); - sub_0204ACA0(a0, saveData, 1, unk6); + FrontierFieldSystem_0204B318(frontierFsys); + sub_0204ACA0(frontierFsys, saveData, 1, unk6); } -void sub_0204AF2C(UnkStruct_Fsys_A0 *a0) { - u8 unk = a0->unk0f; - sub_0202D308(a0->unk70, 0, &unk); - unk = a0->unk0c; - sub_0202D308(a0->unk70, 1, &unk); - sub_0202D308(a0->unk70, 5, a0->unk2a); - sub_0202D3B0(a0->unk70, a0->unk28, a0->unk24, a0->unk26); - sub_0202D308(a0->unk70, 8, a0->unk3e); - sub_0202D308(a0->unk70, 10, &a0->unk08); - sub_0202D3E4(a0->unk70, 1); - if (a0->unk0f == 2) { - unk = a0->unk10_5; - sub_0202D308(a0->unk70, 9, &unk); - sub_0202D308(a0->unk70, 6, &a0->unk7e8[a0->unk10_5]); - sub_0202D308(a0->unk70, 7, &a0->unk838[a0->unk10_5]); +void FrontierFieldSystem_0204AF2C(FrontierFieldSystem *frontierFsys) { + u8 data = frontierFsys->towerMode; + sub_0202D308(frontierFsys->unk70, 0, &data); + data = frontierFsys->currentBattleNumber; + sub_0202D308(frontierFsys->unk70, 1, &data); + sub_0202D308(frontierFsys->unk70, 5, frontierFsys->partyMonIndexes); + sub_0202D3B0(frontierFsys->unk70, frontierFsys->unk28, frontierFsys->unk24, frontierFsys->unk26); + sub_0202D308(frontierFsys->unk70, 8, frontierFsys->trainersInCurrentRound); + sub_0202D308(frontierFsys->unk70, 10, &frontierFsys->unk08); + sub_0202D3E4(frontierFsys->unk70, 1); + if (frontierFsys->towerMode == TOWER_MODE_MULTI) { + data = frontierFsys->multiBattleAllyID; + sub_0202D308(frontierFsys->unk70, 9, &data); + sub_0202D308(frontierFsys->unk70, 6, &frontierFsys->multiBattleAllyData[frontierFsys->multiBattleAllyID]); + sub_0202D308(frontierFsys->unk70, 7, &frontierFsys->unk838[frontierFsys->multiBattleAllyID]); } } -void sub_0204AFE0(UnkStruct_Fsys_A0 *a0) { +void FrontierFieldSystem_0204AFE0(FrontierFieldSystem *frontierFsys) { for (s32 i = 0; i < 5; i++) { - a0->unk838[i] = sub_0204BA04(a0, &a0->unk298[i], 300 + i, a0->unk0e, a0->unk2e, a0->unk36, &a0->unk7e8[i], a0->heapID); + frontierFsys->unk838[i] = FrontierFieldSystem_0204BA04(frontierFsys, &frontierFsys->frontierStatTrainers[i], 300 + i, frontierFsys->numMons, frontierFsys->partyMonSpecies, frontierFsys->partyMonItems, &frontierFsys->multiBattleAllyData[i], frontierFsys->heapID); } } -u32 sub_0204B044(UnkStruct_Fsys_A0 *a0, u32 a1) { - sub_0204B5E8(a0->unk78[a1].unk04); +u32 FrontierFieldSystem_0204B044(FrontierFieldSystem *frontierFsys, u32 a1) { + GetFrontierTrainerOverworld(frontierFsys->unk78[a1].trainerClass); } -u32 sub_0204B05C(UnkStruct_Fsys_A0 *a0) { - return a0->unk0f; +u32 FrontierFieldSystem_GetBattleTowerMode(FrontierFieldSystem *frontierFsys) { + return frontierFsys->towerMode; } -u32 sub_0204B060(UnkStruct_Fsys_A0 *a0) { - return a0->unk10_1; +u32 FrontierFieldSystem_GetPalmerDefeated(FrontierFieldSystem *frontierFsys) { + return frontierFsys->palmerDefeated; } -u32 sub_0204B068(UnkStruct_Fsys_A0 *a0) { - u32 unk; - if (a0->unk0f == 5) { +u32 FrontierFieldSystem_AwardTowerBattlePoints(FrontierFieldSystem *frontierFsys) { + u32 battlePoints; + if (frontierFsys->towerMode == TOWER_MODE_WIFI_PRACTICE) { return 0; } - if (a0->unk0f == 4) { - unk = _020FBF98[sub_0202D488(a0->unk74, 0)]; + if (frontierFsys->towerMode == TOWER_MODE_WIFI) { + battlePoints = WifiBattlePointRewards[sub_0202D488(frontierFsys->frontierData, 0)]; } else { - if (a0->unk0f == 3 || a0->unk0f == 6) { - u32 index = sub_0202D57C(a0->unk74, a0->unk0f, 0); - if (index >= 7) { - unk = 18; + if (frontierFsys->towerMode == TOWER_MODE_LINK || frontierFsys->towerMode == TOWER_MODE_6) { + u32 round = sub_0202D57C(frontierFsys->frontierData, frontierFsys->towerMode, 0); + if (round >= 7) { + battlePoints = 18; } else { - unk = _020FBF7C[index]; + battlePoints = LinkBattlePointRewards[round]; } } else { - u32 index = sub_0202D57C(a0->unk74, a0->unk0f, 0); - if (a0->unk10_1) { - unk = 20; - } else if (index >= 7) { - unk = 7; + u32 round = sub_0202D57C(frontierFsys->frontierData, frontierFsys->towerMode, 0); + if (frontierFsys->palmerDefeated) { + battlePoints = 20; + } else if (round >= 7) { + battlePoints = 7; } else { - unk = _020FBF84[index]; + battlePoints = RegularBattlePointRewards[round]; } } } - FrontierData_BattlePointAction(a0->unk74, unk, 5); - return unk; + FrontierData_BattlePointAction(frontierFsys->frontierData, battlePoints, 5); + return battlePoints; } -BOOL sub_0204B0E0(UnkStruct_Fsys_A0 *a0, SaveData *saveData) { - u32 unk = sub_0204A6F8(saveData, a0->unk0f); +BOOL FrontierFieldSystem_0204B0E0(FrontierFieldSystem *frontierFsys, SaveData *saveData) { + u32 unk = sub_0204A6F8(saveData, frontierFsys->towerMode); if (unk < 50) { return FALSE; } else if (unk >= 100) { - if (sub_0202D5DC(a0->unk74, 1, 0)) { + if (sub_0202D5DC(frontierFsys->frontierData, 1, 0)) { return FALSE; } - } else if (sub_0202D5DC(a0->unk74, 0, 0)) { + } else if (sub_0202D5DC(frontierFsys->frontierData, 0, 0)) { return FALSE; } return TRUE; } -u32 sub_0204B120(UnkStruct_Fsys_A0 *a0, SaveData *saveData, u32 a2) { - FRONTIERDATA *frontierData = Save_FrontierData_Get(saveData); +u32 FrontierFieldSystem_0204B120(FrontierFieldSystem *frontierFsys, SaveData *saveData, u32 a2) { + FrontierData *frontierData = Save_FrontierData_Get(saveData); switch (a2) { case 0: return sub_0202D488(frontierData, 0); - case 1: { + case 1: sub_0202D5DC(frontierData, 4, 2); - s32 unk0 = sub_0202D488(frontierData, 0); + s32 unk0 = sub_0202D488(frontierData, 0); // Wifi Battle Rank? if (unk0 == 10) { - a0->unk10_4 = TRUE; + frontierFsys->unk10_4 = TRUE; return 0; } sub_0202D488(frontierData, 3); if (unk0 + 1 >= 5) { - a0->unk10_4 = TRUE; + frontierFsys->unk10_4 = TRUE; } return 1; - } case 2: { u32 unk4 = sub_0202D450(frontierData, 3); s32 unk0 = sub_0202D488(frontierData, 0); @@ -609,68 +606,68 @@ u32 sub_0204B120(UnkStruct_Fsys_A0 *a0, SaveData *saveData, u32 a2) { return 0; } -BOOL sub_0204B1CC(UnkStruct_Fsys_A0 *a0, SaveData *saveData) { - if (a0->unk0f != 0) { +BOOL FrontierFieldSystem_TryGivePalmerRibbons(FrontierFieldSystem *frontierFsys, SaveData *saveData) { + if (frontierFsys->towerMode != TOWER_MODE_SINGLE) { return FALSE; } - switch (a0->unk10_1) { + switch (frontierFsys->palmerDefeated) { case 1: - return sub_0204B2B8(saveData, MON_DATA_ABILITY_RIBBON, a0); + return TryGiveTowerRibbons(saveData, MON_DATA_ABILITY_RIBBON, frontierFsys); case 2: - return sub_0204B2B8(saveData, MON_DATA_GREAT_ABILITY_RIBBON, a0); + return TryGiveTowerRibbons(saveData, MON_DATA_GREAT_ABILITY_RIBBON, frontierFsys); } return FALSE; } -BOOL sub_0204B204(UnkStruct_Fsys_A0 *a0, SaveData *saveData) { - if (a0->unk0f == 5) { +BOOL FrontierFieldSystem_TryGiveOtherTowerRibbons(FrontierFieldSystem *frontierFsys, SaveData *saveData) { + if (frontierFsys->towerMode == TOWER_MODE_WIFI_PRACTICE) { return FALSE; } - if (a0->unk0f == 6) { + if (frontierFsys->towerMode == TOWER_MODE_6) { return FALSE; } - if (!a0->unk10_4) { + if (!frontierFsys->unk10_4) { return FALSE; } u32 ribbon; - switch (a0->unk0f) { - case 1: + switch (frontierFsys->towerMode) { + case TOWER_MODE_DOUBLE: ribbon = MON_DATA_DOUBLE_ABILITY_RIBBON; break; - case 2: + case TOWER_MODE_MULTI: ribbon = MON_DATA_MULTI_ABILITY_RIBBON; break; - case 3: + case TOWER_MODE_LINK: ribbon = MON_DATA_PAIR_ABILITY_RIBBON; break; - case 4: + case TOWER_MODE_WIFI: ribbon = MON_DATA_WORLD_ABILITY_RIBBON; break; } - return sub_0204B2B8(saveData, ribbon, a0); + return TryGiveTowerRibbons(saveData, ribbon, frontierFsys); } -u16 sub_0204B258(UnkStruct_Fsys_A0 *a0, SaveData *saveData) { +u16 FrontierFieldSystem_0204B258(FrontierFieldSystem *frontierFsys, SaveData *saveData) { u8 unk; - if (a0->unk0f == 6) { + if (frontierFsys->towerMode == TOWER_MODE_6) { unk = FrontierSave_GetStat(Save_Frontier_GetStatic(saveData), 100, sub_0205C268(100)); } else { - unk = sub_0202D5DC(a0->unk74, a0->unk0f + 8, 0); + unk = sub_0202D5DC(frontierFsys->frontierData, frontierFsys->towerMode + 8, 0); } if (unk == 0) { - a0->unk08 = sub_020674E0(saveData); + frontierFsys->unk08 = sub_020674E0(saveData); } else { - a0->unk08 = sub_0206751C(saveData); + frontierFsys->unk08 = sub_0206751C(saveData); } - return a0->unk08 / 0xffff; + return frontierFsys->unk08 / 0xffff; // unk08 is a u32, so this should return between 0-3. } -static BOOL sub_0204B2B8(SaveData *saveData, u32 ribbon, UnkStruct_Fsys_A0 *a2) { +static BOOL TryGiveTowerRibbons(SaveData *saveData, u32 ribbon, FrontierFieldSystem *a2) { u8 value = TRUE; Party *party = SaveArray_Party_Get(saveData); u8 count = 0; - for (s32 i = 0; i < a2->unk0e; i++) { - Pokemon *mon = Party_GetMonByIndex(party, a2->unk2a[i]); + for (s32 i = 0; i < a2->numMons; i++) { + Pokemon *mon = Party_GetMonByIndex(party, a2->partyMonIndexes[i]); if (GetMonData(mon, ribbon, NULL) == FALSE) { SetMonData(mon, ribbon, &value); count++; @@ -683,50 +680,50 @@ static BOOL sub_0204B2B8(SaveData *saveData, u32 ribbon, UnkStruct_Fsys_A0 *a2) } } -static u32 sub_0204B318(UnkStruct_Fsys_A0 *a0) { - if (a0->unk0f == 5 || a0->unk0f == 0 || a0->unk0f == 6 || a0->unk0f == 4) { +static u32 FrontierFieldSystem_0204B318(FrontierFieldSystem *frontierFsys) { + if (frontierFsys->towerMode == TOWER_MODE_WIFI_PRACTICE || frontierFsys->towerMode == TOWER_MODE_SINGLE || frontierFsys->towerMode == TOWER_MODE_6 || frontierFsys->towerMode == TOWER_MODE_WIFI) { return FALSE; } - if ((u16)(a0->unk1a + a0->curWinStreak) < 50) { + if ((u16)(frontierFsys->currentBattleInSession + frontierFsys->curWinStreak) < 50) { return FALSE; } - a0->unk10_4 = TRUE; + frontierFsys->unk10_4 = TRUE; return TRUE; } -static void sub_0204B34C(UnkStruct_0204B470 *a0, Pokemon *mon) { - a0->species = GetMonData(mon, MON_DATA_SPECIES, NULL); - a0->form = GetMonData(mon, MON_DATA_FORM, NULL); - a0->item = GetMonData(mon, MON_DATA_HELD_ITEM, NULL); +static void SetFrontierMon(FrontierMon *frontierMon, Pokemon *mon) { + frontierMon->species = GetMonData(mon, MON_DATA_SPECIES, NULL); + frontierMon->form = GetMonData(mon, MON_DATA_FORM, NULL); + frontierMon->item = GetMonData(mon, MON_DATA_HELD_ITEM, NULL); for (s32 i = 0; i < MAX_MON_MOVES; i++) { - a0->moves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, NULL); - a0->ppUp |= GetMonData(mon, MON_DATA_MOVE1_PP_UPS + i, NULL) << (i * 2); + frontierMon->moves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, NULL); + frontierMon->ppUp |= GetMonData(mon, MON_DATA_MOVE1_PP_UPS + i, NULL) << (i * 2); } - a0->language = GetMonData(mon, MON_DATA_LANGUAGE, NULL); - a0->otId = GetMonData(mon, MON_DATA_OT_ID, NULL); - a0->pid = GetMonData(mon, MON_DATA_PERSONALITY, NULL); - a0->ivsWord = GetMonData(mon, MON_DATA_COMBINED_IVS, NULL); + frontierMon->language = GetMonData(mon, MON_DATA_LANGUAGE, NULL); + frontierMon->otId = GetMonData(mon, MON_DATA_OT_ID, NULL); + frontierMon->pid = GetMonData(mon, MON_DATA_PERSONALITY, NULL); + frontierMon->ivsWord = GetMonData(mon, MON_DATA_COMBINED_IVS, NULL); for (s32 i = 0; i < NUM_STATS; i++) { - a0->evs[i] = GetMonData(mon, MON_DATA_HP_EV + i, NULL); + frontierMon->evs[i] = GetMonData(mon, MON_DATA_HP_EV + i, NULL); } - a0->ability = GetMonData(mon, MON_DATA_ABILITY, NULL); - a0->friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL); - GetMonData(mon, MON_DATA_NICKNAME, a0->nickname); + frontierMon->ability = GetMonData(mon, MON_DATA_ABILITY, NULL); + frontierMon->friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL); + GetMonData(mon, MON_DATA_NICKNAME, frontierMon->nickname); } -static void sub_0204B470(UnkStruct_Fsys_A0 *a0, SaveData *saveData, u32 a2) { - UnkStruct_0204B470 *unkStructs = Heap_AllocAtEnd(a0->heapID, 3 * sizeof(UnkStruct_0204B470)); - MI_CpuClear8(unkStructs, 3 * sizeof(UnkStruct_0204B470)); +static void FrontierFieldSystem_SetFrontierMons(FrontierFieldSystem *frontierFsys, SaveData *saveData, BOOL isWifiRoom) { + FrontierMon *frontierMons = Heap_AllocAtEnd(frontierFsys->heapID, 3 * sizeof(FrontierMon)); + MI_CpuClear8(frontierMons, 3 * sizeof(FrontierMon)); Party *party = SaveArray_Party_Get(saveData); for (s32 i = 0; i < 3; i++) { - sub_0204B34C(&unkStructs[i], Party_GetMonByIndex(party, a0->unk2a[i])); + SetFrontierMon(&frontierMons[i], Party_GetMonByIndex(party, frontierFsys->partyMonIndexes[i])); } - sub_0202D4B8(a0->unk74, a2, unkStructs); - MI_CpuClear8(unkStructs, 3 * sizeof(UnkStruct_0204B470)); - Heap_Free(unkStructs); + sub_0202D4B8(frontierFsys->frontierData, isWifiRoom, frontierMons); // FrontierData_SetFrontierMons? + MI_CpuClear8(frontierMons, 3 * sizeof(FrontierMon)); + Heap_Free(frontierMons); } -u8 sub_0204B4D4(u32 frontierTrainerIndex) { +u8 GetFrontierTrainerIVs(u32 frontierTrainerIndex) { if (frontierTrainerIndex < 100) { return 3; } @@ -751,10 +748,10 @@ u8 sub_0204B4D4(u32 frontierTrainerIndex) { return 31; } -u16 sub_0204B510(UnkStruct_Fsys_A0 *a0) { - if (a0->unk0f == 6) { +u16 FrontierFieldSystem_0204B510(FrontierFieldSystem *frontierFsys) { + if (frontierFsys->towerMode == TOWER_MODE_6) { return LCRandom(); } - a0->unk08 = sub_020674A4(a0->unk08); - return a0->unk08 / 0xffff; + frontierFsys->unk08 = sub_020674A4(frontierFsys->unk08); + return frontierFsys->unk08 / 0xffff; // unk08 is a u32, so this should return between 0-3. } diff --git a/src/unk_0204B538.c b/src/unk_0204B538.c index 346907a1e..112d3fdc9 100644 --- a/src/unk_0204B538.c +++ b/src/unk_0204B538.c @@ -5,6 +5,7 @@ #include "constants/abilities.h" #include "constants/items.h" #include "constants/moves.h" +#include "constants/sprites.h" #include "msgdata/msg.naix" @@ -22,104 +23,108 @@ #include "unk_02035900.h" #include "unk_0204A3F4.h" -typedef struct FrontierMon { +typedef struct FrontierMonNarcData { u16 species; u16 moves[4]; u8 evs; u8 nature; u16 item; u16 form; -} FrontierMon; +} FrontierMonNarcData; -static u32 sub_0204BABC(UnkStruct_Fsys_A0 *a0, u16 *a1, u16 frontierTrainerIndex, UnkStruct_0204B470 *a3, u8 a4, u16 *a5, u16 *a6, UnkStruct_0204A824_7E8 *a7, enum HeapID heapID); -static u16 *sub_0204BC7C(u32 frontierTrainerIndex, enum HeapID heapID); -static void GetFrontierMon(FrontierMon *mon, u32 frontierMonIndex); +static u32 FrontierFieldSystem_0204BABC(FrontierFieldSystem *frontierFsys, u16 *frontierTrainerData, u16 frontierTrainerIndex, FrontierMon *frontierMon, u8 numPokemon, u16 *partySpecies, u16 *partyItems, FrontierMultiBattleAllyData *allyData, enum HeapID heapID); +static u16 *GetFrontierTrainerData(u32 frontierTrainerIndex, enum HeapID heapID); +static void GetFrontierMonNarcData(FrontierMonNarcData *mon, u32 frontierMonIndex); -static const u16 _020FBFA4[] = { ITEM_BRIGHTPOWDER, ITEM_LUM_BERRY, ITEM_LEFTOVERS, ITEM_QUICK_CLAW }; -static const u16 _020FBFAC[][2] = { - { 0, 99 }, - { 80, 119 }, - { 100, 139 }, - { 120, 159 }, - { 140, 179 }, - { 160, 199 }, - { 180, 219 }, - { 200, 299 }, +static const u16 ItemReplacementList[] = { ITEM_BRIGHTPOWDER, ITEM_LUM_BERRY, ITEM_LEFTOVERS, ITEM_QUICK_CLAW }; + +// Frontier Trainer IDs grouped by when they show up normally. IDs 0-99 show up normally in battles 1-7, IDs 80-119 show up normally in battles 8-14, etc. +static const u16 FrontierTrainerDifficultyBracket[][2] = { + { 0, 99 }, // Bracket 0: 1-7. + { 80, 119 }, // Bracket 1: 8-14. + { 100, 139 }, // Bracket 2: 15-21. + { 120, 159 }, // Bracket 3: 22-28. + { 140, 179 }, // Bracket 4: 29-35. + { 160, 199 }, // Bracket 5: 36-42. + { 180, 219 }, // Bracket 6: 43-49. + { 200, 299 }, // Bracket 7: 50+. Unused. }; -static const u16 _020FBFEC[][2] = { - { 90, 141 }, - { 91, 142 }, - { 92, 143 }, - { 93, 144 }, - { 94, 145 }, - { 2, 4 }, - { 3, 6 }, - { 60, 3 }, - { 61, 8 }, - { 32, 62 }, - { 33, 63 }, - { 4, 52 }, - { 5, 53 }, - { 44, 1 }, - { 45, 2 }, - { 20, 15 }, - { 21, 16 }, - { 81, 59 }, - { 26, 60 }, - { 16, 9 }, - { 17, 12 }, - { 83, 23 }, - { 84, 22 }, - { 71, 41 }, - { 18, 42 }, - { 12, 38 }, - { 13, 39 }, - { 14, 51 }, - { 10, 7 }, - { 27, 17 }, - { 35, 37 }, - { 49, 70 }, - { 50, 70 }, - { 39, 11 }, - { 40, 14 }, - { 24, 11 }, - { 25, 14 }, - { 53, 68 }, - { 54, 69 }, - { 29, 11 }, - { 6, 5 }, - { 28, 1 }, - { 19, 45 }, - { 11, 54 }, - { 46, 56 }, - { 9, 20 }, - { 48, 50 }, - { 52, 10 }, - { 37, 19 }, - { 57, 31 }, - { 78, 29 }, - { 34, 36 }, - { 59, 40 }, - { 58, 43 }, - { 38, 34 }, - { 51, 62 }, - { 69, 14 }, - { 80, 55 }, - { 36, 13 }, - { 7, 12 }, - { 85, 35 }, - { 15, 44 }, - { 22, 71 }, +// Unused. +static const u16 FrontierTrainerOverworlds[][2] = { + { TRAINERCLASS_PKMN_TRAINER_CHERYL, SPRITE_SEVEN1 }, + { TRAINERCLASS_PKMN_TRAINER_RILEY, SPRITE_SEVEN2 }, + { TRAINERCLASS_PKMN_TRAINER_BUCK, SPRITE_SEVEN3 }, + { TRAINERCLASS_PKMN_TRAINER_MIRA, SPRITE_SEVEN4 }, + { TRAINERCLASS_PKMN_TRAINER_MARLEY, SPRITE_SEVEN5 }, + { TRAINERCLASS_YOUNGSTER, SPRITE_BOY2 }, + { TRAINERCLASS_LASS, SPRITE_GIRL1 }, + { TRAINERCLASS_SCHOOL_KID_M, SPRITE_BOY1 }, + { TRAINERCLASS_SCHOOL_KID_F, SPRITE_GIRL3 }, + { TRAINERCLASS_RICH_BOY, SPRITE_GORGGEOUSM }, + { TRAINERCLASS_LADY, SPRITE_GORGGEOUSW }, + { TRAINERCLASS_CAMPER, SPRITE_CAMPBOY }, + { TRAINERCLASS_PICNICKER, SPRITE_PICNICGIRL }, + { TRAINERCLASS_TUBER_M, SPRITE_BABYBOY1 }, // Seems to be mislabelled. + { TRAINERCLASS_TUBER_F, SPRITE_BABYGIRL1 }, // Same here. + { TRAINERCLASS_POKEFAN_M, SPRITE_MIDDLEMAN1 }, + { TRAINERCLASS_POKEFAN, SPRITE_MIDDLEWOMAN1 }, + { TRAINERCLASS_WAITER, SPRITE_WAITER }, + { TRAINERCLASS_WAITRESS, SPRITE_WAITRESS }, + { TRAINERCLASS_PKMN_BREEDER_M, SPRITE_MAN1 }, + { TRAINERCLASS_PKMN_BREEDER_F, SPRITE_WOMAN1 }, + { TRAINERCLASS_CAMERAMAN, SPRITE_CAMERAMAN }, + { TRAINERCLASS_REPORTER, SPRITE_REPORTER }, + { TRAINERCLASS_RANCHER, SPRITE_FARMER }, + { TRAINERCLASS_COWGIRL, SPRITE_COWGIRL }, + { TRAINERCLASS_CYCLIST_M, SPRITE_CYCLEM }, + { TRAINERCLASS_CYCLIST_F, SPRITE_CYCLEW }, + { TRAINERCLASS_BLACK_BELT, SPRITE_FIGHTER }, + { TRAINERCLASS_BATTLE_GIRL, SPRITE_GIRL2 }, + { TRAINERCLASS_VETERAN, SPRITE_OLDMAN1 }, + { TRAINERCLASS_SOCIALITE, SPRITE_LADY }, + { TRAINERCLASS_PSYCHIC_M, SPRITE_MYSTERY }, + { TRAINERCLASS_PSYCHIC_F, SPRITE_MYSTERY }, + { TRAINERCLASS_PKMN_RANGER_M, SPRITE_MAN3 }, + { TRAINERCLASS_PKMN_RANGER_F, SPRITE_WOMAN3 }, + { TRAINERCLASS_ACE_TRAINER_M, SPRITE_MAN3 }, + { TRAINERCLASS_ACE_TRAINER_F, SPRITE_WOMAN3 }, + { TRAINERCLASS_ACE_TRAINER_M_GS, SPRITE_MAN5 }, + { TRAINERCLASS_ACE_TRAINER_F_GS, SPRITE_WOMAN5 }, + { TRAINERCLASS_DRAGON_TAMER, SPRITE_MAN3 }, + { TRAINERCLASS_BUG_CATCHER, SPRITE_BOY3 }, + { TRAINERCLASS_NINJA_BOY, SPRITE_BABYBOY1 }, + { TRAINERCLASS_JOGGER, SPRITE_SPORTSMAN }, + { TRAINERCLASS_FISHERMAN, SPRITE_FISHING }, + { TRAINERCLASS_SAILOR, SPRITE_SEAMAN }, + { TRAINERCLASS_HIKER, SPRITE_MOUNT }, + { TRAINERCLASS_RUIN_MANIAC, SPRITE_EXPLORE }, + { TRAINERCLASS_GUITARIST, SPRITE_MAN2 }, + { TRAINERCLASS_COLLECTOR, SPRITE_BIGMAN }, + { TRAINERCLASS_ROUGHNECK, SPRITE_BADMAN }, + { TRAINERCLASS_SUPER_NERD, SPRITE_ASSISTANTM }, + { TRAINERCLASS_GENTLEMAN, SPRITE_GENTLEMAN }, + { TRAINERCLASS_WORKER, SPRITE_WORKMAN }, + { TRAINERCLASS_CLOWN, SPRITE_CLOWN }, + { TRAINERCLASS_POLICEMAN, SPRITE_POLICEMAN }, + { TRAINERCLASS_PI, SPRITE_GORGGEOUSM }, + { TRAINERCLASS_BIRD_KEEPER_GS, SPRITE_WOMAN3 }, + { TRAINERCLASS_PARASOL_LADY, SPRITE_AMBRELLA }, + { TRAINERCLASS_BEAUTY, SPRITE_WOMAN2 }, + { TRAINERCLASS_AROMA_LADY, SPRITE_WOMAN1 }, + { TRAINERCLASS_IDOL, SPRITE_IDOL }, + { TRAINERCLASS_ARTIST, SPRITE_ARTIST }, + { TRAINERCLASS_POKE_KID, SPRITE_PIKACHU }, }; -static const u16 _020FBFCC[][2] = { - { 100, 119 }, - { 120, 139 }, - { 140, 159 }, - { 160, 179 }, - { 180, 199 }, - { 200, 219 }, - { 220, 239 }, - { 200, 299 }, +// Trainer IDs grouped by when they show up as bracket bosses. +static const u16 FrontierTrainerBracketBosses[][2] = { + { 100, 119 }, // Bracket 0: Battle 7 + { 120, 139 }, // Bracket 1: Battle 14 + { 140, 159 }, // Bracket 2: Battle 21 + { 160, 179 }, // Bracket 3: Battle 28 + { 180, 199 }, // Bracket 4: Battle 35 + { 200, 219 }, // Bracket 5: Battle 42 + { 220, 239 }, // Bracket 6: Battle 49 + { 200, 299 }, // Bracket 7: All trainers are no longer special. This appears to be unused. }; MessageFormat *sub_0204B538(SaveData *saveData, u16 numEligiblePokemon, u16 a2, u8 a3, u8 *numLegendaryPokemonSeen) { @@ -148,137 +153,139 @@ MessageFormat *sub_0204B538(SaveData *saveData, u16 numEligiblePokemon, u16 a2, return messageFormat; } -u32 sub_0204B5E8(u8 a0) { - for (u32 i = 0; i < NELEMS(_020FBFEC); i++) { - if (a0 == _020FBFEC[i][0]) { - return _020FBFEC[i][1]; +u32 GetFrontierTrainerOverworld(u8 trainerClass) { + for (u32 i = 0; i < NELEMS(FrontierTrainerOverworlds); i++) { + if (trainerClass == FrontierTrainerOverworlds[i][0]) { + return FrontierTrainerOverworlds[i][1]; } } - return 3; + return SPRITE_BOY1; } -u16 sub_0204B610(FieldSystem *fieldSystem, u16 *a1) { - u16 unk = 0; - UnkStruct_Fsys_A0 *unkStruct = fieldSystem->unkA0; - unkStruct->unk12 = a1[0]; - unkStruct->unk16 = a1[1]; - unkStruct->unk18 = a1[2]; - unkStruct->unk14 = a1[3]; - unkStruct->unk10_5 = unkStruct->unk12 + 5; - if (unkStruct->unk2e[0] == unkStruct->unk16 || unkStruct->unk2e[0] == unkStruct->unk18) { - unk++; +u16 sub_0204B610(FieldSystem *fieldSystem, u16 *linkAllyData) { // SetLinkAllyData? + u16 match = 0; + FrontierFieldSystem *frontierFsys = fieldSystem->frontierFsys; + frontierFsys->linkAllyGender = linkAllyData[0]; + frontierFsys->linkAllyMonSpecies[0] = linkAllyData[1]; + frontierFsys->linkAllyMonSpecies[1] = linkAllyData[2]; + frontierFsys->linkAllyRound = linkAllyData[3]; + frontierFsys->multiBattleAllyID = frontierFsys->linkAllyGender + 5; // Either 5 or 6. + if (frontierFsys->partyMonSpecies[0] == frontierFsys->linkAllyMonSpecies[0] || frontierFsys->partyMonSpecies[0] == frontierFsys->linkAllyMonSpecies[1]) { + match++; } - if (unkStruct->unk2e[1] == unkStruct->unk16 || unkStruct->unk2e[1] == unkStruct->unk18) { - unk += 2; + if (frontierFsys->partyMonSpecies[1] == frontierFsys->linkAllyMonSpecies[0] || frontierFsys->partyMonSpecies[1] == frontierFsys->linkAllyMonSpecies[1]) { + match += 2; } - return unk; + return match; // return 1 if partyMonSpecies[0] matches, 2 if partyMonSpecies[1] matches, 3 if both match. } BOOL sub_0204B66C(FieldSystem *fieldSystem, u16 *a1) { - UnkStruct_Fsys_A0 *unkStruct = fieldSystem->unkA0; + FrontierFieldSystem *frontierFsys = fieldSystem->frontierFsys; if (sub_0203769C() == 0) { return FALSE; } - MI_CpuCopy8(a1, unkStruct->unk3e, sizeof(unkStruct->unk3e)); + MI_CpuCopy8(a1, frontierFsys->trainersInCurrentRound, sizeof(frontierFsys->trainersInCurrentRound)); return TRUE; } BOOL sub_0204B690(FieldSystem *fieldSystem, u16 *a1) { - return fieldSystem->unkA0->unk10_3 || a1[0] != 0; + return fieldSystem->frontierFsys->unk10_3 || a1[0] != 0; } -void sub_0204B6AC(UnkStruct_Fsys_A0 *a0, SaveData *saveData) { - a0->unk83e[0] = PlayerProfile_GetTrainerGender(Save_PlayerData_GetProfile(saveData)); +void FrontierFieldSystem_0204B6AC(FrontierFieldSystem *frontierFsys, SaveData *saveData) { + frontierFsys->unk83e[0] = PlayerProfile_GetTrainerGender(Save_PlayerData_GetProfile(saveData)); Party *party = SaveArray_Party_Get(saveData); for (s32 i = 0; i < 2; i++) { - Pokemon *mon = Party_GetMonByIndex(party, a0->unk2a[i]); - a0->unk83e[1 + i] = GetMonData(mon, MON_DATA_SPECIES, NULL); + Pokemon *mon = Party_GetMonByIndex(party, frontierFsys->partyMonIndexes[i]); + frontierFsys->unk83e[1 + i] = GetMonData(mon, MON_DATA_SPECIES, NULL); } - a0->unk83e[3] = sub_0202D57C(a0->unk74, 3, 0); + frontierFsys->unk83e[3] = sub_0202D57C(frontierFsys->frontierData, 3, 0); } -void sub_0204B708(UnkStruct_Fsys_A0 *a0) { - MI_CpuCopy8(a0->unk3e, a0->unk83e, sizeof(a0->unk3e)); +void FrontierFieldSystem_0204B708(FrontierFieldSystem *frontierFsys) { + MI_CpuCopy8(frontierFsys->trainersInCurrentRound, frontierFsys->unk83e, sizeof(frontierFsys->trainersInCurrentRound)); } -void sub_0204B720(UnkStruct_Fsys_A0 *a0, u32 a1) { - a0->unk10_3 = a1; - a0->unk83e[0] = a1; +void FrontierFieldSystem_0204B720(FrontierFieldSystem *frontierFsys, u32 a1) { + frontierFsys->unk10_3 = a1; + frontierFsys->unk83e[0] = a1; } -u16 sub_0204B73C(UnkStruct_Fsys_A0 *a0, u8 a1, u8 a2, u32 a3) { - if (a3 == 0) { - if (a1 == 2 && a2 == 6) { - return 305; +u16 FrontierFieldSystem_GetRandomFrontierTrainerID(FrontierFieldSystem *frontierFsys, u8 difficultyBracket, u8 winsThisRound, u32 towerMode) { + if (towerMode == TOWER_MODE_SINGLE) { + // If we are between battles 15-21 and have completed 6 battles in our current round, meaning this is battle 21: + if (difficultyBracket == 2 && winsThisRound == 6) { + return 305; // Palmer (Silver Print) } - if (a1 == 6 && a2 == 6) { - return 306; + // If we are between battles 43-49 and have completed 6 battles in our current round, meaning this is battle 49: + if (difficultyBracket == 6 && winsThisRound == 6) { + return 306; // Palmer (Gold Print) } } - if (a1 < 7) { - if (a2 == 6) { - u16 mod = _020FBFCC[a1][1] - _020FBFCC[a1][0] + 1; - return sub_0204B510(a0) % mod + _020FBFCC[a1][0]; + if (difficultyBracket < 7) { + if (winsThisRound == 6) { + u16 mod = FrontierTrainerBracketBosses[difficultyBracket][1] - FrontierTrainerBracketBosses[difficultyBracket][0] + 1; + return FrontierFieldSystem_0204B510(frontierFsys) % mod + FrontierTrainerBracketBosses[difficultyBracket][0]; } else { - u16 mod = _020FBFAC[a1][1] - _020FBFAC[a1][0] + 1; - return sub_0204B510(a0) % mod + _020FBFAC[a1][0]; + u16 mod = FrontierTrainerDifficultyBracket[difficultyBracket][1] - FrontierTrainerDifficultyBracket[difficultyBracket][0] + 1; + return FrontierFieldSystem_0204B510(frontierFsys) % mod + FrontierTrainerDifficultyBracket[difficultyBracket][0]; } } else { - return sub_0204B510(a0) % 100 + 200; + return FrontierFieldSystem_0204B510(frontierFsys) % 100 + 200; } } -static u16 *sub_0204B7D0(UnkStruct_0204B7D0 *a0, u32 frontierTrainerIndex, enum HeapID heapID) { +static u16 *sub_0204B7D0(FrontierTrainer *frontierTrainer, u32 frontierTrainerIndex, enum HeapID heapID) { MsgData *messageData = NewMsgDataFromNarc(MSGDATA_LOAD_LAZY, NARC_msgdata_msg, NARC_msg_msg_0027_bin, heapID); - MI_CpuClear8(a0, sizeof(UnkStruct_0204B7D0)); - u16 *unk = sub_0204BC7C(frontierTrainerIndex, heapID); - a0->unk00 = frontierTrainerIndex; - a0->unk18 = 0xffff; - a0->unk1a = frontierTrainerIndex * 3; - a0->unk04 = unk[0]; + MI_CpuClear8(frontierTrainer, sizeof(FrontierTrainer)); + u16 *frontierTrainerData = GetFrontierTrainerData(frontierTrainerIndex, heapID); + frontierTrainer->index = frontierTrainerIndex; + frontierTrainer->introMessage.msg_bank = 0xffff; + frontierTrainer->introMessage.msg_no = frontierTrainerIndex * 3; + frontierTrainer->trainerClass = frontierTrainerData[0]; String *trainerName = NewString_ReadMsgData(messageData, frontierTrainerIndex); - CopyStringToU16Array(trainerName, a0->unk08, NELEMS(a0->unk08)); + CopyStringToU16Array(trainerName, frontierTrainer->name, NELEMS(frontierTrainer->name)); String_Delete(trainerName); DestroyMsgData(messageData); - return unk; + return frontierTrainerData; } -static u32 sub_0204B834(UnkStruct_Fsys_A0 *a0, UnkStruct_0204B470 *a1, u16 frontierMonIndex, u32 otId, u32 a4, u8 iv, u8 a6, BOOL a7, enum HeapID heapID) { +static u32 sub_0204B834(FrontierFieldSystem *frontierFsys, FrontierMon *frontierMon, u16 frontierMonIndex, u32 otId, u32 pid, u8 iv, u8 replacementItemIndex, BOOL replaceItem, enum HeapID heapID) { s32 i; - FrontierMon frontierMon; - MI_CpuClear8(a1, sizeof(UnkStruct_0204B470)); - GetFrontierMon(&frontierMon, frontierMonIndex); - a1->species = frontierMon.species; - a1->form = frontierMon.form; - a1->item = a7 ? _020FBFA4[a6] : frontierMon.item; + FrontierMonNarcData frontierMonNarcData; + MI_CpuClear8(frontierMon, sizeof(FrontierMon)); + GetFrontierMonNarcData(&frontierMonNarcData, frontierMonIndex); + frontierMon->species = frontierMonNarcData.species; + frontierMon->form = frontierMonNarcData.form; + frontierMon->item = replaceItem ? ItemReplacementList[replacementItemIndex] : frontierMonNarcData.item; u32 friendship = FRIENDSHIP_MAX; for (i = 0; i < MAX_MON_MOVES; i++) { - a1->moves[i] = frontierMon.moves[i]; - if (frontierMon.moves[i] == MOVE_FRUSTRATION) { + frontierMon->moves[i] = frontierMonNarcData.moves[i]; + if (frontierMonNarcData.moves[i] == MOVE_FRUSTRATION) { friendship = 0; } } - a1->otId = otId; - u32 pid; - if (a4 == 0) { + frontierMon->otId = otId; + u32 pidGen; + if (pid == 0) { do { - pid = sub_0204B510(a0) | sub_0204B510(a0) << 16; - } while (frontierMon.nature != GetNatureFromPersonality(pid) - || CalcShininessByOtIdAndPersonality(otId, pid) == TRUE); - a1->pid = pid; + pidGen = FrontierFieldSystem_0204B510(frontierFsys) | FrontierFieldSystem_0204B510(frontierFsys) << 16; + } while (frontierMonNarcData.nature != GetNatureFromPersonality(pidGen) + || CalcShininessByOtIdAndPersonality(otId, pidGen) == TRUE); + frontierMon->pid = pidGen; } else { - a1->pid = a4; - pid = a4; + frontierMon->pid = pid; + pidGen = pid; } - a1->hpIv = iv; - a1->atkIv = iv; - a1->defIv = iv; - a1->spdIv = iv; - a1->spAtkIv = iv; - a1->spDefIv = iv; + frontierMon->hpIv = iv; + frontierMon->atkIv = iv; + frontierMon->defIv = iv; + frontierMon->spdIv = iv; + frontierMon->spAtkIv = iv; + frontierMon->spDefIv = iv; s32 ev = 0; for (i = 0; i < NUM_STATS; i++) { - if (frontierMon.evs & MaskOfFlagNo(i)) { + if (frontierMonNarcData.evs & MaskOfFlagNo(i)) { ev++; } } @@ -287,130 +294,131 @@ static u32 sub_0204B834(UnkStruct_Fsys_A0 *a0, UnkStruct_0204B470 *a1, u16 front ev = 255; } for (i = 0; i < NUM_STATS; i++) { - if (frontierMon.evs & MaskOfFlagNo(i)) { - a1->evs[i] = ev; + if (frontierMonNarcData.evs & MaskOfFlagNo(i)) { + frontierMon->evs[i] = ev; } } - a1->ppUp = 0; - a1->language = gGameLanguage; - u32 ability = GetMonBaseStat(a1->species, BASE_ABILITY_2); + frontierMon->ppUp = 0; + frontierMon->language = gGameLanguage; + u32 ability = GetMonBaseStat(frontierMon->species, BASE_ABILITY_2); if (ability != ABILITY_NONE) { - if (a1->pid % 2) { - a1->ability = ability; + if (frontierMon->pid % 2) { + frontierMon->ability = ability; } else { - a1->ability = GetMonBaseStat(a1->species, BASE_ABILITY_1); + frontierMon->ability = GetMonBaseStat(frontierMon->species, BASE_ABILITY_1); } } else { - a1->ability = GetMonBaseStat(a1->species, BASE_ABILITY_1); + frontierMon->ability = GetMonBaseStat(frontierMon->species, BASE_ABILITY_1); } - a1->friendship = friendship; - GetSpeciesNameIntoArray(a1->species, heapID, a1->nickname); - return pid; + frontierMon->friendship = friendship; + GetSpeciesNameIntoArray(frontierMon->species, heapID, frontierMon->nickname); + return pidGen; } -u32 sub_0204BA04(UnkStruct_Fsys_A0 *a0, UnkStruct_0204B7D0 *a1, u16 frontierTrainerIndex, u32 a3, u16 *a4, u16 *a5, UnkStruct_0204A824_7E8 *a6, enum HeapID heapID) { - u16 *unk7 = sub_0204B7D0(a1, frontierTrainerIndex, heapID); - u32 unk4 = sub_0204BABC(a0, unk7, frontierTrainerIndex, a1->unk30, a3, a4, a5, a6, heapID); - Heap_Free(unk7); - return unk4; +u32 FrontierFieldSystem_0204BA04(FrontierFieldSystem *frontierFsys, FrontierTrainer *frontierTrainer, u16 frontierTrainerIndex, u32 numPokemon, u16 *partySpecies, u16 *partyItems, FrontierMultiBattleAllyData *allyData, enum HeapID heapID) { + u16 *frontierTrainerData = sub_0204B7D0(frontierTrainer, frontierTrainerIndex, heapID); + u32 replaceItem = FrontierFieldSystem_0204BABC(frontierFsys, frontierTrainerData, frontierTrainerIndex, frontierTrainer->frontierMons, numPokemon, partySpecies, partyItems, allyData, heapID); + Heap_Free(frontierTrainerData); + return replaceItem; } -void sub_0204BA50(UnkStruct_Fsys_A0 *a0, UnkStruct_0204B7D0 *a1, u16 frontierTrainerIndex, u32 a3, UnkStruct_0204A824_7E8 *a4, enum HeapID heapID) { +void FrontierFieldSystem_GenerateAllyFrontierMons(FrontierFieldSystem *frontierFsys, FrontierTrainer *frontierTrainer, u16 frontierTrainerIndex, u32 replaceItem, FrontierMultiBattleAllyData *allyData, enum HeapID heapID) { u8 iv; - u16 *unk = sub_0204B7D0(a1, frontierTrainerIndex, heapID); - iv = sub_0204B4D4(frontierTrainerIndex); + u16 *frontierTrainerData = sub_0204B7D0(frontierTrainer, frontierTrainerIndex, heapID); + iv = GetFrontierTrainerIVs(frontierTrainerIndex); for (s32 i = 0; i < 2; i++) { - sub_0204B834(a0, &a1->unk30[i], a4->unk04[i], a4->otId, a4->unk08[i], iv, i, a3, heapID); + sub_0204B834(frontierFsys, &frontierTrainer->frontierMons[i], allyData->frontierMonIDs[i], allyData->otId, allyData->frontierMonPIDs[i], iv, i, replaceItem, heapID); } - Heap_Free(unk); + Heap_Free(frontierTrainerData); } -static u32 sub_0204BABC(UnkStruct_Fsys_A0 *a0, u16 *a1, u16 frontierTrainerIndex, UnkStruct_0204B470 *a3, u8 a4, u16 *a5, u16 *a6, UnkStruct_0204A824_7E8 *a7, enum HeapID heapID) { +static u32 FrontierFieldSystem_0204BABC(FrontierFieldSystem *frontierFsys, u16 *frontierTrainerData, u16 frontierTrainerIndex, FrontierMon *frontierMon, u8 numPokemon, u16 *partySpecies, u16 *partyItems, FrontierMultiBattleAllyData *allyData, enum HeapID heapID) { s32 i; u8 iv; u32 otId; u32 frontierMonIndex; - u32 unk6c[4]; - u32 unk5c[4]; - s32 unk2c; - BOOL unk28 = FALSE; - FrontierMon unk3c; - FrontierMon unk4c; - GF_ASSERT(a4 <= 4); - s32 unk = 0; - unk2c = 0; - while (unk != a4) { - u8 index = sub_0204B510(a0) % a1[1]; - frontierMonIndex = a1[2 + index]; - GetFrontierMon(&unk4c, frontierMonIndex); - for (i = 0; i < unk; i++) { - GetFrontierMon(&unk3c, unk6c[i]); - if (unk3c.species == unk4c.species) { + u32 frontierMonIDs[4]; + u32 frontierMonPIDs[4]; + s32 failedItemGenAttempts; + BOOL replaceItem = FALSE; + FrontierMonNarcData frontierMonNarcData_1; + FrontierMonNarcData frontierMonNarcData_2; + GF_ASSERT(numPokemon <= 4); + + s32 count = 0; + failedItemGenAttempts = 0; + while (count != numPokemon) { + u8 index = FrontierFieldSystem_0204B510(frontierFsys) % frontierTrainerData[1]; + frontierMonIndex = frontierTrainerData[2 + index]; + GetFrontierMonNarcData(&frontierMonNarcData_2, frontierMonIndex); + for (i = 0; i < count; i++) { + GetFrontierMonNarcData(&frontierMonNarcData_1, frontierMonIDs[i]); + if (frontierMonNarcData_1.species == frontierMonNarcData_2.species) { break; } } - if (i != unk) { + if (i != count) { continue; } - if (a5) { - for (i = 0; i < a4; i++) { - if (a5[i] == unk4c.species) { + if (partySpecies) { + for (i = 0; i < numPokemon; i++) { + if (partySpecies[i] == frontierMonNarcData_2.species) { break; } } - if (i != a4) { + if (i != numPokemon) { continue; } } - if (unk2c < 50) { - for (i = 0; i < unk; i++) { - GetFrontierMon(&unk3c, unk6c[i]); - if (unk3c.item && unk3c.item == unk4c.item) { + if (failedItemGenAttempts < 50) { + for (i = 0; i < count; i++) { + GetFrontierMonNarcData(&frontierMonNarcData_1, frontierMonIDs[i]); + if (frontierMonNarcData_1.item && frontierMonNarcData_1.item == frontierMonNarcData_2.item) { break; } } - if (i != unk) { - unk2c++; + if (i != count) { + failedItemGenAttempts++; continue; } - if (a6) { - for (i = 0; i < a4; i++) { - if (a6[i] == unk4c.item && a6[i] != ITEM_NONE) { + if (partyItems) { + for (i = 0; i < numPokemon; i++) { + if (partyItems[i] == frontierMonNarcData_2.item && partyItems[i] != ITEM_NONE) { break; } } - if (i != a4) { - unk2c++; + if (i != numPokemon) { + failedItemGenAttempts++; continue; } } } - unk6c[unk] = frontierMonIndex; - unk++; + frontierMonIDs[count] = frontierMonIndex; + count++; } - iv = sub_0204B4D4(frontierTrainerIndex); - otId = sub_0204B510(a0) | sub_0204B510(a0) << 16; - if (unk2c >= 50) { - unk28 = TRUE; + iv = GetFrontierTrainerIVs(frontierTrainerIndex); + otId = FrontierFieldSystem_0204B510(frontierFsys) | FrontierFieldSystem_0204B510(frontierFsys) << 16; + if (failedItemGenAttempts >= 50) { + replaceItem = TRUE; } - for (i = 0; i < unk; i++) { - unk5c[i] = sub_0204B834(a0, &a3[i], unk6c[i], otId, 0, iv, i, unk28, heapID); + for (i = 0; i < count; i++) { + frontierMonPIDs[i] = sub_0204B834(frontierFsys, &frontierMon[i], frontierMonIDs[i], otId, 0, iv, i, replaceItem, heapID); } - if (a7 == NULL) { - return unk28; + if (allyData == NULL) { + return replaceItem; } - a7->otId = otId; + allyData->otId = otId; for (i = 0; i < 2; i++) { - a7->unk04[i] = unk6c[i]; - a7->unk08[i] = unk5c[i]; + allyData->frontierMonIDs[i] = frontierMonIDs[i]; + allyData->frontierMonPIDs[i] = frontierMonPIDs[i]; } - return unk28; + return replaceItem; } -static u16 *sub_0204BC7C(u32 frontierTrainerIndex, enum HeapID heapID) { +static u16 *GetFrontierTrainerData(u32 frontierTrainerIndex, enum HeapID heapID) { return AllocAndReadWholeNarcMemberByIdPair(NARC_a_2_0_2, frontierTrainerIndex, heapID); } -static void GetFrontierMon(FrontierMon *mon, u32 frontierMonIndex) { +static void GetFrontierMonNarcData(FrontierMonNarcData *mon, u32 frontierMonIndex) { ReadWholeNarcMemberByIdPair(mon, NARC_a_2_0_3, frontierMonIndex); } diff --git a/src/unk_02069528.c b/src/unk_02069528.c index 1c3956ae6..fa7a2dffa 100644 --- a/src/unk_02069528.c +++ b/src/unk_02069528.c @@ -11,7 +11,7 @@ void sub_02069528(SaveData *saveData, s32 a1, UnkStruct_02069528 *a2) { PlayerProfile *playerProfile = Save_PlayerData_GetProfile(saveData); SaveWiFiHistory *saveWiFiHistory = Save_WiFiHistory_Get(saveData); - FRONTIERDATA *frontierData = Save_FrontierData_Get(saveData); + FrontierData *frontierData = Save_FrontierData_Get(saveData); MI_CpuFill8(a2, 0, sizeof(UnkStruct_02069528)); MI_CpuCopy8(PlayerProfile_GetNamePtr(playerProfile), &a2->playerName, (PLAYER_NAME_LENGTH + 1) * sizeof(u16)); a2->trainerId = PlayerProfile_GetTrainerID(playerProfile);