Test Runner support for illegal abilities (#3045)

This commit is contained in:
Eduardo Quezada D'Ottone 2023-06-17 17:23:32 -04:00 committed by GitHub
commit 7505b323ab
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 36 additions and 1 deletions

View File

@ -17,6 +17,8 @@ void TestRunner_Battle_AfterLastTurn(void);
void TestRunner_Battle_CheckBattleRecordActionType(u32 battlerId, u32 recordIndex, u32 actionType);
u32 TestRunner_Battle_GetForcedAbility(u32 side, u32 partyIndex);
#else
#define TestRunner_Battle_RecordAbilityPopUp(...) (void)0
@ -28,6 +30,8 @@ void TestRunner_Battle_CheckBattleRecordActionType(u32 battlerId, u32 recordInde
#define TestRunner_Battle_CheckBattleRecordActionType(...) (void)0
#define TestRunner_Battle_GetForcedAbility(...) (u32)0
#endif
#endif

View File

@ -3302,6 +3302,15 @@ void SwitchInClearSetData(void)
// Clear selected party ID so Revival Blessing doesn't get confused.
gSelectedMonPartyId = PARTY_SIZE;
// Allow for illegal abilities within tests.
if (gTestRunnerEnabled)
{
u32 side = GetBattlerSide(gActiveBattler);
u32 partyIndex = gBattlerPartyIndexes[gActiveBattler];
if (TestRunner_Battle_GetForcedAbility(side, partyIndex))
gBattleMons[i].ability = gBattleStruct->overwrittenAbilities[i] = TestRunner_Battle_GetForcedAbility(side, partyIndex);
}
Ai_UpdateSwitchInData(gActiveBattler);
}
@ -3794,6 +3803,18 @@ static void TryDoEventsBeforeFirstTurn(void)
}
}
// Allow for illegal abilities within tests.
if (gTestRunnerEnabled && gBattleStruct->switchInAbilitiesCounter == 0)
{
for (i = 0; i < gBattlersCount; ++i)
{
u32 side = GetBattlerSide(i);
u32 partyIndex = gBattlerPartyIndexes[i];
if (TestRunner_Battle_GetForcedAbility(side, partyIndex))
gBattleMons[i].ability = gBattleStruct->overwrittenAbilities[i] = TestRunner_Battle_GetForcedAbility(side, partyIndex);
}
}
if (gBattleStruct->switchInAbilitiesCounter == 0)
{
for (i = 0; i < gBattlersCount; i++)

View File

@ -574,6 +574,7 @@ struct BattleTestData
struct Pokemon *currentMon;
u8 gender;
u8 nature;
u16 forcedAbilities[NUM_BATTLE_SIDES][PARTY_SIZE];
u8 currentMonIndexes[MAX_BATTLERS_COUNT];
u8 turnState;

View File

@ -1090,7 +1090,11 @@ void Ability_(u32 sourceLine, u32 ability)
break;
}
}
INVALID_IF(i == NUM_ABILITY_SLOTS, "%S cannot have %S", gSpeciesNames[species], gAbilityNames[ability]);
// Store forced ability to be set when the battle starts if invalid.
if (i == NUM_ABILITY_SLOTS)
{
DATA.forcedAbilities[DATA.currentSide][DATA.currentPartyIndex] = ability;
}
}
void Level_(u32 sourceLine, u32 level)
@ -1774,3 +1778,8 @@ void ValidateFinally(u32 sourceLine)
return;
INVALID_IF(STATE->parametersCount == 0, "FINALLY without PARAMETRIZE");
}
u32 TestRunner_Battle_GetForcedAbility(u32 side, u32 partyIndex)
{
return DATA.forcedAbilities[side][partyIndex];
}