Add dedicated getter functions for Pokémon types and abilities (#7043)

This commit is contained in:
Bassoonian 2025-06-03 22:05:22 +02:00 committed by GitHub
parent 177fa2f096
commit 1a6ed20713
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
105 changed files with 494 additions and 455 deletions

View File

@ -79,7 +79,7 @@ SINGLE_BATTLE_TEST("Stun Spore does not affect Grass-types")
{
GIVEN {
ASSUME(IsPowderMove(MOVE_STUN_SPORE));
ASSUME(gSpeciesInfo[SPECIES_ODDISH].types[0] == TYPE_GRASS);
ASSUME(GetSpeciesType(SPECIES_ODDISH, 0) == TYPE_GRASS);
PLAYER(SPECIES_ODDISH); // 1.
OPPONENT(SPECIES_ODDISH); // 2.
} WHEN {

View File

@ -853,11 +853,11 @@ static inline bool32 IsBattleMoveStatus(u32 move)
gBattleMons[battler].types[2] = TYPE_MYSTERY; \
}
#define RESTORE_BATTLER_TYPE(battler) \
{ \
gBattleMons[battler].types[0] = gSpeciesInfo[gBattleMons[battler].species].types[0]; \
gBattleMons[battler].types[1] = gSpeciesInfo[gBattleMons[battler].species].types[1]; \
gBattleMons[battler].types[2] = TYPE_MYSTERY; \
#define RESTORE_BATTLER_TYPE(battler) \
{ \
gBattleMons[battler].types[0] = GetSpeciesType(gBattleMons[battler].species, 0); \
gBattleMons[battler].types[1] = GetSpeciesType(gBattleMons[battler].species, 1); \
gBattleMons[battler].types[2] = TYPE_MYSTERY; \
}
#define GET_STAT_BUFF_ID(n) ((n & 7)) // first three bits 0x1, 0x2, 0x4

View File

@ -720,8 +720,16 @@ bool8 IsPokemonStorageFull(void);
const u8 *GetSpeciesName(u16 species);
const u8 *GetSpeciesCategory(u16 species);
const u8 *GetSpeciesPokedexDescription(u16 species);
u16 GetSpeciesHeight(u16 species);
u16 GetSpeciesWeight(u16 species);
u32 GetSpeciesHeight(u16 species);
u32 GetSpeciesWeight(u16 species);
u32 GetSpeciesType(u16 species, u8 slot);
u32 GetSpeciesAbility(u16 species, u8 slot);
u32 GetSpeciesBaseHP(u16 species);
u32 GetSpeciesBaseAttack(u16 species);
u32 GetSpeciesBaseDefense(u16 species);
u32 GetSpeciesBaseSpAttack(u16 species);
u32 GetSpeciesBaseSpDefense(u16 species);
u32 GetSpeciesBaseSpeed(u16 species);
const struct LevelUpMove *GetSpeciesLevelUpLearnset(u16 species);
const u16 *GetSpeciesTeachableLearnset(u16 species);
const u16 *GetSpeciesEggMoves(u16 species);

View File

@ -88,7 +88,7 @@
* {
* GIVEN {
* ASSUME(IsPowderMove(MOVE_STUN_SPORE));
* ASSUME(gSpeciesInfo[SPECIES_ODDISH].types[0] == TYPE_GRASS);
* ASSUME(GetSpeciesType(SPECIES_ODDISH, 0) == TYPE_GRASS);
* PLAYER(SPECIES_ODDISH); // 1.
* OPPONENT(SPECIES_ODDISH); // 2.
* } WHEN {

View File

@ -649,7 +649,7 @@ u32 GetPartyMonAbility(struct Pokemon *mon)
{
// Doesn't have any special handling yet
u32 species = GetMonData(mon, MON_DATA_SPECIES);
u32 ability = gSpeciesInfo[species].abilities[GetMonData(mon, MON_DATA_ABILITY_NUM)];
u32 ability = GetSpeciesAbility(species, GetMonData(mon, MON_DATA_ABILITY_NUM));
return ability;
}
@ -5504,11 +5504,11 @@ static s32 AI_Risky(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
switch (GetMoveEffect(move))
{
case EFFECT_COUNTER:
if (gSpeciesInfo[gBattleMons[battlerDef].species].baseAttack >= gSpeciesInfo[gBattleMons[battlerDef].species].baseSpAttack + 10)
if (GetSpeciesBaseAttack(gBattleMons[battlerDef].species) >= GetSpeciesBaseSpAttack(gBattleMons[battlerDef].species) + 10)
ADJUST_SCORE(STRONG_RISKY_EFFECT);
break;
case EFFECT_MIRROR_COAT:
if (gSpeciesInfo[gBattleMons[battlerDef].species].baseSpAttack >= gSpeciesInfo[gBattleMons[battlerDef].species].baseAttack + 10)
if (GetSpeciesBaseSpAttack(gBattleMons[battlerDef].species) >= GetSpeciesBaseAttack(gBattleMons[battlerDef].species) + 10)
ADJUST_SCORE(STRONG_RISKY_EFFECT);
break;
case EFFECT_EXPLOSION:
@ -5521,7 +5521,7 @@ static s32 AI_Risky(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
ADJUST_SCORE(AVERAGE_RISKY_EFFECT);
break;
case EFFECT_REVENGE:
if (gSpeciesInfo[gBattleMons[battlerDef].species].baseSpeed >= gSpeciesInfo[gBattleMons[battlerAtk].species].baseSpeed + 10)
if (GetSpeciesBaseSpeed(gBattleMons[battlerDef].species) >= GetSpeciesBaseSpeed(gBattleMons[battlerAtk].species) + 10)
ADJUST_SCORE(AVERAGE_RISKY_EFFECT);
break;
case EFFECT_BELLY_DRUM:

View File

@ -1429,8 +1429,8 @@ static u32 GetBestMonTypeMatchup(struct Pokemon *party, int firstId, int lastId,
u8 atkType1 = gBattleMons[opposingBattler].types[0];
u8 atkType2 = gBattleMons[opposingBattler].types[1];
u8 defType1 = gSpeciesInfo[species].types[0];
u8 defType2 = gSpeciesInfo[species].types[1];
u8 defType1 = GetSpeciesType(species, 0);
u8 defType2 = GetSpeciesType(species, 1);
typeEffectiveness = uq4_12_multiply(typeEffectiveness, (GetTypeModifier(atkType1, defType1)));
if (atkType2 != atkType1)
@ -1901,7 +1901,7 @@ static u16 GetSwitchinTypeMatchup(u32 opposingBattler, struct BattlePokemon batt
// Check type matchup
u16 typeEffectiveness = UQ_4_12(1.0);
u8 atkType1 = gSpeciesInfo[gBattleMons[opposingBattler].species].types[0], atkType2 = gSpeciesInfo[gBattleMons[opposingBattler].species].types[1],
u8 atkType1 = GetSpeciesType(gBattleMons[opposingBattler].species, 0), atkType2 = GetSpeciesType(gBattleMons[opposingBattler].species, 1),
defType1 = battleMon.types[0], defType2 = battleMon.types[1];
// Multiply type effectiveness by a factor depending on type matchup

View File

@ -289,11 +289,11 @@ void SetBattlerData(u32 battlerId)
if (illusionSpecies != SPECIES_NONE && ShouldFailForIllusion(illusionSpecies, battlerId))
{
// If the battler's type has not been changed, AI assumes the types of the illusion mon.
if (gBattleMons[battlerId].types[0] == gSpeciesInfo[species].types[0]
&& gBattleMons[battlerId].types[1] == gSpeciesInfo[species].types[1])
if (gBattleMons[battlerId].types[0] == GetSpeciesType(species, 0)
&& gBattleMons[battlerId].types[1] == GetSpeciesType(species, 1))
{
gBattleMons[battlerId].types[0] = gSpeciesInfo[illusionSpecies].types[0];
gBattleMons[battlerId].types[1] = gSpeciesInfo[illusionSpecies].types[1];
gBattleMons[battlerId].types[0] = GetSpeciesType(illusionSpecies, 0);
gBattleMons[battlerId].types[1] = GetSpeciesType(illusionSpecies, 1);
}
species = illusionSpecies;
}
@ -302,9 +302,9 @@ void SetBattlerData(u32 battlerId)
if (gAiPartyData->mons[side][gBattlerPartyIndexes[battlerId]].ability != ABILITY_NONE)
gBattleMons[battlerId].ability = gAiPartyData->mons[side][gBattlerPartyIndexes[battlerId]].ability;
// Check if mon can only have one ability.
else if (gSpeciesInfo[species].abilities[1] == ABILITY_NONE
|| gSpeciesInfo[species].abilities[1] == gSpeciesInfo[species].abilities[0])
gBattleMons[battlerId].ability = gSpeciesInfo[species].abilities[0];
else if (GetSpeciesAbility(species, 1) == ABILITY_NONE
|| GetSpeciesAbility(species, 1) == GetSpeciesAbility(species, 0))
gBattleMons[battlerId].ability = GetSpeciesAbility(species, 0);
// The ability is unknown.
else
gBattleMons[battlerId].ability = ABILITY_NONE;
@ -385,12 +385,12 @@ bool32 IsBattlerTrapped(u32 battlerAtk, u32 battlerDef)
u32 GetTotalBaseStat(u32 species)
{
return gSpeciesInfo[species].baseHP
+ gSpeciesInfo[species].baseAttack
+ gSpeciesInfo[species].baseDefense
+ gSpeciesInfo[species].baseSpeed
+ gSpeciesInfo[species].baseSpAttack
+ gSpeciesInfo[species].baseSpDefense;
return GetSpeciesBaseHP(species)
+ GetSpeciesBaseAttack(species)
+ GetSpeciesBaseDefense(species)
+ GetSpeciesBaseSpeed(species)
+ GetSpeciesBaseSpAttack(species)
+ GetSpeciesBaseSpDefense(species);
}
bool32 IsTruantMonVulnerable(u32 battlerAI, u32 opposingBattler)
@ -1463,7 +1463,7 @@ s32 AI_DecideKnownAbilityForTurn(u32 battlerId)
for (i = 0; i < NUM_ABILITY_SLOTS; i++)
{
indexAbility = gSpeciesInfo[gBattleMons[battlerId].species].abilities[i];
indexAbility = GetSpeciesAbility(gBattleMons[battlerId].species, i);
if (indexAbility != ABILITY_NONE)
{
abilityAiRatings[numValidAbilities] = gAbilitiesInfo[indexAbility].aiRating;
@ -2999,8 +2999,8 @@ static bool32 PartyBattlerShouldAvoidHazards(u32 currBattler, u32 switchBattler)
u32 species = GetMonData(mon, MON_DATA_SPECIES);
u32 flags = gSideStatuses[GetBattlerSide(currBattler)] & (SIDE_STATUS_SPIKES | SIDE_STATUS_STEALTH_ROCK | SIDE_STATUS_STEELSURGE | SIDE_STATUS_STICKY_WEB | SIDE_STATUS_TOXIC_SPIKES);
s32 hazardDamage = 0;
u32 type1 = gSpeciesInfo[species].types[0];
u32 type2 = gSpeciesInfo[species].types[1];
u32 type1 = GetSpeciesType(species, 0);
u32 type2 = GetSpeciesType(species, 1);
u32 maxHp = GetMonData(mon, MON_DATA_MAX_HP);
if (flags == 0)
@ -4331,7 +4331,7 @@ void IncreaseBurnScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score)
{
if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL)
|| (!(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_OMNISCIENT) // Not Omniscient but expects physical attacker
&& gSpeciesInfo[gBattleMons[battlerDef].species].baseAttack >= gSpeciesInfo[gBattleMons[battlerDef].species].baseSpAttack + 10))
&& GetSpeciesBaseAttack(gBattleMons[battlerDef].species) >= GetSpeciesBaseSpAttack(gBattleMons[battlerDef].species) + 10))
{
if (GetMoveCategory(GetBestDmgMoveFromBattler(battlerDef, battlerAtk, AI_DEFENDING)) == DAMAGE_CATEGORY_PHYSICAL)
ADJUST_SCORE_PTR(DECENT_EFFECT);
@ -4415,7 +4415,7 @@ void IncreaseFrostbiteScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score
{
if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL)
|| (!(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_OMNISCIENT) // Not Omniscient but expects special attacker
&& gSpeciesInfo[gBattleMons[battlerDef].species].baseSpAttack >= gSpeciesInfo[gBattleMons[battlerDef].species].baseAttack + 10))
&& GetSpeciesBaseSpAttack(gBattleMons[battlerDef].species) >= GetSpeciesBaseAttack(gBattleMons[battlerDef].species) + 10))
{
if (GetMoveCategory(GetBestDmgMoveFromBattler(battlerDef, battlerAtk, AI_DEFENDING)) == DAMAGE_CATEGORY_SPECIAL)
ADJUST_SCORE_PTR(DECENT_EFFECT);

View File

@ -1742,7 +1742,7 @@ static void MoveSelectionDisplayMoveType(u32 battler)
if (speciesId == SPECIES_OGERPON_WELLSPRING || speciesId == SPECIES_OGERPON_WELLSPRING_TERA
|| speciesId == SPECIES_OGERPON_HEARTHFLAME || speciesId == SPECIES_OGERPON_HEARTHFLAME_TERA
|| speciesId == SPECIES_OGERPON_CORNERSTONE || speciesId == SPECIES_OGERPON_CORNERSTONE_TERA)
type = gSpeciesInfo[speciesId].types[1];
type = GetSpeciesType(speciesId, 1);
}
else if (GetMoveCategory(move) == DAMAGE_CATEGORY_STATUS
&& (GetActiveGimmick(battler) == GIMMICK_DYNAMAX || IsGimmickSelected(battler, GIMMICK_DYNAMAX)))

View File

@ -2030,8 +2030,8 @@ static void InitDomeTrainers(void)
rankingScores[0] += GetMonData(&gPlayerParty[trainerId], MON_DATA_SPDEF, NULL);
rankingScores[0] += GetMonData(&gPlayerParty[trainerId], MON_DATA_SPEED, NULL);
rankingScores[0] += GetMonData(&gPlayerParty[trainerId], MON_DATA_MAX_HP, NULL);
monTypesBits |= 1u << gSpeciesInfo[GetMonData(&gPlayerParty[trainerId], MON_DATA_SPECIES, NULL)].types[0];
monTypesBits |= 1u << gSpeciesInfo[GetMonData(&gPlayerParty[trainerId], MON_DATA_SPECIES, NULL)].types[1];
monTypesBits |= 1u << GetSpeciesType(GetMonData(&gPlayerParty[trainerId], MON_DATA_SPECIES, NULL), 0);
monTypesBits |= 1u << GetSpeciesType(GetMonData(&gPlayerParty[trainerId], MON_DATA_SPECIES, NULL), 1);
}
// Count the number of types in the players party, to factor into the ranking
@ -2062,8 +2062,8 @@ static void InitDomeTrainers(void)
rankingScores[i] += statValues[STAT_SPDEF];
rankingScores[i] += statValues[STAT_SPEED];
rankingScores[i] += statValues[STAT_HP];
monTypesBits |= 1u << gSpeciesInfo[gFacilityTrainerMons[DOME_MONS[i][j]].species].types[0];
monTypesBits |= 1u << gSpeciesInfo[gFacilityTrainerMons[DOME_MONS[i][j]].species].types[1];
monTypesBits |= 1u << GetSpeciesType(gFacilityTrainerMons[DOME_MONS[i][j]].species, 0);
monTypesBits |= 1u << GetSpeciesType(gFacilityTrainerMons[DOME_MONS[i][j]].species, 1);
}
for (monTypesCount = 0, j = 0; j < 32; j++)
@ -2151,7 +2151,7 @@ static void CalcDomeMonStats(const struct TrainerMon *fmon, int level, u8 ivs, i
}
else
{
int n = 2 * gSpeciesInfo[fmon->species].baseHP;
int n = 2 * GetSpeciesBaseHP(fmon->species);
stats[STAT_HP] = (((n + ivs + evs[STAT_HP] / 4) * level) / 100) + level + 10;
}
@ -2398,9 +2398,9 @@ static int GetTypeEffectivenessPoints(int move, int targetSpecies, int mode)
if (move == MOVE_NONE || move == MOVE_UNAVAILABLE || IsBattleMoveStatus(move))
return 0;
defType1 = gSpeciesInfo[targetSpecies].types[0];
defType2 = gSpeciesInfo[targetSpecies].types[1];
defAbility = gSpeciesInfo[targetSpecies].abilities[0];
defType1 = GetSpeciesType(targetSpecies, 0);
defType2 = GetSpeciesType(targetSpecies, 1);
defAbility = GetSpeciesAbility(targetSpecies, 0);
moveType = GetMoveType(move);
if (defAbility == ABILITY_LEVITATE && moveType == TYPE_GROUND)
@ -5146,9 +5146,9 @@ static u16 GetWinningMove(int winnerTournamentId, int loserTournamentId, u8 roun
targetSpecies = gFacilityTrainerMons[DOME_MONS[loserTournamentId][k]].species;
if (personality & 1)
targetAbility = gSpeciesInfo[targetSpecies].abilities[1];
targetAbility = GetSpeciesAbility(targetSpecies, 1);
else
targetAbility = gSpeciesInfo[targetSpecies].abilities[0];
targetAbility = GetSpeciesAbility(targetSpecies, 0);
typeMultiplier = CalcPartyMonTypeEffectivenessMultiplier(moves[i * 4 + j], targetSpecies, targetAbility);
if (typeMultiplier == UQ_4_12(0))
@ -5820,8 +5820,8 @@ static void InitRandomTourneyTreeResults(void)
statSums[i] += statValues[STAT_SPDEF];
statSums[i] += statValues[STAT_SPEED];
statSums[i] += statValues[STAT_HP];
monTypesBits |= 1u << gSpeciesInfo[gFacilityTrainerMons[DOME_MONS[i][j]].species].types[0];
monTypesBits |= 1u << gSpeciesInfo[gFacilityTrainerMons[DOME_MONS[i][j]].species].types[1];
monTypesBits |= 1u << GetSpeciesType(gFacilityTrainerMons[DOME_MONS[i][j]].species, 0);
monTypesBits |= 1u << GetSpeciesType(gFacilityTrainerMons[DOME_MONS[i][j]].species, 1);
}
// Because GF hates temporary vars, trainerId acts like monTypesCount here.
@ -5947,12 +5947,7 @@ static void DecideRoundWinners(u8 roundId)
}
}
species = gFacilityTrainerMons[DOME_MONS[tournamentId1][monId1]].species;
points1 += ( gSpeciesInfo[species].baseHP
+ gSpeciesInfo[species].baseAttack
+ gSpeciesInfo[species].baseDefense
+ gSpeciesInfo[species].baseSpeed
+ gSpeciesInfo[species].baseSpAttack
+ gSpeciesInfo[species].baseSpDefense) / 10;
points1 += GetTotalBaseStat(species) / 10;
}
// Random part of the formula.
points1 += (Random() & 0x1F);
@ -5970,12 +5965,7 @@ static void DecideRoundWinners(u8 roundId)
}
}
species = gFacilityTrainerMons[DOME_MONS[tournamentId2][monId1]].species;
points2 += ( gSpeciesInfo[species].baseHP
+ gSpeciesInfo[species].baseAttack
+ gSpeciesInfo[species].baseDefense
+ gSpeciesInfo[species].baseSpeed
+ gSpeciesInfo[species].baseSpAttack
+ gSpeciesInfo[species].baseSpDefense) / 10;
points2 += GetTotalBaseStat(species) / 10;
}
// Random part of the formula.
points2 += (Random() & 0x1F);

View File

@ -560,9 +560,9 @@ static void GetOpponentMostCommonMonType(void)
for (i = 0; i < FRONTIER_PARTY_SIZE; i++)
{
u32 species = gFacilityTrainerMons[gFrontierTempParty[i]].species;
typeCounts[gSpeciesInfo[species].types[0]]++;
if (gSpeciesInfo[species].types[0] != gSpeciesInfo[species].types[1])
typeCounts[gSpeciesInfo[species].types[1]]++;
typeCounts[GetSpeciesType(species, 0)]++;
if (GetSpeciesType(species, 0) != GetSpeciesType(species, 1))
typeCounts[GetSpeciesType(species, 1)]++;
}
// Determine which are the two most-common types.

View File

@ -3361,8 +3361,8 @@ const u8* FaintClearSetData(u32 battler)
gBattleStruct->lastTakenMoveFrom[i][battler] = 0;
}
gBattleMons[battler].types[0] = gSpeciesInfo[gBattleMons[battler].species].types[0];
gBattleMons[battler].types[1] = gSpeciesInfo[gBattleMons[battler].species].types[1];
gBattleMons[battler].types[0] = GetSpeciesType(gBattleMons[battler].species, 0);
gBattleMons[battler].types[1] = GetSpeciesType(gBattleMons[battler].species, 1);
gBattleMons[battler].types[2] = TYPE_MYSTERY;
Ai_UpdateFaintData(battler);
@ -3457,8 +3457,8 @@ static void DoBattleIntro(void)
else
{
memcpy(&gBattleMons[battler], &gBattleResources->bufferB[battler][4], sizeof(struct BattlePokemon));
gBattleMons[battler].types[0] = gSpeciesInfo[gBattleMons[battler].species].types[0];
gBattleMons[battler].types[1] = gSpeciesInfo[gBattleMons[battler].species].types[1];
gBattleMons[battler].types[0] = GetSpeciesType(gBattleMons[battler].species, 0);
gBattleMons[battler].types[1] = GetSpeciesType(gBattleMons[battler].species, 1);
gBattleMons[battler].types[2] = TYPE_MYSTERY;
gBattleMons[battler].ability = GetAbilityBySpecies(gBattleMons[battler].species, gBattleMons[battler].abilityNum);
gBattleStruct->hpOnSwitchout[GetBattlerSide(battler)] = gBattleMons[battler].hp;
@ -5825,8 +5825,8 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState
heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0);
holdEffect = GetItemHoldEffect(heldItem);
ability = GetMonAbility(mon);
type1 = gSpeciesInfo[species].types[0];
type2 = gSpeciesInfo[species].types[1];
type1 = GetSpeciesType(species, 0);
type2 = GetSpeciesType(species, 1);
type3 = TYPE_MYSTERY;
}
@ -5932,7 +5932,7 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState
case SPECIES_TAUROS_PALDEA_COMBAT:
case SPECIES_TAUROS_PALDEA_BLAZE:
case SPECIES_TAUROS_PALDEA_AQUA:
return gSpeciesInfo[species].types[1];
return GetSpeciesType(species, 1);
}
break;
case EFFECT_IVY_CUDGEL:
@ -5944,7 +5944,7 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState
case SPECIES_OGERPON_HEARTHFLAME_TERA:
case SPECIES_OGERPON_CORNERSTONE:
case SPECIES_OGERPON_CORNERSTONE_TERA:
return gSpeciesInfo[species].types[1];
return GetSpeciesType(species, 1);
}
break;
case EFFECT_NATURAL_GIFT:

View File

