summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/battle_frontier_1.c581
-rw-r--r--src/battle_tent.c4
2 files changed, 537 insertions, 48 deletions
diff --git a/src/battle_frontier_1.c b/src/battle_frontier_1.c
index 332446d75..1ac84962f 100644
--- a/src/battle_frontier_1.c
+++ b/src/battle_frontier_1.c
@@ -2,6 +2,7 @@
#include "battle.h"
#include "battle_setup.h"
#include "battle_frontier_1.h"
+#include "battle_tower.h"
#include "battle_message.h"
#include "event_data.h"
#include "overworld.h"
@@ -37,7 +38,7 @@
#define DOME_FINAL 3
#define DOME_ROUNDS_COUNT 4
-struct Unknown_0203BC8C_Struct
+struct FacilityMon
{
u16 species;
u16 moves[4];
@@ -68,6 +69,7 @@ extern bool8 sub_81A3610(void);
extern u16 sub_81A4FF0(u8);
extern u8 GetFrontierTrainerFrontSpriteId(u16);
extern u8 GetFrontierOpponentClass(u16);
+extern void sub_80F94E8(void);
extern u8 gUnknown_0203CEF8[];
extern u32 gUnknown_0203CD70;
@@ -80,7 +82,7 @@ extern u16 gBattle_BG2_X;
extern u16 gBattle_BG2_Y;
extern u16 gBattle_BG3_X;
extern u16 gBattle_BG3_Y;
-extern struct Unknown_0203BC8C_Struct *gFacilityTrainerMons;
+extern const struct FacilityMon *gFacilityTrainerMons;
extern struct Unknown_0203CD78_Struct *gUnknown_0203CD78;
extern u8 *gUnknown_0203CD7C;
@@ -97,7 +99,7 @@ extern const struct SpriteTemplate gUnknown_0860D068;
extern const struct SpriteTemplate gUnknown_0860D050;
extern const u8 gUnknown_0860D080[];
extern const u8 gUnknown_0860D15C[];
-extern const u8 gUnknown_0860D1A0[];
+extern const u8 gUnknown_0860D1A0[][4];
extern const u8 gUnknown_0860D19C[];
extern const u8 gUnknown_0860D349[];
extern const u8 gUnknown_0860D1C0[];
@@ -120,6 +122,8 @@ extern const u8 *const gBattleDomeOpponentStylePointers[];
extern const u8 *const gBattleDomeOpponentStatsPointers[];
extern const u8 *const gBattleDomeWinStringsPointers[];
extern const u8 *const gBattleDomeMatchNumberPointers[];
+extern const struct FacilityMon gBattleFrontierMons[];
+extern const struct BattleFrontierTrainer gBattleFrontierTrainers[];
// gfx
extern const u8 gUnknown_08D83D50[];
@@ -142,7 +146,7 @@ u8 GetDomeTrainerMonIvs(u16 trainerId);
void SwapDomeTrainers(s32 id1, s32 id2, u16 *statsArray);
void CalcDomeMonStats(u16 species, s32 level, s32 ivs, u8 evBits, u8 nature, s32 *stats);
void CreateDomeTrainerMons(u16 tournamentTrainerId);
-s32 TrainerIdToTournamentId(u16 trainerId);
+static s32 TrainerIdToTournamentId(u16 trainerId);
s32 GetTrainerMonCountInBits(u16 tournamentTrainerId);
s32 sub_818FCBC(u16 tournamentTrainerId, bool8 arg1);
s32 sub_818FDB8(u16 tournamentTrainerId, bool8 arg1);
@@ -154,7 +158,7 @@ void sub_8190CD4(u8 taskId);
void sub_8194220(u8 taskId);
void sub_8194950(u8 taskId);
static void CB2_BattleDome(void);
-void sub_8194B70(void);
+static void VblankCb0_BattleDome(void);
static void DisplayMatchInfoOnCard(u8 flags, u8 matchNo);
static void DisplayTrainerInfoOnCard(u8 flags, u8 trainerTournamentId);
u8 sub_819221C(u8 taskId);
@@ -165,9 +169,9 @@ void CopyDomeBrainTrainerName(u8 *dst);
void CopyDomeTrainerName(u8 *dst, u16 trainerId);
void sub_8194D48(void);
void sub_8194BEC(void);
-void sub_8194CE4(void);
+static void VblankCb1_BattleDome(void);
u8 sub_8193BDC(u8 taskId);
-void sub_8195438(u8 roundId);
+void DecideRoundWinners(u8 roundId);
u8 sub_81953E8(u8 tournamentId, u8);
void sub_81948EC(u8, u8);
@@ -709,8 +713,8 @@ void InitDomeTrainers(void)
gSaveBlock2Ptr->frontier.field_D0A = gSaveBlock2Ptr->frontier.chosenLvl + 1;
gSaveBlock2Ptr->frontier.field_D0B = VarGet(VAR_0x40CE) + 1;
gSaveBlock2Ptr->frontier.domeTrainers[0].trainerId = TRAINER_PLAYER;
- gSaveBlock2Ptr->frontier.domeTrainers[0].unk1 = 0;
- gSaveBlock2Ptr->frontier.domeTrainers[0].unk2 = 0;
+ gSaveBlock2Ptr->frontier.domeTrainers[0].isEliminated = 0;
+ gSaveBlock2Ptr->frontier.domeTrainers[0].eliminatedAt = 0;
gSaveBlock2Ptr->frontier.domeTrainers[0].unk3 = 0;
for (i = 0; i < 3; i++)
@@ -774,8 +778,8 @@ void InitDomeTrainers(void)
species[j] = gFacilityTrainerMons[monTournamentId].species;
}
- gSaveBlock2Ptr->frontier.domeTrainers[i].unk1 = 0;
- gSaveBlock2Ptr->frontier.domeTrainers[i].unk2 = 0;
+ gSaveBlock2Ptr->frontier.domeTrainers[i].isEliminated = 0;
+ gSaveBlock2Ptr->frontier.domeTrainers[i].eliminatedAt = 0;
gSaveBlock2Ptr->frontier.domeTrainers[i].unk3 = 0;
}
@@ -1575,7 +1579,7 @@ s32 TournamentIdOfOpponent(s32 roundId, s32 trainerId)
for (j = gUnknown_0860D10C[i][roundId]; j < val; j++)
{
- if (gUnknown_0860D14C[j] != i && !gSaveBlock2Ptr->frontier.domeTrainers[gUnknown_0860D14C[j]].unk1)
+ if (gUnknown_0860D14C[j] != i && !gSaveBlock2Ptr->frontier.domeTrainers[gUnknown_0860D14C[j]].isEliminated)
break;
}
@@ -1586,8 +1590,8 @@ s32 TournamentIdOfOpponent(s32 roundId, s32 trainerId)
}
else
{
- if (!gSaveBlock2Ptr->frontier.domeTrainers[gUnknown_0860D10C[i][0]].unk1)
- return gUnknown_0860D10C[i][0];
+ if (!gSaveBlock2Ptr->frontier.domeTrainers[gUnknown_0860D10C[i][roundId]].isEliminated)
+ return gUnknown_0860D10C[i][roundId];
else
return 0xFF;
}
@@ -1707,7 +1711,7 @@ void sub_8190400(u8 taskId)
gTasks[taskId].data[0]++;
break;
case 3:
- SetVBlankCallback(sub_8194B70);
+ SetVBlankCallback(VblankCb0_BattleDome);
gUnknown_0203CD78 = AllocZeroed(sizeof(*gUnknown_0203CD78));
for (i = 0; i < DOME_TOURNAMENT_TRAINERS_COUNT; i++)
gUnknown_0203CD78->arr[i] |= 0xFF;
@@ -1945,12 +1949,12 @@ void sub_8190B40(struct Sprite *sprite)
{
if (sprite->data[1])
{
- if ((gSaveBlock2Ptr->frontier.domeTrainers[tournmanetTrainerId].unk1
- && gUnknown_0203CD78->unk_10 - 1 < gSaveBlock2Ptr->frontier.domeTrainers[tournmanetTrainerId].unk2))
+ if ((gSaveBlock2Ptr->frontier.domeTrainers[tournmanetTrainerId].isEliminated
+ && gUnknown_0203CD78->unk_10 - 1 < gSaveBlock2Ptr->frontier.domeTrainers[tournmanetTrainerId].eliminatedAt))
{
sprite->invisible = 0;
}
- else if (!gSaveBlock2Ptr->frontier.domeTrainers[tournmanetTrainerId].unk1
+ else if (!gSaveBlock2Ptr->frontier.domeTrainers[tournmanetTrainerId].isEliminated
&& gUnknown_0203CD78->unk_10 - 1 < r12)
{
sprite->invisible = 0;
@@ -2788,12 +2792,12 @@ u8 sub_819221C(u8 taskId)
}
else if (gMain.newKeys & DPAD_RIGHT)
{
- if (gSaveBlock2Ptr->frontier.domeTrainers[r10].unk1 && gUnknown_0203CD78->unk_10 - 1 < gSaveBlock2Ptr->frontier.domeTrainers[r10].unk2)
+ if (gSaveBlock2Ptr->frontier.domeTrainers[r10].isEliminated && gUnknown_0203CD78->unk_10 - 1 < gSaveBlock2Ptr->frontier.domeTrainers[r10].eliminatedAt)
{
gUnknown_0203CD78->unk_10++;
retVal = 4;
}
- if (!gSaveBlock2Ptr->frontier.domeTrainers[r10].unk1 && gUnknown_0203CD78->unk_10 - 1 < roundId)
+ if (!gSaveBlock2Ptr->frontier.domeTrainers[r10].isEliminated && gUnknown_0203CD78->unk_10 - 1 < roundId)
{
gUnknown_0203CD78->unk_10++;
retVal = 4;
@@ -2803,7 +2807,7 @@ u8 sub_819221C(u8 taskId)
if (retVal == 9)
{
if (gUnknown_0203CD78->unk_10 != 0)
- gTasks[taskId2].data[1] = gUnknown_0860D1A0[(r5 / 2) * 4 + (gUnknown_0203CD78->unk_10 - 1)];
+ gTasks[taskId2].data[1] = gUnknown_0860D1A0[r5 / 2][gUnknown_0203CD78->unk_10 - 1];
else
gTasks[taskId2].data[1] = r5;
}
@@ -3230,7 +3234,7 @@ s32 sub_8192F08(u8 arg0, u8 *arg1)
for (i = gUnknown_0860D3C4[arg0][0]; i < gUnknown_0860D3C4[arg0][0] + gUnknown_0860D3C4[arg0][1]; i++)
{
tournamentId = gUnknown_0860D3B4[i];
- if (!gSaveBlock2Ptr->frontier.domeTrainers[tournamentId].unk1)
+ if (!gSaveBlock2Ptr->frontier.domeTrainers[tournamentId].isEliminated)
{
arg1[count] = tournamentId;
if (gSaveBlock2Ptr->frontier.domeTrainers[tournamentId].trainerId == TRAINER_PLAYER)
@@ -3249,12 +3253,12 @@ s32 sub_8192F08(u8 arg0, u8 *arg1)
for (i = gUnknown_0860D3C4[arg0][0]; i < gUnknown_0860D3C4[arg0][0] + gUnknown_0860D3C4[arg0][1]; i++)
{
tournamentId = gUnknown_0860D3B4[i];
- if (gSaveBlock2Ptr->frontier.domeTrainers[tournamentId].unk1
- && gSaveBlock2Ptr->frontier.domeTrainers[tournamentId].unk2 >= gUnknown_0860D3C4[arg0][2])
+ if (gSaveBlock2Ptr->frontier.domeTrainers[tournamentId].isEliminated
+ && gSaveBlock2Ptr->frontier.domeTrainers[tournamentId].eliminatedAt >= gUnknown_0860D3C4[arg0][2])
{
arg1[count] = tournamentId;
count++;
- if (gSaveBlock2Ptr->frontier.domeTrainers[tournamentId].unk2 == gUnknown_0860D3C4[arg0][2])
+ if (gSaveBlock2Ptr->frontier.domeTrainers[tournamentId].eliminatedAt == gUnknown_0860D3C4[arg0][2])
{
StringCopy(gStringVar2, gMoveNames[gSaveBlock2Ptr->frontier.field_EC0[tournamentId]]);
retVal = gSaveBlock2Ptr->frontier.domeTrainers[tournamentId].unk3 * 2;
@@ -3312,8 +3316,8 @@ static void DisplayMatchInfoOnCard(u8 flags, u8 matchNo)
{
tournamentIds[i] = gUnknown_0203CD78->unk_11[i];
trainerIds[i] = gSaveBlock2Ptr->frontier.domeTrainers[tournamentIds[i]].trainerId;
- if (gSaveBlock2Ptr->frontier.domeTrainers[tournamentIds[i]].unk2 <= gUnknown_0860D3C4[matchNo][2]
- && gSaveBlock2Ptr->frontier.domeTrainers[tournamentIds[i]].unk1)
+ if (gSaveBlock2Ptr->frontier.domeTrainers[tournamentIds[i]].eliminatedAt <= gUnknown_0860D3C4[matchNo][2]
+ && gSaveBlock2Ptr->frontier.domeTrainers[tournamentIds[i]].isEliminated)
lost[i] = TRUE;
else
lost[i] = FALSE;
@@ -3669,21 +3673,21 @@ void sub_8193D7C(void)
if (gSpecialVar_0x8005 == 1)
{
- gSaveBlock2Ptr->frontier.domeTrainers[TrainerIdToTournamentId(gTrainerBattleOpponent_A)].unk1 = 1;
- gSaveBlock2Ptr->frontier.domeTrainers[TrainerIdToTournamentId(gTrainerBattleOpponent_A)].unk2 = gSaveBlock2Ptr->frontier.field_CB2;
+ gSaveBlock2Ptr->frontier.domeTrainers[TrainerIdToTournamentId(gTrainerBattleOpponent_A)].isEliminated = 1;
+ gSaveBlock2Ptr->frontier.domeTrainers[TrainerIdToTournamentId(gTrainerBattleOpponent_A)].eliminatedAt = gSaveBlock2Ptr->frontier.field_CB2;
gSaveBlock2Ptr->frontier.field_EC0[TrainerIdToTournamentId(gTrainerBattleOpponent_A)] = gBattleResults.lastUsedMovePlayer;
if (gSaveBlock2Ptr->frontier.field_CB2 < DOME_FINAL)
- sub_8195438(gSaveBlock2Ptr->frontier.field_CB2);
+ DecideRoundWinners(gSaveBlock2Ptr->frontier.field_CB2);
}
else
{
- gSaveBlock2Ptr->frontier.domeTrainers[TrainerIdToTournamentId(TRAINER_PLAYER)].unk1 = 1;
- gSaveBlock2Ptr->frontier.domeTrainers[TrainerIdToTournamentId(TRAINER_PLAYER)].unk2 = gSaveBlock2Ptr->frontier.field_CB2;
+ gSaveBlock2Ptr->frontier.domeTrainers[TrainerIdToTournamentId(TRAINER_PLAYER)].isEliminated = 1;
+ gSaveBlock2Ptr->frontier.domeTrainers[TrainerIdToTournamentId(TRAINER_PLAYER)].eliminatedAt = gSaveBlock2Ptr->frontier.field_CB2;
gSaveBlock2Ptr->frontier.field_EC0[TrainerIdToTournamentId(TRAINER_PLAYER)] = gBattleResults.lastUsedMoveOpponent;
if (gBattleOutcome == B_OUTCOME_FORFEITED || gSpecialVar_0x8005 == 9)
gSaveBlock2Ptr->frontier.domeTrainers[TrainerIdToTournamentId(TRAINER_PLAYER)].unk3 = 1;
for (i = gSaveBlock2Ptr->frontier.field_CB2; i < DOME_ROUNDS_COUNT; i++)
- sub_8195438(i);
+ DecideRoundWinners(i);
}
}
@@ -3908,11 +3912,11 @@ void sub_8194220(u8 taskId)
CopyDomeTrainerName(gDisplayedStringBattle, gSaveBlock2Ptr->frontier.domeTrainers[i].trainerId);
if (r10 == 1)
{
- if (gSaveBlock2Ptr->frontier.domeTrainers[i].unk1)
+ if (gSaveBlock2Ptr->frontier.domeTrainers[i].isEliminated)
{
- if (gSaveBlock2Ptr->frontier.domeTrainers[i].unk2 != 0)
+ if (gSaveBlock2Ptr->frontier.domeTrainers[i].eliminatedAt != 0)
{
- var2 = gSaveBlock2Ptr->frontier.domeTrainers[i].unk2 - 1;
+ var2 = gSaveBlock2Ptr->frontier.domeTrainers[i].eliminatedAt - 1;
sub_81948EC(i, var2);
}
}
@@ -3923,11 +3927,11 @@ void sub_8194220(u8 taskId)
}
else if (r10 == 0)
{
- if (gSaveBlock2Ptr->frontier.domeTrainers[i].unk1)
+ if (gSaveBlock2Ptr->frontier.domeTrainers[i].isEliminated)
{
- if (gSaveBlock2Ptr->frontier.domeTrainers[i].unk2 != 0)
+ if (gSaveBlock2Ptr->frontier.domeTrainers[i].eliminatedAt != 0)
{
- var2 = gSaveBlock2Ptr->frontier.domeTrainers[i].unk2 - 1;
+ var2 = gSaveBlock2Ptr->frontier.domeTrainers[i].eliminatedAt - 1;
sub_81948EC(i, var2);
}
}
@@ -3946,9 +3950,9 @@ void sub_8194220(u8 taskId)
else
var = gSaveBlock2Ptr->frontier.field_CB2 - 1;
- if ( ((r10 == 1 && gSaveBlock2Ptr->frontier.domeTrainers[i].unk2 < gSaveBlock2Ptr->frontier.field_CB2 - 1)
- || (r10 == 0 && gSaveBlock2Ptr->frontier.domeTrainers[i].unk2 <= var))
- && gSaveBlock2Ptr->frontier.domeTrainers[i].unk1)
+ if ( ((r10 == 1 && gSaveBlock2Ptr->frontier.domeTrainers[i].eliminatedAt < gSaveBlock2Ptr->frontier.field_CB2 - 1)
+ || (r10 == 0 && gSaveBlock2Ptr->frontier.domeTrainers[i].eliminatedAt <= var))
+ && gSaveBlock2Ptr->frontier.domeTrainers[i].isEliminated)
{
if (gSaveBlock2Ptr->frontier.domeTrainers[i].trainerId == TRAINER_PLAYER)
{
@@ -3994,7 +3998,7 @@ void sub_8194220(u8 taskId)
CopyWindowToVram(1, 3);
CopyWindowToVram(2, 3);
SetHBlankCallback(sub_8194BEC);
- SetVBlankCallback(sub_8194CE4);
+ SetVBlankCallback(VblankCb1_BattleDome);
if (r4 == 2)
{
if (r10 == 0)
@@ -4082,8 +4086,8 @@ void sub_8194950(u8 taskId)
for (i = 0; i < DOME_TOURNAMENT_TRAINERS_COUNT; i++)
{
CopyDomeTrainerName(gDisplayedStringBattle, gSaveBlock2Ptr->frontier.domeTrainers[i].trainerId);
- if (gSaveBlock2Ptr->frontier.domeTrainers[i].unk2 == gSaveBlock2Ptr->frontier.field_CB2 - 1
- && gSaveBlock2Ptr->frontier.domeTrainers[i].unk1)
+ if (gSaveBlock2Ptr->frontier.domeTrainers[i].eliminatedAt == gSaveBlock2Ptr->frontier.field_CB2 - 1
+ && gSaveBlock2Ptr->frontier.domeTrainers[i].isEliminated)
{
if (gUnknown_0860D3F1[i][0] == 0)
textPrinter.currentX = GetStringWidthDifference(textPrinter.fontId, gDisplayedStringBattle, 0x3D, textPrinter.letterSpacing);
@@ -4095,7 +4099,7 @@ void sub_8194950(u8 taskId)
textPrinter.currentY = gUnknown_0860D3F1[i][1];
AddTextPrinter(&textPrinter, 0, NULL);
}
- if (!gSaveBlock2Ptr->frontier.domeTrainers[i].unk1)
+ if (!gSaveBlock2Ptr->frontier.domeTrainers[i].isEliminated)
{
s32 var = gSaveBlock2Ptr->frontier.field_CB2 - 1;
sub_81948EC(i, var);
@@ -4132,3 +4136,488 @@ static void CB2_BattleDome(void)
UpdatePaletteFade();
RunTasks();
}
+
+static void VblankCb0_BattleDome(void)
+{
+ ChangeBgX(3, 0x80, 1);
+ ChangeBgY(3, 0x80, 2);
+ SetGpuReg(REG_OFFSET_BG0HOFS, gBattle_BG0_X);
+ SetGpuReg(REG_OFFSET_BG0VOFS, gBattle_BG0_Y);
+ SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X);
+ SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y);
+ SetGpuReg(REG_OFFSET_BG2HOFS, gBattle_BG2_X);
+ SetGpuReg(REG_OFFSET_BG2VOFS, gBattle_BG2_Y);
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+#define SET_WIN0H_WIN1H(win0H, win1H) \
+{ \
+ *(vu32*)(REG_ADDR_WIN0H) = ((win0H << 16) | (win1H)); \
+}
+
+void sub_8194BEC(void)
+{
+ register u32 vCount asm("r0") = REG_VCOUNT;
+ register u32 vCount_ asm("r1") = vCount;
+ if (vCount > 41)
+ {
+ if (vCount < 50)
+ {
+ REG_WININ = 0x3B3B;
+ SET_WIN0H_WIN1H(0x989B, 0x5558);
+ return;
+ }
+ else if (vCount > 57)
+ {
+ if (vCount < 75)
+ {
+ REG_WININ = 0x3B3B;
+ SET_WIN0H_WIN1H(0x9098, 0x5860);
+ return;
+ }
+ else if (vCount < 82)
+ {
+ REG_WININ = 0x3B3B;
+ SET_WIN0H_WIN1H(0x989B, 0x5558);
+ return;
+ }
+ else if (vCount > 94)
+ {
+ if (vCount < 103)
+ {
+ REG_WININ = 0x3737;
+ SET_WIN0H_WIN1H(0x989B, 0x5558);
+ return;
+ }
+ else if (vCount < 119)
+ {
+ REG_WININ = 0x3737;
+ SET_WIN0H_WIN1H(0x9098, 0x5860);
+ return;
+ }
+ else if (vCount > 126)
+ {
+ if (vCount_ < 135)
+ {
+ REG_WININ = 0x3737;
+ SET_WIN0H_WIN1H(0x989B, 0x5558);
+ return;
+ }
+ }
+ }
+ }
+ }
+
+ REG_WININ = 0x3F3F;
+ SET_WIN0H_WIN1H(0, 0);
+}
+
+static void VblankCb1_BattleDome(void)
+{
+ SetGpuReg(REG_OFFSET_BG0HOFS, gBattle_BG0_X);
+ SetGpuReg(REG_OFFSET_BG0VOFS, gBattle_BG0_Y);
+ SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X);
+ SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y);
+ ChangeBgY(2, 0x80, 2);
+ ChangeBgY(3, 0x80, 1);
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+ ScanlineEffect_InitHBlankDmaTransfer();
+}
+
+void sub_8194D48(void)
+{
+ gFacilityTrainerMons = gBattleFrontierMons;
+ gFacilityTrainers = gBattleFrontierTrainers;
+}
+
+void sub_8194D68(void)
+{
+ s32 i, moveSlot;
+
+ for (i = 0; i < 2; i++)
+ {
+ s32 playerMonId = gSaveBlock2Ptr->frontier.field_CAA[gUnknown_0203CEF8[i] - 1] - 1;
+ s32 count;
+
+ for (moveSlot = 0; moveSlot < 4; moveSlot++)
+ {
+ count = 0;
+ while (count < 4)
+ {
+ if (GetMonData(&gSaveBlock1Ptr->playerParty[playerMonId], MON_DATA_MOVE1 + count, NULL) == GetMonData(&gPlayerParty[i], MON_DATA_MOVE1 + moveSlot, NULL))
+ break;
+ count++;
+ }
+ if (count == 4)
+ SetMonMoveSlot(&gPlayerParty[i], MOVE_SKETCH, moveSlot);
+ }
+
+ gSaveBlock1Ptr->playerParty[playerMonId] = gPlayerParty[i];
+ }
+}
+
+void sub_8194E44(void)
+{
+ s32 i;
+
+ for (i = 0; i < 2; i++)
+ {
+ s32 playerMonId = gSaveBlock2Ptr->frontier.field_CAA[gUnknown_0203CEF8[i] - 1] - 1;
+ u16 item = GetMonData(&gSaveBlock1Ptr->playerParty[playerMonId], MON_DATA_HELD_ITEM, NULL);
+ SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &item);
+ }
+}
+
+void sub_8194EB4(void)
+{
+ sub_80F94E8();
+}
+
+void sub_8194EC0(void)
+{
+ if (TrainerIdToTournamentId(gTrainerBattleOpponent_A) > TrainerIdToTournamentId(TRAINER_PLAYER))
+ gSpecialVar_Result = 1;
+ else
+ gSpecialVar_Result = 2;
+}
+
+void sub_8194EF8(void)
+{
+ s32 i;
+
+ sub_8194D48();
+ for (i = 0; i < DOME_TOURNAMENT_TRAINERS_COUNT; i++)
+ {
+ if (!gSaveBlock2Ptr->frontier.domeTrainers[i].isEliminated)
+ break;
+ }
+ CopyDomeTrainerName(gStringVar1, gSaveBlock2Ptr->frontier.domeTrainers[i].trainerId);
+}
+
+void sub_8194F58(void)
+{
+ s32 i, j, k;
+ s32 monLevel;
+ s32 species[3];
+ s32 monTypesBits;
+ s32 trainerId;
+ s32 monTournamentId;
+ u8 lvlMode;
+ u16 *statSums;
+ s32 *statValues;
+ u8 ivs = 0;
+
+ species[0] = 0;
+ species[1] = 0;
+ species[2] = 0;
+ if ((gSaveBlock2Ptr->frontier.field_D0A != -gSaveBlock2Ptr->frontier.field_D0B) && gSaveBlock2Ptr->frontier.field_CA8 != 1)
+ return;
+
+ statSums = AllocZeroed(sizeof(u16) * DOME_TOURNAMENT_TRAINERS_COUNT);
+ statValues = AllocZeroed(sizeof(s32) * 6);
+ lvlMode = gSaveBlock2Ptr->frontier.chosenLvl;
+ gSaveBlock2Ptr->frontier.chosenLvl = 0;
+ // This one, I'd like to call a 'C fakematching'.
+ {
+ u8 one;
+ gSaveBlock2Ptr->frontier.field_D0A = (one = 1);
+ gSaveBlock2Ptr->frontier.field_D0B = one;
+ }
+
+ for (i = 0; i < DOME_TOURNAMENT_TRAINERS_COUNT; i++)
+ {
+ do
+ {
+ if (i < 5)
+ trainerId = Random() % 10;
+ else if (i < 15)
+ trainerId = Random() % 20 + 10;
+ else
+ trainerId = Random() % 10 + 30;
+
+ for (j = 0; j < i; j++)
+ {
+ if (gSaveBlock2Ptr->frontier.domeTrainers[j].trainerId == trainerId)
+ break;
+ }
+ } while (j != i);
+
+ gSaveBlock2Ptr->frontier.domeTrainers[i].trainerId = trainerId;
+ for (j = 0; j < 3; j++)
+ {
+ // Make sure the mon is valid.
+ do
+ {
+ monTournamentId = RandomizeFacilityTrainerMonId(trainerId);
+ for (k = 0; k < j; k++)
+ {
+ s32 checkingMonId = gSaveBlock2Ptr->frontier.domeMonId[i][k];
+ if (checkingMonId == monTournamentId
+ || species[0] == gFacilityTrainerMons[monTournamentId].species
+ || species[1] == gFacilityTrainerMons[monTournamentId].species
+ || gFacilityTrainerMons[checkingMonId].itemTableId == gFacilityTrainerMons[monTournamentId].itemTableId)
+ break;
+ }
+ } while (k != j);
+
+ gSaveBlock2Ptr->frontier.domeMonId[i][j] = monTournamentId;
+ species[j] = gFacilityTrainerMons[monTournamentId].species;
+ }
+ gSaveBlock2Ptr->frontier.domeTrainers[i].isEliminated = 0;
+ gSaveBlock2Ptr->frontier.domeTrainers[i].eliminatedAt = 0;
+ gSaveBlock2Ptr->frontier.domeTrainers[i].unk3 = 0;
+ }
+
+ monLevel = 50;
+ for (i = 0; i < DOME_TOURNAMENT_TRAINERS_COUNT; i++)
+ {
+ monTypesBits = 0;
+ statSums[i] = 0;
+ ivs = GetDomeTrainerMonIvs(gSaveBlock2Ptr->frontier.domeTrainers[i].trainerId);
+ for (j = 0; j < 3; j++)
+ {
+ CalcDomeMonStats(gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[i][j]].species,
+ monLevel, ivs,
+ gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[i][j]].evSpread,
+ gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[i][j]].nature,
+ statValues);
+
+ statSums[i] += statValues[STAT_ATK];
+ statSums[i] += statValues[STAT_DEF];
+ statSums[i] += statValues[STAT_SPATK];
+ statSums[i] += statValues[STAT_SPDEF];
+ statSums[i] += statValues[STAT_SPEED];
+ statSums[i] += statValues[STAT_HP];
+ monTypesBits |= gBitTable[gBaseStats[gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[i][j]].species].type1];
+ monTypesBits |= gBitTable[gBaseStats[gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[i][j]].species].type2];
+ }
+
+ // Because GF hates temporary vars, trainerId acts like monTypesCount here.
+ for (trainerId = 0, j = 0; j < 32; j++)
+ {
+ if (monTypesBits & 1)
+ trainerId++;
+ monTypesBits >>= 1;
+ }
+ statSums[i] += (trainerId * monLevel) / 20;
+ }
+
+ for (i = 0; i < DOME_TOURNAMENT_TRAINERS_COUNT - 1; i++)
+ {
+ for (j = i + 1; j < DOME_TOURNAMENT_TRAINERS_COUNT; j++)
+ {
+ if (statSums[i] < statSums[j])
+ {
+ SwapDomeTrainers(i, j, statSums);
+ }
+ else if (statSums[i] == statSums[j])
+ {
+ if (gSaveBlock2Ptr->frontier.domeTrainers[i].trainerId > gSaveBlock2Ptr->frontier.domeTrainers[j].trainerId)
+ SwapDomeTrainers(i, j, statSums);
+ }
+ }
+ }
+
+ Free(statSums);
+ Free(statValues);
+
+ for (i = 0; i < 4; i++)
+ DecideRoundWinners(i);
+
+ gSaveBlock2Ptr->frontier.chosenLvl = lvlMode;
+}
+
+static s32 TrainerIdToTournamentId(u16 trainerId)
+{
+ s32 i;
+
+ for (i = 0; i < DOME_TOURNAMENT_TRAINERS_COUNT; i++)
+ {
+ if (gSaveBlock2Ptr->frontier.domeTrainers[i].trainerId == trainerId)
+ break;
+ }
+
+ return i;
+}
+
+// The same as the above one, but has global scope.
+s32 TrainerIdToDomeTournamentId(u16 trainerId)
+{
+ s32 i;
+
+ for (i = 0; i < DOME_TOURNAMENT_TRAINERS_COUNT; i++)
+ {
+ if (gSaveBlock2Ptr->frontier.domeTrainers[i].trainerId == trainerId)
+ break;
+ }
+
+ return i;
+}
+
+u8 sub_81953E8(u8 tournamentId, u8 arg1)
+{
+ u8 arr[2];
+ sub_8192F08(gUnknown_0860D1A0[gUnknown_0860D1C0[tournamentId] / 2][arg1] - 16, arr);
+ if (tournamentId == arr[0])
+ return arr[1];
+ else
+ return arr[0];
+}
+
+void DecideRoundWinners(u8 roundId)
+{
+ s32 i;
+ s32 moveSlot, monId1, monId2;
+ s32 tournamentId1, tournamentId2;
+ s32 species;
+ s32 points1 = 0, points2 = 0;
+
+ for (i = 0; i < DOME_TOURNAMENT_TRAINERS_COUNT; i++)
+ {
+ if (gSaveBlock2Ptr->frontier.domeTrainers[i].isEliminated || gSaveBlock2Ptr->frontier.domeTrainers[i].trainerId == TRAINER_PLAYER)
+ continue;
+
+ tournamentId1 = i;
+ tournamentId2 = TournamentIdOfOpponent(roundId, gSaveBlock2Ptr->frontier.domeTrainers[tournamentId1].trainerId);
+ // Frontier Brain always wins, check tournamentId1.
+ if (gSaveBlock2Ptr->frontier.domeTrainers[tournamentId1].trainerId == TRAINER_FRONTIER_BRAIN && tournamentId2 != 0xFF)
+ {
+ gSaveBlock2Ptr->frontier.domeTrainers[tournamentId2].isEliminated = 1;
+ gSaveBlock2Ptr->frontier.domeTrainers[tournamentId2].eliminatedAt = roundId;
+ gSaveBlock2Ptr->frontier.field_EC0[tournamentId2] = GetWinningMove(tournamentId1, tournamentId2, roundId);
+ }
+ // Frontier Brain always wins, check tournamentId2.
+ else if (gSaveBlock2Ptr->frontier.domeTrainers[tournamentId2].trainerId == TRAINER_FRONTIER_BRAIN && tournamentId1 != 0xFF)
+ {
+ gSaveBlock2Ptr->frontier.domeTrainers[tournamentId1].isEliminated = 1;
+ gSaveBlock2Ptr->frontier.domeTrainers[tournamentId1].eliminatedAt = roundId;
+ gSaveBlock2Ptr->frontier.field_EC0[tournamentId1] = GetWinningMove(tournamentId2, tournamentId1, roundId);
+ }
+ // Decide which one of two trainers wins!
+ else if (tournamentId2 != 0xFF)
+ {
+ // BUG: points1 and points2 are not cleared at the beginning of the loop resulting in not fair results.
+
+ // Calculate points for both trainers.
+ for (monId1 = 0; monId1 < 3; monId1++)
+ {
+ for (moveSlot = 0; moveSlot < 4; moveSlot++)
+ {
+ for (monId2 = 0; monId2 < 3; monId2++)
+ {
+ points1 += sub_818FFC0(gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[tournamentId1][monId1]].moves[moveSlot],
+ gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[tournamentId2][monId2]].species, 2);
+ }
+ }
+ species = gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[tournamentId1][monId1]].species;
+ points1 += ( gBaseStats[species].baseHP
+ + gBaseStats[species].baseAttack
+ + gBaseStats[species].baseDefense
+ + gBaseStats[species].baseSpeed
+ + gBaseStats[species].baseSpAttack
+ + gBaseStats[species].baseSpDefense) / 10;
+ }
+ // Random part of the formula.
+ points1 += (Random() & 0x1F);
+ // Favor trainers with higher id;
+ points1 += tournamentId1;
+
+ for (monId1 = 0; monId1 < 3; monId1++)
+ {
+ for (moveSlot = 0; moveSlot < 4; moveSlot++)
+ {
+ for (monId2 = 0; monId2 < 3; monId2++)
+ {
+ points2 += sub_818FFC0(gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[tournamentId2][monId1]].moves[moveSlot],
+ gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[tournamentId1][monId2]].species, 2);
+ }
+ }
+ species = gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[tournamentId2][monId1]].species;
+ points2 += ( gBaseStats[species].baseHP
+ + gBaseStats[species].baseAttack
+ + gBaseStats[species].baseDefense
+ + gBaseStats[species].baseSpeed
+ + gBaseStats[species].baseSpAttack
+ + gBaseStats[species].baseSpDefense) / 10;
+ }
+ // Random part of the formula.
+ points2 += (Random() & 0x1F);
+ // Favor trainers with higher id;
+ points2 += tournamentId2;
+
+ if (points1 > points2)
+ {
+ gSaveBlock2Ptr->frontier.domeTrainers[tournamentId2].isEliminated = 1;
+ gSaveBlock2Ptr->frontier.domeTrainers[tournamentId2].eliminatedAt = roundId;
+ gSaveBlock2Ptr->frontier.field_EC0[tournamentId2] = GetWinningMove(tournamentId1, tournamentId2, roundId);
+ }
+ else if (points1 < points2)
+ {
+ gSaveBlock2Ptr->frontier.domeTrainers[tournamentId1].isEliminated = 1;
+ gSaveBlock2Ptr->frontier.domeTrainers[tournamentId1].eliminatedAt = roundId;
+ gSaveBlock2Ptr->frontier.field_EC0[tournamentId1] = GetWinningMove(tournamentId2, tournamentId1, roundId);
+ }
+ // Points are the same, so we favor the one with the higher id.
+ else if (tournamentId1 > tournamentId2)
+ {
+ gSaveBlock2Ptr->frontier.domeTrainers[tournamentId2].isEliminated = 1;
+ gSaveBlock2Ptr->frontier.domeTrainers[tournamentId2].eliminatedAt = roundId;
+ gSaveBlock2Ptr->frontier.field_EC0[tournamentId2] = GetWinningMove(tournamentId1, tournamentId2, roundId);
+ }
+ else
+ {
+ gSaveBlock2Ptr->frontier.domeTrainers[tournamentId1].isEliminated = 1;
+ gSaveBlock2Ptr->frontier.domeTrainers[tournamentId1].eliminatedAt = roundId;
+ gSaveBlock2Ptr->frontier.field_EC0[tournamentId1] = GetWinningMove(tournamentId2, tournamentId1, roundId);
+ }
+ }
+ }
+}
+
+void CopyDomeTrainerName(u8 *dst, u16 trainerId)
+{
+ s32 i = 0;
+ GetFrontierEnemyMonLevel(); // Unused return value.
+
+ if (trainerId == TRAINER_FRONTIER_BRAIN)
+ {
+ CopyDomeBrainTrainerName(dst);
+ }
+ else
+ {
+ if (trainerId == TRAINER_PLAYER)
+ {
+ for (i = 0; i < OT_NAME_LENGTH; i++)
+ dst[i] = gSaveBlock2Ptr->playerName[i];
+ }
+ else if (trainerId < 300)
+ {
+ for (i = 0; i < 7; i++)
+ dst[i] = gFacilityTrainers[trainerId].trainerName[i];
+ }
+ dst[i] = EOS;
+ }
+}
+
+u8 GetDomeBrainTrainerPicId(void)
+{
+ return gTrainers[TRAINER_TUCKER].trainerPic;
+}
+
+u8 GetDomeBrainTrainerClass(void)
+{
+ return gTrainers[TRAINER_TUCKER].trainerClass;
+}
+
+void CopyDomeBrainTrainerName(u8 *dst)
+{
+ s32 i;
+
+ for (i = 0; i < 7; i++)
+ dst[i] = gTrainers[TRAINER_TUCKER].trainerName[i];
+ dst[i] = EOS;
+}
diff --git a/src/battle_tent.c b/src/battle_tent.c
index 68d7c5e83..dbea37fb7 100644
--- a/src/battle_tent.c
+++ b/src/battle_tent.c
@@ -11,7 +11,7 @@
#include "constants/items.h"
#include "constants/region_map_sections.h"
-// this file's functions
+// This file's functions.
void sub_81B99D4(void);
void sub_81B9A28(void);
void sub_81B9A44(void);
@@ -115,7 +115,7 @@ void sub_81B9A60(void)
void sub_81B9A90(void)
{
if (gTrainerBattleOpponent_A < 300)
- ConvertBattleFrontierTrainerSpeechToString(gUnknown_0203BC88[gTrainerBattleOpponent_A].speechBefore);
+ ConvertBattleFrontierTrainerSpeechToString(gFacilityTrainers[gTrainerBattleOpponent_A].speechBefore);
}
void sub_81B9ABC(void)