diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/battle_dome.c | 126 | ||||
-rw-r--r-- | src/battle_message.c | 8 | ||||
-rw-r--r-- | src/battle_tower.c | 37 | ||||
-rw-r--r-- | src/frontier_util.c | 1832 | ||||
-rw-r--r-- | src/new_game.c | 4 | ||||
-rw-r--r-- | src/overworld.c | 2 | ||||
-rw-r--r-- | src/record_mixing.c | 200 | ||||
-rw-r--r-- | src/save.c | 36 | ||||
-rw-r--r-- | src/strings.c | 4 | ||||
-rw-r--r-- | src/tv.c | 6 |
10 files changed, 2009 insertions, 246 deletions
diff --git a/src/battle_dome.c b/src/battle_dome.c index 15348e458..3677131ab 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 "battle_frontier_2.h" #include "battle_message.h" #include "event_data.h" #include "overworld.h" @@ -56,12 +57,11 @@ 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 void sub_81A4C30(void); -extern bool8 sub_81A3610(void); +extern u8 sub_81A3610(void); extern u16 sub_81A4FF0(u8); extern void ReducePlayerPartyToThree(void); @@ -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] = sub_81A4FF0(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) @@ -2922,7 +2922,7 @@ static s32 sub_818FCBC(u16 tournamentTrainerId, bool8 arg1) } 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); } } @@ -2950,7 +2950,7 @@ static s32 sub_818FDB8(u16 tournamentTrainerId, bool8 arg1) } 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.current_text_offset = gSpeciesNames[gSaveBlock2Ptr->frontier.domeMonId[trainerTournamentId][i]]; + textPrinter.current_text_offset = gSpeciesNames[gSaveBlock2Ptr->frontier.domeMonIds[trainerTournamentId][i]]; else if (trainerId == TRAINER_FRONTIER_BRAIN) - textPrinter.current_text_offset = gSpeciesNames[gSaveBlock2Ptr->frontier.domeMonId[trainerTournamentId][i]]; + textPrinter.current_text_offset = gSpeciesNames[gSaveBlock2Ptr->frontier.domeMonIds[trainerTournamentId][i]]; else - textPrinter.current_text_offset = gSpeciesNames[gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonId[trainerTournamentId][i]].species]; + textPrinter.current_text_offset = gSpeciesNames[gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[trainerTournamentId][i]].species]; textPrinter.windowId = 1 + i + windowId; if (i == 1) @@ -4879,7 +4879,7 @@ static void DisplayTrainerInfoOnCard(u8 flags, u8 trainerTournamentId) 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]; } } } @@ -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], @@ -5566,7 +5566,7 @@ static u16 GetWinningMove(s32 winnerTournamentId, s32 loserTournamentId, u8 roun if (gSaveBlock2Ptr->frontier.domeTrainers[winnerTournamentId].trainerId == TRAINER_FRONTIER_BRAIN) moveIds[i * 4 + j] = sub_81A5060(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_message.c b/src/battle_message.c index 99ab8bbd6..147d0295f 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -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_tower.c b/src/battle_tower.c index 4b63c2875..4518e6ad9 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -10,7 +10,7 @@ #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" @@ -33,7 +33,6 @@ 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); @@ -220,7 +219,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 +257,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 +363,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 +385,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++) @@ -1179,7 +1179,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 @@ -1480,8 +1480,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) @@ -1516,8 +1516,8 @@ static void sub_8163EE4(void) 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 +1535,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 +1625,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 +1795,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 +1912,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 +2070,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; @@ -2425,9 +2426,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]; diff --git a/src/frontier_util.c b/src/frontier_util.c new file mode 100644 index 000000000..99419cc9a --- /dev/null +++ b/src/frontier_util.c @@ -0,0 +1,1832 @@ +#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" + +extern u8 gUnknown_0203CEF8[]; + +extern void (* const gUnknown_08611C18[])(void); +extern const u16 gUnknown_08611BFC[][2]; +extern const struct BattleFrontierTrainer gBattleFrontierTrainers[]; +extern const struct WindowTemplate gUnknown_08611C74; +extern const struct WindowTemplate gUnknown_08611C7C; +extern const struct WindowTemplate gUnknown_08611C84; +extern const u8 gUnknown_086118B4[29][7][4]; +extern const u16 gUnknown_08611C9A[]; +extern const u8 *const gUnknown_08611D08[]; +extern const u8 *const gUnknown_08611CB0[][2]; +extern const u8 *const gUnknown_08611D00[]; + +extern void sub_81B8558(void); + +// This file's functions. +u8 sub_81A3B30(u8 facility); +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); +u8 sub_81A3610(void); +void sub_81A51A8(u8); +void sub_81A5030(u8); + +// const rom data +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}, +}; + +// code +void sub_81A1780(void) +{ + gUnknown_08611C18[gSpecialVar_0x8004](); +} + +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; + } +} + +void sub_81A1830(void) +{ + u8 facility = VarGet(VAR_FRONTIER_FACILITY); + u8 currSymbol = sub_81A3B30(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; + } +} + +void sub_81A1968(void) +{ + s32 i; + u8 facility = VarGet(VAR_FRONTIER_FACILITY); + u8 currSymbol = sub_81A3B30(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; + } +} + +void sub_81A1AD4(void) +{ + s32 i; + + sub_81B8558(); + for (i = 0; i < gSpecialVar_0x8005; i++) + gUnknown_0203CEF8[i] = gSaveBlock2Ptr->frontier.selectedPartyMons[i]; + ReducePlayerPartyToThree(); +} + +void sub_81A1B1C(void) +{ + DoSoftReset(); +} + +void sub_81A1B28(void) +{ + gFacilityTrainers = gBattleFrontierTrainers; +} + +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]; + } +} + +void sub_81A1B98(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 7: + ShowLinkContestResultsWindow(); + break; + } +} + +static bool8 sub_81A1C24(u32 flags) +{ + if (gSaveBlock2Ptr->frontier.field_CDC & flags) + return TRUE; + else + return FALSE; +} + +static void sub_81A1C4C(const u8 *str, s32 y) +{ + s32 x = GetStringCenterAlignXOffset(1, str, 0xE0); + 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); + + sub_81A1C4C(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); + + sub_81A1C4C(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); + + sub_81A1C4C(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); + sub_81A1C4C(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); + sub_81A1C4C(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); + + sub_81A1C4C(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); + sub_81A1C4C(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, 0xD0); + AddTextPrinterParameterized(gRecordsWindowId, 1, gStringVar4, x, 1, TEXT_SPEED_FF, NULL); + + str = gText_1st; + x = GetStringRightAlignXOffset(1, str, 0x26) + 50; + AddTextPrinterParameterized(gRecordsWindowId, 1, str, x, 25, TEXT_SPEED_FF, NULL); + + str = gText_2nd; + x = GetStringRightAlignXOffset(1, str, 0x26) + 88; + AddTextPrinterParameterized(gRecordsWindowId, 1, str, x, 25, TEXT_SPEED_FF, NULL); + + str = gText_3rd; + x = GetStringRightAlignXOffset(1, str, 0x26) + 126; + AddTextPrinterParameterized(gRecordsWindowId, 1, str, x, 25, TEXT_SPEED_FF, NULL); + + str = gText_4th; + x = GetStringRightAlignXOffset(1, str, 0x26) + 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); +} + +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); + WriteUnalignedWord(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; + } +} + +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 = sub_81A3B30(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) + sub_81A51A8(0); + 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) + { + sub_81A51A8(0); + } + else if (trainerId < TRAINER_RECORD_MIXING_FRIEND) + { + FrontierSpeechToString(gFacilityTrainers[trainerId].speechWin); + } + else if (trainerId < TRAINER_RECORD_MIXING_APPRENTICE) + { + if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) + FrontierSpeechToString(sub_81864E0()); + else + FrontierSpeechToString(gSaveBlock2Ptr->frontier.towerRecords[trainerId - TRAINER_RECORD_MIXING_FRIEND].speechWon); + } + else + { + if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) + FrontierSpeechToString(sub_81864E0()); + 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) + { + sub_81A51A8(1); + } + else if (trainerId < TRAINER_RECORD_MIXING_FRIEND) + { + FrontierSpeechToString(gFacilityTrainers[trainerId].speechLose); + } + else if (trainerId < TRAINER_RECORD_MIXING_APPRENTICE) + { + if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) + FrontierSpeechToString(sub_81864E0()); + else + FrontierSpeechToString(gSaveBlock2Ptr->frontier.towerRecords[trainerId - TRAINER_RECORD_MIXING_FRIEND].speechLost); + } + else + { + if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) + { + trainerId = sub_81864A8(); + 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; +} + +void sub_81A3B00(void) +{ + if (gTrainerBattleOpponent_A == TRAINER_FRONTIER_BRAIN) + gSpecialVar_Result = TRUE; + else + gSpecialVar_Result = FALSE; +} + +u8 sub_81A3B30(u8 facility) +{ + return FlagGet(FLAG_SYS_TOWER_SILVER + facility * 2) + + FlagGet(FLAG_SYS_TOWER_GOLD + facility * 2); +} + +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); + + 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; +} + +void sub_81A3D30(void) +{ + s32 facility = VarGet(VAR_FRONTIER_FACILITY); + gSpecialVar_Result = sub_81A3B30(facility); +} + +void sub_81A3D58(void) +{ + s32 facility = VarGet(VAR_FRONTIER_FACILITY); + if (sub_81A3B30(facility) == 0) + FlagSet(FLAG_SYS_TOWER_SILVER + facility * 2); + else + FlagSet(FLAG_SYS_TOWER_GOLD + facility * 2); +} + +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; gUnknown_08611C9A[i] != 0xFFFF && gUnknown_08611C9A[i] != species; i++) + ; + + if (gUnknown_08611C9A[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)++; +} + +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 = gUnknown_08611C9A[0]; + for (i = 0; species != 0xFFFF; i++, species = gUnknown_08611C9A[i]) + { + if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_CAUGHT)) + caughtBannedMons++; + } + gStringVar1[0] = EOS; + gSpecialVar_0x8004 = 1; + count = 0; + for (i = 0; gUnknown_08611C9A[i] != 0xFFFF; i++) + count = sub_81A3DD0(gUnknown_08611C9A[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; + } +} + +void sub_81A4224(void) +{ + ValidateEReaderTrainer(); +} + +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; + } +} + +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); + } + } +} + +void sub_81A4410(void) +{ + gSpecialVar_Result = MoveRecordedBattleToSaveData(); + gSaveBlock2Ptr->frontier.field_CA9_b = 1; +} + +void sub_81A443C(void) +{ + switch (gSpecialVar_0x8005) + { + case 0: + GetFrontierTrainerName(gStringVar1, gTrainerBattleOpponent_A); + break; + case 1: + GetFrontierTrainerName(gStringVar2, gTrainerBattleOpponent_A); + break; + } +} + +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]; + } + } +} + +void sub_81A457C(void) +{ + sub_81A5030(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 ClearnRankingHallRecords(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++) + { + CopyUnalignedWord(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++) + { + CopyUnalignedWord(gSaveBlock2Ptr->hallRecords2P[j][k].id1, 0); // BUG: Passing 0 as a pointer instead of a pointer holding a value of 0. + CopyUnalignedWord(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); +} + +extern const u16 gFacilityToBrainTrainerId[]; +extern const u8 gUnknown_08611C8C[][2]; + +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 gUnknown_08611C8C[facility][1]; +} + +void SetFrontierBrainTrainerGfxId(void) +{ + s32 facility = VarGet(VAR_FRONTIER_FACILITY); + VarSet(VAR_OBJ_GFX_ID_0, gUnknown_08611C8C[facility][0]); +} + +s32 sub_81A513C(void); + +#define FRONTIER_BRAIN_OTID 61226 + +struct FrontierBrainMon +{ + u16 species; + u16 heldItem; + u8 fixedIV; + u8 nature; + u8 evs[6]; + u16 moves[4]; +}; + +extern const struct FrontierBrainMon sFrontierBrainsMons[][2][3]; + +void CreateFrontierBrainPokemon(void) +{ + s32 i, j; + s32 monCountInBits; + s32 monPartyId; + s32 monLevel; + u8 friendship; + s32 facility = VarGet(VAR_FRONTIER_FACILITY); + s32 symbol = sub_81A513C(); + + if (facility == FRONTIER_FACILITY_DOME) + monCountInBits = GetTrainerMonCountInBits(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++; + } +} diff --git a/src/new_game.c b/src/new_game.c index 127e48c35..e6bafa7a7 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); @@ -204,7 +204,7 @@ void NewGameInitData(void) copy_strings_to_sav1(); SetLilycoveLady(); ResetAllApprenticeData(); - sub_81A4B14(); + ClearnRankingHallRecords(); sub_8195E10(); sub_801AFD8(); sub_800E5AC(); diff --git a/src/overworld.c b/src/overworld.c index 8d73a6680..6fc880a54 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 "battle_frontier_2.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/record_mixing.c b/src/record_mixing.c index 4bb97cf1d..6caea7239 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,7 +92,7 @@ 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; @@ -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); } } @@ -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); + CopyUnalignedWord(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; + CopyUnalignedWord(dst->twoPlayers[j].id1, gSaveBlock2Ptr->playerTrainerId); + CopyUnalignedWord(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]; } } @@ -1702,7 +1688,7 @@ 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 *arg0, struct PlayerHallRecords *arg1, size_t arg2, u32 arg3, u32 arg4) { asm_unified(" push {r4-r7,lr}\n\ mov r7, r10\n\ @@ -2106,133 +2092,75 @@ _080E8864:\n\ "); } -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 arg1, 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, arg1, arg2, linkPlayerCount); sub_80E8924(largeStructPtr); Free(largeStructPtr); 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/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"); @@ -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: |