@ -851,22 +851,22 @@ static bool8 DoesTypePreventStatus(u16 species, u32 status)
switch (status)
{
case STATUS1_TOXIC_POISON:
if (gSpeciesInfo[species].types[0] == TYPE_STEEL || gSpeciesInfo[species].types[0] == TYPE_POISON
|| gSpeciesInfo[species].types[1] == TYPE_STEEL || gSpeciesInfo[species].types[1] == TYPE_POISON)
if (GetSpeciesType(species, 0) == TYPE_STEEL || GetSpeciesType(species, 0) == TYPE_POISON
|| GetSpeciesType(species, 1) == TYPE_STEEL || GetSpeciesType(species, 1) == TYPE_POISON)
ret = TRUE;
break;
case STATUS1_FREEZE:
case STATUS1_FROSTBITE:
if (gSpeciesInfo[species].types[0] == TYPE_ICE || gSpeciesInfo[species].types[1] == TYPE_ICE)
if (GetSpeciesType(species, 0) == TYPE_ICE || GetSpeciesType(species, 1) == TYPE_ICE)
ret = TRUE;
break;
case STATUS1_PARALYSIS:
if (gSpeciesInfo[species].types[0] == TYPE_GROUND || gSpeciesInfo[species].types[1] == TYPE_GROUND
|| (B_PARALYZE_ELECTRIC >= GEN_6 && (gSpeciesInfo[species].types[0] == TYPE_ELECTRIC || gSpeciesInfo[species].types[1] == TYPE_ELECTRIC)))
if (GetSpeciesType(species, 0) == TYPE_GROUND || GetSpeciesType(species, 1) == TYPE_GROUND
|| (B_PARALYZE_ELECTRIC >= GEN_6 && (GetSpeciesType(species, 0) == TYPE_ELECTRIC || GetSpeciesType(species, 1) == TYPE_ELECTRIC)))
ret = TRUE;
break;
case STATUS1_BURN:
if (gSpeciesInfo[species].types[0] == TYPE_FIRE || gSpeciesInfo[species].types[1] == TYPE_FIRE)
if (GetSpeciesType(species, 0) == TYPE_FIRE || GetSpeciesType(species, 1) == TYPE_FIRE)
ret = TRUE;
break;
case STATUS1_SLEEP:
@ -1141,7 +1141,7 @@ bool32 TryGenerateBattlePikeWildMon(bool8 checkKeenEyeIntimidate)
MON_DATA_EXP,
&gExperienceTables[gSpeciesInfo[wildMons[headerId][pikeMonId].species].growthRate][monLevel]);
if (gSpeciesInfo[wildMons[headerId][pikeMonId].species].abilities[1])
if (GetSpeciesAbility(wildMons[headerId][pikeMonId].species, 1))
abilityNum = Random() % 2;
else
abilityNum = 0;

View File

