summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/battle_tower.c93
-rw-r--r--src/recorded_battle.c30
-rw-r--r--src/tv.c2
3 files changed, 107 insertions, 18 deletions
diff --git a/src/battle_tower.c b/src/battle_tower.c
index e70d4af91..a6983897f 100644
--- a/src/battle_tower.c
+++ b/src/battle_tower.c
@@ -4,16 +4,24 @@
#include "overworld.h"
#include "random.h"
#include "battle_tower.h"
+#include "battle_frontier_1.h"
+#include "constants/battle_frontier.h"
extern void sub_81A3ACC(void);
+extern u8 GetFrontierEnemyMonLevel(u8);
extern const u32 gUnknown_085DF9AC[][2];
extern const u32 gUnknown_085DF9CC[][2];
extern void (* const gUnknown_085DF96C[])(void);
+extern const u8 gUnknown_085DF9F6[];
+extern const u8 gUnknown_085DF9EC[];
// This file's functions.
void sub_8164ED8(void);
-u16 sub_8164FCC(u8, u8);
+void sub_8163E90(void);
+void sub_8165B20(void);
+u16 GetCurrentBattleTowerWinStreak(u8 lvlMode, u8 battleMode);
+void sub_816534C(void *);
// code
void sub_8161F74(void)
@@ -49,7 +57,7 @@ void sub_8162054(void)
case 0:
break;
case 1:
- gSpecialVar_Result = sub_8164FCC(lvlMode, battleMode);
+ gSpecialVar_Result = GetCurrentBattleTowerWinStreak(lvlMode, battleMode);
break;
case 2:
gSpecialVar_Result = ((gSaveBlock2Ptr->frontier.field_CDC & gUnknown_085DF9AC[battleMode][lvlMode]) != 0);
@@ -83,3 +91,84 @@ void sub_81620F4(void)
break;
}
}
+
+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;
+ }
+}
diff --git a/src/recorded_battle.c b/src/recorded_battle.c
index 355ed5e07..0a199f289 100644
--- a/src/recorded_battle.c
+++ b/src/recorded_battle.c
@@ -402,73 +402,73 @@ u32 MoveRecordedBattleToSaveData(void)
{
for (i = 0; i < 8; i++)
{
- battleSave->field_504[i] = gSaveBlock2Ptr->field_738[gTrainerBattleOpponent_A - 300].field_4[i];
+ battleSave->field_504[i] = gSaveBlock2Ptr->records[gTrainerBattleOpponent_A - 300].field_4[i];
}
- battleSave->field_50C = gSaveBlock2Ptr->field_738[gTrainerBattleOpponent_A - 300].field_1;
+ battleSave->field_50C = gSaveBlock2Ptr->records[gTrainerBattleOpponent_A - 300].field_1;
if (sUnknown_0203CCE8 == 1)
{
for (i = 0; i < 6; i++)
{
- battleSave->field_50E[i] = gSaveBlock2Ptr->field_738[gTrainerBattleOpponent_A - 300].field_28[i];
+ battleSave->field_50E[i] = gSaveBlock2Ptr->records[gTrainerBattleOpponent_A - 300].field_28[i];
}
}
else
{
for (i = 0; i < 6; i++)
{
- battleSave->field_50E[i] = gSaveBlock2Ptr->field_738[gTrainerBattleOpponent_A - 300].field_1C[i];
+ battleSave->field_50E[i] = gSaveBlock2Ptr->records[gTrainerBattleOpponent_A - 300].field_1C[i];
}
}
- battleSave->field_51A = gSaveBlock2Ptr->field_738[gTrainerBattleOpponent_A - 300].field_E4;
+ battleSave->field_51A = gSaveBlock2Ptr->records[gTrainerBattleOpponent_A - 300].field_E4;
}
else if (gTrainerBattleOpponent_B >= 300 && gTrainerBattleOpponent_B <= 399)
{
for (i = 0; i < 8; i++)
{
- battleSave->field_504[i] = gSaveBlock2Ptr->field_738[gTrainerBattleOpponent_B - 300].field_4[i];
+ battleSave->field_504[i] = gSaveBlock2Ptr->records[gTrainerBattleOpponent_B - 300].field_4[i];
}
- battleSave->field_50C = gSaveBlock2Ptr->field_738[gTrainerBattleOpponent_B - 300].field_1;
+ battleSave->field_50C = gSaveBlock2Ptr->records[gTrainerBattleOpponent_B - 300].field_1;
if (sUnknown_0203CCE8 == 1)
{
for (i = 0; i < 6; i++)
{
- battleSave->field_50E[i] = gSaveBlock2Ptr->field_738[gTrainerBattleOpponent_B - 300].field_28[i];
+ battleSave->field_50E[i] = gSaveBlock2Ptr->records[gTrainerBattleOpponent_B - 300].field_28[i];
}
}
else
{
for (i = 0; i < 6; i++)
{
- battleSave->field_50E[i] = gSaveBlock2Ptr->field_738[gTrainerBattleOpponent_B - 300].field_1C[i];
+ battleSave->field_50E[i] = gSaveBlock2Ptr->records[gTrainerBattleOpponent_B - 300].field_1C[i];
}
}
- battleSave->field_51A = gSaveBlock2Ptr->field_738[gTrainerBattleOpponent_B - 300].field_E4;
+ battleSave->field_51A = gSaveBlock2Ptr->records[gTrainerBattleOpponent_B - 300].field_E4;
}
else if (gPartnerTrainerId >= 300 && gPartnerTrainerId <= 399)
{
for (i = 0; i < 8; i++)
{
- battleSave->field_504[i] = gSaveBlock2Ptr->field_738[gPartnerTrainerId - 300].field_4[i];
+ battleSave->field_504[i] = gSaveBlock2Ptr->records[gPartnerTrainerId - 300].field_4[i];
}
- battleSave->field_50C = gSaveBlock2Ptr->field_738[gPartnerTrainerId - 300].field_1;
+ battleSave->field_50C = gSaveBlock2Ptr->records[gPartnerTrainerId - 300].field_1;
if (sUnknown_0203CCE8 == 1)
{
for (i = 0; i < 6; i++)
{
- battleSave->field_50E[i] = gSaveBlock2Ptr->field_738[gPartnerTrainerId - 300].field_28[i];
+ battleSave->field_50E[i] = gSaveBlock2Ptr->records[gPartnerTrainerId - 300].field_28[i];
}
}
else
{
for (i = 0; i < 6; i++)
{
- battleSave->field_50E[i] = gSaveBlock2Ptr->field_738[gPartnerTrainerId - 300].field_1C[i];
+ battleSave->field_50E[i] = gSaveBlock2Ptr->records[gPartnerTrainerId - 300].field_1C[i];
}
}
- battleSave->field_51A = gSaveBlock2Ptr->field_738[gPartnerTrainerId - 300].field_E4;
+ battleSave->field_51A = gSaveBlock2Ptr->records[gPartnerTrainerId - 300].field_E4;
}
*/
diff --git a/src/tv.c b/src/tv.c
index fb309f6e3..3625c6cee 100644
--- a/src/tv.c
+++ b/src/tv.c
@@ -1544,7 +1544,7 @@ static void InterviewAfter_BravoTrainerBattleTowerProfile(void)
StringCopy(show->bravoTrainerTower.pokemonName, gSaveBlock2Ptr->frontier.field_BD8);
show->bravoTrainerTower.species = gSaveBlock2Ptr->frontier.field_BD4;
show->bravoTrainerTower.defeatedSpecies = gSaveBlock2Ptr->frontier.field_BD6;
- show->bravoTrainerTower.numFights = sub_8164FCC(gSaveBlock2Ptr->frontier.field_D07, 0);
+ show->bravoTrainerTower.numFights = GetCurrentBattleTowerWinStreak(gSaveBlock2Ptr->frontier.field_D07, 0);
show->bravoTrainerTower.wonTheChallenge = gSaveBlock2Ptr->frontier.field_D06;
if (gSaveBlock2Ptr->frontier.field_D07 == 0)
{