diff options
author | Diegoisawesome <diego@domoreaweso.me> | 2018-11-06 11:40:17 -0600 |
---|---|---|
committer | Diegoisawesome <diego@domoreaweso.me> | 2018-11-06 11:40:17 -0600 |
commit | 9afe7a896e7bf9257d3c73c8fb592f0b9243d520 (patch) | |
tree | 490f5c185053db27730eefe1f6764b406d4adfb2 /src | |
parent | 43a8534fced2c4327acdd8dc9690f5bc6751e2db (diff) | |
parent | ccc5d27fcb8647225656b06a60a7d79ad0fa299f (diff) |
Merge remote-tracking branch 'pret/master' into render_text
Diffstat (limited to 'src')
-rw-r--r-- | src/apprentice.c | 50 | ||||
-rw-r--r-- | src/battle_dome.c | 150 | ||||
-rw-r--r-- | src/battle_factory.c | 2 | ||||
-rw-r--r-- | src/battle_frontier_1.c | 18 | ||||
-rw-r--r-- | src/battle_main.c | 2 | ||||
-rw-r--r-- | src/battle_message.c | 10 | ||||
-rw-r--r-- | src/battle_tent.c | 4 | ||||
-rw-r--r-- | src/battle_tower.c | 75 | ||||
-rw-r--r-- | src/field_control_avatar.c | 3 | ||||
-rw-r--r-- | src/field_poison.c | 4 | ||||
-rw-r--r-- | src/field_specials.c | 60 | ||||
-rw-r--r-- | src/fieldmap.c | 4 | ||||
-rw-r--r-- | src/frontier_util.c | 2752 | ||||
-rwxr-xr-x | src/item_menu.c | 4 | ||||
-rw-r--r-- | src/new_game.c | 24 | ||||
-rw-r--r-- | src/overworld.c | 2 | ||||
-rw-r--r-- | src/pokemon_summary_screen.c | 4 | ||||
-rw-r--r-- | src/record_mixing.c | 674 | ||||
-rw-r--r-- | src/recorded_battle.c | 1061 | ||||
-rw-r--r-- | src/save.c | 36 | ||||
-rw-r--r-- | src/scrcmd.c | 7 | ||||
-rw-r--r-- | src/start_menu.c | 4 | ||||
-rw-r--r-- | src/strings.c | 4 | ||||
-rw-r--r-- | src/tv.c | 8 | ||||
-rw-r--r-- | src/walda_phrase.c | 2 |
25 files changed, 3279 insertions, 1685 deletions
diff --git a/src/apprentice.c b/src/apprentice.c index 065d9cf16..2feac49a7 100644 --- a/src/apprentice.c +++ b/src/apprentice.c @@ -388,112 +388,128 @@ const struct ApprenticeTrainer gApprentices[] = .otId = 0xBDC9, .facilityClass = 0x43, .species = {SPECIES_BEAUTIFLY, SPECIES_DUSTOX, SPECIES_ILLUMISE, SPECIES_SHIFTRY, SPECIES_BRELOOM, SPECIES_NINJASK, SPECIES_SHEDINJA, SPECIES_PINSIR, SPECIES_HERACROSS, SPECIES_VOLBEAT}, - .rest = {0, 0, 0x1D, 8, 0x3e, 20, 0, 12, 1, 10, 0x30, 6, 0x44, 20}, + .id = 0, + .easyChatWords = {0x81D, 0x143E, 0xC00, 0xA01, 0x630, 0x1444}, }, { .name = {_("ヒロオ"), _("LIONEL"), _("LIONEL"), _("CAIO"), _("LUDWIG"), _("LEO")}, .otId = 0xCF09, .facilityClass = 0x2B, .species = {SPECIES_SWELLOW, SPECIES_SWALOT, SPECIES_SHUCKLE, SPECIES_MANECTRIC, SPECIES_TORKOAL, SPECIES_HARIYAMA, SPECIES_MIGHTYENA, SPECIES_LUDICOLO, SPECIES_CRAWDAUNT, SPECIES_WHISCASH}, - .rest = {1, 0, 0x38, 12, 1, 10, 0x30, 6, 6, 10, 0x20, 0x10, 0x13, 0x22}, + .id = 1, + .easyChatWords = {0xC38, 0xA01, 0x630, 0xA06, 0x1020, 0x2213}, }, { .name = {_("ケイジ"), _("SONNY"), _("HERVE"), _("FEDRO"), _("WENZEL"), _("SANTI")}, .otId = 0x2E34, .facilityClass = 0x26, .species = {SPECIES_LINOONE, SPECIES_MIGHTYENA, SPECIES_WHISCASH, SPECIES_ZANGOOSE, SPECIES_SEVIPER, SPECIES_NINETALES, SPECIES_KECLEON, SPECIES_SHUCKLE, SPECIES_MANECTRIC, SPECIES_MACHAMP}, - .rest = {2, 0, 1, 10, 10, 0x16, 0x15, 14, 0x30, 6, 0x3b, 12, 0x4, 12}, + .id = 2, + .easyChatWords = {0xA01, 0x160A, 0xE15, 0x630, 0xC3B, 0xC04}, }, { .name = {_("ユラ"), _("LAYLA"), _("LAYLA"), _("ASTRID"), _("SONJA"), _("LOLA")}, .otId = 0x84EF, .facilityClass = 0x47, .species = {SPECIES_SWALOT, SPECIES_XATU, SPECIES_ALTARIA, SPECIES_GOLDUCK, SPECIES_FLYGON, SPECIES_ALAKAZAM, SPECIES_GARDEVOIR, SPECIES_WAILORD, SPECIES_GRUMPIG, SPECIES_MIGHTYENA}, - .rest = {3, 0, 11, 16, 15, 0x1e, 0x39, 16, 0x21, 0x14, 0x3, 12, 0xff, 0xff}, + .id = 3, + .easyChatWords = {0x100B, 0x1E0F, 0x1039, 0x1421, 0xC03, 0xFFFF}, }, { .name = {_("ヨウカ"), _("MACY"), _("AMELIE"), _("CLEO"), _("MARIA"), _("ELISA")}, .otId = 0x1E43, .facilityClass = 0x27, .species = {SPECIES_WIGGLYTUFF, SPECIES_LINOONE, SPECIES_KINGDRA, SPECIES_DELCATTY, SPECIES_RAICHU, SPECIES_FEAROW, SPECIES_STARMIE, SPECIES_MEDICHAM, SPECIES_SHIFTRY, SPECIES_BEAUTIFLY}, - .rest = {4, 0, 15, 0x1e, 0x14, 16, 6, 16, 15, 0x28, 0x1c, 0x1c, 0x13, 0x1c}, + .id = 4, + .easyChatWords = {0x1E0F, 0x1014, 0x1006, 0x280F, 0x1C1C, 0x1C13}, }, { .name = {_("ヤスシ"), _("DONTE"), _("BRAHIM"), _("GLAUCO"), _("JOSEF"), _("ROQUE")}, .otId = 0x379F, .facilityClass = 0x30, .species = {SPECIES_STARMIE, SPECIES_DODRIO, SPECIES_AGGRON, SPECIES_MAGNETON, SPECIES_MACHAMP, SPECIES_ARMALDO, SPECIES_HERACROSS, SPECIES_NOSEPASS, SPECIES_EXPLOUD, SPECIES_MIGHTYENA}, - .rest = {5, 0, 0x29, 0x0A, 0x08, 0x14, 0x2F, 0x10, 0x38, 0x16, 0x20, 0x08, 0x00, 0x0C}, + .id = 5, + .easyChatWords = {0xA29, 0x1408, 0x102F, 0x1638, 0x820, 0xC00}, }, { .name = {_("ミサオ"), _("AMIRA"), _("LAURE"), _("DAFNE"), _("AMELIE"), _("LARA")}, .otId = 0xF555, .facilityClass = 0x31, .species = {SPECIES_STARMIE, SPECIES_DODRIO, SPECIES_MAGNETON, SPECIES_MEDICHAM, SPECIES_MIGHTYENA, SPECIES_GLALIE, SPECIES_GOLEM, SPECIES_ELECTRODE, SPECIES_PELIPPER, SPECIES_SHARPEDO}, - .rest = {6, 0, 0x0B, 0x0C, 0x3E, 0x12, 0x00, 0x0C, 0x31, 0x0A, 0x30, 0x14, 0x00, 0x0C}, + .id = 6, + .easyChatWords = {0xC0B, 0x123E, 0xC00, 0xA31, 0x1430, 0xC00}, }, { .name = {_("カズサ"), _("KALI"), _("JODIE"), _("ILENIA"), _("KARO"), _("ELSA")}, .otId = 0x8D26, .facilityClass = 0x14, .species = {SPECIES_NINETALES, SPECIES_ALAKAZAM, SPECIES_SCEPTILE, SPECIES_SALAMENCE, SPECIES_GOLDUCK, SPECIES_MAWILE, SPECIES_WEEZING, SPECIES_LANTURN, SPECIES_GARDEVOIR, SPECIES_MILOTIC}, - .rest = {7, 0, 0x06, 0x0A, 0x20, 0x06, 0x1F, 0x0A, 0x02, 0x0A, 0x03, 0x0C, 0xFF, 0xFF}, + .id = 7, + .easyChatWords = {0xA06, 0x620, 0xA1F, 0xA02, 0xC03, 0xFFFF}, }, { .name = {_("スミレ"), _("ANNIE"), _("ANNIE"), _("IMELDA"), _("INES"), _("ROSA")}, .otId = 0x800C, .facilityClass = 0xD, .species = {SPECIES_SCEPTILE, SPECIES_VILEPLUME, SPECIES_BELLOSSOM, SPECIES_ROSELIA, SPECIES_CORSOLA, SPECIES_FLYGON, SPECIES_BRELOOM, SPECIES_MILOTIC, SPECIES_ALTARIA, SPECIES_CRADILY}, - .rest = {8, 0, 0x22, 0x1E, 0x33, 0x04, 0x0E, 0x02, 0x02, 0x0A, 0x1E, 0x10, 0x00, 0x0C}, + .id = 8, + .easyChatWords = {0x1E22, 0x433, 0x20E, 0xA02, 0x101E, 0xC00}, }, { .name = {_("アキノリ"), _("DILLEN"), _("RENE"), _("INDRO"), _("DETLEF"), _("PEDRO")}, .otId = 0x469f, .facilityClass = 0, .species = {SPECIES_SKARMORY, SPECIES_GOLEM, SPECIES_BLAZIKEN, SPECIES_CAMERUPT, SPECIES_DONPHAN, SPECIES_MUK, SPECIES_SALAMENCE, SPECIES_TROPIUS, SPECIES_SOLROCK, SPECIES_RHYDON}, - .rest = {9, 0, 0x3D, 0x0A, 0x11, 0x10, 0x1E, 0x0E, 0x1C, 0x20, 0x04, 0x0C, 0xFF, 0xFF}, + .id = 9, + .easyChatWords = {0xA3D, 0x1011, 0xE1E, 0x201C, 0xC04, 0xFFFF}, }, { .name = {_("トウゾウ"), _("DALLAS"), _("BRUNO"), _("LEARCO"), _("ANSGAR"), _("MANOLO")}, .otId = 0x71FC, .facilityClass = 0x2D, .species = {SPECIES_SEAKING, SPECIES_STARMIE, SPECIES_GOLDUCK, SPECIES_TENTACRUEL, SPECIES_OCTILLERY, SPECIES_GOREBYSS, SPECIES_GLALIE, SPECIES_WAILORD, SPECIES_SHARPEDO, SPECIES_KINGDRA}, - .rest = {10, 0, 0x05, 0x0A, 0x06, 0x06, 0x0E, 0x16, 0x14, 0x0A, 0x00, 0x0C, 0xFF, 0xFF}, + .id = 10, + .easyChatWords = {0xA05, 0x606, 0x160E, 0xA14, 0xC00, 0xFFFF}, }, { .name = {_("セイヤ"), _("FRANK"), _("FRANK"), _("OLINDO"), _("FRANK"), _("MAURO")}, .otId = 0xA39E, .facilityClass = 0x3A, .species = {SPECIES_QUAGSIRE, SPECIES_STARMIE, SPECIES_PELIPPER, SPECIES_CRAWDAUNT, SPECIES_WAILORD, SPECIES_GYARADOS, SPECIES_SWAMPERT, SPECIES_LANTURN, SPECIES_WHISCASH, SPECIES_SHUCKLE}, - .rest = {11, 0, 0x0E, 0x28, 0x3D, 0x10, 0x0F, 0x24, 0x14, 0x0A, 0x23, 0x1E, 0x24, 0x10}, + .id = 11, + .easyChatWords = {0x280E, 0x103D, 0x240F, 0xA14, 0x1E23, 0x1024}, }, { .name = {_("リュウジ"), _("LAMONT"), _("XAV"), _("ORFEO"), _("JÜRGEN"), _("JORGE")}, .otId = 0xE590, .facilityClass = 0x19, .species = {SPECIES_ABSOL, SPECIES_CROBAT, SPECIES_EXPLOUD, SPECIES_MAGNETON, SPECIES_SHARPEDO, SPECIES_MANECTRIC, SPECIES_METAGROSS, SPECIES_ELECTRODE, SPECIES_NOSEPASS, SPECIES_WEEZING}, - .rest = {12, 0, 0x20, 0x10, 0x2E, 0x06, 0x0B, 0x10, 0x22, 0x1E, 0x0F, 0x1E, 0x0B, 0x10}, + .id = 12, + .easyChatWords = {0x1020, 0x62E, 0x100B, 0x1E22, 0x1E0F, 0x100B}, }, { .name = {_("カツアキ"), _("TYRESE"), _("ANDY"), _("PARIDE"), _("DAVID"), _("CHICHO")}, .otId = 0xD018, .facilityClass = 10, .species = {SPECIES_BLAZIKEN, SPECIES_GOLEM, SPECIES_MACHAMP, SPECIES_RHYDON, SPECIES_HARIYAMA, SPECIES_AGGRON, SPECIES_MEDICHAM, SPECIES_ZANGOOSE, SPECIES_VIGOROTH, SPECIES_SLAKING}, - .rest = {13, 0, 0x29, 0x0A, 0x3A, 0x06, 0x15, 0x0E, 0x35, 0x14, 0x34, 0x10, 0x1E, 0x06}, + .id = 13, + .easyChatWords = {0xA29, 0x63A, 0xE15, 0x1435, 0x1034, 0x61E}, }, { .name = {_("トシミツ"), _("DANTE"), _("DANTE"), _("RAOUL"), _("LOTHAR"), _("PABLO")}, .otId = 0xBC75, .facilityClass = 14, .species = {SPECIES_SCEPTILE, SPECIES_SANDSLASH, SPECIES_FLYGON, SPECIES_CLAYDOL, SPECIES_ARMALDO, SPECIES_CROBAT, SPECIES_CRADILY, SPECIES_SOLROCK, SPECIES_LUNATONE, SPECIES_GOLEM}, - .rest = {14, 0, 0x01, 0x0A, 0x17, 0x10, 0x43, 0x12, 0x22, 0x1E, 0x0B, 0x10, 0x0F, 0x28}, + .id = 14, + .easyChatWords = {0xA01, 0x1017, 0x1243, 0x1E22, 0x100B, 0x280F}, }, { .name = {_("ローウェン"), _("ARTURO"), _("ARTURO"), _("ROMOLO"), _("BRIAN"), _("ARTURO")}, .otId = 0xFA02, .facilityClass = 0x20, .species = {SPECIES_ABSOL, SPECIES_MIGHTYENA, SPECIES_ALAKAZAM, SPECIES_BANETTE, SPECIES_NINETALES, SPECIES_CLAYDOL, SPECIES_MUK, SPECIES_SALAMENCE, SPECIES_WALREIN, SPECIES_DUSCLOPS}, - .rest = {15, 0, 0x0F, 0x1E, 0x04, 0x14, 0x2F, 0x10, 0x06, 0x10, 0x20, 0x10, 0x03, 0x0E}, + .id = 15, + .easyChatWords = {0x1E0F, 0x1404, 0x102F, 0x1006, 0x1020, 0xE03}, }, }; @@ -2222,7 +2238,7 @@ static void sub_81A1370(void) r9 = -1; for (i = 1; i < 4; i++) { - if (ReadUnalignedWord(gSaveBlock2Ptr->apprentices[i].playerId) == ReadUnalignedWord(gSaveBlock2Ptr->playerTrainerId) + if (GetTrainerId(gSaveBlock2Ptr->apprentices[i].playerId) == GetTrainerId(gSaveBlock2Ptr->playerTrainerId) && gSaveBlock2Ptr->apprentices[i].number < r10) { r10 = gSaveBlock2Ptr->apprentices[i].number; diff --git a/src/battle_dome.c b/src/battle_dome.c index 56f003d8f..b39162dda 100644 --- a/src/battle_dome.c +++ b/src/battle_dome.c @@ -3,6 +3,7 @@ #include "battle.h" #include "battle_setup.h" #include "battle_tower.h" +#include "frontier_util.h" #include "battle_message.h" #include "event_data.h" #include "overworld.h" @@ -56,13 +57,12 @@ struct UnkStruct_860DD10 }; extern void sub_81B8558(void); -extern u32 sub_81A39C4(void); -extern u16 sub_81A5060(u8 monId, u8 moveSlotId); -extern u8 sub_81A50F0(u8, u8); -extern u8 sub_81A50B0(u8); +extern u16 GetFrontierBrainMonMove(u8 monId, u8 moveSlotId); +extern u8 GetFrontierBrainMonEvs(u8, u8); +extern u8 GetFrontierBrainMonNature(u8); extern void sub_81A4C30(void); -extern bool8 sub_81A3610(void); -extern u16 sub_81A4FF0(u8); +extern u8 sub_81A3610(void); +extern u16 GetFrontierBrainMonSpecies(u8); extern void ReducePlayerPartyToThree(void); extern u8 gUnknown_0203CEF8[]; @@ -2408,7 +2408,7 @@ static void sub_818E9CC(void) gSaveBlock2Ptr->frontier.field_CA9_a = 0; gSaveBlock2Ptr->frontier.field_CA9_b = 0; if (!(gSaveBlock2Ptr->frontier.field_CDC & gUnknown_0860D0EC[battleMode][lvlMode])) - gSaveBlock2Ptr->frontier.field_D0C[battleMode][lvlMode] = 0; + gSaveBlock2Ptr->frontier.domeWinStreaks[battleMode][lvlMode] = 0; saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1); gTrainerBattleOpponent_A = 0; @@ -2422,7 +2422,7 @@ static void sub_818EA84(void) switch (gSpecialVar_0x8005) { case 0: - gSpecialVar_Result = gSaveBlock2Ptr->frontier.field_D0C[battleMode][lvlMode]; + gSpecialVar_Result = gSaveBlock2Ptr->frontier.domeWinStreaks[battleMode][lvlMode]; break; case 1: gSpecialVar_Result = ((gSaveBlock2Ptr->frontier.field_CDC & gUnknown_0860D0EC[battleMode][lvlMode]) != 0); @@ -2490,7 +2490,7 @@ static void sub_818ED28(void) switch (gSpecialVar_0x8005) { case 0: - gSaveBlock2Ptr->frontier.field_D0C[battleMode][lvlMode] = gSpecialVar_0x8006; + gSaveBlock2Ptr->frontier.domeWinStreaks[battleMode][lvlMode] = gSpecialVar_0x8006; break; case 1: if (gSpecialVar_0x8006) @@ -2575,7 +2575,7 @@ static void InitDomeTrainers(void) for (i = 0; i < 3; i++) { - gSaveBlock2Ptr->frontier.domeMonId[0][i] = GetMonData(&gPlayerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1], MON_DATA_SPECIES, NULL); + gSaveBlock2Ptr->frontier.domeMonIds[0][i] = GetMonData(&gPlayerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1], MON_DATA_SPECIES, NULL); for (j = 0; j < 4; j++) gSaveBlock2Ptr->frontier.field_EFC[i].moves[j] = GetMonData(&gPlayerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1], MON_DATA_MOVE1 + j, NULL); for (j = 0; j < 6; j++) @@ -2590,7 +2590,7 @@ static void InitDomeTrainers(void) { do { - trainerId = sub_8162548(sub_81A39C4(), 0); + trainerId = sub_8162548(GetCurrentFacilityWinStreak(), 0); for (j = 1; j < i; j++) { if (gSaveBlock2Ptr->frontier.domeTrainers[j].trainerId == trainerId) @@ -2603,7 +2603,7 @@ static void InitDomeTrainers(void) { do { - trainerId = sub_8162548(sub_81A39C4() + 1, 0); + trainerId = sub_8162548(GetCurrentFacilityWinStreak() + 1, 0); for (j = 1; j < i; j++) { if (gSaveBlock2Ptr->frontier.domeTrainers[j].trainerId == trainerId) @@ -2621,7 +2621,7 @@ static void InitDomeTrainers(void) monTournamentId = RandomizeFacilityTrainerMonId(trainerId); for (k = 0; k < j; k++) { - s32 checkingMonId = gSaveBlock2Ptr->frontier.domeMonId[i][k]; + s32 checkingMonId = gSaveBlock2Ptr->frontier.domeMonIds[i][k]; if (checkingMonId == monTournamentId || species[0] == gFacilityTrainerMons[monTournamentId].species || species[1] == gFacilityTrainerMons[monTournamentId].species @@ -2630,7 +2630,7 @@ static void InitDomeTrainers(void) } } while (k != j); - gSaveBlock2Ptr->frontier.domeMonId[i][j] = monTournamentId; + gSaveBlock2Ptr->frontier.domeMonIds[i][j] = monTournamentId; species[j] = gFacilityTrainerMons[monTournamentId].species; } @@ -2671,10 +2671,10 @@ static void InitDomeTrainers(void) ivs = GetDomeTrainerMonIvs(gSaveBlock2Ptr->frontier.domeTrainers[i].trainerId); for (j = 0; j < 3; j++) { - CalcDomeMonStats(gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[i][j]].species, + CalcDomeMonStats(gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[i][j]].species, monLevel, ivs, - gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[i][j]].evSpread, - gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[i][j]].nature, + gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[i][j]].evSpread, + gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[i][j]].nature, statValues); statSums[i] += statValues[STAT_ATK]; @@ -2683,8 +2683,8 @@ static void InitDomeTrainers(void) 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]; + monTypesBits |= gBitTable[gBaseStats[gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[i][j]].species].type1]; + monTypesBits |= gBitTable[gBaseStats[gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[i][j]].species].type2]; } for (monTypesCount = 0, j = 0; j < 32; j++) @@ -2737,7 +2737,7 @@ static void InitDomeTrainers(void) } for (i = 0; i < 3; i++) - gSaveBlock2Ptr->frontier.domeMonId[j][i] = sub_81A4FF0(i); + gSaveBlock2Ptr->frontier.domeMonIds[j][i] = GetFrontierBrainMonSpecies(i); } Free(statSums); @@ -2799,7 +2799,7 @@ static void SwapDomeTrainers(s32 id1, s32 id2, u16 *statsArray) SWAP(gSaveBlock2Ptr->frontier.domeTrainers[id1].trainerId, gSaveBlock2Ptr->frontier.domeTrainers[id2].trainerId, temp); for (i = 0; i < 3; i++) - SWAP(gSaveBlock2Ptr->frontier.domeMonId[id1][i], gSaveBlock2Ptr->frontier.domeMonId[id2][i], temp); + SWAP(gSaveBlock2Ptr->frontier.domeMonIds[id1][i], gSaveBlock2Ptr->frontier.domeMonIds[id2][i], temp); } static void sub_818F9B0(void) @@ -2829,24 +2829,24 @@ static void CreateDomeMon(u8 monPartyId, u16 tournamentTrainerId, u8 tournamentM u8 fixedIv = GetDomeTrainerMonIvs(tournamentTrainerId); // BUG: Should be using trainerId instead of tournamentTrainerId. As a result, all Pokemon have ivs of 3. u8 level = SetFacilityPtrsGetLevel(); CreateMonWithEVSpreadPersonalityOTID(&gEnemyParty[monPartyId], - gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[tournamentTrainerId][tournamentMonId]].species, + gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[tournamentTrainerId][tournamentMonId]].species, level, - gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[tournamentTrainerId][tournamentMonId]].nature, + gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[tournamentTrainerId][tournamentMonId]].nature, fixedIv, - gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[tournamentTrainerId][tournamentMonId]].evSpread, otId); + gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[tournamentTrainerId][tournamentMonId]].evSpread, otId); happiness = 0xFF; for (i = 0; i < 4; i++) { SetMonMoveSlot(&gEnemyParty[monPartyId], - gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[tournamentTrainerId][tournamentMonId]].moves[i], i); - if (gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[tournamentTrainerId][tournamentMonId]].moves[i] == MOVE_FRUSTRATION) + gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[tournamentTrainerId][tournamentMonId]].moves[i], i); + if (gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[tournamentTrainerId][tournamentMonId]].moves[i] == MOVE_FRUSTRATION) happiness = 0; } SetMonData(&gEnemyParty[monPartyId], MON_DATA_FRIENDSHIP, &happiness); SetMonData(&gEnemyParty[monPartyId], MON_DATA_HELD_ITEM, - &gBattleFrontierHeldItems[gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[tournamentTrainerId][tournamentMonId]].itemTableId]); + &gBattleFrontierHeldItems[gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[tournamentTrainerId][tournamentMonId]].itemTableId]); } static void CreateDomeTrainerMons(u16 tournamentTrainerId) @@ -2856,7 +2856,7 @@ static void CreateDomeTrainerMons(u16 tournamentTrainerId) s32 i, bits; ZeroEnemyPartyMons(); - bits = GetTrainerMonCountInBits(tournamentTrainerId); + bits = GetDomeTrainerMonCountInBits(tournamentTrainerId); otId = Random32(); if (Random() % 10 > 5) { @@ -2884,7 +2884,7 @@ static void CreateDomeTrainerMons(u16 tournamentTrainerId) } } -s32 GetTrainerMonCountInBits(u16 tournamentTrainerId) +s32 GetDomeTrainerMonCountInBits(u16 tournamentTrainerId) { s32 bits; if (Random() & 1) @@ -2917,12 +2917,12 @@ static s32 sub_818FCBC(u16 tournamentTrainerId, bool8 arg1) { if (gSaveBlock2Ptr->frontier.domeTrainers[tournamentTrainerId].trainerId == TRAINER_FRONTIER_BRAIN) { - array[i] += GetTypeEffectivenessPoints(sub_81A5060(i, moveId), + array[i] += GetTypeEffectivenessPoints(GetFrontierBrainMonMove(i, moveId), GetMonData(&gPlayerParty[playerMonId], MON_DATA_SPECIES, NULL), 0); } else { - array[i] += GetTypeEffectivenessPoints(gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[tournamentTrainerId][i]].moves[moveId], + array[i] += GetTypeEffectivenessPoints(gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[tournamentTrainerId][i]].moves[moveId], GetMonData(&gPlayerParty[playerMonId], MON_DATA_SPECIES, NULL), 0); } } @@ -2945,12 +2945,12 @@ static s32 sub_818FDB8(u16 tournamentTrainerId, bool8 arg1) { if (gSaveBlock2Ptr->frontier.domeTrainers[tournamentTrainerId].trainerId == TRAINER_FRONTIER_BRAIN) { - array[i] += GetTypeEffectivenessPoints(sub_81A5060(i, moveId), + array[i] += GetTypeEffectivenessPoints(GetFrontierBrainMonMove(i, moveId), GetMonData(&gPlayerParty[playerMonId], MON_DATA_SPECIES, NULL), 1); } else { - array[i] += GetTypeEffectivenessPoints(gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[tournamentTrainerId][i]].moves[moveId], + array[i] += GetTypeEffectivenessPoints(gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[tournamentTrainerId][i]].moves[moveId], GetMonData(&gPlayerParty[playerMonId], MON_DATA_SPECIES, NULL), 1); } } @@ -3481,13 +3481,13 @@ static void sub_819033C(void) u8 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; u8 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); - if (gSaveBlock2Ptr->frontier.field_D0C[battleMode][lvlMode] < 999) - gSaveBlock2Ptr->frontier.field_D0C[battleMode][lvlMode]++; - if (gSaveBlock2Ptr->frontier.field_D1C[battleMode][lvlMode] < 999) - gSaveBlock2Ptr->frontier.field_D1C[battleMode][lvlMode]++; + if (gSaveBlock2Ptr->frontier.domeWinStreaks[battleMode][lvlMode] < 999) + gSaveBlock2Ptr->frontier.domeWinStreaks[battleMode][lvlMode]++; + if (gSaveBlock2Ptr->frontier.domeTotalChampionships[battleMode][lvlMode] < 999) + gSaveBlock2Ptr->frontier.domeTotalChampionships[battleMode][lvlMode]++; - if (gSaveBlock2Ptr->frontier.field_D0C[battleMode][lvlMode] > gSaveBlock2Ptr->frontier.field_D14[battleMode][lvlMode]) - gSaveBlock2Ptr->frontier.field_D14[battleMode][lvlMode] = gSaveBlock2Ptr->frontier.field_D0C[battleMode][lvlMode]; + if (gSaveBlock2Ptr->frontier.domeWinStreaks[battleMode][lvlMode] > gSaveBlock2Ptr->frontier.domeRecordWinStreaks[battleMode][lvlMode]) + gSaveBlock2Ptr->frontier.domeRecordWinStreaks[battleMode][lvlMode] = gSaveBlock2Ptr->frontier.domeWinStreaks[battleMode][lvlMode]; } static void ShowDomeOpponentInfo(void) @@ -4756,7 +4756,7 @@ static void DisplayTrainerInfoOnCard(u8 flags, u8 trainerTournamentId) { if (trainerId == TRAINER_PLAYER) { - sBattleDomeStruct->arr[2 + i + arrId] = CreateMonIcon(gSaveBlock2Ptr->frontier.domeMonId[trainerTournamentId][i], + sBattleDomeStruct->arr[2 + i + arrId] = CreateMonIcon(gSaveBlock2Ptr->frontier.domeMonIds[trainerTournamentId][i], SpriteCb_MonIcon, x | sInfoTrainerMonX[i], y + sInfoTrainerMonY[i], @@ -4765,7 +4765,7 @@ static void DisplayTrainerInfoOnCard(u8 flags, u8 trainerTournamentId) } else if (trainerId == TRAINER_FRONTIER_BRAIN) { - sBattleDomeStruct->arr[2 + i + arrId] = CreateMonIcon(gSaveBlock2Ptr->frontier.domeMonId[trainerTournamentId][i], + sBattleDomeStruct->arr[2 + i + arrId] = CreateMonIcon(gSaveBlock2Ptr->frontier.domeMonIds[trainerTournamentId][i], SpriteCb_MonIcon, x | sInfoTrainerMonX[i], y + sInfoTrainerMonY[i], @@ -4774,7 +4774,7 @@ static void DisplayTrainerInfoOnCard(u8 flags, u8 trainerTournamentId) } else { - sBattleDomeStruct->arr[2 + i + arrId] = CreateMonIcon(gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[trainerTournamentId][i]].species, + sBattleDomeStruct->arr[2 + i + arrId] = CreateMonIcon(gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[trainerTournamentId][i]].species, SpriteCb_MonIcon, x | sInfoTrainerMonX[i], y + sInfoTrainerMonY[i], @@ -4837,11 +4837,11 @@ static void DisplayTrainerInfoOnCard(u8 flags, u8 trainerTournamentId) { textPrinter.currentY = gUnknown_0860D346[i]; if (trainerId == TRAINER_PLAYER) - textPrinter.currentChar = gSpeciesNames[gSaveBlock2Ptr->frontier.domeMonId[trainerTournamentId][i]]; + textPrinter.currentChar = gSpeciesNames[gSaveBlock2Ptr->frontier.domeMonIds[trainerTournamentId][i]]; else if (trainerId == TRAINER_FRONTIER_BRAIN) - textPrinter.currentChar = gSpeciesNames[gSaveBlock2Ptr->frontier.domeMonId[trainerTournamentId][i]]; + textPrinter.currentChar = gSpeciesNames[gSaveBlock2Ptr->frontier.domeMonIds[trainerTournamentId][i]]; else - textPrinter.currentChar = gSpeciesNames[gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[trainerTournamentId][i]].species]; + textPrinter.currentChar = gSpeciesNames[gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[trainerTournamentId][i]].species]; textPrinter.windowId = 1 + i + windowId; if (i == 1) @@ -4875,11 +4875,11 @@ static void DisplayTrainerInfoOnCard(u8 flags, u8 trainerTournamentId) for (k = 0; k < DOME_TOURNAMENT_TRAINERS_COUNT; k++) { if (trainerId == TRAINER_FRONTIER_BRAIN) - allocatedArray[k] += sMovePointsForDomeTrainers[sub_81A5060(i, j)][k]; + allocatedArray[k] += sMovePointsForDomeTrainers[GetFrontierBrainMonMove(i, j)][k]; else if (trainerId == TRAINER_PLAYER) allocatedArray[k] += sMovePointsForDomeTrainers[gSaveBlock2Ptr->frontier.field_EFC[i].moves[j]][k]; else - allocatedArray[k] += sMovePointsForDomeTrainers[gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[trainerTournamentId][i]].moves[j]][k]; + allocatedArray[k] += sMovePointsForDomeTrainers[gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[trainerTournamentId][i]].moves[j]][k]; } } } @@ -4916,7 +4916,7 @@ static void DisplayTrainerInfoOnCard(u8 flags, u8 trainerTournamentId) for (j = 0; j < 6; j++) { if (trainerId == TRAINER_FRONTIER_BRAIN) - allocatedArray[j] = sub_81A50F0(i, j); + allocatedArray[j] = GetFrontierBrainMonEvs(i, j); else allocatedArray[j] = gSaveBlock2Ptr->frontier.field_EFC[i].evs[j]; } @@ -4924,7 +4924,7 @@ static void DisplayTrainerInfoOnCard(u8 flags, u8 trainerTournamentId) for (j = 0; j < 5; j++) { if (trainerId == TRAINER_FRONTIER_BRAIN) - nature = sub_81A50B0(i); + nature = GetFrontierBrainMonNature(i); else nature = gSaveBlock2Ptr->frontier.field_EFC[i].nature; @@ -4952,7 +4952,7 @@ static void DisplayTrainerInfoOnCard(u8 flags, u8 trainerTournamentId) { for (i = 0; i < 3; i++) { - s32 evBits = gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[trainerTournamentId][i]].evSpread; + s32 evBits = gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[trainerTournamentId][i]].evSpread; for (k = 0, j = 0; j < 6; j++) { allocatedArray[j] = 0; @@ -4961,7 +4961,7 @@ static void DisplayTrainerInfoOnCard(u8 flags, u8 trainerTournamentId) evBits >>= 1; } k = MAX_TOTAL_EVS / k; - evBits = gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[trainerTournamentId][i]].evSpread; + evBits = gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[trainerTournamentId][i]].evSpread; for (j = 0; j < 6; j++) { if (evBits & 1) @@ -4972,7 +4972,7 @@ static void DisplayTrainerInfoOnCard(u8 flags, u8 trainerTournamentId) allocatedArray[6] += allocatedArray[0]; for (j = 0; j < 5; j++) { - nature = gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[trainerTournamentId][i]].nature; + nature = gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[trainerTournamentId][i]].nature; if (gNatureStatTable[nature][j] > 0) { allocatedArray[j + 7] += (allocatedArray[j + 1] * 110) / 100; @@ -5210,7 +5210,7 @@ static void DisplayMatchInfoOnCard(u8 flags, u8 matchNo) { if (trainerIds[0] == TRAINER_PLAYER) { - sBattleDomeStruct->arr[2 + i + arrId] = CreateMonIcon(gSaveBlock2Ptr->frontier.domeMonId[tournamentIds[0]][i], + sBattleDomeStruct->arr[2 + i + arrId] = CreateMonIcon(gSaveBlock2Ptr->frontier.domeMonIds[tournamentIds[0]][i], SpriteCb_MonIcon, x | sFirstTrainerMonX[i], y + sFirstTrainerMonY[i], @@ -5219,7 +5219,7 @@ static void DisplayMatchInfoOnCard(u8 flags, u8 matchNo) } else if (trainerIds[0] == TRAINER_FRONTIER_BRAIN) { - sBattleDomeStruct->arr[2 + i + arrId] = CreateMonIcon(gSaveBlock2Ptr->frontier.domeMonId[tournamentIds[0]][i], + sBattleDomeStruct->arr[2 + i + arrId] = CreateMonIcon(gSaveBlock2Ptr->frontier.domeMonIds[tournamentIds[0]][i], SpriteCb_MonIcon, x | sFirstTrainerMonX[i], y + sFirstTrainerMonY[i], @@ -5228,7 +5228,7 @@ static void DisplayMatchInfoOnCard(u8 flags, u8 matchNo) } else { - sBattleDomeStruct->arr[2 + i + arrId] = CreateMonIcon(gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[tournamentIds[0]][i]].species, + sBattleDomeStruct->arr[2 + i + arrId] = CreateMonIcon(gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[tournamentIds[0]][i]].species, SpriteCb_MonIcon, x | sFirstTrainerMonX[i], y + sFirstTrainerMonY[i], @@ -5250,7 +5250,7 @@ static void DisplayMatchInfoOnCard(u8 flags, u8 matchNo) { if (trainerIds[1] == TRAINER_PLAYER) { - sBattleDomeStruct->arr[5 + i + arrId] = CreateMonIcon(gSaveBlock2Ptr->frontier.domeMonId[tournamentIds[1]][i], + sBattleDomeStruct->arr[5 + i + arrId] = CreateMonIcon(gSaveBlock2Ptr->frontier.domeMonIds[tournamentIds[1]][i], SpriteCb_MonIcon, x | sSecondTrainerMonX[i], y + sSecondTrainerMonY[i], @@ -5259,7 +5259,7 @@ static void DisplayMatchInfoOnCard(u8 flags, u8 matchNo) } else if (trainerIds[1] == TRAINER_FRONTIER_BRAIN) { - sBattleDomeStruct->arr[5 + i + arrId] = CreateMonIcon(gSaveBlock2Ptr->frontier.domeMonId[tournamentIds[1]][i], + sBattleDomeStruct->arr[5 + i + arrId] = CreateMonIcon(gSaveBlock2Ptr->frontier.domeMonIds[tournamentIds[1]][i], SpriteCb_MonIcon, x | sSecondTrainerMonX[i], y + sSecondTrainerMonY[i], @@ -5268,7 +5268,7 @@ static void DisplayMatchInfoOnCard(u8 flags, u8 matchNo) } else { - sBattleDomeStruct->arr[5 + i + arrId] = CreateMonIcon(gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[tournamentIds[1]][i]].species, + sBattleDomeStruct->arr[5 + i + arrId] = CreateMonIcon(gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[tournamentIds[1]][i]].species, SpriteCb_MonIcon, x | sSecondTrainerMonX[i], y + sSecondTrainerMonY[i], @@ -5564,9 +5564,9 @@ static u16 GetWinningMove(s32 winnerTournamentId, s32 loserTournamentId, u8 roun { moveScores[i * 4 + j] = 0; if (gSaveBlock2Ptr->frontier.domeTrainers[winnerTournamentId].trainerId == TRAINER_FRONTIER_BRAIN) - moveIds[i * 4 + j] = sub_81A5060(i, j); + moveIds[i * 4 + j] = GetFrontierBrainMonMove(i, j); else - moveIds[i * 4 + j] = gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[winnerTournamentId][i]].moves[j]; + moveIds[i * 4 + j] = gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[winnerTournamentId][i]].moves[j]; movePower = gBattleMoves[moveIds[i * 4 + j]].power; if (movePower == 0) @@ -5584,9 +5584,9 @@ static u16 GetWinningMove(s32 winnerTournamentId, s32 loserTournamentId, u8 roun do { var = Random32(); - } while (gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[loserTournamentId][k]].nature != GetNatureFromPersonality(var)); + } while (gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[loserTournamentId][k]].nature != GetNatureFromPersonality(var)); - targetSpecies = gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[loserTournamentId][k]].species; + targetSpecies = gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[loserTournamentId][k]].species; if (var & 1) targetAbility = gBaseStats[targetSpecies].ability2; else @@ -6193,7 +6193,7 @@ static void sub_8194F58(void) monTournamentId = RandomizeFacilityTrainerMonId(trainerId); for (k = 0; k < j; k++) { - s32 checkingMonId = gSaveBlock2Ptr->frontier.domeMonId[i][k]; + s32 checkingMonId = gSaveBlock2Ptr->frontier.domeMonIds[i][k]; if (checkingMonId == monTournamentId || species[0] == gFacilityTrainerMons[monTournamentId].species || species[1] == gFacilityTrainerMons[monTournamentId].species @@ -6202,7 +6202,7 @@ static void sub_8194F58(void) } } while (k != j); - gSaveBlock2Ptr->frontier.domeMonId[i][j] = monTournamentId; + gSaveBlock2Ptr->frontier.domeMonIds[i][j] = monTournamentId; species[j] = gFacilityTrainerMons[monTournamentId].species; } gSaveBlock2Ptr->frontier.domeTrainers[i].isEliminated = 0; @@ -6218,10 +6218,10 @@ static void sub_8194F58(void) ivs = GetDomeTrainerMonIvs(gSaveBlock2Ptr->frontier.domeTrainers[i].trainerId); for (j = 0; j < 3; j++) { - CalcDomeMonStats(gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[i][j]].species, + CalcDomeMonStats(gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[i][j]].species, monLevel, ivs, - gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[i][j]].evSpread, - gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[i][j]].nature, + gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[i][j]].evSpread, + gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[i][j]].nature, statValues); statSums[i] += statValues[STAT_ATK]; @@ -6230,8 +6230,8 @@ static void sub_8194F58(void) 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]; + monTypesBits |= gBitTable[gBaseStats[gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[i][j]].species].type1]; + monTypesBits |= gBitTable[gBaseStats[gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[i][j]].species].type2]; } // Because GF hates temporary vars, trainerId acts like monTypesCount here. @@ -6347,11 +6347,11 @@ static void DecideRoundWinners(u8 roundId) { for (monId2 = 0; monId2 < 3; monId2++) { - points1 += GetTypeEffectivenessPoints(gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[tournamentId1][monId1]].moves[moveSlot], - gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[tournamentId2][monId2]].species, 2); + points1 += GetTypeEffectivenessPoints(gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[tournamentId1][monId1]].moves[moveSlot], + gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[tournamentId2][monId2]].species, 2); } } - species = gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[tournamentId1][monId1]].species; + species = gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[tournamentId1][monId1]].species; points1 += ( gBaseStats[species].baseHP + gBaseStats[species].baseAttack + gBaseStats[species].baseDefense @@ -6370,11 +6370,11 @@ static void DecideRoundWinners(u8 roundId) { for (monId2 = 0; monId2 < 3; monId2++) { - points2 += GetTypeEffectivenessPoints(gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[tournamentId2][monId1]].moves[moveSlot], - gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[tournamentId1][monId2]].species, 2); + points2 += GetTypeEffectivenessPoints(gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[tournamentId2][monId1]].moves[moveSlot], + gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[tournamentId1][monId2]].species, 2); } } - species = gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[tournamentId2][monId1]].species; + species = gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[tournamentId2][monId1]].species; points2 += ( gBaseStats[species].baseHP + gBaseStats[species].baseAttack + gBaseStats[species].baseDefense diff --git a/src/battle_factory.c b/src/battle_factory.c index c2a3207a6..d7a2939b3 100644 --- a/src/battle_factory.c +++ b/src/battle_factory.c @@ -1670,7 +1670,7 @@ static void CreateFrontierFactorySelectableMons(u8 firstMonId) u32 otId = 0; u8 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); u8 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; - u8 var_2C = gSaveBlock2Ptr->frontier.field_DE2[battleMode][lvlMode] / 7; + u8 var_2C = gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode] / 7; u8 var_28 = 0; gFacilityTrainerMons = gBattleFrontierMons; diff --git a/src/battle_frontier_1.c b/src/battle_frontier_1.c index 9ec9f8520..c53f10dca 100644 --- a/src/battle_frontier_1.c +++ b/src/battle_frontier_1.c @@ -27,7 +27,7 @@ void sub_8195980(void) gSaveBlock2Ptr->frontier.field_CA9_a = 0; gSaveBlock2Ptr->frontier.field_CA9_b = 0; if (!(gSaveBlock2Ptr->frontier.field_CDC & gUnknown_0860DE98[battleMode][lvlMode])) - gSaveBlock2Ptr->frontier.field_DC8[battleMode][lvlMode] = 0; + gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode] = 0; saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1); gTrainerBattleOpponent_A = 0; @@ -44,7 +44,7 @@ void sub_8195A38(void) gSpecialVar_Result = gSaveBlock2Ptr->frontier.field_DC4[1]; break; case 1: - gSpecialVar_Result = gSaveBlock2Ptr->frontier.field_DC8[battleMode][lvlMode]; + gSpecialVar_Result = gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode]; break; case 2: gSpecialVar_Result = ((gSaveBlock2Ptr->frontier.field_CDC & gUnknown_0860DE98[battleMode][lvlMode]) != 0); @@ -63,7 +63,7 @@ void sub_8195AE4(void) gSaveBlock2Ptr->frontier.field_DC4[1] = gSpecialVar_0x8006; break; case 1: - gSaveBlock2Ptr->frontier.field_DC8[battleMode][lvlMode] = gSpecialVar_0x8006; + gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode] = gSpecialVar_0x8006; break; case 2: if (gSpecialVar_0x8006) @@ -79,9 +79,9 @@ void sub_8195BB0(void) u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; - if (gSaveBlock2Ptr->frontier.field_DC8[battleMode][lvlMode] < 50) + if (gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode] < 50) gSpecialVar_Result = Random() % 3; - else if (gSaveBlock2Ptr->frontier.field_DC8[battleMode][lvlMode] < 99) + else if (gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode] < 99) gSpecialVar_Result = 3; else gSpecialVar_Result = 4; @@ -105,14 +105,14 @@ void sub_8195C7C(void) u8 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; u8 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); - if (gSaveBlock2Ptr->frontier.field_DC8[battleMode][lvlMode] < 9999) + if (gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode] < 9999) { u16 wat = 0; - gSaveBlock2Ptr->frontier.field_DC8[battleMode][lvlMode]++; + gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode]++; if (lvlMode < gSaveBlock2Ptr->frontier.field_DD0[battleMode][lvlMode]) wat = 1; - if (gSaveBlock2Ptr->frontier.field_DC8[battleMode][wat] != 0) - gSaveBlock2Ptr->frontier.field_DD0[battleMode][lvlMode] = gSaveBlock2Ptr->frontier.field_DC8[battleMode][lvlMode]; + if (gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][wat] != 0) + gSaveBlock2Ptr->frontier.field_DD0[battleMode][lvlMode] = gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode]; } } */ diff --git a/src/battle_main.c b/src/battle_main.c index 9f1ea3c01..e08e12194 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3027,7 +3027,7 @@ static void BattleStartClearSetData(void) if (!(gBattleTypeFlags & BATTLE_TYPE_LINK) && gSaveBlock2Ptr->optionsBattleSceneOff == TRUE) gHitMarker |= HITMARKER_NO_ANIMATIONS; } - else if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000)) && GetBattleStyleInRecordedBattle()) + else if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000)) && GetBattleSceneInRecordedBattle()) gHitMarker |= HITMARKER_NO_ANIMATIONS; gBattleScripting.battleStyle = gSaveBlock2Ptr->optionsBattleStyle; diff --git a/src/battle_message.c b/src/battle_message.c index 3b4ad0c21..44ea5d7d7 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -17,7 +17,7 @@ #include "menu.h" #include "recorded_battle.h" #include "international_string_util.h" -#include "battle_frontier_2.h" +#include "frontier_util.h" #include "battle_tower.h" #include "data2.h" @@ -2579,7 +2579,7 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) case B_TXT_TRAINER1_LOSE_TEXT: // trainerA lose text if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) { - CopyFrontierTrainerText(FRONTIER_LOSE_TEXT, gTrainerBattleOpponent_A); + CopyFrontierTrainerText(FRONTIER_PLAYER_WON_TEXT, gTrainerBattleOpponent_A); toCpy = gStringVar4; } else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_HILL) @@ -2595,7 +2595,7 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) case B_TXT_TRAINER1_WIN_TEXT: // trainerA win text if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) { - CopyFrontierTrainerText(FRONTIER_WIN_TEXT, gTrainerBattleOpponent_A); + CopyFrontierTrainerText(FRONTIER_PLAYER_LOST_TEXT, gTrainerBattleOpponent_A); toCpy = gStringVar4; } else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_HILL) @@ -2676,7 +2676,7 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) case B_TXT_TRAINER2_LOSE_TEXT: if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) { - CopyFrontierTrainerText(FRONTIER_LOSE_TEXT, gTrainerBattleOpponent_B); + CopyFrontierTrainerText(FRONTIER_PLAYER_WON_TEXT, gTrainerBattleOpponent_B); toCpy = gStringVar4; } else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_HILL) @@ -2692,7 +2692,7 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) case B_TXT_TRAINER2_WIN_TEXT: if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) { - CopyFrontierTrainerText(FRONTIER_WIN_TEXT, gTrainerBattleOpponent_B); + CopyFrontierTrainerText(FRONTIER_PLAYER_LOST_TEXT, gTrainerBattleOpponent_B); toCpy = gStringVar4; } else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_HILL) diff --git a/src/battle_tent.c b/src/battle_tent.c index 4c4bd7fc3..f3aec1345 100644 --- a/src/battle_tent.c +++ b/src/battle_tent.c @@ -9,7 +9,7 @@ #include "random.h" #include "item.h" #include "battle_factory.h" -#include "battle_frontier_2.h" +#include "frontier_util.h" #include "constants/items.h" #include "constants/region_map_sections.h" @@ -19,6 +19,8 @@ extern const u16 gBattleFrontierHeldItems[]; extern u16 gUnknown_03006298[]; +extern void sub_81A4C30(void); + // This file's functions. static void sub_81B99D4(void); static void sub_81B9A28(void); diff --git a/src/battle_tower.c b/src/battle_tower.c index 4b63c2875..e95eaf156 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -9,8 +9,7 @@ #include "main.h" #include "international_string_util.h" #include "battle.h" -#include "battle_frontier_1.h" -#include "battle_frontier_2.h" +#include "frontier_util.h" #include "recorded_battle.h" #include "easy_chat.h" #include "gym_leader_rematch.h" @@ -30,15 +29,9 @@ extern u16 gUnknown_03006298[]; -extern void sub_81A3ACC(void); -extern void CreateFrontierBrainPokemon(void); extern void sub_81A6CD0(void); -extern u16 sub_81A39C4(void); -extern void SetFrontierBrainTrainerGfxId(void); -extern u8 GetFrontierBrainTrainerPicIndex(void); -extern u8 GetFrontierBrainTrainerClass(void); -extern u8 IsFrontierBrainFemale(void); -extern void CopyFrontierBrainTrainerName(u8 *dst); +extern void sub_81A4C30(void); +extern u8 sub_81A6CA8(u8, u8); extern void SetMonMoveAvoidReturn(struct Pokemon *mon, u16 move, u8 moveSlot); extern const u8 *const *const gUnknown_085DD690[]; @@ -220,7 +213,7 @@ static void sub_8161F94(void) gSaveBlock2Ptr->frontier.field_CA9_b = 0; sub_81A3ACC(); if (!(gSaveBlock2Ptr->frontier.field_CDC & gUnknown_085DF9AC[battleMode][lvlMode])) - gSaveBlock2Ptr->frontier.winStreaks[battleMode][lvlMode] = 0; + gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode] = 0; ValidateBattleTowerRecordChecksums(); saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1); @@ -258,7 +251,7 @@ static void sub_81620F4(void) case 0: break; case 1: - gSaveBlock2Ptr->frontier.winStreaks[battleMode][lvlMode] = gSpecialVar_0x8006; + gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode] = gSpecialVar_0x8006; break; case 2: if (gSpecialVar_0x8006) @@ -364,7 +357,8 @@ static void ChooseNextBattleTowerTrainer(void) { u16 id; u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); - u32 r5 = sub_81A39C4() / 7; + u16 winStreak = GetCurrentFacilityWinStreak(); + u32 challengeNum = winStreak / 7; SetFacilityPtrsGetLevel(); if (battleMode == FRONTIER_MODE_MULTIS || battleMode == FRONTIER_MODE_LINK_MULTIS) @@ -385,7 +379,7 @@ static void ChooseNextBattleTowerTrainer(void) s32 i; while (1) { - id = sub_8162548(r5, gSaveBlock2Ptr->frontier.curChallengeBattleNum); + id = sub_8162548(challengeNum, gSaveBlock2Ptr->frontier.curChallengeBattleNum); // Ensure trainer wasn't previously fought in this challenge. for (i = 0; i < gSaveBlock2Ptr->frontier.curChallengeBattleNum; i++) @@ -525,7 +519,7 @@ void SetBattleFacilityTrainerGfxId(u16 trainerId, u8 tempVarId) } else if (trainerId == TRAINER_FRONTIER_BRAIN) { - SetFrontierBrainTrainerGfxId(); + SetFrontierBrainEventObjGfx_2(); return; } else if (trainerId < TRAINER_RECORD_MIXING_FRIEND) @@ -769,14 +763,14 @@ u8 GetFrontierTrainerFrontSpriteId(u16 trainerId) else if (trainerId < TRAINER_RECORD_MIXING_APPRENTICE) { if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) - return gFacilityClassToPicIndex[sub_818649C()]; + return gFacilityClassToPicIndex[GetRecordedBattleRecordMixFriendClass()]; else return gFacilityClassToPicIndex[gSaveBlock2Ptr->frontier.towerRecords[trainerId - TRAINER_RECORD_MIXING_FRIEND].facilityClass]; } else { if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) - return gFacilityClassToPicIndex[gApprentices[sub_81864A8()].facilityClass]; + return gFacilityClassToPicIndex[gApprentices[GetRecordedBattleApprenticeId()].facilityClass]; else return gFacilityClassToPicIndex[gApprentices[gSaveBlock2Ptr->apprentices[trainerId - TRAINER_RECORD_MIXING_APPRENTICE].id].facilityClass]; } @@ -807,7 +801,7 @@ u8 GetFrontierOpponentClass(u16 trainerId) { if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) { - trainerClass = gFacilityClassToTrainerClass[sub_818649C()]; + trainerClass = gFacilityClassToTrainerClass[GetRecordedBattleRecordMixFriendClass()]; } else { @@ -819,7 +813,7 @@ u8 GetFrontierOpponentClass(u16 trainerId) { if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) { - trainerClass = gFacilityClassToTrainerClass[gApprentices[sub_81864A8()].facilityClass]; + trainerClass = gFacilityClassToTrainerClass[gApprentices[GetRecordedBattleApprenticeId()].facilityClass]; } else { @@ -847,14 +841,14 @@ static u8 GetFrontierTrainerFacilityClass(u16 trainerId) else if (trainerId < TRAINER_RECORD_MIXING_APPRENTICE) { if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) - facilityClass = sub_818649C(); + facilityClass = GetRecordedBattleRecordMixFriendClass(); else facilityClass = gSaveBlock2Ptr->frontier.towerRecords[trainerId - TRAINER_RECORD_MIXING_FRIEND].facilityClass; } else { if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) - facilityClass = gApprentices[sub_81864A8()].facilityClass; + facilityClass = gApprentices[GetRecordedBattleApprenticeId()].facilityClass; else facilityClass = gApprentices[gSaveBlock2Ptr->apprentices[trainerId - TRAINER_RECORD_MIXING_APPRENTICE].id].facilityClass; } @@ -907,8 +901,8 @@ void GetFrontierTrainerName(u8 *dst, u16 trainerId) if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) { - id = sub_81864A8(); - language = sub_81864C0(); + id = GetRecordedBattleApprenticeId(); + language = GetRecordedBattleApprenticeLanguage(); } else { @@ -1179,7 +1173,7 @@ static void FillFactoryFrontierTrainerParty(u16 trainerId, u8 firstMonId) { u8 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; // Unused variable. u8 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); - u8 challengeNum = gSaveBlock2Ptr->frontier.winStreaks[battleMode][0] / 7; + u8 challengeNum = gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][0] / 7; if (gSaveBlock2Ptr->frontier.curChallengeBattleNum < 6) fixedIV = sub_81A6CA8(challengeNum, 0); else @@ -1297,7 +1291,7 @@ static void HandleSpecialTrainerBattleEnd(void) { s32 i; - sub_81864CC(); + RecordedBattle_SaveBattleOutcome(); switch (gBattleScripting.specialTrainerBattleType) { case SPECIAL_BATTLE_TOWER: @@ -1480,8 +1474,8 @@ static void SaveCurrentWinStreak(void) u8 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); u16 winStreak = GetCurrentBattleTowerWinStreak(lvlMode, battleMode); - if (gSaveBlock2Ptr->frontier.winStreaks[battleMode][lvlMode] < winStreak) - gSaveBlock2Ptr->frontier.winStreaks[battleMode][lvlMode] = winStreak; + if (gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode] < winStreak) + gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode] = winStreak; } static void sub_8163EE4(void) @@ -1509,15 +1503,15 @@ static void sub_8163EE4(void) } playerRecord->lvlMode = lvlMode; playerRecord->facilityClass = class; - CopyUnalignedWord(playerRecord->trainerId, gSaveBlock2Ptr->playerTrainerId); + CopyTrainerId(playerRecord->trainerId, gSaveBlock2Ptr->playerTrainerId); StringCopy7(playerRecord->name, gSaveBlock2Ptr->playerName); playerRecord->winStreak = GetCurrentBattleTowerWinStreak(lvlMode, battleMode); for (i = 0; i < 6; i++) { playerRecord->greeting[i] = gSaveBlock1Ptr->unk2BBC[i]; - playerRecord->unk1C[i] = gSaveBlock1Ptr->unk2BC8[i]; - playerRecord->unk28[i] = gSaveBlock1Ptr->unk2BD4[i]; + playerRecord->speechWon[i] = gSaveBlock1Ptr->unk2BC8[i]; + playerRecord->speechLost[i] = gSaveBlock1Ptr->unk2BD4[i]; } for (i = 0; i < 4; i++) @@ -1535,7 +1529,7 @@ static void SaveBattleTowerProgress(void) { u16 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; u16 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); - s32 challengeNum = (signed)(gSaveBlock2Ptr->frontier.winStreaks[battleMode][lvlMode] / 7); + s32 challengeNum = (signed)(gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode] / 7); if (gSpecialVar_0x8005 == 0 && (challengeNum > 1 || gSaveBlock2Ptr->frontier.curChallengeBattleNum != 0)) sub_8163EE4(); @@ -1625,7 +1619,7 @@ static void sub_81642A0(void) eventObjTemplates = gSaveBlock1Ptr->eventObjectTemplates; lvlMode = gSaveBlock2Ptr->frontier.lvlMode; battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); - challengeNum = gSaveBlock2Ptr->frontier.winStreaks[battleMode][lvlMode] / 7; + challengeNum = gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode] / 7; species1 = GetMonData(&gPlayerParty[0], MON_DATA_SPECIES, NULL); species2 = GetMonData(&gPlayerParty[1], MON_DATA_SPECIES, NULL); level = SetFacilityPtrsGetLevel(); @@ -1795,7 +1789,8 @@ static void sub_8164828(void) s32 i, j, arrId; s32 monPoolId; s32 level = SetFacilityPtrsGetLevel(); - s32 challengeNum = sub_81A39C4() / 7; + u16 winStreak = GetCurrentFacilityWinStreak(); + s32 challengeNum = winStreak / 7; s32 k = gSpecialVar_LastTalked - 2; s32 trainerId = gSaveBlock2Ptr->frontier.field_CB4[k]; @@ -1911,7 +1906,7 @@ static void sub_8164B74(void) case 0: if (battleMode == FRONTIER_MODE_LINK_MULTIS) { - challengeNum = gSaveBlock2Ptr->frontier.winStreaks[battleMode][lvlMode] / 7; + challengeNum = gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode] / 7; if (sub_800A520()) { SendBlock(bitmask_all_link_players_but_self(), &challengeNum, sizeof(challengeNum)); @@ -2069,7 +2064,7 @@ static void ClearBattleTowerRecord(struct EmeraldBattleTowerRecord *record) u16 GetCurrentBattleTowerWinStreak(u8 lvlMode, u8 battleMode) { - u16 winStreak = gSaveBlock2Ptr->frontier.winStreaks[battleMode][lvlMode]; + u16 winStreak = gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode]; if (winStreak > 9999) return 9999; @@ -2164,7 +2159,7 @@ static void FillEReaderTrainerWithPlayerData(void) + gSaveBlock2Ptr->playerTrainerId[2] + gSaveBlock2Ptr->playerTrainerId[3]) % ARRAY_COUNT(gTowerMaleFacilityClasses)]; } - CopyUnalignedWord(ereaderTrainer->trainerId, gSaveBlock2Ptr->playerTrainerId); + CopyTrainerId(ereaderTrainer->trainerId, gSaveBlock2Ptr->playerTrainerId); StringCopy7(ereaderTrainer->name, gSaveBlock2Ptr->playerName); ereaderTrainer->winStreak = 1; @@ -2425,9 +2420,9 @@ bool32 RubyBattleTowerRecordToEmerald(struct RSBattleTowerRecord *src, struct Em for (i = 0; i < 6; i++) dst->greeting[i] = src->greeting[i]; for (i = 0; i < 6; i++) - dst->unk1C[i] = gUnknown_085DFA46[i]; + dst->speechWon[i] = gUnknown_085DFA46[i]; for (i = 0; i < 6; i++) - dst->unk28[i] = gUnknown_085DFA52[i]; + dst->speechLost[i] = gUnknown_085DFA52[i]; for (i = 0; i < 3; i++) dst->party[i] = src->party[i]; @@ -2526,14 +2521,14 @@ void GetBattleTowerTrainerLanguage(u8 *dst, u16 trainerId) else if (trainerId < TRAINER_RECORD_MIXING_APPRENTICE) { if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) - *dst = sub_81864B4(); + *dst = GetRecordedBattleRecordMixFriendLanguage(); else *dst = gSaveBlock2Ptr->frontier.towerRecords[trainerId - TRAINER_RECORD_MIXING_FRIEND].language; } else { if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) - *dst = sub_81864C0(); + *dst = GetRecordedBattleApprenticeLanguage(); else *dst = gSaveBlock2Ptr->apprentices[trainerId - TRAINER_RECORD_MIXING_APPRENTICE].language; } diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index fef403c04..738826020 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -1,6 +1,5 @@ #include "global.h" #include "battle_setup.h" -#include "battle_frontier_1.h" #include "bike.h" #include "coord_event_weather.h" #include "daycare.h" @@ -31,6 +30,8 @@ #include "constants/map_types.h" #include "constants/songs.h" +extern bool32 sub_8196034(void); + static EWRAM_DATA u8 sWildEncounterImmunitySteps = 0; static EWRAM_DATA u16 sPreviousPlayerMetatileBehavior = 0; diff --git a/src/field_poison.c b/src/field_poison.c index 6a519d90c..e2fd994fc 100644 --- a/src/field_poison.c +++ b/src/field_poison.c @@ -6,7 +6,7 @@ #include "field_message_box.h" #include "strings.h" #include "rom_818CFC8.h" -#include "battle_frontier_2.h" +#include "frontier_util.h" #include "pokenav.h" #include "event_data.h" #include "script.h" @@ -14,6 +14,8 @@ #include "fldeff_80F9BCC.h" #include "field_poison.h" +extern bool8 InBattlePike(void); + static bool32 sub_80F9568(struct Pokemon *pokemon) { u16 species = GetMonData(pokemon, MON_DATA_SPECIES2); diff --git a/src/field_specials.c b/src/field_specials.c index e2e069d28..522cbdf94 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -2158,73 +2158,73 @@ void sub_8139F20(void) case 1: case 2: case 3: - if (gSaveBlock2Ptr->frontier.winStreaks[var][0] >= gSaveBlock2Ptr->frontier.winStreaks[var][1]) + if (gSaveBlock2Ptr->frontier.towerWinStreaks[var][0] >= gSaveBlock2Ptr->frontier.towerWinStreaks[var][1]) { - unk = gSaveBlock2Ptr->frontier.winStreaks[var][0]; + unk = gSaveBlock2Ptr->frontier.towerWinStreaks[var][0]; } else { - unk = gSaveBlock2Ptr->frontier.winStreaks[var][1]; + unk = gSaveBlock2Ptr->frontier.towerWinStreaks[var][1]; } break; case 4: - if (gSaveBlock2Ptr->frontier.field_D0C[0][0] >= gSaveBlock2Ptr->frontier.field_D0C[0][1]) + if (gSaveBlock2Ptr->frontier.domeWinStreaks[0][0] >= gSaveBlock2Ptr->frontier.domeWinStreaks[0][1]) { - unk = gSaveBlock2Ptr->frontier.field_D0C[0][0]; + unk = gSaveBlock2Ptr->frontier.domeWinStreaks[0][0]; } else { - unk = gSaveBlock2Ptr->frontier.field_D0C[0][1]; + unk = gSaveBlock2Ptr->frontier.domeWinStreaks[0][1]; } break; case 5: - if (gSaveBlock2Ptr->frontier.field_DE2[0][0] >= gSaveBlock2Ptr->frontier.field_DE2[0][1]) + if (gSaveBlock2Ptr->frontier.factoryWinStreaks[0][0] >= gSaveBlock2Ptr->frontier.factoryWinStreaks[0][1]) { - unk = gSaveBlock2Ptr->frontier.field_DE2[0][0]; + unk = gSaveBlock2Ptr->frontier.factoryWinStreaks[0][0]; } else { - unk = gSaveBlock2Ptr->frontier.field_DE2[0][1]; + unk = gSaveBlock2Ptr->frontier.factoryWinStreaks[0][1]; } break; case 6: - if (gSaveBlock2Ptr->frontier.field_DC8[0][0] >= gSaveBlock2Ptr->frontier.field_DC8[0][1]) + if (gSaveBlock2Ptr->frontier.palaceWinStreaks[0][0] >= gSaveBlock2Ptr->frontier.palaceWinStreaks[0][1]) { - unk = gSaveBlock2Ptr->frontier.field_DC8[0][0]; + unk = gSaveBlock2Ptr->frontier.palaceWinStreaks[0][0]; } else { - unk = gSaveBlock2Ptr->frontier.field_DC8[0][1]; + unk = gSaveBlock2Ptr->frontier.palaceWinStreaks[0][1]; } break; case 7: - if (gSaveBlock2Ptr->frontier.field_DDA[0] >= gSaveBlock2Ptr->frontier.field_DDA[1]) + if (gSaveBlock2Ptr->frontier.arenaWinStreaks[0] >= gSaveBlock2Ptr->frontier.arenaWinStreaks[1]) { - unk = gSaveBlock2Ptr->frontier.field_DDA[0]; + unk = gSaveBlock2Ptr->frontier.arenaWinStreaks[0]; } else { - unk = gSaveBlock2Ptr->frontier.field_DDA[1]; + unk = gSaveBlock2Ptr->frontier.arenaWinStreaks[1]; } break; case 8: - if (gSaveBlock2Ptr->frontier.field_E04[0] >= gSaveBlock2Ptr->frontier.field_E04[1]) + if (gSaveBlock2Ptr->frontier.pikeWinStreaks[0] >= gSaveBlock2Ptr->frontier.pikeWinStreaks[1]) { - unk = gSaveBlock2Ptr->frontier.field_E04[0]; + unk = gSaveBlock2Ptr->frontier.pikeWinStreaks[0]; } else { - unk = gSaveBlock2Ptr->frontier.field_E04[1]; + unk = gSaveBlock2Ptr->frontier.pikeWinStreaks[1]; } break; case 9: - if (gSaveBlock2Ptr->frontier.field_E1A[0] >= gSaveBlock2Ptr->frontier.field_E1A[1]) + if (gSaveBlock2Ptr->frontier.pyramidWinStreaks[0] >= gSaveBlock2Ptr->frontier.pyramidWinStreaks[1]) { - unk = gSaveBlock2Ptr->frontier.field_E1A[0]; + unk = gSaveBlock2Ptr->frontier.pyramidWinStreaks[0]; } else { - unk = gSaveBlock2Ptr->frontier.field_E1A[1]; + unk = gSaveBlock2Ptr->frontier.pyramidWinStreaks[1]; } break; } @@ -2253,7 +2253,7 @@ void sub_813A080(void) for (i = 0; i < 9; i++) { - if (gUnknown_085B2CDC[i] > gSaveBlock2Ptr->frontier.winStreaks[battleMode][lvlMode]) + if (gUnknown_085B2CDC[i] > gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode]) { gSpecialVar_0x8005 = 4; gSpecialVar_0x8006 = i + 5; @@ -2997,7 +2997,7 @@ void sub_813A8FC(void) { u8 string[32]; u32 x; - StringCopy(ConvertIntToDecimalStringN(string, gSaveBlock2Ptr->frontier.frontierBattlePoints, STR_CONV_MODE_RIGHT_ALIGN, 4), gText_BP); + StringCopy(ConvertIntToDecimalStringN(string, gSaveBlock2Ptr->frontier.battlePoints, STR_CONV_MODE_RIGHT_ALIGN, 4), gText_BP); x = GetStringRightAlignXOffset(1, string, 48); AddTextPrinterParameterized(gUnknown_0203AB6D, 1, string, x, 1, 0, NULL); } @@ -3028,31 +3028,31 @@ void sub_813A988(void) void sub_813A9A4(void) { - if (gSaveBlock2Ptr->frontier.frontierBattlePoints < gSpecialVar_0x8004) + if (gSaveBlock2Ptr->frontier.battlePoints < gSpecialVar_0x8004) { - gSaveBlock2Ptr->frontier.frontierBattlePoints = 0; + gSaveBlock2Ptr->frontier.battlePoints = 0; } else { - gSaveBlock2Ptr->frontier.frontierBattlePoints -= gSpecialVar_0x8004; + gSaveBlock2Ptr->frontier.battlePoints -= gSpecialVar_0x8004; } } void sub_813A9D0(void) { - if (gSaveBlock2Ptr->frontier.frontierBattlePoints + gSpecialVar_0x8004 > 0x270F) + if (gSaveBlock2Ptr->frontier.battlePoints + gSpecialVar_0x8004 > 9999) { - gSaveBlock2Ptr->frontier.frontierBattlePoints = 0x270f; + gSaveBlock2Ptr->frontier.battlePoints = 9999; } else { - gSaveBlock2Ptr->frontier.frontierBattlePoints = gSaveBlock2Ptr->frontier.frontierBattlePoints + gSpecialVar_0x8004; + gSaveBlock2Ptr->frontier.battlePoints = gSaveBlock2Ptr->frontier.battlePoints + gSpecialVar_0x8004; } } u16 sub_813AA04(void) { - return gSaveBlock2Ptr->frontier.frontierBattlePoints; + return gSaveBlock2Ptr->frontier.battlePoints; } void sub_813AA18(void) diff --git a/src/fieldmap.c b/src/fieldmap.c index 96f5d2b85..5019b5dc7 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -1,7 +1,7 @@ #include "global.h" #include "overworld.h" #include "bg.h" -#include "battle_frontier_2.h" +#include "frontier_util.h" #include "constants/rgb.h" #include "fieldmap.h" #include "fldeff_80F9BCC.h" @@ -14,6 +14,8 @@ #include "secret_base.h" #include "tv.h" +extern void sub_81AA078(u16*, u8); + struct ConnectionFlags { u8 south:1; diff --git a/src/frontier_util.c b/src/frontier_util.c new file mode 100644 index 000000000..39f472a60 --- /dev/null +++ b/src/frontier_util.c @@ -0,0 +1,2752 @@ +#include "global.h" +#include "frontier_util.h" +#include "event_data.h" +#include "battle_setup.h" +#include "overworld.h" +#include "random.h" +#include "battle_tower.h" +#include "field_specials.h" +#include "battle.h" +#include "script_pokemon_util_80F87D8.h" +#include "main.h" +#include "window.h" +#include "menu.h" +#include "text.h" +#include "battle_records.h" +#include "international_string_util.h" +#include "string_util.h" +#include "new_game.h" +#include "link.h" +#include "tv.h" +#include "apprentice.h" +#include "pokedex.h" +#include "recorded_battle.h" +#include "data2.h" +#include "record_mixing.h" +#include "strings.h" +#include "malloc.h" +#include "save.h" +#include "load_save.h" +#include "battle_dome.h" +#include "constants/battle_frontier.h" +#include "constants/trainers.h" +#include "constants/species.h" +#include "constants/game_stat.h" +#include "constants/moves.h" +#include "constants/items.h" +#include "constants/event_objects.h" + +extern u8 gUnknown_0203CEF8[]; + +struct FrontierBrainMon +{ + u16 species; + u16 heldItem; + u8 fixedIV; + u8 nature; + u8 evs[6]; + u16 moves[4]; +}; + +extern const struct BattleFrontierTrainer gBattleFrontierTrainers[]; +extern const u8 *const gUnknown_08611D08[]; +extern const u8 *const gUnknown_08611CB0[][2]; +extern const u8 *const gUnknown_08611D00[]; +extern const u8 *const *const gUnknown_08611DB0[]; +extern const u8 *const *const gUnknown_08611DB8[]; +extern const u16 gFacilityToBrainTrainerId[]; + +extern void sub_81B8558(void); + +// This file's functions. +static void sub_81A17A0(void); +static void sub_81A1830(void); +static void sub_81A1968(void); +static void sub_81A1AD4(void); +static void DoSoftReset_(void); +static void sub_81A1B28(void); +static void sub_81A1B38(void); +static void ShowFacilityResultsWindow(void); +static void sub_81A31FC(void); +static void sub_81A35EC(void); +static void sub_81A3B00(void); +static void sub_81A3B64(void); +static void sub_81A3D30(void); +static void sub_81A3D58(void); +static void sub_81A3DA0(void); +static void sub_81A3FD4(void); +static void sub_81A4224(void); +static void sub_81A4230(void); +static void sub_81A43A8(void); +static void sub_81A4410(void); +static void sub_81A443C(void); +static void sub_81A447C(void); +static void sub_81A457C(void); +static void ShowTowerResultsWindow(u8); +static void ShowDomeResultsWindow(u8); +static void ShowPalaceResultsWindow(u8); +static void ShowPikeResultsWindow(void); +static void ShowFactoryResultsWindow(u8); +static void ShowArenaResultsWindow(void); +static void ShowPyramidResultsWindow(void); +static void ShowLinkContestResultsWindow(void); +static void CopyFrontierBrainText(bool8 playerWonText); + +// const rom data +static const u8 gUnknown_08611550[][4] = +{ + [FRONTIER_FACILITY_TOWER] = {0x23, 0x46, 0x23, 0x01}, + [FRONTIER_FACILITY_DOME] = {0x04, 0x09, 0x05, 0x00}, + [FRONTIER_FACILITY_PALACE] = {0x15, 0x2a, 0x15, 0x01}, + [FRONTIER_FACILITY_ARENA] = {0x1c, 0x38, 0x1c, 0x01}, + [FRONTIER_FACILITY_FACTORY] = {0x15, 0x2a, 0x15, 0x01}, + [FRONTIER_FACILITY_PIKE] = {0x1c, 0x8c, 0x38, 0x01}, + [FRONTIER_FACILITY_PYRAMID] = {0x15, 0x46, 0x23, 0x00}, +}; + +static const struct FrontierBrainMon sFrontierBrainsMons[][2][3] = +{ + [FRONTIER_FACILITY_TOWER] = + { + // Silver Symbol. + { + { + .species = SPECIES_ALAKAZAM, + .heldItem = ITEM_BRIGHT_POWDER, + .fixedIV = 24, + .nature = 15, + .evs = {106, 0, 152, 152, 100, 0}, + .moves = {MOVE_THUNDER_PUNCH, MOVE_FIRE_PUNCH, MOVE_ICE_PUNCH, MOVE_DISABLE}, + }, + { + .species = SPECIES_ENTEI, + .heldItem = ITEM_LUM_BERRY, + .fixedIV = 24, + .nature = 1, + .evs = {100, 152, 152, 0, 100, 6}, + .moves = {MOVE_FIRE_BLAST, MOVE_CALM_MIND, MOVE_RETURN, MOVE_ROAR}, + }, + { + .species = SPECIES_SNORLAX, + .heldItem = ITEM_QUICK_CLAW, + .fixedIV = 24, + .nature = 3, + .evs = {152, 152, 0, 0, 106, 100}, + .moves = {MOVE_BODY_SLAM, MOVE_BELLY_DRUM, MOVE_YAWN, MOVE_SHADOW_BALL}, + }, + }, + // Gold Symbol. + { + { + .species = SPECIES_RAIKOU, + .heldItem = ITEM_LUM_BERRY, + .fixedIV = 31, + .nature = 15, + .evs = {158, 0, 252, 100, 0, 0}, + .moves = {MOVE_THUNDERBOLT, MOVE_CALM_MIND, MOVE_REFLECT, MOVE_REST}, + }, + { + .species = SPECIES_LATIOS, + .heldItem = ITEM_BRIGHT_POWDER, + .fixedIV = 31, + .nature = 15, + .evs = {252, 0, 252, 6, 0, 0}, + .moves = {MOVE_PSYCHIC, MOVE_CALM_MIND, MOVE_RECOVER, MOVE_DRAGON_CLAW}, + }, + { + .species = SPECIES_SNORLAX, + .heldItem = ITEM_CHESTO_BERRY, + .fixedIV = 31, + .nature = 3, + .evs = {252, 252, 0, 0, 6, 0}, + .moves = {MOVE_CURSE, MOVE_RETURN, MOVE_REST, MOVE_SHADOW_BALL}, + }, + }, + }, + [FRONTIER_FACILITY_DOME] = + { + // Silver Symbol. + { + { + .species = SPECIES_SWAMPERT, + .heldItem = ITEM_FOCUS_BAND, + .fixedIV = 20, + .nature = 2, + .evs = {152, 152, 106, 0, 100, 0}, + .moves = {MOVE_SURF, MOVE_EARTHQUAKE, MOVE_ICE_BEAM, MOVE_COUNTER}, + }, + { + .species = SPECIES_SALAMENCE, + .heldItem = ITEM_LUM_BERRY, + .fixedIV = 20, + .nature = 3, + .evs = {152, 152, 106, 100, 0, 0}, + .moves = {MOVE_EARTHQUAKE, MOVE_BRICK_BREAK, MOVE_DRAGON_CLAW, MOVE_AERIAL_ACE}, + }, + { + .species = SPECIES_CHARIZARD, + .heldItem = ITEM_WHITE_HERB, + .fixedIV = 20, + .nature = 17, + .evs = {100, 152, 106, 152, 0, 0}, + .moves = {MOVE_OVERHEAT, MOVE_ROCK_SLIDE, MOVE_AERIAL_ACE, MOVE_EARTHQUAKE}, + }, + }, + // Gold Symbol. + { + { + .species = SPECIES_SWAMPERT, + .heldItem = ITEM_LEFTOVERS, + .fixedIV = 31, + .nature = 2, + .evs = {252, 252, 6, 0, 0, 0}, + .moves = {MOVE_SURF, MOVE_EARTHQUAKE, MOVE_ICE_BEAM, MOVE_MIRROR_COAT}, + }, + { + .species = SPECIES_METAGROSS, + .heldItem = ITEM_QUICK_CLAW, + .fixedIV = 31, + .nature = 2, + .evs = {252, 252, 6, 0, 0, 0}, + .moves = {MOVE_PSYCHIC, MOVE_METEOR_MASH, MOVE_EARTHQUAKE, MOVE_PROTECT}, + }, + { + .species = SPECIES_LATIAS, + .heldItem = ITEM_CHESTO_BERRY, + .fixedIV = 31, + .nature = 15, + .evs = {252, 0, 252, 6, 0, 0}, + .moves = {MOVE_THUNDERBOLT, MOVE_PSYCHIC, MOVE_CALM_MIND, MOVE_REST}, + }, + }, + }, + [FRONTIER_FACILITY_PALACE] = + { + // Silver Symbol. + { + { + .species = SPECIES_CROBAT, + .heldItem = ITEM_BRIGHT_POWDER, + .fixedIV = 16, + .nature = 3, + .evs = {152, 0, 0, 152, 100, 106}, + .moves = {MOVE_CONFUSE_RAY, MOVE_DOUBLE_TEAM, MOVE_TOXIC, MOVE_FLY}, + }, + { + .species = SPECIES_SLAKING, + .heldItem = ITEM_SCOPE_LENS, + .fixedIV = 16, + .nature = 0, + .evs = {152, 152, 0, 106, 100, 0}, + .moves = {MOVE_EARTHQUAKE, MOVE_SWAGGER, MOVE_SHADOW_BALL, MOVE_BRICK_BREAK}, + }, + { + .species = SPECIES_LAPRAS, + .heldItem = ITEM_QUICK_CLAW, + .fixedIV = 16, + .nature = 17, + .evs = {0, 0, 252, 0, 106, 152}, + .moves = {MOVE_ICE_BEAM, MOVE_HORN_DRILL, MOVE_CONFUSE_RAY, MOVE_PROTECT}, + }, + }, + // Gold Symbol. + { + { + .species = SPECIES_ARCANINE, + .heldItem = ITEM_WHITE_HERB, + .fixedIV = 31, + .nature = 11, + .evs = {6, 252, 252, 0, 0, 0}, + .moves = {MOVE_OVERHEAT, MOVE_EXTREME_SPEED, MOVE_ROAR, MOVE_PROTECT}, + }, + { + .species = SPECIES_SLAKING, + .heldItem = ITEM_SCOPE_LENS, + .fixedIV = 31, + .nature = 0, + .evs = {6, 252, 0, 252, 0, 0}, + .moves = {MOVE_HYPER_BEAM, MOVE_EARTHQUAKE, MOVE_SHADOW_BALL, MOVE_YAWN}, + }, + { + .species = SPECIES_SUICUNE, + .heldItem = ITEM_KINGS_ROCK, + .fixedIV = 31, + .nature = 11, + .evs = {252, 0, 252, 6, 0, 0}, + .moves = {MOVE_BLIZZARD, MOVE_SURF, MOVE_BITE, MOVE_CALM_MIND}, + }, + }, + }, + [FRONTIER_FACILITY_ARENA] = + { + // Silver Symbol. + { + { + .species = SPECIES_HERACROSS, + .heldItem = ITEM_SALAC_BERRY, + .fixedIV = 20, + .nature = 13, + .evs = {106, 152, 0, 152, 0, 100}, + .moves = {MOVE_MEGAHORN, MOVE_ROCK_TOMB, MOVE_ENDURE, MOVE_REVERSAL}, + }, + { + .species = SPECIES_UMBREON, + .heldItem = ITEM_LEFTOVERS, + .fixedIV = 20, + .nature = 20, + .evs = {152, 0, 100, 0, 152, 106}, + .moves = {MOVE_BODY_SLAM, MOVE_CONFUSE_RAY, MOVE_PSYCHIC, MOVE_FAINT_ATTACK}, + }, + { + .species = SPECIES_SHEDINJA, + .heldItem = ITEM_BRIGHT_POWDER, + .fixedIV = 20, + .nature = 3, + .evs = {0, 252, 6, 252, 0, 0}, + .moves = {MOVE_SHADOW_BALL, MOVE_RETURN, MOVE_CONFUSE_RAY, MOVE_AERIAL_ACE}, + }, + }, + // Gold Symbol. + { + { + .species = SPECIES_UMBREON, + .heldItem = ITEM_CHESTO_BERRY, + .fixedIV = 31, + .nature = 20, + .evs = {252, 0, 0, 0, 252, 6}, + .moves = {MOVE_DOUBLE_EDGE, MOVE_CONFUSE_RAY, MOVE_REST, MOVE_PSYCHIC}, + }, + { + .species = SPECIES_GENGAR, + .heldItem = ITEM_LEFTOVERS, + .fixedIV = 31, + .nature = 15, + .evs = {252, 0, 252, 0, 6, 0}, + .moves = {MOVE_PSYCHIC, MOVE_HYPNOSIS, MOVE_DREAM_EATER, MOVE_DESTINY_BOND}, + }, + { + .species = SPECIES_BRELOOM, + .heldItem = ITEM_LUM_BERRY, + .fixedIV = 31, + .nature = 13, + .evs = {6, 252, 0, 252, 0, 0}, + .moves = {MOVE_SPORE, MOVE_FOCUS_PUNCH, MOVE_GIGA_DRAIN, MOVE_HEADBUTT}, + }, + }, + }, + [FRONTIER_FACILITY_FACTORY] = + { + // Silver Symbol. + { + { + .species = SPECIES_METANG, + .heldItem = ITEM_SITRUS_BERRY, + .fixedIV = 31, + .nature = 2, + .evs = {0, 252, 252, 0, 6, 0}, + .moves = {MOVE_LIGHT_SCREEN, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_METAL_CLAW}, + }, + { + .species = SPECIES_SKARMORY, + .heldItem = ITEM_SITRUS_BERRY, + .fixedIV = 31, + .nature = 8, + .evs = {252, 0, 0, 0, 6, 252}, + .moves = {MOVE_TOXIC, MOVE_AERIAL_ACE, MOVE_PROTECT, MOVE_STEEL_WING}, + }, + { + .species = SPECIES_AGGRON, + .heldItem = ITEM_SITRUS_BERRY, + .fixedIV = 31, + .nature = 3, + .evs = {0, 252, 0, 0, 252, 6}, + .moves = {MOVE_THUNDERBOLT, MOVE_PROTECT, MOVE_SOLAR_BEAM, MOVE_DRAGON_CLAW}, + }, + }, + // Gold Symbol. + { + { + .species = SPECIES_METANG, + .heldItem = ITEM_SITRUS_BERRY, + .fixedIV = 31, + .nature = 2, + .evs = {0, 252, 252, 0, 6, 0}, + .moves = {MOVE_LIGHT_SCREEN, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_METAL_CLAW}, + }, + { + .species = SPECIES_SKARMORY, + .heldItem = ITEM_SITRUS_BERRY, + .fixedIV = 31, + .nature = 8, + .evs = {252, 0, 0, 0, 6, 252}, + .moves = {MOVE_TOXIC, MOVE_AERIAL_ACE, MOVE_PROTECT, MOVE_STEEL_WING}, + }, + { + .species = SPECIES_AGGRON, + .heldItem = ITEM_SITRUS_BERRY, + .fixedIV = 31, + .nature = 3, + .evs = {0, 252, 0, 0, 252, 6}, + .moves = {MOVE_THUNDERBOLT, MOVE_PROTECT, MOVE_SOLAR_BEAM, MOVE_DRAGON_CLAW}, + }, + }, + }, + [FRONTIER_FACILITY_PIKE] = + { + // Silver Symbol. + { + { + .species = SPECIES_SEVIPER, + .heldItem = ITEM_QUICK_CLAW, + .fixedIV = 16, + .nature = 2, + .evs = {252, 0, 252, 0, 6, 0}, + .moves = {MOVE_SWAGGER, MOVE_CRUNCH, MOVE_POISON_FANG, MOVE_GIGA_DRAIN}, + }, + { + .species = SPECIES_SHUCKLE, + .heldItem = ITEM_CHESTO_BERRY, + .fixedIV = 16, + .nature = 5, + .evs = {252, 0, 0, 0, 106, 252}, + .moves = {MOVE_TOXIC, MOVE_SANDSTORM, MOVE_PROTECT, MOVE_REST}, + }, + { + .species = SPECIES_MILOTIC, + .heldItem = ITEM_LEFTOVERS, + .fixedIV = 16, + .nature = 15, + .evs = {152, 0, 100, 0, 152, 106}, + .moves = {MOVE_ICE_BEAM, MOVE_MIRROR_COAT, MOVE_SURF, MOVE_RECOVER}, + }, + }, + // Gold Symbol. + { + { + .species = SPECIES_SEVIPER, + .heldItem = ITEM_FOCUS_BAND, + .fixedIV = 31, + .nature = 5, + .evs = {252, 0, 0, 0, 252, 6}, + .moves = {MOVE_SWAGGER, MOVE_CRUNCH, MOVE_SLUDGE_BOMB, MOVE_GIGA_DRAIN}, + }, + { + .species = SPECIES_STEELIX, + .heldItem = ITEM_BRIGHT_POWDER, + .fixedIV = 31, + .nature = 2, + .evs = {252, 0, 0, 0, 6, 252}, + .moves = {MOVE_EARTHQUAKE, MOVE_ROCK_SLIDE, MOVE_EXPLOSION, MOVE_SCREECH}, + }, + { + .species = SPECIES_GYARADOS, + .heldItem = ITEM_CHESTO_BERRY, + .fixedIV = 31, + .nature = 3, + .evs = {252, 6, 0, 0, 0, 252}, + .moves = {MOVE_DRAGON_DANCE, MOVE_RETURN, MOVE_ROAR, MOVE_REST}, + }, + }, + }, + [FRONTIER_FACILITY_PYRAMID] = + { + // Silver Symbol. + { + { + .species = SPECIES_REGIROCK, + .heldItem = ITEM_QUICK_CLAW, + .fixedIV = 16, + .nature = 3, + .evs = {152, 152, 0, 0, 106, 100}, + .moves = {MOVE_EXPLOSION, MOVE_SUPERPOWER, MOVE_EARTHQUAKE, MOVE_ANCIENT_POWER}, + }, + { + .species = SPECIES_REGISTEEL, + .heldItem = ITEM_LEFTOVERS, + .fixedIV = 16, + .nature = 3, + .evs = {152, 152, 0, 0, 6, 200}, + .moves = {MOVE_EARTHQUAKE, MOVE_METAL_CLAW, MOVE_TOXIC, MOVE_IRON_DEFENSE}, + }, + { + .species = SPECIES_REGICE, + .heldItem = ITEM_CHESTO_BERRY, + .fixedIV = 16, + .nature = 15, + .evs = {106, 0, 152, 0, 100, 152}, + .moves = {MOVE_ICE_BEAM, MOVE_AMNESIA, MOVE_THUNDER, MOVE_REST}, + }, + }, + // Gold Symbol. + { + { + .species = SPECIES_ARTICUNO, + .heldItem = ITEM_SCOPE_LENS, + .fixedIV = 31, + .nature = 16, + .evs = {6, 0, 252, 252, 0, 0}, + .moves = {MOVE_BLIZZARD, MOVE_WATER_PULSE, MOVE_AERIAL_ACE, MOVE_REFLECT}, + }, + { + .species = SPECIES_ZAPDOS, + .heldItem = ITEM_LUM_BERRY, + .fixedIV = 31, + .nature = 16, + .evs = {6, 0, 252, 252, 0, 0}, + .moves = {MOVE_THUNDER, MOVE_DETECT, MOVE_DRILL_PECK, MOVE_LIGHT_SCREEN}, + }, + { + .species = SPECIES_MOLTRES, + .heldItem = ITEM_BRIGHT_POWDER, + .fixedIV = 31, + .nature = 16, + .evs = {6, 0, 252, 252, 0, 0}, + .moves = {MOVE_FIRE_BLAST, MOVE_HYPER_BEAM, MOVE_AERIAL_ACE, MOVE_SAFEGUARD}, + }, + }, + }, +}; + +static const u8 gUnknown_086118B4[][7][4] = +{ + { + {1, 2, 3, 3}, {1, 1, 0, 0}, {4, 5, 0, 0}, {1, 0, 0, 0}, {3, 4, 0, 0}, {1, 0, 0, 0}, {5, 0, 0, 0} + }, + { + {2, 3, 4, 4}, {1, 1, 0, 0}, {4, 5, 0, 0}, {1, 0, 0, 0}, {3, 4, 0, 0}, {1, 0, 0, 0}, {5, 0, 0, 0} + }, + { + {3, 4, 5, 5}, {2, 2, 0, 0}, {5, 6, 0, 0}, {1, 0, 0, 0}, {4, 5, 0, 0}, {2, 0, 0, 0}, {6, 0, 0, 0} + }, + { + {4, 5, 6, 6}, {2, 2, 0, 0}, {5, 6, 0, 0}, {2, 0, 0, 0}, {4, 5, 0, 0}, {2, 0, 0, 0}, {6, 0, 0, 0} + }, + { + {5, 6, 7, 7}, {3, 3, 0, 0}, {6, 7, 0, 0}, {2, 0, 0, 0}, {5, 6, 0, 0}, {2, 0, 0, 0}, {7, 0, 0, 0} + }, + { + {6, 7, 8, 8}, {3, 3, 0, 0}, {6, 7, 0, 0}, {2, 0, 0, 0}, {5, 6, 0, 0}, {4, 0, 0, 0}, {7, 0, 0, 0} + }, + { + {7, 8, 9, 9}, {4, 4, 0, 0}, {7, 8, 0, 0}, {3, 0, 0, 0}, {6, 7, 0, 0}, {4, 0, 0, 0}, {8, 0, 0, 0} + }, + { + {8, 9, 10, 10}, {4, 4, 0, 0}, {7, 8, 0, 0}, {3, 0, 0, 0},{6, 7, 0, 0}, {4, 0, 0, 0}, {8, 0, 0, 0} + }, + { + {9, 10, 11, 11}, {5, 5, 0, 0}, {8, 9, 0, 0}, {4, 0, 0, 0}, {7, 8, 0, 0}, {8, 0, 0, 0}, {9, 0, 0, 0} + }, + { + {10, 11, 12, 12}, {5, 5, 0, 0}, {8, 9, 0, 0}, {4, 0, 0, 0}, {7, 8, 0, 0}, {8, 0, 0, 0}, {9, 0, 0, 0} + }, + { + {11, 12, 13, 13}, {6, 6, 0, 0}, {9, 10, 0, 0}, {5, 0, 0,0}, {8, 9, 0, 0}, {8, 0, 0, 0}, {10, 0, 0, 0} + }, + { + {12, 13, 14, 14}, {6, 6, 0, 0}, {9, 10, 0, 0}, {6, 0, 0,0}, {8, 9, 0, 0}, {8, 0, 0, 0}, {10, 0, 0, 0} + }, + { + {13, 14, 15, 15}, {7, 7, 0, 0}, {10, 11, 0, 0}, {7, 0, 0, 0}, {9, 10, 0, 0}, {10, 0, 0, 0}, {11, 0, 0, 0} + }, + { + {14, 15, 15, 15}, {7, 7, 0, 0}, {10, 11, 0, 0}, {8, 0, 0, 0}, {9, 10, 0, 0}, {10, 0, 0, 0}, {11, 0, 0, 0} + }, + { + {15, 15, 15, 15}, {8, 8, 0, 0}, {11, 12, 0, 0}, {9, 0, 0, 0}, {10, 11, 0, 0}, {10, 0, 0, 0}, {12, 0, 0, 0} + }, + { + {15, 15, 15, 15}, {8, 8, 0, 0}, {11, 12, 0, 0}, {10, 0, 0, 0}, {10, 11, 0, 0}, {10, 0, 0, 0}, {12, 0, 0, 0} + }, + { + {15, 15, 15, 15}, {9, 9, 0, 0}, {12, 13, 0, 0}, {11, 0, 0, 0}, {11, 12, 0, 0}, {12, 0, 0, 0}, {13, 0, 0, 0} + }, + { + {15, 15, 15, 15}, {9, 9, 0, 0}, {12, 13, 0, 0}, {12, 0, 0, 0}, {11, 12, 0, 0}, {12, 0, 0, 0}, {13, 0, 0, 0} + }, + { + {15, 15, 15, 15}, {10, 10, 0, 0}, {13, 14, 0, 0}, {13, 0, 0, 0}, {12, 13, 0, 0}, {12, 0, 0, 0}, {14, 0, 0, 0} + }, + { + {15, 15, 15, 15}, {10, 10, 0, 0}, {13, 14, 0, 0}, {14, 0, 0, 0}, {12, 13, 0, 0}, {12, 0, 0, 0}, {14, 0, 0, 0} + }, + { + {15, 15, 15, 15}, {11, 11, 0, 0}, {14, 15, 0, 0}, {15, 0, 0, 0}, {13, 14, 0, 0}, {12, 0, 0, 0}, {15, 0, 0, 0} + }, + { + {15, 15, 15, 15}, {11, 11, 0, 0}, {14, 15, 0, 0}, {15, 0, 0, 0}, {13, 14, 0, 0}, {14, 0, 0, 0}, {15, 0, 0, 0} + }, + { + {15, 15, 15, 15}, {12, 12, 0, 0}, {15, 15, 0, 0}, {15, 0, 0, 0}, {14, 15, 0, 0}, {14, 0, 0, 0}, {15, 0, 0, 0} + }, + { + {15, 15, 15, 15}, {12, 12, 0, 0}, {15, 15, 0, 0}, {15, 0, 0, 0}, {14, 15, 0, 0}, {14, 0, 0, 0}, {15, 0, 0, 0} + }, + { + {15, 15, 15, 15}, {13, 13, 0, 0}, {15, 15, 0, 0}, {15, 0, 0, 0}, {15, 15, 0, 0}, {14, 0, 0, 0}, {15, 0, 0, 0} + }, + { + {15, 15, 15, 15}, {13, 13, 0, 0}, {15, 15, 0, 0}, {15, 0, 0, 0}, {15, 15, 0, 0}, {15, 0, 0, 0}, {15, 0, 0, 0} + }, + { + {15, 15, 15, 15}, {14, 14, 0, 0}, {15, 15, 0, 0}, {15, 0, 0, 0}, {15, 15, 0, 0}, {15, 0, 0, 0}, {15, 0, 0, 0} + }, + { + {15, 15, 15, 15}, {14, 14, 0, 0}, {15, 15, 0, 0}, {15, 0, 0, 0}, {15, 15, 0, 0}, {15, 0, 0, 0}, {15, 0, 0, 0} + }, + { + {15, 15, 15, 15}, {15, 15, 0, 0}, {15, 15, 0, 0}, {15, 0, 0, 0}, {15, 15, 0, 0}, {15, 0, 0, 0}, {15, 0, 0, 0} + }, + { + {15, 15, 15, 15}, {15, 15, 0, 0}, {15, 15, 0, 0}, {15, 0, 0, 0}, {15, 15, 0, 0}, {15, 0, 0, 0}, {15, 0, 0, 0} + }, +}; + +static const u16 gUnknown_08611BFC[][2] = +{ + [FRONTIER_FACILITY_TOWER] = {0x0001, 0x0002}, + [FRONTIER_FACILITY_DOME] = {0x0004, 0x0008}, + [FRONTIER_FACILITY_PALACE] = {0x0010, 0x0020}, + [FRONTIER_FACILITY_ARENA] = {0x0040, 0x0080}, + [FRONTIER_FACILITY_FACTORY] = {0x0100, 0x0200}, + [FRONTIER_FACILITY_PIKE] = {0x0400, 0x0800}, + [FRONTIER_FACILITY_PYRAMID] = {0x1000, 0x2000}, +}; + +static void (* const sFrontierUtilFuncs[])(void) = +{ + sub_81A17A0, + sub_81A1830, + sub_81A1968, + sub_81A1AD4, + DoSoftReset_, + sub_81A1B28, + sub_81A1B38, + ShowFacilityResultsWindow, + sub_81A31FC, + sub_81A35EC, + sub_81A3B00, + sub_81A3B64, + sub_81A3D30, + sub_81A3D58, + sub_81A3DA0, + sub_81A3FD4, + sub_81A4224, + sub_81A4230, + sub_81A43A8, + sub_81A4410, + sub_81A443C, + sub_81A447C, + sub_81A457C, +}; + +static const struct WindowTemplate gUnknown_08611C74 = +{ + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 1, + .width = 0x1c, + .height = 0x12, + .paletteNum = 15, + .baseBlock = 1 +}; + +static const struct WindowTemplate gUnknown_08611C7C = +{ + .bg = 0, + .tilemapLeft = 2, + .tilemapTop = 2, + .width = 0x1a, + .height = 15, + .paletteNum = 15, + .baseBlock = 1 +}; + +static const struct WindowTemplate gUnknown_08611C84 = +{ + .bg = 0, + .tilemapLeft = 2, + .tilemapTop = 1, + .width = 0x1a, + .height = 17, + .paletteNum = 15, + .baseBlock = 1 +}; + +// Second field - whether the character is female. +static const u8 sFacilityToBrainEventObjGfx[][2] = +{ + [FRONTIER_FACILITY_TOWER] = {EVENT_OBJ_GFX_ANABEL, TRUE}, + [FRONTIER_FACILITY_DOME] = {EVENT_OBJ_GFX_TUCKER, FALSE}, + [FRONTIER_FACILITY_PALACE] = {EVENT_OBJ_GFX_SPENSER, FALSE}, + [FRONTIER_FACILITY_ARENA] = {EVENT_OBJ_GFX_GRETA, TRUE}, + [FRONTIER_FACILITY_FACTORY] = {EVENT_OBJ_GFX_NOLAND, FALSE}, + [FRONTIER_FACILITY_PIKE] = {EVENT_OBJ_GFX_LUCY, TRUE}, + [FRONTIER_FACILITY_PYRAMID] = {EVENT_OBJ_GFX_BRANDON, FALSE}, +}; + +const u16 gFrontierBannedSpecies[] = +{ + SPECIES_MEW, SPECIES_MEWTWO, SPECIES_HO_OH, SPECIES_LUGIA, SPECIES_CELEBI, + SPECIES_KYOGRE, SPECIES_GROUDON, SPECIES_RAYQUAZA, SPECIES_JIRACHI, SPECIES_DEOXYS, 0xFFFF +}; + +// code +void CallFrontierUtilFunc(void) +{ + sFrontierUtilFuncs[gSpecialVar_0x8004](); +} + +static void sub_81A17A0(void) +{ + VarSet(VAR_TEMP_0, 0xFF); + switch (gSaveBlock2Ptr->frontier.field_CA8) + { + case 0: + break; + case 1: + sub_813A878(0); + VarSet(VAR_TEMP_0, gSaveBlock2Ptr->frontier.field_CA8); + break; + case 4: + sub_813A878(0); + VarSet(VAR_TEMP_0, gSaveBlock2Ptr->frontier.field_CA8); + break; + case 3: + sub_813A878(1); + VarSet(VAR_TEMP_0, gSaveBlock2Ptr->frontier.field_CA8); + break; + case 2: + VarSet(VAR_TEMP_0, gSaveBlock2Ptr->frontier.field_CA8); + break; + } +} + +static void sub_81A1830(void) +{ + u8 facility = VarGet(VAR_FRONTIER_FACILITY); + u8 currSymbol = GetPlayerSymbolCountForFacility(facility); + if (currSymbol == 2) + currSymbol = 1; + + switch (gSpecialVar_0x8005) + { + case 0: + gSpecialVar_Result = gSaveBlock2Ptr->frontier.field_CA8; + break; + case 1: + gSpecialVar_Result = gSaveBlock2Ptr->frontier.lvlMode; + break; + case 2: + gSpecialVar_Result = gSaveBlock2Ptr->frontier.curChallengeBattleNum; + break; + case 3: + gSpecialVar_Result = gSaveBlock2Ptr->frontier.field_CA9_a; + break; + case 5: + gSpecialVar_Result = gBattleOutcome; + gBattleOutcome = 0; + break; + case 6: + gSpecialVar_Result = gSaveBlock2Ptr->frontier.field_CA9_b; + break; + case 7: + gSpecialVar_Result = gSaveBlock2Ptr->frontier.field_D00 & gUnknown_08611BFC[facility][currSymbol]; + break; + } +} + +static void sub_81A1968(void) +{ + s32 i; + u8 facility = VarGet(VAR_FRONTIER_FACILITY); + u8 currSymbol = GetPlayerSymbolCountForFacility(facility); + if (currSymbol == 2) + currSymbol = 1; + + switch (gSpecialVar_0x8005) + { + case 0: + gSaveBlock2Ptr->frontier.field_CA8 = gSpecialVar_0x8006; + break; + case 1: + gSaveBlock2Ptr->frontier.lvlMode = gSpecialVar_0x8006; + break; + case 2: + gSaveBlock2Ptr->frontier.curChallengeBattleNum = gSpecialVar_0x8006; + break; + case 3: + gSaveBlock2Ptr->frontier.field_CA9_a = gSpecialVar_0x8006; + break; + case 4: + for (i = 0; i < 4; i++) + gSaveBlock2Ptr->frontier.selectedPartyMons[i] = gUnknown_0203CEF8[i]; + break; + case 6: + gSaveBlock2Ptr->frontier.field_CA9_b = gSpecialVar_0x8006; + break; + case 7: + gSaveBlock2Ptr->frontier.field_D00 |= gUnknown_08611BFC[facility][currSymbol]; + break; + } +} + +static void sub_81A1AD4(void) +{ + s32 i; + + sub_81B8558(); + for (i = 0; i < gSpecialVar_0x8005; i++) + gUnknown_0203CEF8[i] = gSaveBlock2Ptr->frontier.selectedPartyMons[i]; + ReducePlayerPartyToThree(); +} + +static void DoSoftReset_(void) +{ + DoSoftReset(); +} + +static void sub_81A1B28(void) +{ + gFacilityTrainers = gBattleFrontierTrainers; +} + +static void sub_81A1B38(void) +{ + u8 i; + + for (i = 0; i < 4; i++) + { + u16 monId = gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1; + if (monId < PARTY_SIZE) + gSaveBlock1Ptr->playerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1] = gPlayerParty[i]; + } +} + +static void ShowFacilityResultsWindow(void) +{ + if (gSpecialVar_0x8006 > 3) + gSpecialVar_0x8006 = 0; + switch (gSpecialVar_0x8005) + { + case FRONTIER_FACILITY_TOWER: + ShowTowerResultsWindow(gSpecialVar_0x8006); + break; + case FRONTIER_FACILITY_DOME: + ShowDomeResultsWindow(gSpecialVar_0x8006); + break; + case FRONTIER_FACILITY_PALACE: + ShowPalaceResultsWindow(gSpecialVar_0x8006); + break; + case FRONTIER_FACILITY_PIKE: + ShowPikeResultsWindow(); + break; + case FRONTIER_FACILITY_FACTORY: + ShowFactoryResultsWindow(gSpecialVar_0x8006); + break; + case FRONTIER_FACILITY_ARENA: + ShowArenaResultsWindow(); + break; + case FRONTIER_FACILITY_PYRAMID: + ShowPyramidResultsWindow(); + break; + case RESULTS_LINK_CONTEST: + ShowLinkContestResultsWindow(); + break; + } +} + +static bool8 sub_81A1C24(u32 flags) +{ + if (gSaveBlock2Ptr->frontier.field_CDC & flags) + return TRUE; + else + return FALSE; +} + +static void PrintAligned(const u8 *str, s32 y) +{ + s32 x = GetStringCenterAlignXOffset(1, str, 224); + y = (y * 8) + 1; + AddTextPrinterParameterized(gRecordsWindowId, 1, str, x, y, TEXT_SPEED_FF, NULL); +} + +static void PrintHyphens(s32 y) +{ + s32 i; + u8 text[37]; + + for (i = 0; i < 36; i++) + text[i] = CHAR_HYPHEN; + text[i] = EOS; + + y = (y * 8) + 1; + AddTextPrinterParameterized(gRecordsWindowId, 1, text, 4, y, TEXT_SPEED_FF, NULL); +} + +// Battle Tower records. +static void TowerPrintStreak(const u8 *str, u16 num, u8 x1, u8 x2, u8 y) +{ + AddTextPrinterParameterized(gRecordsWindowId, 1, str, x1, y, TEXT_SPEED_FF, NULL); + if (num > 9999) + num = 9999; + ConvertIntToDecimalStringN(gStringVar1, num, STR_CONV_MODE_RIGHT_ALIGN, 4); + StringExpandPlaceholders(gStringVar4, gText_WinStreak); + AddTextPrinterParameterized(gRecordsWindowId, 1, gStringVar4, x2, y, TEXT_SPEED_FF, NULL); +} + +static void TowerPrintRecordStreak(u8 battleMode, u8 lvlMode, u8 x1, u8 x2, u8 y) +{ + u16 num = gSaveBlock2Ptr->frontier.towerRecordWinStreaks[battleMode][lvlMode]; + TowerPrintStreak(gText_Record, num, x1, x2, y); +} + +static u16 TowerGetWinStreak(u8 battleMode, u8 lvlMode) +{ + u16 winStreak = gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode]; + if (winStreak > 9999) + return 9999; + else + return winStreak; +} + +static void TowerPrintPrevOrCurrentStreak(u8 battleMode, u8 lvlMode, u8 x1, u8 x2, u8 y) +{ + bool8 isCurrent; + u16 winStreak = TowerGetWinStreak(battleMode, lvlMode); + switch (battleMode) + { + default: + case FRONTIER_MODE_SINGLES: + if (lvlMode != FRONTIER_LVL_50) + isCurrent = sub_81A1C24(2); + else + isCurrent = sub_81A1C24(1); + break; + case FRONTIER_MODE_DOUBLES: + if (lvlMode != FRONTIER_LVL_50) + isCurrent = sub_81A1C24(0x8000); + else + isCurrent = sub_81A1C24(0x4000); + break; + case FRONTIER_MODE_MULTIS: + if (lvlMode != FRONTIER_LVL_50) + isCurrent = sub_81A1C24(0x20000); + else + isCurrent = sub_81A1C24(0x10000); + break; + case FRONTIER_MODE_LINK_MULTIS: + if (lvlMode != FRONTIER_LVL_50) + isCurrent = sub_81A1C24(0x80000); + else + isCurrent = sub_81A1C24(0x40000); + break; + } + + if (isCurrent == TRUE) + TowerPrintStreak(gText_Current, winStreak, x1, x2, y); + else + TowerPrintStreak(gText_Prev, winStreak, x1, x2, y); +} + +static void ShowTowerResultsWindow(u8 battleMode) +{ + gRecordsWindowId = AddWindow(&gUnknown_08611C74); + NewMenuHelpers_DrawStdWindowFrame(gRecordsWindowId, FALSE); + FillWindowPixelBuffer(gRecordsWindowId, 0x11); + if (battleMode == FRONTIER_MODE_SINGLES) + StringExpandPlaceholders(gStringVar4, gText_SingleBattleRoomResults); + else if (battleMode == FRONTIER_MODE_DOUBLES) + StringExpandPlaceholders(gStringVar4, gText_DoubleBattleRoomResults); + else if (battleMode == FRONTIER_MODE_MULTIS) + StringExpandPlaceholders(gStringVar4, gText_MultiBattleRoomResults); + else + StringExpandPlaceholders(gStringVar4, gText_LinkMultiBattleRoomResults); + + PrintAligned(gStringVar4, 2); + AddTextPrinterParameterized(gRecordsWindowId, 1, gText_Lv502, 16, 49, TEXT_SPEED_FF, NULL); + AddTextPrinterParameterized(gRecordsWindowId, 1, gText_OpenLv, 16, 97, TEXT_SPEED_FF, NULL); + PrintHyphens(10); + TowerPrintPrevOrCurrentStreak(battleMode, FRONTIER_LVL_50, 72, 132, 49); + TowerPrintRecordStreak(battleMode, FRONTIER_LVL_50, 72, 132, 65); + TowerPrintPrevOrCurrentStreak(battleMode, FRONTIER_LVL_OPEN, 72, 132, 97); + TowerPrintRecordStreak(battleMode, FRONTIER_LVL_OPEN, 72, 132, 113); + PutWindowTilemap(gRecordsWindowId); + CopyWindowToVram(gRecordsWindowId, 3); +} + +// Battle Dome records. +static u16 DomeGetWinStreak(u8 battleMode, u8 lvlMode) +{ + u16 winStreak = gSaveBlock2Ptr->frontier.domeWinStreaks[battleMode][lvlMode]; + if (winStreak > 9999) + return 9999; + else + return winStreak; +} + +static void PrintTwoStrings(const u8 *str1, const u8 *str2, u16 num, u8 x1, u8 x2, u8 y) +{ + AddTextPrinterParameterized(gRecordsWindowId, 1, str1, x1, y, TEXT_SPEED_FF, NULL); + ConvertIntToDecimalStringN(gStringVar1, num, STR_CONV_MODE_RIGHT_ALIGN, 4); + StringExpandPlaceholders(gStringVar4, str2); + AddTextPrinterParameterized(gRecordsWindowId, 1, gStringVar4, x2, y, TEXT_SPEED_FF, NULL); +} + +static void DomePrintPrevOrCurrentStreak(u8 battleMode, u8 lvlMode, u8 x1, u8 x2, u8 y) +{ + bool8 isCurrent; + u16 winStreak = DomeGetWinStreak(battleMode, lvlMode); + switch (battleMode) + { + default: + case FRONTIER_MODE_SINGLES: + if (lvlMode != FRONTIER_LVL_50) + isCurrent = sub_81A1C24(8); + else + isCurrent = sub_81A1C24(4); + break; + case FRONTIER_MODE_DOUBLES: + if (lvlMode != FRONTIER_LVL_50) + isCurrent = sub_81A1C24(0x200000); + else + isCurrent = sub_81A1C24(0x100000); + break; + } + + if (isCurrent == TRUE) + PrintTwoStrings(gText_Current, gText_ClearStreak, winStreak, x1, x2, y); + else + PrintTwoStrings(gText_Prev, gText_ClearStreak, winStreak, x1, x2, y); +} + +static void ShowDomeResultsWindow(u8 battleMode) +{ + gRecordsWindowId = AddWindow(&gUnknown_08611C74); + NewMenuHelpers_DrawStdWindowFrame(gRecordsWindowId, FALSE); + FillWindowPixelBuffer(gRecordsWindowId, 0x11); + if (battleMode == FRONTIER_MODE_SINGLES) + StringExpandPlaceholders(gStringVar4, gText_SingleBattleTourneyResults); + else + StringExpandPlaceholders(gStringVar4, gText_DoubleBattleTourneyResults); + + PrintAligned(gStringVar4, 0); + AddTextPrinterParameterized(gRecordsWindowId, 1, gText_Lv502, 8, 33, TEXT_SPEED_FF, NULL); + AddTextPrinterParameterized(gRecordsWindowId, 1, gText_OpenLv, 8, 97, TEXT_SPEED_FF, NULL); + PrintHyphens(10); + DomePrintPrevOrCurrentStreak(battleMode, FRONTIER_LVL_50, 64, 121, 33); + PrintTwoStrings(gText_Record, gText_ClearStreak, gSaveBlock2Ptr->frontier.domeRecordWinStreaks[battleMode][FRONTIER_LVL_50], 64, 121, 49); + PrintTwoStrings(gText_Total, gText_Championships, gSaveBlock2Ptr->frontier.domeTotalChampionships[battleMode][FRONTIER_LVL_50], 64, 112, 65); + DomePrintPrevOrCurrentStreak(battleMode, FRONTIER_LVL_OPEN, 64, 121, 97); + PrintTwoStrings(gText_Record, gText_ClearStreak, gSaveBlock2Ptr->frontier.domeRecordWinStreaks[battleMode][FRONTIER_LVL_OPEN], 64, 121, 113); + PrintTwoStrings(gText_Total, gText_Championships, gSaveBlock2Ptr->frontier.domeTotalChampionships[battleMode][FRONTIER_LVL_OPEN], 64, 112, 129); + PutWindowTilemap(gRecordsWindowId); + CopyWindowToVram(gRecordsWindowId, 3); +} + +// Battle Palace records. +static void PalacePrintStreak(const u8 *str, u16 num, u8 x1, u8 x2, u8 y) +{ + AddTextPrinterParameterized(gRecordsWindowId, 1, str, x1, y, TEXT_SPEED_FF, NULL); + if (num > 9999) + num = 9999; + ConvertIntToDecimalStringN(gStringVar1, num, STR_CONV_MODE_RIGHT_ALIGN, 4); + StringExpandPlaceholders(gStringVar4, gText_WinStreak); + AddTextPrinterParameterized(gRecordsWindowId, 1, gStringVar4, x2, y, TEXT_SPEED_FF, NULL); +} + +static void PalacePrintRecordStreak(u8 battleMode, u8 lvlMode, u8 x1, u8 x2, u8 y) +{ + u16 num = gSaveBlock2Ptr->frontier.palaceRecordWinStreaks[battleMode][lvlMode]; + PalacePrintStreak(gText_Record, num, x1, x2, y); +} + +static u16 PalaceGetWinStreak(u8 battleMode, u8 lvlMode) +{ + u16 winStreak = gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode]; + if (winStreak > 9999) + return 9999; + else + return winStreak; +} + +static void PalacePrintPrevOrCurrentStreak(u8 battleMode, u8 lvlMode, u8 x1, u8 x2, u8 y) +{ + bool8 isCurrent; + u16 winStreak = PalaceGetWinStreak(battleMode, lvlMode); + switch (battleMode) + { + default: + case FRONTIER_MODE_SINGLES: + if (lvlMode != FRONTIER_LVL_50) + isCurrent = sub_81A1C24(0x20); + else + isCurrent = sub_81A1C24(0x10); + break; + case FRONTIER_MODE_DOUBLES: + if (lvlMode != FRONTIER_LVL_50) + isCurrent = sub_81A1C24(0x800000); + else + isCurrent = sub_81A1C24(0x400000); + } + + if (isCurrent == TRUE) + PalacePrintStreak(gText_Current, winStreak, x1, x2, y); + else + PalacePrintStreak(gText_Prev, winStreak, x1, x2, y); +} + +static void ShowPalaceResultsWindow(u8 battleMode) +{ + gRecordsWindowId = AddWindow(&gUnknown_08611C74); + NewMenuHelpers_DrawStdWindowFrame(gRecordsWindowId, FALSE); + FillWindowPixelBuffer(gRecordsWindowId, 0x11); + if (battleMode == FRONTIER_MODE_SINGLES) + StringExpandPlaceholders(gStringVar4, gText_SingleBattleHallResults); + else + StringExpandPlaceholders(gStringVar4, gText_DoubleBattleHallResults); + + PrintAligned(gStringVar4, 2); + AddTextPrinterParameterized(gRecordsWindowId, 1, gText_Lv502, 16, 49, TEXT_SPEED_FF, NULL); + AddTextPrinterParameterized(gRecordsWindowId, 1, gText_OpenLv, 16, 97, TEXT_SPEED_FF, NULL); + PrintHyphens(10); + PalacePrintPrevOrCurrentStreak(battleMode, FRONTIER_LVL_50, 72, 131, 49); + PalacePrintRecordStreak(battleMode, FRONTIER_LVL_50, 72, 131, 65); + PalacePrintPrevOrCurrentStreak(battleMode, FRONTIER_LVL_OPEN, 72, 131, 97); + PalacePrintRecordStreak(battleMode, FRONTIER_LVL_OPEN, 72, 131, 113); + PutWindowTilemap(gRecordsWindowId); + CopyWindowToVram(gRecordsWindowId, 3); +} + +// Battle Pike records. +static u16 PikeGetWinStreak(u8 lvlMode) +{ + u16 winStreak = gSaveBlock2Ptr->frontier.pikeWinStreaks[lvlMode]; + if (winStreak > 9999) + return 9999; + else + return winStreak; +} + +static void PikePrintCleared(const u8 *str1, const u8 *str2, u16 num, u8 x1, u8 x2, u8 y) +{ + AddTextPrinterParameterized(gRecordsWindowId, 1, str1, x1, y, TEXT_SPEED_FF, NULL); + ConvertIntToDecimalStringN(gStringVar1, num, STR_CONV_MODE_RIGHT_ALIGN, 4); + StringExpandPlaceholders(gStringVar4, str2); + AddTextPrinterParameterized(gRecordsWindowId, 1, gStringVar4, x2, y, TEXT_SPEED_FF, NULL); +} + +static void PikePrintPrevOrCurrentStreak(u8 lvlMode, u8 x1, u8 x2, u8 y) +{ + bool8 isCurrent; + u16 winStreak = PikeGetWinStreak(lvlMode); + + if (lvlMode != FRONTIER_LVL_50) + isCurrent = sub_81A1C24(0x800); + else + isCurrent = sub_81A1C24(0x400); + + if (isCurrent == TRUE) + PrintTwoStrings(gText_Current, gText_RoomsCleared, winStreak, x1, x2, y); + else + PrintTwoStrings(gText_Prev, gText_RoomsCleared, winStreak, x1, x2, y); +} + +static void ShowPikeResultsWindow(void) +{ + gRecordsWindowId = AddWindow(&gUnknown_08611C74); + NewMenuHelpers_DrawStdWindowFrame(gRecordsWindowId, FALSE); + FillWindowPixelBuffer(gRecordsWindowId, 0x11); + StringExpandPlaceholders(gStringVar4, gText_BattleChoiceResults); + PrintAligned(gStringVar4, 0); + AddTextPrinterParameterized(gRecordsWindowId, 1, gText_Lv502, 8, 33, TEXT_SPEED_FF, NULL); + AddTextPrinterParameterized(gRecordsWindowId, 1, gText_OpenLv, 8, 97, TEXT_SPEED_FF, NULL); + PrintHyphens(10); + PikePrintPrevOrCurrentStreak(FRONTIER_LVL_50, 64, 114, 33); + PikePrintCleared(gText_Record, gText_RoomsCleared, gSaveBlock2Ptr->frontier.pikeRecordStreaks[FRONTIER_LVL_50], 64, 114, 49); + PikePrintCleared(gText_Total, gText_TimesCleared, gSaveBlock2Ptr->frontier.pikeTotalStreaks[FRONTIER_LVL_50], 64, 114, 65); + PikePrintPrevOrCurrentStreak(FRONTIER_LVL_OPEN, 64, 114, 97); + PikePrintCleared(gText_Record, gText_RoomsCleared, gSaveBlock2Ptr->frontier.pikeRecordStreaks[FRONTIER_LVL_OPEN], 64, 114, 113); + PikePrintCleared(gText_Total, gText_TimesCleared, gSaveBlock2Ptr->frontier.pikeTotalStreaks[FRONTIER_LVL_OPEN], 64, 114, 129); + PutWindowTilemap(gRecordsWindowId); + CopyWindowToVram(gRecordsWindowId, 3); +} + +// Battle Arena records. +static void ArenaPrintStreak(const u8 *str, u16 num, u8 x1, u8 x2, u8 y) +{ + AddTextPrinterParameterized(gRecordsWindowId, 1, str, x1, y, TEXT_SPEED_FF, NULL); + if (num > 9999) + num = 9999; + ConvertIntToDecimalStringN(gStringVar1, num, STR_CONV_MODE_RIGHT_ALIGN, 4); + StringExpandPlaceholders(gStringVar4, gText_KOsInARow); + AddTextPrinterParameterized(gRecordsWindowId, 1, gStringVar4, x2, y, TEXT_SPEED_FF, NULL); +} + +static void ArenaPrintRecordStreak(u8 lvlMode, u8 x1, u8 x2, u8 y) +{ + u16 num = gSaveBlock2Ptr->frontier.arenaRecordStreaks[lvlMode]; + ArenaPrintStreak(gText_Record, num, x1, x2, y); +} + +static u16 ArenaGetWinStreak(u8 lvlMode) +{ + u16 winStreak = gSaveBlock2Ptr->frontier.arenaWinStreaks[lvlMode]; + if (winStreak > 9999) + return 9999; + else + return winStreak; +} + +static void ArenaPrintPrevOrCurrentStreak(u8 lvlMode, u8 x1, u8 x2, u8 y) +{ + bool8 isCurrent; + u16 winStreak = ArenaGetWinStreak(lvlMode); + + if (lvlMode != FRONTIER_LVL_50) + isCurrent = sub_81A1C24(0x80); + else + isCurrent = sub_81A1C24(0x40); + + if (isCurrent == TRUE) + ArenaPrintStreak(gText_Current, winStreak, x1, x2, y); + else + ArenaPrintStreak(gText_Prev, winStreak, x1, x2, y); +} + +static void ShowArenaResultsWindow(void) +{ + gRecordsWindowId = AddWindow(&gUnknown_08611C74); + NewMenuHelpers_DrawStdWindowFrame(gRecordsWindowId, FALSE); + FillWindowPixelBuffer(gRecordsWindowId, 0x11); + PrintHyphens(10); + StringExpandPlaceholders(gStringVar4, gText_SetKOTourneyResults); + PrintAligned(gStringVar4, 2); + AddTextPrinterParameterized(gRecordsWindowId, 1, gText_Lv502, 16, 49, TEXT_SPEED_FF, NULL); + AddTextPrinterParameterized(gRecordsWindowId, 1, gText_OpenLv, 16, 97, TEXT_SPEED_FF, NULL); + ArenaPrintPrevOrCurrentStreak(FRONTIER_LVL_50, 72, 126, 49); + ArenaPrintRecordStreak(FRONTIER_LVL_50, 72, 126, 65); + ArenaPrintPrevOrCurrentStreak(FRONTIER_LVL_OPEN, 72, 126, 97); + ArenaPrintRecordStreak(FRONTIER_LVL_OPEN, 72, 126, 113); + PutWindowTilemap(gRecordsWindowId); + CopyWindowToVram(gRecordsWindowId, 3); +} + +// Battle Factory records. +static void FactoryPrintStreak(const u8 *str, u16 num1, u16 num2, u8 x1, u8 x2, u8 x3, u8 y) +{ + AddTextPrinterParameterized(gRecordsWindowId, 1, str, x1, y, TEXT_SPEED_FF, NULL); + if (num1 > 9999) + num1 = 9999; + ConvertIntToDecimalStringN(gStringVar1, num1, STR_CONV_MODE_RIGHT_ALIGN, 4); + StringExpandPlaceholders(gStringVar4, gText_WinStreak); + AddTextPrinterParameterized(gRecordsWindowId, 1, gStringVar4, x2, y, TEXT_SPEED_FF, NULL); + + ConvertIntToDecimalStringN(gStringVar1, num2, STR_CONV_MODE_RIGHT_ALIGN, 4); + StringExpandPlaceholders(gStringVar4, gText_TimesVar1); + AddTextPrinterParameterized(gRecordsWindowId, 1, gStringVar4, x3, y, TEXT_SPEED_FF, NULL); +} + +static void FactoryPrintRecordStreak(u8 battleMode, u8 lvlMode, u8 x1, u8 x2, u8 x3, u8 y) +{ + u16 num1 = gSaveBlock2Ptr->frontier.factoryRecordWinStreaks[battleMode][lvlMode]; + u16 num2 = gSaveBlock2Ptr->frontier.factoryRecordRentsCount[battleMode][lvlMode]; + FactoryPrintStreak(gText_Record, num1, num2, x1, x2, x3, y); +} + +static u16 FactoryGetWinStreak(u8 battleMode, u8 lvlMode) +{ + u16 winStreak = gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode]; + if (winStreak > 9999) + return 9999; + else + return winStreak; +} + +static u16 FactoryGetRentsCount(u8 battleMode, u8 lvlMode) +{ + u16 rents = gSaveBlock2Ptr->frontier.factoryRentsCount[battleMode][lvlMode]; + if (rents > 9999) + return 9999; + else + return rents; +} + +static void FactoryPrintPrevOrCurrentStreak(u8 battleMode, u8 lvlMode, u8 x1, u8 x2, u8 x3, u8 y) +{ + bool8 isCurrent; + u16 winStreak = FactoryGetWinStreak(battleMode, lvlMode); + u16 rents = FactoryGetRentsCount(battleMode, lvlMode); + switch (battleMode) + { + default: + case FRONTIER_MODE_SINGLES: + if (lvlMode != FRONTIER_LVL_50) + isCurrent = sub_81A1C24(0x200); + else + isCurrent = sub_81A1C24(0x100); + break; + case FRONTIER_MODE_DOUBLES: + if (lvlMode != FRONTIER_LVL_50) + isCurrent = sub_81A1C24(0x2000000); + else + isCurrent = sub_81A1C24(0x1000000); + break; + } + + if (isCurrent == TRUE) + FactoryPrintStreak(gText_Current, winStreak, rents, x1, x2, x3, y); + else + FactoryPrintStreak(gText_Prev, winStreak, rents, x1, x2, x3, y); +} + +static void ShowFactoryResultsWindow(u8 battleMode) +{ + gRecordsWindowId = AddWindow(&gUnknown_08611C74); + NewMenuHelpers_DrawStdWindowFrame(gRecordsWindowId, FALSE); + FillWindowPixelBuffer(gRecordsWindowId, 0x11); + if (battleMode == FRONTIER_MODE_SINGLES) + StringExpandPlaceholders(gStringVar4, gText_BattleSwapSingleResults); + else + StringExpandPlaceholders(gStringVar4, gText_BattleSwapDoubleResults); + + PrintAligned(gStringVar4, 0); + AddTextPrinterParameterized(gRecordsWindowId, 1, gText_Lv502, 8, 33, TEXT_SPEED_FF, NULL); + AddTextPrinterParameterized(gRecordsWindowId, 1, gText_RentalSwap, 152, 33, TEXT_SPEED_FF, NULL); + AddTextPrinterParameterized(gRecordsWindowId, 1, gText_OpenLv, 8, 97, TEXT_SPEED_FF, NULL); + PrintHyphens(10); + FactoryPrintPrevOrCurrentStreak(battleMode, FRONTIER_LVL_50, 8, 64, 158, 49); + FactoryPrintRecordStreak(battleMode, FRONTIER_LVL_50, 8, 64, 158, 65); + FactoryPrintPrevOrCurrentStreak(battleMode, FRONTIER_LVL_OPEN, 8, 64, 158, 113); + FactoryPrintRecordStreak(battleMode, FRONTIER_LVL_OPEN, 8, 64, 158, 129); + PutWindowTilemap(gRecordsWindowId); + CopyWindowToVram(gRecordsWindowId, 3); +} + +// Battle Pyramid records. +static void PyramidPrintStreak(const u8 *str, u16 num, u8 x1, u8 x2, u8 y) +{ + AddTextPrinterParameterized(gRecordsWindowId, 1, str, x1, y, TEXT_SPEED_FF, NULL); + if (num > 9999) + num = 9999; + ConvertIntToDecimalStringN(gStringVar1, num, STR_CONV_MODE_RIGHT_ALIGN, 4); + StringExpandPlaceholders(gStringVar4, gText_FloorsCleared); + AddTextPrinterParameterized(gRecordsWindowId, 1, gStringVar4, x2, y, TEXT_SPEED_FF, NULL); +} + +static void PyramidPrintRecordStreak(u8 lvlMode, u8 x1, u8 x2, u8 y) +{ + u16 num = gSaveBlock2Ptr->frontier.pyramidRecordStreaks[lvlMode]; + PyramidPrintStreak(gText_Record, num, x1, x2, y); +} + +static u16 PyramidGetWinStreak(u8 lvlMode) +{ + u16 winStreak = gSaveBlock2Ptr->frontier.pyramidWinStreaks[lvlMode]; + if (winStreak > 9999) + return 9999; + else + return winStreak; +} + +static void PyramidPrintPrevOrCurrentStreak(u8 lvlMode, u8 x1, u8 x2, u8 y) +{ + bool8 isCurrent; + u16 winStreak = PyramidGetWinStreak(lvlMode); + + if (lvlMode != FRONTIER_LVL_50) + isCurrent = sub_81A1C24(0x2000); + else + isCurrent = sub_81A1C24(0x1000); + + if (isCurrent == TRUE) + PyramidPrintStreak(gText_Current, winStreak, x1, x2, y); + else + PyramidPrintStreak(gText_Prev, winStreak, x1, x2, y); +} + +static void ShowPyramidResultsWindow(void) +{ + gRecordsWindowId = AddWindow(&gUnknown_08611C74); + NewMenuHelpers_DrawStdWindowFrame(gRecordsWindowId, FALSE); + FillWindowPixelBuffer(gRecordsWindowId, 0x11); + StringExpandPlaceholders(gStringVar4, gText_BattleQuestResults); + PrintAligned(gStringVar4, 2); + AddTextPrinterParameterized(gRecordsWindowId, 1, gText_Lv502, 8, 49, TEXT_SPEED_FF, NULL); + AddTextPrinterParameterized(gRecordsWindowId, 1, gText_OpenLv, 8, 97, TEXT_SPEED_FF, NULL); + PrintHyphens(10); + PyramidPrintPrevOrCurrentStreak(FRONTIER_LVL_50, 64, 111, 49); + PyramidPrintRecordStreak(FRONTIER_LVL_50, 64, 111, 65); + PyramidPrintPrevOrCurrentStreak(FRONTIER_LVL_OPEN, 64, 111, 97); + PyramidPrintRecordStreak(FRONTIER_LVL_OPEN, 64, 111, 113); + PutWindowTilemap(gRecordsWindowId); + CopyWindowToVram(gRecordsWindowId, 3); +} + +// Link contest records. Why is it in this file? +static void ShowLinkContestResultsWindow(void) +{ + const u8 *str; + s32 i, j; + s32 x; + + gRecordsWindowId = AddWindow(&gUnknown_08611C7C); + NewMenuHelpers_DrawStdWindowFrame(gRecordsWindowId, FALSE); + FillWindowPixelBuffer(gRecordsWindowId, 0x11); + + StringExpandPlaceholders(gStringVar4, gText_LinkContestResults); + x = GetStringCenterAlignXOffset(1, gStringVar4, 208); + AddTextPrinterParameterized(gRecordsWindowId, 1, gStringVar4, x, 1, TEXT_SPEED_FF, NULL); + + str = gText_1st; + x = GetStringRightAlignXOffset(1, str, 38) + 50; + AddTextPrinterParameterized(gRecordsWindowId, 1, str, x, 25, TEXT_SPEED_FF, NULL); + + str = gText_2nd; + x = GetStringRightAlignXOffset(1, str, 38) + 88; + AddTextPrinterParameterized(gRecordsWindowId, 1, str, x, 25, TEXT_SPEED_FF, NULL); + + str = gText_3rd; + x = GetStringRightAlignXOffset(1, str, 38) + 126; + AddTextPrinterParameterized(gRecordsWindowId, 1, str, x, 25, TEXT_SPEED_FF, NULL); + + str = gText_4th; + x = GetStringRightAlignXOffset(1, str, 38) + 164; + AddTextPrinterParameterized(gRecordsWindowId, 1, str, x, 25, TEXT_SPEED_FF, NULL); + + x = 6; + AddTextPrinterParameterized(gRecordsWindowId, 1, gText_Cool, x, 41, TEXT_SPEED_FF, NULL); + AddTextPrinterParameterized(gRecordsWindowId, 1, gText_Beauty, x, 57, TEXT_SPEED_FF, NULL); + AddTextPrinterParameterized(gRecordsWindowId, 1, gText_Cute, x, 73, TEXT_SPEED_FF, NULL); + AddTextPrinterParameterized(gRecordsWindowId, 1, gText_Smart, x, 89, TEXT_SPEED_FF, NULL); + AddTextPrinterParameterized(gRecordsWindowId, 1, gText_Tough, x, 105, TEXT_SPEED_FF, NULL); + + for (i = 0; i < 5; i++) + { + for (j = 0; j < 4; j++) + { + ConvertIntToDecimalStringN(gStringVar4, gSaveBlock2Ptr->contestLinkResults[i][j], STR_CONV_MODE_RIGHT_ALIGN, 4); + AddTextPrinterParameterized(gRecordsWindowId, 1, gStringVar4, (j * 38) + 64, (i * 16) + 41, TEXT_SPEED_FF, NULL); + } + } + + PutWindowTilemap(gRecordsWindowId); + CopyWindowToVram(gRecordsWindowId, 3); +} + +static void sub_81A31FC(void) +{ + u8 text[32]; + s32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; + s32 facility = VarGet(VAR_FRONTIER_FACILITY); + s32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); + + switch (facility) + { + case FRONTIER_FACILITY_TOWER: + if (gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode] > gSaveBlock2Ptr->frontier.towerRecordWinStreaks[battleMode][lvlMode]) + { + gSaveBlock2Ptr->frontier.towerRecordWinStreaks[battleMode][lvlMode] = gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode]; + if (battleMode == FRONTIER_MODE_LINK_MULTIS) + { + StringCopy(text, gLinkPlayers[gBattleScripting.multiplayerId ^ 1].name); + StripExtCtrlCodes(text); + StringCopy(gSaveBlock2Ptr->frontier.field_EE1[lvlMode], text); + SetTrainerId(gLinkPlayers[gBattleScripting.multiplayerId ^ 1].trainerId, gSaveBlock2Ptr->frontier.field_EF1[lvlMode]); + } + if (gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode] > 1 + && sub_80EE818()) + { + switch (battleMode) + { + case FRONTIER_MODE_SINGLES: + sub_80EE8C8(gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode], 1); + break; + case FRONTIER_MODE_DOUBLES: + sub_80EE8C8(gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode], 2); + break; + case FRONTIER_MODE_MULTIS: + sub_80EE8C8(gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode], 3); + break; + case FRONTIER_MODE_LINK_MULTIS: + sub_80EE8C8(gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode], 4); + break; + } + } + } + break; + case FRONTIER_FACILITY_DOME: + if (gSaveBlock2Ptr->frontier.domeWinStreaks[battleMode][lvlMode] > gSaveBlock2Ptr->frontier.domeRecordWinStreaks[battleMode][lvlMode]) + { + gSaveBlock2Ptr->frontier.domeRecordWinStreaks[battleMode][lvlMode] = gSaveBlock2Ptr->frontier.domeWinStreaks[battleMode][lvlMode]; + if (gSaveBlock2Ptr->frontier.domeWinStreaks[battleMode][lvlMode] > 1 + && sub_80EE818()) + { + if (battleMode == FRONTIER_MODE_SINGLES) + sub_80EE8C8(gSaveBlock2Ptr->frontier.domeWinStreaks[battleMode][lvlMode], 5); + else + sub_80EE8C8(gSaveBlock2Ptr->frontier.domeWinStreaks[battleMode][lvlMode], 6); + } + } + break; + case FRONTIER_FACILITY_PALACE: + if (gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode] > gSaveBlock2Ptr->frontier.palaceRecordWinStreaks[battleMode][lvlMode]) + { + gSaveBlock2Ptr->frontier.palaceRecordWinStreaks[battleMode][lvlMode] = gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode]; + if (gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode] > 1 + && sub_80EE818()) + { + if (battleMode == FRONTIER_MODE_SINGLES) + sub_80EE8C8(gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode], 11); + else + sub_80EE8C8(gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode], 12); + } + } + break; + case FRONTIER_FACILITY_ARENA: + if (gSaveBlock2Ptr->frontier.arenaWinStreaks[lvlMode] > gSaveBlock2Ptr->frontier.arenaRecordStreaks[lvlMode]) + { + gSaveBlock2Ptr->frontier.arenaRecordStreaks[lvlMode] = gSaveBlock2Ptr->frontier.arenaWinStreaks[lvlMode]; + if (gSaveBlock2Ptr->frontier.arenaWinStreaks[lvlMode] > 1 + && sub_80EE818()) + { + sub_80EE8C8(gSaveBlock2Ptr->frontier.arenaWinStreaks[lvlMode], 10); + } + } + break; + case FRONTIER_FACILITY_FACTORY: + if (gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode] > gSaveBlock2Ptr->frontier.factoryRecordWinStreaks[battleMode][lvlMode]) + { + gSaveBlock2Ptr->frontier.factoryRecordWinStreaks[battleMode][lvlMode] = gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode]; + gSaveBlock2Ptr->frontier.factoryRecordRentsCount[battleMode][lvlMode] = gSaveBlock2Ptr->frontier.factoryRentsCount[battleMode][lvlMode]; + if (gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode] > 1 + && sub_80EE818()) + { + if (battleMode == FRONTIER_MODE_SINGLES) + sub_80EE8C8(gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode], 7); + else + sub_80EE8C8(gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode], 8); + } + } + break; + case FRONTIER_FACILITY_PIKE: + if (gSaveBlock2Ptr->frontier.pikeWinStreaks[lvlMode] > gSaveBlock2Ptr->frontier.pikeRecordStreaks[lvlMode]) + { + gSaveBlock2Ptr->frontier.pikeRecordStreaks[lvlMode] = gSaveBlock2Ptr->frontier.pikeWinStreaks[lvlMode]; + if (gSaveBlock2Ptr->frontier.pikeWinStreaks[lvlMode] > 1 + && sub_80EE818()) + { + sub_80EE8C8(gSaveBlock2Ptr->frontier.pikeWinStreaks[lvlMode], 9); + } + } + break; + case FRONTIER_FACILITY_PYRAMID: + if (gSaveBlock2Ptr->frontier.pyramidWinStreaks[lvlMode] > gSaveBlock2Ptr->frontier.pyramidRecordStreaks[lvlMode]) + { + gSaveBlock2Ptr->frontier.pyramidRecordStreaks[lvlMode] = gSaveBlock2Ptr->frontier.pyramidWinStreaks[lvlMode]; + if (gSaveBlock2Ptr->frontier.pyramidWinStreaks[lvlMode] > 1 + && sub_80EE818()) + { + sub_80EE8C8(gSaveBlock2Ptr->frontier.pyramidWinStreaks[lvlMode], 13); + } + } + break; + } +} + +static void sub_81A35EC(void) +{ + VarGet(VAR_FRONTIER_FACILITY); // Unused return value. + gSpecialVar_Result = sub_81A3610(); +} + +u8 sub_81A3610(void) +{ + s32 ret = 0; + s32 facility = VarGet(VAR_FRONTIER_FACILITY); + s32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); + u16 val = GetCurrentFacilityWinStreak(); + s32 r5 = val + gUnknown_08611550[facility][3]; + s32 symbolsCount; + + if (battleMode != FRONTIER_MODE_SINGLES) + return 0; + + symbolsCount = GetPlayerSymbolCountForFacility(facility); + switch (symbolsCount) + { + case 0: + case 1: + if (r5 == gUnknown_08611550[facility][symbolsCount]) + ret = symbolsCount + 1; + break; + case 2: + default: + if (r5 == gUnknown_08611550[facility][0]) + ret = 3; + else if (r5 == gUnknown_08611550[facility][1]) + ret = 4; + else if (r5 > gUnknown_08611550[facility][1] && (r5 - gUnknown_08611550[facility][1]) % gUnknown_08611550[facility][2] == 0) + ret = 4; + break; + } + + return ret; +} + +void CopyFrontierTrainerText(u8 whichText, u16 trainerId) +{ + switch (whichText) + { + case FRONTIER_BEFORE_TEXT: + if (trainerId == TRAINER_EREADER) + FrontierSpeechToString(gSaveBlock2Ptr->frontier.ereaderTrainer.greeting); + else if (trainerId == TRAINER_FRONTIER_BRAIN) + CopyFrontierBrainText(FALSE); + else if (trainerId < TRAINER_RECORD_MIXING_FRIEND) + FrontierSpeechToString(gFacilityTrainers[trainerId].speechBefore); + else if (trainerId < TRAINER_RECORD_MIXING_APPRENTICE) + FrontierSpeechToString(gSaveBlock2Ptr->frontier.towerRecords[trainerId - TRAINER_RECORD_MIXING_FRIEND].greeting); + else + CopyFriendsApprenticeChallengeText(trainerId - TRAINER_RECORD_MIXING_APPRENTICE); + break; + case FRONTIER_PLAYER_LOST_TEXT: + if (trainerId == TRAINER_EREADER) + { + FrontierSpeechToString(gSaveBlock2Ptr->frontier.ereaderTrainer.farewellPlayerLost); + } + else if (trainerId == TRAINER_FRONTIER_BRAIN) + { + CopyFrontierBrainText(FALSE); + } + else if (trainerId < TRAINER_RECORD_MIXING_FRIEND) + { + FrontierSpeechToString(gFacilityTrainers[trainerId].speechWin); + } + else if (trainerId < TRAINER_RECORD_MIXING_APPRENTICE) + { + if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) + FrontierSpeechToString(GetRecordedBattleEasyChatSpeech()); + else + FrontierSpeechToString(gSaveBlock2Ptr->frontier.towerRecords[trainerId - TRAINER_RECORD_MIXING_FRIEND].speechWon); + } + else + { + if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) + FrontierSpeechToString(GetRecordedBattleEasyChatSpeech()); + else + FrontierSpeechToString(gSaveBlock2Ptr->apprentices[trainerId - TRAINER_RECORD_MIXING_APPRENTICE].easyChatWords); + } + break; + case FRONTIER_PLAYER_WON_TEXT: + if (trainerId == TRAINER_EREADER) + { + FrontierSpeechToString(gSaveBlock2Ptr->frontier.ereaderTrainer.farewellPlayerWon); + } + else if (trainerId == TRAINER_FRONTIER_BRAIN) + { + CopyFrontierBrainText(TRUE); + } + else if (trainerId < TRAINER_RECORD_MIXING_FRIEND) + { + FrontierSpeechToString(gFacilityTrainers[trainerId].speechLose); + } + else if (trainerId < TRAINER_RECORD_MIXING_APPRENTICE) + { + if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) + FrontierSpeechToString(GetRecordedBattleEasyChatSpeech()); + else + FrontierSpeechToString(gSaveBlock2Ptr->frontier.towerRecords[trainerId - TRAINER_RECORD_MIXING_FRIEND].speechLost); + } + else + { + if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) + { + trainerId = GetRecordedBattleApprenticeId(); + FrontierSpeechToString(gApprentices[trainerId].easyChatWords); + } + else + { + trainerId = gSaveBlock2Ptr->apprentices[trainerId - TRAINER_RECORD_MIXING_APPRENTICE].id; + FrontierSpeechToString(gApprentices[trainerId].easyChatWords); + } + } + break; + } +} + +void sub_81A3908(void) +{ + s32 battleMode, lvlMode; + + gSaveBlock2Ptr->frontier.field_CDC = 0; + for (battleMode = 0; battleMode < 4; battleMode++) + { + for (lvlMode = 0; lvlMode < 2; lvlMode++) + { + gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode] = 0; + if (battleMode < FRONTIER_MODE_MULTIS) + { + gSaveBlock2Ptr->frontier.domeWinStreaks[battleMode][lvlMode] = 0; + gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode] = 0; + gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode] = 0; + } + if (battleMode == FRONTIER_MODE_SINGLES) + { + gSaveBlock2Ptr->frontier.arenaWinStreaks[lvlMode] = 0; + gSaveBlock2Ptr->frontier.pikeWinStreaks[lvlMode] = 0; + gSaveBlock2Ptr->frontier.pyramidWinStreaks[lvlMode] = 0; + } + } + } + if (gSaveBlock2Ptr->frontier.field_CA8 != 0) + gSaveBlock2Ptr->frontier.field_CA8 = 1; +} + +u32 GetCurrentFacilityWinStreak(void) +{ + s32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; + s32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); + s32 facility = VarGet(VAR_FRONTIER_FACILITY); + + switch (facility) + { + case FRONTIER_FACILITY_TOWER: + return gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode]; + case FRONTIER_FACILITY_DOME: + return gSaveBlock2Ptr->frontier.domeWinStreaks[battleMode][lvlMode]; + case FRONTIER_FACILITY_PALACE: + return gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode]; + case FRONTIER_FACILITY_ARENA: + return gSaveBlock2Ptr->frontier.arenaWinStreaks[lvlMode]; + case FRONTIER_FACILITY_FACTORY: + return gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode]; + case FRONTIER_FACILITY_PIKE: + return gSaveBlock2Ptr->frontier.pikeWinStreaks[lvlMode]; + case FRONTIER_FACILITY_PYRAMID: + return gSaveBlock2Ptr->frontier.pyramidWinStreaks[lvlMode]; + default: + return 0; + } +} + +void sub_81A3ACC(void) +{ + s32 i; + + for (i = 0; i < 20; i++) + gSaveBlock2Ptr->frontier.field_CB4[i] |= 0xFFFF; +} + +static void sub_81A3B00(void) +{ + if (gTrainerBattleOpponent_A == TRAINER_FRONTIER_BRAIN) + gSpecialVar_Result = TRUE; + else + gSpecialVar_Result = FALSE; +} + +u8 GetPlayerSymbolCountForFacility(u8 facility) +{ + return FlagGet(FLAG_SYS_TOWER_SILVER + facility * 2) + + FlagGet(FLAG_SYS_TOWER_GOLD + facility * 2); +} + +static void sub_81A3B64(void) +{ + s32 challengeNum = 0; + s32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; + s32 facility = VarGet(VAR_FRONTIER_FACILITY); + s32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); + s32 points; + + switch (facility) + { + case FRONTIER_FACILITY_TOWER: + challengeNum = gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode] / 7; + break; + case FRONTIER_FACILITY_DOME: + challengeNum = gSaveBlock2Ptr->frontier.domeWinStreaks[battleMode][lvlMode]; + break; + case FRONTIER_FACILITY_PALACE: + challengeNum = gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode] / 7; + break; + case FRONTIER_FACILITY_ARENA: + challengeNum = gSaveBlock2Ptr->frontier.arenaWinStreaks[lvlMode] / 7; + break; + case FRONTIER_FACILITY_FACTORY: + challengeNum = gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode] / 7; + break; + case FRONTIER_FACILITY_PIKE: + challengeNum = gSaveBlock2Ptr->frontier.pikeWinStreaks[lvlMode] / 14; + break; + case FRONTIER_FACILITY_PYRAMID: + challengeNum = gSaveBlock2Ptr->frontier.pyramidWinStreaks[lvlMode] / 7; + break; + } + + if (challengeNum != 0) + challengeNum--; + if (challengeNum >= ARRAY_COUNT(gUnknown_086118B4)) + challengeNum = ARRAY_COUNT(gUnknown_086118B4) - 1; + + points = gUnknown_086118B4[challengeNum][facility][battleMode]; + if (gTrainerBattleOpponent_A == TRAINER_FRONTIER_BRAIN) + points += 10; + gSaveBlock2Ptr->frontier.battlePoints += points; + ConvertIntToDecimalStringN(gStringVar1, points, STR_CONV_MODE_LEFT_ALIGN, 2); + if (gSaveBlock2Ptr->frontier.battlePoints > 9999) + gSaveBlock2Ptr->frontier.battlePoints = 9999; + + points = gSaveBlock2Ptr->frontier.field_EBA; + points += gUnknown_086118B4[challengeNum][facility][battleMode]; + sub_80EED60(gUnknown_086118B4[challengeNum][facility][battleMode]); + if (gTrainerBattleOpponent_A == TRAINER_FRONTIER_BRAIN) + { + points += 10; + sub_80EED60(10); + } + if (points > 0xFFFF) + points = 0xFFFF; + gSaveBlock2Ptr->frontier.field_EBA = points; +} + +static void sub_81A3D30(void) +{ + s32 facility = VarGet(VAR_FRONTIER_FACILITY); + gSpecialVar_Result = GetPlayerSymbolCountForFacility(facility); +} + +static void sub_81A3D58(void) +{ + s32 facility = VarGet(VAR_FRONTIER_FACILITY); + if (GetPlayerSymbolCountForFacility(facility) == 0) + FlagSet(FLAG_SYS_TOWER_SILVER + facility * 2); + else + FlagSet(FLAG_SYS_TOWER_GOLD + facility * 2); +} + +static void sub_81A3DA0(void) +{ + if (gBattleTypeFlags & gSpecialVar_0x8005) + gSpecialVar_Result = TRUE; + else + gSpecialVar_Result = FALSE; +} + +static u8 sub_81A3DD0(u16 species, u8 arg1, s32 arg2) +{ + if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_CAUGHT)) + { + arg1++; + switch (arg1) + { + case 1: + case 3: + case 5: + case 7: + case 9: + case 11: + if (arg2 == arg1) + StringAppend(gStringVar1, gText_SpaceAndSpace); + else if (arg2 > arg1) + StringAppend(gStringVar1, gText_CommaSpace); + break; + case 2: + if (arg1 == arg2) + StringAppend(gStringVar1, gText_SpaceAndSpace); + else + StringAppend(gStringVar1, gText_CommaSpace); + StringAppend(gStringVar1, gText_NewLine); + break; + default: + if (arg1 == arg2) + StringAppend(gStringVar1, gText_SpaceAndSpace); + else + StringAppend(gStringVar1, gText_CommaSpace); + StringAppend(gStringVar1, gText_ScrollTextUp); + break; + } + StringAppend(gStringVar1, gSpeciesNames[species]); + } + + return arg1; +} + +static void AppendIfValid(u16 species, u16 heldItem, u16 hp, u8 lvlMode, u8 monLevel, u16 *speciesArray, u16 *itemsArray, u8 *count) +{ + s32 i = 0; + + if (species == SPECIES_EGG || species == SPECIES_NONE) + return; + + for (i = 0; gFrontierBannedSpecies[i] != 0xFFFF && gFrontierBannedSpecies[i] != species; i++) + ; + + if (gFrontierBannedSpecies[i] != 0xFFFF) + return; + if (lvlMode == FRONTIER_LVL_50 && monLevel > 50) + return; + + for (i = 0; i < *count && speciesArray[i] != species; i++) + ; + if (i != *count) + return; + + if (heldItem != 0) + { + for (i = 0; i < *count && itemsArray[i] != heldItem; i++) + ; + if (i != *count) + return; + } + + speciesArray[*count] = species; + itemsArray[*count] = heldItem; + (*count)++; +} + +static void sub_81A3FD4(void) +{ + u16 speciesArray[6]; + u16 itemArray[6]; + s32 monId = 0; + s32 toChoose = 0; + u8 count = 0; + s32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); + s32 monIdLooper; + + switch (battleMode) + { + case FRONTIER_MODE_SINGLES: + toChoose = 3; + break; + case FRONTIER_MODE_MULTIS: + case FRONTIER_MODE_LINK_MULTIS: + toChoose = 2; + break; + case FRONTIER_MODE_DOUBLES: + if (VarGet(VAR_FRONTIER_FACILITY) == FRONTIER_FACILITY_TOWER) + toChoose = 4; + else + toChoose = 3; + break; + } + + monIdLooper = 0; + do + { + monId = monIdLooper; + count = 0; + do + { + u16 species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES2); + u16 heldItem = GetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM); + u8 level = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL); + u16 hp = GetMonData(&gPlayerParty[monId], MON_DATA_HP); + if (VarGet(VAR_FRONTIER_FACILITY) == FRONTIER_FACILITY_PYRAMID) + { + if (heldItem == 0) + AppendIfValid(species, heldItem, hp, gSpecialVar_Result, level, speciesArray, itemArray, &count); + } + else + { + AppendIfValid(species, heldItem, hp, gSpecialVar_Result, level, speciesArray, itemArray, &count); + } + monId++; + if (monId >= PARTY_SIZE) + monId = 0; + } while (monId != monIdLooper); + + monIdLooper++; + } while (monIdLooper < PARTY_SIZE && count < toChoose); + + if (count < toChoose) + { + s32 i; + s32 caughtBannedMons = 0; + s32 species = gFrontierBannedSpecies[0]; + for (i = 0; species != 0xFFFF; i++, species = gFrontierBannedSpecies[i]) + { + if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_CAUGHT)) + caughtBannedMons++; + } + gStringVar1[0] = EOS; + gSpecialVar_0x8004 = 1; + count = 0; + for (i = 0; gFrontierBannedSpecies[i] != 0xFFFF; i++) + count = sub_81A3DD0(gFrontierBannedSpecies[i], count, caughtBannedMons); + + if (count == 0) + { + StringAppend(gStringVar1, gText_Space2); + StringAppend(gStringVar1, gText_Are); + } + else + { + if (count & 1) + StringAppend(gStringVar1, gText_ScrollTextUp); + else + StringAppend(gStringVar1, gText_Space2); + StringAppend(gStringVar1, gText_Are2); + } + } + else + { + gSpecialVar_0x8004 = 0; + gSaveBlock2Ptr->frontier.lvlMode = gSpecialVar_Result; + } +} + +static void sub_81A4224(void) +{ + ValidateEReaderTrainer(); +} + +static void sub_81A4230(void) +{ + s32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; + s32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); + s32 facility = VarGet(VAR_FRONTIER_FACILITY); + + switch (facility) + { + case FRONTIER_FACILITY_TOWER: + if (gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode] < 9999) + { + gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode]++; + if (battleMode == FRONTIER_MODE_SINGLES) + { + SetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK, gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode]); + gSaveBlock2Ptr->frontier.field_D02 = gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode]; + } + } + break; + case FRONTIER_FACILITY_DOME: + if (gSaveBlock2Ptr->frontier.domeWinStreaks[battleMode][lvlMode] < 9999) + gSaveBlock2Ptr->frontier.domeWinStreaks[battleMode][lvlMode]++; + if (gSaveBlock2Ptr->frontier.domeTotalChampionships[battleMode][lvlMode] < 9999) + gSaveBlock2Ptr->frontier.domeTotalChampionships[battleMode][lvlMode]++; + break; + case FRONTIER_FACILITY_PALACE: + if (gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode] < 9999) + gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode]++; + break; + case FRONTIER_FACILITY_ARENA: + if (gSaveBlock2Ptr->frontier.arenaWinStreaks[lvlMode] < 9999) + gSaveBlock2Ptr->frontier.arenaWinStreaks[lvlMode]++; + break; + case FRONTIER_FACILITY_FACTORY: + if (gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode] < 9999) + gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode]++; + break; + case FRONTIER_FACILITY_PIKE: + if (gSaveBlock2Ptr->frontier.pikeWinStreaks[lvlMode] < 9999) + gSaveBlock2Ptr->frontier.pikeWinStreaks[lvlMode]++; + break; + case FRONTIER_FACILITY_PYRAMID: + if (gSaveBlock2Ptr->frontier.pyramidWinStreaks[lvlMode] < 9999) + gSaveBlock2Ptr->frontier.pyramidWinStreaks[lvlMode]++; + break; + } +} + +static void sub_81A43A8(void) +{ + u8 i; + + for (i = 0; i < 4; i++) + { + if (gSaveBlock2Ptr->frontier.selectedPartyMons[i] != 0) + { + u16 item = GetMonData(&gSaveBlock1Ptr->playerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1], MON_DATA_HELD_ITEM, NULL); + SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &item); + } + } +} + +static void sub_81A4410(void) +{ + gSpecialVar_Result = MoveRecordedBattleToSaveData(); + gSaveBlock2Ptr->frontier.field_CA9_b = 1; +} + +static void sub_81A443C(void) +{ + switch (gSpecialVar_0x8005) + { + case 0: + GetFrontierTrainerName(gStringVar1, gTrainerBattleOpponent_A); + break; + case 1: + GetFrontierTrainerName(gStringVar2, gTrainerBattleOpponent_A); + break; + } +} + +static void sub_81A447C(void) +{ + u8 i, j, k; + + for (i = 0; i < 4; i++) + { + u16 monId = gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1; + if (monId < PARTY_SIZE) + { + for (j = 0; j < 4; j++) + { + for (k = 0; k < 4; k++) + { + if (GetMonData(&gSaveBlock1Ptr->playerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1], MON_DATA_MOVE1 + k, NULL) + == GetMonData(&gPlayerParty[i], MON_DATA_MOVE1 + j, NULL)) + break; + } + if (k == 4) + SetMonMoveSlot(&gPlayerParty[i], MOVE_SKETCH, j); + } + gSaveBlock1Ptr->playerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1] = gPlayerParty[i]; + } + } +} + +static void sub_81A457C(void) +{ + SetFrontierBrainEventObjGfx(VarGet(VAR_FRONTIER_FACILITY)); +} + +// Battle Frontier Ranking Hall records. +static void Print1PRecord(s32 position, s32 x, s32 y, struct RankingHall1P *hallRecord, s32 hallFacilityId) +{ + u8 text[32]; + u16 winStreak; + + AddTextPrinterParameterized(gRecordsWindowId, 1, gText_123Dot[position], x * 8, (8 * (y + 5 * position)) + 1, TEXT_SPEED_FF, NULL); + hallRecord->name[PLAYER_NAME_LENGTH] = EOS; + if (hallRecord->winStreak) + { + TVShowConvertInternationalString(text, hallRecord->name, hallRecord->language); + AddTextPrinterParameterized(gRecordsWindowId, 1, text, (x + 2) * 8, (8 * (y + 5 * position)) + 1, TEXT_SPEED_FF, NULL); + winStreak = hallRecord->winStreak; + if (winStreak > 9999) + winStreak = 9999; + ConvertIntToDecimalStringN(gStringVar2, winStreak, STR_CONV_MODE_RIGHT_ALIGN, 4); + StringExpandPlaceholders(gStringVar4, gUnknown_08611D08[hallFacilityId]); + AddTextPrinterParameterized(gRecordsWindowId, 1, gStringVar4, GetStringRightAlignXOffset(1, gUnknown_08611D08[hallFacilityId], 0xC8), (8 * (y + 5 * position)) + 1, TEXT_SPEED_FF, NULL); + } +} + +static void Print2PRecord(s32 position, s32 x, s32 y, struct RankingHall2P *hallRecord) +{ + u8 text[32]; + u16 winStreak; + + AddTextPrinterParameterized(gRecordsWindowId, 1, gText_123Dot[position], x * 8, (8 * (y + 5 * position)) + 1, TEXT_SPEED_FF, NULL); + if (hallRecord->winStreak) + { + hallRecord->name1[PLAYER_NAME_LENGTH] = EOS; + hallRecord->name2[PLAYER_NAME_LENGTH] = EOS; + TVShowConvertInternationalString(text, hallRecord->name1, hallRecord->language); + AddTextPrinterParameterized(gRecordsWindowId, 1, text, (x + 2) * 8, (8 * (y + 5 * position - 1)) + 1, TEXT_SPEED_FF, NULL); + if (IsStringJapanese(hallRecord->name2)) + TVShowConvertInternationalString(text, hallRecord->name2, LANGUAGE_JAPANESE); + else + StringCopy(text, hallRecord->name2); + AddTextPrinterParameterized(gRecordsWindowId, 1, text, (x + 4) * 8, (8 * (y + 5 * position + 1)) + 1, TEXT_SPEED_FF, NULL); + + winStreak = hallRecord->winStreak; + if (winStreak > 9999) + winStreak = 9999; + ConvertIntToDecimalStringN(gStringVar2, winStreak, STR_CONV_MODE_RIGHT_ALIGN, 4); + StringExpandPlaceholders(gStringVar4, gUnknown_08611D08[9]); + AddTextPrinterParameterized(gRecordsWindowId, 1, gStringVar4, GetStringRightAlignXOffset(1, gUnknown_08611D08[9], 0xC8), (8 * (y + 5 * position)) + 1, TEXT_SPEED_FF, NULL); + } +} + +static void Fill1PRecords(struct RankingHall1P *dst, s32 hallFacilityId, s32 lvlMode) +{ + s32 i, j; + struct RankingHall1P record1P[4]; + struct PlayerHallRecords *playerHallRecords = calloc(1, sizeof(struct PlayerHallRecords)); + GetPlayerHallRecords(playerHallRecords); + + for (i = 0; i < 3; i++) + record1P[i] = gSaveBlock2Ptr->hallRecords1P[hallFacilityId][lvlMode][i]; + + record1P[3] = playerHallRecords->onePlayer[hallFacilityId][lvlMode]; + + for (i = 0; i < 3; i++) + { + s32 highestWinStreak = 0; + s32 highestId = 0; + for (j = 0; j < 4; j++) + { + if (record1P[j].winStreak > highestWinStreak) + { + highestId = j; + highestWinStreak = record1P[j].winStreak; + } + } + if (record1P[3].winStreak >= highestWinStreak) + highestId = 3; + + dst[i] = record1P[highestId]; + record1P[highestId].winStreak = 0; + } + + free(playerHallRecords); +} + +static void Fill2PRecords(struct RankingHall2P *dst, s32 lvlMode) +{ + s32 i, j; + struct RankingHall2P record2P[4]; + struct PlayerHallRecords *playerHallRecords = calloc(1, sizeof(struct PlayerHallRecords)); + GetPlayerHallRecords(playerHallRecords); + + for (i = 0; i < 3; i++) + record2P[i] = gSaveBlock2Ptr->hallRecords2P[lvlMode][i]; + + record2P[3] = playerHallRecords->twoPlayers[lvlMode]; + + for (i = 0; i < 3; i++) + { + s32 highestWinStreak = 0; + s32 highestId = 0; + for (j = 0; j < 3; j++) + { + if (record2P[j].winStreak > highestWinStreak) + { + highestId = j; + highestWinStreak = record2P[j].winStreak; + } + } + if (record2P[3].winStreak >= highestWinStreak) + highestId = 3; + + dst[i] = record2P[highestId]; + record2P[highestId].winStreak = 0; + } + + free(playerHallRecords); +} + +static void PrintHallRecords(s32 hallFacilityId, s32 lvlMode) +{ + s32 i; + s32 x; + struct RankingHall1P records1P[3]; + struct RankingHall2P records2P[3]; + + StringCopy(gStringVar1, gUnknown_08611CB0[hallFacilityId][0]); + StringExpandPlaceholders(gStringVar4, gUnknown_08611CB0[hallFacilityId][1]); + AddTextPrinterParameterized(gRecordsWindowId, 1, gStringVar4, 0, 1, TEXT_SPEED_FF, NULL); + x = GetStringRightAlignXOffset(1, gUnknown_08611D00[lvlMode], 0xD0); + AddTextPrinterParameterized(gRecordsWindowId, 1, gUnknown_08611D00[lvlMode], x, 1, TEXT_SPEED_FF, NULL); + if (hallFacilityId == HALL_FACILITIES_COUNT) + { + gSaveBlock2Ptr->frontier.field_EE1[0][PLAYER_NAME_LENGTH] = EOS; + gSaveBlock2Ptr->frontier.field_EE1[1][PLAYER_NAME_LENGTH] = EOS; + Fill2PRecords(records2P, lvlMode); + for (i = 0; i < 3; i++) + Print2PRecord(i, 1, 4, &records2P[i]); + } + else + { + Fill1PRecords(records1P, hallFacilityId, lvlMode); + for (i = 0; i < 3; i++) + Print1PRecord(i, 1, 4, &records1P[i], hallFacilityId); + } +} + +void ShowRankingHallRecordsWindow(void) +{ + gRecordsWindowId = AddWindow(&gUnknown_08611C84); + NewMenuHelpers_DrawStdWindowFrame(gRecordsWindowId, FALSE); + FillWindowPixelBuffer(gRecordsWindowId, 0x11); + PrintHallRecords(gSpecialVar_0x8005, FRONTIER_LVL_50); + PutWindowTilemap(gRecordsWindowId); + CopyWindowToVram(gRecordsWindowId, 3); +} + +void ScrollRankingHallRecordsWindow(void) +{ + FillWindowPixelBuffer(gRecordsWindowId, 0x11); + PrintHallRecords(gSpecialVar_0x8005, FRONTIER_LVL_OPEN); + CopyWindowToVram(gRecordsWindowId, 2); +} + +void ClearRankingHallRecords(void) +{ + s32 i, j, k; + + for (i = 0; i < HALL_FACILITIES_COUNT; i++) + { + for (j = 0; j < 2; j++) + { + for (k = 0; k < 3; k++) + { + CopyTrainerId(gSaveBlock2Ptr->hallRecords1P[i][j][k].id, 0); // BUG: Passing 0 as a pointer instead of a pointer holding a value of 0. + gSaveBlock2Ptr->hallRecords1P[i][j][k].name[0] = EOS; + gSaveBlock2Ptr->hallRecords1P[i][j][k].winStreak = 0; + } + } + } + + for (j = 0; j < 2; j++) + { + for (k = 0; k < 3; k++) + { + CopyTrainerId(gSaveBlock2Ptr->hallRecords2P[j][k].id1, 0); // BUG: Passing 0 as a pointer instead of a pointer holding a value of 0. + CopyTrainerId(gSaveBlock2Ptr->hallRecords2P[j][k].id2, 0); // BUG: Passing 0 as a pointer instead of a pointer holding a value of 0. + gSaveBlock2Ptr->hallRecords2P[j][k].name1[0] = EOS; + gSaveBlock2Ptr->hallRecords2P[j][k].name2[0] = EOS; + gSaveBlock2Ptr->hallRecords2P[j][k].winStreak = 0; + } + } +} + +void sub_81A4C30(void) +{ + s32 i; + struct Pokemon *monsParty = calloc(PARTY_SIZE, sizeof(struct Pokemon)); + + for (i = 0; i < PARTY_SIZE; i++) + monsParty[i] = gPlayerParty[i]; + + i = gPlayerPartyCount; + LoadPlayerParty(); + sub_8076D5C(); + TrySavingData(SAVE_LINK); + sav2_gender2_inplace_and_xFE(); + gPlayerPartyCount = i; + + for (i = 0; i < PARTY_SIZE; i++) + gPlayerParty[i] = monsParty[i]; + + free(monsParty); +} + +// Frontier Brain functions. +u8 GetFrontierBrainTrainerPicIndex(void) +{ + s32 facility; + + if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) + facility = GetRecordedBattleFrontierFacility(); + else + facility = VarGet(VAR_FRONTIER_FACILITY); + + return gTrainers[gFacilityToBrainTrainerId[facility]].trainerPic; +} + +u8 GetFrontierBrainTrainerClass(void) +{ + s32 facility; + + if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) + facility = GetRecordedBattleFrontierFacility(); + else + facility = VarGet(VAR_FRONTIER_FACILITY); + + return gTrainers[gFacilityToBrainTrainerId[facility]].trainerClass; +} + +void CopyFrontierBrainTrainerName(u8 *dst) +{ + s32 i; + s32 facility; + + if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) + facility = GetRecordedBattleFrontierFacility(); + else + facility = VarGet(VAR_FRONTIER_FACILITY); + + for (i = 0; i < PLAYER_NAME_LENGTH; i++) + dst[i] = gTrainers[gFacilityToBrainTrainerId[facility]].trainerName[i]; + + dst[i] = EOS; +} + +bool8 IsFrontierBrainFemale(void) +{ + s32 facility = VarGet(VAR_FRONTIER_FACILITY); + return sFacilityToBrainEventObjGfx[facility][1]; +} + +void SetFrontierBrainEventObjGfx_2(void) +{ + s32 facility = VarGet(VAR_FRONTIER_FACILITY); + VarSet(VAR_OBJ_GFX_ID_0, sFacilityToBrainEventObjGfx[facility][0]); +} + +#define FRONTIER_BRAIN_OTID 61226 + +#ifdef NONMATCHING +void CreateFrontierBrainPokemon(void) +{ + s32 i, j; + s32 monCountInBits; + s32 monPartyId; + s32 monLevel = 0; + u8 friendship; + s32 facility = VarGet(VAR_FRONTIER_FACILITY); + s32 symbol = GetFronterBrainSymbol(); + + if (facility == FRONTIER_FACILITY_DOME) + monCountInBits = GetDomeTrainerMonCountInBits(TrainerIdToDomeTournamentId(TRAINER_FRONTIER_BRAIN)); + else + monCountInBits = 7; + + ZeroEnemyPartyMons(); + monPartyId = 0; + monLevel = SetFacilityPtrsGetLevel(); + for (i = 0; i < 3; monCountInBits >>= 1, i++) + { + if (!(monCountInBits & 1)) + continue; + + do + { + j = Random32(); + } while (IsShinyOtIdPersonality(FRONTIER_BRAIN_OTID, j) || sFrontierBrainsMons[facility][symbol][i].nature != GetNatureFromPersonality(j)); + CreateMon(&gEnemyParty[monPartyId], + sFrontierBrainsMons[facility][symbol][i].species, + monLevel, + sFrontierBrainsMons[facility][symbol][i].fixedIV, + TRUE, j, + TRUE, FRONTIER_BRAIN_OTID); + SetMonData(&gEnemyParty[monPartyId], MON_DATA_HELD_ITEM, &sFrontierBrainsMons[facility][symbol][i].heldItem); + for (j = 0; j < 6; j++) + SetMonData(&gEnemyParty[monPartyId], MON_DATA_HP_EV + j, &sFrontierBrainsMons[facility][symbol][i].evs[j]); + friendship = 0xFF; + for (j = 0; j < 4; j++) + { + SetMonMoveSlot(&gEnemyParty[monPartyId], sFrontierBrainsMons[facility][symbol][i].moves[j], j); + if (sFrontierBrainsMons[facility][symbol][i].moves[j] == MOVE_FRUSTRATION) + friendship = 0; + } + SetMonData(&gEnemyParty[monPartyId], MON_DATA_FRIENDSHIP, &friendship); + CalculateMonStats(&gEnemyParty[monPartyId]); + monPartyId++; + } +} +#else +NAKED +void CreateFrontierBrainPokemon(void) +{ + asm_unified("\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x44\n\ + ldr r0, =0x000040cf\n\ + bl VarGet\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + str r0, [sp, 0x20]\n\ + bl GetFronterBrainSymbol\n\ + str r0, [sp, 0x24]\n\ + ldr r0, [sp, 0x20]\n\ + cmp r0, 0x1\n\ + bne _081A4E44\n\ + ldr r0, =0x000003fe\n\ + bl TrainerIdToDomeTournamentId\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + bl GetDomeTrainerMonCountInBits\n\ + adds r4, r0, 0\n\ + b _081A4E46\n\ + .pool\n\ +_081A4E44:\n\ + movs r4, 0x7\n\ +_081A4E46:\n\ + bl ZeroEnemyPartyMons\n\ + movs r1, 0\n\ + str r1, [sp, 0x18]\n\ + bl SetFacilityPtrsGetLevel\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + str r0, [sp, 0x1C]\n\ + movs r2, 0\n\ + str r2, [sp, 0x14]\n\ +_081A4E5C:\n\ + movs r0, 0x1\n\ + ands r0, r4\n\ + asrs r4, 1\n\ + str r4, [sp, 0x30]\n\ + ldr r3, [sp, 0x14]\n\ + adds r3, 0x1\n\ + str r3, [sp, 0x28]\n\ + cmp r0, 0\n\ + bne _081A4E70\n\ + b _081A4FC4\n\ +_081A4E70:\n\ + ldr r4, [sp, 0x14]\n\ + lsls r4, 2\n\ + mov r9, r4\n\ + ldr r0, [sp, 0x24]\n\ + lsls r0, 4\n\ + str r0, [sp, 0x38]\n\ + ldr r1, [sp, 0x20]\n\ + lsls r1, 4\n\ + str r1, [sp, 0x34]\n\ + ldr r2, [sp, 0x1C]\n\ + lsls r2, 24\n\ + str r2, [sp, 0x3C]\n\ + ldr r3, [sp, 0x18]\n\ + adds r3, 0x1\n\ + str r3, [sp, 0x2C]\n\ + ldr r0, [sp, 0x14]\n\ + add r0, r9\n\ + lsls r0, 2\n\ + mov r8, r0\n\ +_081A4E96:\n\ + bl Random\n\ + adds r4, r0, 0\n\ + bl Random\n\ + lsls r4, 16\n\ + lsrs r7, r4, 16\n\ + lsls r0, 16\n\ + orrs r7, r0\n\ + ldr r0, =0x0000ef2a\n\ + adds r1, r7, 0\n\ + bl IsShinyOtIdPersonality\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _081A4E96\n\ + ldr r4, [sp, 0x38]\n\ + ldr r1, [sp, 0x24]\n\ + subs r0, r4, r1\n\ + lsls r5, r0, 2\n\ + mov r2, r8\n\ + adds r4, r2, r5\n\ + ldr r3, [sp, 0x34]\n\ + ldr r1, [sp, 0x20]\n\ + subs r0, r3, r1\n\ + lsls r6, r0, 3\n\ + adds r4, r6\n\ + ldr r2, =sFrontierBrainsMons\n\ + adds r4, r2\n\ + adds r0, r7, 0\n\ + bl GetNatureFromPersonality\n\ + ldrb r1, [r4, 0x5]\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r1, r0\n\ + bne _081A4E96\n\ + ldr r4, [sp, 0x18]\n\ + movs r0, 0x64\n\ + adds r3, r4, 0\n\ + muls r3, r0\n\ + mov r8, r3\n\ + ldr r1, =gEnemyParty\n\ + add r1, r8\n\ + mov r10, r1\n\ + ldr r4, [sp, 0x14]\n\ + add r4, r9\n\ + lsls r4, 2\n\ + adds r0, r4, r5\n\ + adds r0, r6\n\ + ldr r2, =sFrontierBrainsMons\n\ + adds r0, r2\n\ + ldrh r1, [r0]\n\ + ldr r3, [sp, 0x3C]\n\ + lsrs r2, r3, 24\n\ + ldrb r3, [r0, 0x4]\n\ + movs r0, 0x1\n\ + str r0, [sp]\n\ + str r7, [sp, 0x4]\n\ + str r0, [sp, 0x8]\n\ + ldr r0, =0x0000ef2a\n\ + str r0, [sp, 0xC]\n\ + mov r0, r10\n\ + bl CreateMon\n\ + ldr r0, =sFrontierBrainsMons\n\ + adds r5, r0\n\ + adds r5, r6, r5\n\ + adds r4, r5, r4\n\ + adds r4, 0x2\n\ + mov r0, r10\n\ + movs r1, 0xC\n\ + adds r2, r4, 0\n\ + bl SetMonData\n\ + movs r7, 0\n\ + mov r6, r8\n\ + ldr r3, =gEnemyParty\n\ +_081A4F32:\n\ + adds r1, r7, 0\n\ + adds r1, 0x1A\n\ + ldr r0, [sp, 0x14]\n\ + add r0, r9\n\ + lsls r4, r0, 2\n\ + adds r2, r5, r4\n\ + adds r0, r7, 0x6\n\ + adds r2, r0\n\ + adds r0, r6, r3\n\ + str r3, [sp, 0x40]\n\ + bl SetMonData\n\ + adds r7, 0x1\n\ + ldr r3, [sp, 0x40]\n\ + cmp r7, 0x5\n\ + ble _081A4F32\n\ + movs r1, 0xFF\n\ + add r0, sp, 0x10\n\ + strb r1, [r0]\n\ + movs r7, 0\n\ + ldr r1, [sp, 0x18]\n\ + movs r2, 0x64\n\ + adds r6, r1, 0\n\ + muls r6, r2\n\ + ldr r3, =sFrontierBrainsMons + 0xC\n\ + mov r8, r3\n\ + ldr r3, =gEnemyParty\n\ + adds r5, r4, 0\n\ +_081A4F6A:\n\ + ldr r4, [sp, 0x38]\n\ + ldr r0, [sp, 0x24]\n\ + subs r1, r4, r0\n\ + lsls r1, 2\n\ + adds r1, r5, r1\n\ + ldr r2, [sp, 0x34]\n\ + ldr r4, [sp, 0x20]\n\ + subs r0, r2, r4\n\ + lsls r0, 3\n\ + adds r1, r0\n\ + add r1, r8\n\ + ldrh r4, [r1]\n\ + lsls r2, r7, 24\n\ + lsrs r2, 24\n\ + adds r0, r6, r3\n\ + adds r1, r4, 0\n\ + str r3, [sp, 0x40]\n\ + bl SetMonMoveSlot\n\ + ldr r3, [sp, 0x40]\n\ + cmp r4, 0xDA\n\ + bne _081A4F9C\n\ + movs r1, 0\n\ + add r0, sp, 0x10\n\ + strb r1, [r0]\n\ +_081A4F9C:\n\ + adds r5, 0x2\n\ + adds r7, 0x1\n\ + cmp r7, 0x3\n\ + ble _081A4F6A\n\ + ldr r0, [sp, 0x18]\n\ + movs r1, 0x64\n\ + adds r4, r0, 0\n\ + muls r4, r1\n\ + ldr r0, =gEnemyParty\n\ + adds r4, r0\n\ + adds r0, r4, 0\n\ + movs r1, 0x20\n\ + add r2, sp, 0x10\n\ + bl SetMonData\n\ + adds r0, r4, 0\n\ + bl CalculateMonStats\n\ + ldr r2, [sp, 0x2C]\n\ + str r2, [sp, 0x18]\n\ +_081A4FC4:\n\ + ldr r4, [sp, 0x30]\n\ + ldr r3, [sp, 0x28]\n\ + str r3, [sp, 0x14]\n\ + cmp r3, 0x2\n\ + bgt _081A4FD0\n\ + b _081A4E5C\n\ +_081A4FD0:\n\ + add sp, 0x44\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .pool\n\ +"); +} +#endif + +u16 GetFrontierBrainMonSpecies(u8 monId) +{ + s32 facility = VarGet(VAR_FRONTIER_FACILITY); + s32 symbol = GetFronterBrainSymbol(); + + return sFrontierBrainsMons[facility][symbol][monId].species; +} + +void SetFrontierBrainEventObjGfx(u8 facility) +{ + gTrainerBattleOpponent_A = TRAINER_FRONTIER_BRAIN; + VarSet(VAR_OBJ_GFX_ID_0, sFacilityToBrainEventObjGfx[facility][0]); +} + +u16 GetFrontierBrainMonMove(u8 monId, u8 moveSlotId) +{ + s32 facility = VarGet(VAR_FRONTIER_FACILITY); + s32 symbol = GetFronterBrainSymbol(); + + return sFrontierBrainsMons[facility][symbol][monId].moves[moveSlotId]; +} + +u8 GetFrontierBrainMonNature(u8 monId) +{ + s32 facility = VarGet(VAR_FRONTIER_FACILITY); + s32 symbol = GetFronterBrainSymbol(); + + return sFrontierBrainsMons[facility][symbol][monId].nature; +} + +u8 GetFrontierBrainMonEvs(u8 monId, u8 evStatId) +{ + s32 facility = VarGet(VAR_FRONTIER_FACILITY); + s32 symbol = GetFronterBrainSymbol(); + + return sFrontierBrainsMons[facility][symbol][monId].evs[evStatId]; +} + +s32 GetFronterBrainSymbol(void) +{ + s32 facility = VarGet(VAR_FRONTIER_FACILITY); + s32 symbol = GetPlayerSymbolCountForFacility(facility); + + if (symbol == 2) + { + u16 winStreak = GetCurrentFacilityWinStreak(); + if (winStreak + gUnknown_08611550[facility][3] == gUnknown_08611550[facility][0]) + symbol = 0; + else if (winStreak + gUnknown_08611550[facility][3] == gUnknown_08611550[facility][1]) + symbol = 1; + else if (winStreak + gUnknown_08611550[facility][3] > gUnknown_08611550[facility][1] + && (winStreak + gUnknown_08611550[facility][3] - gUnknown_08611550[facility][1]) % gUnknown_08611550[facility][2] == 0) + symbol = 1; + } + return symbol; +} + +static void CopyFrontierBrainText(bool8 playerWonText) +{ + s32 facility; + s32 symbol; + + if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) + { + facility = GetRecordedBattleFrontierFacility(); + symbol = GetRecordedBattleFronterBrainSymbol(); + } + else + { + facility = VarGet(VAR_FRONTIER_FACILITY); + symbol = GetFronterBrainSymbol(); + } + + switch (playerWonText) + { + case FALSE: + StringCopy(gStringVar4, gUnknown_08611DB0[symbol][facility]); + break; + case TRUE: + StringCopy(gStringVar4, gUnknown_08611DB8[symbol][facility]); + break; + } +} diff --git a/src/item_menu.c b/src/item_menu.c index 64c8036dd..0c3e26354 100755 --- a/src/item_menu.c +++ b/src/item_menu.c @@ -2,7 +2,7 @@ #include "item_menu.h" #include "battle.h" #include "battle_controllers.h" -#include "battle_frontier_2.h" +#include "frontier_util.h" #include "berry_tag_screen.h" #include "bg.h" #include "constants/items.h" @@ -48,6 +48,8 @@ #include "window.h" #include "apprentice.h" +extern bool8 InBattlePike(void); + void GoToBagMenu(u8 bagMenuType, u8 pocketId, void ( *postExitMenuMainCallback2)()); void CB2_Bag(void); bool8 setup_bag_menu(void); diff --git a/src/new_game.c b/src/new_game.c index 127e48c35..cdabd5ccc 100644 --- a/src/new_game.c +++ b/src/new_game.c @@ -26,6 +26,7 @@ #include "item.h" #include "pokedex.h" #include "apprentice.h" +#include "frontier_util.h" extern u8 gDifferentSaveFile; extern u16 gSaveFileStatus; @@ -45,7 +46,6 @@ extern void NewGameInitPCItems(void); extern void ClearDecorationInventories(void); extern void ResetFanClub(void); extern void copy_strings_to_sav1(void); -extern void sub_81A4B14(void); extern void sub_8195E10(void); extern void sub_801AFD8(void); extern void sub_800E5AC(void); @@ -69,30 +69,30 @@ static const struct ContestWinner sContestWinnerPicDummy = }; // code -void WriteUnalignedWord(u32 var, u8 *dataPtr) +void SetTrainerId(u32 trainerId, u8 *dst) { - dataPtr[0] = var; - dataPtr[1] = var >> 8; - dataPtr[2] = var >> 16; - dataPtr[3] = var >> 24; + dst[0] = trainerId; + dst[1] = trainerId >> 8; + dst[2] = trainerId >> 16; + dst[3] = trainerId >> 24; } -u32 ReadUnalignedWord(u8* dataPtr) +u32 GetTrainerId(u8 *trainerId) { - return (dataPtr[3] << 24) | (dataPtr[2] << 16) | (dataPtr[1] << 8) | (dataPtr[0]); + return (trainerId[3] << 24) | (trainerId[2] << 16) | (trainerId[1] << 8) | (trainerId[0]); } -void CopyUnalignedWord(u8 *copyTo, u8 *copyFrom) +void CopyTrainerId(u8 *dst, u8 *src) { s32 i; for (i = 0; i < 4; i++) - copyTo[i] = copyFrom[i]; + dst[i] = src[i]; } static void InitPlayerTrainerId(void) { u32 trainerId = (Random() << 0x10) | GetGeneratedTrainerIdLower(); - WriteUnalignedWord(trainerId, gSaveBlock2Ptr->playerTrainerId); + SetTrainerId(trainerId, gSaveBlock2Ptr->playerTrainerId); } // L=A isnt set here for some reason. @@ -204,7 +204,7 @@ void NewGameInitData(void) copy_strings_to_sav1(); SetLilycoveLady(); ResetAllApprenticeData(); - sub_81A4B14(); + ClearRankingHallRecords(); sub_8195E10(); sub_801AFD8(); sub_800E5AC(); diff --git a/src/overworld.c b/src/overworld.c index 8d73a6680..cc945dea2 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -52,6 +52,7 @@ #include "tv.h" #include "scanline_effect.h" #include "wild_encounter.h" +#include "frontier_util.h" #include "constants/abilities.h" #include "constants/map_types.h" #include "constants/maps.h" @@ -136,7 +137,6 @@ extern void sub_8087D74(void); extern void battle_pyramid_map_load_related(u8); extern void sub_80B00E8(u8); extern void sub_80E9238(u8); -extern void sub_81A3908(void); extern void sub_81AA2F8(void); extern void sub_8195E10(void); extern void sub_80EDB44(void); diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index e1c2c79eb..11f46b475 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -2,7 +2,7 @@ #include "main.h" #include "battle.h" #include "battle_anim.h" -#include "battle_frontier_2.h" +#include "frontier_util.h" #include "battle_message.h" #include "battle_tent.h" #include "bg.h" @@ -45,6 +45,8 @@ #include "constants/songs.h" #include "constants/species.h" +extern bool8 sub_81A6BF4(void); + static EWRAM_DATA struct UnkSummaryStruct { /*0x00*/ union { diff --git a/src/record_mixing.c b/src/record_mixing.c index 4bb97cf1d..5f1aef1df 100644 --- a/src/record_mixing.c +++ b/src/record_mixing.c @@ -33,31 +33,17 @@ #include "new_game.h" #include "daycare.h" #include "international_string_util.h" +#include "constants/battle_frontier.h" extern void ReceiveSecretBasesData(struct SecretBaseRecord *, size_t, u8); extern void ReceiveEasyChatPairsData(struct EasyChatPair *, size_t, u8); // Static type declarations -struct UnknownRecMixingStruct +struct RecordMixingHallRecords { - u32 field_0; - u16 field_4; - u8 field_6[9]; -}; - -struct UnknownRecMixingStruct2 -{ - u32 field_0; - u16 field_4; - u16 field_6; - u16 field_8; - u8 field_A[16]; -}; - -struct UnknownRecMixingStruct3 -{ - u8 field_0[0x810]; + struct RankingHall1P hallRecords1P[HALL_FACILITIES_COUNT][2][6]; + struct RankingHall2P hallRecords2P[2][6]; }; struct PlayerRecordsRS @@ -85,7 +71,7 @@ struct PlayerRecordsEmerald /* 0x1210 */ u16 giftItem; /* 0x1214 */ LilycoveLady lilycoveLady; /* 0x1254 */ struct Apprentice apprentice[2]; - /* 0x12dc */ struct UnkRecordMixingStruct2 unk_12dc; + /* 0x12dc */ struct PlayerHallRecords hallRecords; /* 0x1434 */ u8 field_1434[0x10]; }; // 0x1444 @@ -106,12 +92,12 @@ static IWRAM_DATA struct EasyChatPair *sEasyChatPairsSave; static IWRAM_DATA struct RecordMixingDayCareMail *gUnknown_03001148; static IWRAM_DATA void *sBattleTowerSave; static IWRAM_DATA LilycoveLady *sLilycoveLadySave; -static IWRAM_DATA void *gUnknown_03001154; // gSaveBlock2Ptr->field_0DC; +static IWRAM_DATA void *sApprenticesSave; static IWRAM_DATA void *sBattleTowerSave_Duplicate; static IWRAM_DATA u32 sRecordStructSize; static IWRAM_DATA u8 gUnknown_03001160; static IWRAM_DATA u32 filler_03001164; -static IWRAM_DATA u32 gUnknown_03001168[3]; +static IWRAM_DATA struct PlayerHallRecords *gUnknown_03001168[3]; static EWRAM_DATA struct RecordMixingDayCareMail gUnknown_02039F9C = {0}; static EWRAM_DATA union PlayerRecords *sReceivedRecords = NULL; @@ -137,7 +123,7 @@ static void ReceiveGiftItem(u16 *item, u8 which); static void sub_80E7FF8(u8 taskId); static void sub_80E8110(struct Apprentice *arg0, struct Apprentice *arg1); static void ReceiveApprenticeData(struct Apprentice *arg0, size_t arg1, u32 arg2); -static void sub_80E89AC(struct UnkRecordMixingStruct2 *arg0, size_t arg1, u32 arg2); +static void ReceiveRankingHallRecords(struct PlayerHallRecords *hallRecords, size_t arg1, u32 arg2); static void sub_80E89F8(struct RecordMixingDayCareMail *dst); static void SanitizeDayCareMailForRuby(struct RecordMixingDayCareMail *src); static void SanitizeEmeraldBattleTowerRecord(struct EmeraldBattleTowerRecord *arg0); @@ -200,7 +186,7 @@ static void SetSrcLookupPointers(void) gUnknown_03001148 = &gUnknown_02039F9C; sBattleTowerSave = &gSaveBlock2Ptr->frontier.towerPlayer; sLilycoveLadySave = &gSaveBlock1Ptr->lilycoveLady; - gUnknown_03001154 = gSaveBlock2Ptr->apprentices; + sApprenticesSave = gSaveBlock2Ptr->apprentices; sBattleTowerSave_Duplicate = &gSaveBlock2Ptr->frontier.towerPlayer; } @@ -266,8 +252,8 @@ static void PrepareExchangePacket(void) if (GetMultiplayerId() == 0) sSentRecord->emerald.giftItem = GetRecordMixingGift(); - sub_80E8110(sSentRecord->emerald.apprentice, gUnknown_03001154); - sub_80E8260(&sSentRecord->emerald.unk_12dc); + sub_80E8110(sSentRecord->emerald.apprentice, sApprenticesSave); + GetPlayerHallRecords(&sSentRecord->emerald.hallRecords); } } @@ -300,7 +286,7 @@ static void ReceiveExchangePacket(u32 which) ReceiveGiftItem(&sReceivedRecords->emerald.giftItem, which); ReceiveLilycoveLadyData(&sReceivedRecords->emerald.lilycoveLady, sizeof(struct PlayerRecordsEmerald), which); ReceiveApprenticeData(sReceivedRecords->emerald.apprentice, sizeof(struct PlayerRecordsEmerald), (u8) which); - sub_80E89AC(&sReceivedRecords->emerald.unk_12dc, sizeof(struct PlayerRecordsEmerald), (u8) which); + ReceiveRankingHallRecords(&sReceivedRecords->emerald.hallRecords, sizeof(struct PlayerRecordsEmerald), (u8) which); } } @@ -1571,12 +1557,12 @@ static void sub_80E8110(struct Apprentice *dst, struct Apprentice *src) id = ((i + gSaveBlock2Ptr->playerApprentice.field_B2_1) % 3) + 1; if (src[id].playerName[0] != EOS) { - if (ReadUnalignedWord(src[id].playerId) != ReadUnalignedWord(gSaveBlock2Ptr->playerTrainerId)) + if (GetTrainerId(src[id].playerId) != GetTrainerId(gSaveBlock2Ptr->playerTrainerId)) { r8++; var_2C = id; } - if (ReadUnalignedWord(src[id].playerId) == ReadUnalignedWord(gSaveBlock2Ptr->playerTrainerId)) + if (GetTrainerId(src[id].playerId) == GetTrainerId(gSaveBlock2Ptr->playerTrainerId)) { var_24++; var_28 = id; @@ -1608,42 +1594,42 @@ static void sub_80E8110(struct Apprentice *dst, struct Apprentice *src) } } -void sub_80E8260(struct UnkRecordMixingStruct2 *dst) +void GetPlayerHallRecords(struct PlayerHallRecords *dst) { s32 i, j; - for (i = 0; i < 9; i++) + for (i = 0; i < HALL_FACILITIES_COUNT; i++) { for (j = 0; j < 2; j++) { - CopyUnalignedWord(dst->field_0[i][j].playerId, gSaveBlock2Ptr->playerTrainerId); - dst->field_0[i][j].language = GAME_LANGUAGE; - StringCopy(dst->field_0[i][j].playerName, gSaveBlock2Ptr->playerName); + CopyTrainerId(dst->onePlayer[i][j].id, gSaveBlock2Ptr->playerTrainerId); + dst->onePlayer[i][j].language = GAME_LANGUAGE; + StringCopy(dst->onePlayer[i][j].name, gSaveBlock2Ptr->playerName); } } for (j = 0; j < 2; j++) { - dst->field_120[j].language = GAME_LANGUAGE; - CopyUnalignedWord(dst->field_120[j].playerId1, gSaveBlock2Ptr->playerTrainerId); - CopyUnalignedWord(dst->field_120[j].playerId2, gSaveBlock2Ptr->frontier.field_EF1[j]); - StringCopy(dst->field_120[j].playerName1, gSaveBlock2Ptr->playerName); - StringCopy(dst->field_120[j].playerName2, gSaveBlock2Ptr->frontier.field_EE1[j]); + dst->twoPlayers[j].language = GAME_LANGUAGE; + CopyTrainerId(dst->twoPlayers[j].id1, gSaveBlock2Ptr->playerTrainerId); + CopyTrainerId(dst->twoPlayers[j].id2, gSaveBlock2Ptr->frontier.field_EF1[j]); + StringCopy(dst->twoPlayers[j].name1, gSaveBlock2Ptr->playerName); + StringCopy(dst->twoPlayers[j].name2, gSaveBlock2Ptr->frontier.field_EE1[j]); } for (i = 0; i < 2; i++) { - dst->field_0[0][i].field_4 = gSaveBlock2Ptr->frontier.field_CF0[i]; - dst->field_0[1][i].field_4 = gSaveBlock2Ptr->frontier.field_CF4[i]; - dst->field_0[2][i].field_4 = gSaveBlock2Ptr->frontier.field_CF8[i]; - dst->field_0[3][i].field_4 = gSaveBlock2Ptr->frontier.field_D14[0][i]; - dst->field_0[4][i].field_4 = gSaveBlock2Ptr->frontier.field_DD0[0][i]; - dst->field_0[5][i].field_4 = gSaveBlock2Ptr->frontier.field_DDE[i]; - dst->field_0[6][i].field_4 = gSaveBlock2Ptr->frontier.field_DEA[i]; - dst->field_0[7][i].field_4 = gSaveBlock2Ptr->frontier.field_E08[i]; - dst->field_0[8][i].field_4 = gSaveBlock2Ptr->frontier.field_E1E[i]; - - dst->field_120[i].field_8 = gSaveBlock2Ptr->frontier.field_CFC[i]; + dst->onePlayer[0][i].winStreak = gSaveBlock2Ptr->frontier.towerRecordWinStreaks[FRONTIER_MODE_SINGLES][i]; + dst->onePlayer[1][i].winStreak = gSaveBlock2Ptr->frontier.towerRecordWinStreaks[FRONTIER_MODE_DOUBLES][i]; + dst->onePlayer[2][i].winStreak = gSaveBlock2Ptr->frontier.towerRecordWinStreaks[FRONTIER_MODE_MULTIS][i]; + dst->onePlayer[3][i].winStreak = gSaveBlock2Ptr->frontier.domeRecordWinStreaks[FRONTIER_MODE_SINGLES][i]; + dst->onePlayer[4][i].winStreak = gSaveBlock2Ptr->frontier.palaceRecordWinStreaks[FRONTIER_MODE_SINGLES][i]; + dst->onePlayer[5][i].winStreak = gSaveBlock2Ptr->frontier.arenaRecordStreaks[i]; + dst->onePlayer[6][i].winStreak = gSaveBlock2Ptr->frontier.factoryRecordWinStreaks[FRONTIER_MODE_SINGLES][i]; + dst->onePlayer[7][i].winStreak = gSaveBlock2Ptr->frontier.pikeRecordStreaks[i]; + dst->onePlayer[8][i].winStreak = gSaveBlock2Ptr->frontier.pyramidRecordStreaks[i]; + + dst->twoPlayers[i].winStreak = gSaveBlock2Ptr->frontier.towerRecordWinStreaks[FRONTIER_MODE_LINK_MULTIS][i]; } } @@ -1653,7 +1639,7 @@ static bool32 sub_80E841C(struct Apprentice *arg0, struct Apprentice *arg1) for (i = 0; i < 4; i++) { - if (ReadUnalignedWord(arg0->playerId) == ReadUnalignedWord(arg1[i].playerId) + if (GetTrainerId(arg0->playerId) == GetTrainerId(arg1[i].playerId) && arg0->number == arg1[i].number) { return TRUE; @@ -1701,538 +1687,144 @@ static void ReceiveApprenticeData(struct Apprentice *arg0, size_t arg1, u32 arg2 } } -NAKED -static void sub_80E8578(struct UnknownRecMixingStruct3 *arg0, struct UnkRecordMixingStruct2 *arg1, size_t arg2, u32 arg3, u32 arg4) +static void sub_80E8578(struct RecordMixingHallRecords *dst, void *hallRecords, size_t recordSize, u32 arg3, s32 linkPlayerCount) { - asm_unified(" push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x54\n\ - str r0, [sp]\n\ - ldr r0, [sp, 0x74]\n\ - movs r4, 0\n\ - mov r8, r4\n\ - movs r5, 0\n\ - str r5, [sp, 0x4]\n\ - ldr r4, =gUnknown_03001168\n\ - b _080E85A0\n\ - .pool\n\ -_080E8598:\n\ - adds r1, r2\n\ - ldr r6, [sp, 0x4]\n\ - adds r6, 0x1\n\ - str r6, [sp, 0x4]\n\ -_080E85A0:\n\ - ldr r5, [sp, 0x4]\n\ - cmp r5, r0\n\ - bge _080E85B6\n\ - cmp r5, r3\n\ - beq _080E85B0\n\ - stm r4!, {r1}\n\ - movs r6, 0x1\n\ - add r8, r6\n\ -_080E85B0:\n\ - mov r5, r8\n\ - cmp r5, 0x3\n\ - bne _080E8598\n\ -_080E85B6:\n\ - movs r6, 0\n\ - str r6, [sp, 0x4]\n\ - subs r0, 0x1\n\ - str r0, [sp, 0x24]\n\ -_080E85BE:\n\ - movs r0, 0\n\ - str r0, [sp, 0x8]\n\ - ldr r1, [sp, 0x4]\n\ - adds r1, 0x1\n\ - str r1, [sp, 0x28]\n\ - ldr r2, [sp, 0x4]\n\ - lsls r2, 1\n\ - str r2, [sp, 0x34]\n\ - ldr r3, [sp, 0x4]\n\ - adds r3, r2, r3\n\ - str r3, [sp, 0x10]\n\ - movs r4, 0\n\ - str r4, [sp, 0x44]\n\ - movs r5, 0\n\ - str r5, [sp, 0x48]\n\ -_080E85DC:\n\ - movs r6, 0\n\ - mov r8, r6\n\ - ldr r0, =gSaveBlock2Ptr\n\ - ldr r1, [r0]\n\ - ldr r2, [sp, 0x10]\n\ - lsls r0, r2, 5\n\ - ldr r3, [sp, 0x48]\n\ - adds r0, r3, r0\n\ - adds r3, r0, r1\n\ - lsls r0, r2, 6\n\ - ldr r4, [sp, 0x44]\n\ - adds r0, r4, r0\n\ - ldr r5, [sp]\n\ - adds r2, r0, r5\n\ -_080E85F8:\n\ - adds r0, r2, 0\n\ - movs r6, 0x87\n\ - lsls r6, 2\n\ - adds r1, r3, r6\n\ - ldm r1!, {r4-r6}\n\ - stm r0!, {r4-r6}\n\ - ldr r1, [r1]\n\ - str r1, [r0]\n\ - adds r3, 0x10\n\ - adds r2, 0x10\n\ - movs r0, 0x1\n\ - add r8, r0\n\ - mov r1, r8\n\ - cmp r1, 0x2\n\ - ble _080E85F8\n\ - movs r2, 0\n\ - mov r8, r2\n\ - ldr r3, [sp, 0x24]\n\ - cmp r8, r3\n\ - bge _080E86DC\n\ - ldr r4, [sp, 0x4]\n\ - lsls r4, 5\n\ - mov r9, r4\n\ - ldr r5, [sp, 0x8]\n\ - lsls r7, r5, 4\n\ - ldr r6, [sp, 0x34]\n\ - ldr r1, [sp, 0x4]\n\ - adds r0, r6, r1\n\ - lsls r0, 6\n\ - str r0, [sp, 0x14]\n\ - ldr r2, [sp]\n\ - adds r0, r2, r0\n\ - ldr r3, [sp, 0x44]\n\ - str r3, [sp, 0x18]\n\ - adds r0, r3\n\ - str r0, [sp, 0x1C]\n\ - ldr r4, [sp, 0x14]\n\ - adds r0, r3, r4\n\ - adds r0, r2\n\ - adds r0, 0x30\n\ - mov r10, r0\n\ -_080E864A:\n\ - movs r5, 0\n\ - str r5, [sp, 0xC]\n\ - movs r3, 0\n\ - mov r6, r8\n\ - lsls r6, 2\n\ - str r6, [sp, 0x38]\n\ - ldr r1, [sp, 0x18]\n\ - ldr r2, [sp, 0x14]\n\ - adds r0, r1, r2\n\ - ldr r4, [sp]\n\ - adds r5, r0, r4\n\ - ldr r0, =gUnknown_03001168\n\ - adds r0, r6, r0\n\ - str r0, [sp, 0x50]\n\ -_080E8666:\n\ - lsls r0, r3, 4\n\ - ldr r6, [sp, 0x1C]\n\ - adds r0, r6, r0\n\ - str r3, [sp, 0x4C]\n\ - bl ReadUnalignedWord\n\ - adds r4, r0, 0\n\ - ldr r1, [sp, 0x50]\n\ - ldr r0, [r1]\n\ - add r0, r9\n\ - adds r0, r7\n\ - bl ReadUnalignedWord\n\ - ldr r3, [sp, 0x4C]\n\ - cmp r4, r0\n\ - bne _080E86A8\n\ - ldr r2, [sp, 0xC]\n\ - adds r2, 0x1\n\ - str r2, [sp, 0xC]\n\ - ldr r4, [sp, 0x50]\n\ - ldr r0, [r4]\n\ - mov r6, r9\n\ - adds r1, r7, r6\n\ - adds r1, r0, r1\n\ - ldrh r0, [r5, 0x4]\n\ - ldrh r2, [r1, 0x4]\n\ - cmp r0, r2\n\ - bcs _080E86A8\n\ - adds r0, r5, 0\n\ - ldm r1!, {r2,r4,r6}\n\ - stm r0!, {r2,r4,r6}\n\ - ldr r1, [r1]\n\ - str r1, [r0]\n\ -_080E86A8:\n\ - adds r5, 0x10\n\ - adds r3, 0x1\n\ - cmp r3, 0x2\n\ - ble _080E8666\n\ - ldr r3, [sp, 0xC]\n\ - cmp r3, 0\n\ - bne _080E86CE\n\ - ldr r0, =gUnknown_03001168\n\ - ldr r4, [sp, 0x38]\n\ - adds r0, r4, r0\n\ - ldr r0, [r0]\n\ - mov r5, r9\n\ - adds r2, r7, r5\n\ - mov r1, r10\n\ - adds r0, r2\n\ - ldm r0!, {r2,r3,r6}\n\ - stm r1!, {r2,r3,r6}\n\ - ldr r0, [r0]\n\ - str r0, [r1]\n\ -_080E86CE:\n\ - movs r4, 0x10\n\ - add r10, r4\n\ - movs r5, 0x1\n\ - add r8, r5\n\ - ldr r6, [sp, 0x24]\n\ - cmp r8, r6\n\ - blt _080E864A\n\ -_080E86DC:\n\ - ldr r0, [sp, 0x44]\n\ - adds r0, 0x60\n\ - str r0, [sp, 0x44]\n\ - ldr r1, [sp, 0x48]\n\ - adds r1, 0x30\n\ - str r1, [sp, 0x48]\n\ - ldr r2, [sp, 0x8]\n\ - adds r2, 0x1\n\ - str r2, [sp, 0x8]\n\ - cmp r2, 0x1\n\ - bgt _080E86F4\n\ - b _080E85DC\n\ -_080E86F4:\n\ - ldr r3, [sp, 0x28]\n\ - str r3, [sp, 0x4]\n\ - cmp r3, 0x8\n\ - bgt _080E86FE\n\ - b _080E85BE\n\ -_080E86FE:\n\ - movs r4, 0\n\ - str r4, [sp, 0x8]\n\ -_080E8702:\n\ - ldr r5, [sp, 0x8]\n\ - adds r5, 0x1\n\ - str r5, [sp, 0x2C]\n\ - ldr r0, =gSaveBlock2Ptr\n\ - ldr r1, [r0]\n\ - movs r0, 0x54\n\ - ldr r6, [sp, 0x8]\n\ - muls r0, r6\n\ - adds r3, r0, r1\n\ - movs r0, 0xA8\n\ - muls r0, r6\n\ - ldr r1, [sp]\n\ - adds r2, r0, r1\n\ - movs r4, 0x2\n\ - mov r8, r4\n\ -_080E8720:\n\ - movs r5, 0xD8\n\ - lsls r5, 3\n\ - adds r0, r2, r5\n\ - ldr r6, =0x0000057c\n\ - adds r1, r3, r6\n\ - ldm r1!, {r4-r6}\n\ - stm r0!, {r4-r6}\n\ - ldm r1!, {r4-r6}\n\ - stm r0!, {r4-r6}\n\ - ldr r1, [r1]\n\ - str r1, [r0]\n\ - adds r3, 0x1C\n\ - adds r2, 0x1C\n\ - movs r0, 0x1\n\ - negs r0, r0\n\ - add r8, r0\n\ - mov r1, r8\n\ - cmp r1, 0\n\ - bge _080E8720\n\ - movs r2, 0\n\ - mov r8, r2\n\ - ldr r3, [sp, 0x24]\n\ - cmp r8, r3\n\ - blt _080E8752\n\ - b _080E885A\n\ -_080E8752:\n\ - ldr r4, [sp, 0x8]\n\ - lsls r1, r4, 3\n\ - movs r0, 0xA8\n\ - adds r5, r4, 0\n\ - muls r5, r0\n\ - str r5, [sp, 0x20]\n\ - str r5, [sp, 0x3C]\n\ - subs r1, r4\n\ - lsls r1, 2\n\ - mov r10, r1\n\ -_080E8766:\n\ - movs r6, 0\n\ - str r6, [sp, 0xC]\n\ - mov r0, r8\n\ - lsls r0, 2\n\ - str r0, [sp, 0x38]\n\ - mov r1, r8\n\ - adds r1, 0x1\n\ - str r1, [sp, 0x30]\n\ - ldr r0, =gUnknown_03001168\n\ - ldr r2, [sp, 0x38]\n\ - adds r2, r0\n\ - mov r9, r2\n\ - ldr r3, [sp]\n\ - movs r4, 0xD8\n\ - lsls r4, 3\n\ - adds r0, r3, r4\n\ - ldr r5, [sp, 0x3C]\n\ - adds r7, r5, r0\n\ - str r6, [sp, 0x40]\n\ - movs r3, 0x2\n\ -_080E878E:\n\ - ldr r1, [sp, 0x20]\n\ - movs r2, 0xD8\n\ - lsls r2, 3\n\ - adds r0, r1, r2\n\ - ldr r4, [sp]\n\ - adds r0, r4, r0\n\ - ldr r6, [sp, 0x40]\n\ - adds r5, r0, r6\n\ - adds r0, r5, 0\n\ - str r3, [sp, 0x4C]\n\ - bl ReadUnalignedWord\n\ - adds r4, r0, 0\n\ - movs r6, 0x90\n\ - lsls r6, 1\n\ - add r6, r10\n\ - mov r1, r9\n\ - ldr r0, [r1]\n\ - adds r0, r6\n\ - bl ReadUnalignedWord\n\ - ldr r3, [sp, 0x4C]\n\ - cmp r4, r0\n\ - bne _080E8808\n\ - adds r0, r5, 0x4\n\ - bl ReadUnalignedWord\n\ - adds r4, r0, 0\n\ - mov r2, r9\n\ - ldr r0, [r2]\n\ - adds r0, r6\n\ - adds r0, 0x4\n\ - bl ReadUnalignedWord\n\ - ldr r3, [sp, 0x4C]\n\ - cmp r4, r0\n\ - bne _080E8808\n\ - ldr r4, [sp, 0xC]\n\ - adds r4, 0x1\n\ - str r4, [sp, 0xC]\n\ - mov r5, r9\n\ - ldr r0, [r5]\n\ - mov r6, r10\n\ - adds r2, r0, r6\n\ - movs r0, 0x94\n\ - lsls r0, 1\n\ - adds r1, r2, r0\n\ - ldrh r0, [r7, 0x8]\n\ - ldrh r1, [r1]\n\ - cmp r0, r1\n\ - bcs _080E8808\n\ - adds r0, r7, 0\n\ - movs r4, 0x90\n\ - lsls r4, 1\n\ - adds r1, r2, r4\n\ - ldm r1!, {r2,r5,r6}\n\ - stm r0!, {r2,r5,r6}\n\ - ldm r1!, {r4-r6}\n\ - stm r0!, {r4-r6}\n\ - ldr r1, [r1]\n\ - str r1, [r0]\n\ -_080E8808:\n\ - adds r7, 0x1C\n\ - ldr r0, [sp, 0x40]\n\ - adds r0, 0x1C\n\ - str r0, [sp, 0x40]\n\ - subs r3, 0x1\n\ - cmp r3, 0\n\ - bge _080E878E\n\ - ldr r1, [sp, 0xC]\n\ - cmp r1, 0\n\ - bne _080E8850\n\ - mov r0, r8\n\ - adds r0, 0x3\n\ - lsls r1, r0, 3\n\ - subs r1, r0\n\ - lsls r1, 2\n\ - ldr r2, [sp, 0x20]\n\ - adds r1, r2\n\ - ldr r3, [sp]\n\ - adds r1, r3, r1\n\ - ldr r0, =gUnknown_03001168\n\ - ldr r4, [sp, 0x38]\n\ - adds r0, r4, r0\n\ - ldr r0, [r0]\n\ - add r0, r10\n\ - movs r5, 0xD8\n\ - lsls r5, 3\n\ - adds r1, r5\n\ - movs r6, 0x90\n\ - lsls r6, 1\n\ - adds r0, r6\n\ - ldm r0!, {r2-r4}\n\ - stm r1!, {r2-r4}\n\ - ldm r0!, {r2,r5,r6}\n\ - stm r1!, {r2,r5,r6}\n\ - ldr r0, [r0]\n\ - str r0, [r1]\n\ -_080E8850:\n\ - ldr r3, [sp, 0x30]\n\ - mov r8, r3\n\ - ldr r4, [sp, 0x24]\n\ - cmp r8, r4\n\ - blt _080E8766\n\ -_080E885A:\n\ - ldr r5, [sp, 0x2C]\n\ - str r5, [sp, 0x8]\n\ - cmp r5, 0x1\n\ - bgt _080E8864\n\ - b _080E8702\n\ -_080E8864:\n\ - add sp, 0x54\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .pool\n\ - "); + s32 i, j, k, l; + s32 var_68; + + k = 0; + i = 0; + while (1) + { + if (i >= linkPlayerCount) + break; + if (i != arg3) + gUnknown_03001168[k++] = hallRecords; + + if (k == 3) + break; + hallRecords += recordSize; + i++; + } + + for (i = 0; i < HALL_FACILITIES_COUNT; i++) + { + for (j = 0; j < 2; j++) + { + for (k = 0; k < 3; k++) + dst->hallRecords1P[i][j][k] = gSaveBlock2Ptr->hallRecords1P[i][j][k]; + + for (k = 0; k < linkPlayerCount - 1; k++) + { + var_68 = 0; + for (l = 0; l < 3; l++) + { + if (GetTrainerId(dst->hallRecords1P[i][j][l].id) == GetTrainerId(gUnknown_03001168[k]->onePlayer[i][j].id)) + { + var_68++; + if (dst->hallRecords1P[i][j][l].winStreak < gUnknown_03001168[k]->onePlayer[i][j].winStreak) + dst->hallRecords1P[i][j][l] = gUnknown_03001168[k]->onePlayer[i][j]; + } + } + if (var_68 == 0) + dst->hallRecords1P[i][j][k + 3] = gUnknown_03001168[k]->onePlayer[i][j]; + } + } + } + + for (j = 0; j < 2; j++) + { + for (k = 0; k < 3; k++) + dst->hallRecords2P[j][k] = gSaveBlock2Ptr->hallRecords2P[j][k]; + + for (k = 0; k < linkPlayerCount - 1; k++) + { + var_68 = 0; + for (l = 0; l < 3; l++) + { + if (GetTrainerId(dst->hallRecords2P[j][l].id1) == GetTrainerId(gUnknown_03001168[k]->twoPlayers[j].id1) + && GetTrainerId(dst->hallRecords2P[j][l].id2) == GetTrainerId(gUnknown_03001168[k]->twoPlayers[j].id2)) + { + var_68++; + if (dst->hallRecords2P[j][l].winStreak < gUnknown_03001168[k]->twoPlayers[j].winStreak) + dst->hallRecords2P[j][l] = gUnknown_03001168[k]->twoPlayers[j]; + } + } + if (var_68 == 0) + dst->hallRecords2P[j][k + 3] = gUnknown_03001168[k]->twoPlayers[j]; + } + } } -static void sub_80E8880(struct UnknownRecMixingStruct *arg0, struct UnknownRecMixingStruct *arg1) +static void sub_80E8880(struct RankingHall1P *arg0, struct RankingHall1P *arg1) { s32 i, j; for (i = 0; i < 3; i++) { - s32 r2 = 0; - s32 r4 = -1; + s32 highestWinStreak = 0; + s32 highestId = -1; for (j = 0; j < 6; j++) { - if (arg1[j].field_4 > r2) + if (arg1[j].winStreak > highestWinStreak) { - r4 = j; - r2 = arg1[j].field_4; + highestId = j; + highestWinStreak = arg1[j].winStreak; } } - if (r4 >= 0) + if (highestId >= 0) { - arg0[i] = arg1[r4]; - arg1[r4].field_4 = 0; + arg0[i] = arg1[highestId]; + arg1[highestId].winStreak = 0; } } } -static void sub_80E88CC(struct UnknownRecMixingStruct2 *arg0, struct UnknownRecMixingStruct2 *arg1) +static void sub_80E88CC(struct RankingHall2P *arg0, struct RankingHall2P *arg1) { s32 i, j; for (i = 0; i < 3; i++) { - s32 r2 = 0; - s32 r4 = -1; + s32 highestWinStreak = 0; + s32 highestId = -1; for (j = 0; j < 6; j++) { - if (arg1[j].field_8 > r2) + if (arg1[j].winStreak > highestWinStreak) { - r4 = j; - r2 = arg1[j].field_8; + highestId = j; + highestWinStreak = arg1[j].winStreak; } } - if (r4 >= 0) + if (highestId >= 0) { - arg0[i] = arg1[r4]; - arg1[r4].field_8 = 0; + arg0[i] = arg1[highestId]; + arg1[highestId].winStreak = 0; } } } -NAKED -static void sub_80E8924(struct UnknownRecMixingStruct3 *arg0) +static void sub_80E8924(struct RecordMixingHallRecords *arg0) { - asm_unified("push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - mov r9, r0\n\ - movs r0, 0\n\ - ldr r1, =gSaveBlock2Ptr\n\ - mov r10, r1\n\ -_080E8936:\n\ - lsls r1, r0, 1\n\ - adds r2, r0, 0x1\n\ - mov r8, r2\n\ - adds r1, r0\n\ - lsls r0, r1, 5\n\ - movs r2, 0x87\n\ - lsls r2, 2\n\ - adds r7, r0, r2\n\ - lsls r1, 6\n\ - mov r0, r9\n\ - adds r4, r0, r1\n\ - movs r6, 0\n\ - movs r5, 0x1\n\ -_080E8950:\n\ - mov r1, r10\n\ - ldr r0, [r1]\n\ - adds r0, r7\n\ - adds r0, r6\n\ - adds r1, r4, 0\n\ - bl sub_80E8880\n\ - adds r4, 0x60\n\ - adds r6, 0x30\n\ - subs r5, 0x1\n\ - cmp r5, 0\n\ - bge _080E8950\n\ - mov r0, r8\n\ - cmp r0, 0x8\n\ - ble _080E8936\n\ - movs r5, 0\n\ - ldr r4, =gSaveBlock2Ptr\n\ -_080E8972:\n\ - movs r0, 0x54\n\ - adds r1, r5, 0\n\ - muls r1, r0\n\ - ldr r2, =0x0000057c\n\ - adds r1, r2\n\ - ldr r0, [r4]\n\ - adds r0, r1\n\ - movs r1, 0xA8\n\ - muls r1, r5\n\ - movs r2, 0xD8\n\ - lsls r2, 3\n\ - adds r1, r2\n\ - add r1, r9\n\ - bl sub_80E88CC\n\ - adds r5, 0x1\n\ - cmp r5, 0x1\n\ - ble _080E8972\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .pool"); + s32 i, j; + + for (i = 0; i < HALL_FACILITIES_COUNT; i++) + { + for (j = 0; j < 2; j++) + sub_80E8880(gSaveBlock2Ptr->hallRecords1P[i][j], arg0->hallRecords1P[i][j]); + } + for (j = 0; j < 2; j++) + sub_80E88CC(gSaveBlock2Ptr->hallRecords2P[j], arg0->hallRecords2P[j]); } -static void sub_80E89AC(struct UnkRecordMixingStruct2 *arg0, size_t arg1, u32 arg2) +static void ReceiveRankingHallRecords(struct PlayerHallRecords *hallRecords, size_t recordSize, u32 arg2) { u8 linkPlayerCount = GetLinkPlayerCount(); - struct UnknownRecMixingStruct3 *largeStructPtr = AllocZeroed(sizeof(struct UnknownRecMixingStruct3)); + struct RecordMixingHallRecords *largeStructPtr = AllocZeroed(sizeof(struct RecordMixingHallRecords)); - sub_80E8578(largeStructPtr, arg0, arg1, arg2, linkPlayerCount); + sub_80E8578(largeStructPtr, hallRecords, recordSize, arg2, linkPlayerCount); sub_80E8924(largeStructPtr); Free(largeStructPtr); diff --git a/src/recorded_battle.c b/src/recorded_battle.c index 0a199f289..50dd2efa8 100644 --- a/src/recorded_battle.c +++ b/src/recorded_battle.c @@ -14,17 +14,16 @@ #include "task.h" #include "text.h" #include "battle_setup.h" +#include "frontier_util.h" +#include "constants/trainers.h" #define BATTLER_RECORD_SIZE 664 #define ILLEGAL_BATTLE_TYPES ((BATTLE_TYPE_LINK | BATTLE_TYPE_SAFARI | BATTLE_TYPE_FIRST_BATTLE \ - | BATTLE_TYPE_WALLY_TUTORIAL | BATTLE_TYPE_ROAMER | BATTLE_TYPE_EREADER_TRAINER \ - | BATTLE_TYPE_KYOGRE_GROUDON | BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_REGI \ - | BATTLE_TYPE_RECORDED | BATTLE_TYPE_TRAINER_HILL | BATTLE_TYPE_SECRET_BASE \ + | BATTLE_TYPE_WALLY_TUTORIAL | BATTLE_TYPE_ROAMER | BATTLE_TYPE_EREADER_TRAINER \ + | BATTLE_TYPE_KYOGRE_GROUDON | BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_REGI \ + | BATTLE_TYPE_RECORDED | BATTLE_TYPE_TRAINER_HILL | BATTLE_TYPE_SECRET_BASE \ | BATTLE_TYPE_GROUDON | BATTLE_TYPE_KYOGRE | BATTLE_TYPE_RAYQUAZA)) -extern u8 gUnknown_03001278; -extern u8 gUnknown_03001279; - struct PlayerInfo { u32 trainerId; @@ -55,18 +54,18 @@ struct RecordedBattleSave u16 opponentB; u16 partnerId; u16 field_4FA; - u8 field_4FC; - u8 field_4FD; - u8 field_4FE; - u8 battleStyle:1; + u8 lvlMode; + u8 frontierFacility; + u8 frontierBrainSymbol; + u8 battleScene:1; u8 textSpeed:3; u32 AI_scripts; - u8 field_504[8]; - u8 field_50C; - u8 field_50D; - u16 field_50E[6]; - u8 field_51A; - u8 field_51B; + u8 recordMixFriendName[PLAYER_NAME_LENGTH + 1]; + u8 recordMixFriendClass; + u8 apprenticeId; + u16 easyChatSpeech[6]; + u8 recordMixFriendLanguage; + u8 apprenticeLanguage; u8 battleRecord[MAX_BATTLERS_COUNT][BATTLER_RECORD_SIZE]; u32 checksum; }; @@ -78,13 +77,13 @@ EWRAM_DATA static u16 sRecordedBytesNo[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA static u16 sUnknown_0203C79C[4] = {0}; EWRAM_DATA static u16 sUnknown_0203C7A4[4] = {0}; EWRAM_DATA static u8 sUnknown_0203C7AC = 0; -EWRAM_DATA static u8 sUnknown_0203C7AD = 0; +EWRAM_DATA static u8 sLvlMode = 0; EWRAM_DATA static u8 sFrontierFacility = 0; -EWRAM_DATA static u8 sUnknown_0203C7AF = 0; +EWRAM_DATA static u8 sFrontierBrainSymbol = 0; EWRAM_DATA static MainCallback sCallback2_AfterRecordedBattle = NULL; EWRAM_DATA u8 gUnknown_0203C7B4 = 0; EWRAM_DATA static u8 sUnknown_0203C7B5 = 0; -EWRAM_DATA static u8 sBattleStyle = 0; +EWRAM_DATA static u8 sBattleScene = 0; EWRAM_DATA static u8 sTextSpeed = 0; EWRAM_DATA static u32 sBattleFlags = 0; EWRAM_DATA static u32 sAI_Scripts = 0; @@ -93,17 +92,18 @@ EWRAM_DATA static struct Pokemon sSavedOpponentParty[PARTY_SIZE] = {0}; EWRAM_DATA static u16 sPlayerMonMoves[2][4] = {0}; EWRAM_DATA static struct PlayerInfo sPlayers[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA static u8 sUnknown_0203CCD0 = 0; -EWRAM_DATA static u8 sUnknown_0203CCD1[8] = {0}; -EWRAM_DATA static u8 sUnknown_0203CCD9 = 0; -EWRAM_DATA static u8 sUnknown_0203CCDA = 0; -EWRAM_DATA static u16 sUnknown_0203CCDC[6] = {0}; -EWRAM_DATA static u8 sUnknown_0203CCE8 = 0; +EWRAM_DATA static u8 sRecordMixFriendName[PLAYER_NAME_LENGTH + 1] = {0}; +EWRAM_DATA static u8 sRecordMixFriendClass = 0; +EWRAM_DATA static u8 sApprenticeId = 0; +EWRAM_DATA static u16 sEasyChatSpeech[6] = {0}; +EWRAM_DATA static u8 sBattleOutcome = 0; -extern u32 sub_81A513C(void); +IWRAM_DATA static u8 sRecordMixFriendLanguage; +IWRAM_DATA static u8 sApprenticeLanguage; // this file's functions static u8 sub_8185278(u8 *arg0, u8 *arg1, u8 *arg2); -static bool32 AllocTryCopyRecordedBattleSaveData(struct RecordedBattleSave *dst); +static bool32 CopyRecordedBattleFromSave(struct RecordedBattleSave *dst); static void RecordedBattle_RestoreSavedParties(void); static void CB2_RecordedBattle(void); @@ -140,7 +140,7 @@ void sub_8184E58(void) { gRecordedBattleRngSeed = gRngValue; sFrontierFacility = VarGet(VAR_FRONTIER_FACILITY); - sUnknown_0203C7AF = sub_81A513C(); + sFrontierBrainSymbol = GetFronterBrainSymbol(); } else if (sUnknown_0203C7AC == 2) { @@ -297,7 +297,7 @@ static u8 sub_8185278(u8 *arg0, u8 *arg1, u8 *arg2) bool32 CanCopyRecordedBattleSaveData(void) { struct RecordedBattleSave *dst = AllocZeroed(sizeof(struct RecordedBattleSave)); - bool32 ret = AllocTryCopyRecordedBattleSaveData(dst); + bool32 ret = CopyRecordedBattleFromSave(dst); Free(dst); return ret; } @@ -314,26 +314,29 @@ static bool32 IsRecordedBattleSaveValid(struct RecordedBattleSave *save) return TRUE; } -static bool32 sub_81852F0(struct RecordedBattleSave *battleSave, struct RecordedBattleSave *saveSection) +static bool32 RecordedBattleToSave(struct RecordedBattleSave *battleSave, struct RecordedBattleSave *saveSection) { - memset(saveSection, 0, sizeof(struct SaveSection)); + memset(saveSection, 0, 0x1000); memcpy(saveSection, battleSave, sizeof(*battleSave)); saveSection->checksum = CalcByteArraySum((void*)(saveSection), sizeof(*saveSection) - 4); if (sub_8153634(31, (void*)(saveSection)) != 1) return FALSE; - - return TRUE; + else + return TRUE; } -#ifdef NONMATCHING -u32 MoveRecordedBattleToSaveData(void) +bool32 MoveRecordedBattleToSaveData(void) { s32 i, j; - u8 var = 0; - struct RecordedBattleSave *battleSave = AllocZeroed(sizeof(struct RecordedBattleSave)); - struct SaveSection *savSection = AllocZeroed(sizeof(struct SaveSection)); + bool32 ret; + struct RecordedBattleSave *battleSave, *savSection; + u8 var; + + var = 0; + battleSave = AllocZeroed(sizeof(struct RecordedBattleSave)); + savSection = AllocZeroed(0x1000); for (i = 0; i < PARTY_SIZE; i++) { @@ -357,8 +360,7 @@ u32 MoveRecordedBattleToSaveData(void) if (sBattleFlags & BATTLE_TYPE_LINK) { - battleSave->battleFlags = (sBattleFlags & ~(BATTLE_TYPE_LINK | BATTLE_TYPE_20)); - battleSave->battleFlags |= BATTLE_TYPE_x2000000; + battleSave->battleFlags = (sBattleFlags & ~(BATTLE_TYPE_LINK | BATTLE_TYPE_20)) | BATTLE_TYPE_x2000000; if (sBattleFlags & BATTLE_TYPE_IS_MASTER) { @@ -390,884 +392,101 @@ u32 MoveRecordedBattleToSaveData(void) battleSave->opponentB = gTrainerBattleOpponent_B; battleSave->partnerId = gPartnerTrainerId; battleSave->field_4FA = gUnknown_0203C7B4; - battleSave->field_4FC = gSaveBlock2Ptr->field_CA9_b; - battleSave->field_4FD = sFrontierFacility; - battleSave->field_4FE = sUnknown_0203C7AF; - battleSave->battleStyle = gSaveBlock2Ptr->optionsBattleStyle; + battleSave->lvlMode = gSaveBlock2Ptr->frontier.lvlMode; + battleSave->frontierFacility = sFrontierFacility; + battleSave->frontierBrainSymbol = sFrontierBrainSymbol; + battleSave->battleScene = gSaveBlock2Ptr->optionsBattleSceneOff; battleSave->textSpeed = gSaveBlock2Ptr->optionsTextSpeed; battleSave->AI_scripts = sAI_Scripts; - /* Can't match it without proper knowledge of the Saveblock 2. - if (gTrainerBattleOpponent_A >= 300 && gTrainerBattleOpponent_A <= 399) + if (gTrainerBattleOpponent_A >= TRAINER_RECORD_MIXING_FRIEND && gTrainerBattleOpponent_A < TRAINER_RECORD_MIXING_APPRENTICE) { - for (i = 0; i < 8; i++) - { - battleSave->field_504[i] = gSaveBlock2Ptr->records[gTrainerBattleOpponent_A - 300].field_4[i]; - } - battleSave->field_50C = gSaveBlock2Ptr->records[gTrainerBattleOpponent_A - 300].field_1; + for (i = 0; i < PLAYER_NAME_LENGTH + 1; i++) + battleSave->recordMixFriendName[i] = gSaveBlock2Ptr->frontier.towerRecords[gTrainerBattleOpponent_A - TRAINER_RECORD_MIXING_FRIEND].name[i]; + battleSave->recordMixFriendClass = gSaveBlock2Ptr->frontier.towerRecords[gTrainerBattleOpponent_A - TRAINER_RECORD_MIXING_FRIEND].facilityClass; - if (sUnknown_0203CCE8 == 1) + if (sBattleOutcome == B_OUTCOME_WON) { for (i = 0; i < 6; i++) - { - battleSave->field_50E[i] = gSaveBlock2Ptr->records[gTrainerBattleOpponent_A - 300].field_28[i]; - } + battleSave->easyChatSpeech[i] = gSaveBlock2Ptr->frontier.towerRecords[gTrainerBattleOpponent_A - TRAINER_RECORD_MIXING_FRIEND].speechLost[i]; } else { for (i = 0; i < 6; i++) - { - battleSave->field_50E[i] = gSaveBlock2Ptr->records[gTrainerBattleOpponent_A - 300].field_1C[i]; - } + battleSave->easyChatSpeech[i] = gSaveBlock2Ptr->frontier.towerRecords[gTrainerBattleOpponent_A - TRAINER_RECORD_MIXING_FRIEND].speechWon[i]; } - battleSave->field_51A = gSaveBlock2Ptr->records[gTrainerBattleOpponent_A - 300].field_E4; + battleSave->recordMixFriendLanguage = gSaveBlock2Ptr->frontier.towerRecords[gTrainerBattleOpponent_A - TRAINER_RECORD_MIXING_FRIEND].language; } - else if (gTrainerBattleOpponent_B >= 300 && gTrainerBattleOpponent_B <= 399) + else if (gTrainerBattleOpponent_B >= TRAINER_RECORD_MIXING_FRIEND && gTrainerBattleOpponent_B < TRAINER_RECORD_MIXING_APPRENTICE) { - for (i = 0; i < 8; i++) - { - battleSave->field_504[i] = gSaveBlock2Ptr->records[gTrainerBattleOpponent_B - 300].field_4[i]; - } - battleSave->field_50C = gSaveBlock2Ptr->records[gTrainerBattleOpponent_B - 300].field_1; + for (i = 0; i < PLAYER_NAME_LENGTH + 1; i++) + battleSave->recordMixFriendName[i] = gSaveBlock2Ptr->frontier.towerRecords[gTrainerBattleOpponent_B - TRAINER_RECORD_MIXING_FRIEND].name[i]; + battleSave->recordMixFriendClass = gSaveBlock2Ptr->frontier.towerRecords[gTrainerBattleOpponent_B - TRAINER_RECORD_MIXING_FRIEND].facilityClass; - if (sUnknown_0203CCE8 == 1) + if (sBattleOutcome == B_OUTCOME_WON) { for (i = 0; i < 6; i++) - { - battleSave->field_50E[i] = gSaveBlock2Ptr->records[gTrainerBattleOpponent_B - 300].field_28[i]; - } + battleSave->easyChatSpeech[i] = gSaveBlock2Ptr->frontier.towerRecords[gTrainerBattleOpponent_B - TRAINER_RECORD_MIXING_FRIEND].speechLost[i]; } else { for (i = 0; i < 6; i++) - { - battleSave->field_50E[i] = gSaveBlock2Ptr->records[gTrainerBattleOpponent_B - 300].field_1C[i]; - } + battleSave->easyChatSpeech[i] = gSaveBlock2Ptr->frontier.towerRecords[gTrainerBattleOpponent_B - TRAINER_RECORD_MIXING_FRIEND].speechWon[i]; } - battleSave->field_51A = gSaveBlock2Ptr->records[gTrainerBattleOpponent_B - 300].field_E4; + battleSave->recordMixFriendLanguage = gSaveBlock2Ptr->frontier.towerRecords[gTrainerBattleOpponent_B - TRAINER_RECORD_MIXING_FRIEND].language; } - else if (gPartnerTrainerId >= 300 && gPartnerTrainerId <= 399) + else if (gPartnerTrainerId >= TRAINER_RECORD_MIXING_FRIEND && gPartnerTrainerId < TRAINER_RECORD_MIXING_APPRENTICE) { - for (i = 0; i < 8; i++) - { - battleSave->field_504[i] = gSaveBlock2Ptr->records[gPartnerTrainerId - 300].field_4[i]; - } - battleSave->field_50C = gSaveBlock2Ptr->records[gPartnerTrainerId - 300].field_1; + for (i = 0; i < PLAYER_NAME_LENGTH + 1; i++) + battleSave->recordMixFriendName[i] = gSaveBlock2Ptr->frontier.towerRecords[gPartnerTrainerId - TRAINER_RECORD_MIXING_FRIEND].name[i]; + battleSave->recordMixFriendClass = gSaveBlock2Ptr->frontier.towerRecords[gPartnerTrainerId - TRAINER_RECORD_MIXING_FRIEND].facilityClass; - if (sUnknown_0203CCE8 == 1) - { - for (i = 0; i < 6; i++) - { - battleSave->field_50E[i] = gSaveBlock2Ptr->records[gPartnerTrainerId - 300].field_28[i]; - } - } - else + battleSave->recordMixFriendLanguage = gSaveBlock2Ptr->frontier.towerRecords[gPartnerTrainerId - TRAINER_RECORD_MIXING_FRIEND].language; + } + + if (gTrainerBattleOpponent_A >= TRAINER_RECORD_MIXING_APPRENTICE) + { + battleSave->apprenticeId = gSaveBlock2Ptr->apprentices[gTrainerBattleOpponent_A - TRAINER_RECORD_MIXING_APPRENTICE].id; + for (i = 0; i < 6; i++) + battleSave->easyChatSpeech[i] = gSaveBlock2Ptr->apprentices[gTrainerBattleOpponent_A - TRAINER_RECORD_MIXING_APPRENTICE].easyChatWords[i]; + battleSave->apprenticeLanguage = gSaveBlock2Ptr->apprentices[gTrainerBattleOpponent_A - TRAINER_RECORD_MIXING_APPRENTICE].language; + } + else if (gTrainerBattleOpponent_B >= TRAINER_RECORD_MIXING_APPRENTICE) + { + battleSave->apprenticeId = gSaveBlock2Ptr->apprentices[gTrainerBattleOpponent_B - TRAINER_RECORD_MIXING_APPRENTICE].id; + for (i = 0; i < 6; i++) + battleSave->easyChatSpeech[i] = gSaveBlock2Ptr->apprentices[gTrainerBattleOpponent_B - TRAINER_RECORD_MIXING_APPRENTICE].easyChatWords[i]; + battleSave->apprenticeLanguage = gSaveBlock2Ptr->apprentices[gTrainerBattleOpponent_B - TRAINER_RECORD_MIXING_APPRENTICE].language; + } + else if (gPartnerTrainerId >= TRAINER_RECORD_MIXING_APPRENTICE) + { + battleSave->apprenticeId = gSaveBlock2Ptr->apprentices[gPartnerTrainerId - TRAINER_RECORD_MIXING_APPRENTICE].id; + + battleSave->apprenticeLanguage = gSaveBlock2Ptr->apprentices[gPartnerTrainerId - TRAINER_RECORD_MIXING_APPRENTICE].language; + } + + for (i = 0; i < MAX_BATTLERS_COUNT; i++) + { + for (j = 0; j < BATTLER_RECORD_SIZE; j++) { - for (i = 0; i < 6; i++) - { - battleSave->field_50E[i] = gSaveBlock2Ptr->records[gPartnerTrainerId - 300].field_1C[i]; - } + battleSave->battleRecord[i][j] = sBattleRecords[i][j]; } - battleSave->field_51A = gSaveBlock2Ptr->records[gPartnerTrainerId - 300].field_E4; } - */ -} + while (1) + { + ret = RecordedBattleToSave(battleSave, savSection); + if (ret == TRUE) + break; + var++; + if (var >= 3) + break; + } -#else -NAKED -u32 MoveRecordedBattleToSaveData(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0xC\n\ - movs r0, 0\n\ - str r0, [sp, 0x4]\n\ - movs r0, 0xF8\n\ - lsls r0, 4\n\ - bl AllocZeroed\n\ - adds r7, r0, 0\n\ - movs r0, 0x80\n\ - lsls r0, 5\n\ - bl AllocZeroed\n\ - str r0, [sp]\n\ - movs r6, 0\n\ -_0818535E:\n\ - movs r0, 0x64\n\ - adds r4, r6, 0\n\ - muls r4, r0\n\ - adds r5, r7, r4\n\ - ldr r1, =sSavedPlayerParty\n\ - adds r1, r4, r1\n\ - adds r0, r5, 0\n\ - movs r2, 0x64\n\ - bl memcpy\n\ - movs r1, 0x96\n\ - lsls r1, 2\n\ - adds r5, r1\n\ - ldr r0, =sSavedOpponentParty\n\ - adds r4, r0\n\ - adds r0, r5, 0\n\ - adds r1, r4, 0\n\ - movs r2, 0x64\n\ - bl memcpy\n\ - adds r6, 0x1\n\ - cmp r6, 0x5\n\ - ble _0818535E\n\ - movs r6, 0\n\ - ldr r2, =gSaveBlock2Ptr\n\ - mov r9, r2\n\ - movs r3, 0x9A\n\ - lsls r3, 3\n\ - adds r3, r7, r3\n\ - str r3, [sp, 0x8]\n\ - ldr r5, =sPlayers\n\ - mov r8, r6\n\ - mov r12, r6\n\ - movs r4, 0x96\n\ - lsls r4, 3\n\ - adds r4, r7\n\ - mov r10, r4\n\ - ldr r0, =0x000004e4\n\ - adds r4, r7, r0\n\ -_081853AC:\n\ - lsls r1, r6, 3\n\ - ldr r0, =sPlayers\n\ - adds r0, 0x4\n\ - mov r3, r8\n\ - adds r2, r3, r0\n\ - add r1, r10\n\ - movs r3, 0x7\n\ -_081853BA:\n\ - ldrb r0, [r2]\n\ - strb r0, [r1]\n\ - adds r2, 0x1\n\ - adds r1, 0x1\n\ - subs r3, 0x1\n\ - cmp r3, 0\n\ - bge _081853BA\n\ - ldr r0, [sp, 0x8]\n\ - adds r1, r0, r6\n\ - ldrb r0, [r5, 0xC]\n\ - strb r0, [r1]\n\ - ldrh r0, [r5, 0x10]\n\ - strb r0, [r4]\n\ - ldrh r0, [r5, 0xE]\n\ - strb r0, [r4, 0xC]\n\ - ldr r1, =0x000004d4\n\ - adds r0, r7, r1\n\ - add r0, r12\n\ - ldr r1, [r5]\n\ - str r1, [r0]\n\ - adds r5, 0x14\n\ - movs r2, 0x14\n\ - add r8, r2\n\ - movs r3, 0x4\n\ - add r12, r3\n\ - adds r4, 0x1\n\ - adds r6, 0x1\n\ - cmp r6, 0x3\n\ - ble _081853AC\n\ - movs r4, 0x9D\n\ - lsls r4, 3\n\ - adds r1, r7, r4\n\ - ldr r5, =gRecordedBattleRngSeed\n\ - ldr r0, [r5]\n\ - str r0, [r1]\n\ - ldr r0, =sBattleFlags\n\ - ldr r2, [r0]\n\ - movs r0, 0x2\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - beq _081854DC\n\ - ldr r1, =0x000004ec\n\ - adds r3, r7, r1\n\ - movs r1, 0x23\n\ - negs r1, r1\n\ - ands r1, r2\n\ - movs r0, 0x80\n\ - lsls r0, 18\n\ - orrs r1, r0\n\ - str r1, [r3]\n\ - movs r0, 0x4\n\ - ands r0, r2\n\ - cmp r0, 0\n\ - beq _08185454\n\ - movs r0, 0x80\n\ - lsls r0, 24\n\ - orrs r1, r0\n\ - str r1, [r3]\n\ - b _081854E2\n\ - .pool\n\ -_08185454:\n\ - movs r0, 0x40\n\ - ands r2, r0\n\ - cmp r2, 0\n\ - beq _081854E2\n\ - ldr r2, =sPlayers\n\ - ldrh r0, [r2, 0xE]\n\ - cmp r0, 0x1\n\ - beq _081854A8\n\ - cmp r0, 0x1\n\ - bgt _08185474\n\ - cmp r0, 0\n\ - beq _0818547E\n\ - b _081854E2\n\ - .pool\n\ -_08185474:\n\ - cmp r0, 0x2\n\ - beq _0818547E\n\ - cmp r0, 0x3\n\ - beq _081854A8\n\ - b _081854E2\n\ -_0818547E:\n\ - ldr r3, =gUnknown_0203C7B4\n\ - ldrb r1, [r3]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - ldr r4, =sPlayers\n\ - adds r0, r4\n\ - ldrh r1, [r0, 0xE]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _081854E2\n\ - ldr r5, =0x000004ec\n\ - adds r0, r7, r5\n\ - b _081854C4\n\ - .pool\n\ -_081854A8:\n\ - ldr r0, =gUnknown_0203C7B4\n\ - ldrb r1, [r0]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - ldr r1, =sPlayers\n\ - adds r0, r1\n\ - ldrh r1, [r0, 0xE]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _081854E2\n\ - ldr r2, =0x000004ec\n\ - adds r0, r7, r2\n\ -_081854C4:\n\ - ldr r1, [r0]\n\ - movs r2, 0x80\n\ - lsls r2, 24\n\ - orrs r1, r2\n\ - str r1, [r0]\n\ - b _081854E2\n\ - .pool\n\ -_081854DC:\n\ - ldr r3, =0x000004ec\n\ - adds r0, r7, r3\n\ - str r2, [r0]\n\ -_081854E2:\n\ - ldr r4, =gTrainerBattleOpponent_A\n\ - ldrh r1, [r4]\n\ - ldr r5, =0x000004f4\n\ - adds r0, r7, r5\n\ - strh r1, [r0]\n\ - ldr r0, =gTrainerBattleOpponent_B\n\ - ldrh r1, [r0]\n\ - ldr r2, =0x000004f6\n\ - adds r0, r7, r2\n\ - strh r1, [r0]\n\ - ldr r3, =gPartnerTrainerId\n\ - ldrh r1, [r3]\n\ - movs r4, 0x9F\n\ - lsls r4, 3\n\ - adds r0, r7, r4\n\ - strh r1, [r0]\n\ - ldr r5, =gUnknown_0203C7B4\n\ - ldrb r1, [r5]\n\ - adds r2, 0x4\n\ - adds r0, r7, r2\n\ - strh r1, [r0]\n\ - mov r3, r9\n\ - ldr r0, [r3]\n\ - ldr r4, =0x00000ca9\n\ - adds r0, r4\n\ - ldrb r0, [r0]\n\ - lsls r0, 30\n\ - lsrs r0, 30\n\ - ldr r5, =0x000004fc\n\ - adds r1, r7, r5\n\ - strb r0, [r1]\n\ - ldr r0, =sFrontierFacility\n\ - ldrb r1, [r0]\n\ - adds r2, 0x3\n\ - adds r0, r7, r2\n\ - strb r1, [r0]\n\ - ldr r3, =sUnknown_0203C7AF\n\ - ldrb r1, [r3]\n\ - ldr r4, =0x000004fe\n\ - adds r0, r7, r4\n\ - strb r1, [r0]\n\ - mov r5, r9\n\ - ldr r0, [r5]\n\ - ldrb r1, [r0, 0x15]\n\ - lsls r1, 29\n\ - ldr r0, =0x000004ff\n\ - adds r3, r7, r0\n\ - lsrs r1, 31\n\ - ldrb r2, [r3]\n\ - movs r0, 0x2\n\ - negs r0, r0\n\ - ands r0, r2\n\ - orrs r0, r1\n\ - strb r0, [r3]\n\ - ldr r1, [r5]\n\ - ldrb r1, [r1, 0x14]\n\ - lsls r1, 29\n\ - lsrs r1, 28\n\ - movs r2, 0xF\n\ - negs r2, r2\n\ - ands r0, r2\n\ - orrs r0, r1\n\ - strb r0, [r3]\n\ - movs r2, 0xA0\n\ - lsls r2, 3\n\ - adds r1, r7, r2\n\ - ldr r3, =sAI_Scripts\n\ - ldr r0, [r3]\n\ - str r0, [r1]\n\ - ldr r4, =0xfffffed4\n\ - adds r1, r4, 0\n\ - ldr r5, =gTrainerBattleOpponent_A\n\ - ldrh r5, [r5]\n\ - adds r0, r1, r5\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - cmp r0, 0x63\n\ - bls _08185580\n\ - b _081856C4\n\ -_08185580:\n\ - movs r6, 0\n\ - ldr r0, =0x00000504\n\ - adds r3, r7, r0\n\ - mov r10, r9\n\ - ldr r1, =gTrainerBattleOpponent_A\n\ - mov r12, r1\n\ - adds r2, r4, 0\n\ - mov r8, r2\n\ - ldr r4, =0x0000073c\n\ -_08185592:\n\ - adds r2, r3, r6\n\ - mov r5, r10\n\ - ldr r1, [r5]\n\ - mov r5, r12\n\ - ldrh r0, [r5]\n\ - add r0, r8\n\ - movs r5, 0xEC\n\ - muls r0, r5\n\ - adds r0, r6, r0\n\ - adds r1, r4\n\ - adds r1, r0\n\ - ldrb r0, [r1]\n\ - strb r0, [r2]\n\ - adds r6, 0x1\n\ - cmp r6, 0x7\n\ - ble _08185592\n\ - mov r0, r9\n\ - ldr r2, [r0]\n\ - ldr r1, =gTrainerBattleOpponent_A\n\ - ldrh r0, [r1]\n\ - ldr r3, =0xfffffed4\n\ - adds r0, r3\n\ - movs r1, 0xEC\n\ - muls r0, r1\n\ - adds r2, r0\n\ - ldr r4, =0x00000739\n\ - adds r2, r4\n\ - ldrb r1, [r2]\n\ - ldr r5, =0x0000050c\n\ - adds r0, r7, r5\n\ - strb r1, [r0]\n\ - ldr r1, =sUnknown_0203CCE8\n\ - ldrb r0, [r1]\n\ - cmp r0, 0x1\n\ - bne _08185664\n\ - movs r6, 0\n\ - ldr r2, =0x0000050e\n\ - adds r4, r7, r2\n\ - mov r10, r9\n\ - ldr r5, =gTrainerBattleOpponent_A\n\ - mov r8, r5\n\ - adds r5, r3, 0\n\ -_081855E6:\n\ - lsls r3, r6, 1\n\ - mov r0, r10\n\ - ldr r2, [r0]\n\ - mov r1, r8\n\ - ldrh r0, [r1]\n\ - adds r0, r5\n\ - movs r1, 0xEC\n\ - muls r0, r1\n\ - adds r3, r0\n\ - movs r0, 0xEC\n\ - lsls r0, 3\n\ - adds r2, r0\n\ - adds r2, r3\n\ - ldrh r0, [r2]\n\ - strh r0, [r4]\n\ - adds r4, 0x2\n\ - adds r6, 0x1\n\ - cmp r6, 0x5\n\ - ble _081855E6\n\ - b _08185696\n\ - .pool\n\ -_08185664:\n\ - movs r6, 0\n\ - ldr r1, =0x0000050e\n\ - adds r4, r7, r1\n\ - mov r10, r9\n\ - ldr r2, =gTrainerBattleOpponent_A\n\ - mov r8, r2\n\ - adds r5, r3, 0\n\ -_08185672:\n\ - lsls r3, r6, 1\n\ - mov r0, r10\n\ - ldr r2, [r0]\n\ - mov r1, r8\n\ - ldrh r0, [r1]\n\ - adds r0, r5\n\ - movs r1, 0xEC\n\ - muls r0, r1\n\ - adds r3, r0\n\ - ldr r0, =0x00000754\n\ - adds r2, r0\n\ - adds r2, r3\n\ - ldrh r0, [r2]\n\ - strh r0, [r4]\n\ - adds r4, 0x2\n\ - adds r6, 0x1\n\ - cmp r6, 0x5\n\ - ble _08185672\n\ -_08185696:\n\ - mov r1, r9\n\ - ldr r2, [r1]\n\ - ldr r3, =gTrainerBattleOpponent_A\n\ - ldrh r0, [r3]\n\ - ldr r4, =0xfffffed4\n\ - adds r0, r4\n\ - movs r1, 0xEC\n\ - muls r0, r1\n\ - adds r2, r0\n\ - ldr r5, =0x0000081c\n\ - adds r2, r5\n\ - ldrb r1, [r2]\n\ - b _08185856\n\ - .pool\n\ -_081856C4:\n\ - ldr r3, =gTrainerBattleOpponent_B\n\ - ldrh r3, [r3]\n\ - adds r0, r1, r3\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - cmp r0, 0x63\n\ - bls _081856D4\n\ - b _081857E4\n\ -_081856D4:\n\ - movs r6, 0\n\ - ldr r4, =0x00000504\n\ - adds r3, r7, r4\n\ - mov r10, r9\n\ - ldr r5, =gTrainerBattleOpponent_B\n\ - mov r12, r5\n\ - ldr r0, =0xfffffed4\n\ - mov r8, r0\n\ - ldr r4, =0x0000073c\n\ -_081856E6:\n\ - adds r2, r3, r6\n\ - mov r5, r10\n\ - ldr r1, [r5]\n\ - mov r5, r12\n\ - ldrh r0, [r5]\n\ - add r0, r8\n\ - movs r5, 0xEC\n\ - muls r0, r5\n\ - adds r0, r6, r0\n\ - adds r1, r4\n\ - adds r1, r0\n\ - ldrb r0, [r1]\n\ - strb r0, [r2]\n\ - adds r6, 0x1\n\ - cmp r6, 0x7\n\ - ble _081856E6\n\ - mov r0, r9\n\ - ldr r2, [r0]\n\ - ldr r1, =gTrainerBattleOpponent_B\n\ - ldrh r0, [r1]\n\ - ldr r3, =0xfffffed4\n\ - adds r0, r3\n\ - movs r1, 0xEC\n\ - muls r0, r1\n\ - adds r2, r0\n\ - ldr r4, =0x00000739\n\ - adds r2, r4\n\ - ldrb r1, [r2]\n\ - ldr r5, =0x0000050c\n\ - adds r0, r7, r5\n\ - strb r1, [r0]\n\ - ldr r1, =sUnknown_0203CCE8\n\ - ldrb r0, [r1]\n\ - cmp r0, 0x1\n\ - bne _08185784\n\ - movs r6, 0\n\ - ldr r2, =0x0000050e\n\ - adds r4, r7, r2\n\ - mov r10, r9\n\ - ldr r5, =gTrainerBattleOpponent_B\n\ - mov r8, r5\n\ - adds r5, r3, 0\n\ -_0818573A:\n\ - lsls r3, r6, 1\n\ - mov r0, r10\n\ - ldr r2, [r0]\n\ - mov r1, r8\n\ - ldrh r0, [r1]\n\ - adds r0, r5\n\ - movs r1, 0xEC\n\ - muls r0, r1\n\ - adds r3, r0\n\ - movs r0, 0xEC\n\ - lsls r0, 3\n\ - adds r2, r0\n\ - adds r2, r3\n\ - ldrh r0, [r2]\n\ - strh r0, [r4]\n\ - adds r4, 0x2\n\ - adds r6, 0x1\n\ - cmp r6, 0x5\n\ - ble _0818573A\n\ - b _081857B6\n\ - .pool\n\ -_08185784:\n\ - movs r6, 0\n\ - ldr r1, =0x0000050e\n\ - adds r4, r7, r1\n\ - mov r10, r9\n\ - ldr r2, =gTrainerBattleOpponent_B\n\ - mov r8, r2\n\ - adds r5, r3, 0\n\ -_08185792:\n\ - lsls r3, r6, 1\n\ - mov r0, r10\n\ - ldr r2, [r0]\n\ - mov r1, r8\n\ - ldrh r0, [r1]\n\ - adds r0, r5\n\ - movs r1, 0xEC\n\ - muls r0, r1\n\ - adds r3, r0\n\ - ldr r0, =0x00000754\n\ - adds r2, r0\n\ - adds r2, r3\n\ - ldrh r0, [r2]\n\ - strh r0, [r4]\n\ - adds r4, 0x2\n\ - adds r6, 0x1\n\ - cmp r6, 0x5\n\ - ble _08185792\n\ -_081857B6:\n\ - mov r1, r9\n\ - ldr r2, [r1]\n\ - ldr r3, =gTrainerBattleOpponent_B\n\ - ldrh r0, [r3]\n\ - ldr r4, =0xfffffed4\n\ - adds r0, r4\n\ - movs r1, 0xEC\n\ - muls r0, r1\n\ - adds r2, r0\n\ - ldr r5, =0x0000081c\n\ - adds r2, r5\n\ - ldrb r1, [r2]\n\ - b _08185856\n\ - .pool\n\ -_081857E4:\n\ - ldr r3, =gPartnerTrainerId\n\ - ldrh r3, [r3]\n\ - adds r0, r1, r3\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - cmp r0, 0x63\n\ - bhi _0818585C\n\ - movs r6, 0\n\ - ldr r4, =0x00000504\n\ - adds r3, r7, r4\n\ - mov r10, r9\n\ - ldr r5, =gPartnerTrainerId\n\ - mov r12, r5\n\ - ldr r0, =0xfffffed4\n\ - mov r8, r0\n\ - ldr r4, =0x0000073c\n\ -_08185804:\n\ - adds r2, r3, r6\n\ - mov r5, r10\n\ - ldr r1, [r5]\n\ - mov r5, r12\n\ - ldrh r0, [r5]\n\ - add r0, r8\n\ - movs r5, 0xEC\n\ - muls r0, r5\n\ - adds r0, r6, r0\n\ - adds r1, r4\n\ - adds r1, r0\n\ - ldrb r0, [r1]\n\ - strb r0, [r2]\n\ - adds r6, 0x1\n\ - cmp r6, 0x7\n\ - ble _08185804\n\ - mov r0, r9\n\ - ldr r1, [r0]\n\ - ldr r2, =gPartnerTrainerId\n\ - ldrh r0, [r2]\n\ - ldr r3, =0xfffffed4\n\ - adds r0, r3\n\ - movs r2, 0xEC\n\ - muls r0, r2\n\ - adds r1, r0\n\ - ldr r4, =0x00000739\n\ - adds r1, r4\n\ - ldrb r1, [r1]\n\ - ldr r5, =0x0000050c\n\ - adds r0, r7, r5\n\ - strb r1, [r0]\n\ - mov r0, r9\n\ - ldr r1, [r0]\n\ - ldr r4, =gPartnerTrainerId\n\ - ldrh r0, [r4]\n\ - adds r0, r3\n\ - muls r0, r2\n\ - adds r1, r0\n\ - ldr r5, =0x0000081c\n\ - adds r1, r5\n\ - ldrb r1, [r1]\n\ -_08185856:\n\ - ldr r2, =0x0000051a\n\ - adds r0, r7, r2\n\ - strb r1, [r0]\n\ -_0818585C:\n\ - ldr r3, =gTrainerBattleOpponent_A\n\ - ldrh r0, [r3]\n\ - ldr r1, =0x0000018f\n\ - cmp r0, r1\n\ - bls _08185900\n\ - mov r4, r9\n\ - ldr r2, [r4]\n\ - adds r1, r0, 0\n\ - ldr r3, =0xfffffe70\n\ - adds r1, r3\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r2, r0\n\ - adds r2, 0xDC\n\ - ldrb r0, [r2]\n\ - lsls r0, 27\n\ - lsrs r0, 27\n\ - ldr r5, =0x0000050d\n\ - adds r1, r7, r5\n\ - strb r0, [r1]\n\ - movs r6, 0\n\ - ldr r0, =0x0000050e\n\ - adds r4, r7, r0\n\ - mov r10, r9\n\ - ldr r1, =gTrainerBattleOpponent_A\n\ - mov r8, r1\n\ - adds r5, r3, 0\n\ -_08185894:\n\ - lsls r3, r6, 1\n\ - mov r0, r10\n\ - ldr r2, [r0]\n\ - mov r0, r8\n\ - ldrh r1, [r0]\n\ - adds r1, r5\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r3, r0\n\ - movs r1, 0x82\n\ - lsls r1, 1\n\ - adds r2, r1\n\ - adds r2, r3\n\ - ldrh r0, [r2]\n\ - strh r0, [r4]\n\ - adds r4, 0x2\n\ - adds r6, 0x1\n\ - cmp r6, 0x5\n\ - ble _08185894\n\ - mov r3, r9\n\ - ldr r2, [r3]\n\ - ldr r4, =gTrainerBattleOpponent_A\n\ - ldrh r1, [r4]\n\ - ldr r5, =0xfffffe70\n\ - adds r1, r5\n\ - b _081859AC\n\ - .pool\n\ -_08185900:\n\ - ldr r3, =gTrainerBattleOpponent_B\n\ - ldrh r0, [r3]\n\ - cmp r0, r1\n\ - bls _0818597C\n\ - mov r4, r9\n\ - ldr r2, [r4]\n\ - adds r1, r0, 0\n\ - ldr r3, =0xfffffe70\n\ - adds r1, r3\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r2, r0\n\ - adds r2, 0xDC\n\ - ldrb r0, [r2]\n\ - lsls r0, 27\n\ - lsrs r0, 27\n\ - ldr r5, =0x0000050d\n\ - adds r1, r7, r5\n\ - strb r0, [r1]\n\ - movs r6, 0\n\ - ldr r0, =0x0000050e\n\ - adds r4, r7, r0\n\ - mov r10, r9\n\ - ldr r1, =gTrainerBattleOpponent_B\n\ - mov r8, r1\n\ - adds r5, r3, 0\n\ -_08185936:\n\ - lsls r3, r6, 1\n\ - mov r0, r10\n\ - ldr r2, [r0]\n\ - mov r0, r8\n\ - ldrh r1, [r0]\n\ - adds r1, r5\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r3, r0\n\ - movs r1, 0x82\n\ - lsls r1, 1\n\ - adds r2, r1\n\ - adds r2, r3\n\ - ldrh r0, [r2]\n\ - strh r0, [r4]\n\ - adds r4, 0x2\n\ - adds r6, 0x1\n\ - cmp r6, 0x5\n\ - ble _08185936\n\ - mov r3, r9\n\ - ldr r2, [r3]\n\ - ldr r4, =gTrainerBattleOpponent_B\n\ - ldrh r1, [r4]\n\ - ldr r5, =0xfffffe70\n\ - adds r1, r5\n\ - b _081859AC\n\ - .pool\n\ -_0818597C:\n\ - ldr r3, =gPartnerTrainerId\n\ - ldrh r0, [r3]\n\ - cmp r0, r1\n\ - bls _081859C0\n\ - mov r4, r9\n\ - ldr r2, [r4]\n\ - adds r1, r0, 0\n\ - ldr r3, =0xfffffe70\n\ - adds r1, r3\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r2, r0\n\ - adds r2, 0xDC\n\ - ldrb r0, [r2]\n\ - lsls r0, 27\n\ - lsrs r0, 27\n\ - ldr r5, =0x0000050d\n\ - adds r1, r7, r5\n\ - strb r0, [r1]\n\ - ldr r2, [r4]\n\ - ldr r0, =gPartnerTrainerId\n\ - ldrh r1, [r0]\n\ - adds r1, r3\n\ -_081859AC:\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r2, r0\n\ - ldr r1, =0x0000011b\n\ - adds r0, r2, r1\n\ - ldrb r1, [r0]\n\ - ldr r2, =0x0000051b\n\ - adds r0, r7, r2\n\ - strb r1, [r0]\n\ -_081859C0:\n\ - movs r6, 0\n\ - ldr r3, =0x00000297\n\ - mov r10, r3\n\ - ldr r4, =sBattleRecords\n\ - mov r9, r4\n\ - movs r5, 0xA6\n\ - lsls r5, 2\n\ - mov r8, r5\n\ - ldr r0, =0x0000051c\n\ - adds r5, r7, r0\n\ -_081859D4:\n\ - adds r4, r6, 0x1\n\ - mov r0, r8\n\ - muls r0, r6\n\ - mov r1, r9\n\ - adds r2, r0, r1\n\ - adds r1, r0, r5\n\ - mov r3, r10\n\ - adds r3, 0x1\n\ -_081859E4:\n\ - ldrb r0, [r2]\n\ - strb r0, [r1]\n\ - adds r2, 0x1\n\ - adds r1, 0x1\n\ - subs r3, 0x1\n\ - cmp r3, 0\n\ - bne _081859E4\n\ - adds r6, r4, 0\n\ - cmp r6, 0x3\n\ - ble _081859D4\n\ -_081859F8:\n\ - adds r0, r7, 0\n\ - ldr r1, [sp]\n\ - bl sub_81852F0\n\ - adds r4, r0, 0\n\ - cmp r4, 0x1\n\ - beq _08185A14\n\ - ldr r0, [sp, 0x4]\n\ - adds r0, 0x1\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - str r0, [sp, 0x4]\n\ - cmp r0, 0x2\n\ - bls _081859F8\n\ -_08185A14:\n\ - adds r0, r7, 0\n\ - bl Free\n\ - ldr r0, [sp]\n\ - bl Free\n\ - adds r0, r4, 0\n\ - add sp, 0xC\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .pool\n\ - .syntax divided"); + free(battleSave); + free(savSection); + return ret; } -#endif // NONMATCHING static bool32 TryCopyRecordedBattleSaveData(struct RecordedBattleSave *dst, struct SaveSection *saveBuffer) { @@ -1282,7 +501,7 @@ static bool32 TryCopyRecordedBattleSaveData(struct RecordedBattleSave *dst, stru return TRUE; } -static bool32 AllocTryCopyRecordedBattleSaveData(struct RecordedBattleSave *dst) +static bool32 CopyRecordedBattleFromSave(struct RecordedBattleSave *dst) { struct SaveSection *savBuffer = AllocZeroed(sizeof(struct SaveSection)); bool32 ret = TryCopyRecordedBattleSaveData(dst, savBuffer); @@ -1293,7 +512,7 @@ static bool32 AllocTryCopyRecordedBattleSaveData(struct RecordedBattleSave *dst) static void CB2_RecordedBattleEnd(void) { - gSaveBlock2Ptr->frontier.lvlMode = sUnknown_0203C7AD; + gSaveBlock2Ptr->frontier.lvlMode = sLvlMode; gBattleOutcome = 0; gBattleTypeFlags = 0; gTrainerBattleOpponent_A = 0; @@ -1316,7 +535,7 @@ static void Task_StartAfterCountdown(u8 taskId) } } -static void SetRecordedBattleVarsFromSave(struct RecordedBattleSave *src) +static void SetVariablesForRecordedBattle(struct RecordedBattleSave *src) { bool8 var; s32 i, j; @@ -1353,29 +572,29 @@ static void SetRecordedBattleVarsFromSave(struct RecordedBattleSave *src) gTrainerBattleOpponent_B = src->opponentB; gPartnerTrainerId = src->partnerId; gUnknown_0203C7B4 = src->field_4FA; - sUnknown_0203C7AD = gSaveBlock2Ptr->frontier.lvlMode; - sFrontierFacility = src->field_4FD; - sUnknown_0203C7AF = src->field_4FE; - sBattleStyle = src->battleStyle; + sLvlMode = gSaveBlock2Ptr->frontier.lvlMode; + sFrontierFacility = src->frontierFacility; + sFrontierBrainSymbol = src->frontierBrainSymbol; + sBattleScene = src->battleScene; sTextSpeed = src->textSpeed; sAI_Scripts = src->AI_scripts; - for (i = 0; i < 8; i++) + for (i = 0; i < PLAYER_NAME_LENGTH + 1; i++) { - sUnknown_0203CCD1[i] = src->field_504[i]; + sRecordMixFriendName[i] = src->recordMixFriendName[i]; } - sUnknown_0203CCD9 = src->field_50C; - sUnknown_0203CCDA = src->field_50D; - gUnknown_03001278 = src->field_51A; - gUnknown_03001279 = src->field_51B; + sRecordMixFriendClass = src->recordMixFriendClass; + sApprenticeId = src->apprenticeId; + sRecordMixFriendLanguage = src->recordMixFriendLanguage; + sApprenticeLanguage = src->apprenticeLanguage; for (i = 0; i < 6; i++) { - sUnknown_0203CCDC[i] = src->field_50E[i]; + sEasyChatSpeech[i] = src->easyChatSpeech[i]; } - gSaveBlock2Ptr->frontier.lvlMode = src->field_4FC; + gSaveBlock2Ptr->frontier.lvlMode = src->lvlMode; for (i = 0; i < MAX_BATTLERS_COUNT; i++) { @@ -1389,12 +608,12 @@ static void SetRecordedBattleVarsFromSave(struct RecordedBattleSave *src) void PlayRecordedBattle(void (*CB2_After)(void)) { struct RecordedBattleSave *battleSave = AllocZeroed(sizeof(struct RecordedBattleSave)); - if (AllocTryCopyRecordedBattleSaveData(battleSave) == TRUE) + if (CopyRecordedBattleFromSave(battleSave) == TRUE) { u8 taskId; RecordedBattle_SaveParties(); - SetRecordedBattleVarsFromSave(battleSave); + SetVariablesForRecordedBattle(battleSave); taskId = CreateTask(Task_StartAfterCountdown, 1); gTasks[taskId].tFramesToWait = 128; @@ -1420,9 +639,9 @@ u8 GetRecordedBattleFrontierFacility(void) return sFrontierFacility; } -u8 sub_8185EAC(void) +u8 GetRecordedBattleFronterBrainSymbol(void) { - return sUnknown_0203C7AF; + return sFrontierBrainSymbol; } void RecordedBattle_SaveParties(void) @@ -1478,9 +697,9 @@ u8 sub_8185FAC(void) return sUnknown_0203C7B5; } -u8 GetBattleStyleInRecordedBattle(void) +u8 GetBattleSceneInRecordedBattle(void) { - return sBattleStyle; + return sBattleScene; } u8 GetTextSpeedInRecordedBattle(void) @@ -1630,38 +849,38 @@ void sub_8186468(u8 *dst) s32 i; for (i = 0; i < 8; i++) - dst[i] = sUnknown_0203CCD1[i]; + dst[i] = sRecordMixFriendName[i]; dst[7] = EOS; - ConvertInternationalString(dst, gUnknown_03001278); + ConvertInternationalString(dst, sRecordMixFriendLanguage); } -u8 sub_818649C(void) +u8 GetRecordedBattleRecordMixFriendClass(void) { - return sUnknown_0203CCD9; + return sRecordMixFriendClass; } -u8 sub_81864A8(void) +u8 GetRecordedBattleApprenticeId(void) { - return sUnknown_0203CCDA; + return sApprenticeId; } -u8 sub_81864B4(void) +u8 GetRecordedBattleRecordMixFriendLanguage(void) { - return gUnknown_03001278; + return sRecordMixFriendLanguage; } -u8 sub_81864C0(void) +u8 GetRecordedBattleApprenticeLanguage(void) { - return gUnknown_03001279; + return sApprenticeLanguage; } -void sub_81864CC(void) +void RecordedBattle_SaveBattleOutcome(void) { - sUnknown_0203CCE8 = gBattleOutcome; + sBattleOutcome = gBattleOutcome; } -u16 *sub_81864E0(void) +u16 *GetRecordedBattleEasyChatSpeech(void) { - return sUnknown_0203CCDC; + return sEasyChatSpeech; } diff --git a/src/save.c b/src/save.c index 68427c4c3..0bd48cca9 100644 --- a/src/save.c +++ b/src/save.c @@ -712,30 +712,34 @@ u8 HandleSavingData(u8 saveType) u8 TrySavingData(u8 saveType) // TrySave { - if(gFlashMemoryPresent == TRUE) + if (gFlashMemoryPresent != TRUE) { - HandleSavingData(saveType); - if(gDamagedSaveSectors) - DoSaveFailedScreen(saveType); - else - goto OK; // really? + gUnknown_03006294 = 0xFF; + return 0xFF; } - gUnknown_03006294 = 0xFF; - return 0xFF; -OK: - gUnknown_03006294 = 1; - return 1; + HandleSavingData(saveType); + if (!gDamagedSaveSectors) + { + gUnknown_03006294 = 1; + return 1; + } + else + { + DoSaveFailedScreen(saveType); + gUnknown_03006294 = 0xFF; + return 0xFF; + } } -u8 sub_8153380(void) // trade.s save +bool8 sub_8153380(void) // trade.s save { if (gFlashMemoryPresent != TRUE) - return 1; + return TRUE; UpdateSaveAddresses(); SaveSerializedGame(); RestoreSaveBackupVarsAndIncrement(gRamSaveSectionLocations); - return 0; + return FALSE; } bool8 sub_81533AC(void) // trade.s save @@ -744,9 +748,9 @@ bool8 sub_81533AC(void) // trade.s save if (gDamagedSaveSectors) DoSaveFailedScreen(0); if (retVal == 0xFF) - return 1; + return TRUE; else - return 0; + return FALSE; } u8 sub_81533E0(void) // trade.s save diff --git a/src/scrcmd.c b/src/scrcmd.c index 512231a25..127a5ecaa 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -1,5 +1,5 @@ #include "global.h" -#include "battle_frontier_2.h" +#include "frontier_util.h" #include "battle_setup.h" #include "berry.h" #include "clock.h" @@ -49,6 +49,11 @@ #include "tv.h" #include "window.h" +extern u16 sub_81A89A0(u8); +extern void sub_81A8AF8(void); +extern void sub_81A895C(void); +extern void sub_81A8934(u8); + typedef u16 (*SpecialFunc)(void); typedef void (*NativeFunc)(void); diff --git a/src/start_menu.c b/src/start_menu.c index aaa9fec2c..81c4213e7 100644 --- a/src/start_menu.c +++ b/src/start_menu.c @@ -12,7 +12,7 @@ #include "task.h" #include "overworld.h" #include "link.h" -#include "battle_frontier_2.h" +#include "frontier_util.h" #include "rom_818CFC8.h" #include "field_specials.h" #include "event_object_movement.h" @@ -35,6 +35,8 @@ #include "field_player_avatar.h" #include "battle_pyramid_bag.h" +extern bool8 InBattlePike(void); + // Menu actions enum { diff --git a/src/strings.c b/src/strings.c index 15c247744..9cb384e70 100644 --- a/src/strings.c +++ b/src/strings.c @@ -1569,9 +1569,7 @@ asm(".align 2"); const u8 gUnknown_085EE410[] = _("Floors cleared: {STR_VAR_2}"); asm(".align 2"); -const u8 gText_1Dot[] = _("1."); -const u8 gUnknown_085EE427[] = _("2."); -const u8 gUnknown_085EE42A[] = _("3."); +const u8 gText_123Dot[][3] = {_("1."), _("2."), _("3.")}; const u8 gText_SavingDontTurnOff2[] = _("SAVING…\nDON’T TURN OFF THE POWER."); const u8 gText_BlenderMaxSpeedRecord[] = _("BERRY BLENDER\nMAXIMUM SPEED RECORD!"); const u8 gText_234Players[] = _("2 PLAYERS\n3 PLAYERS\n4 PLAYERS"); @@ -1972,7 +1972,7 @@ void sub_80EDB44(void) show->rivalTrainer.nGoldSymbols ++; } } - show->rivalTrainer.battlePoints = gSaveBlock2Ptr->frontier.frontierBattlePoints; + show->rivalTrainer.battlePoints = gSaveBlock2Ptr->frontier.battlePoints; StringCopy(show->rivalTrainer.playerName, gSaveBlock2Ptr->playerName); tv_store_id_3x(show); show->rivalTrainer.language = gGameLanguage; @@ -2500,7 +2500,7 @@ bool8 sub_80EE818(void) return TRUE; } -void sub_80EE8C8(u16 winStreak, u8 facility) +void sub_80EE8C8(u16 winStreak, u8 facilityAndMode) { TVShow *show; @@ -2512,8 +2512,8 @@ void sub_80EE8C8(u16 winStreak, u8 facility) show->frontier.active = FALSE; StringCopy(show->frontier.playerName, gSaveBlock2Ptr->playerName); show->frontier.winStreak = winStreak; - show->frontier.facility = facility; - switch (facility) + show->frontier.facility = facilityAndMode; + switch (facilityAndMode) { case 1: case 5: diff --git a/src/walda_phrase.c b/src/walda_phrase.c index 4a82be14f..ff2ee7399 100644 --- a/src/walda_phrase.c +++ b/src/walda_phrase.c @@ -95,7 +95,7 @@ u16 TryGetWallpaperWithWaldaPhrase(void) { u16 backgroundClr, foregroundClr; u8 patternId, iconId; - u16 trainerId = ReadUnalignedWord(gSaveBlock2Ptr->playerTrainerId); + u16 trainerId = GetTrainerId(gSaveBlock2Ptr->playerTrainerId); gSpecialVar_Result = TryCalculateWallpaper(&backgroundClr, &foregroundClr, &iconId, &patternId, trainerId, GetWaldaPhrasePtr()); if (gSpecialVar_Result) |