@ -1426,7 +1426,7 @@ void GenerateBattlePyramidWildMon(void)
continue;
// check type
if (reqs->type != TYPE_MYSTERY && gSpeciesInfo[species].types[0] != reqs->type && gSpeciesInfo[species].types[1] != reqs->type)
if (reqs->type != TYPE_MYSTERY && GetSpeciesType(species, 0) != reqs->type && GetSpeciesType(species, 1) != reqs->type)
continue;
// check base stat total
@ -1459,7 +1459,7 @@ void GenerateBattlePyramidWildMon(void)
{
for (j = 0; j < NUM_ABILITY_SLOTS; j++)
{
if (gSpeciesInfo[species].abilities[j] == reqs->abilities[i])
if (GetSpeciesAbility(species, j) == reqs->abilities[i])
{
abilities[abilityCount] = reqs->abilities[i];
abilityCount++;
@ -1520,7 +1520,7 @@ void GenerateBattlePyramidWildMon(void)
}
// Initialize a random ability num
if (gSpeciesInfo[species].abilities[1])
if (GetSpeciesAbility(species, 1))
{
i = GetMonData(&gEnemyParty[0], MON_DATA_PERSONALITY, NULL) % 2;
SetMonData(&gEnemyParty[0], MON_DATA_ABILITY_NUM, &i);
@ -1540,7 +1540,7 @@ void GenerateBattlePyramidWildMon(void)
id = abilities[Random() % abilityCount];
for (j = 0; j < NUM_ABILITY_SLOTS; j++)
{
if (id == gSpeciesInfo[species].abilities[j])
if (id == GetSpeciesAbility(species, j))
{
// Set this ability num
SetMonData(&gEnemyParty[0], MON_DATA_ABILITY_NUM, &id);
@ -1606,7 +1606,7 @@ void GenerateBattlePyramidWildMon(void)
break;
case ABILITY_RANDOM:
default:
if (gSpeciesInfo[wildMons[id].species].abilities[1])
if (GetSpeciesAbility(wildMons[id].species, 1))
{
i = GetMonData(&gEnemyParty[0], MON_DATA_PERSONALITY, NULL) % 2;
SetMonData(&gEnemyParty[0], MON_DATA_ABILITY_NUM, &i);

View File

@ -1984,7 +1984,7 @@ s32 CalcCritChanceStageGen1(u32 battlerAtk, u32 battlerDef, u32 move, bool32 rec
s32 moveCritStage = GetMoveCriticalHitStage(gCurrentMove);
s32 bonusCritStage = gBattleStruct->bonusCritStages[battlerAtk]; // G-Max Chi Strike
u32 holdEffectCritStage = GetHoldEffectCritChanceIncrease(battlerAtk, holdEffectAtk);
u16 baseSpeed = gSpeciesInfo[gBattleMons[battlerAtk].species].baseSpeed;
u16 baseSpeed = GetSpeciesBaseSpeed(gBattleMons[battlerAtk].species);
critChance = baseSpeed / 2;
@ -7596,8 +7596,8 @@ static void Cmd_switchindataupdate(void)
}
}
gBattleMons[battler].types[0] = gSpeciesInfo[gBattleMons[battler].species].types[0];
gBattleMons[battler].types[1] = gSpeciesInfo[gBattleMons[battler].species].types[1];
gBattleMons[battler].types[0] = GetSpeciesType(gBattleMons[battler].species, 0);
gBattleMons[battler].types[1] = GetSpeciesType(gBattleMons[battler].species, 1);
gBattleMons[battler].types[2] = TYPE_MYSTERY;
gBattleMons[battler].ability = GetAbilityBySpecies(gBattleMons[battler].species, gBattleMons[battler].abilityNum);
#if TESTING
@ -14465,10 +14465,10 @@ static void Cmd_trydobeatup(void)
gBattlescriptCurrInstr = cmd->nextInstr;
gBattleStruct->moveDamage[gBattlerTarget] = gSpeciesInfo[GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES)].baseAttack;
gBattleStruct->moveDamage[gBattlerTarget] = GetSpeciesBaseAttack(GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES));
gBattleStruct->moveDamage[gBattlerTarget] *= GetMovePower(gCurrentMove);
gBattleStruct->moveDamage[gBattlerTarget] *= (GetMonData(&party[gBattleCommunication[0]], MON_DATA_LEVEL) * 2 / 5 + 2);
gBattleStruct->moveDamage[gBattlerTarget] /= gSpeciesInfo[gBattleMons[gBattlerTarget].species].baseDefense;
gBattleStruct->moveDamage[gBattlerTarget] /= GetSpeciesBaseDefense(gBattleMons[gBattlerTarget].species);
gBattleStruct->moveDamage[gBattlerTarget] = (gBattleStruct->moveDamage[gBattlerTarget] / 50) + 2;
if (gProtectStructs[gBattlerAttacker].helpingHand)
gBattleStruct->moveDamage[gBattlerTarget] = gBattleStruct->moveDamage[gBattlerTarget] * 15 / 10;
@ -15312,7 +15312,7 @@ static void Cmd_pickup(void)
if (lvlDivBy10 > 9)
lvlDivBy10 = 9;
ability = gSpeciesInfo[species].abilities[GetMonData(&gPlayerParty[i], MON_DATA_ABILITY_NUM)];
ability = GetSpeciesAbility(species, GetMonData(&gPlayerParty[i], MON_DATA_ABILITY_NUM));
if (ability == ABILITY_PICKUP
&& species != SPECIES_NONE
@ -15769,7 +15769,7 @@ static void Cmd_handleballthrow(void)
}
break;
case BALL_FAST:
if (gSpeciesInfo[gBattleMons[gBattlerTarget].species].baseSpeed >= 100)
if (GetSpeciesBaseSpeed(gBattleMons[gBattlerTarget].species) >= 100)
ballMultiplier = 400;
break;
case BALL_HEAVY:

View File

@ -255,7 +255,7 @@ static u32 CalcBeatUpPower(void)
// Party slot is incremented by the battle script for Beat Up after this damage calculation
species = GetMonData(&party[gBattleStruct->beatUpSlot], MON_DATA_SPECIES);
basePower = (gSpeciesInfo[species].baseAttack / 10) + 5;
basePower = (GetSpeciesBaseAttack(species) / 10) + 5;
return basePower;
}
@ -9397,7 +9397,7 @@ static inline s32 DoFutureSightAttackDamageCalcVars(struct DamageCalculationData
}
// Same type attack bonus
if (gSpeciesInfo[partyMonSpecies].types[0] == moveType || gSpeciesInfo[partyMonSpecies].types[1] == moveType)
if (GetSpeciesType(partyMonSpecies, 0) == moveType || GetSpeciesType(partyMonSpecies, 1) == moveType)
DAMAGE_APPLY_MODIFIER(UQ_4_12(1.5));
else
DAMAGE_APPLY_MODIFIER(UQ_4_12(1.0));
@ -9528,9 +9528,9 @@ static inline void TryNoticeIllusionInTypeEffectiveness(u32 move, u32 moveType,
{
// Check if the type effectiveness would've been different if the pokemon really had the types as the disguise.
uq4_12_t presumedModifier = UQ_4_12(1.0);
MulByTypeEffectiveness(&presumedModifier, move, moveType, battlerDef, ABILITY_ILLUSION, gSpeciesInfo[illusionSpecies].types[0], battlerAtk, FALSE);
if (gSpeciesInfo[illusionSpecies].types[1] != gSpeciesInfo[illusionSpecies].types[0])
MulByTypeEffectiveness(&presumedModifier, move, moveType, battlerDef, ABILITY_ILLUSION, gSpeciesInfo[illusionSpecies].types[1], battlerAtk, FALSE);
MulByTypeEffectiveness(&presumedModifier, move, moveType, battlerDef, ABILITY_ILLUSION, GetSpeciesType(illusionSpecies, 0), battlerAtk, FALSE);
if (GetSpeciesType(illusionSpecies, 1) != GetSpeciesType(illusionSpecies, 0))
MulByTypeEffectiveness(&presumedModifier, move, moveType, battlerDef, ABILITY_ILLUSION, GetSpeciesType(illusionSpecies, 1), battlerAtk, FALSE);
if (presumedModifier != resultingModifier)
RecordAbilityBattle(battlerDef, ABILITY_ILLUSION);
@ -9663,9 +9663,9 @@ uq4_12_t CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u16 a
if (move != MOVE_STRUGGLE && moveType != TYPE_MYSTERY)
{
MulByTypeEffectiveness(&modifier, move, moveType, 0, 0, gSpeciesInfo[speciesDef].types[0], 0, FALSE);
if (gSpeciesInfo[speciesDef].types[1] != gSpeciesInfo[speciesDef].types[0])
MulByTypeEffectiveness(&modifier, move, moveType, 0, 0, gSpeciesInfo[speciesDef].types[1], 0, FALSE);
MulByTypeEffectiveness(&modifier, move, moveType, 0, 0, GetSpeciesType(speciesDef, 0), 0, FALSE);
if (GetSpeciesType(speciesDef, 1) != GetSpeciesType(speciesDef, 0))
MulByTypeEffectiveness(&modifier, move, moveType, 0, 0, GetSpeciesType(speciesDef, 1), 0, FALSE);
if (moveType == TYPE_GROUND && abilityDef == ABILITY_LEVITATE && !(gFieldStatuses & STATUS_FIELD_GRAVITY))
modifier = UQ_4_12(0.0);
@ -9696,8 +9696,8 @@ uq4_12_t GetOverworldTypeEffectiveness(struct Pokemon *mon, u8 moveType)
uq4_12_t modifier = UQ_4_12(1.0);
u16 abilityDef = GetMonAbility(mon);
u16 speciesDef = GetMonData(mon, MON_DATA_SPECIES);
u8 type1 = gSpeciesInfo[speciesDef].types[0];
u8 type2 = gSpeciesInfo[speciesDef].types[1];
u8 type1 = GetSpeciesType(speciesDef, 0);
u8 type2 = GetSpeciesType(speciesDef, 1);
if (moveType != TYPE_MYSTERY)
{
@ -10765,8 +10765,8 @@ void CopyMonLevelAndBaseStatsToBattleMon(u32 battler, struct Pokemon *mon)
void CopyMonAbilityAndTypesToBattleMon(u32 battler, struct Pokemon *mon)
{
gBattleMons[battler].ability = GetMonAbility(mon);
gBattleMons[battler].types[0] = gSpeciesInfo[gBattleMons[battler].species].types[0];
gBattleMons[battler].types[1] = gSpeciesInfo[gBattleMons[battler].species].types[1];
gBattleMons[battler].types[0] = GetSpeciesType(gBattleMons[battler].species, 0);
gBattleMons[battler].types[1] = GetSpeciesType(gBattleMons[battler].species, 1);
gBattleMons[battler].types[2] = TYPE_MYSTERY;
}
@ -10945,8 +10945,8 @@ bool8 CanMonParticipateInSkyBattle(struct Pokemon *mon)
u16 species = GetMonData(mon, MON_DATA_SPECIES);
u16 monAbilityNum = GetMonData(mon, MON_DATA_ABILITY_NUM, NULL);
bool8 hasLevitateAbility = gSpeciesInfo[species].abilities[monAbilityNum] == ABILITY_LEVITATE;
bool8 isFlyingType = gSpeciesInfo[species].types[0] == TYPE_FLYING || gSpeciesInfo[species].types[1] == TYPE_FLYING;
bool8 hasLevitateAbility = GetSpeciesAbility(species, monAbilityNum) == ABILITY_LEVITATE;
bool8 isFlyingType = GetSpeciesType(species, 0) == TYPE_FLYING || GetSpeciesType(species, 1) == TYPE_FLYING;
bool8 monIsValidAndNotEgg = GetMonData(mon, MON_DATA_SANITY_HAS_SPECIES) && !GetMonData(mon, MON_DATA_IS_EGG);
if (monIsValidAndNotEgg)

View File

@ -5411,7 +5411,7 @@ static void SetMoveSpecificAnimData(u8 contestant)
switch (move)
{
case MOVE_CURSE:
if (gSpeciesInfo[species].types[0] == TYPE_GHOST || gSpeciesInfo[species].types[1] == TYPE_GHOST)
if (GetSpeciesType(species, 0) == TYPE_GHOST || GetSpeciesType(species, 1) == TYPE_GHOST)
gAnimMoveTurn = 0;
else
gAnimMoveTurn = 1;

View File

@ -1402,7 +1402,7 @@ static u8 DexNavGetAbilityNum(u16 species, u8 searchLevel)
}
if (genAbility
&& gSpeciesInfo[species].abilities[2] != ABILITY_NONE
&& GetSpeciesAbility(species, 2) != ABILITY_NONE
&& GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_CAUGHT))
{
//Only give hidden ability if Pokemon has been caught before
@ -1411,7 +1411,7 @@ static u8 DexNavGetAbilityNum(u16 species, u8 searchLevel)
else
{
//Pick a normal ability of that Pokemon
if (gSpeciesInfo[species].abilities[1] != ABILITY_NONE)
if (GetSpeciesAbility(species, 1) != ABILITY_NONE)
abilityNum = Random() & 1;
else
abilityNum = 0;
@ -2138,8 +2138,8 @@ static void PrintCurrentSpeciesInfo(void)
AddTextPrinterParameterized3(WINDOW_INFO, 0, 0, SPECIES_INFO_Y, sFontColor_Black, 0, GetSpeciesName(species));
//type icon(s)
type1 = gSpeciesInfo[species].types[0];
type2 = gSpeciesInfo[species].types[1];
type1 = GetSpeciesType(species, 0);
type2 = GetSpeciesType(species, 1);
if (species == SPECIES_NONE)
type1 = type2 = TYPE_MYSTERY;
@ -2172,8 +2172,8 @@ static void PrintCurrentSpeciesInfo(void)
}
else if (GetSetPokedexFlag(dexNum, FLAG_GET_CAUGHT))
{
if (gSpeciesInfo[species].abilities[2] != ABILITY_NONE)
AddTextPrinterParameterized3(WINDOW_INFO, 0, 0, HA_INFO_Y, sFontColor_Black, 0, gAbilitiesInfo[gSpeciesInfo[species].abilities[2]].name);
if (GetSpeciesAbility(species, 2) != ABILITY_NONE)
AddTextPrinterParameterized3(WINDOW_INFO, 0, 0, HA_INFO_Y, sFontColor_Black, 0, gAbilitiesInfo[GetSpeciesAbility(species, 2)].name);
else
AddTextPrinterParameterized3(WINDOW_INFO, 0, 0, HA_INFO_Y, sFontColor_Black, 0, gText_None);
}

View File

@ -2279,7 +2279,7 @@ bool32 IsFollowerVisible(void)
static bool8 SpeciesHasType(u16 species, u8 type)
{
return gSpeciesInfo[species].types[0] == type || gSpeciesInfo[species].types[1] == type;
return GetSpeciesType(species, 0) == type || GetSpeciesType(species, 1) == type;
}
// Display an emote above an object event

View File

@ -1272,7 +1272,7 @@ void IsGrassTypeInParty(void)
if (GetMonData(pokemon, MON_DATA_SANITY_HAS_SPECIES) && !GetMonData(pokemon, MON_DATA_IS_EGG))
{
species = GetMonData(pokemon, MON_DATA_SPECIES);
if (gSpeciesInfo[species].types[0] == TYPE_GRASS || gSpeciesInfo[species].types[1] == TYPE_GRASS)
if (GetSpeciesType(species, 0) == TYPE_GRASS || GetSpeciesType(species, 1) == TYPE_GRASS)
{
gSpecialVar_Result = TRUE;
return;

View File

@ -4806,8 +4806,8 @@ void Task_AbilityCapsule(u8 taskId)
{
case 0:
// Can't use.
if (gSpeciesInfo[tSpecies].abilities[0] == gSpeciesInfo[tSpecies].abilities[1]
|| gSpeciesInfo[tSpecies].abilities[1] == 0
if (GetSpeciesAbility(tSpecies, 0) == GetSpeciesAbility(tSpecies, 1)
|| GetSpeciesAbility(tSpecies, 1) == 0
|| tAbilityNum > 1
|| !tSpecies)
{
@ -4894,7 +4894,7 @@ void Task_AbilityPatch(u8 taskId)
{
case 0:
// Can't use.
if (gSpeciesInfo[tSpecies].abilities[tAbilityNum] == 0
if (GetSpeciesAbility(tSpecies, tAbilityNum) == 0
|| !tSpecies
)
{

View File

@ -4995,8 +4995,8 @@ static int DoPokedexSearch(u8 dexMode, u8 order, u8 abcGroup, u8 bodyColor, u8 t
{
species = NationalPokedexNumToSpecies(sPokedexView->pokedexList[i].dexNum);
types[0] = gSpeciesInfo[species].types[0];
types[1] = gSpeciesInfo[species].types[1];
types[0] = GetSpeciesType(species, 0);
types[1] = GetSpeciesType(species, 1);
if (types[0] == type1 || types[1] == type1)
{
sPokedexView->pokedexList[resultsCount] = sPokedexView->pokedexList[i];
@ -5013,8 +5013,8 @@ static int DoPokedexSearch(u8 dexMode, u8 order, u8 abcGroup, u8 bodyColor, u8 t
{
species = NationalPokedexNumToSpecies(sPokedexView->pokedexList[i].dexNum);
types[0] = gSpeciesInfo[species].types[0];
types[1] = gSpeciesInfo[species].types[1];
types[0] = GetSpeciesType(species, 0);
types[1] = GetSpeciesType(species, 1);
if ((types[0] == type1 && types[1] == type2) || (types[0] == type2 && types[1] == type1))
{
sPokedexView->pokedexList[resultsCount] = sPokedexView->pokedexList[i];

View File

@ -4355,8 +4355,8 @@ static void PrintCurrentSpeciesTypeInfo(u8 newEntry, u16 species)
type1 = GetTypeBySpecies(species, 1);
type2 = GetTypeBySpecies(species, 2);
#else
type1 = gSpeciesInfo[species].types[0];
type2 = gSpeciesInfo[species].types[1];
type1 = GetSpeciesType(species, 0);
type2 = GetSpeciesType(species, 1);
#endif
if (species == SPECIES_NONE)
type1 = type2 = TYPE_MYSTERY;
@ -4777,12 +4777,12 @@ static void SaveMonDataInStruct(void)
sPokedexView->sPokemonStats.species = species;
sPokedexView->sPokemonStats.genderRatio = gSpeciesInfo[species].genderRatio;
sPokedexView->sPokemonStats.baseHP = gSpeciesInfo[species].baseHP;
sPokedexView->sPokemonStats.baseSpeed = gSpeciesInfo[species].baseSpeed;
sPokedexView->sPokemonStats.baseAttack = gSpeciesInfo[species].baseAttack;
sPokedexView->sPokemonStats.baseSpAttack = gSpeciesInfo[species].baseSpAttack;
sPokedexView->sPokemonStats.baseDefense = gSpeciesInfo[species].baseDefense;
sPokedexView->sPokemonStats.baseSpDefense = gSpeciesInfo[species].baseSpDefense;
sPokedexView->sPokemonStats.baseHP = GetSpeciesBaseHP(species);
sPokedexView->sPokemonStats.baseSpeed = GetSpeciesBaseSpeed(species);
sPokedexView->sPokemonStats.baseAttack = GetSpeciesBaseAttack(species);
sPokedexView->sPokemonStats.baseSpAttack = GetSpeciesBaseSpAttack(species);
sPokedexView->sPokemonStats.baseDefense = GetSpeciesBaseDefense(species);
sPokedexView->sPokemonStats.baseSpDefense = GetSpeciesBaseSpDefense(species);
sPokedexView->sPokemonStats.differentEVs = differentEVs;
sPokedexView->sPokemonStats.evYield_HP = evs[STAT_HP];
sPokedexView->sPokemonStats.evYield_Speed = evs[STAT_ATK];
@ -7817,8 +7817,8 @@ static int DoPokedexSearch(u8 dexMode, u8 order, u8 abcGroup, u8 bodyColor, u8 t
{
species = NationalPokedexNumToSpecies(sPokedexView->pokedexList[i].dexNum);
types[0] = gSpeciesInfo[species].types[0];
types[1] = gSpeciesInfo[species].types[1];
types[0] = GetSpeciesType(species, 0);
types[1] = GetSpeciesType(species, 1);
if (types[0] == type1 || types[1] == type1)
{
sPokedexView->pokedexList[resultsCount] = sPokedexView->pokedexList[i];
@ -7835,8 +7835,8 @@ static int DoPokedexSearch(u8 dexMode, u8 order, u8 abcGroup, u8 bodyColor, u8 t
{
species = NationalPokedexNumToSpecies(sPokedexView->pokedexList[i].dexNum);
types[0] = gSpeciesInfo[species].types[0];
types[1] = gSpeciesInfo[species].types[1];
types[0] = GetSpeciesType(species, 0);
types[1] = GetSpeciesType(species, 1);
if ((types[0] == type1 && types[1] == type2) || (types[0] == type2 && types[1] == type1))
{
sPokedexView->pokedexList[resultsCount] = sPokedexView->pokedexList[i];

View File

@ -1201,7 +1201,7 @@ void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV,
SetBoxMonData(boxMon, MON_DATA_POKEBALL, &value);
SetBoxMonData(boxMon, MON_DATA_OT_GENDER, &gSaveBlock2Ptr->playerGender);
u32 teraType = (boxMon->personality & 0x1) == 0 ? gSpeciesInfo[species].types[0] : gSpeciesInfo[species].types[1];
u32 teraType = (boxMon->personality & 0x1) == 0 ? GetSpeciesType(species, 0) : GetSpeciesType(species, 1);
SetBoxMonData(boxMon, MON_DATA_TERA_TYPE, &teraType);
if (fixedIV < USE_RANDOM_IVS)
@ -1278,7 +1278,7 @@ void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV,
}
}
if (gSpeciesInfo[species].abilities[1])
if (GetSpeciesAbility(species, 1))
{
value = personality & 1;
SetBoxMonData(boxMon, MON_DATA_ABILITY_NUM, &value);
@ -1792,7 +1792,7 @@ void CalculateMonStats(struct Pokemon *mon)
}
else
{
s32 n = 2 * gSpeciesInfo[species].baseHP + hpIV;
s32 n = 2 * GetSpeciesBaseHP(species) + hpIV;
newMaxHP = (((n + hpEV / 4) * level) / 100) + level + 10;
}
@ -3482,7 +3482,7 @@ u16 GetAbilityBySpecies(u16 species, u8 abilityNum)
int i;
if (abilityNum < NUM_ABILITY_SLOTS)
gLastUsedAbility = gSpeciesInfo[species].abilities[abilityNum];
gLastUsedAbility = GetSpeciesAbility(species, abilityNum);
else
gLastUsedAbility = ABILITY_NONE;
@ -3490,13 +3490,13 @@ u16 GetAbilityBySpecies(u16 species, u8 abilityNum)
{
for (i = NUM_NORMAL_ABILITY_SLOTS; i < NUM_ABILITY_SLOTS && gLastUsedAbility == ABILITY_NONE; i++)
{
gLastUsedAbility = gSpeciesInfo[species].abilities[i];
gLastUsedAbility = GetSpeciesAbility(species, i);
}
}
for (i = 0; i < NUM_ABILITY_SLOTS && gLastUsedAbility == ABILITY_NONE; i++) // look for any non-empty ability
{
gLastUsedAbility = gSpeciesInfo[species].abilities[i];
gLastUsedAbility = GetSpeciesAbility(species, i);
}
return gLastUsedAbility;
@ -3603,16 +3603,56 @@ const u8 *GetSpeciesPokedexDescription(u16 species)
return gSpeciesInfo[species].description;
}
u16 GetSpeciesHeight(u16 species)
u32 GetSpeciesHeight(u16 species)
{
return gSpeciesInfo[SanitizeSpeciesId(species)].height;
}
u16 GetSpeciesWeight(u16 species)
u32 GetSpeciesWeight(u16 species)
{
return gSpeciesInfo[SanitizeSpeciesId(species)].weight;
}
u32 GetSpeciesType(u16 species, u8 slot)
{
return gSpeciesInfo[SanitizeSpeciesId(species)].types[slot];
}
u32 GetSpeciesAbility(u16 species, u8 slot)
{
return gSpeciesInfo[SanitizeSpeciesId(species)].abilities[slot];
}
u32 GetSpeciesBaseHP(u16 species)
{
return gSpeciesInfo[SanitizeSpeciesId(species)].baseHP;
}
u32 GetSpeciesBaseAttack(u16 species)
{
return gSpeciesInfo[SanitizeSpeciesId(species)].baseAttack;
}
u32 GetSpeciesBaseDefense(u16 species)
{
return gSpeciesInfo[SanitizeSpeciesId(species)].baseDefense;
}
u32 GetSpeciesBaseSpAttack(u16 species)
{
return gSpeciesInfo[SanitizeSpeciesId(species)].baseSpAttack;
}
u32 GetSpeciesBaseSpDefense(u16 species)
{
return gSpeciesInfo[SanitizeSpeciesId(species)].baseSpDefense;
}
u32 GetSpeciesBaseSpeed(u16 species)
{
return gSpeciesInfo[SanitizeSpeciesId(species)].baseSpeed;
}
const struct LevelUpMove *GetSpeciesLevelUpLearnset(u16 species)
{
const struct LevelUpMove *learnset = gSpeciesInfo[SanitizeSpeciesId(species)].levelUpLearnset;
@ -3713,8 +3753,8 @@ void PokemonToBattleMon(struct Pokemon *src, struct BattlePokemon *dst)
dst->spDefense = GetMonData(src, MON_DATA_SPDEF, NULL);
dst->abilityNum = GetMonData(src, MON_DATA_ABILITY_NUM, NULL);
dst->otId = GetMonData(src, MON_DATA_OT_ID, NULL);
dst->types[0] = gSpeciesInfo[dst->species].types[0];
dst->types[1] = gSpeciesInfo[dst->species].types[1];
dst->types[0] = GetSpeciesType(dst->species, 0);
dst->types[1] = GetSpeciesType(dst->species, 1);
dst->types[2] = TYPE_MYSTERY;
dst->isShiny = IsMonShiny(src);
dst->ability = GetAbilityBySpecies(dst->species, dst->abilityNum);
@ -4641,8 +4681,8 @@ bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct Evoluti
for (j = 0; j < PARTY_SIZE; j++)
{
u16 currSpecies = GetMonData(&gPlayerParty[j], MON_DATA_SPECIES, NULL);
if (gSpeciesInfo[currSpecies].types[0] == params[i].arg1
|| gSpeciesInfo[currSpecies].types[1] == params[i].arg1)
if (GetSpeciesType(currSpecies, 0) == params[i].arg1
|| GetSpeciesType(currSpecies, 1) == params[i].arg1)
{
currentCondition = TRUE;
break;
@ -6883,6 +6923,7 @@ u16 SanitizeSpeciesId(u16 species)
bool32 IsSpeciesEnabled(u16 species)
{
// This function should not use the GetSpeciesBaseHP function, as the included sanitation will result in an infinite loop
return gSpeciesInfo[species].baseHP > 0 || species == SPECIES_EGG;
}

View File

@ -4276,10 +4276,10 @@ static void SetMonTypeIcons(void)
}
else
{
SetTypeSpritePosAndPal(gSpeciesInfo[summary->species].types[0], 120, 48, SPRITE_ARR_ID_TYPE);
if (gSpeciesInfo[summary->species].types[0] != gSpeciesInfo[summary->species].types[1])
SetTypeSpritePosAndPal(GetSpeciesType(summary->species, 0), 120, 48, SPRITE_ARR_ID_TYPE);
if (GetSpeciesType(summary->species, 0) != GetSpeciesType(summary->species, 1))
{
SetTypeSpritePosAndPal(gSpeciesInfo[summary->species].types[1], 160, 48, SPRITE_ARR_ID_TYPE + 1);
SetTypeSpritePosAndPal(GetSpeciesType(summary->species, 1), 160, 48, SPRITE_ARR_ID_TYPE + 1);
SetSpriteInvisibility(SPRITE_ARR_ID_TYPE + 1, FALSE);
}
else

View File

@ -2513,8 +2513,8 @@ int GetUnionRoomTradeMessageId(struct RfuGameCompatibilityData player, struct Rf
else
{
// Player's Pokémon must be of the type the partner requested
if (gSpeciesInfo[playerSpecies2].types[0] != requestedType
&& gSpeciesInfo[playerSpecies2].types[1] != requestedType)
if (GetSpeciesType(playerSpecies2, 0) != requestedType
&& GetSpeciesType(playerSpecies2, 1) != requestedType)
return UR_TRADE_MSG_NOT_MON_PARTNER_WANTS;
}

View File

@ -311,7 +311,7 @@ static u32 GetMonPublicType(u32 battlerId, u32 typeNum)
return GetMonDefensiveTeraType(mon,monIllusion,battlerId,typeNum,illusionSpecies,monSpecies);
if (IsIllusionActiveAndTypeUnchanged(monIllusion,monSpecies, battlerId))
return gSpeciesInfo[illusionSpecies].types[typeNum];
return GetSpeciesType(illusionSpecies, typeNum);
return gBattleMons[battlerId].types[typeNum];
}
@ -348,7 +348,7 @@ static u32 GetMonDefensiveTeraType(struct Pokemon * mon, struct Pokemon* monIllu
targetSpecies = (monIllusion != NULL) ? illusionSpecies : monSpecies;
return gSpeciesInfo[targetSpecies].types[typeNum];
return GetSpeciesType(targetSpecies, typeNum);
}
static u32 IsIllusionActiveAndTypeUnchanged(struct Pokemon* monIllusion, u32 monSpecies, u32 battlerId)
@ -359,7 +359,7 @@ static u32 IsIllusionActiveAndTypeUnchanged(struct Pokemon* monIllusion, u32 mon
return FALSE;
for (typeNum = 0; typeNum < 2; typeNum++)
if (gSpeciesInfo[monSpecies].types[typeNum] != gBattleMons[battlerId].types[typeNum])
if (GetSpeciesType(monSpecies, typeNum) != gBattleMons[battlerId].types[typeNum])
return FALSE;
return TRUE;

View File

@ -4193,7 +4193,7 @@ static s32 IsRequestedTradeInPlayerParty(u32 type, u32 species)
for (i = 0; i < gPlayerPartyCount; i++)
{
species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG);
if (gSpeciesInfo[species].types[0] == type || gSpeciesInfo[species].types[1] == type)
if (GetSpeciesType(species, 0) == type || GetSpeciesType(species, 1) == type)
return UR_TRADE_MATCH;
}
return UR_TRADE_NOTYPE;

View File

@ -1162,7 +1162,7 @@ static bool8 TryGetRandomWildMonIndexByType(const struct WildPokemon *wildMon, u
for (validMonCount = 0, i = 0; i < numMon; i++)
{
if (gSpeciesInfo[wildMon[i].species].types[0] == type || gSpeciesInfo[wildMon[i].species].types[1] == type)
if (GetSpeciesType(wildMon[i].species, 0) == type || GetSpeciesType(wildMon[i].species, 1) == type)
validIndexes[validMonCount++] = i;
}

View File

@ -82,7 +82,7 @@ SINGLE_BATTLE_TEST("Aerilate doesn't affect Weather Ball's type", s16 damage)
ASSUME(GetMoveEffect(MOVE_WEATHER_BALL) == EFFECT_WEATHER_BALL);
ASSUME(GetMoveType(MOVE_WEATHER_BALL) == TYPE_NORMAL);
ASSUME(GetMoveEffect(MOVE_SKILL_SWAP) == EFFECT_SKILL_SWAP);
ASSUME(gSpeciesInfo[SPECIES_PINSIR].types[0] == TYPE_BUG);
ASSUME(GetSpeciesType(SPECIES_PINSIR, 0) == TYPE_BUG);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_PINSIR) { Ability(ABILITY_HYPER_CUTTER); Item(ITEM_PINSIRITE); }
} WHEN {
@ -111,7 +111,7 @@ SINGLE_BATTLE_TEST("Aerilate doesn't affect Natural Gift's type")
ASSUME(GetMoveEffect(MOVE_NATURAL_GIFT) == EFFECT_NATURAL_GIFT);
ASSUME(GetMoveEffect(MOVE_SKILL_SWAP) == EFFECT_SKILL_SWAP);
ASSUME(gNaturalGiftTable[ITEM_TO_BERRY(ITEM_PERSIM_BERRY)].type == TYPE_GROUND);
ASSUME(gSpeciesInfo[SPECIES_SALAMENCE_MEGA].types[0] == TYPE_FLYING || gSpeciesInfo[SPECIES_SALAMENCE_MEGA].types[1] == TYPE_FLYING);
ASSUME(GetSpeciesType(SPECIES_SALAMENCE_MEGA, 0) == TYPE_FLYING || GetSpeciesType(SPECIES_SALAMENCE_MEGA, 1) == TYPE_FLYING);
PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_PERSIM_BERRY); }
OPPONENT(SPECIES_SALAMENCE) { Item(ITEM_SALAMENCITE); }
} WHEN {
@ -140,7 +140,7 @@ SINGLE_BATTLE_TEST("Aerilate doesn't affect Judgment / Techno Blast / Multi-Atta
ASSUME(gItemsInfo[ITEM_SHOCK_DRIVE].secondaryId == TYPE_ELECTRIC);
ASSUME(gItemsInfo[ITEM_ELECTRIC_MEMORY].holdEffect == HOLD_EFFECT_MEMORY);
ASSUME(gItemsInfo[ITEM_ELECTRIC_MEMORY].secondaryId == TYPE_ELECTRIC);
ASSUME(gSpeciesInfo[SPECIES_DIGLETT].types[0] == TYPE_GROUND);
ASSUME(GetSpeciesType(SPECIES_DIGLETT, 0) == TYPE_GROUND);
PLAYER(SPECIES_WOBBUFFET) { Item(item); }
OPPONENT(SPECIES_SALAMENCE) { Item(ITEM_SALAMENCITE); }
OPPONENT(SPECIES_DIGLETT);
@ -159,7 +159,7 @@ SINGLE_BATTLE_TEST("Aerilate doesn't affect Hidden Power's type")
GIVEN {
ASSUME(GetMoveEffect(MOVE_HIDDEN_POWER) == EFFECT_HIDDEN_POWER);
ASSUME(gTypesInfo[TYPE_ELECTRIC].isHiddenPowerType == TRUE);
ASSUME(gSpeciesInfo[SPECIES_DIGLETT].types[0] == TYPE_GROUND);
ASSUME(GetSpeciesType(SPECIES_DIGLETT, 0) == TYPE_GROUND);
PLAYER(SPECIES_PINSIR) { Ability(ABILITY_AERILATE); HPIV(31); AttackIV(31); DefenseIV(31); SpAttackIV(30); SpDefenseIV(31); SpeedIV(31); } // HP Electric
OPPONENT(SPECIES_DIGLETT);
} WHEN {

View File

@ -5,8 +5,8 @@ SINGLE_BATTLE_TEST("Anticipation causes notifies if an opponent has a super-effe
{
GIVEN {
ASSUME(GetMoveType(MOVE_CLOSE_COMBAT) == TYPE_FIGHTING);
ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[0] == TYPE_NORMAL);
ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[1] == TYPE_NORMAL);
ASSUME(GetSpeciesType(SPECIES_EEVEE, 0) == TYPE_NORMAL);
ASSUME(GetSpeciesType(SPECIES_EEVEE, 1) == TYPE_NORMAL);
PLAYER(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); }
OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CLOSE_COMBAT, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); }
} WHEN {
@ -46,8 +46,8 @@ SINGLE_BATTLE_TEST("Anticipation doesn't consider Normalize into their effective
{
GIVEN {
ASSUME(GetMoveType(MOVE_CLOSE_COMBAT) == TYPE_FIGHTING);
ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[0] == TYPE_NORMAL);
ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[1] == TYPE_NORMAL);
ASSUME(GetSpeciesType(SPECIES_EEVEE, 0) == TYPE_NORMAL);
ASSUME(GetSpeciesType(SPECIES_EEVEE, 1) == TYPE_NORMAL);
PLAYER(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); }
OPPONENT(SPECIES_DELCATTY) { Ability(ABILITY_NORMALIZE); Moves(MOVE_CLOSE_COMBAT, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); }
} WHEN {
@ -62,8 +62,8 @@ SINGLE_BATTLE_TEST("Anticipation doesn't consider Scrappy into their effectivene
KNOWN_FAILING;
GIVEN {
ASSUME(GetMoveType(MOVE_CLOSE_COMBAT) == TYPE_FIGHTING);
ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[0] == TYPE_NORMAL);
ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[1] == TYPE_NORMAL);
ASSUME(GetSpeciesType(SPECIES_EEVEE, 0) == TYPE_NORMAL);
ASSUME(GetSpeciesType(SPECIES_EEVEE, 1) == TYPE_NORMAL);
PLAYER(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); }
OPPONENT(SPECIES_KANGASKHAN) { Ability(ABILITY_SCRAPPY); Moves(MOVE_CLOSE_COMBAT, MOVE_TRICK_OR_TREAT, MOVE_SKILL_SWAP, MOVE_CELEBRATE); }
} WHEN {
@ -101,8 +101,8 @@ SINGLE_BATTLE_TEST("Anticipation counts Counter, Metal Burst or Mirror Coat as a
PARAMETRIZE { move = MOVE_MIRROR_COAT; species = SPECIES_NIDORINO; typeAtk = TYPE_PSYCHIC; typeDef = TYPE_POISON; }
GIVEN {
ASSUME(GetMoveType(move) == typeAtk);
ASSUME(gSpeciesInfo[species].types[0] == typeDef);
ASSUME(gSpeciesInfo[species].types[1] == typeDef);
ASSUME(GetSpeciesType(species, 0) == typeDef);
ASSUME(GetSpeciesType(species, 1) == typeDef);
PLAYER(species);
OPPONENT(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); Moves(move, MOVE_SKILL_SWAP, MOVE_POUND, MOVE_CELEBRATE); }
} WHEN {
@ -117,10 +117,10 @@ SINGLE_BATTLE_TEST("Anticipation considers Synchronoise as an ordinary Psychic-t
{
GIVEN {
ASSUME(GetMoveType(MOVE_SYNCHRONOISE) == TYPE_PSYCHIC);
ASSUME(gSpeciesInfo[SPECIES_NIDORINO].types[0] == TYPE_POISON);
ASSUME(gSpeciesInfo[SPECIES_NIDORINO].types[1] == TYPE_POISON);
ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[0] != TYPE_POISON);
ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[1] != TYPE_POISON);
ASSUME(GetSpeciesType(SPECIES_NIDORINO, 0) == TYPE_POISON);
ASSUME(GetSpeciesType(SPECIES_NIDORINO, 1) == TYPE_POISON);
ASSUME(GetSpeciesType(SPECIES_EEVEE, 0) != TYPE_POISON);
ASSUME(GetSpeciesType(SPECIES_EEVEE, 1) != TYPE_POISON);
PLAYER(SPECIES_NIDORINO);
OPPONENT(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); Moves(MOVE_SYNCHRONOISE, MOVE_SKILL_SWAP, MOVE_POUND, MOVE_CELEBRATE); }
} WHEN {
@ -136,8 +136,8 @@ SINGLE_BATTLE_TEST("Anticipation considers Freeze-Dry as an ordinary Ice-type mo
KNOWN_FAILING;
GIVEN {
ASSUME(GetMoveType(MOVE_FREEZE_DRY) == TYPE_ICE);
ASSUME(gSpeciesInfo[SPECIES_SQUIRTLE].types[0] == TYPE_WATER);
ASSUME(gSpeciesInfo[SPECIES_SQUIRTLE].types[1] == TYPE_WATER);
ASSUME(GetSpeciesType(SPECIES_SQUIRTLE, 0) == TYPE_WATER);
ASSUME(GetSpeciesType(SPECIES_SQUIRTLE, 1) == TYPE_WATER);
PLAYER(SPECIES_SQUIRTLE);
OPPONENT(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); Moves(MOVE_FREEZE_DRY, MOVE_SKILL_SWAP, MOVE_POUND, MOVE_CELEBRATE); }
} WHEN {
@ -153,8 +153,8 @@ SINGLE_BATTLE_TEST("Anticipation considers Flying Press as an ordinary Fighting-
KNOWN_FAILING;
GIVEN {
ASSUME(GetMoveType(MOVE_FLYING_PRESS) == TYPE_FIGHTING);
ASSUME(gSpeciesInfo[SPECIES_TANGELA].types[0] == TYPE_GRASS);
ASSUME(gSpeciesInfo[SPECIES_TANGELA].types[1] == TYPE_GRASS);
ASSUME(GetSpeciesType(SPECIES_TANGELA, 0) == TYPE_GRASS);
ASSUME(GetSpeciesType(SPECIES_TANGELA, 1) == TYPE_GRASS);
PLAYER(SPECIES_TANGELA);
OPPONENT(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); Moves(MOVE_FLYING_PRESS, MOVE_SKILL_SWAP, MOVE_POUND, MOVE_CELEBRATE); }
} WHEN {
@ -169,8 +169,8 @@ SINGLE_BATTLE_TEST("Anticipation considers Aura Wheel as an ordinary Electric-ty
{
GIVEN {
ASSUME(GetMoveType(MOVE_AURA_WHEEL) == TYPE_ELECTRIC);
ASSUME(gSpeciesInfo[SPECIES_PONYTA_GALAR].types[0] == TYPE_PSYCHIC);
ASSUME(gSpeciesInfo[SPECIES_PONYTA_GALAR].types[1] == TYPE_PSYCHIC);
ASSUME(GetSpeciesType(SPECIES_PONYTA_GALAR, 0) == TYPE_PSYCHIC);
ASSUME(GetSpeciesType(SPECIES_PONYTA_GALAR, 1) == TYPE_PSYCHIC);
PLAYER(SPECIES_WOBBUFFET);
PLAYER(SPECIES_PONYTA_GALAR) { Ability(ABILITY_ANTICIPATION); }
OPPONENT(SPECIES_MORPEKO) { Ability(ABILITY_HUNGER_SWITCH); Moves(MOVE_AURA_WHEEL, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); }
@ -188,8 +188,8 @@ SINGLE_BATTLE_TEST("Anticipation treats dynamic move types as their base type (N
{
GIVEN {
ASSUME(GetMoveEffect(MOVE_JUDGMENT) == EFFECT_CHANGE_TYPE_ON_ITEM);
ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[0] == TYPE_NORMAL);
ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[1] == TYPE_NORMAL);
ASSUME(GetSpeciesType(SPECIES_EEVEE, 0) == TYPE_NORMAL);
ASSUME(GetSpeciesType(SPECIES_EEVEE, 1) == TYPE_NORMAL);
PLAYER(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); }
OPPONENT(SPECIES_ARCEUS) { Item(ITEM_FIST_PLATE); Moves(MOVE_JUDGMENT, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); }
} WHEN {
@ -203,8 +203,8 @@ SINGLE_BATTLE_TEST("Anticipation treats dynamic move types as their base type (N
{
GIVEN {
ASSUME(GetMoveEffect(MOVE_WEATHER_BALL) == EFFECT_WEATHER_BALL);
ASSUME(gSpeciesInfo[SPECIES_FERROTHORN].types[0] == TYPE_GRASS);
ASSUME(gSpeciesInfo[SPECIES_FERROTHORN].types[1] == TYPE_STEEL);
ASSUME(GetSpeciesType(SPECIES_FERROTHORN, 0) == TYPE_GRASS);
ASSUME(GetSpeciesType(SPECIES_FERROTHORN, 1) == TYPE_STEEL);
PLAYER(SPECIES_FERROTHORN) { Ability(ABILITY_ANTICIPATION); Speed(2); }
OPPONENT(SPECIES_NINETALES) { Ability(ABILITY_DROUGHT); Moves(MOVE_WEATHER_BALL, MOVE_SKILL_SWAP, MOVE_POUND, MOVE_CELEBRATE); Speed(4); }
} WHEN {
@ -221,8 +221,8 @@ SINGLE_BATTLE_TEST("Anticipation treats dynamic move types as their base type (N
{
GIVEN {
ASSUME(GetMoveEffect(MOVE_NATURAL_GIFT) == EFFECT_NATURAL_GIFT);
ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[0] == TYPE_NORMAL);
ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[1] == TYPE_NORMAL);
ASSUME(GetSpeciesType(SPECIES_EEVEE, 0) == TYPE_NORMAL);
ASSUME(GetSpeciesType(SPECIES_EEVEE, 1) == TYPE_NORMAL);
PLAYER(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); }
OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LEPPA_BERRY); Moves(MOVE_NATURAL_GIFT, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); }
} WHEN {
@ -236,8 +236,8 @@ SINGLE_BATTLE_TEST("Anticipation treats dynamic move types as their base type (N
{
GIVEN {
ASSUME(GetMoveEffect(MOVE_TECHNO_BLAST) == EFFECT_CHANGE_TYPE_ON_ITEM);
ASSUME(gSpeciesInfo[SPECIES_FERROTHORN].types[0] == TYPE_GRASS);
ASSUME(gSpeciesInfo[SPECIES_FERROTHORN].types[1] == TYPE_STEEL);
ASSUME(GetSpeciesType(SPECIES_FERROTHORN, 0) == TYPE_GRASS);
ASSUME(GetSpeciesType(SPECIES_FERROTHORN, 1) == TYPE_STEEL);
PLAYER(SPECIES_FERROTHORN) { Ability(ABILITY_ANTICIPATION); }
OPPONENT(SPECIES_GENESECT) { Item(ITEM_BURN_DRIVE); Moves(MOVE_TECHNO_BLAST, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); }
} WHEN {
@ -251,9 +251,9 @@ SINGLE_BATTLE_TEST("Anticipation treats dynamic move types as their base type (N
{
GIVEN {
ASSUME(GetMoveEffect(MOVE_REVELATION_DANCE) == EFFECT_REVELATION_DANCE);
ASSUME(gSpeciesInfo[SPECIES_FERROTHORN].types[0] == TYPE_GRASS);
ASSUME(gSpeciesInfo[SPECIES_FERROTHORN].types[1] == TYPE_STEEL);
ASSUME(gSpeciesInfo[SPECIES_ORICORIO_BAILE].types[0] == TYPE_FIRE);
ASSUME(GetSpeciesType(SPECIES_FERROTHORN, 0) == TYPE_GRASS);
ASSUME(GetSpeciesType(SPECIES_FERROTHORN, 1) == TYPE_STEEL);
ASSUME(GetSpeciesType(SPECIES_ORICORIO_BAILE, 0) == TYPE_FIRE);
PLAYER(SPECIES_FERROTHORN) { Ability(ABILITY_ANTICIPATION); }
OPPONENT(SPECIES_ORICORIO_BAILE) { Moves(MOVE_REVELATION_DANCE, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); }
} WHEN {
@ -267,8 +267,8 @@ SINGLE_BATTLE_TEST("Anticipation treats dynamic move types as their base type (N
{
GIVEN {
ASSUME(GetMoveEffect(MOVE_MULTI_ATTACK) == EFFECT_CHANGE_TYPE_ON_ITEM);
ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[0] == TYPE_NORMAL);
ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[1] == TYPE_NORMAL);
ASSUME(GetSpeciesType(SPECIES_EEVEE, 0) == TYPE_NORMAL);
ASSUME(GetSpeciesType(SPECIES_EEVEE, 1) == TYPE_NORMAL);
PLAYER(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); }
OPPONENT(SPECIES_SILVALLY) { Item(ITEM_FIGHTING_MEMORY); Moves(MOVE_MULTI_ATTACK, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); }
} WHEN {
@ -282,8 +282,8 @@ SINGLE_BATTLE_TEST("Anticipation does not consider Strong Winds on type matchups
{
KNOWN_FAILING;
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_RAYQUAZA_MEGA].types[0] == TYPE_DRAGON);
ASSUME(gSpeciesInfo[SPECIES_RAYQUAZA_MEGA].types[1] == TYPE_FLYING);
ASSUME(GetSpeciesType(SPECIES_RAYQUAZA_MEGA, 0) == TYPE_DRAGON);
ASSUME(GetSpeciesType(SPECIES_RAYQUAZA_MEGA, 1) == TYPE_FLYING);
PLAYER(SPECIES_RAYQUAZA) { Moves(MOVE_DRAGON_ASCENT, MOVE_CELEBRATE); }
OPPONENT(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); Moves(MOVE_ROCK_SLIDE, MOVE_SKILL_SWAP, MOVE_POUND, MOVE_CELEBRATE); }
} WHEN {
@ -300,8 +300,8 @@ SINGLE_BATTLE_TEST("Anticipation does not consider ate-abilities")
{
GIVEN {
ASSUME(GetMoveType(MOVE_SCRATCH) == TYPE_NORMAL);
ASSUME(gSpeciesInfo[SPECIES_WORMADAM_PLANT].types[0] == TYPE_BUG);
ASSUME(gSpeciesInfo[SPECIES_WORMADAM_PLANT].types[1] == TYPE_GRASS);
ASSUME(GetSpeciesType(SPECIES_WORMADAM_PLANT, 0) == TYPE_BUG);
ASSUME(GetSpeciesType(SPECIES_WORMADAM_PLANT, 1) == TYPE_GRASS);
PLAYER(SPECIES_WORMADAM_PLANT) { Ability(ABILITY_ANTICIPATION); }
OPPONENT(SPECIES_AURORUS) { Ability(ABILITY_REFRIGERATE); Moves(MOVE_GROWL, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); }
} WHEN {
@ -315,8 +315,8 @@ SINGLE_BATTLE_TEST("Anticipation treats Hidden Power as its dynamic type (Gen6+)
{
KNOWN_FAILING;
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[0] == TYPE_NORMAL);
ASSUME(gSpeciesInfo[SPECIES_EEVEE].types[1] == TYPE_NORMAL);
ASSUME(GetSpeciesType(SPECIES_EEVEE, 0) == TYPE_NORMAL);
ASSUME(GetSpeciesType(SPECIES_EEVEE, 1) == TYPE_NORMAL);
PLAYER(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); Item(ITEM_CHOPLE_BERRY); }
OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_HIDDEN_POWER, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); HPIV(30); AttackIV(2); DefenseIV(31); SpAttackIV(30); SpDefenseIV(30); SpeedIV(30); }
} WHEN {
@ -335,8 +335,8 @@ SINGLE_BATTLE_TEST("Anticipation considers Inverse Battle types")
GIVEN {
FLAG_SET(B_FLAG_INVERSE_BATTLE);
ASSUME(GetMoveType(MOVE_SCRATCH) == TYPE_NORMAL);
ASSUME(gSpeciesInfo[SPECIES_FERROTHORN].types[0] == TYPE_GRASS);
ASSUME(gSpeciesInfo[SPECIES_FERROTHORN].types[1] == TYPE_STEEL);
ASSUME(GetSpeciesType(SPECIES_FERROTHORN, 0) == TYPE_GRASS);
ASSUME(GetSpeciesType(SPECIES_FERROTHORN, 1) == TYPE_STEEL);
PLAYER(SPECIES_FERROTHORN) { Ability(ABILITY_ANTICIPATION); }
OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_GROWL, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); }
} WHEN {

View File

@ -4,7 +4,7 @@
SINGLE_BATTLE_TEST("Color Change changes the type of a Pokemon being hit by a move if the type of the move and the Pokemon are different")
{
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_KECLEON].types[0] != TYPE_PSYCHIC && gSpeciesInfo[SPECIES_KECLEON].types[1] != TYPE_PSYCHIC);
ASSUME(GetSpeciesType(SPECIES_KECLEON, 0) != TYPE_PSYCHIC && GetSpeciesType(SPECIES_KECLEON, 1) != TYPE_PSYCHIC);
ASSUME(GetMoveType(MOVE_PSYWAVE) == TYPE_PSYCHIC);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_KECLEON) { Ability(ABILITY_COLOR_CHANGE); }
@ -20,7 +20,7 @@ SINGLE_BATTLE_TEST("Color Change changes the type of a Pokemon being hit by a mo
SINGLE_BATTLE_TEST("Color Change does not change the type when hit by a move that's the same type as itself")
{
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_KECLEON].types[0] == TYPE_NORMAL || gSpeciesInfo[SPECIES_KECLEON].types[1] == TYPE_NORMAL);
ASSUME(GetSpeciesType(SPECIES_KECLEON, 0) == TYPE_NORMAL || GetSpeciesType(SPECIES_KECLEON, 1) == TYPE_NORMAL);
ASSUME(GetMoveType(MOVE_SCRATCH) == TYPE_NORMAL);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_KECLEON) { Ability(ABILITY_COLOR_CHANGE); }

View File

@ -41,10 +41,10 @@ SINGLE_BATTLE_TEST("Dry Skin increases damage taken from Fire-type moves by 25%"
GIVEN {
ASSUME(GetMoveType(MOVE_EMBER) == TYPE_FIRE);
ASSUME(GetMovePower(MOVE_EMBER) == 40);
ASSUME(gSpeciesInfo[SPECIES_PARASECT].types[0] == TYPE_BUG);
ASSUME(gSpeciesInfo[SPECIES_PARASECT].types[1] == TYPE_GRASS);
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] == TYPE_PSYCHIC);
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] == TYPE_PSYCHIC);
ASSUME(GetSpeciesType(SPECIES_PARASECT, 0) == TYPE_BUG);
ASSUME(GetSpeciesType(SPECIES_PARASECT, 1) == TYPE_GRASS);
ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) == TYPE_PSYCHIC);
ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) == TYPE_PSYCHIC);
PLAYER(SPECIES_WOBBUFFET) { SpAttack(71); }
OPPONENT(SPECIES_PARASECT) { Ability(ability); SpDefense(165); }
} WHEN {

View File

@ -76,7 +76,7 @@ SINGLE_BATTLE_TEST("Galvanize doesn't affect Weather Ball's type", s16 damage)
GIVEN {
ASSUME(GetMoveEffect(MOVE_WEATHER_BALL) == EFFECT_WEATHER_BALL);
ASSUME(GetMoveType(MOVE_WEATHER_BALL) == TYPE_NORMAL);
ASSUME(gSpeciesInfo[SPECIES_PINSIR].types[0] == TYPE_BUG);
ASSUME(GetSpeciesType(SPECIES_PINSIR, 0) == TYPE_BUG);
PLAYER(SPECIES_GEODUDE_ALOLA) { Ability(ability); }
OPPONENT(SPECIES_PINSIR);
} WHEN {
@ -102,7 +102,7 @@ SINGLE_BATTLE_TEST("Galvanize doesn't affect Natural Gift's type")
GIVEN {
ASSUME(GetMoveEffect(MOVE_NATURAL_GIFT) == EFFECT_NATURAL_GIFT);
ASSUME(gNaturalGiftTable[ITEM_TO_BERRY(ITEM_ORAN_BERRY)].type == TYPE_POISON);
ASSUME(gSpeciesInfo[SPECIES_BELDUM].types[0] == TYPE_STEEL);
ASSUME(GetSpeciesType(SPECIES_BELDUM, 0) == TYPE_STEEL);
PLAYER(SPECIES_GEODUDE_ALOLA) { Ability(ability); Item(ITEM_ORAN_BERRY); }
OPPONENT(SPECIES_BELDUM);
} WHEN {
@ -129,7 +129,7 @@ SINGLE_BATTLE_TEST("Galvanize doesn't affect Judgment / Techno Blast / Multi-Att
ASSUME(gItemsInfo[ITEM_DOUSE_DRIVE].secondaryId == TYPE_WATER);
ASSUME(gItemsInfo[ITEM_WATER_MEMORY].holdEffect == HOLD_EFFECT_MEMORY);
ASSUME(gItemsInfo[ITEM_WATER_MEMORY].secondaryId == TYPE_WATER);
ASSUME(gSpeciesInfo[SPECIES_VAPOREON].types[0] == TYPE_WATER);
ASSUME(GetSpeciesType(SPECIES_VAPOREON, 0) == TYPE_WATER);
PLAYER(SPECIES_GEODUDE_ALOLA) { Ability(ABILITY_GALVANIZE); Item(item); }
OPPONENT(SPECIES_VAPOREON) { Ability(ABILITY_WATER_ABSORB); }
} WHEN {
@ -150,7 +150,7 @@ SINGLE_BATTLE_TEST("Galvanize doesn't affect Hidden Power's type")
GIVEN {
ASSUME(GetMoveEffect(MOVE_HIDDEN_POWER) == EFFECT_HIDDEN_POWER);
ASSUME(gTypesInfo[TYPE_ELECTRIC].isHiddenPowerType == TRUE);
ASSUME(gSpeciesInfo[SPECIES_DIGLETT].types[0] == TYPE_GROUND);
ASSUME(GetSpeciesType(SPECIES_DIGLETT, 0) == TYPE_GROUND);
PLAYER(SPECIES_GEODUDE_ALOLA) { Ability(ABILITY_GALVANIZE); HPIV(31); AttackIV(31); DefenseIV(31); SpAttackIV(30); SpDefenseIV(31); SpeedIV(30); } // HP Water
OPPONENT(SPECIES_VAPOREON) { Ability(ABILITY_WATER_ABSORB); }
} WHEN {

View File

@ -43,7 +43,7 @@ SINGLE_BATTLE_TEST("Magic Bounce cannot bounce back powder moves against Grass T
{
GIVEN {
ASSUME(IsPowderMove(MOVE_STUN_SPORE));
ASSUME(gSpeciesInfo[SPECIES_ODDISH].types[0] == TYPE_GRASS);
ASSUME(GetSpeciesType(SPECIES_ODDISH, 0) == TYPE_GRASS);
PLAYER(SPECIES_ODDISH);
OPPONENT(SPECIES_ESPEON) { Ability(ABILITY_MAGIC_BOUNCE); }
} WHEN {

View File

@ -51,8 +51,8 @@ SINGLE_BATTLE_TEST("Mimicry restores the battler's types when terrain is removed
}
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_STUNFISK_GALAR].types[0] == TYPE_GROUND);
ASSUME(gSpeciesInfo[SPECIES_STUNFISK_GALAR].types[1] == TYPE_STEEL);
ASSUME(GetSpeciesType(SPECIES_STUNFISK_GALAR, 0) == TYPE_GROUND);
ASSUME(GetSpeciesType(SPECIES_STUNFISK_GALAR, 1) == TYPE_STEEL);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_STUNFISK_GALAR) { Ability(ABILITY_MIMICRY); }
} WHEN {

View File

@ -15,7 +15,7 @@ SINGLE_BATTLE_TEST("Normalize turns a move into a Normal-type move")
PARAMETRIZE { ability = ABILITY_CUTE_CHARM; }
PARAMETRIZE { ability = ABILITY_NORMALIZE; }
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_GASTLY].types[0] == TYPE_GHOST);
ASSUME(GetSpeciesType(SPECIES_GASTLY, 0) == TYPE_GHOST);
PLAYER(SPECIES_GASTLY);
OPPONENT(SPECIES_SKITTY) { Ability(ability); Moves(MOVE_WATER_GUN);}
} WHEN {
@ -41,7 +41,7 @@ SINGLE_BATTLE_TEST("Normalize affects status moves")
PARAMETRIZE { ability = ABILITY_NORMALIZE; }
GIVEN {
ASSUME(GetMoveType(MOVE_THUNDER_WAVE) == TYPE_ELECTRIC);
ASSUME(gSpeciesInfo[SPECIES_DRILBUR].types[0] == TYPE_GROUND);
ASSUME(GetSpeciesType(SPECIES_DRILBUR, 0) == TYPE_GROUND);
PLAYER(SPECIES_DRILBUR);
OPPONENT(SPECIES_SKITTY) { Ability(ability); Moves(MOVE_THUNDER_WAVE);}
} WHEN {
@ -68,7 +68,7 @@ SINGLE_BATTLE_TEST("Normalize still makes Freeze-Dry do super effective damage t
GIVEN {
ASSUME(GetMoveType(MOVE_FREEZE_DRY) == TYPE_ICE);
ASSUME(GetMoveEffect(MOVE_FREEZE_DRY) == EFFECT_SUPER_EFFECTIVE_ON_ARG);
ASSUME(gSpeciesInfo[SPECIES_MUDKIP].types[0] == TYPE_WATER);
ASSUME(GetSpeciesType(SPECIES_MUDKIP, 0) == TYPE_WATER);
PLAYER(SPECIES_MUDKIP);
OPPONENT(SPECIES_SKITTY) { Ability(ability); Moves(MOVE_FREEZE_DRY);}
} WHEN {
@ -188,7 +188,7 @@ SINGLE_BATTLE_TEST("Normalize doesn't affect Weather Ball's type", s16 damage)
GIVEN {
ASSUME(GetMoveEffect(MOVE_WEATHER_BALL) == EFFECT_WEATHER_BALL);
ASSUME(GetMoveType(MOVE_WEATHER_BALL) == TYPE_NORMAL);
ASSUME(gSpeciesInfo[SPECIES_MEGANIUM].types[0] == TYPE_GRASS);
ASSUME(GetSpeciesType(SPECIES_MEGANIUM, 0) == TYPE_GRASS);
PLAYER(SPECIES_SKITTY) { Ability(ability); }
OPPONENT(SPECIES_MEGANIUM);
} WHEN {
@ -214,7 +214,7 @@ SINGLE_BATTLE_TEST("Normalize doesn't affect Natural Gift's type")
GIVEN {
ASSUME(GetMoveEffect(MOVE_NATURAL_GIFT) == EFFECT_NATURAL_GIFT);
ASSUME(gNaturalGiftTable[ITEM_TO_BERRY(ITEM_ORAN_BERRY)].type == TYPE_POISON);
ASSUME(gSpeciesInfo[SPECIES_BELDUM].types[0] == TYPE_STEEL);
ASSUME(GetSpeciesType(SPECIES_BELDUM, 0) == TYPE_STEEL);
PLAYER(SPECIES_SKITTY) { Ability(ability); Item(ITEM_ORAN_BERRY); }
OPPONENT(SPECIES_BELDUM);
} WHEN {
@ -241,7 +241,7 @@ SINGLE_BATTLE_TEST("Normalize doesn't affect Judgment / Techno Blast / Multi-Att
ASSUME(gItemsInfo[ITEM_SHOCK_DRIVE].secondaryId == TYPE_ELECTRIC);
ASSUME(gItemsInfo[ITEM_ELECTRIC_MEMORY].holdEffect == HOLD_EFFECT_MEMORY);
ASSUME(gItemsInfo[ITEM_ELECTRIC_MEMORY].secondaryId == TYPE_ELECTRIC);
ASSUME(gSpeciesInfo[SPECIES_DIGLETT].types[0] == TYPE_GROUND);
ASSUME(GetSpeciesType(SPECIES_DIGLETT, 0) == TYPE_GROUND);
PLAYER(SPECIES_SKITTY) { Ability(ABILITY_NORMALIZE); Item(item); }
OPPONENT(SPECIES_DIGLETT);
} WHEN {
@ -257,7 +257,7 @@ SINGLE_BATTLE_TEST("Normalize doesn't affect Hidden Power's type")
GIVEN {
ASSUME(GetMoveEffect(MOVE_HIDDEN_POWER) == EFFECT_HIDDEN_POWER);
ASSUME(gTypesInfo[TYPE_ELECTRIC].isHiddenPowerType == TRUE);
ASSUME(gSpeciesInfo[SPECIES_DIGLETT].types[0] == TYPE_GROUND);
ASSUME(GetSpeciesType(SPECIES_DIGLETT, 0) == TYPE_GROUND);
PLAYER(SPECIES_SKITTY) { Ability(ABILITY_NORMALIZE); HPIV(31); AttackIV(31); DefenseIV(31); SpAttackIV(30); SpDefenseIV(31); SpeedIV(31); } // HP Electric
OPPONENT(SPECIES_DIGLETT);
} WHEN {

View File

@ -80,7 +80,7 @@ DOUBLE_BATTLE_TEST("Parental Bond does not convert multi-target moves into a two
GIVEN {
ASSUME(GetMoveStrikeCount(MOVE_EARTHQUAKE) < 2);
ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY);
ASSUME(gSpeciesInfo[SPECIES_PIDGEY].types[1] == TYPE_FLYING);
ASSUME(GetSpeciesType(SPECIES_PIDGEY, 1) == TYPE_FLYING);
PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); }
PLAYER(SPECIES_PIDGEY);
OPPONENT(SPECIES_WOBBUFFET);

View File

@ -55,7 +55,7 @@ SINGLE_BATTLE_TEST("Pixilate doesn't affect Weather Ball's type", s16 damage)
GIVEN {
ASSUME(GetMoveEffect(MOVE_WEATHER_BALL) == EFFECT_WEATHER_BALL);
ASSUME(GetMoveType(MOVE_WEATHER_BALL) == TYPE_NORMAL);
ASSUME(gSpeciesInfo[SPECIES_PINSIR].types[0] == TYPE_BUG);
ASSUME(GetSpeciesType(SPECIES_PINSIR, 0) == TYPE_BUG);
PLAYER(SPECIES_SYLVEON) { Level(5); Ability(ability); }
OPPONENT(SPECIES_PINSIR);
} WHEN {
@ -81,7 +81,7 @@ SINGLE_BATTLE_TEST("Pixilate doesn't affect Natural Gift's type")
GIVEN {
ASSUME(GetMoveEffect(MOVE_NATURAL_GIFT) == EFFECT_NATURAL_GIFT);
ASSUME(gNaturalGiftTable[ITEM_TO_BERRY(ITEM_ORAN_BERRY)].type == TYPE_POISON);
ASSUME(gSpeciesInfo[SPECIES_BELDUM].types[0] == TYPE_STEEL);
ASSUME(GetSpeciesType(SPECIES_BELDUM, 0) == TYPE_STEEL);
PLAYER(SPECIES_SYLVEON) { Ability(ability); Item(ITEM_ORAN_BERRY); }
OPPONENT(SPECIES_BELDUM);
} WHEN {
@ -108,7 +108,7 @@ SINGLE_BATTLE_TEST("Pixilate doesn't affect Judgment / Techno Blast / Multi-Atta
ASSUME(gItemsInfo[ITEM_SHOCK_DRIVE].secondaryId == TYPE_ELECTRIC);
ASSUME(gItemsInfo[ITEM_ELECTRIC_MEMORY].holdEffect == HOLD_EFFECT_MEMORY);
ASSUME(gItemsInfo[ITEM_ELECTRIC_MEMORY].secondaryId == TYPE_ELECTRIC);
ASSUME(gSpeciesInfo[SPECIES_DIGLETT].types[0] == TYPE_GROUND);
ASSUME(GetSpeciesType(SPECIES_DIGLETT, 0) == TYPE_GROUND);
PLAYER(SPECIES_SYLVEON) { Ability(ABILITY_PIXILATE); Item(item); }
OPPONENT(SPECIES_DIGLETT);
} WHEN {
@ -124,7 +124,7 @@ SINGLE_BATTLE_TEST("Pixilate doesn't affect Hidden Power's type")
GIVEN {
ASSUME(GetMoveEffect(MOVE_HIDDEN_POWER) == EFFECT_HIDDEN_POWER);
ASSUME(gTypesInfo[TYPE_ELECTRIC].isHiddenPowerType == TRUE);
ASSUME(gSpeciesInfo[SPECIES_DIGLETT].types[0] == TYPE_GROUND);
ASSUME(GetSpeciesType(SPECIES_DIGLETT, 0) == TYPE_GROUND);
PLAYER(SPECIES_SYLVEON) { Ability(ABILITY_PIXILATE); HPIV(31); AttackIV(31); DefenseIV(31); SpAttackIV(30); SpDefenseIV(31); SpeedIV(31); } // HP Electric
OPPONENT(SPECIES_DIGLETT);
} WHEN {

View File

@ -3,7 +3,7 @@
ASSUMPTIONS
{
ASSUME(gSpeciesInfo[SPECIES_UMBREON].types[0] == TYPE_DARK);
ASSUME(GetSpeciesType(SPECIES_UMBREON, 0) == TYPE_DARK);
ASSUME(GetMoveCategory(MOVE_CONFUSE_RAY) == DAMAGE_CATEGORY_STATUS);
}

View File

@ -104,7 +104,7 @@ SINGLE_BATTLE_TEST("Quark Drive activates on switch-in")
SINGLE_BATTLE_TEST("Quark Drive activates on Electric Terrain even if not grounded")
{
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_IRON_JUGULIS].types[0] == TYPE_FLYING || gSpeciesInfo[SPECIES_IRON_JUGULIS].types[1] == TYPE_FLYING);
ASSUME(GetSpeciesType(SPECIES_IRON_JUGULIS, 0) == TYPE_FLYING || GetSpeciesType(SPECIES_IRON_JUGULIS, 1) == TYPE_FLYING);
PLAYER(SPECIES_IRON_JUGULIS) { Ability(ABILITY_QUARK_DRIVE); }
OPPONENT(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); };
} WHEN {

View File

@ -53,7 +53,7 @@ SINGLE_BATTLE_TEST("Refrigerate doesn't affect Weather Ball's type", s16 damage)
PARAMETRIZE { move = MOVE_SUNNY_DAY; ability = ABILITY_REFRIGERATE; }
GIVEN {
ASSUME(GetMoveEffect(MOVE_WEATHER_BALL) == EFFECT_WEATHER_BALL);
ASSUME(gSpeciesInfo[SPECIES_PINSIR].types[0] == TYPE_BUG);
ASSUME(GetSpeciesType(SPECIES_PINSIR, 0) == TYPE_BUG);
PLAYER(SPECIES_AMAURA) { Ability(ability); }
OPPONENT(SPECIES_PINSIR);
} WHEN {
@ -79,7 +79,7 @@ SINGLE_BATTLE_TEST("Refrigerate doesn't affect Natural Gift's type")
GIVEN {
ASSUME(GetMoveEffect(MOVE_NATURAL_GIFT) == EFFECT_NATURAL_GIFT);
ASSUME(gNaturalGiftTable[ITEM_TO_BERRY(ITEM_ORAN_BERRY)].type == TYPE_POISON);
ASSUME(gSpeciesInfo[SPECIES_BELDUM].types[0] == TYPE_STEEL);
ASSUME(GetSpeciesType(SPECIES_BELDUM, 0) == TYPE_STEEL);
PLAYER(SPECIES_AMAURA) { Ability(ability); Item(ITEM_ORAN_BERRY); }
OPPONENT(SPECIES_BELDUM);
} WHEN {
@ -106,7 +106,7 @@ SINGLE_BATTLE_TEST("Refrigerate doesn't affect Judgment / Techno Blast / Multi-A
ASSUME(gItemsInfo[ITEM_SHOCK_DRIVE].secondaryId == TYPE_ELECTRIC);
ASSUME(gItemsInfo[ITEM_ELECTRIC_MEMORY].holdEffect == HOLD_EFFECT_MEMORY);
ASSUME(gItemsInfo[ITEM_ELECTRIC_MEMORY].secondaryId == TYPE_ELECTRIC);
ASSUME(gSpeciesInfo[SPECIES_DIGLETT].types[0] == TYPE_GROUND);
ASSUME(GetSpeciesType(SPECIES_DIGLETT, 0) == TYPE_GROUND);
PLAYER(SPECIES_AMAURA) { Ability(ABILITY_REFRIGERATE); Item(item); }
OPPONENT(SPECIES_DIGLETT);
} WHEN {
@ -122,7 +122,7 @@ SINGLE_BATTLE_TEST("Refrigerate doesn't affect Hidden Power's type")
GIVEN {
ASSUME(GetMoveEffect(MOVE_HIDDEN_POWER) == EFFECT_HIDDEN_POWER);
ASSUME(gTypesInfo[TYPE_ELECTRIC].isHiddenPowerType == TRUE);
ASSUME(gSpeciesInfo[SPECIES_DIGLETT].types[0] == TYPE_GROUND);
ASSUME(GetSpeciesType(SPECIES_DIGLETT, 0) == TYPE_GROUND);
PLAYER(SPECIES_AMAURA) { Ability(ABILITY_REFRIGERATE); HPIV(31); AttackIV(31); DefenseIV(31); SpAttackIV(30); SpDefenseIV(31); SpeedIV(31); } // HP Electric
OPPONENT(SPECIES_DIGLETT);
} WHEN {

View File

@ -61,7 +61,7 @@ SINGLE_BATTLE_TEST("Rivalry doesn't modify power if the attacker is genderless",
PARAMETRIZE { species = SPECIES_NIDOQUEEN; ability = ABILITY_RIVALRY; }
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_PORYGON].abilities[0] == ABILITY_TRACE);
ASSUME(GetSpeciesAbility(SPECIES_PORYGON, 0) == ABILITY_TRACE);
PLAYER(SPECIES_PORYGON) { Ability(ABILITY_TRACE); } // No genderless mon naturally gets Rivalry
OPPONENT(species) { Ability(ability); };
} WHEN {

View File

@ -3,8 +3,8 @@
SINGLE_BATTLE_TEST("Sand Force prevents damage from sandstorm")
{
u32 type1 = gSpeciesInfo[SPECIES_SHELLOS].types[0];
u32 type2 = gSpeciesInfo[SPECIES_SHELLOS].types[1];
u32 type1 = GetSpeciesType(SPECIES_SHELLOS, 0);
u32 type2 = GetSpeciesType(SPECIES_SHELLOS, 1);
GIVEN {
ASSUME(type1 != TYPE_ROCK && type2 != TYPE_ROCK);
ASSUME(type1 != TYPE_GROUND && type2 != TYPE_GROUND);

View File

@ -3,8 +3,8 @@
SINGLE_BATTLE_TEST("Sand Rush prevents damage from sandstorm")
{
u32 type1 = gSpeciesInfo[SPECIES_STOUTLAND].types[0];
u32 type2 = gSpeciesInfo[SPECIES_STOUTLAND].types[1];
u32 type1 = GetSpeciesType(SPECIES_STOUTLAND, 0);
u32 type2 = GetSpeciesType(SPECIES_STOUTLAND, 1);
GIVEN {
ASSUME(type1 != TYPE_ROCK && type2 != TYPE_ROCK);
ASSUME(type1 != TYPE_GROUND && type2 != TYPE_GROUND);

View File

@ -8,7 +8,7 @@ SINGLE_BATTLE_TEST("Schooling switches Level 20+ Wishiwashi's form when HP is 25
PARAMETRIZE { level = 20; }
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_WISHIWASHI_SOLO].baseHP == gSpeciesInfo[SPECIES_WISHIWASHI_SCHOOL].baseHP);
ASSUME(GetSpeciesBaseHP(SPECIES_WISHIWASHI_SOLO) == GetSpeciesBaseHP(SPECIES_WISHIWASHI_SCHOOL));
PLAYER(SPECIES_WISHIWASHI_SOLO)
{
Level(level);
@ -47,7 +47,7 @@ SINGLE_BATTLE_TEST("Schooling switches Level 20+ Wishiwashi's form when HP is ov
PARAMETRIZE { level = 20; overQuarterHP = TRUE; }
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_WISHIWASHI_SOLO].baseHP == gSpeciesInfo[SPECIES_WISHIWASHI_SCHOOL].baseHP);
ASSUME(GetSpeciesBaseHP(SPECIES_WISHIWASHI_SOLO) == GetSpeciesBaseHP(SPECIES_WISHIWASHI_SCHOOL));
PLAYER(SPECIES_WISHIWASHI_SOLO)
{
Level(level);
@ -80,7 +80,7 @@ SINGLE_BATTLE_TEST("Schooling switches Level 20+ Wishiwashi's form when HP is he
PARAMETRIZE { level = 20; }
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_WISHIWASHI_SOLO].baseHP == gSpeciesInfo[SPECIES_WISHIWASHI_SCHOOL].baseHP);
ASSUME(GetSpeciesBaseHP(SPECIES_WISHIWASHI_SOLO) == GetSpeciesBaseHP(SPECIES_WISHIWASHI_SCHOOL));
PLAYER(SPECIES_WISHIWASHI_SOLO)
{
Level(level);

View File

@ -52,8 +52,8 @@ SINGLE_BATTLE_TEST("Slush Rush doesn't double speed if Cloud Nine/Air Lock is on
SINGLE_BATTLE_TEST("Slush Rush doesn't prevent non-Ice types from taking damage in Hail")
{
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_ICE);
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_ICE);
ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_ICE);
ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_ICE);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_CETITAN) { Ability(ABILITY_SLUSH_RUSH); }
} WHEN {

View File

@ -10,7 +10,7 @@ SINGLE_BATTLE_TEST("Super Luck increases the critical hit ratio by 1 stage")
PARAMETRIZE { genConfig = j; passes = 1; trials = 8; } // 12.5%
PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT);
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_TOGEPI].baseSpeed == 20);
ASSUME(GetSpeciesBaseSpeed(SPECIES_TOGEPI) == 20);
WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig);
PLAYER(SPECIES_TOGEPI) { Ability(ABILITY_SUPER_LUCK); };
OPPONENT(SPECIES_WOBBUFFET);

View File

@ -10,9 +10,9 @@ SINGLE_BATTLE_TEST("Swarm boosts Bug-type moves in a pinch", s16 damage)
ASSUME(GetMoveType(MOVE_BUG_BITE) == TYPE_BUG);
ASSUME(GetMovePower(MOVE_BUG_BITE) == 60);
ASSUME(GetMoveCategory(MOVE_BUG_BITE) == DAMAGE_CATEGORY_PHYSICAL);
ASSUME(gSpeciesInfo[SPECIES_LEDYBA].types[0] == TYPE_BUG);
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] == TYPE_PSYCHIC);
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] == TYPE_PSYCHIC);
ASSUME(GetSpeciesType(SPECIES_LEDYBA, 0) == TYPE_BUG);
ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) == TYPE_PSYCHIC);
ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) == TYPE_PSYCHIC);
PLAYER(SPECIES_LEDYBA) { Ability(ABILITY_SWARM); MaxHP(99); HP(hp); Attack(45); }
OPPONENT(SPECIES_WOBBUFFET) { Defense(121); }
} WHEN {

View File

@ -8,8 +8,8 @@ SINGLE_BATTLE_TEST("Zen Mode switches Darmanitan's form when HP is half or less
PARAMETRIZE { standardSpecies = SPECIES_DARMANITAN_GALAR_STANDARD; zenSpecies = SPECIES_DARMANITAN_GALAR_ZEN; }
GIVEN {
ASSUME(gSpeciesInfo[standardSpecies].baseHP == 105);
ASSUME(gSpeciesInfo[zenSpecies].baseHP == 105);
ASSUME(GetSpeciesBaseHP(standardSpecies) == 105);
ASSUME(GetSpeciesBaseHP(zenSpecies) == 105);
PLAYER(standardSpecies)
{
Ability(ABILITY_ZEN_MODE);
@ -37,8 +37,8 @@ SINGLE_BATTLE_TEST("Zen Mode switches Darmanitan's form when HP is half or less
PARAMETRIZE { standardSpecies = SPECIES_DARMANITAN_GALAR_STANDARD; zenSpecies = SPECIES_DARMANITAN_GALAR_ZEN; }
GIVEN {
ASSUME(gSpeciesInfo[standardSpecies].baseHP == 105);
ASSUME(gSpeciesInfo[zenSpecies].baseHP == 105);
ASSUME(GetSpeciesBaseHP(standardSpecies) == 105);
ASSUME(GetSpeciesBaseHP(zenSpecies) == 105);
PLAYER(standardSpecies)
{
Ability(ABILITY_ZEN_MODE);
@ -65,8 +65,8 @@ SINGLE_BATTLE_TEST("Zen Mode switches Darmanitan's form when HP is healed above
PARAMETRIZE { standardSpecies = SPECIES_DARMANITAN_GALAR_STANDARD; zenSpecies = SPECIES_DARMANITAN_GALAR_ZEN; }
GIVEN {
ASSUME(gSpeciesInfo[standardSpecies].baseHP == 105);
ASSUME(gSpeciesInfo[zenSpecies].baseHP == 105);
ASSUME(GetSpeciesBaseHP(standardSpecies) == 105);
ASSUME(GetSpeciesBaseHP(zenSpecies) == 105);
PLAYER(standardSpecies)
{
Ability(ABILITY_ZEN_MODE);

View File

@ -518,8 +518,8 @@ AI_SINGLE_BATTLE_TEST("AI will choose Scratch over Power-up Punch with Contrary"
ASSUME(GetMoveType(MOVE_SCRATCH) == TYPE_NORMAL);
ASSUME(GetMovePower(MOVE_POWER_UP_PUNCH) == 40);
ASSUME(GetMoveType(MOVE_POWER_UP_PUNCH) == TYPE_FIGHTING);
ASSUME(gSpeciesInfo[SPECIES_SQUIRTLE].types[0] == TYPE_WATER);
ASSUME(gSpeciesInfo[SPECIES_SQUIRTLE].types[1] == TYPE_WATER);
ASSUME(GetSpeciesType(SPECIES_SQUIRTLE, 0) == TYPE_WATER);
ASSUME(GetSpeciesType(SPECIES_SQUIRTLE, 1) == TYPE_WATER);
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT);
PLAYER(SPECIES_SQUIRTLE) { };
OPPONENT(SPECIES_MALAMAR) { Ability(ability); Moves(MOVE_SCRATCH, MOVE_POWER_UP_PUNCH); }
@ -544,8 +544,8 @@ AI_SINGLE_BATTLE_TEST("AI will choose Superpower over Outrage with Contrary")
ASSUME(GetMoveType(MOVE_SUPERPOWER) == TYPE_FIGHTING);
ASSUME(GetMovePower(MOVE_OUTRAGE) == 120);
ASSUME(GetMoveType(MOVE_OUTRAGE) == TYPE_DRAGON);
ASSUME(gSpeciesInfo[SPECIES_SQUIRTLE].types[0] == TYPE_WATER);
ASSUME(gSpeciesInfo[SPECIES_SQUIRTLE].types[1] == TYPE_WATER);
ASSUME(GetSpeciesType(SPECIES_SQUIRTLE, 0) == TYPE_WATER);
ASSUME(GetSpeciesType(SPECIES_SQUIRTLE, 1) == TYPE_WATER);
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT);
PLAYER(SPECIES_SQUIRTLE) { };
OPPONENT(SPECIES_MALAMAR) { Ability(ability); Moves(MOVE_OUTRAGE, MOVE_SUPERPOWER); }

View File

@ -199,7 +199,7 @@ AI_SINGLE_BATTLE_TEST("Choiced Pokémon won't use status move if they are trappe
AI_SINGLE_BATTLE_TEST("Choiced Pokémon will switch if locked into a move the player is immune to")
{
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_GASTLY].types[0] == TYPE_GHOST);
ASSUME(GetSpeciesType(SPECIES_GASTLY, 0) == TYPE_GHOST);
ASSUME(GetMoveType(MOVE_SURF) == TYPE_WATER);
ASSUME(GetMoveType(MOVE_BODY_SLAM) == TYPE_NORMAL);
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT);
@ -217,7 +217,7 @@ AI_SINGLE_BATTLE_TEST("Choiced Pokémon will only see choiced moves when conside
{
PASSES_RANDOMLY(SHOULD_SWITCH_HASBADODDS_PERCENTAGE, 100, RNG_AI_SWITCH_HASBADODDS);
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_GASTLY].types[0] == TYPE_GHOST);
ASSUME(GetSpeciesType(SPECIES_GASTLY, 0) == TYPE_GHOST);
ASSUME(GetMoveType(MOVE_SURF) == TYPE_WATER);
ASSUME(GetMoveType(MOVE_BODY_SLAM) == TYPE_NORMAL);
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES);
@ -235,7 +235,7 @@ AI_SINGLE_BATTLE_TEST("Choiced Pokémon will only see choiced moves when conside
{
PASSES_RANDOMLY(SHOULD_SWITCH_ABSORBS_MOVE_PERCENTAGE, 100, RNG_AI_SWITCH_ABSORBING);
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_SANDSHREW].types[0] == TYPE_GROUND);
ASSUME(GetSpeciesType(SPECIES_SANDSHREW, 0) == TYPE_GROUND);
ASSUME(GetMoveType(MOVE_SCRATCH) == TYPE_NORMAL);
ASSUME(GetMoveType(MOVE_THUNDERBOLT) == TYPE_ELECTRIC);
ASSUME(GetMoveType(MOVE_WATER_GUN) == TYPE_WATER);

View File

@ -4,8 +4,8 @@
ASSUMPTIONS {
ASSUME(GetMoveEffect(MOVE_U_TURN) == EFFECT_HIT_ESCAPE);
ASSUME(GetMoveType(MOVE_CRUNCH) == TYPE_DARK);
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] == TYPE_PSYCHIC);
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] == TYPE_PSYCHIC);
ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) == TYPE_PSYCHIC);
ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) == TYPE_PSYCHIC);
}
AI_DOUBLE_BATTLE_TEST("AI_FLAG_DOUBLE_ACE_POKEMON: U-Turn won't send out any of the Ace Mons if other options exist")
@ -76,7 +76,7 @@ AI_DOUBLE_BATTLE_TEST("AI_FLAG_DOUBLE_ACE_POKEMON: U-Turn will send out an Ace M
AI_DOUBLE_BATTLE_TEST("AI_FLAG_DOUBLE_ACE_POKEMON: Ace mons won't be switched in even if they are the best candidates")
{
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_GENGAR].types[0] == TYPE_GHOST);
ASSUME(GetSpeciesType(SPECIES_GENGAR, 0) == TYPE_GHOST);
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_SMART_SWITCHING | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_DOUBLE_ACE_POKEMON);
PLAYER(SPECIES_GENGAR) { Level(10); }

View File

@ -10,8 +10,8 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_RISKY: AI will blindly Mirror Coat against specia
GIVEN {
ASSUME(GetMoveEffect(MOVE_MIRROR_COAT) == EFFECT_MIRROR_COAT);
ASSUME(gSpeciesInfo[SPECIES_GROVYLE].baseSpAttack == 85);
ASSUME(gSpeciesInfo[SPECIES_GROVYLE].baseAttack == 65);
ASSUME(GetSpeciesBaseSpAttack(SPECIES_GROVYLE) == 85);
ASSUME(GetSpeciesBaseAttack(SPECIES_GROVYLE) == 65);
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiRiskyFlag);
PLAYER(SPECIES_GROVYLE) { Level(20); Moves(MOVE_ENERGY_BALL); }
OPPONENT(SPECIES_CASTFORM) { Level(20); Moves(MOVE_SCRATCH, MOVE_MIRROR_COAT); }
@ -29,8 +29,8 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_RISKY: AI will blindly Counter against physical a
GIVEN {
ASSUME(GetMoveEffect(MOVE_COUNTER) == EFFECT_COUNTER);
ASSUME(gSpeciesInfo[SPECIES_MARSHTOMP].baseAttack == 85);
ASSUME(gSpeciesInfo[SPECIES_MARSHTOMP].baseSpAttack == 60);
ASSUME(GetSpeciesBaseAttack(SPECIES_MARSHTOMP) == 85);
ASSUME(GetSpeciesBaseSpAttack(SPECIES_MARSHTOMP) == 60);
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiRiskyFlag);
PLAYER(SPECIES_MARSHTOMP) { Level(20); Moves(MOVE_WATERFALL); }
OPPONENT(SPECIES_CASTFORM) { Level(20); Moves(MOVE_SCRATCH, MOVE_COUNTER); }

View File

@ -478,8 +478,8 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch in trapping mon m
PARAMETRIZE { aiSmartSwitchingFlag = AI_FLAG_SMART_SWITCHING; }
PASSES_RANDOMLY(SHOULD_SWITCH_TRAPPER_PERCENTAGE, 100, RNG_AI_SWITCH_TRAPPER);
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_GOLURK].types[0] == TYPE_GROUND);
ASSUME(gSpeciesInfo[SPECIES_GOLURK].types[1] == TYPE_GHOST);
ASSUME(GetSpeciesType(SPECIES_GOLURK, 0) == TYPE_GROUND);
ASSUME(GetSpeciesType(SPECIES_GOLURK, 1) == TYPE_GHOST);
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiSmartSwitchingFlag);
PLAYER(SPECIES_ELECTRODE) { Speed(4); Moves(MOVE_THUNDERBOLT, MOVE_AURA_SPHERE, MOVE_PROTECT); }
PLAYER(SPECIES_WOBBUFFET) { Speed(1); };
@ -500,7 +500,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: AI will switch in trapping mon
PARAMETRIZE { aiSmartMonChoicesFlag = 0; } // No trapping behaviour
PARAMETRIZE { aiSmartMonChoicesFlag = AI_FLAG_SMART_MON_CHOICES; } // Traps with mid battle switches
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_MAWILE].types[0] == TYPE_STEEL);
ASSUME(GetSpeciesType(SPECIES_MAWILE, 0) == TYPE_STEEL);
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiSmartMonChoicesFlag);
PLAYER(SPECIES_MAWILE) { Speed(2); Moves(MOVE_PROTECT, MOVE_SCRATCH); }
PLAYER(SPECIES_WOBBUFFET) { Speed(1); }
@ -521,7 +521,7 @@ AI_SINGLE_BATTLE_TEST("AI won't use trapping behaviour if player only has 1 mon
PARAMETRIZE { aiSmartMonChoicesFlag = 0; } // No trapping behaviour
PARAMETRIZE { aiSmartMonChoicesFlag = AI_FLAG_SMART_MON_CHOICES; } // Traps with mid battle switches
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_MAWILE].types[0] == TYPE_STEEL);
ASSUME(GetSpeciesType(SPECIES_MAWILE, 0) == TYPE_STEEL);
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiSmartMonChoicesFlag);
PLAYER(SPECIES_MAWILE) { Speed(2); Moves(MOVE_PROTECT, MOVE_SCRATCH); }
OPPONENT(SPECIES_SNORLAX) { Speed(3); Moves(MOVE_SELF_DESTRUCT); }
@ -550,9 +550,9 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if mon would
{
PASSES_RANDOMLY(SHOULD_SWITCH_HASBADODDS_PERCENTAGE, 100, RNG_AI_SWITCH_HASBADODDS);
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_RHYDON].types[0] == TYPE_GROUND);
ASSUME(gSpeciesInfo[SPECIES_PELIPPER].types[0] == TYPE_WATER);
ASSUME(gSpeciesInfo[SPECIES_PELIPPER].types[1] == TYPE_FLYING);
ASSUME(GetSpeciesType(SPECIES_RHYDON, 0) == TYPE_GROUND);
ASSUME(GetSpeciesType(SPECIES_PELIPPER, 0) == TYPE_WATER);
ASSUME(GetSpeciesType(SPECIES_PELIPPER, 1) == TYPE_FLYING);
ASSUME(GetMoveType(MOVE_THUNDERBOLT) == TYPE_ELECTRIC);
ASSUME(GetMoveType(MOVE_EARTHQUAKE) == TYPE_GROUND);
@ -569,11 +569,11 @@ AI_SINGLE_BATTLE_TEST("Switch AI: AI will switch out if it can't deal damage to
{
PASSES_RANDOMLY(SHOULD_SWITCH_WONDER_GUARD_PERCENTAGE, 100, RNG_AI_SWITCH_WONDER_GUARD);
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].types[0] == TYPE_BUG);
ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].types[1] == TYPE_GHOST);
ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].abilities[0] == ABILITY_WONDER_GUARD);
ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].abilities[1] == ABILITY_NONE);
ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].abilities[2] == ABILITY_NONE);
ASSUME(GetSpeciesType(SPECIES_SHEDINJA, 0) == TYPE_BUG);
ASSUME(GetSpeciesType(SPECIES_SHEDINJA, 1) == TYPE_GHOST);
ASSUME(GetSpeciesAbility(SPECIES_SHEDINJA, 0) == ABILITY_WONDER_GUARD);
ASSUME(GetSpeciesAbility(SPECIES_SHEDINJA, 1) == ABILITY_NONE);
ASSUME(GetSpeciesAbility(SPECIES_SHEDINJA, 2) == ABILITY_NONE);
ASSUME(GetMoveType(MOVE_SCRATCH) == TYPE_NORMAL);
ASSUME(GetMoveType(MOVE_SHADOW_BALL) == TYPE_GHOST);
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT);
@ -589,11 +589,11 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it can't d
{
PASSES_RANDOMLY(SHOULD_SWITCH_WONDER_GUARD_PERCENTAGE, 100, RNG_AI_SWITCH_WONDER_GUARD);
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].types[0] == TYPE_BUG);
ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].types[1] == TYPE_GHOST);
ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].abilities[0] == ABILITY_WONDER_GUARD);
ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].abilities[1] == ABILITY_NONE);
ASSUME(gSpeciesInfo[SPECIES_SHEDINJA].abilities[2] == ABILITY_NONE);
ASSUME(GetSpeciesType(SPECIES_SHEDINJA, 0) == TYPE_BUG);
ASSUME(GetSpeciesType(SPECIES_SHEDINJA, 1) == TYPE_GHOST);
ASSUME(GetSpeciesAbility(SPECIES_SHEDINJA, 0) == ABILITY_WONDER_GUARD);
ASSUME(GetSpeciesAbility(SPECIES_SHEDINJA, 1) == ABILITY_NONE);
ASSUME(GetSpeciesAbility(SPECIES_SHEDINJA, 2) == ABILITY_NONE);
ASSUME(GetMoveType(MOVE_SCRATCH) == TYPE_NORMAL);
ASSUME(GetMoveType(MOVE_SHADOW_BALL) == TYPE_GHOST);
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING);
@ -1036,7 +1036,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: AI correctly handles abilities
{
GIVEN {
ASSUME(B_PRANKSTER_DARK_TYPES >= GEN_7);
ASSUME(gSpeciesInfo[SPECIES_GRENINJA].types[1] == TYPE_DARK);
ASSUME(GetSpeciesType(SPECIES_GRENINJA, 1) == TYPE_DARK);
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_MON_CHOICES);
PLAYER(SPECIES_GRENINJA) { Moves(MOVE_WATER_GUN); }
OPPONENT(SPECIES_WHIMSICOTT) { Ability(ABILITY_PRANKSTER); Moves(MOVE_LEECH_SEED, MOVE_STUN_SPORE, MOVE_ABSORB); }
@ -1144,7 +1144,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if all moves
ASSUME(GetMoveEffect(MOVE_POLTERGEIST) == EFFECT_POLTERGEIST);
ASSUME(GetMoveType(MOVE_SCALD) == TYPE_WATER);
ASSUME(GetMoveType(MOVE_EARTHQUAKE) == TYPE_GROUND);
ASSUME(gSpeciesInfo[SPECIES_MANTINE].types[1] == TYPE_FLYING);
ASSUME(GetSpeciesType(SPECIES_MANTINE, 1) == TYPE_FLYING);
ASSUME(GetItemHoldEffect(ITEM_WATER_GEM) == HOLD_EFFECT_GEMS);
ASSUME(GetItemSecondaryId(ITEM_WATER_GEM) == TYPE_WATER);
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_SWITCHING | AI_FLAG_OMNISCIENT);

