diff --git a/docs/tutorials/how_to_testing_system.md b/docs/tutorials/how_to_testing_system.md index 2e5f83ff76..c5fbb945aa 100644 --- a/docs/tutorials/how_to_testing_system.md +++ b/docs/tutorials/how_to_testing_system.md @@ -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 { diff --git a/include/battle.h b/include/battle.h index b6cebae74a..77da1c4f0a 100644 --- a/include/battle.h +++ b/include/battle.h @@ -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 diff --git a/include/pokemon.h b/include/pokemon.h index 7aaa708459..65202eb905 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -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); diff --git a/include/test/battle.h b/include/test/battle.h index 16b492ccad..5e9272c621 100644 --- a/include/test/battle.h +++ b/include/test/battle.h @@ -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 { diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index cea486e581..cc6ca2a8f0 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -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: diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 342bc03537..2080a88a3b 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -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 diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index b537211c87..34fda88378 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -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); diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 1e9ac6cb5f..ad74cd03c9 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -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))) diff --git a/src/battle_dome.c b/src/battle_dome.c index c01dbbc25d..0ded9ada1e 100644 --- a/src/battle_dome.c +++ b/src/battle_dome.c @@ -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); diff --git a/src/battle_factory.c b/src/battle_factory.c index 5a9ab56127..50434bd09c 100644 --- a/src/battle_factory.c +++ b/src/battle_factory.c @@ -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. diff --git a/src/battle_main.c b/src/battle_main.c index 4bd683aa29..9cf45280c1 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -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: diff --git a/src/battle_pike.c b/src/battle_pike.c index f1857b5d82..60e4a3c67f 100644 --- a/src/battle_pike.c +++ b/src/battle_pike.c @@ -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; diff --git a/src/battle_pyramid.c b/src/battle_pyramid.c index 6e56f4867b..48c32d194a 100644 --- a/src/battle_pyramid.c +++ b/src/battle_pyramid.c @@ -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); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index d7eec1c322..33414378ae 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -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: diff --git a/src/battle_util.c b/src/battle_util.c index 66b1b4e042..7493b38363 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -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) diff --git a/src/contest.c b/src/contest.c index 08ff4765f9..18738843ef 100644 --- a/src/contest.c +++ b/src/contest.c @@ -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; diff --git a/src/dexnav.c b/src/dexnav.c index 4ad2813b80..a839cc1208 100644 --- a/src/dexnav.c +++ b/src/dexnav.c @@ -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); } diff --git a/src/event_object_movement.c b/src/event_object_movement.c index f4418afab3..dd53773a2e 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -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 diff --git a/src/field_specials.c b/src/field_specials.c index 6543461998..0ac0d9fa68 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -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; diff --git a/src/party_menu.c b/src/party_menu.c index 74f5531119..e22f4f7d9d 100644 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -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 ) { diff --git a/src/pokedex.c b/src/pokedex.c index 5078f5ca94..bc305a4b4a 100644 --- a/src/pokedex.c +++ b/src/pokedex.c @@ -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]; diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index 25d2faeced..77661a7fbd 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -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]; diff --git a/src/pokemon.c b/src/pokemon.c index c9c14aa093..30e9b4302b 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -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; } diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 17f1f82db6..e4abb9f163 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -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 diff --git a/src/trade.c b/src/trade.c index fa8e160c6d..dbb8622b80 100644 --- a/src/trade.c +++ b/src/trade.c @@ -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; } diff --git a/src/type_icons.c b/src/type_icons.c index c47690fcae..ba13f86027 100644 --- a/src/type_icons.c +++ b/src/type_icons.c @@ -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; diff --git a/src/union_room.c b/src/union_room.c index 6042c6420a..135cf3e982 100644 --- a/src/union_room.c +++ b/src/union_room.c @@ -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; diff --git a/src/wild_encounter.c b/src/wild_encounter.c index 37b6a43443..29f4346501 100644 --- a/src/wild_encounter.c +++ b/src/wild_encounter.c @@ -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; } diff --git a/test/battle/ability/aerilate.c b/test/battle/ability/aerilate.c index e213e177d6..c122496d51 100644 --- a/test/battle/ability/aerilate.c +++ b/test/battle/ability/aerilate.c @@ -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 { diff --git a/test/battle/ability/anticipation.c b/test/battle/ability/anticipation.c index 7a45537296..e1de10f2ff 100644 --- a/test/battle/ability/anticipation.c +++ b/test/battle/ability/anticipation.c @@ -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 { diff --git a/test/battle/ability/color_change.c b/test/battle/ability/color_change.c index b6af05fdbe..e097035f62 100644 --- a/test/battle/ability/color_change.c +++ b/test/battle/ability/color_change.c @@ -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); } diff --git a/test/battle/ability/dry_skin.c b/test/battle/ability/dry_skin.c index 95a0cd8fa8..097251565f 100644 --- a/test/battle/ability/dry_skin.c +++ b/test/battle/ability/dry_skin.c @@ -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 { diff --git a/test/battle/ability/galvanize.c b/test/battle/ability/galvanize.c index 981b06d580..e6569aedaf 100644 --- a/test/battle/ability/galvanize.c +++ b/test/battle/ability/galvanize.c @@ -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 { diff --git a/test/battle/ability/magic_bounce.c b/test/battle/ability/magic_bounce.c index e04c018a33..56c9a32332 100644 --- a/test/battle/ability/magic_bounce.c +++ b/test/battle/ability/magic_bounce.c @@ -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 { diff --git a/test/battle/ability/mimicry.c b/test/battle/ability/mimicry.c index fbdb5cf98a..849659e953 100644 --- a/test/battle/ability/mimicry.c +++ b/test/battle/ability/mimicry.c @@ -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 { diff --git a/test/battle/ability/normalize.c b/test/battle/ability/normalize.c index 4858997421..175e5b5954 100644 --- a/test/battle/ability/normalize.c +++ b/test/battle/ability/normalize.c @@ -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 { diff --git a/test/battle/ability/parental_bond.c b/test/battle/ability/parental_bond.c index 2635c740df..6c516c7ffc 100644 --- a/test/battle/ability/parental_bond.c +++ b/test/battle/ability/parental_bond.c @@ -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); diff --git a/test/battle/ability/pixilate.c b/test/battle/ability/pixilate.c index 091b48f541..7e0d98f519 100644 --- a/test/battle/ability/pixilate.c +++ b/test/battle/ability/pixilate.c @@ -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 { diff --git a/test/battle/ability/prankster.c b/test/battle/ability/prankster.c index cf297214d9..fd45b94b09 100644 --- a/test/battle/ability/prankster.c +++ b/test/battle/ability/prankster.c @@ -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); } diff --git a/test/battle/ability/quark_drive.c b/test/battle/ability/quark_drive.c index 61a51d3d35..a9f6e65a4b 100644 --- a/test/battle/ability/quark_drive.c +++ b/test/battle/ability/quark_drive.c @@ -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 { diff --git a/test/battle/ability/refrigerate.c b/test/battle/ability/refrigerate.c index 5f5092f93f..9577c6f4b7 100644 --- a/test/battle/ability/refrigerate.c +++ b/test/battle/ability/refrigerate.c @@ -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 { diff --git a/test/battle/ability/rivalry.c b/test/battle/ability/rivalry.c index 85d10a5b3b..aef7361af5 100644 --- a/test/battle/ability/rivalry.c +++ b/test/battle/ability/rivalry.c @@ -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 { diff --git a/test/battle/ability/sand_force.c b/test/battle/ability/sand_force.c index 959d437980..7592c5afec 100644 --- a/test/battle/ability/sand_force.c +++ b/test/battle/ability/sand_force.c @@ -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); diff --git a/test/battle/ability/sand_rush.c b/test/battle/ability/sand_rush.c index 08dd22ef57..4d557348e5 100644 --- a/test/battle/ability/sand_rush.c +++ b/test/battle/ability/sand_rush.c @@ -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); diff --git a/test/battle/ability/schooling.c b/test/battle/ability/schooling.c index 19c2b14c8f..f4da6a2caf 100644 --- a/test/battle/ability/schooling.c +++ b/test/battle/ability/schooling.c @@ -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); diff --git a/test/battle/ability/slush_rush.c b/test/battle/ability/slush_rush.c index d7508c2cb4..8eca46f089 100644 --- a/test/battle/ability/slush_rush.c +++ b/test/battle/ability/slush_rush.c @@ -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 { diff --git a/test/battle/ability/super_luck.c b/test/battle/ability/super_luck.c index faaf366747..016ff3fae1 100644 --- a/test/battle/ability/super_luck.c +++ b/test/battle/ability/super_luck.c @@ -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); diff --git a/test/battle/ability/swarm.c b/test/battle/ability/swarm.c index a70c1ffb55..ce94ae22e2 100644 --- a/test/battle/ability/swarm.c +++ b/test/battle/ability/swarm.c @@ -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 { diff --git a/test/battle/ability/zen_mode.c b/test/battle/ability/zen_mode.c index a3e82a2b2b..1e73961cda 100644 --- a/test/battle/ability/zen_mode.c +++ b/test/battle/ability/zen_mode.c @@ -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); diff --git a/test/battle/ai/ai.c b/test/battle/ai/ai.c index 249e686c16..0c5d8793c8 100644 --- a/test/battle/ai/ai.c +++ b/test/battle/ai/ai.c @@ -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); } diff --git a/test/battle/ai/ai_choice.c b/test/battle/ai/ai_choice.c index fc3706ca29..d7ff7e021f 100644 --- a/test/battle/ai/ai_choice.c +++ b/test/battle/ai/ai_choice.c @@ -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); diff --git a/test/battle/ai/ai_double_ace.c b/test/battle/ai/ai_double_ace.c index ce8c484b4a..3fa9ce77e0 100644 --- a/test/battle/ai/ai_double_ace.c +++ b/test/battle/ai/ai_double_ace.c @@ -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); } diff --git a/test/battle/ai/ai_flag_risky.c b/test/battle/ai/ai_flag_risky.c index 5a2e224d48..5a076f6fe1 100644 --- a/test/battle/ai/ai_flag_risky.c +++ b/test/battle/ai/ai_flag_risky.c @@ -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); } diff --git a/test/battle/ai/ai_switching.c b/test/battle/ai/ai_switching.c index 46c419f211..d1378812f1 100644 --- a/test/battle/ai/ai_switching.c +++ b/test/battle/ai/ai_switching.c @@ -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); diff --git a/test/battle/crit_chance.c b/test/battle/crit_chance.c index 0bc8841845..5a4dd8d653 100644 --- a/test/battle/crit_chance.c +++ b/test/battle/crit_chance.c @@ -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 { diff --git a/test/battle/form_change/mega_evolution.c b/test/battle/form_change/mega_evolution.c index 3d9d9cf507..eea438229a 100644 --- a/test/battle/form_change/mega_evolution.c +++ b/test/battle/form_change/mega_evolution.c @@ -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 { diff --git a/test/battle/gimmick/dynamax.c b/test/battle/gimmick/dynamax.c index bbfcccafda..220eaa362c 100644 --- a/test/battle/gimmick/dynamax.c +++ b/test/battle/gimmick/dynamax.c @@ -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 { diff --git a/test/battle/gimmick/zmove.c b/test/battle/gimmick/zmove.c index 0133340618..27e45455c6 100644 --- a/test/battle/gimmick/zmove.c +++ b/test/battle/gimmick/zmove.c @@ -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 { diff --git a/test/battle/hold_effect/leek.c b/test/battle/hold_effect/leek.c index 7ff6610279..1775681d5f 100644 --- a/test/battle/hold_effect/leek.c +++ b/test/battle/hold_effect/leek.c @@ -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); } diff --git a/test/battle/hold_effect/luck_punch.c b/test/battle/hold_effect/luck_punch.c index 02faaed6a8..0bdae8134c 100644 --- a/test/battle/hold_effect/luck_punch.c +++ b/test/battle/hold_effect/luck_punch.c @@ -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 { diff --git a/test/battle/hold_effect/scope_lens.c b/test/battle/hold_effect/scope_lens.c index f5b616ecea..06c9c4a0dc 100644 --- a/test/battle/hold_effect/scope_lens.c +++ b/test/battle/hold_effect/scope_lens.c @@ -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 { diff --git a/test/battle/hold_effect/seeds.c b/test/battle/hold_effect/seeds.c index 35b89c0085..53cca3c211 100644 --- a/test/battle/hold_effect/seeds.c +++ b/test/battle/hold_effect/seeds.c @@ -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 { diff --git a/test/battle/move_effect/defog.c b/test/battle/move_effect/defog.c index d4c6650c72..ce0ab844c7 100644 --- a/test/battle/move_effect/defog.c +++ b/test/battle/move_effect/defog.c @@ -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); } diff --git a/test/battle/move_effect/dragon_cheer.c b/test/battle/move_effect/dragon_cheer.c index 53125f042f..c6dfa3c4dd 100644 --- a/test/battle/move_effect/dragon_cheer.c +++ b/test/battle/move_effect/dragon_cheer.c @@ -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); diff --git a/test/battle/move_effect/dragon_darts.c b/test/battle/move_effect/dragon_darts.c index 1d94968a09..13a165a459 100644 --- a/test/battle/move_effect/dragon_darts.c +++ b/test/battle/move_effect/dragon_darts.c @@ -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); diff --git a/test/battle/move_effect/electrify.c b/test/battle/move_effect/electrify.c index dbb6862fb6..0bbf58e01e 100644 --- a/test/battle/move_effect/electrify.c +++ b/test/battle/move_effect/electrify.c @@ -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); diff --git a/test/battle/move_effect/explosion.c b/test/battle/move_effect/explosion.c index 52eec1a8e2..8185171796 100644 --- a/test/battle/move_effect/explosion.c +++ b/test/battle/move_effect/explosion.c @@ -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 { diff --git a/test/battle/move_effect/fail_if_not_arg_type.c b/test/battle/move_effect/fail_if_not_arg_type.c index 368c3410c0..3a8cb67a2d 100644 --- a/test/battle/move_effect/fail_if_not_arg_type.c +++ b/test/battle/move_effect/fail_if_not_arg_type.c @@ -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 { diff --git a/test/battle/move_effect/flower_shield.c b/test/battle/move_effect/flower_shield.c index 784cce99f2..b064b0620a 100644 --- a/test/battle/move_effect/flower_shield.c +++ b/test/battle/move_effect/flower_shield.c @@ -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); diff --git a/test/battle/move_effect/focus_energy.c b/test/battle/move_effect/focus_energy.c index 8ecb3ccb47..621000c4b9 100644 --- a/test/battle/move_effect/focus_energy.c +++ b/test/battle/move_effect/focus_energy.c @@ -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 { diff --git a/test/battle/move_effect/hidden_power.c b/test/battle/move_effect/hidden_power.c index 124d78c96a..a04482eb29 100644 --- a/test/battle/move_effect/hidden_power.c +++ b/test/battle/move_effect/hidden_power.c @@ -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); } diff --git a/test/battle/move_effect/hit_switch_target.c b/test/battle/move_effect/hit_switch_target.c index e0d6548ec3..251279e198 100644 --- a/test/battle/move_effect/hit_switch_target.c +++ b/test/battle/move_effect/hit_switch_target.c @@ -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); } diff --git a/test/battle/move_effect/knock_off.c b/test/battle/move_effect/knock_off.c index 626e0cde28..748e660c8b 100644 --- a/test/battle/move_effect/knock_off.c +++ b/test/battle/move_effect/knock_off.c @@ -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 { diff --git a/test/battle/move_effect/leech_seed.c b/test/battle/move_effect/leech_seed.c index 56da50a12b..96ecf205da 100644 --- a/test/battle/move_effect/leech_seed.c +++ b/test/battle/move_effect/leech_seed.c @@ -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 { diff --git a/test/battle/move_effect/metronome.c b/test/battle/move_effect/metronome.c index 3bb178e2f2..2419ecb1e4 100644 --- a/test/battle/move_effect/metronome.c +++ b/test/battle/move_effect/metronome.c @@ -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); diff --git a/test/battle/move_effect/mirror_move.c b/test/battle/move_effect/mirror_move.c index 905fb32d31..642998cbcf 100644 --- a/test/battle/move_effect/mirror_move.c +++ b/test/battle/move_effect/mirror_move.c @@ -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); diff --git a/test/battle/move_effect/multi_hit.c b/test/battle/move_effect/multi_hit.c index c257ddd3b2..7052a52cbf 100644 --- a/test/battle/move_effect/multi_hit.c +++ b/test/battle/move_effect/multi_hit.c @@ -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 { diff --git a/test/battle/move_effect/ohko.c b/test/battle/move_effect/ohko.c index 415f36e752..562045afb3 100644 --- a/test/battle/move_effect/ohko.c +++ b/test/battle/move_effect/ohko.c @@ -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 { diff --git a/test/battle/move_effect/powder.c b/test/battle/move_effect/powder.c index aca96693de..0cbe273ef2 100644 --- a/test/battle/move_effect/powder.c +++ b/test/battle/move_effect/powder.c @@ -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 { diff --git a/test/battle/move_effect/protect.c b/test/battle/move_effect/protect.c index e0c32e5267..3ec96d5d48 100644 --- a/test/battle/move_effect/protect.c +++ b/test/battle/move_effect/protect.c @@ -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); diff --git a/test/battle/move_effect/reflect_type.c b/test/battle/move_effect/reflect_type.c index ae2b7cc3fe..7b94aee34e 100644 --- a/test/battle/move_effect/reflect_type.c +++ b/test/battle/move_effect/reflect_type.c @@ -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 { diff --git a/test/battle/move_effect/roost.c b/test/battle/move_effect/roost.c index 51d9499bd1..8748508c9b 100644 --- a/test/battle/move_effect/roost.c +++ b/test/battle/move_effect/roost.c @@ -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 { diff --git a/test/battle/move_effect/rototiller.c b/test/battle/move_effect/rototiller.c index 34b62a2666..73ad6c9c85 100644 --- a/test/battle/move_effect/rototiller.c +++ b/test/battle/move_effect/rototiller.c @@ -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); diff --git a/test/battle/move_effect/sky_drop.c b/test/battle/move_effect/sky_drop.c index c2a1e104e1..32adc67d73 100644 --- a/test/battle/move_effect/sky_drop.c +++ b/test/battle/move_effect/sky_drop.c @@ -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 { diff --git a/test/battle/move_effect/spikes.c b/test/battle/move_effect/spikes.c index 187b9ce7ac..03dcec84f4 100644 --- a/test/battle/move_effect/spikes.c +++ b/test/battle/move_effect/spikes.c @@ -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; } diff --git a/test/battle/move_effect/tar_shot.c b/test/battle/move_effect/tar_shot.c index f2aac4e552..01fd72018f 100644 --- a/test/battle/move_effect/tar_shot.c +++ b/test/battle/move_effect/tar_shot.c @@ -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 { diff --git a/test/battle/move_effect/tera_blast.c b/test/battle/move_effect/tera_blast.c index 63e7a776b9..060e28802d 100644 --- a/test/battle/move_effect/tera_blast.c +++ b/test/battle/move_effect/tera_blast.c @@ -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 { diff --git a/test/battle/move_effect/tera_starstorm.c b/test/battle/move_effect/tera_starstorm.c index c1d8794576..c3d2d7ef3a 100644 --- a/test/battle/move_effect/tera_starstorm.c +++ b/test/battle/move_effect/tera_starstorm.c @@ -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 { diff --git a/test/battle/move_effect/toxic.c b/test/battle/move_effect/toxic.c index c25b4fc640..ef7c8f011a 100644 --- a/test/battle/move_effect/toxic.c +++ b/test/battle/move_effect/toxic.c @@ -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 { diff --git a/test/battle/move_effect/toxic_spikes.c b/test/battle/move_effect/toxic_spikes.c index 5452f66a8b..4d4dbf7c43 100644 --- a/test/battle/move_effect/toxic_spikes.c +++ b/test/battle/move_effect/toxic_spikes.c @@ -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); diff --git a/test/battle/move_effect_secondary/burn.c b/test/battle/move_effect_secondary/burn.c index 0bc979f08e..ee25863389 100644 --- a/test/battle/move_effect_secondary/burn.c +++ b/test/battle/move_effect_secondary/burn.c @@ -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); diff --git a/test/battle/move_effect_secondary/freeze.c b/test/battle/move_effect_secondary/freeze.c index 645c134a81..01a4b31c06 100644 --- a/test/battle/move_effect_secondary/freeze.c +++ b/test/battle/move_effect_secondary/freeze.c @@ -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); diff --git a/test/battle/move_effect_secondary/ion_deluge.c b/test/battle/move_effect_secondary/ion_deluge.c index 99683d2a92..21d37de407 100644 --- a/test/battle/move_effect_secondary/ion_deluge.c +++ b/test/battle/move_effect_secondary/ion_deluge.c @@ -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 { diff --git a/test/battle/move_effect_secondary/paralysis.c b/test/battle/move_effect_secondary/paralysis.c index 711ca11ee8..baa2183064 100644 --- a/test/battle/move_effect_secondary/paralysis.c +++ b/test/battle/move_effect_secondary/paralysis.c @@ -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); diff --git a/test/battle/move_effect_secondary/poison.c b/test/battle/move_effect_secondary/poison.c index 63b2816bfd..e201ec83b9 100644 --- a/test/battle/move_effect_secondary/poison.c +++ b/test/battle/move_effect_secondary/poison.c @@ -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 { diff --git a/test/battle/move_effect_secondary/smack_down.c b/test/battle/move_effect_secondary/smack_down.c index c0d0e55eca..f31d291dd2 100644 --- a/test/battle/move_effect_secondary/smack_down.c +++ b/test/battle/move_effect_secondary/smack_down.c @@ -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 { diff --git a/test/battle/move_flags/critical_hit_stage.c b/test/battle/move_flags/critical_hit_stage.c index 02999e9a8a..d82b4334f3 100644 --- a/test/battle/move_flags/critical_hit_stage.c +++ b/test/battle/move_flags/critical_hit_stage.c @@ -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 { diff --git a/test/battle/move_flags/powder.c b/test/battle/move_flags/powder.c index 04920f79f3..bb0b1e3e4f 100644 --- a/test/battle/move_flags/powder.c +++ b/test/battle/move_flags/powder.c @@ -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 { diff --git a/test/battle/status1/paralysis.c b/test/battle/status1/paralysis.c index 64ed27f361..0635e83d1d 100644 --- a/test/battle/status1/paralysis.c +++ b/test/battle/status1/paralysis.c @@ -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); diff --git a/test/battle/test_runner_features.c b/test/battle/test_runner_features.c index 6b84c4fc2d..bb4840799f 100644 --- a/test/battle/test_runner_features.c +++ b/test/battle/test_runner_features.c @@ -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); } } diff --git a/test/battle/trainer_slides.c b/test/battle/trainer_slides.c index d76ef035d6..273885fe75 100644 --- a/test/battle/trainer_slides.c +++ b/test/battle/trainer_slides.c @@ -59,7 +59,7 @@ SINGLE_BATTLE_TEST("Trainer Slide: Player Lands First STAB Hit") gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_PLAYER_LANDS_FIRST_STAB_MOVE; GIVEN { - ASSUME((GetMoveType(MOVE_VINE_WHIP)) == gSpeciesInfo[SPECIES_BULBASAUR].types[0]); + ASSUME((GetMoveType(MOVE_VINE_WHIP)) == GetSpeciesType(SPECIES_BULBASAUR, 0)); PLAYER(SPECIES_BULBASAUR); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -77,8 +77,8 @@ SINGLE_BATTLE_TEST("Trainer Slide: Player Lands First Super Effective Hit") GIVEN { ASSUME(GetMoveType(MOVE_BITE) == TYPE_DARK); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] == TYPE_PSYCHIC); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) == TYPE_PSYCHIC); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -110,7 +110,7 @@ SINGLE_BATTLE_TEST("Trainer Slide: Enemy Mon Unaffected") gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_ENEMY_MON_UNAFFECTED; 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 { @@ -142,7 +142,7 @@ SINGLE_BATTLE_TEST("Trainer Slide: Last Half Hp") gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_LAST_HALF_HP; GIVEN { ASSUME(GetMoveEffect(MOVE_SUPER_FANG) == EFFECT_FIXED_PERCENT_DAMAGE); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].baseHP == 190); + ASSUME(GetSpeciesBaseHP(SPECIES_WOBBUFFET) == 190); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/weather/hail.c b/test/battle/weather/hail.c index df5a34469c..3a0dd53026 100644 --- a/test/battle/weather/hail.c +++ b/test/battle/weather/hail.c @@ -5,9 +5,9 @@ ASSUMPTIONS { ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_ICE && gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_ICE); - ASSUME(gSpeciesInfo[SPECIES_WYNAUT].types[0] != TYPE_ICE && gSpeciesInfo[SPECIES_WYNAUT].types[1] != TYPE_ICE); - ASSUME(gSpeciesInfo[SPECIES_GLALIE].types[0] == TYPE_ICE || gSpeciesInfo[SPECIES_GLALIE].types[1] == TYPE_ICE); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_ICE && GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_ICE); + ASSUME(GetSpeciesType(SPECIES_WYNAUT, 0) != TYPE_ICE && GetSpeciesType(SPECIES_WYNAUT, 1) != TYPE_ICE); + ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE || GetSpeciesType(SPECIES_GLALIE, 1) == TYPE_ICE); } SINGLE_BATTLE_TEST("Hail deals 1/16 damage per turn") @@ -28,7 +28,7 @@ SINGLE_BATTLE_TEST("Hail deals 1/16 damage per turn") SINGLE_BATTLE_TEST("Hail damage does not affect Ice-type Pokémon") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_GLALIE].types[0] == TYPE_ICE); + ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_GLALIE); } WHEN { @@ -94,8 +94,8 @@ SINGLE_BATTLE_TEST("Hail damage rounds properly when maxHP < 16") SINGLE_BATTLE_TEST("Hail doesn't do damage when weather is negated") { 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_GOLDUCK) { Ability(ABILITY_CLOUD_NINE); } } WHEN { diff --git a/test/battle/weather/sandstorm.c b/test/battle/weather/sandstorm.c index 2ff0697597..96a440a10e 100644 --- a/test/battle/weather/sandstorm.c +++ b/test/battle/weather/sandstorm.c @@ -43,9 +43,9 @@ SINGLE_BATTLE_TEST("Sandstorm damage does not hurt Ground, Rock, and Steel-type PARAMETRIZE { mon = SPECIES_NOSEPASS; } PARAMETRIZE { mon = SPECIES_REGISTEEL; } GIVEN { - ASSUME(gSpeciesInfo[SPECIES_SANDSLASH].types[0] == TYPE_GROUND); - ASSUME(gSpeciesInfo[SPECIES_NOSEPASS].types[0] == TYPE_ROCK); - ASSUME(gSpeciesInfo[SPECIES_REGISTEEL].types[0] == TYPE_STEEL); + ASSUME(GetSpeciesType(SPECIES_SANDSLASH, 0) == TYPE_GROUND); + ASSUME(GetSpeciesType(SPECIES_NOSEPASS, 0) == TYPE_ROCK); + ASSUME(GetSpeciesType(SPECIES_REGISTEEL, 0) == TYPE_STEEL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(mon); } WHEN { @@ -97,8 +97,8 @@ SINGLE_BATTLE_TEST("Sandstorm damage rounds properly when maxHP < 16") SINGLE_BATTLE_TEST("Sandstorm doesn't do damage when weather is negated") { - 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); diff --git a/test/battle/weather/snow.c b/test/battle/weather/snow.c index 844a6840e3..c8e0a4fbc3 100644 --- a/test/battle/weather/snow.c +++ b/test/battle/weather/snow.c @@ -5,8 +5,8 @@ ASSUMPTIONS { ASSUME(GetMoveEffect(MOVE_SNOWSCAPE) == EFFECT_SNOWSCAPE); - ASSUME(gSpeciesInfo[SPECIES_WOBBUFFET].types[0] != TYPE_ICE && gSpeciesInfo[SPECIES_WOBBUFFET].types[1] != TYPE_ICE); - ASSUME(gSpeciesInfo[SPECIES_GLALIE].types[0] == TYPE_ICE || gSpeciesInfo[SPECIES_GLALIE].types[1] == TYPE_ICE); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_ICE && GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_ICE); + ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE || GetSpeciesType(SPECIES_GLALIE, 1) == TYPE_ICE); ASSUME(GetMoveCategory(MOVE_SCRATCH) == DAMAGE_CATEGORY_PHYSICAL); } diff --git a/test/pokemon.c b/test/pokemon.c index 4e8a1da7fa..2fbf96f816 100644 --- a/test/pokemon.c +++ b/test/pokemon.c @@ -29,8 +29,8 @@ TEST("Terastallization type defaults to primary or secondary type") for (i = 0; i < 128; i++) PARAMETRIZE {} CreateMon(&mon, SPECIES_PIDGEY, 100, 0, FALSE, 0, OT_ID_PRESET, 0); teraType = GetMonData(&mon, MON_DATA_TERA_TYPE); - EXPECT(teraType == gSpeciesInfo[SPECIES_PIDGEY].types[0] - || teraType == gSpeciesInfo[SPECIES_PIDGEY].types[1]); + EXPECT(teraType == GetSpeciesType(SPECIES_PIDGEY, 0) + || teraType == GetSpeciesType(SPECIES_PIDGEY, 1)); } TEST("Terastallization type can be set to any type except TYPE_NONE") @@ -61,8 +61,8 @@ TEST("Terastallization type is reset to the default types when setting Tera Type typeNone = GetTeraTypeFromPersonality(&mon); SetMonData(&mon, MON_DATA_TERA_TYPE, &typeNone); typeNone = GetMonData(&mon, MON_DATA_TERA_TYPE); - EXPECT(typeNone == gSpeciesInfo[SPECIES_PIDGEY].types[0] - || typeNone == gSpeciesInfo[SPECIES_PIDGEY].types[1]); + EXPECT(typeNone == GetSpeciesType(SPECIES_PIDGEY, 0) + || typeNone == GetSpeciesType(SPECIES_PIDGEY, 1)); } TEST("Shininess independent from PID and OTID") @@ -302,7 +302,7 @@ TEST("givemon [all]") EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_HELD_ITEM), ITEM_LEFTOVERS); EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_POKEBALL), BALL_MASTER); EXPECT_EQ(GetNature(&gPlayerParty[0]), NATURE_BOLD); - EXPECT_EQ(GetMonAbility(&gPlayerParty[0]), gSpeciesInfo[SPECIES_WOBBUFFET].abilities[2]); + EXPECT_EQ(GetMonAbility(&gPlayerParty[0]), GetSpeciesAbility(SPECIES_WOBBUFFET, 2)); EXPECT_EQ(GetMonGender(&gPlayerParty[0]), MON_MALE); EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_HP_EV), 1); EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_ATK_EV), 2); @@ -367,7 +367,7 @@ TEST("givemon [vars]") EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_HELD_ITEM), ITEM_LEFTOVERS); EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_POKEBALL), BALL_MASTER); EXPECT_EQ(GetNature(&gPlayerParty[0]), NATURE_BOLD); - EXPECT_EQ(GetMonAbility(&gPlayerParty[0]), gSpeciesInfo[SPECIES_WOBBUFFET].abilities[2]); + EXPECT_EQ(GetMonAbility(&gPlayerParty[0]), GetSpeciesAbility(SPECIES_WOBBUFFET, 2)); EXPECT_EQ(GetMonGender(&gPlayerParty[0]), MON_MALE); EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_HP_EV), 1); EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_ATK_EV), 2);