2018-08-26 17:54:58 +02:00
|
|
|
#include "global.h"
|
|
|
|
#include "event_data.h"
|
|
|
|
#include "battle_setup.h"
|
|
|
|
#include "overworld.h"
|
|
|
|
#include "random.h"
|
|
|
|
#include "battle_tower.h"
|
2018-10-20 00:33:51 +02:00
|
|
|
#include "battle_frontier_1.h"
|
|
|
|
#include "constants/battle_frontier.h"
|
2018-08-26 17:54:58 +02:00
|
|
|
|
|
|
|
extern void sub_81A3ACC(void);
|
2018-10-20 00:33:51 +02:00
|
|
|
extern u8 GetFrontierEnemyMonLevel(u8);
|
2018-08-26 17:54:58 +02:00
|
|
|
|
|
|
|
extern const u32 gUnknown_085DF9AC[][2];
|
|
|
|
extern const u32 gUnknown_085DF9CC[][2];
|
|
|
|
extern void (* const gUnknown_085DF96C[])(void);
|
2018-10-20 00:33:51 +02:00
|
|
|
extern const u8 gUnknown_085DF9F6[];
|
|
|
|
extern const u8 gUnknown_085DF9EC[];
|
2018-08-26 17:54:58 +02:00
|
|
|
|
|
|
|
// This file's functions.
|
|
|
|
void sub_8164ED8(void);
|
2018-10-20 00:33:51 +02:00
|
|
|
void sub_8163E90(void);
|
|
|
|
void sub_8165B20(void);
|
|
|
|
u16 GetCurrentBattleTowerWinStreak(u8 lvlMode, u8 battleMode);
|
|
|
|
void sub_816534C(void *);
|
2018-08-26 17:54:58 +02:00
|
|
|
|
|
|
|
// code
|
|
|
|
void sub_8161F74(void)
|
|
|
|
{
|
|
|
|
gUnknown_085DF96C[gSpecialVar_0x8004]();
|
|
|
|
}
|
|
|
|
|
|
|
|
void sub_8161F94(void)
|
|
|
|
{
|
|
|
|
u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
|
|
|
|
u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
|
|
|
|
|
|
|
|
gSaveBlock2Ptr->frontier.field_CA8 = 1;
|
|
|
|
gSaveBlock2Ptr->frontier.field_CB2 = 0;
|
|
|
|
gSaveBlock2Ptr->frontier.field_CA9_a = 0;
|
|
|
|
gSaveBlock2Ptr->frontier.field_CA9_b = 0;
|
|
|
|
sub_81A3ACC();
|
|
|
|
if (!(gSaveBlock2Ptr->frontier.field_CDC & gUnknown_085DF9AC[battleMode][lvlMode]))
|
|
|
|
gSaveBlock2Ptr->frontier.field_CE0[battleMode][lvlMode] = 0;
|
|
|
|
|
|
|
|
sub_8164ED8();
|
|
|
|
saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1);
|
|
|
|
gTrainerBattleOpponent_A = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void sub_8162054(void)
|
|
|
|
{
|
|
|
|
u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
|
|
|
|
u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
|
|
|
|
|
|
|
|
switch (gSpecialVar_0x8005)
|
|
|
|
{
|
|
|
|
case 0:
|
|
|
|
break;
|
|
|
|
case 1:
|
2018-10-20 00:33:51 +02:00
|
|
|
gSpecialVar_Result = GetCurrentBattleTowerWinStreak(lvlMode, battleMode);
|
2018-08-26 17:54:58 +02:00
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
gSpecialVar_Result = ((gSaveBlock2Ptr->frontier.field_CDC & gUnknown_085DF9AC[battleMode][lvlMode]) != 0);
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
gSaveBlock2Ptr->frontier.field_D07 = gSaveBlock2Ptr->frontier.lvlMode;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void sub_81620F4(void)
|
|
|
|
{
|
|
|
|
u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
|
|
|
|
u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
|
|
|
|
|
|
|
|
switch (gSpecialVar_0x8005)
|
|
|
|
{
|
|
|
|
case 0:
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
gSaveBlock2Ptr->frontier.field_CE0[battleMode][lvlMode] = gSpecialVar_0x8006;
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
if (gSpecialVar_0x8006)
|
|
|
|
gSaveBlock2Ptr->frontier.field_CDC |= gUnknown_085DF9AC[battleMode][lvlMode];
|
|
|
|
else
|
|
|
|
gSaveBlock2Ptr->frontier.field_CDC &= gUnknown_085DF9CC[battleMode][lvlMode];
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
gSaveBlock2Ptr->frontier.field_D07 = gSaveBlock2Ptr->frontier.lvlMode;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2018-10-20 00:33:51 +02:00
|
|
|
|
|
|
|
void sub_81621C0(void)
|
|
|
|
{
|
|
|
|
if (gTrainerBattleOpponent_A == 500)
|
|
|
|
sub_816534C(&gSaveBlock2Ptr->frontier.filler_BEC);
|
|
|
|
|
|
|
|
if (gSaveBlock2Ptr->frontier.field_D04 < 9999)
|
|
|
|
gSaveBlock2Ptr->frontier.field_D04++;
|
|
|
|
|
|
|
|
gSaveBlock2Ptr->frontier.field_CB2++;
|
|
|
|
sub_8163E90();
|
|
|
|
gSpecialVar_Result = gSaveBlock2Ptr->frontier.field_CB2;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool8 ChooseSpecialBattleTowerTrainer(void)
|
|
|
|
{
|
|
|
|
s32 i, j, validMons;
|
|
|
|
s32 trainerIds[9];
|
|
|
|
s32 idsCount = 0;
|
|
|
|
s32 winStreak = 0;
|
|
|
|
u8 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
|
|
|
|
u8 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
|
|
|
|
|
|
|
|
if (VarGet(VAR_FRONTIER_FACILITY) != FRONTIER_FACILITY_TOWER)
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
winStreak = GetCurrentBattleTowerWinStreak(lvlMode, battleMode);
|
|
|
|
for (i = 0; i < 5; i++)
|
|
|
|
{
|
|
|
|
u32 *record = (u32*)(&gSaveBlock2Ptr->frontier.records[i]);
|
|
|
|
u32 recordHasData = 0;
|
|
|
|
u32 checksum = 0;
|
|
|
|
for (j = 0; j < (sizeof(struct EmeraldBattleTowerRecord) - 4) / 4; j++) // - 4, because of the last field being the checksum itself.
|
|
|
|
{
|
|
|
|
recordHasData |= record[j];
|
|
|
|
checksum += record[j];
|
|
|
|
}
|
|
|
|
validMons = 0;
|
|
|
|
for (j = 0; j < 4; j++)
|
|
|
|
{
|
|
|
|
if (gSaveBlock2Ptr->frontier.records[i].party[j].species != 0
|
|
|
|
&& gSaveBlock2Ptr->frontier.records[i].party[j].level <= GetFrontierEnemyMonLevel(lvlMode))
|
|
|
|
validMons++;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (validMons >= gUnknown_085DF9F6[battleMode]
|
|
|
|
&& gSaveBlock2Ptr->frontier.records[i].winStreak == winStreak
|
|
|
|
&& gSaveBlock2Ptr->frontier.records[i].lvlMode == lvlMode
|
|
|
|
&& recordHasData
|
|
|
|
&& gSaveBlock2Ptr->frontier.records[i].checksum == checksum)
|
|
|
|
{
|
|
|
|
trainerIds[idsCount] = i + BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID;
|
|
|
|
idsCount++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (battleMode == FRONTIER_MODE_SINGLES)
|
|
|
|
{
|
|
|
|
sub_8165B20();
|
|
|
|
for (i = 0; i < 4; i++)
|
|
|
|
{
|
|
|
|
if (gSaveBlock2Ptr->apprentices[i].lvlMode != 0
|
|
|
|
&& gUnknown_085DF9EC[gSaveBlock2Ptr->apprentices[i].field_1] == winStreak
|
|
|
|
&& gSaveBlock2Ptr->apprentices[i].lvlMode - 1 == lvlMode)
|
|
|
|
{
|
|
|
|
trainerIds[idsCount] = i + BATTLE_TOWER_RECORD_APPRENTICE_BASE_ID;
|
|
|
|
idsCount++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (idsCount != 0)
|
|
|
|
{
|
|
|
|
gTrainerBattleOpponent_A = trainerIds[Random() % idsCount];
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
}
|