View File

@ -14,7 +14,7 @@ SINGLE_BATTLE_TEST("Critical hits without modifiers occur at different rates by
PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT);
GIVEN {
WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig);
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].baseSpeed == 33);
ASSUME(GetSpeciesBaseSpeed(SPECIES_WOBBUFFET) == 33);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {

View File

@ -91,8 +91,8 @@ SINGLE_BATTLE_TEST("Abilities replaced by Mega Evolution do not affect turn orde
{
GIVEN {
ASSUME(B_MEGA_EVO_TURN_ORDER >= GEN_7);
ASSUME(gSpeciesInfo[SPECIES_SABLEYE_MEGA].abilities[0] != ABILITY_STALL
&& gSpeciesInfo[SPECIES_SABLEYE_MEGA].abilities[1] != ABILITY_STALL);
ASSUME(GetSpeciesAbility(SPECIES_SABLEYE_MEGA, 0) != ABILITY_STALL
&& GetSpeciesAbility(SPECIES_SABLEYE_MEGA, 1) != ABILITY_STALL);
PLAYER(SPECIES_SABLEYE) { Item(ITEM_SABLENITE); Ability(ABILITY_STALL); Speed(105); }
OPPONENT(SPECIES_WOBBUFFET) { Speed(44); }
} WHEN {
@ -158,9 +158,9 @@ SINGLE_BATTLE_TEST("Mega Evolved Pokemon do not change abilities after fainting"
{
GIVEN {
ASSUME(MoveMakesContact(MOVE_CRUNCH) == TRUE);
ASSUME(gSpeciesInfo[SPECIES_GARCHOMP_MEGA].abilities[0] != ABILITY_ROUGH_SKIN);
ASSUME(gSpeciesInfo[SPECIES_GARCHOMP_MEGA].abilities[1] != ABILITY_ROUGH_SKIN);
ASSUME(gSpeciesInfo[SPECIES_GARCHOMP_MEGA].abilities[2] != ABILITY_ROUGH_SKIN);
ASSUME(GetSpeciesAbility(SPECIES_GARCHOMP_MEGA, 0) != ABILITY_ROUGH_SKIN);
ASSUME(GetSpeciesAbility(SPECIES_GARCHOMP_MEGA, 1) != ABILITY_ROUGH_SKIN);
ASSUME(GetSpeciesAbility(SPECIES_GARCHOMP_MEGA, 2) != ABILITY_ROUGH_SKIN);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_GARCHOMP) { Ability(ABILITY_ROUGH_SKIN); Item(ITEM_GARCHOMPITE); HP(1); }
} WHEN {

View File

@ -875,7 +875,7 @@ SINGLE_BATTLE_TEST("Dynamax: Max Overgrowth sets up Grassy Terrain")
s32 maxHP = 490; // Because of recalculated stats upon Dynamaxing
GIVEN {
ASSUME(MoveHasAdditionalEffect(MOVE_MAX_OVERGROWTH, MOVE_EFFECT_GRASSY_TERRAIN));
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].baseHP == 190);
ASSUME(GetSpeciesBaseHP(SPECIES_WOBBUFFET) == 190);
OPPONENT(SPECIES_WOBBUFFET) { MaxHP(maxHP); HP(maxHP / 2); };
PLAYER(SPECIES_WOBBUFFET) { MaxHP(maxHP); HP(maxHP / 2); };
} WHEN {

View File

@ -23,7 +23,7 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Z-Moves are not affected by -ate abilities")
{
GIVEN {
ASSUME(GetMoveType(MOVE_SCRATCH) == TYPE_NORMAL);
ASSUME(gSpeciesInfo[SPECIES_SWELLOW].types[1] == TYPE_FLYING);
ASSUME(GetSpeciesType(SPECIES_SWELLOW, 1) == TYPE_FLYING);
PLAYER(SPECIES_AURORUS) { Ability(ABILITY_REFRIGERATE); Item(ITEM_NORMALIUM_Z); }
OPPONENT(SPECIES_SWELLOW);
} WHEN {
@ -182,9 +182,9 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Z_EFFECT_CURSE activates Z_EFFECT_RECOVER_HP or Z_E
PARAMETRIZE { species = SPECIES_DUSCLOPS; }
GIVEN {
ASSUME(GetMoveType(MOVE_CURSE) == TYPE_GHOST);
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_GHOST);
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_GHOST);
ASSUME(gSpeciesInfo[SPECIES_DUSCLOPS].types[0] == TYPE_GHOST);
ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_GHOST);
ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_GHOST);
ASSUME(GetSpeciesType(SPECIES_DUSCLOPS, 0) == TYPE_GHOST);
ASSUME(GetMoveZEffect(MOVE_CURSE) == Z_EFFECT_CURSE);
PLAYER(species) { Item(ITEM_GHOSTIUM_Z); HP(1); }
OPPONENT(SPECIES_WOBBUFFET);
@ -528,7 +528,7 @@ SINGLE_BATTLE_TEST("(Z-MOVE) 10,000,000 Volt Thunderbolt has an increased critic
GIVEN {
WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig);
ASSUME(GetMoveCriticalHitStage(MOVE_10_000_000_VOLT_THUNDERBOLT) == 2);
ASSUME(gSpeciesInfo[SPECIES_PIKACHU_PARTNER].baseSpeed == 90);
ASSUME(GetSpeciesBaseSpeed(SPECIES_PIKACHU_PARTNER) == 90);
PLAYER(SPECIES_PIKACHU_PARTNER) { Item(ITEM_PIKASHUNIUM_Z); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {

View File

@ -21,9 +21,9 @@ SINGLE_BATTLE_TEST("Leek increases critical hit ratio by 2 stages for the Farfet
PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT);
GIVEN {
WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig);
ASSUME(gSpeciesInfo[SPECIES_FARFETCHD].baseSpeed == 60);
ASSUME(gSpeciesInfo[SPECIES_FARFETCHD_GALAR].baseSpeed == 55);
ASSUME(gSpeciesInfo[SPECIES_SIRFETCHD].baseSpeed == 65);
ASSUME(GetSpeciesBaseSpeed(SPECIES_FARFETCHD) == 60);
ASSUME(GetSpeciesBaseSpeed(SPECIES_FARFETCHD_GALAR) == 55);
ASSUME(GetSpeciesBaseSpeed(SPECIES_SIRFETCHD) == 65);
ASSUME(gItemsInfo[ITEM_LEEK].holdEffect == HOLD_EFFECT_LEEK);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(species) { Item(ITEM_LEEK); }

View File

@ -13,7 +13,7 @@ SINGLE_BATTLE_TEST("Lucky Punch increases critical hit ratio by 2 stages for Cha
GIVEN {
WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig);
ASSUME(gItemsInfo[ITEM_LUCKY_PUNCH].holdEffect == HOLD_EFFECT_LUCKY_PUNCH);
ASSUME(gSpeciesInfo[SPECIES_CHANSEY].baseSpeed == 50);
ASSUME(GetSpeciesBaseSpeed(SPECIES_CHANSEY) == 50);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_CHANSEY) { Item(ITEM_LUCKY_PUNCH); }
} WHEN {

View File

@ -11,7 +11,7 @@ SINGLE_BATTLE_TEST("Scope Lens increases the critical hit ratio by 1 stage")
GIVEN {
WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig);
ASSUME(gItemsInfo[ITEM_SCOPE_LENS].holdEffect == HOLD_EFFECT_SCOPE_LENS);
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].baseSpeed == 33);
ASSUME(GetSpeciesBaseSpeed(SPECIES_WOBBUFFET) == 33);
PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_SCOPE_LENS); };
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {

View File

@ -146,7 +146,7 @@ SINGLE_BATTLE_TEST("Seeds get consumed in Terrain even if holder is not affected
PARAMETRIZE { species = SPECIES_TAPU_FINI; ability = ABILITY_MISTY_SURGE; item = ITEM_MISTY_SEED; }
PARAMETRIZE { species = SPECIES_TAPU_LELE; ability = ABILITY_PSYCHIC_SURGE; item = ITEM_PSYCHIC_SEED; }
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_PIDGEY].types[0] == TYPE_FLYING || gSpeciesInfo[SPECIES_PIDGEY].types[1] == TYPE_FLYING);
ASSUME(GetSpeciesType(SPECIES_PIDGEY, 0) == TYPE_FLYING || GetSpeciesType(SPECIES_PIDGEY, 1) == TYPE_FLYING);
PLAYER(SPECIES_PIDGEY) { Item(item); }
OPPONENT(species) { Ability(ability); }
} WHEN {

View File

@ -304,7 +304,7 @@ DOUBLE_BATTLE_TEST("Defog removes Aurora Veil from target's side", s16 damagePhy
PARAMETRIZE { move = MOVE_CELEBRATE; }
GIVEN {
ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL);
ASSUME(gSpeciesInfo[SPECIES_GLALIE].types[0] == TYPE_ICE);
ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE);
PLAYER(SPECIES_GLALIE) { Speed(4); }
PLAYER(SPECIES_GLALIE) { Speed(3); }
OPPONENT(SPECIES_GLALIE) { Speed(2); }
@ -336,7 +336,7 @@ DOUBLE_BATTLE_TEST("Defog removes everything it can")
{
GIVEN {
ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL);
ASSUME(gSpeciesInfo[SPECIES_GLALIE].types[0] == TYPE_ICE);
ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE);
PLAYER(SPECIES_GLALIE) { Speed(4); }
PLAYER(SPECIES_GLALIE) { Speed(3); }
PLAYER(SPECIES_GLALIE) { Speed(12); }

View File

@ -64,7 +64,7 @@ DOUBLE_BATTLE_TEST("Dragon Cheer increases critical hit ratio by 2 on Dragon typ
GIVEN {
WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig);
ASSUME(GetMoveCriticalHitStage(MOVE_SCRATCH) == 0);
ASSUME(gSpeciesInfo[SPECIES_DRATINI].baseSpeed == 50);
ASSUME(GetSpeciesBaseSpeed(SPECIES_DRATINI) == 50);
PLAYER(SPECIES_WOBBUFFET);
PLAYER(SPECIES_DRATINI);
OPPONENT(SPECIES_WOBBUFFET);

View File

@ -4,7 +4,7 @@
ASSUMPTIONS
{
ASSUME(GetMoveEffect(MOVE_DRAGON_DARTS) == EFFECT_DRAGON_DARTS);
ASSUME(gSpeciesInfo[SPECIES_CLEFAIRY].types[0] == TYPE_FAIRY || gSpeciesInfo[SPECIES_CLEFAIRY].types[1] == TYPE_FAIRY);
ASSUME(GetSpeciesType(SPECIES_CLEFAIRY, 0) == TYPE_FAIRY || GetSpeciesType(SPECIES_CLEFAIRY, 1) == TYPE_FAIRY);
}
SINGLE_BATTLE_TEST("Dragon Darts strikes twice")
@ -78,7 +78,7 @@ DOUBLE_BATTLE_TEST("Dragon Darts strikes an opponent twice if the other one is F
PARAMETRIZE { chosenTarget = opponentRight; finalTarget = opponentLeft; speciesLeft = SPECIES_WOBBUFFET; speciesRight = SPECIES_CLEFAIRY; }
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_CLEFAIRY].types[0] == TYPE_FAIRY || gSpeciesInfo[SPECIES_CLEFAIRY].types[1] == TYPE_FAIRY);
ASSUME(GetSpeciesType(SPECIES_CLEFAIRY, 0) == TYPE_FAIRY || GetSpeciesType(SPECIES_CLEFAIRY, 1) == TYPE_FAIRY);
PLAYER(SPECIES_WOBBUFFET);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(speciesLeft);
@ -257,7 +257,7 @@ DOUBLE_BATTLE_TEST("Dragon Darts strikes right ally twice if one strike misses")
DOUBLE_BATTLE_TEST("Dragon Darts strikes will be both redirected to Follow Me user")
{
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_CLEFAIRY].types[0] == TYPE_FAIRY || gSpeciesInfo[SPECIES_CLEFAIRY].types[1] == TYPE_FAIRY);
ASSUME(GetSpeciesType(SPECIES_CLEFAIRY, 0) == TYPE_FAIRY || GetSpeciesType(SPECIES_CLEFAIRY, 1) == TYPE_FAIRY);
PLAYER(SPECIES_WOBBUFFET);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
@ -276,7 +276,7 @@ DOUBLE_BATTLE_TEST("Dragon Darts strikes will be both redirected to Follow Me us
DOUBLE_BATTLE_TEST("Dragon Darts fails to strike any target if under a fairy type follow me user")
{
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_CLEFAIRY].types[0] == TYPE_FAIRY || gSpeciesInfo[SPECIES_CLEFAIRY].types[1] == TYPE_FAIRY);
ASSUME(GetSpeciesType(SPECIES_CLEFAIRY, 0) == TYPE_FAIRY || GetSpeciesType(SPECIES_CLEFAIRY, 1) == TYPE_FAIRY);
PLAYER(SPECIES_WOBBUFFET);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
@ -295,7 +295,7 @@ DOUBLE_BATTLE_TEST("Dragon Darts fails to strike any target if under a fairy typ
DOUBLE_BATTLE_TEST("Dragon Darts fails to strike the second target if first target fainted and follow me was active")
{
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_CLEFAIRY].types[0] == TYPE_FAIRY || gSpeciesInfo[SPECIES_CLEFAIRY].types[1] == TYPE_FAIRY);
ASSUME(GetSpeciesType(SPECIES_CLEFAIRY, 0) == TYPE_FAIRY || GetSpeciesType(SPECIES_CLEFAIRY, 1) == TYPE_FAIRY);
PLAYER(SPECIES_WOBBUFFET);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);

View File

@ -4,7 +4,7 @@
SINGLE_BATTLE_TEST("Electrify makes the target's move Electric-type for the remainder of the turn (single move)")
{
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_SANDSLASH].types[0] == TYPE_GROUND || gSpeciesInfo[SPECIES_SANDSLASH].types[1] == TYPE_GROUND);
ASSUME(GetSpeciesType(SPECIES_SANDSLASH, 0) == TYPE_GROUND || GetSpeciesType(SPECIES_SANDSLASH, 1) == TYPE_GROUND);
ASSUME(GetMoveType(MOVE_SCRATCH) != TYPE_ELECTRIC);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_SANDSLASH);
@ -19,7 +19,7 @@ SINGLE_BATTLE_TEST("Electrify makes the target's move Electric-type for the rema
DOUBLE_BATTLE_TEST("Electrify makes the target's move Electric-type for the remainder of the turn (double move)")
{
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_SANDSLASH].types[0] == TYPE_GROUND || gSpeciesInfo[SPECIES_SANDSLASH].types[1] == TYPE_GROUND);
ASSUME(GetSpeciesType(SPECIES_SANDSLASH, 0) == TYPE_GROUND || GetSpeciesType(SPECIES_SANDSLASH, 1) == TYPE_GROUND);
ASSUME(GetMoveType(MOVE_SCRATCH) != TYPE_ELECTRIC);
PLAYER(SPECIES_WOBBUFFET);
PLAYER(SPECIES_WYNAUT);
@ -39,7 +39,7 @@ SINGLE_BATTLE_TEST("Electrify can change status moves to Electric-type")
{
KNOWN_FAILING;
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_SANDSLASH].types[0] == TYPE_GROUND || gSpeciesInfo[SPECIES_SANDSLASH].types[1] == TYPE_GROUND);
ASSUME(GetSpeciesType(SPECIES_SANDSLASH, 0) == TYPE_GROUND || GetSpeciesType(SPECIES_SANDSLASH, 1) == TYPE_GROUND);
ASSUME(GetMoveCategory(MOVE_LEER) == DAMAGE_CATEGORY_STATUS);
ASSUME(GetMoveType(MOVE_LEER) != TYPE_ELECTRIC);
PLAYER(SPECIES_WOBBUFFET);
@ -55,7 +55,7 @@ SINGLE_BATTLE_TEST("Electrify can change status moves to Electric-type")
SINGLE_BATTLE_TEST("Electrify changes the type of foreseen moves when hitting its target")
{
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_SANDSLASH].types[0] == TYPE_GROUND || gSpeciesInfo[SPECIES_SANDSLASH].types[1] == TYPE_GROUND);
ASSUME(GetSpeciesType(SPECIES_SANDSLASH, 0) == TYPE_GROUND || GetSpeciesType(SPECIES_SANDSLASH, 1) == TYPE_GROUND);
ASSUME(GetMoveEffect(MOVE_FUTURE_SIGHT) == EFFECT_FUTURE_SIGHT);
ASSUME(GetMoveType(MOVE_FUTURE_SIGHT) != TYPE_ELECTRIC);
PLAYER(SPECIES_WOBBUFFET);

