Refactor Frontier Brains (#5027)

* Created gFrontierBrainInfo with trainerId

* Added objEventGfx and isFemale

* Added win/loss texts

* Added battleBit and streakAppearances

* Added macro for texts

* Added macro for sprites
This commit is contained in:
Frank DeBlasio 2024-08-12 23:07:12 -04:00 committed by GitHub
parent c74ad262cb
commit f18859ac33
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -49,6 +49,17 @@ struct FrontierBrainMon
u16 moves[MAX_MON_MOVES];
};
struct FrontierBrain
{
u16 trainerId;
u8 objEventGfx;
u8 isFemale;
const u8 *lostTexts[2];
const u8 *wonTexts[2];
u16 battledBit[2];
u8 streakAppearances[4];
};
// This file's functions.
static void GetChallengeStatus(void);
static void GetFrontierData(void);
@ -83,16 +94,74 @@ static void ShowPyramidResultsWindow(void);
static void ShowLinkContestResultsWindow(void);
static void CopyFrontierBrainText(bool8 playerWonText);
// const rom data
static const u8 sFrontierBrainStreakAppearances[NUM_FRONTIER_FACILITIES][4] =
#define FRONTIER_BRAIN_SPRITES(Brain) \
.trainerId = TRAINER_##Brain, \
.objEventGfx = OBJ_EVENT_GFX_##Brain
#define FRONTIER_BRAIN_TEXTS(Brain) \
.lostTexts = {gText_##Brain##DefeatSilver, gText_##Brain##DefeatGold}, \
.wonTexts = {gText_##Brain##WonSilver, gText_##Brain##WonGold}
// battledBit: Flags to change the conversation when the Frontier Brain is encountered for a battle
// First bit is has battled them before and not won yet, second bit is has battled them and won (obtained a Symbol)
const struct FrontierBrain gFrontierBrainInfo[NUM_FRONTIER_FACILITIES] =
{
[FRONTIER_FACILITY_TOWER] = {35, 70, 35, 1},
[FRONTIER_FACILITY_DOME] = { 4, 9, 5, 0},
[FRONTIER_FACILITY_PALACE] = {21, 42, 21, 1},
[FRONTIER_FACILITY_ARENA] = {28, 56, 28, 1},
[FRONTIER_FACILITY_FACTORY] = {21, 42, 21, 1},
[FRONTIER_FACILITY_PIKE] = {28, 140, 56, 1},
[FRONTIER_FACILITY_PYRAMID] = {21, 70, 35, 0},
[FRONTIER_FACILITY_TOWER] =
{
FRONTIER_BRAIN_SPRITES(ANABEL),
.isFemale = TRUE,
FRONTIER_BRAIN_TEXTS(Anabel),
.battledBit = {1 << 0, 1 << 1},
.streakAppearances = {35, 70, 35, 1},
},
[FRONTIER_FACILITY_DOME] =
{
FRONTIER_BRAIN_SPRITES(TUCKER),
.isFemale = FALSE,
FRONTIER_BRAIN_TEXTS(Tucker),
.battledBit = {1 << 2, 1 << 3},
.streakAppearances = {1, 2, 5, 0},
},
[FRONTIER_FACILITY_PALACE] =
{
FRONTIER_BRAIN_SPRITES(SPENSER),
.isFemale = FALSE,
FRONTIER_BRAIN_TEXTS(Spenser),
.battledBit = {1 << 4, 1 << 5},
.streakAppearances = {21, 42, 21, 1},
},
[FRONTIER_FACILITY_ARENA] =
{
FRONTIER_BRAIN_SPRITES(GRETA),
.isFemale = TRUE,
FRONTIER_BRAIN_TEXTS(Greta),
.battledBit = {1 << 6, 1 << 7},
.streakAppearances = {28, 56, 28, 1},
},
[FRONTIER_FACILITY_FACTORY] =
{
FRONTIER_BRAIN_SPRITES(NOLAND),
.isFemale = FALSE,
FRONTIER_BRAIN_TEXTS(Noland),
.battledBit = {1 << 8, 1 << 9},
.streakAppearances = {21, 42, 21, 1},
},
[FRONTIER_FACILITY_PIKE] =
{
FRONTIER_BRAIN_SPRITES(LUCY),
.isFemale = TRUE,
FRONTIER_BRAIN_TEXTS(Lucy),
.battledBit = {1 << 10, 1 << 11},
.streakAppearances = {28, 140, 56, 1},
},
[FRONTIER_FACILITY_PYRAMID] =
{
FRONTIER_BRAIN_SPRITES(BRANDON),
.isFemale = FALSE,
FRONTIER_BRAIN_TEXTS(Brandon),
.battledBit = {1 << 12, 1 << 13},
.streakAppearances = {21, 70, 35, 0},
},
};
static const struct FrontierBrainMon sFrontierBrainsMons[][2][FRONTIER_PARTY_SIZE] =
@ -537,20 +606,6 @@ static const u8 sBattlePointAwards[NUM_FRONTIER_FACILITIES][FRONTIER_MODE_COUNT]
},
};
// Flags to change the conversation when the Frontier Brain is encountered for a battle
// First bit is has battled them before and not won yet, second bit is has battled them and won (obtained a Symbol)
static const u16 sBattledBrainBitFlags[NUM_FRONTIER_FACILITIES][2] =
{
[FRONTIER_FACILITY_TOWER] = {1 << 0, 1 << 1},
[FRONTIER_FACILITY_DOME] = {1 << 2, 1 << 3},
[FRONTIER_FACILITY_PALACE] = {1 << 4, 1 << 5},
[FRONTIER_FACILITY_ARENA] = {1 << 6, 1 << 7},
[FRONTIER_FACILITY_FACTORY] = {1 << 8, 1 << 9},
[FRONTIER_FACILITY_PIKE] = {1 << 10, 1 << 11},
[FRONTIER_FACILITY_PYRAMID] = {1 << 12, 1 << 13},
};
static void (* const sFrontierUtilFuncs[])(void) =
{
[FRONTIER_UTIL_FUNC_GET_STATUS] = GetChallengeStatus,
@ -611,18 +666,6 @@ static const struct WindowTemplate sRankingHallRecordsWindowTemplate =
.baseBlock = 1
};
// Second field - whether the character is female.
static const u8 sFrontierBrainObjEventGfx[NUM_FRONTIER_FACILITIES][2] =
{
[FRONTIER_FACILITY_TOWER] = {OBJ_EVENT_GFX_ANABEL, TRUE},
[FRONTIER_FACILITY_DOME] = {OBJ_EVENT_GFX_TUCKER, FALSE},
[FRONTIER_FACILITY_PALACE] = {OBJ_EVENT_GFX_SPENSER, FALSE},
[FRONTIER_FACILITY_ARENA] = {OBJ_EVENT_GFX_GRETA, TRUE},
[FRONTIER_FACILITY_FACTORY] = {OBJ_EVENT_GFX_NOLAND, FALSE},
[FRONTIER_FACILITY_PIKE] = {OBJ_EVENT_GFX_LUCY, TRUE},
[FRONTIER_FACILITY_PYRAMID] = {OBJ_EVENT_GFX_BRANDON, FALSE},
};
static const u8 *const sRecordsWindowChallengeTexts[][2] =
{
[RANKING_HALL_TOWER_SINGLES] = {gText_BattleTower2, gText_FacilitySingle},
@ -657,73 +700,6 @@ static const u8 *const sHallFacilityToRecordsText[] =
[RANKING_HALL_TOWER_LINK] = gText_FrontierFacilityWinStreak,
};
static const u16 sFrontierBrainTrainerIds[NUM_FRONTIER_FACILITIES] =
{
[FRONTIER_FACILITY_TOWER] = TRAINER_ANABEL,
[FRONTIER_FACILITY_DOME] = TRAINER_TUCKER,
[FRONTIER_FACILITY_PALACE] = TRAINER_SPENSER,
[FRONTIER_FACILITY_ARENA] = TRAINER_GRETA,
[FRONTIER_FACILITY_FACTORY] = TRAINER_NOLAND,
[FRONTIER_FACILITY_PIKE] = TRAINER_LUCY,
[FRONTIER_FACILITY_PYRAMID] = TRAINER_BRANDON,
};
static const u8 *const sFrontierBrainPlayerLostSilverTexts[NUM_FRONTIER_FACILITIES] =
{
[FRONTIER_FACILITY_TOWER] = gText_AnabelWonSilver,
[FRONTIER_FACILITY_DOME] = gText_TuckerWonSilver,
[FRONTIER_FACILITY_PALACE] = gText_SpenserWonSilver,
[FRONTIER_FACILITY_ARENA] = gText_GretaWonSilver,
[FRONTIER_FACILITY_FACTORY] = gText_NolandWonSilver,
[FRONTIER_FACILITY_PIKE] = gText_LucyWonSilver,
[FRONTIER_FACILITY_PYRAMID] = gText_BrandonWonSilver,
};
static const u8 *const sFrontierBrainPlayerWonSilverTexts[NUM_FRONTIER_FACILITIES] =
{
[FRONTIER_FACILITY_TOWER] = gText_AnabelDefeatSilver,
[FRONTIER_FACILITY_DOME] = gText_TuckerDefeatSilver,
[FRONTIER_FACILITY_PALACE] = gText_SpenserDefeatSilver,
[FRONTIER_FACILITY_ARENA] = gText_GretaDefeatSilver,
[FRONTIER_FACILITY_FACTORY] = gText_NolandDefeatSilver,
[FRONTIER_FACILITY_PIKE] = gText_LucyDefeatSilver,
[FRONTIER_FACILITY_PYRAMID] = gText_BrandonDefeatSilver,
};
static const u8 *const sFrontierBrainPlayerLostGoldTexts[NUM_FRONTIER_FACILITIES] =
{
[FRONTIER_FACILITY_TOWER] = gText_AnabelWonGold,
[FRONTIER_FACILITY_DOME] = gText_TuckerWonGold,
[FRONTIER_FACILITY_PALACE] = gText_SpenserWonGold,
[FRONTIER_FACILITY_ARENA] = gText_GretaWonGold,
[FRONTIER_FACILITY_FACTORY] = gText_NolandWonGold,
[FRONTIER_FACILITY_PIKE] = gText_LucyWonGold,
[FRONTIER_FACILITY_PYRAMID] = gText_BrandonWonGold,
};
static const u8 *const sFrontierBrainPlayerWonGoldTexts[NUM_FRONTIER_FACILITIES] =
{
[FRONTIER_FACILITY_TOWER] = gText_AnabelDefeatGold,
[FRONTIER_FACILITY_DOME] = gText_TuckerDefeatGold,
[FRONTIER_FACILITY_PALACE] = gText_SpenserDefeatGold,
[FRONTIER_FACILITY_ARENA] = gText_GretaDefeatGold,
[FRONTIER_FACILITY_FACTORY] = gText_NolandDefeatGold,
[FRONTIER_FACILITY_PIKE] = gText_LucyDefeatGold,
[FRONTIER_FACILITY_PYRAMID] = gText_BrandonDefeatGold,
};
static const u8 *const *const sFrontierBrainPlayerLostTexts[] =
{
sFrontierBrainPlayerLostSilverTexts,
sFrontierBrainPlayerLostGoldTexts,
};
static const u8 *const *const sFrontierBrainPlayerWonTexts[] =
{
sFrontierBrainPlayerWonSilverTexts,
sFrontierBrainPlayerWonGoldTexts,
};
// code
void CallFrontierUtilFunc(void)
{
@ -785,7 +761,7 @@ static void GetFrontierData(void)
gSpecialVar_Result = gSaveBlock2Ptr->frontier.disableRecordBattle;
break;
case FRONTIER_DATA_HEARD_BRAIN_SPEECH:
gSpecialVar_Result = gSaveBlock2Ptr->frontier.battledBrainFlags & sBattledBrainBitFlags[facility][hasSymbol];
gSpecialVar_Result = gSaveBlock2Ptr->frontier.battledBrainFlags & gFrontierBrainInfo[facility].battledBit[hasSymbol];
break;
}
}
@ -820,7 +796,7 @@ static void SetFrontierData(void)
gSaveBlock2Ptr->frontier.disableRecordBattle = gSpecialVar_0x8006;
break;
case FRONTIER_DATA_HEARD_BRAIN_SPEECH:
gSaveBlock2Ptr->frontier.battledBrainFlags |= sBattledBrainBitFlags[facility][hasSymbol];
gSaveBlock2Ptr->frontier.battledBrainFlags |= gFrontierBrainInfo[facility].battledBit[hasSymbol];
break;
}
}
@ -1600,7 +1576,7 @@ u8 GetFrontierBrainStatus(void)
s32 facility = VarGet(VAR_FRONTIER_FACILITY);
s32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
u16 winStreakNoModifier = GetCurrentFacilityWinStreak();
s32 winStreak = winStreakNoModifier + sFrontierBrainStreakAppearances[facility][3];
s32 winStreak = winStreakNoModifier + gFrontierBrainInfo[facility].streakAppearances[3];
s32 symbolsCount;
if (battleMode != FRONTIER_MODE_SINGLES)
@ -1612,20 +1588,20 @@ u8 GetFrontierBrainStatus(void)
// Missing a symbol
case 0:
case 1:
if (winStreak == sFrontierBrainStreakAppearances[facility][symbolsCount])
if (winStreak == gFrontierBrainInfo[facility].streakAppearances[symbolsCount])
status = symbolsCount + 1; // FRONTIER_BRAIN_SILVER and FRONTIER_BRAIN_GOLD
break;
// Already received both symbols
case 2:
default:
// Silver streak is reached
if (winStreak == sFrontierBrainStreakAppearances[facility][0])
if (winStreak == gFrontierBrainInfo[facility].streakAppearances[0])
status = FRONTIER_BRAIN_STREAK;
// Gold streak is reached
else if (winStreak == sFrontierBrainStreakAppearances[facility][1])
else if (winStreak == gFrontierBrainInfo[facility].streakAppearances[1])
status = FRONTIER_BRAIN_STREAK_LONG;
// Some increment of the gold streak is reached
else if (winStreak > sFrontierBrainStreakAppearances[facility][1] && (winStreak - sFrontierBrainStreakAppearances[facility][1]) % sFrontierBrainStreakAppearances[facility][2] == 0)
else if (winStreak > gFrontierBrainInfo[facility].streakAppearances[1] && (winStreak - gFrontierBrainInfo[facility].streakAppearances[1]) % gFrontierBrainInfo[facility].streakAppearances[2] == 0)
status = FRONTIER_BRAIN_STREAK_LONG;
break;
}
@ -2396,7 +2372,7 @@ u8 GetFrontierBrainTrainerPicIndex(void)
else
facility = VarGet(VAR_FRONTIER_FACILITY);
return GetTrainerPicFromId(sFrontierBrainTrainerIds[facility]);
return GetTrainerPicFromId(gFrontierBrainInfo[facility].trainerId);
}
u8 GetFrontierBrainTrainerClass(void)
@ -2408,7 +2384,7 @@ u8 GetFrontierBrainTrainerClass(void)
else
facility = VarGet(VAR_FRONTIER_FACILITY);
return GetTrainerClassFromId(sFrontierBrainTrainerIds[facility]);
return GetTrainerClassFromId(gFrontierBrainInfo[facility].trainerId);
}
void CopyFrontierBrainTrainerName(u8 *dst)
@ -2422,7 +2398,7 @@ void CopyFrontierBrainTrainerName(u8 *dst)
else
facility = VarGet(VAR_FRONTIER_FACILITY);
trainerName = GetTrainerNameFromId(sFrontierBrainTrainerIds[facility]);
trainerName = GetTrainerNameFromId(gFrontierBrainInfo[facility].trainerId);
for (i = 0; i < PLAYER_NAME_LENGTH; i++)
dst[i] = trainerName[i];
@ -2432,13 +2408,13 @@ void CopyFrontierBrainTrainerName(u8 *dst)
bool8 IsFrontierBrainFemale(void)
{
s32 facility = VarGet(VAR_FRONTIER_FACILITY);
return sFrontierBrainObjEventGfx[facility][1];
return gFrontierBrainInfo[facility].isFemale;
}
void SetFrontierBrainObjEventGfx_2(void)
{
s32 facility = VarGet(VAR_FRONTIER_FACILITY);
VarSet(VAR_OBJ_GFX_ID_0, sFrontierBrainObjEventGfx[facility][0]);
VarSet(VAR_OBJ_GFX_ID_0, gFrontierBrainInfo[facility].objEventGfx);
}
#define FRONTIER_BRAIN_OTID 61226
@ -2505,7 +2481,7 @@ u16 GetFrontierBrainMonSpecies(u8 monId)
void SetFrontierBrainObjEventGfx(u8 facility)
{
gTrainerBattleOpponent_A = TRAINER_FRONTIER_BRAIN;
VarSet(VAR_OBJ_GFX_ID_0, sFrontierBrainObjEventGfx[facility][0]);
VarSet(VAR_OBJ_GFX_ID_0, gFrontierBrainInfo[facility].objEventGfx);
}
u16 GetFrontierBrainMonMove(u8 monId, u8 moveSlotId)
@ -2540,12 +2516,12 @@ s32 GetFronterBrainSymbol(void)
if (symbol == 2)
{
u16 winStreak = GetCurrentFacilityWinStreak();
if (winStreak + sFrontierBrainStreakAppearances[facility][3] == sFrontierBrainStreakAppearances[facility][0])
if (winStreak + gFrontierBrainInfo[facility].streakAppearances[3] == gFrontierBrainInfo[facility].streakAppearances[0])
symbol = 0;
else if (winStreak + sFrontierBrainStreakAppearances[facility][3] == sFrontierBrainStreakAppearances[facility][1])
else if (winStreak + gFrontierBrainInfo[facility].streakAppearances[3] == gFrontierBrainInfo[facility].streakAppearances[1])
symbol = 1;
else if (winStreak + sFrontierBrainStreakAppearances[facility][3] > sFrontierBrainStreakAppearances[facility][1]
&& (winStreak + sFrontierBrainStreakAppearances[facility][3] - sFrontierBrainStreakAppearances[facility][1]) % sFrontierBrainStreakAppearances[facility][2] == 0)
else if (winStreak + gFrontierBrainInfo[facility].streakAppearances[3] > gFrontierBrainInfo[facility].streakAppearances[1]
&& (winStreak + gFrontierBrainInfo[facility].streakAppearances[3] - gFrontierBrainInfo[facility].streakAppearances[1]) % gFrontierBrainInfo[facility].streakAppearances[2] == 0)
symbol = 1;
}
return symbol;
@ -2571,10 +2547,10 @@ static void CopyFrontierBrainText(bool8 playerWonText)
switch (playerWonText)
{
case FALSE:
StringCopy(gStringVar4, sFrontierBrainPlayerLostTexts[symbol][facility]);
StringCopy(gStringVar4, gFrontierBrainInfo[facility].wonTexts[symbol]);
break;
case TRUE:
StringCopy(gStringVar4, sFrontierBrainPlayerWonTexts[symbol][facility]);
StringCopy(gStringVar4, gFrontierBrainInfo[facility].lostTexts[symbol]);
break;
}
}