diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/battle_tower.c | 93 | ||||
-rw-r--r-- | src/recorded_battle.c | 30 | ||||
-rw-r--r-- | src/tv.c | 2 |
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; } */ @@ -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) { |