View File

@ -55,7 +55,7 @@ SINGLE_BATTLE_TEST("Explosion causes the user to faint even if it has no effect"
{
GIVEN {
ASSUME(GetMoveType(MOVE_EXPLOSION) == TYPE_NORMAL);
ASSUME(gSpeciesInfo[SPECIES_GASTLY].types[0] == TYPE_GHOST);
ASSUME(GetSpeciesType(SPECIES_GASTLY, 0) == TYPE_GHOST);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_GASTLY);
} WHEN {

View File

@ -6,8 +6,8 @@ SINGLE_BATTLE_TEST("Burn Up user loses its Fire-type")
GIVEN {
ASSUME(GetMoveEffect(MOVE_BURN_UP) == EFFECT_FAIL_IF_NOT_ARG_TYPE);
ASSUME(IsMoveEffectRemoveSpeciesType(MOVE_BURN_UP, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE) == TRUE);
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_FIRE || gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_FIRE);
ASSUME(gSpeciesInfo[SPECIES_CYNDAQUIL].types[0] == TYPE_FIRE || gSpeciesInfo[SPECIES_CYNDAQUIL].types[1] == TYPE_FIRE);
ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_FIRE || GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_FIRE);
ASSUME(GetSpeciesType(SPECIES_CYNDAQUIL, 0) == TYPE_FIRE || GetSpeciesType(SPECIES_CYNDAQUIL, 1) == TYPE_FIRE);
PLAYER(SPECIES_CYNDAQUIL);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
@ -26,7 +26,7 @@ SINGLE_BATTLE_TEST("Burn Up fails if the user isn't a Fire-type")
GIVEN {
ASSUME(GetMoveEffect(MOVE_BURN_UP) == EFFECT_FAIL_IF_NOT_ARG_TYPE);
ASSUME(IsMoveEffectRemoveSpeciesType(MOVE_BURN_UP, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE) == TRUE);
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_FIRE || gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_FIRE);
ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_FIRE || GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_FIRE);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
@ -43,8 +43,8 @@ SINGLE_BATTLE_TEST("Burn Up user loses its Fire-type if enemy faints")
GIVEN {
ASSUME(GetMoveEffect(MOVE_BURN_UP) == EFFECT_FAIL_IF_NOT_ARG_TYPE);
ASSUME(IsMoveEffectRemoveSpeciesType(MOVE_BURN_UP, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE) == TRUE);
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_FIRE || gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_FIRE);
ASSUME(gSpeciesInfo[SPECIES_CYNDAQUIL].types[0] == TYPE_FIRE || gSpeciesInfo[SPECIES_CYNDAQUIL].types[1] == TYPE_FIRE);
ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_FIRE || GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_FIRE);
ASSUME(GetSpeciesType(SPECIES_CYNDAQUIL, 0) == TYPE_FIRE || GetSpeciesType(SPECIES_CYNDAQUIL, 1) == TYPE_FIRE);
PLAYER(SPECIES_CYNDAQUIL);
OPPONENT(SPECIES_WOBBUFFET) { HP(1); }
} WHEN {
@ -61,8 +61,8 @@ SINGLE_BATTLE_TEST("Double Shock user loses its Electric-type")
GIVEN {
ASSUME(GetMoveEffect(MOVE_DOUBLE_SHOCK) == EFFECT_FAIL_IF_NOT_ARG_TYPE);
ASSUME(IsMoveEffectRemoveSpeciesType(MOVE_DOUBLE_SHOCK, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_ELECTRIC) == TRUE);
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_ELECTRIC || gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_ELECTRIC);
ASSUME(gSpeciesInfo[SPECIES_PIKACHU].types[0] == TYPE_ELECTRIC || gSpeciesInfo[SPECIES_PIKACHU].types[1] == TYPE_ELECTRIC);
ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_ELECTRIC || GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_ELECTRIC);
ASSUME(GetSpeciesType(SPECIES_PIKACHU, 0) == TYPE_ELECTRIC || GetSpeciesType(SPECIES_PIKACHU, 1) == TYPE_ELECTRIC);
PLAYER(SPECIES_PIKACHU);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
@ -81,7 +81,7 @@ SINGLE_BATTLE_TEST("Double Shock fails if the user isn't an Electric-type")
GIVEN {
ASSUME(GetMoveEffect(MOVE_DOUBLE_SHOCK) == EFFECT_FAIL_IF_NOT_ARG_TYPE);
ASSUME(IsMoveEffectRemoveSpeciesType(MOVE_DOUBLE_SHOCK, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_ELECTRIC) == TRUE);
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_ELECTRIC || gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_ELECTRIC);
ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_ELECTRIC || GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_ELECTRIC);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
@ -98,8 +98,8 @@ SINGLE_BATTLE_TEST("Double Shock user loses its Electric-type if enemy faints")
GIVEN {
ASSUME(GetMoveEffect(MOVE_DOUBLE_SHOCK) == EFFECT_FAIL_IF_NOT_ARG_TYPE);
ASSUME(IsMoveEffectRemoveSpeciesType(MOVE_DOUBLE_SHOCK, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_ELECTRIC) == TRUE);
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_ELECTRIC || gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_ELECTRIC);
ASSUME(gSpeciesInfo[SPECIES_PIKACHU].types[0] == TYPE_ELECTRIC || gSpeciesInfo[SPECIES_PIKACHU].types[1] == TYPE_ELECTRIC);
ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_ELECTRIC || GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_ELECTRIC);
ASSUME(GetSpeciesType(SPECIES_PIKACHU, 0) == TYPE_ELECTRIC || GetSpeciesType(SPECIES_PIKACHU, 1) == TYPE_ELECTRIC);
PLAYER(SPECIES_PIKACHU);
OPPONENT(SPECIES_WOBBUFFET) { HP(1); }
} WHEN {

View File

@ -9,10 +9,10 @@ ASSUMPTIONS
DOUBLE_BATTLE_TEST("Flower Shield raises the defense of all grass type pokemon")
{
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_TANGELA].types[0] == TYPE_GRASS);
ASSUME(gSpeciesInfo[SPECIES_TANGROWTH].types[0] == TYPE_GRASS);
ASSUME(gSpeciesInfo[SPECIES_SUNKERN].types[0] == TYPE_GRASS);
ASSUME(gSpeciesInfo[SPECIES_SUNFLORA].types[0] == TYPE_GRASS);
ASSUME(GetSpeciesType(SPECIES_TANGELA, 0) == TYPE_GRASS);
ASSUME(GetSpeciesType(SPECIES_TANGROWTH, 0) == TYPE_GRASS);
ASSUME(GetSpeciesType(SPECIES_SUNKERN, 0) == TYPE_GRASS);
ASSUME(GetSpeciesType(SPECIES_SUNFLORA, 0) == TYPE_GRASS);
PLAYER(SPECIES_TANGELA);
PLAYER(SPECIES_TANGROWTH);
OPPONENT(SPECIES_SUNKERN);

