Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add FORM_CHANGE_BATTLE_TERASTALLIZATION + allow species to force tera types #4438

Merged
merged 19 commits into from
Jun 4, 2024
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions data/battle_scripts_1.s
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,21 @@ BattleScript_Terastallization::
waitanimation
end3

BattleScript_TeraFormChange::
@ TODO: no string prints in S/V, but right now this helps with clarity
printstring STRINGID_PKMNTERASTALLIZEDINTO
@ TODO: replace this animation
playanimation BS_ATTACKER, B_ANIM_TOTEM_FLARE
waitanimation
handleformchange BS_ATTACKER, 0
handleformchange BS_ATTACKER, 1
playanimation BS_ATTACKER, B_ANIM_FORM_CHANGE
waitanimation
copybyte sBATTLER, gBattlerAttacker
handleformchange BS_ATTACKER, 2
switchinabilities BS_ATTACKER
end3

BattleScript_LowerAtkSpAtk::
jumpifstat BS_EFFECT_BATTLER, CMP_GREATER_THAN, STAT_ATK, MIN_STAT_STAGE, BattleScript_LowerAtkSpAtkDoAnim
jumpifstat BS_EFFECT_BATTLER, CMP_EQUAL, STAT_SPATK, MIN_STAT_STAGE, BattleScript_LowerAtkSpAtkEnd
Expand Down
1 change: 1 addition & 0 deletions include/battle_scripts.h
Original file line number Diff line number Diff line change
Expand Up @@ -502,6 +502,7 @@ extern const u8 BattleScript_AromaVeilProtectsRet[];
extern const u8 BattleScript_LowerAtkSpAtk[];
extern const u8 BattleScript_Terastallization[];
extern const u8 BattleScript_BoosterEnergyEnd2[];
extern const u8 BattleScript_TeraFormChange[];

// zmoves
extern const u8 BattleScript_ZMoveActivateDamaging[];
Expand Down
2 changes: 1 addition & 1 deletion include/config/pokemon.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
#define P_FOOTPRINTS TRUE // If TRUE, Pokémon will have footprints (as was the case up to Gen 5 and in BDSP). Disabling this saves some ROM space.
#define P_LEGENDARY_PERFECT_IVS GEN_LATEST // Since Gen 6, Legendaries, Mythicals and Ultra Beasts found in the wild or given through gifts have at least 3 perfect IVs.
#define P_EV_CAP GEN_LATEST // Since Gen 6, the max EVs per stat is 252 instead of 255.
#define P_SHOW_TERA_TYPE GEN_8 // Since Gen 9, the Tera Type is shown on the summary screen.
#define P_SHOW_TERA_TYPE GEN_LATEST // Since Gen 9, the Tera Type is shown on the summary screen.
#define P_TM_LITERACY GEN_LATEST // Since Gen 6, TM illiterate Pokémon can learn TMs that teach moves that are in their level-up learnsets.

// Learnset helper toggles
Expand Down
4 changes: 4 additions & 0 deletions include/constants/form_change_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -120,4 +120,8 @@
// param1: status
#define FORM_CHANGE_STATUS 20

// Form change that activates when terastallized as as a specific type
// param1: tera type
#define FORM_CHANGE_BATTLE_TERASTALLIZATION 21

#endif // GUARD_CONSTANTS_FORM_CHANGE_TYPES_H
6 changes: 4 additions & 2 deletions include/pokemon.h
Original file line number Diff line number Diff line change
Expand Up @@ -359,7 +359,7 @@ struct SpeciesInfo /*0x8C*/
/* 0x05 */ u8 baseSpDefense;
/* 0x06 */ u8 types[2];
/* 0x08 */ u8 catchRate;
/* 0x09 */ u8 padding1;
/* 0x09 */ u8 forceTeraType;
kittenchilly marked this conversation as resolved.
Show resolved Hide resolved
/* 0x0A */ u16 expYield; // expYield was changed from u8 to u16 for the new Exp System.
/* 0x0C */ u16 evYield_HP:2;
u16 evYield_Attack:2;
Expand All @@ -377,6 +377,7 @@ struct SpeciesInfo /*0x8C*/
/* 0x16 */ u8 eggGroups[2];
/* 0x18 */ u16 abilities[NUM_ABILITY_SLOTS]; // 3 abilities, no longer u8 because we have over 255 abilities now.
/* 0x1E */ u8 safariZoneFleeRate;

