Merge pull request #447 from Pixelstyx/master
Some checks failed
build / build (push) Has been cancelled
Close stale issues and PRs / stale-bot (push) Has been cancelled

Lots of Battle Tower clarifications
This commit is contained in:
Adrienn Tindall 2026-04-26 21:05:49 -04:00 committed by GitHub
commit 3de8101377
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
23 changed files with 726 additions and 714 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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

View File

@ -8,7 +8,7 @@
#include "save.h"
typedef struct NintendoWifiConnectArgs {
FRONTIERDATA *frontierData;
FrontierData *frontierData;
u32 unk4;
SysInfo *sysInfo;
SaveData *saveData;

View File

@ -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

View File

@ -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);

View File

@ -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

View File

@ -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

View File

@ -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);

View File

@ -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;

View File

@ -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);

View File

@ -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;
}
}

View File

@ -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) {

View File

@ -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) {

View File

@ -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;
}

View File

@ -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.
}

View File

@ -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);
}

View File

@ -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);