View File

@ -25,7 +25,7 @@ SINGLE_BATTLE_TEST("Focus Energy increases the user's critical hit ratio by 1 st
GIVEN {
WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig);
WITH_CONFIG(GEN_CONFIG_FOCUS_ENERGY_CRIT_RATIO, genConfig);
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].baseSpeed == 33);
ASSUME(GetSpeciesBaseSpeed(SPECIES_WOBBUFFET) == 33);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {

View File

@ -111,8 +111,8 @@ SINGLE_BATTLE_TEST("Hidden Power's type is determined by IVs")
GIVEN {
if (hidden) {
ASSUME(gTypeEffectivenessTable[type][foeType] == UQ_4_12(2.0)); // Foe's Type resists
ASSUME(gSpeciesInfo[foeSpecies].types[0] == gSpeciesInfo[foeSpecies].types[1]); // Foe's pure type
ASSUME(gSpeciesInfo[foeSpecies].types[0] == foeType); // Foe is the super-effective type
ASSUME(GetSpeciesType(foeSpecies, 0) == GetSpeciesType(foeSpecies, 1)); // Foe's pure type
ASSUME(GetSpeciesType(foeSpecies, 0) == foeType); // Foe is the super-effective type
ASSUME(GetItemHoldEffect(foeItem) == HOLD_EFFECT_RESIST_BERRY); // Item is resist berry
ASSUME(GetItemHoldEffectParam(foeItem) == type); // Resist berry of type
PLAYER(SPECIES_DUNSPARCE) { HPIV(hp); AttackIV(atk); DefenseIV(def); SpAttackIV(spAtk); SpDefenseIV(spDef); SpeedIV(speed); }

View File

@ -145,7 +145,7 @@ SINGLE_BATTLE_TEST("Dragon Tail switches target out and incoming mon has Levitat
GIVEN {
ASSUME(GetMoveEffect(MOVE_TOXIC_SPIKES) == EFFECT_TOXIC_SPIKES);
ASSUME(GetMoveEffect(MOVE_SPIKES) == EFFECT_SPIKES);
ASSUME(gSpeciesInfo[SPECIES_WEEZING].types[0] == TYPE_POISON || gSpeciesInfo[SPECIES_WEEZING].types[1] == TYPE_POISON);
ASSUME(GetSpeciesType(SPECIES_WEEZING, 0) == TYPE_POISON || GetSpeciesType(SPECIES_WEEZING, 1) == TYPE_POISON);
PLAYER(SPECIES_PANCHAM) { Ability(ABILITY_MOLD_BREAKER); }
OPPONENT(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WEEZING) { Ability(ABILITY_LEVITATE); }

View File

@ -120,7 +120,7 @@ SINGLE_BATTLE_TEST("Knock Off does not remove items if target is immune")
{
GIVEN {
ASSUME(GetMoveEffect(MOVE_ELECTRIFY) == EFFECT_ELECTRIFY);
ASSUME(gSpeciesInfo[SPECIES_DONPHAN].types[0] == TYPE_GROUND || gSpeciesInfo[SPECIES_DONPHAN].types[1] == TYPE_GROUND);
ASSUME(GetSpeciesType(SPECIES_DONPHAN, 0) == TYPE_GROUND || GetSpeciesType(SPECIES_DONPHAN, 1) == TYPE_GROUND);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_DONPHAN) { Item(ITEM_LEFTOVERS); };
} WHEN {

View File

@ -10,7 +10,7 @@ SINGLE_BATTLE_TEST("Leech Seed doesn't affect Grass-type Pokémon")
{
PASSES_RANDOMLY(90, 100, RNG_ACCURACY);
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_ODDISH].types[0] == TYPE_GRASS);
ASSUME(GetSpeciesType(SPECIES_ODDISH, 0) == TYPE_GRASS);
PLAYER(SPECIES_WYNAUT);
OPPONENT(SPECIES_ODDISH);
} WHEN {

View File

@ -26,7 +26,7 @@ SINGLE_BATTLE_TEST("Metronome's called powder move fails against Grass Types")
{
GIVEN {
ASSUME(IsPowderMove(MOVE_POISON_POWDER));
ASSUME(gSpeciesInfo[SPECIES_TANGELA].types[0] == TYPE_GRASS);
ASSUME(GetSpeciesType(SPECIES_TANGELA, 0) == TYPE_GRASS);
ASSUME(GetMoveEffect(MOVE_POISON_POWDER) == EFFECT_NON_VOLATILE_STATUS);
ASSUME(GetMoveNonVolatileStatus(MOVE_POISON_POWDER) == MOVE_EFFECT_POISON);
PLAYER(SPECIES_WOBBUFFET);

View File

@ -42,7 +42,7 @@ SINGLE_BATTLE_TEST("Mirror Move's called powder move fails against Grass Types")
{
GIVEN {
ASSUME(IsPowderMove(MOVE_STUN_SPORE));
ASSUME(gSpeciesInfo[SPECIES_ODDISH].types[0] == TYPE_GRASS);
ASSUME(GetSpeciesType(SPECIES_ODDISH, 0) == TYPE_GRASS);
ASSUME(GetMoveEffect(MOVE_STUN_SPORE) == EFFECT_NON_VOLATILE_STATUS);
ASSUME(GetMoveNonVolatileStatus(MOVE_STUN_SPORE) == MOVE_EFFECT_PARALYSIS);
PLAYER(SPECIES_ODDISH);

View File

@ -177,7 +177,7 @@ SINGLE_BATTLE_TEST("Scale Shot is immune to Fairy types and will end the move co
GIVEN {
ASSUME(GetMoveEffect(MOVE_SCALE_SHOT) == EFFECT_MULTI_HIT);
ASSUME(GetMoveType(MOVE_SCALE_SHOT) == TYPE_DRAGON);
ASSUME(gSpeciesInfo[SPECIES_CLEFAIRY].types[0] == TYPE_FAIRY || gSpeciesInfo[SPECIES_CLEFAIRY].types[1] == TYPE_FAIRY);
ASSUME(GetSpeciesType(SPECIES_CLEFAIRY, 0) == TYPE_FAIRY || GetSpeciesType(SPECIES_CLEFAIRY, 1) == TYPE_FAIRY);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_CLEFAIRY) { HP(1); }
} WHEN {

View File

@ -10,7 +10,7 @@ SINGLE_BATTLE_TEST("Sheer Cold doesn't affect Ice-type Pokémon")
{
GIVEN {
ASSUME(B_SHEER_COLD_IMMUNITY >= GEN_7);
ASSUME(gSpeciesInfo[SPECIES_GLALIE].types[0] == TYPE_ICE);
ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE);
PLAYER(SPECIES_WYNAUT);
OPPONENT(SPECIES_GLALIE);
} WHEN {

View File

@ -135,7 +135,7 @@ DOUBLE_BATTLE_TEST("Powder fails if target is already affected by Powder")
SINGLE_BATTLE_TEST("Powder fails if the target is Grass type")
{
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_VENUSAUR].types[0] == TYPE_GRASS || gSpeciesInfo[SPECIES_VENUSAUR].types[1] == TYPE_GRASS);
ASSUME(GetSpeciesType(SPECIES_VENUSAUR, 0) == TYPE_GRASS || GetSpeciesType(SPECIES_VENUSAUR, 1) == TYPE_GRASS);
PLAYER(SPECIES_VENUSAUR);
OPPONENT(SPECIES_VIVILLON);
} WHEN {

View File

@ -537,10 +537,10 @@ DOUBLE_BATTLE_TEST("Crafty Shield protects self and ally from Confide and Decora
DOUBLE_BATTLE_TEST("Crafty Shield does not protect against moves that target all battlers")
{
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_TANGELA].types[0] == TYPE_GRASS);
ASSUME(gSpeciesInfo[SPECIES_TANGROWTH].types[0] == TYPE_GRASS);
ASSUME(gSpeciesInfo[SPECIES_SUNKERN].types[0] == TYPE_GRASS);
ASSUME(gSpeciesInfo[SPECIES_SUNFLORA].types[0] == TYPE_GRASS);
ASSUME(GetSpeciesType(SPECIES_TANGELA, 0) == TYPE_GRASS);
ASSUME(GetSpeciesType(SPECIES_TANGROWTH, 0) == TYPE_GRASS);
ASSUME(GetSpeciesType(SPECIES_SUNKERN, 0) == TYPE_GRASS);
ASSUME(GetSpeciesType(SPECIES_SUNFLORA, 0) == TYPE_GRASS);
PLAYER(SPECIES_TANGELA);
PLAYER(SPECIES_TANGROWTH);
OPPONENT(SPECIES_SUNKERN);

View File

@ -86,10 +86,10 @@ SINGLE_BATTLE_TEST("Reflect Type does not affect any of Silvally's forms")
SINGLE_BATTLE_TEST("Reflect Type fails if the target has no types")
{
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[0] == TYPE_FIRE);
ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[1] == TYPE_FIRE);
ASSUME(gSpeciesInfo[SPECIES_POLIWRATH].types[0] == TYPE_WATER);
ASSUME(gSpeciesInfo[SPECIES_POLIWRATH].types[1] == TYPE_FIGHTING);
ASSUME(GetSpeciesType(SPECIES_ARCANINE, 0) == TYPE_FIRE);
ASSUME(GetSpeciesType(SPECIES_ARCANINE, 1) == TYPE_FIRE);
ASSUME(GetSpeciesType(SPECIES_POLIWRATH, 0) == TYPE_WATER);
ASSUME(GetSpeciesType(SPECIES_POLIWRATH, 1) == TYPE_FIGHTING);
PLAYER(SPECIES_ARCANINE);
OPPONENT(SPECIES_POLIWRATH);
} WHEN {
@ -107,10 +107,10 @@ SINGLE_BATTLE_TEST("Reflect Type fails if the target has no types")
SINGLE_BATTLE_TEST("Reflect Type copies a target's dual types")
{
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[0] == TYPE_FIRE);
ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[1] == TYPE_FIRE);
ASSUME(gSpeciesInfo[SPECIES_POLIWRATH].types[0] == TYPE_WATER);
ASSUME(gSpeciesInfo[SPECIES_POLIWRATH].types[1] == TYPE_FIGHTING);
ASSUME(GetSpeciesType(SPECIES_ARCANINE, 0) == TYPE_FIRE);
ASSUME(GetSpeciesType(SPECIES_ARCANINE, 1) == TYPE_FIRE);
ASSUME(GetSpeciesType(SPECIES_POLIWRATH, 0) == TYPE_WATER);
ASSUME(GetSpeciesType(SPECIES_POLIWRATH, 1) == TYPE_FIGHTING);
PLAYER(SPECIES_ARCANINE);
OPPONENT(SPECIES_POLIWRATH);
} WHEN {
@ -129,10 +129,10 @@ SINGLE_BATTLE_TEST("Reflect Type copies a target's dual types")
SINGLE_BATTLE_TEST("Reflect Type copies a target's pure type")
{
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[0] == TYPE_FIRE);
ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[1] == TYPE_FIRE);
ASSUME(gSpeciesInfo[SPECIES_SUDOWOODO].types[0] == TYPE_ROCK);
ASSUME(gSpeciesInfo[SPECIES_SUDOWOODO].types[1] == TYPE_ROCK);
ASSUME(GetSpeciesType(SPECIES_ARCANINE, 0) == TYPE_FIRE);
ASSUME(GetSpeciesType(SPECIES_ARCANINE, 1) == TYPE_FIRE);
ASSUME(GetSpeciesType(SPECIES_SUDOWOODO, 0) == TYPE_ROCK);
ASSUME(GetSpeciesType(SPECIES_SUDOWOODO, 1) == TYPE_ROCK);
PLAYER(SPECIES_ARCANINE);
OPPONENT(SPECIES_SUDOWOODO);
} WHEN {
@ -151,10 +151,10 @@ SINGLE_BATTLE_TEST("Reflect Type copies a target's pure type")
SINGLE_BATTLE_TEST("Reflect Type defaults to Normal type for the user's 1st and 2nd types if the target only has a 3rd type")
{
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] == TYPE_PSYCHIC);
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] == TYPE_PSYCHIC);
ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[0] == TYPE_FIRE);
ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[1] == TYPE_FIRE);
ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) == TYPE_PSYCHIC);
ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) == TYPE_PSYCHIC);
ASSUME(GetSpeciesType(SPECIES_ARCANINE, 0) == TYPE_FIRE);
ASSUME(GetSpeciesType(SPECIES_ARCANINE, 1) == TYPE_FIRE);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_ARCANINE);
} WHEN {
@ -202,8 +202,8 @@ SINGLE_BATTLE_TEST("Reflect Type fails if the user is Terastallized")
SINGLE_BATTLE_TEST("Reflect Type succeeds against a Terastallized target and copies its Tera type")
{
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_POLIWRATH].types[0] != TYPE_NORMAL);
ASSUME(gSpeciesInfo[SPECIES_POLIWRATH].types[1] != TYPE_NORMAL);
ASSUME(GetSpeciesType(SPECIES_POLIWRATH, 0) != TYPE_NORMAL);
ASSUME(GetSpeciesType(SPECIES_POLIWRATH, 1) != TYPE_NORMAL);
PLAYER(SPECIES_ARCANINE) { TeraType(TYPE_NORMAL); }
OPPONENT(SPECIES_POLIWRATH);
} WHEN {

View File

@ -4,8 +4,8 @@
ASSUMPTIONS
{
ASSUME(GetMoveEffect(MOVE_ROOST) == EFFECT_ROOST);
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_FLYING);
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_FLYING);
ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_FLYING);
ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_FLYING);
// One attack of each type to verify typelessness
ASSUME(GetMoveType(MOVE_POUND) == TYPE_NORMAL);
ASSUME(GetMoveType(MOVE_KARATE_CHOP) == TYPE_FIGHTING);
@ -85,8 +85,8 @@ SINGLE_BATTLE_TEST("Roost recovers 50% of the user's Max HP")
SINGLE_BATTLE_TEST("Roost suppresses the user's Flying-typing this turn, then restores it at the end of the turn")
{
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_SKARMORY].types[0] == TYPE_STEEL);
ASSUME(gSpeciesInfo[SPECIES_SKARMORY].types[1] == TYPE_FLYING);
ASSUME(GetSpeciesType(SPECIES_SKARMORY, 0) == TYPE_STEEL);
ASSUME(GetSpeciesType(SPECIES_SKARMORY, 1) == TYPE_FLYING);
PLAYER(SPECIES_SKARMORY) { HP(50); MaxHP(100); Ability(ABILITY_STURDY); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
@ -131,8 +131,8 @@ SINGLE_BATTLE_TEST("Roost, if used by a Flying/Flying type, treats the user as a
PARAMETRIZE { damagingMove = MOVE_DISARMING_VOICE; }
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_TORNADUS].types[0] == TYPE_FLYING);
ASSUME(gSpeciesInfo[SPECIES_TORNADUS].types[1] == TYPE_FLYING);
ASSUME(GetSpeciesType(SPECIES_TORNADUS, 0) == TYPE_FLYING);
ASSUME(GetSpeciesType(SPECIES_TORNADUS, 1) == TYPE_FLYING);
PLAYER(SPECIES_TORNADUS) { HP(50); MaxHP(100); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
@ -199,8 +199,8 @@ SINGLE_BATTLE_TEST("Roost, if used by a Mystery/Flying type, treats the user as
PARAMETRIZE { damagingMove = MOVE_DISARMING_VOICE; }
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_MOLTRES].types[0] == TYPE_FIRE);
ASSUME(gSpeciesInfo[SPECIES_MOLTRES].types[1] == TYPE_FLYING);
ASSUME(GetSpeciesType(SPECIES_MOLTRES, 0) == TYPE_FIRE);
ASSUME(GetSpeciesType(SPECIES_MOLTRES, 1) == TYPE_FLYING);
PLAYER(SPECIES_MOLTRES) { HP(300); MaxHP(400); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
@ -228,8 +228,8 @@ SINGLE_BATTLE_TEST("Roost, if used by a Mystery/Flying type, treats the user as
DOUBLE_BATTLE_TEST("Roost suppresses the user's not-yet-aquired Flying-type this turn")
{
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_KECLEON].types[0] != TYPE_FLYING);
ASSUME(gSpeciesInfo[SPECIES_KECLEON].types[1] != TYPE_FLYING);
ASSUME(GetSpeciesType(SPECIES_KECLEON, 0) != TYPE_FLYING);
ASSUME(GetSpeciesType(SPECIES_KECLEON, 1) != TYPE_FLYING);
PLAYER(SPECIES_KECLEON) { Speed(40); HP(150); Ability(ABILITY_COLOR_CHANGE); }
PLAYER(SPECIES_WOBBUFFET) { Speed(10); }
OPPONENT(SPECIES_PIDGEY) { Speed(30); }
@ -255,7 +255,7 @@ DOUBLE_BATTLE_TEST("Roost suppresses the user's not-yet-aquired Flying-type this
SINGLE_BATTLE_TEST("Roost prevents a Flying-type user from being protected by Delta Stream")
{
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_RAYQUAZA].types[1] == TYPE_FLYING);
ASSUME(GetSpeciesType(SPECIES_RAYQUAZA, 1) == TYPE_FLYING);
PLAYER(SPECIES_RAYQUAZA) { HP(1); Ability(ABILITY_DELTA_STREAM); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
@ -272,8 +272,8 @@ SINGLE_BATTLE_TEST("Roost prevents a Flying-type user from being protected by De
SINGLE_BATTLE_TEST("Roost does not undo other type-changing effects at the end of the turn")
{
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_SWELLOW].types[0] == TYPE_NORMAL);
ASSUME(gSpeciesInfo[SPECIES_SWELLOW].types[1] == TYPE_FLYING);
ASSUME(GetSpeciesType(SPECIES_SWELLOW, 0) == TYPE_NORMAL);
ASSUME(GetSpeciesType(SPECIES_SWELLOW, 1) == TYPE_FLYING);
PLAYER(SPECIES_SWELLOW) { HP(1); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
@ -296,8 +296,8 @@ SINGLE_BATTLE_TEST("Roost does not undo other type-changing effects at the end o
SINGLE_BATTLE_TEST("Roost's effect is lifted after Grassy Terrain's healing")
{
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_SWELLOW].types[0] == TYPE_NORMAL);
ASSUME(gSpeciesInfo[SPECIES_SWELLOW].types[1] == TYPE_FLYING);
ASSUME(GetSpeciesType(SPECIES_SWELLOW, 0) == TYPE_NORMAL);
ASSUME(GetSpeciesType(SPECIES_SWELLOW, 1) == TYPE_FLYING);
PLAYER(SPECIES_SWELLOW) { HP(1); Ability(ABILITY_GRASSY_SURGE); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
@ -315,10 +315,10 @@ SINGLE_BATTLE_TEST("Roost's effect is lifted after Grassy Terrain's healing")
SINGLE_BATTLE_TEST("Roost's suppression prevents Reflect Type from copying any Flying typing")
{
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_SWELLOW].types[0] == TYPE_NORMAL);
ASSUME(gSpeciesInfo[SPECIES_SWELLOW].types[1] == TYPE_FLYING);
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] == TYPE_PSYCHIC);
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] == TYPE_PSYCHIC);
ASSUME(GetSpeciesType(SPECIES_SWELLOW, 0) == TYPE_NORMAL);
ASSUME(GetSpeciesType(SPECIES_SWELLOW, 1) == TYPE_FLYING);
ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) == TYPE_PSYCHIC);
ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) == TYPE_PSYCHIC);
PLAYER(SPECIES_SWELLOW) { HP(1); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {

View File

@ -9,8 +9,8 @@ ASSUMPTIONS
DOUBLE_BATTLE_TEST("Rototiller boosts Attack and Special Attack of all Grass types on the field")
{
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_TANGELA].types[0] == TYPE_GRASS);
ASSUME(gSpeciesInfo[SPECIES_SNIVY].types[0] == TYPE_GRASS);
ASSUME(GetSpeciesType(SPECIES_TANGELA, 0) == TYPE_GRASS);
ASSUME(GetSpeciesType(SPECIES_SNIVY, 0) == TYPE_GRASS);
PLAYER(SPECIES_TANGELA);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_SNIVY);
@ -38,8 +38,8 @@ DOUBLE_BATTLE_TEST("Rototiller boosts Attack and Special Attack of all Grass typ
SINGLE_BATTLE_TEST("Rototiller fails if there are no valid targets")
{
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_GRASS);
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_GRASS);
ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_GRASS);
ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_GRASS);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
@ -54,7 +54,7 @@ SINGLE_BATTLE_TEST("Rototiller fails if there are no valid targets")
SINGLE_BATTLE_TEST("Rototiller doesn't affect pokemon that are semi-invulnerable")
{
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_TANGELA].types[0] == TYPE_GRASS);
ASSUME(GetSpeciesType(SPECIES_TANGELA, 0) == TYPE_GRASS);
ASSUME(GetMoveEffect(MOVE_DIG) == EFFECT_SEMI_INVULNERABLE);
PLAYER(SPECIES_TANGELA);
OPPONENT(SPECIES_TANGELA);
@ -76,9 +76,9 @@ SINGLE_BATTLE_TEST("Rototiller doesn't affect pokemon that are semi-invulnerable
SINGLE_BATTLE_TEST("Rototiller fails if the only valid target is semi-invulnerable")
{
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_TANGELA].types[0] == TYPE_GRASS);
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_GRASS);
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_GRASS);
ASSUME(GetSpeciesType(SPECIES_TANGELA, 0) == TYPE_GRASS);
ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_GRASS);
ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_GRASS);
ASSUME(GetMoveEffect(MOVE_DIG) == EFFECT_SEMI_INVULNERABLE);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_TANGELA);