// Pokédex data
/* 0x1F */ u8 categoryName[13];
/* 0x1F */ u8 speciesName[POKEMON_NAME_LENGTH + 1];
Expand Down Expand Up @@ -430,6 +431,7 @@ struct SpeciesInfo /*0x8C*/
u32 isPrimalReversion:1;
u32 isUltraBurst:1;
u32 isGigantamax:1;
u32 isTeraForm:1;
u32 isAlolanForm:1;
u32 isGalarianForm:1;
u32 isHisuianForm:1;
Expand All @@ -438,7 +440,7 @@ struct SpeciesInfo /*0x8C*/
u32 allPerfectIVs:1;
u32 dexForceRequired:1; // This species will be taken into account for Pokédex ratings even if they have the "isMythical" flag set.
u32 tmIlliterate:1; // This species will be unable to learn the universal moves.
u32 padding4:15;
u32 padding4:14;
// Move Data
/* 0x80 */ const struct LevelUpMove *levelUpLearnset;
/* 0x84 */ const u16 *teachableLearnset;
Expand Down
7 changes: 5 additions & 2 deletions src/battle_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -5335,7 +5335,7 @@ static void PopulateArrayWithBattlers(u8 *battlers)
static bool32 TryDoGimmicksBeforeMoves(void)
{
if (!(gHitMarker & HITMARKER_RUN)
&& (gBattleStruct->mega.toEvolve || gBattleStruct->burst.toBurst
&& (gBattleStruct->mega.toEvolve || gBattleStruct->burst.toBurst
|| gBattleStruct->dynamax.toDynamax || gBattleStruct->tera.toTera))
{
u32 i, battler;
Expand All @@ -5353,7 +5353,10 @@ static bool32 TryDoGimmicksBeforeMoves(void)
gBattleStruct->tera.toTera &= ~(gBitTable[gBattlerAttacker]);
PrepareBattlerForTera(gBattlerAttacker);
PREPARE_TYPE_BUFFER(gBattleTextBuff1, GetBattlerTeraType(gBattlerAttacker));
BattleScriptExecute(BattleScript_Terastallization);
if (TryBattleFormChange(gBattlerAttacker, FORM_CHANGE_BATTLE_TERASTALLIZATION))
BattleScriptExecute(BattleScript_TeraFormChange);
else
BattleScriptExecute(BattleScript_Terastallization);
return TRUE;
}
// Dynamax Check
Expand Down
31 changes: 18 additions & 13 deletions src/battle_tower.c
Original file line number Diff line number Diff line change
Expand Up @@ -1568,7 +1568,7 @@ void CreateFacilityMon(const struct TrainerMon *fmon, u16 level, u8 fixedIV, u32
u8 ball = (fmon->ball == 0xFF) ? Random() % POKEBALL_COUNT : fmon->ball;
u16 move;
u32 personality, ability, friendship, j;

if (fmon->gender == TRAINER_MON_MALE)
{
personality = GeneratePersonalityForGender(MON_MALE, fmon->species);
Expand All @@ -1577,26 +1577,26 @@ void CreateFacilityMon(const struct TrainerMon *fmon, u16 level, u8 fixedIV, u32
{
personality = GeneratePersonalityForGender(MON_FEMALE, fmon->species);
}

ModifyPersonalityForNature(&personality, fmon->nature);
CreateMon(dst, fmon->species, level, fixedIV, TRUE, personality, otID, OT_ID_PRESET);

friendship = MAX_FRIENDSHIP;
// Give the chosen Pokémon its specified moves.
for (j = 0; j < MAX_MON_MOVES; j++)
{
move = fmon->moves[j];
if (flags & FLAG_FRONTIER_MON_FACTORY && move == MOVE_RETURN)
move = MOVE_FRUSTRATION;

SetMonMoveSlot(dst, move, j);
if (gMovesInfo[move].effect == EFFECT_FRUSTRATION)
friendship = 0; // Frustration is more powerful the lower the pokemon's friendship is.
}

SetMonData(dst, MON_DATA_FRIENDSHIP, &friendship);
SetMonData(dst, MON_DATA_HELD_ITEM, &fmon->heldItem);

// try to set ability. Otherwise, random of non-hidden as per vanilla
if (fmon->ability != ABILITY_NONE)
{
Expand All @@ -1611,7 +1611,7 @@ void CreateFacilityMon(const struct TrainerMon *fmon, u16 level, u8 fixedIV, u32
ability = 0;
SetMonData(dst, MON_DATA_ABILITY_NUM, &ability);
}

if (fmon->ev != NULL)
{
SetMonData(dst, MON_DATA_HP_EV, &(fmon->ev[0]));
Expand All @@ -1621,10 +1621,10 @@ void CreateFacilityMon(const struct TrainerMon *fmon, u16 level, u8 fixedIV, u32
SetMonData(dst, MON_DATA_SPDEF_EV, &(fmon->ev[4]));
SetMonData(dst, MON_DATA_SPEED_EV, &(fmon->ev[5]));
}

if (fmon->iv)
SetMonData(dst, MON_DATA_IVS, &(fmon->iv));

if (fmon->isShiny)
{
u32 data = TRUE;
Expand All @@ -1640,8 +1640,13 @@ void CreateFacilityMon(const struct TrainerMon *fmon, u16 level, u8 fixedIV, u32
u32 data = fmon->gigantamaxFactor;
SetMonData(dst, MON_DATA_GIGANTAMAX_FACTOR, &data);
}


if (fmon->teraType)
{
u32 data = fmon->teraType;
SetMonData(dst, MON_DATA_TERA_TYPE, &data);
}


SetMonData(dst, MON_DATA_POKEBALL, &ball);
CalculateMonStats(dst);
}
Expand Down Expand Up @@ -1743,7 +1748,7 @@ static void FillTrainerParty(u16 trainerId, u8 firstMonId, u8 monCount)
continue;

chosenMonIndices[i] = monId;

// Place the chosen Pokémon into the trainer's party.
CreateFacilityMon(&gFacilityTrainerMons[monId], level, fixedIV, otID, 0, &gEnemyParty[i + firstMonId]);

Expand Down Expand Up @@ -2032,7 +2037,7 @@ void DoSpecialTrainerBattle(void)
BattleTransition_StartOnField(GetSpecialBattleTransition(B_TRANSITION_GROUP_SECRET_BASE));
break;
case SPECIAL_BATTLE_EREADER:
#if FREE_BATTLE_TOWER_E_READER == FALSE
#if FREE_BATTLE_TOWER_E_READER == FALSE
ZeroEnemyPartyMons();
for (i = 0; i < (int)ARRAY_COUNT(gSaveBlock2Ptr->frontier.ereaderTrainer.party); i++)
CreateBattleTowerMon(&gEnemyParty[i], &gSaveBlock2Ptr->frontier.ereaderTrainer.party[i]);
Expand Down Expand Up @@ -3095,7 +3100,7 @@ static void FillPartnerParty(u16 trainerId)
for (i = 0; i < FRONTIER_MULTI_PARTY_SIZE; i++)
{
monId = gSaveBlock2Ptr->frontier.trainerIds[i + 18];
CreateFacilityMon(&gFacilityTrainerMons[monId], level, ivs, otID, 0, &gPlayerParty[MULTI_PARTY_SIZE + i]);
CreateFacilityMon(&gFacilityTrainerMons[monId], level, ivs, otID, 0, &gPlayerParty[MULTI_PARTY_SIZE + i]);
for (j = 0; j < PLAYER_NAME_LENGTH + 1; j++)
trainerName[j] = gFacilityTrainers[trainerId].trainerName[j];
SetMonData(&gPlayerParty[MULTI_PARTY_SIZE + i], MON_DATA_OT_NAME, &trainerName);
Expand Down
16 changes: 14 additions & 2 deletions src/battle_util.c
Original file line number Diff line number Diff line change
Expand Up @@ -10506,6 +10506,14 @@ bool32 IsBattlerUltraBursted(u32 battler)
return (gSpeciesInfo[gBattleMons[battler].species].isUltraBurst);
}

bool32 IsBattlerInTeraForm(u32 battler)
{
// While Transform does copy stats and visuals, it shouldn't be counted as a true Tera Form.
if (gBattleMons[battler].status2 & STATUS2_TRANSFORMED)
return FALSE;
return (gSpeciesInfo[gBattleMons[battler].species].isTeraForm);
}

// Returns SPECIES_NONE if no form change is possible
u16 GetBattleFormChangeTargetSpecies(u32 battler, u16 method)
{
Expand Down Expand Up @@ -10594,6 +10602,10 @@ u16 GetBattleFormChangeTargetSpecies(u32 battler, u16 method)
if (gBattleMons[battler].status1 & formChanges[i].param1)
targetSpecies = formChanges[i].targetSpecies;
break;
case FORM_CHANGE_BATTLE_TERASTALLIZATION:
if (GetBattlerTeraType(battler) == formChanges[i].param1)
targetSpecies = formChanges[i].targetSpecies;
break;
}
}
}
Expand All @@ -10609,7 +10621,7 @@ bool32 CanBattlerFormChange(u32 battler, u16 method)
&& B_TRANSFORM_FORM_CHANGES >= GEN_5)
return FALSE;
// Mega Evolved and Ultra Bursted Pokémon should always revert to normal upon fainting or ending the battle.
if ((IsBattlerMegaEvolved(battler) || IsBattlerUltraBursted(battler)) && (method == FORM_CHANGE_FAINT || method == FORM_CHANGE_END_BATTLE))
if ((IsBattlerMegaEvolved(battler) || IsBattlerUltraBursted(battler) || IsBattlerInTeraForm(battler)) && (method == FORM_CHANGE_FAINT || method == FORM_CHANGE_END_BATTLE))
return TRUE;
else if (IsBattlerPrimalReverted(battler) && (method == FORM_CHANGE_END_BATTLE))
return TRUE;
Expand Down Expand Up @@ -10649,7 +10661,7 @@ bool32 TryBattleFormChange(u32 battler, u16 method)
bool32 restoreSpecies = FALSE;

// Mega Evolved and Ultra Bursted Pokémon should always revert to normal upon fainting or ending the battle, so no need to add it to the form change tables.
if ((IsBattlerMegaEvolved(battler) || IsBattlerUltraBursted(battler)) && (method == FORM_CHANGE_FAINT || method == FORM_CHANGE_END_BATTLE))
if ((IsBattlerMegaEvolved(battler) || IsBattlerUltraBursted(battler) || IsBattlerInTeraForm(battler)) && (method == FORM_CHANGE_FAINT || method == FORM_CHANGE_END_BATTLE))
restoreSpecies = TRUE;

// Unlike Megas, Primal Reversion isn't canceled on fainting.
Expand Down
20 changes: 13 additions & 7 deletions src/data/pokemon/form_change_tables.h
Original file line number Diff line number Diff line change
Expand Up @@ -1258,21 +1258,27 @@ static const struct FormChange sPalafinZeroFormChangeTable[] =

#if P_FAMILY_OGERPON
static const struct FormChange sOgerponFormChangeTable[] = {
{FORM_CHANGE_ITEM_HOLD, SPECIES_OGERPON_TEAL_MASK, ITEM_NONE},
{FORM_CHANGE_ITEM_HOLD, SPECIES_OGERPON_WELLSPRING_MASK, ITEM_WELLSPRING_MASK},
{FORM_CHANGE_ITEM_HOLD, SPECIES_OGERPON_HEARTHFLAME_MASK, ITEM_HEARTHFLAME_MASK},
{FORM_CHANGE_ITEM_HOLD, SPECIES_OGERPON_CORNERSTONE_MASK, ITEM_CORNERSTONE_MASK},
{FORM_CHANGE_ITEM_HOLD, SPECIES_OGERPON_TEAL_MASK, ITEM_NONE},
{FORM_CHANGE_ITEM_HOLD, SPECIES_OGERPON_WELLSPRING_MASK, ITEM_WELLSPRING_MASK},
{FORM_CHANGE_ITEM_HOLD, SPECIES_OGERPON_HEARTHFLAME_MASK, ITEM_HEARTHFLAME_MASK},
{FORM_CHANGE_ITEM_HOLD, SPECIES_OGERPON_CORNERSTONE_MASK, ITEM_CORNERSTONE_MASK},
#if P_TERA_FORMS
{FORM_CHANGE_BATTLE_TERASTALLIZATION, SPECIES_OGERPON_TEAL_MASK_TERA, TYPE_GRASS},
{FORM_CHANGE_BATTLE_TERASTALLIZATION, SPECIES_OGERPON_WELLSPRING_MASK_TERA, TYPE_WATER},
{FORM_CHANGE_BATTLE_TERASTALLIZATION, SPECIES_OGERPON_HEARTHFLAME_MASK_TERA, TYPE_FIRE},
{FORM_CHANGE_BATTLE_TERASTALLIZATION, SPECIES_OGERPON_CORNERSTONE_MASK_TERA, TYPE_ROCK},
#endif
{FORM_CHANGE_TERMINATOR},
};
#endif //P_FAMILY_OGERPON

#if P_FAMILY_TERAPAGOS
static const struct FormChange sTerapagosFormChangeTable[] = {
{FORM_CHANGE_BEGIN_BATTLE, SPECIES_TERAPAGOS_TERASTAL}, //needs to be tied to the ability
{FORM_CHANGE_BEGIN_BATTLE, SPECIES_TERAPAGOS_TERASTAL}, //needs to be tied to the ability
#if P_TERA_FORMS
//{FORM_CHANGE_TERASTALLIZATION, SPECIES_TERAPAGOS_STELLAR},
{FORM_CHANGE_BATTLE_TERASTALLIZATION, SPECIES_TERAPAGOS_STELLAR, TYPE_STELLAR},
#endif
{FORM_CHANGE_END_BATTLE, SPECIES_TERAPAGOS_NORMAL},
{FORM_CHANGE_END_BATTLE, SPECIES_TERAPAGOS_NORMAL},
{FORM_CHANGE_TERMINATOR},
};
#endif //P_FAMILY_TERAPAGOS
Expand Down
8 changes: 7 additions & 1 deletion src/data/pokemon/form_species_tables.h
Original file line number Diff line number Diff line change
Expand Up @@ -2161,6 +2161,12 @@ static const u16 sOgerponFormSpeciesIdTable[] = {
SPECIES_OGERPON_WELLSPRING_MASK,
SPECIES_OGERPON_HEARTHFLAME_MASK,
SPECIES_OGERPON_CORNERSTONE_MASK,
#if P_TERA_FORMS
SPECIES_OGERPON_TEAL_MASK_TERA,
SPECIES_OGERPON_WELLSPRING_MASK_TERA,
SPECIES_OGERPON_HEARTHFLAME_MASK_TERA,
SPECIES_OGERPON_CORNERSTONE_MASK_TERA,
#endif
FORM_SPECIES_END,
};
#endif //P_FAMILY_OGERPON
Expand All @@ -2169,7 +2175,7 @@ static const u16 sOgerponFormSpeciesIdTable[] = {
static const u16 sTerapagosFormSpeciesIdTable[] = {
SPECIES_TERAPAGOS_NORMAL,
SPECIES_TERAPAGOS_TERASTAL,
#if P_TERA_FORMS
#if P_TERA_FORMS
SPECIES_TERAPAGOS_STELLAR,
#endif
FORM_SPECIES_END,
Expand Down
24 changes: 15 additions & 9 deletions src/data/pokemon/species_info/gen_9_families.h
Original file line number Diff line number Diff line change
Expand Up @@ -6256,7 +6256,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] =
#endif //P_FAMILY_FEZANDIPITI

#if P_FAMILY_OGERPON
#define OGERPON_SPECIES_INFO(Form, type, ability, color, iconpalette) \
#define OGERPON_SPECIES_INFO(Form, type, ability, color, iconpalette, isteraform) \
kittenchilly marked this conversation as resolved.
Show resolved Hide resolved
{ \
.baseHP = 80, \
.baseAttack = 120, \
Expand All @@ -6265,6 +6265,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] =
.baseSpAttack = 60, \
.baseSpDefense = 96, \
.types = MON_TYPES(TYPE_GRASS, type), \
.forceTeraType = type, \
.catchRate = 5, \
.expYield = 275, \
.evYield_Attack = 3, \
Expand Down Expand Up @@ -6305,17 +6306,18 @@ const struct SpeciesInfo gSpeciesInfoGen9[] =
.formSpeciesIdTable = sOgerponFormSpeciesIdTable, \
.formChangeTable = sOgerponFormChangeTable, \
.isLegendary = TRUE, \
.isTeraForm = isteraform, \
}

[SPECIES_OGERPON_TEAL_MASK] = OGERPON_SPECIES_INFO(TealMask, TYPE_GRASS, ABILITY_DEFIANT, BODY_COLOR_GREEN, 1),
[SPECIES_OGERPON_WELLSPRING_MASK] = OGERPON_SPECIES_INFO(WellspringMask, TYPE_WATER, ABILITY_WATER_ABSORB, BODY_COLOR_BLUE, 0),
[SPECIES_OGERPON_HEARTHFLAME_MASK] = OGERPON_SPECIES_INFO(HearthflameMask, TYPE_FIRE, ABILITY_MOLD_BREAKER, BODY_COLOR_RED, 0),
[SPECIES_OGERPON_CORNERSTONE_MASK] = OGERPON_SPECIES_INFO(CornerstoneMask, TYPE_ROCK, ABILITY_STURDY, BODY_COLOR_GRAY, 0),
[SPECIES_OGERPON_TEAL_MASK] = OGERPON_SPECIES_INFO(TealMask, TYPE_GRASS, ABILITY_DEFIANT, BODY_COLOR_GREEN, 1, FALSE),
[SPECIES_OGERPON_WELLSPRING_MASK] = OGERPON_SPECIES_INFO(WellspringMask, TYPE_WATER, ABILITY_WATER_ABSORB, BODY_COLOR_BLUE, 0, FALSE),
[SPECIES_OGERPON_HEARTHFLAME_MASK] = OGERPON_SPECIES_INFO(HearthflameMask, TYPE_FIRE, ABILITY_MOLD_BREAKER, BODY_COLOR_RED, 0, FALSE),
[SPECIES_OGERPON_CORNERSTONE_MASK] = OGERPON_SPECIES_INFO(CornerstoneMask, TYPE_ROCK, ABILITY_STURDY, BODY_COLOR_GRAY, 0, FALSE),
#if P_TERA_FORMS
[SPECIES_OGERPON_TEAL_MASK_TERA] = OGERPON_SPECIES_INFO(TealMask, TYPE_GRASS, ABILITY_EMBODY_ASPECT_TEAL, BODY_COLOR_GREEN, 1),
[SPECIES_OGERPON_WELLSPRING_MASK_TERA] = OGERPON_SPECIES_INFO(WellspringMask, TYPE_WATER, ABILITY_EMBODY_ASPECT_WELLSPRING, BODY_COLOR_BLUE, 0),
[SPECIES_OGERPON_HEARTHFLAME_MASK_TERA] = OGERPON_SPECIES_INFO(HearthflameMask, TYPE_FIRE, ABILITY_EMBODY_ASPECT_HEARTHFLAME, BODY_COLOR_RED, 0),
[SPECIES_OGERPON_CORNERSTONE_MASK_TERA] = OGERPON_SPECIES_INFO(CornerstoneMask, TYPE_ROCK, ABILITY_EMBODY_ASPECT_CORNERSTONE, BODY_COLOR_GRAY, 0),
[SPECIES_OGERPON_TEAL_MASK_TERA] = OGERPON_SPECIES_INFO(TealMask, TYPE_GRASS, ABILITY_EMBODY_ASPECT_TEAL, BODY_COLOR_GREEN, 1, TRUE),
[SPECIES_OGERPON_WELLSPRING_MASK_TERA] = OGERPON_SPECIES_INFO(WellspringMask, TYPE_WATER, ABILITY_EMBODY_ASPECT_WELLSPRING, BODY_COLOR_BLUE, 0, TRUE),
[SPECIES_OGERPON_HEARTHFLAME_MASK_TERA] = OGERPON_SPECIES_INFO(HearthflameMask, TYPE_FIRE, ABILITY_EMBODY_ASPECT_HEARTHFLAME, BODY_COLOR_RED, 0, TRUE),
[SPECIES_OGERPON_CORNERSTONE_MASK_TERA] = OGERPON_SPECIES_INFO(CornerstoneMask, TYPE_ROCK, ABILITY_EMBODY_ASPECT_CORNERSTONE, BODY_COLOR_GRAY, 0, TRUE),
#endif //P_TERA_FORMS

#endif //P_FAMILY_OGERPON
Expand Down Expand Up @@ -6549,6 +6551,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] =
.baseSpAttack = 65,
.baseSpDefense = 85,
.types = MON_TYPES(TYPE_NORMAL),
.forceTeraType = TYPE_STELLAR,
.catchRate = 255,
.expYield = 90,
.evYield_Defense = 1,
Expand Down Expand Up @@ -6604,6 +6607,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] =
.baseSpAttack = 105,
.baseSpDefense = 110,
.types = MON_TYPES(TYPE_NORMAL),
.forceTeraType = TYPE_STELLAR,
.catchRate = 255,
.expYield = 120,
.evYield_Defense = 2,
Expand Down Expand Up @@ -6660,6 +6664,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] =
.baseSpAttack = 130,
.baseSpDefense = 110,
.types = MON_TYPES(TYPE_NORMAL),
.forceTeraType = TYPE_STELLAR,
.catchRate = 255,
.expYield = 140,
.evYield_HP = 3,
Expand Down Expand Up @@ -6700,6 +6705,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] =
.iconPalIndex = 0,
//FOOTPRINT(Terapagos)
.isLegendary = TRUE,
.isTeraForm = TRUE,
.levelUpLearnset = sTerapagosLevelUpLearnset,
.teachableLearnset = sTerapagosTeachableLearnset,
.formSpeciesIdTable = sTerapagosFormSpeciesIdTable,
Expand Down
Loading
Loading