View File

@ -10,7 +10,7 @@ SINGLE_BATTLE_TEST("Sky Drop does no damage to Flying type Pokémon")
{
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_PIDGEY].weight < 2000);
ASSUME(gSpeciesInfo[SPECIES_PIDGEY].types[1] == TYPE_FLYING);
ASSUME(GetSpeciesType(SPECIES_PIDGEY, 1) == TYPE_FLYING);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_PIDGEY);
} WHEN {

View File

@ -94,13 +94,13 @@ SINGLE_BATTLE_TEST("Spikes do not damage airborne Pokemon")
u32 move2 = MOVE_CELEBRATE;
bool32 airborne;
ASSUME(gSpeciesInfo[SPECIES_PIDGEY].types[1] == TYPE_FLYING);
ASSUME(GetSpeciesType(SPECIES_PIDGEY, 1) == TYPE_FLYING);
PARAMETRIZE { species = SPECIES_PIDGEY; airborne = TRUE; }
PARAMETRIZE { species = SPECIES_PIDGEY; item = ITEM_IRON_BALL; airborne = FALSE; }
PARAMETRIZE { species = SPECIES_PIDGEY; move1 = MOVE_GRAVITY; airborne = FALSE; }
PARAMETRIZE { species = SPECIES_PIDGEY; move1 = MOVE_INGRAIN; airborne = FALSE; }
ASSUME(gSpeciesInfo[SPECIES_UNOWN].abilities[0] == ABILITY_LEVITATE);
ASSUME(GetSpeciesAbility(SPECIES_UNOWN, 0) == ABILITY_LEVITATE);
PARAMETRIZE { species = SPECIES_UNOWN; airborne = TRUE; }
PARAMETRIZE { species = SPECIES_UNOWN; item = ITEM_IRON_BALL; airborne = FALSE; }
PARAMETRIZE { species = SPECIES_UNOWN; move1 = MOVE_GRAVITY; airborne = FALSE; }

View File

@ -14,10 +14,10 @@ SINGLE_BATTLE_TEST("Tar Shot doubles the effectiveness of Fire-type moves used o
PARAMETRIZE { species = SPECIES_WOBBUFFET; }
PARAMETRIZE { species = SPECIES_OMASTAR; } // Dual type with double resists
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] == TYPE_PSYCHIC);
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[1] == TYPE_PSYCHIC);
ASSUME(gSpeciesInfo[SPECIES_OMASTAR].types[0] == TYPE_ROCK);
ASSUME(gSpeciesInfo[SPECIES_OMASTAR].types[1] == TYPE_WATER);
ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) == TYPE_PSYCHIC);
ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) == TYPE_PSYCHIC);
ASSUME(GetSpeciesType(SPECIES_OMASTAR, 0) == TYPE_ROCK);
ASSUME(GetSpeciesType(SPECIES_OMASTAR, 1) == TYPE_WATER);
ASSUME(GetMoveType(MOVE_EMBER) == TYPE_FIRE);
GIVEN {

View File

@ -46,20 +46,20 @@ SINGLE_BATTLE_TEST("Tera Blast has correct effectiveness for every Tera Type")
PARAMETRIZE { species = SPECIES_ABRA; type = TYPE_DARK; }
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_CHIKORITA].types[0] == TYPE_GRASS);
ASSUME(gSpeciesInfo[SPECIES_CHIKORITA].types[1] == TYPE_GRASS);
ASSUME(gSpeciesInfo[SPECIES_CYNDAQUIL].types[0] == TYPE_FIRE);
ASSUME(gSpeciesInfo[SPECIES_CYNDAQUIL].types[1] == TYPE_FIRE);
ASSUME(gSpeciesInfo[SPECIES_GASTLY].types[0] == TYPE_GHOST);
ASSUME(gSpeciesInfo[SPECIES_GASTLY].types[1] == TYPE_POISON);
ASSUME(gSpeciesInfo[SPECIES_TOTODILE].types[0] == TYPE_WATER);
ASSUME(gSpeciesInfo[SPECIES_TOTODILE].types[1] == TYPE_WATER);
ASSUME(gSpeciesInfo[SPECIES_DRATINI].types[0] == TYPE_DRAGON);
ASSUME(gSpeciesInfo[SPECIES_DRATINI].types[1] == TYPE_DRAGON);
ASSUME(gSpeciesInfo[SPECIES_SNEASEL].types[0] == TYPE_DARK);
ASSUME(gSpeciesInfo[SPECIES_SNEASEL].types[1] == TYPE_ICE);
ASSUME(gSpeciesInfo[SPECIES_ABRA].types[0] == TYPE_PSYCHIC);
ASSUME(gSpeciesInfo[SPECIES_ABRA].types[1] == TYPE_PSYCHIC);
ASSUME(GetSpeciesType(SPECIES_CHIKORITA, 0) == TYPE_GRASS);
ASSUME(GetSpeciesType(SPECIES_CHIKORITA, 1) == TYPE_GRASS);
ASSUME(GetSpeciesType(SPECIES_CYNDAQUIL, 0) == TYPE_FIRE);
ASSUME(GetSpeciesType(SPECIES_CYNDAQUIL, 1) == TYPE_FIRE);
ASSUME(GetSpeciesType(SPECIES_GASTLY, 0) == TYPE_GHOST);
ASSUME(GetSpeciesType(SPECIES_GASTLY, 1) == TYPE_POISON);
ASSUME(GetSpeciesType(SPECIES_TOTODILE, 0) == TYPE_WATER);
ASSUME(GetSpeciesType(SPECIES_TOTODILE, 1) == TYPE_WATER);
ASSUME(GetSpeciesType(SPECIES_DRATINI, 0) == TYPE_DRAGON);
ASSUME(GetSpeciesType(SPECIES_DRATINI, 1) == TYPE_DRAGON);
ASSUME(GetSpeciesType(SPECIES_SNEASEL, 0) == TYPE_DARK);
ASSUME(GetSpeciesType(SPECIES_SNEASEL, 1) == TYPE_ICE);
ASSUME(GetSpeciesType(SPECIES_ABRA, 0) == TYPE_PSYCHIC);
ASSUME(GetSpeciesType(SPECIES_ABRA, 1) == TYPE_PSYCHIC);
PLAYER(SPECIES_WOBBUFFET) { TeraType(type); }
OPPONENT(species);
} WHEN {

View File

@ -67,7 +67,7 @@ SINGLE_BATTLE_TEST("Tera Starstorm remains Normal-type if used by Pokemon other
{
GIVEN {
ASSUME(GetMoveType(MOVE_TERA_STARSTORM) == TYPE_NORMAL);
ASSUME(gSpeciesInfo[SPECIES_MISDREAVUS].types[0] == TYPE_GHOST);
ASSUME(GetSpeciesType(SPECIES_MISDREAVUS, 0) == TYPE_GHOST);
PLAYER(SPECIES_WOBBUFFET) { TeraType(TYPE_STELLAR); }
OPPONENT(SPECIES_MISDREAVUS);
} WHEN {

View File

@ -51,7 +51,7 @@ SINGLE_BATTLE_TEST("Toxic cannot miss if used by a Poison-type")
PARAMETRIZE { species = SPECIES_NIDORAN_M; hit = TRUE; }
GIVEN {
ASSUME(B_TOXIC_NEVER_MISS >= GEN_6);
ASSUME(gSpeciesInfo[SPECIES_NIDORAN_M].types[0] == TYPE_POISON);
ASSUME(GetSpeciesType(SPECIES_NIDORAN_M, 0) == TYPE_POISON);
PLAYER(species);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {

View File

@ -97,13 +97,13 @@ SINGLE_BATTLE_TEST("Toxic Spikes do not poison airborne Pokemon")
u32 move2 = MOVE_CELEBRATE;
bool32 airborne;
ASSUME(gSpeciesInfo[SPECIES_PIDGEY].types[1] == TYPE_FLYING);
ASSUME(GetSpeciesType(SPECIES_PIDGEY, 1) == TYPE_FLYING);
PARAMETRIZE { species = SPECIES_PIDGEY; airborne = TRUE; }
PARAMETRIZE { species = SPECIES_PIDGEY; item = ITEM_IRON_BALL; airborne = FALSE; }
PARAMETRIZE { species = SPECIES_PIDGEY; move1 = MOVE_GRAVITY; airborne = FALSE; }
PARAMETRIZE { species = SPECIES_PIDGEY; move1 = MOVE_INGRAIN; airborne = FALSE; }
ASSUME(gSpeciesInfo[SPECIES_UNOWN].abilities[0] == ABILITY_LEVITATE);
ASSUME(GetSpeciesAbility(SPECIES_UNOWN, 0) == ABILITY_LEVITATE);
PARAMETRIZE { species = SPECIES_UNOWN; airborne = TRUE; }
PARAMETRIZE { species = SPECIES_UNOWN; item = ITEM_IRON_BALL; airborne = FALSE; }
PARAMETRIZE { species = SPECIES_UNOWN; move1 = MOVE_GRAVITY; airborne = FALSE; }
@ -139,7 +139,7 @@ SINGLE_BATTLE_TEST("Toxic Spikes do not poison airborne Pokemon")
SINGLE_BATTLE_TEST("Toxic Spikes do not affect Steel-types")
{
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_STEELIX].types[0] == TYPE_STEEL);
ASSUME(GetSpeciesType(SPECIES_STEELIX, 0) == TYPE_STEEL);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_STEELIX);
@ -163,9 +163,9 @@ SINGLE_BATTLE_TEST("Toxic Spikes are removed by grounded Poison-type Pokémon on
PARAMETRIZE { species = SPECIES_ZUBAT; move = MOVE_GRAVITY; grounded = TRUE; }
PARAMETRIZE { species = SPECIES_ZUBAT; move = MOVE_INGRAIN; grounded = TRUE; }
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_EKANS].types[0] == TYPE_POISON);
ASSUME(gSpeciesInfo[SPECIES_ZUBAT].types[0] == TYPE_POISON);
ASSUME(gSpeciesInfo[SPECIES_ZUBAT].types[1] == TYPE_FLYING);
ASSUME(GetSpeciesType(SPECIES_EKANS, 0) == TYPE_POISON);
ASSUME(GetSpeciesType(SPECIES_ZUBAT, 0) == TYPE_POISON);
ASSUME(GetSpeciesType(SPECIES_ZUBAT, 1) == TYPE_FLYING);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
OPPONENT(species) { Item(item); }
@ -190,7 +190,7 @@ SINGLE_BATTLE_TEST("Toxic Spikes are removed by grounded Poison-type Pokémon on
SINGLE_BATTLE_TEST("Toxic Spikes are not removed by Poison-type Pokémon affected by Magnet Rise on switch in")
{
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_EKANS].types[0] == TYPE_POISON);
ASSUME(GetSpeciesType(SPECIES_EKANS, 0) == TYPE_POISON);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_EKANS);

View File

@ -24,7 +24,7 @@ SINGLE_BATTLE_TEST("Ember inflicts burn")
SINGLE_BATTLE_TEST("Ember cannot burn a Fire-type Pokémon")
{
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_CHARMANDER].types[0] == TYPE_FIRE);
ASSUME(GetSpeciesType(SPECIES_CHARMANDER, 0) == TYPE_FIRE);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_CHARMANDER);
} WHEN {
@ -109,7 +109,7 @@ SINGLE_BATTLE_TEST("Scald shouldn't burn a Water-type Pokémon")
#endif
{
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_SQUIRTLE].types[0] == TYPE_WATER);
ASSUME(GetSpeciesType(SPECIES_SQUIRTLE, 0) == TYPE_WATER);
ASSUME(MoveHasAdditionalEffect(MOVE_SCALD, MOVE_EFFECT_BURN) == TRUE);
ASSUME(GetMoveType(MOVE_SCALD) == TYPE_WATER);
PLAYER(SPECIES_SQUIRTLE);

View File

@ -32,7 +32,7 @@ SINGLE_BATTLE_TEST("Powder Snow cannot freeze an Ice-type Pokémon")
#endif
{
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_SNORUNT].types[0] == TYPE_ICE);
ASSUME(GetSpeciesType(SPECIES_SNORUNT, 0) == TYPE_ICE);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_SNORUNT);
} WHEN {
@ -74,7 +74,7 @@ SINGLE_BATTLE_TEST("Freezing Glare shouldn't freeze Psychic-types")
#endif
{
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_ARTICUNO_GALAR].types[0] == TYPE_PSYCHIC);
ASSUME(GetSpeciesType(SPECIES_ARTICUNO_GALAR, 0) == TYPE_PSYCHIC);
ASSUME(MoveHasAdditionalEffect(MOVE_FREEZING_GLARE, MOVE_EFFECT_FREEZE_OR_FROSTBITE) == TRUE);
ASSUME(GetMoveType(MOVE_FREEZING_GLARE) == TYPE_PSYCHIC);
PLAYER(SPECIES_ARTICUNO_GALAR);

View File

@ -50,7 +50,7 @@ SINGLE_BATTLE_TEST("Plasma Fists turns normal moves into electric for the remain
SINGLE_BATTLE_TEST("Plasma Fists does not set up Ion Deluge if it does not connect")
{
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_PHANPY].types[0] == TYPE_GROUND || gSpeciesInfo[SPECIES_PHANPY].types[1] == TYPE_GROUND);
ASSUME(GetSpeciesType(SPECIES_PHANPY, 0) == TYPE_GROUND || GetSpeciesType(SPECIES_PHANPY, 1) == TYPE_GROUND);
PLAYER(SPECIES_KRABBY);
OPPONENT(SPECIES_PHANPY);
} WHEN {

View File

@ -25,7 +25,7 @@ SINGLE_BATTLE_TEST("Thunder Shock cannot paralyze an Electric-type")
{
GIVEN {
ASSUME(B_PARALYZE_ELECTRIC >= GEN_6);
ASSUME(gSpeciesInfo[SPECIES_PIKACHU].types[0] == TYPE_ELECTRIC);
ASSUME(GetSpeciesType(SPECIES_PIKACHU, 0) == TYPE_ELECTRIC);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_PIKACHU);
} WHEN {
@ -47,7 +47,7 @@ SINGLE_BATTLE_TEST("Body Slam shouldn't paralyze Normal-types")
#endif
{
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_TAUROS].types[0] == TYPE_NORMAL);
ASSUME(GetSpeciesType(SPECIES_TAUROS, 0) == TYPE_NORMAL);
ASSUME(MoveHasAdditionalEffect(MOVE_BODY_SLAM, MOVE_EFFECT_PARALYSIS) == TRUE);
ASSUME(GetMoveType(MOVE_BODY_SLAM) == TYPE_NORMAL);
PLAYER(SPECIES_TAUROS);

View File

@ -25,8 +25,8 @@ SINGLE_BATTLE_TEST("Poison cannot be inflicted on Poison and Steel-type Pokémon
PARAMETRIZE { mon = SPECIES_REGISTEEL; }
GIVEN {
ASSUME(MoveHasAdditionalEffect(MOVE_TWINEEDLE, MOVE_EFFECT_POISON) == TRUE);
ASSUME(gSpeciesInfo[SPECIES_NIDORAN_M].types[0] == TYPE_POISON);
ASSUME(gSpeciesInfo[SPECIES_REGISTEEL].types[0] == TYPE_STEEL);
ASSUME(GetSpeciesType(SPECIES_NIDORAN_M, 0) == TYPE_POISON);
ASSUME(GetSpeciesType(SPECIES_REGISTEEL, 0) == TYPE_STEEL);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(mon);
} WHEN {

View File

@ -47,8 +47,8 @@ SINGLE_BATTLE_TEST("Smack Down does not ground target if target is immune")
{
GIVEN {
ASSUME(GetMoveEffect(MOVE_ELECTRIFY) == EFFECT_ELECTRIFY);
ASSUME(gSpeciesInfo[SPECIES_GLISCOR].types[0] == TYPE_GROUND || gSpeciesInfo[SPECIES_GLISCOR].types[1] == TYPE_GROUND);
ASSUME(gSpeciesInfo[SPECIES_GLISCOR].types[0] == TYPE_FLYING || gSpeciesInfo[SPECIES_GLISCOR].types[1] == TYPE_FLYING);
ASSUME(GetSpeciesType(SPECIES_GLISCOR, 0) == TYPE_GROUND || GetSpeciesType(SPECIES_GLISCOR, 1) == TYPE_GROUND);
ASSUME(GetSpeciesType(SPECIES_GLISCOR, 0) == TYPE_FLYING || GetSpeciesType(SPECIES_GLISCOR, 1) == TYPE_FLYING);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_GLISCOR);
} WHEN {

View File

@ -13,7 +13,7 @@ SINGLE_BATTLE_TEST("criticalHitStage set to 1 increases critical hits occur at a
GIVEN {
WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig);
ASSUME(GetMoveCriticalHitStage(MOVE_SLASH) == 1);
ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].baseSpeed == 33);
ASSUME(GetSpeciesBaseSpeed(SPECIES_WOBBUFFET) == 33);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {

View File

@ -5,7 +5,7 @@ SINGLE_BATTLE_TEST("Powder moves are blocked by Grass-type Pokémon")
{
GIVEN {
ASSUME(IsPowderMove(MOVE_STUN_SPORE));
ASSUME(gSpeciesInfo[SPECIES_ODDISH].types[0] == TYPE_GRASS);
ASSUME(GetSpeciesType(SPECIES_ODDISH, 0) == TYPE_GRASS);
PLAYER(SPECIES_WYNAUT);
OPPONENT(SPECIES_ODDISH);
} WHEN {

View File

@ -66,7 +66,7 @@ AI_SINGLE_BATTLE_TEST("AI avoids Thunder Wave when it can not paralyse target")
SINGLE_BATTLE_TEST("Thunder Wave doesn't affect Electric types in Gen6+")
{
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_PIKACHU].types[0] == TYPE_ELECTRIC);
ASSUME(GetSpeciesType(SPECIES_PIKACHU, 0) == TYPE_ELECTRIC);
ASSUME(B_PARALYZE_ELECTRIC >= GEN_6);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_PIKACHU);

View File

@ -4,8 +4,8 @@
ASSUMPTIONS {
int i;
for (i = 0; i < NUM_ABILITY_SLOTS; i++) {
ASSUME(gSpeciesInfo[SPECIES_KADABRA].abilities[i] != ABILITY_QUARK_DRIVE);
ASSUME(gSpeciesInfo[SPECIES_ALAKAZAM].abilities[i] != ABILITY_ELECTRIC_SURGE);
ASSUME(GetSpeciesAbility(SPECIES_KADABRA, i) != ABILITY_QUARK_DRIVE);
ASSUME(GetSpeciesAbility(SPECIES_ALAKAZAM, i) != ABILITY_ELECTRIC_SURGE);
}
}

Some files were not shown because too many files have changed in this diff Show More