Primal Reversion in Form Change tables
This commit is contained in:
parent
861590f747
commit
0a79390ec0
@ -472,9 +472,6 @@ struct MegaEvolutionData
|
|||||||
bool8 alreadyEvolved[4]; // Array id is used for mon position.
|
bool8 alreadyEvolved[4]; // Array id is used for mon position.
|
||||||
u16 evolvedSpecies[MAX_BATTLERS_COUNT];
|
u16 evolvedSpecies[MAX_BATTLERS_COUNT];
|
||||||
u16 playerEvolvedSpecies;
|
u16 playerEvolvedSpecies;
|
||||||
u8 primalRevertedPartyIds[2]; // As flags using gBitTable;
|
|
||||||
u16 primalRevertedSpecies[MAX_BATTLERS_COUNT];
|
|
||||||
u16 playerPrimalRevertedSpecies;
|
|
||||||
u8 battlerId;
|
u8 battlerId;
|
||||||
bool8 playerSelect;
|
bool8 playerSelect;
|
||||||
u8 triggerSpriteId;
|
u8 triggerSpriteId;
|
||||||
|
|||||||
@ -145,11 +145,12 @@ u16 CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u16 abilit
|
|||||||
u16 GetTypeModifier(u8 atkType, u8 defType);
|
u16 GetTypeModifier(u8 atkType, u8 defType);
|
||||||
s32 GetStealthHazardDamage(u8 hazardType, u8 battlerId);
|
s32 GetStealthHazardDamage(u8 hazardType, u8 battlerId);
|
||||||
u16 GetMegaEvolutionSpecies(u16 preEvoSpecies, u16 heldItemId);
|
u16 GetMegaEvolutionSpecies(u16 preEvoSpecies, u16 heldItemId);
|
||||||
u16 GetPrimalReversionSpecies(u16 preEvoSpecies, u16 heldItemId);
|
u16 GetPrimalReversionSpecies(u16 preSpecies, u16 heldItemId);
|
||||||
u16 GetWishMegaEvolutionSpecies(u16 preEvoSpecies, u16 moveId1, u16 moveId2, u16 moveId3, u16 moveId4);
|
u16 GetWishMegaEvolutionSpecies(u16 preEvoSpecies, u16 moveId1, u16 moveId2, u16 moveId3, u16 moveId4);
|
||||||
bool32 CanMegaEvolve(u8 battlerId);
|
bool32 CanMegaEvolve(u8 battlerId);
|
||||||
void UndoMegaEvolution(u32 monId);
|
void UndoMegaEvolution(u32 monId);
|
||||||
void BattleFormChange(u32 monId, u32 side, u16 method);
|
bool32 IsBattlerPrimalReverted(u8 battlerId);
|
||||||
|
void TryBattleFormChange(u8 battlerId, u16 method);
|
||||||
bool32 DoBattlersShareType(u32 battler1, u32 battler2);
|
bool32 DoBattlersShareType(u32 battler1, u32 battler2);
|
||||||
bool32 CanBattlerGetOrLoseItem(u8 battlerId, u16 itemId);
|
bool32 CanBattlerGetOrLoseItem(u8 battlerId, u16 itemId);
|
||||||
struct Pokemon *GetIllusionMonPtr(u32 battlerId);
|
struct Pokemon *GetIllusionMonPtr(u32 battlerId);
|
||||||
@ -186,6 +187,7 @@ void TryToRevertMimicry(void);
|
|||||||
void RestoreBattlerOriginalTypes(u8 battlerId);
|
void RestoreBattlerOriginalTypes(u8 battlerId);
|
||||||
u32 GetBattlerMoveTargetType(u8 battlerId, u16 move);
|
u32 GetBattlerMoveTargetType(u8 battlerId, u16 move);
|
||||||
bool32 CanTargetBattler(u8 battlerAtk, u8 battlerDef, u16 move);
|
bool32 CanTargetBattler(u8 battlerAtk, u8 battlerDef, u16 move);
|
||||||
|
void RecalcBattlerStats(u32 battler, struct Pokemon *mon);
|
||||||
// Ability checks
|
// Ability checks
|
||||||
bool32 IsRolePlayBannedAbilityAtk(u16 ability);
|
bool32 IsRolePlayBannedAbilityAtk(u16 ability);
|
||||||
bool32 IsRolePlayBannedAbility(u16 ability);
|
bool32 IsRolePlayBannedAbility(u16 ability);
|
||||||
|
|||||||
@ -266,7 +266,6 @@
|
|||||||
// Evolution types
|
// Evolution types
|
||||||
#define EVO_MEGA_EVOLUTION 0xffff // Not an actual evolution, used to temporarily mega evolve in battle.
|
#define EVO_MEGA_EVOLUTION 0xffff // Not an actual evolution, used to temporarily mega evolve in battle.
|
||||||
#define EVO_MOVE_MEGA_EVOLUTION 0xfffe // Mega Evolution that checks for a move instead of held item.
|
#define EVO_MOVE_MEGA_EVOLUTION 0xfffe // Mega Evolution that checks for a move instead of held item.
|
||||||
#define EVO_PRIMAL_REVERSION 0xfffd // Not an actual evolution, used to undergo primal reversion in battle.
|
|
||||||
#define EVO_FRIENDSHIP 1 // Pokémon levels up with friendship ≥ 220
|
#define EVO_FRIENDSHIP 1 // Pokémon levels up with friendship ≥ 220
|
||||||
#define EVO_FRIENDSHIP_DAY 2 // Pokémon levels up during the day with friendship ≥ 220
|
#define EVO_FRIENDSHIP_DAY 2 // Pokémon levels up during the day with friendship ≥ 220
|
||||||
#define EVO_FRIENDSHIP_NIGHT 3 // Pokémon levels up at night with friendship ≥ 220
|
#define EVO_FRIENDSHIP_NIGHT 3 // Pokémon levels up at night with friendship ≥ 220
|
||||||
@ -317,15 +316,16 @@
|
|||||||
#define EVO_MODE_OVERWORLD_SPECIAL 5
|
#define EVO_MODE_OVERWORLD_SPECIAL 5
|
||||||
|
|
||||||
// Form change types
|
// Form change types
|
||||||
#define FORM_CHANGE_END 0
|
#define FORM_CHANGE_END 0 // Form table terminator
|
||||||
#define FORM_CHANGE_ITEM_HOLD 1
|
#define FORM_CHANGE_ITEM_HOLD 1
|
||||||
#define FORM_CHANGE_ITEM_USE 2
|
#define FORM_CHANGE_ITEM_USE 2
|
||||||
#define FORM_CHANGE_MOVE 3
|
#define FORM_CHANGE_MOVE 3 // Todo
|
||||||
#define FORM_CHANGE_WITHDRAW 4
|
#define FORM_CHANGE_WITHDRAW 4 //
|
||||||
#define FORM_CHANGE_BATTLE_BEGIN 5
|
#define FORM_CHANGE_BATTLE_BEGIN 5
|
||||||
#define FORM_CHANGE_BATTLE_SWITCH 6
|
#define FORM_CHANGE_BATTLE_END 6
|
||||||
#define FORM_CHANGE_BATTLE_FAINT 7
|
#define FORM_CHANGE_BATTLE_SWITCH 7
|
||||||
#define FORM_CHANGE_BATTLE_END 8
|
#define FORM_CHANGE_BATTLE_FAINT 8
|
||||||
|
#define FORM_CHANGE_PRIMAL_REVERSION 9
|
||||||
|
|
||||||
#define MON_PIC_WIDTH 64
|
#define MON_PIC_WIDTH 64
|
||||||
#define MON_PIC_HEIGHT 64
|
#define MON_PIC_HEIGHT 64
|
||||||
@ -345,14 +345,15 @@
|
|||||||
#define SPECIES_FLAG_LEGENDARY (1 << 0)
|
#define SPECIES_FLAG_LEGENDARY (1 << 0)
|
||||||
#define SPECIES_FLAG_MYTHICAL (1 << 1)
|
#define SPECIES_FLAG_MYTHICAL (1 << 1)
|
||||||
#define SPECIES_FLAG_MEGA_EVOLUTION (1 << 2)
|
#define SPECIES_FLAG_MEGA_EVOLUTION (1 << 2)
|
||||||
#define SPECIES_FLAG_ULTRA_BEAST (1 << 3)
|
#define SPECIES_FLAG_PRIMAL_REVERSION (1 << 3)
|
||||||
#define SPECIES_FLAG_ALOLAN_FORM (1 << 4)
|
#define SPECIES_FLAG_ULTRA_BEAST (1 << 4)
|
||||||
#define SPECIES_FLAG_GALARIAN_FORM (1 << 5)
|
#define SPECIES_FLAG_ALOLAN_FORM (1 << 5)
|
||||||
#define SPECIES_FLAG_HISUIAN_FORM (1 << 6)
|
#define SPECIES_FLAG_GALARIAN_FORM (1 << 6)
|
||||||
#define SPECIES_FLAG_GENDER_DIFFERENCE (1 << 7)
|
#define SPECIES_FLAG_HISUIAN_FORM (1 << 7)
|
||||||
#define SPECIES_FLAG_ALL_PERFECT_IVS (1 << 8)
|
#define SPECIES_FLAG_GENDER_DIFFERENCE (1 << 8)
|
||||||
#define SPECIES_FLAG_SHINY_LOCKED (1 << 9)
|
#define SPECIES_FLAG_ALL_PERFECT_IVS (1 << 9)
|
||||||
#define SPECIES_FLAG_CANNOT_BE_TRADED (1 << 10)
|
#define SPECIES_FLAG_SHINY_LOCKED (1 << 10)
|
||||||
|
#define SPECIES_FLAG_CANNOT_BE_TRADED (1 << 11)
|
||||||
|
|
||||||
#define LEGENDARY_PERFECT_IV_COUNT 3
|
#define LEGENDARY_PERFECT_IV_COUNT 3
|
||||||
|
|
||||||
|
|||||||
@ -409,6 +409,7 @@ extern const u16 gUnionRoomFacilityClasses[];
|
|||||||
extern const struct SpriteTemplate gBattlerSpriteTemplates[];
|
extern const struct SpriteTemplate gBattlerSpriteTemplates[];
|
||||||
extern const s8 gNatureStatTable[][5];
|
extern const s8 gNatureStatTable[][5];
|
||||||
extern const u16 *const gFormSpeciesIdTables[NUM_SPECIES];
|
extern const u16 *const gFormSpeciesIdTables[NUM_SPECIES];
|
||||||
|
extern const struct FormChange *const gFormChangeTablePointers[NUM_SPECIES];
|
||||||
extern const u32 sExpCandyExperienceTable[];
|
extern const u32 sExpCandyExperienceTable[];
|
||||||
|
|
||||||
void ZeroBoxMonData(struct BoxPokemon *boxMon);
|
void ZeroBoxMonData(struct BoxPokemon *boxMon);
|
||||||
@ -564,6 +565,7 @@ u16 GetFormChangeTargetSpecies(struct Pokemon *mon, u16 method, u32 arg);
|
|||||||
u16 GetFormChangeTargetSpeciesBoxMon(struct BoxPokemon *mon, u16 method, u32 arg);
|
u16 GetFormChangeTargetSpeciesBoxMon(struct BoxPokemon *mon, u16 method, u32 arg);
|
||||||
u16 MonTryLearningNewMoveEvolution(struct Pokemon *mon, bool8 firstMove);
|
u16 MonTryLearningNewMoveEvolution(struct Pokemon *mon, bool8 firstMove);
|
||||||
bool32 ShouldShowFemaleDifferences(u16 species, u32 personality);
|
bool32 ShouldShowFemaleDifferences(u16 species, u32 personality);
|
||||||
|
void TryFormChange(u32 monId, u32 side, u16 method);
|
||||||
void TryToSetBattleFormChangeMoves(struct Pokemon *mon, u16 method);
|
void TryToSetBattleFormChangeMoves(struct Pokemon *mon, u16 method);
|
||||||
u32 GetMonFriendshipScore(struct Pokemon *pokemon);
|
u32 GetMonFriendshipScore(struct Pokemon *pokemon);
|
||||||
|
|
||||||
|
|||||||
@ -871,8 +871,8 @@ u8 CreateBattlerHealthboxSprites(u8 battlerId)
|
|||||||
healthBarSpritePtr->invisible = TRUE;
|
healthBarSpritePtr->invisible = TRUE;
|
||||||
|
|
||||||
// Create mega indicator sprite if is a mega evolved or a primal reverted mon.
|
// Create mega indicator sprite if is a mega evolved or a primal reverted mon.
|
||||||
if (gBattleStruct->mega.evolvedPartyIds[GetBattlerSide(battlerId)] & gBitTable[gBattlerPartyIndexes[battlerId]]
|
if ((gBattleStruct->mega.evolvedPartyIds[GetBattlerSide(battlerId)] & gBitTable[gBattlerPartyIndexes[battlerId]])
|
||||||
|| gBattleStruct->mega.primalRevertedPartyIds[GetBattlerSide(battlerId)] & gBitTable[gBattlerPartyIndexes[battlerId]])
|
|| IsBattlerPrimalReverted(battlerId))
|
||||||
{
|
{
|
||||||
megaIndicatorSpriteId = CreateMegaIndicatorSprite(battlerId, 0);
|
megaIndicatorSpriteId = CreateMegaIndicatorSprite(battlerId, 0);
|
||||||
gSprites[megaIndicatorSpriteId].invisible = TRUE;
|
gSprites[megaIndicatorSpriteId].invisible = TRUE;
|
||||||
@ -979,8 +979,8 @@ void SetHealthboxSpriteVisible(u8 healthboxSpriteId)
|
|||||||
gSprites[healthboxSpriteId].invisible = FALSE;
|
gSprites[healthboxSpriteId].invisible = FALSE;
|
||||||
gSprites[gSprites[healthboxSpriteId].hMain_HealthBarSpriteId].invisible = FALSE;
|
gSprites[gSprites[healthboxSpriteId].hMain_HealthBarSpriteId].invisible = FALSE;
|
||||||
gSprites[gSprites[healthboxSpriteId].oam.affineParam].invisible = FALSE;
|
gSprites[gSprites[healthboxSpriteId].oam.affineParam].invisible = FALSE;
|
||||||
if (gBattleStruct->mega.evolvedPartyIds[GetBattlerSide(battlerId)] & gBitTable[gBattlerPartyIndexes[battlerId]]
|
if ((gBattleStruct->mega.evolvedPartyIds[GetBattlerSide(battlerId)] & gBitTable[gBattlerPartyIndexes[battlerId]])
|
||||||
|| gBattleStruct->mega.primalRevertedPartyIds[GetBattlerSide(battlerId)] & gBitTable[gBattlerPartyIndexes[battlerId]])
|
|| IsBattlerPrimalReverted(battlerId))
|
||||||
{
|
{
|
||||||
u8 spriteId = GetMegaIndicatorSpriteId(healthboxSpriteId);
|
u8 spriteId = GetMegaIndicatorSpriteId(healthboxSpriteId);
|
||||||
if (spriteId != 0xFF)
|
if (spriteId != 0xFF)
|
||||||
@ -1104,8 +1104,8 @@ static void UpdateLvlInHealthbox(u8 healthboxSpriteId, u8 lvl)
|
|||||||
u8 battler = gSprites[healthboxSpriteId].hMain_Battler;
|
u8 battler = gSprites[healthboxSpriteId].hMain_Battler;
|
||||||
|
|
||||||
// Don't print Lv char if mon is mega evolved or primal reverted.
|
// Don't print Lv char if mon is mega evolved or primal reverted.
|
||||||
if (gBattleStruct->mega.evolvedPartyIds[GetBattlerSide(battler)] & gBitTable[gBattlerPartyIndexes[battler]]
|
if ((gBattleStruct->mega.evolvedPartyIds[GetBattlerSide(battler)] & gBitTable[gBattlerPartyIndexes[battler]])
|
||||||
|| gBattleStruct->mega.primalRevertedPartyIds[GetBattlerSide(battler)] & gBitTable[gBattlerPartyIndexes[battler]])
|
|| IsBattlerPrimalReverted(battler))
|
||||||
{
|
{
|
||||||
objVram = ConvertIntToDecimalStringN(text, lvl, STR_CONV_MODE_LEFT_ALIGN, 3);
|
objVram = ConvertIntToDecimalStringN(text, lvl, STR_CONV_MODE_LEFT_ALIGN, 3);
|
||||||
xPos = 5 * (3 - (objVram - (text + 2))) - 1;
|
xPos = 5 * (3 - (objVram - (text + 2))) - 1;
|
||||||
@ -1561,7 +1561,7 @@ u32 CreateMegaIndicatorSprite(u32 battlerId, u32 which)
|
|||||||
LoadSpritePalette(&sSpritePalette_MegaIndicator);
|
LoadSpritePalette(&sSpritePalette_MegaIndicator);
|
||||||
LoadSpriteSheet(&sSpriteSheet_MegaIndicator);
|
LoadSpriteSheet(&sSpriteSheet_MegaIndicator);
|
||||||
}
|
}
|
||||||
else if (gBattleStruct->mega.primalRevertedPartyIds[GetBattlerSide(battlerId)] & gBitTable[gBattlerPartyIndexes[battlerId]])
|
else if (IsBattlerPrimalReverted(battlerId))
|
||||||
{
|
{
|
||||||
if (GET_BASE_SPECIES_ID(gBattleMons[battlerId].species) == SPECIES_GROUDON)
|
if (GET_BASE_SPECIES_ID(gBattleMons[battlerId].species) == SPECIES_GROUDON)
|
||||||
{
|
{
|
||||||
@ -1590,7 +1590,7 @@ u32 CreateMegaIndicatorSprite(u32 battlerId, u32 which)
|
|||||||
{
|
{
|
||||||
spriteId = CreateSpriteAtEnd(&sSpriteTemplate_MegaIndicator, x, y, 0);
|
spriteId = CreateSpriteAtEnd(&sSpriteTemplate_MegaIndicator, x, y, 0);
|
||||||
}
|
}
|
||||||
else if (gBattleStruct->mega.primalRevertedPartyIds[GetBattlerSide(battlerId)] & gBitTable[gBattlerPartyIndexes[battlerId]])
|
else if (IsBattlerPrimalReverted(battlerId))
|
||||||
{
|
{
|
||||||
if (GET_BASE_SPECIES_ID(gBattleMons[battlerId].species) == SPECIES_GROUDON)
|
if (GET_BASE_SPECIES_ID(gBattleMons[battlerId].species) == SPECIES_GROUDON)
|
||||||
spriteId = CreateSpriteAtEnd(&sSpriteTemplate_OmegaIndicator, x, y, 0);
|
spriteId = CreateSpriteAtEnd(&sSpriteTemplate_OmegaIndicator, x, y, 0);
|
||||||
|
|||||||
@ -602,9 +602,9 @@ static void CB2_InitBattleInternal(void)
|
|||||||
for (i = 0; i < PARTY_SIZE; i++)
|
for (i = 0; i < PARTY_SIZE; i++)
|
||||||
{
|
{
|
||||||
// Player's side
|
// Player's side
|
||||||
BattleFormChange(i, B_SIDE_PLAYER, FORM_CHANGE_BATTLE_BEGIN);
|
TryFormChange(i, B_SIDE_PLAYER, FORM_CHANGE_BATTLE_BEGIN);
|
||||||
// Opponent's side
|
// Opponent's side
|
||||||
BattleFormChange(i, B_SIDE_OPPONENT, FORM_CHANGE_BATTLE_BEGIN);
|
TryFormChange(i, B_SIDE_OPPONENT, FORM_CHANGE_BATTLE_BEGIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
gBattleCommunication[MULTIUSE_STATE] = 0;
|
gBattleCommunication[MULTIUSE_STATE] = 0;
|
||||||
@ -3247,7 +3247,7 @@ void FaintClearSetData(void)
|
|||||||
gBattleMons[gActiveBattler].type3 = TYPE_MYSTERY;
|
gBattleMons[gActiveBattler].type3 = TYPE_MYSTERY;
|
||||||
|
|
||||||
Ai_UpdateFaintData(gActiveBattler);
|
Ai_UpdateFaintData(gActiveBattler);
|
||||||
BattleFormChange(gBattlerPartyIndexes[gActiveBattler], GET_BATTLER_SIDE(gActiveBattler), FORM_CHANGE_BATTLE_FAINT);
|
TryFormChange(gBattlerPartyIndexes[gActiveBattler], GET_BATTLER_SIDE(gActiveBattler), FORM_CHANGE_BATTLE_FAINT);
|
||||||
if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
|
if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
|
||||||
UndoMegaEvolution(gBattlerPartyIndexes[gActiveBattler]);
|
UndoMegaEvolution(gBattlerPartyIndexes[gActiveBattler]);
|
||||||
|
|
||||||
@ -3682,18 +3682,12 @@ static void TryDoEventsBeforeFirstTurn(void)
|
|||||||
// Primal Reversion
|
// Primal Reversion
|
||||||
for (i = 0; i < gBattlersCount; i++)
|
for (i = 0; i < gBattlersCount; i++)
|
||||||
{
|
{
|
||||||
if (GetBattlerHoldEffect(i, TRUE) == HOLD_EFFECT_PRIMAL_ORB)
|
if (GetBattlerHoldEffect(i, TRUE) == HOLD_EFFECT_PRIMAL_ORB
|
||||||
|
&& GetPrimalReversionSpecies(gBattleMons[i].species, gBattleMons[i].item) != SPECIES_NONE)
|
||||||
{
|
{
|
||||||
for (j = 0; j < EVOS_PER_MON; j++)
|
gBattlerAttacker = i;
|
||||||
{
|
BattleScriptExecute(BattleScript_PrimalReversion);
|
||||||
if (gEvolutionTable[gBattleMons[i].species][j].targetSpecies != SPECIES_NONE
|
return;
|
||||||
&& gEvolutionTable[gBattleMons[i].species][j].method == EVO_PRIMAL_REVERSION)
|
|
||||||
{
|
|
||||||
gBattlerAttacker = i;
|
|
||||||
BattleScriptExecute(BattleScript_PrimalReversion);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5207,7 +5201,7 @@ static void HandleEndTurn_FinishBattle(void)
|
|||||||
for (i = 0; i < PARTY_SIZE; i++)
|
for (i = 0; i < PARTY_SIZE; i++)
|
||||||
{
|
{
|
||||||
UndoMegaEvolution(i);
|
UndoMegaEvolution(i);
|
||||||
BattleFormChange(i, B_SIDE_PLAYER, FORM_CHANGE_BATTLE_END);
|
TryFormChange(i, B_SIDE_PLAYER, FORM_CHANGE_BATTLE_END);
|
||||||
DoBurmyFormChange(i);
|
DoBurmyFormChange(i);
|
||||||
}
|
}
|
||||||
#if B_RECALCULATE_STATS >= GEN_5
|
#if B_RECALCULATE_STATS >= GEN_5
|
||||||
@ -5221,6 +5215,13 @@ static void HandleEndTurn_FinishBattle(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
// Clear battle mon species to avoid a bug on the next battle that causes
|
||||||
|
// healthboxes loading incorrectly due to it trying to create a Mega Indicator
|
||||||
|
// if the previous battler would've had.
|
||||||
|
for (i = 0; i < MAX_BATTLERS_COUNT; i++)
|
||||||
|
{
|
||||||
|
gBattleMons[i].species = SPECIES_NONE;
|
||||||
|
}
|
||||||
gBattleMainFunc = FreeResetData_ReturnToOvOrDoEvolutions;
|
gBattleMainFunc = FreeResetData_ReturnToOvOrDoEvolutions;
|
||||||
gCB2_AfterEvolution = BattleMainCB2;
|
gCB2_AfterEvolution = BattleMainCB2;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7914,22 +7914,6 @@ u32 IsAbilityStatusProtected(u32 battler)
|
|||||||
|| IsShieldsDownProtected(battler);
|
|| IsShieldsDownProtected(battler);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void RecalcBattlerStats(u32 battler, struct Pokemon *mon)
|
|
||||||
{
|
|
||||||
CalculateMonStats(mon);
|
|
||||||
gBattleMons[battler].level = GetMonData(mon, MON_DATA_LEVEL);
|
|
||||||
gBattleMons[battler].hp = GetMonData(mon, MON_DATA_HP);
|
|
||||||
gBattleMons[battler].maxHP = GetMonData(mon, MON_DATA_MAX_HP);
|
|
||||||
gBattleMons[battler].attack = GetMonData(mon, MON_DATA_ATK);
|
|
||||||
gBattleMons[battler].defense = GetMonData(mon, MON_DATA_DEF);
|
|
||||||
gBattleMons[battler].speed = GetMonData(mon, MON_DATA_SPEED);
|
|
||||||
gBattleMons[battler].spAttack = GetMonData(mon, MON_DATA_SPATK);
|
|
||||||
gBattleMons[battler].spDefense = GetMonData(mon, MON_DATA_SPDEF);
|
|
||||||
gBattleMons[battler].ability = GetMonAbility(mon);
|
|
||||||
gBattleMons[battler].type1 = gBaseStats[gBattleMons[battler].species].type1;
|
|
||||||
gBattleMons[battler].type2 = gBaseStats[gBattleMons[battler].species].type2;
|
|
||||||
}
|
|
||||||
|
|
||||||
static u32 GetHighestStatId(u32 battlerId)
|
static u32 GetHighestStatId(u32 battlerId)
|
||||||
{
|
{
|
||||||
u32 i, highestId = STAT_ATK, highestStat = gBattleMons[battlerId].attack;
|
u32 i, highestId = STAT_ATK, highestStat = gBattleMons[battlerId].attack;
|
||||||
@ -8870,17 +8854,7 @@ static void Cmd_various(void)
|
|||||||
// Change species.
|
// Change species.
|
||||||
if (gBattlescriptCurrInstr[3] == 0)
|
if (gBattlescriptCurrInstr[3] == 0)
|
||||||
{
|
{
|
||||||
u16 primalSpecies;
|
gBattleMons[gActiveBattler].species = GetPrimalReversionSpecies(gBattleMons[gActiveBattler].species, gBattleMons[gActiveBattler].item);
|
||||||
gBattleStruct->mega.primalRevertedSpecies[gActiveBattler] = gBattleMons[gActiveBattler].species;
|
|
||||||
if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_LEFT
|
|
||||||
|| (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_RIGHT && !(gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER))))
|
|
||||||
{
|
|
||||||
gBattleStruct->mega.playerPrimalRevertedSpecies = gBattleStruct->mega.primalRevertedSpecies[gActiveBattler];
|
|
||||||
}
|
|
||||||
// Checks Primal Reversion
|
|
||||||
primalSpecies = GetPrimalReversionSpecies(gBattleStruct->mega.primalRevertedSpecies[gActiveBattler], gBattleMons[gActiveBattler].item);
|
|
||||||
|
|
||||||
gBattleMons[gActiveBattler].species = primalSpecies;
|
|
||||||
PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[gActiveBattler].species);
|
PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[gActiveBattler].species);
|
||||||
|
|
||||||
BtlController_EmitSetMonData(BUFFER_A, REQUEST_SPECIES_BATTLE, gBitTable[gBattlerPartyIndexes[gActiveBattler]], sizeof(gBattleMons[gActiveBattler].species), &gBattleMons[gActiveBattler].species);
|
BtlController_EmitSetMonData(BUFFER_A, REQUEST_SPECIES_BATTLE, gBitTable[gBattlerPartyIndexes[gActiveBattler]], sizeof(gBattleMons[gActiveBattler].species), &gBattleMons[gActiveBattler].species);
|
||||||
@ -8890,7 +8864,6 @@ static void Cmd_various(void)
|
|||||||
else if (gBattlescriptCurrInstr[3] == 1)
|
else if (gBattlescriptCurrInstr[3] == 1)
|
||||||
{
|
{
|
||||||
RecalcBattlerStats(gActiveBattler, mon);
|
RecalcBattlerStats(gActiveBattler, mon);
|
||||||
gBattleStruct->mega.primalRevertedPartyIds[GetBattlerSide(gActiveBattler)] |= gBitTable[gBattlerPartyIndexes[gActiveBattler]];
|
|
||||||
}
|
}
|
||||||
// Update healthbox and elevation.
|
// Update healthbox and elevation.
|
||||||
else
|
else
|
||||||
@ -9606,15 +9579,7 @@ static void Cmd_various(void)
|
|||||||
return;
|
return;
|
||||||
case VARIOUS_JUMP_IF_CANT_REVERT_TO_PRIMAL:
|
case VARIOUS_JUMP_IF_CANT_REVERT_TO_PRIMAL:
|
||||||
{
|
{
|
||||||
bool8 canDoPrimalReversion = FALSE;
|
if (GetPrimalReversionSpecies(gBattleMons[gActiveBattler].species, gBattleMons[gActiveBattler].item) == SPECIES_NONE)
|
||||||
|
|
||||||
for (i = 0; i < EVOS_PER_MON; i++)
|
|
||||||
{
|
|
||||||
if (gEvolutionTable[gBattleMons[gActiveBattler].species][i].method == EVO_PRIMAL_REVERSION
|
|
||||||
&& gEvolutionTable[gBattleMons[gActiveBattler].species][i].param == gBattleMons[gActiveBattler].item)
|
|
||||||
canDoPrimalReversion = TRUE;
|
|
||||||
}
|
|
||||||
if (!canDoPrimalReversion)
|
|
||||||
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3);
|
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3);
|
||||||
else
|
else
|
||||||
gBattlescriptCurrInstr += 7;
|
gBattlescriptCurrInstr += 7;
|
||||||
@ -14109,7 +14074,7 @@ static void Cmd_handleballthrow(void)
|
|||||||
{
|
{
|
||||||
BtlController_EmitBallThrowAnim(BUFFER_A, BALL_3_SHAKES_SUCCESS);
|
BtlController_EmitBallThrowAnim(BUFFER_A, BALL_3_SHAKES_SUCCESS);
|
||||||
MarkBattlerForControllerExec(gActiveBattler);
|
MarkBattlerForControllerExec(gActiveBattler);
|
||||||
BattleFormChange(gBattlerPartyIndexes[gBattlerTarget], GET_BATTLER_SIDE(gBattlerTarget), FORM_CHANGE_BATTLE_END),
|
TryFormChange(gBattlerPartyIndexes[gBattlerTarget], GET_BATTLER_SIDE(gBattlerTarget), FORM_CHANGE_BATTLE_END),
|
||||||
gBattlescriptCurrInstr = BattleScript_SuccessBallThrow;
|
gBattlescriptCurrInstr = BattleScript_SuccessBallThrow;
|
||||||
SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_POKEBALL, &gLastUsedItem);
|
SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_POKEBALL, &gLastUsedItem);
|
||||||
|
|
||||||
@ -14163,7 +14128,7 @@ static void Cmd_handleballthrow(void)
|
|||||||
if (IsCriticalCapture())
|
if (IsCriticalCapture())
|
||||||
gBattleSpritesDataPtr->animationData->criticalCaptureSuccess = TRUE;
|
gBattleSpritesDataPtr->animationData->criticalCaptureSuccess = TRUE;
|
||||||
|
|
||||||
BattleFormChange(gBattlerPartyIndexes[gBattlerTarget], GET_BATTLER_SIDE(gBattlerTarget), FORM_CHANGE_BATTLE_END),
|
TryFormChange(gBattlerPartyIndexes[gBattlerTarget], GET_BATTLER_SIDE(gBattlerTarget), FORM_CHANGE_BATTLE_END),
|
||||||
gBattlescriptCurrInstr = BattleScript_SuccessBallThrow;
|
gBattlescriptCurrInstr = BattleScript_SuccessBallThrow;
|
||||||
SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_POKEBALL, &gLastUsedItem);
|
SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_POKEBALL, &gLastUsedItem);
|
||||||
|
|
||||||
|
|||||||
@ -518,7 +518,7 @@ void HandleAction_Switch(void)
|
|||||||
if (gBattleResults.playerSwitchesCounter < 255)
|
if (gBattleResults.playerSwitchesCounter < 255)
|
||||||
gBattleResults.playerSwitchesCounter++;
|
gBattleResults.playerSwitchesCounter++;
|
||||||
|
|
||||||
BattleFormChange(gBattlerPartyIndexes[gBattlerAttacker], GetBattlerSide(gBattlerAttacker), FORM_CHANGE_BATTLE_SWITCH);
|
TryFormChange(gBattlerPartyIndexes[gBattlerAttacker], GetBattlerSide(gBattlerAttacker), FORM_CHANGE_BATTLE_SWITCH);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HandleAction_UseItem(void)
|
void HandleAction_UseItem(void)
|
||||||
@ -8955,8 +8955,7 @@ static bool32 CanEvolve(u32 species)
|
|||||||
{
|
{
|
||||||
if (gEvolutionTable[species][i].method
|
if (gEvolutionTable[species][i].method
|
||||||
&& gEvolutionTable[species][i].method != EVO_MEGA_EVOLUTION
|
&& gEvolutionTable[species][i].method != EVO_MEGA_EVOLUTION
|
||||||
&& gEvolutionTable[species][i].method != EVO_MOVE_MEGA_EVOLUTION
|
&& gEvolutionTable[species][i].method != EVO_MOVE_MEGA_EVOLUTION)
|
||||||
&& gEvolutionTable[species][i].method != EVO_PRIMAL_REVERSION)
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -9565,15 +9564,20 @@ u16 GetMegaEvolutionSpecies(u16 preEvoSpecies, u16 heldItemId)
|
|||||||
return SPECIES_NONE;
|
return SPECIES_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
u16 GetPrimalReversionSpecies(u16 preEvoSpecies, u16 heldItemId)
|
u16 GetPrimalReversionSpecies(u16 preSpecies, u16 heldItemId)
|
||||||
{
|
{
|
||||||
u32 i;
|
u32 i;
|
||||||
|
const struct FormChange *formChanges = gFormChangeTablePointers[preSpecies];
|
||||||
|
|
||||||
for (i = 0; i < EVOS_PER_MON; i++)
|
if (formChanges != NULL)
|
||||||
{
|
{
|
||||||
if (gEvolutionTable[preEvoSpecies][i].method == EVO_PRIMAL_REVERSION
|
for (i = 0; formChanges[i].method != FORM_CHANGE_END; i++)
|
||||||
&& gEvolutionTable[preEvoSpecies][i].param == heldItemId)
|
{
|
||||||
return gEvolutionTable[preEvoSpecies][i].targetSpecies;
|
if (formChanges[i].method == FORM_CHANGE_PRIMAL_REVERSION
|
||||||
|
&& formChanges[i].param1 == heldItemId
|
||||||
|
&& formChanges[i].targetSpecies != preSpecies)
|
||||||
|
return formChanges[i].targetSpecies;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return SPECIES_NONE;
|
return SPECIES_NONE;
|
||||||
}
|
}
|
||||||
@ -9675,12 +9679,6 @@ void UndoMegaEvolution(u32 monId)
|
|||||||
SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleStruct->mega.playerEvolvedSpecies);
|
SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleStruct->mega.playerEvolvedSpecies);
|
||||||
CalculateMonStats(&gPlayerParty[monId]);
|
CalculateMonStats(&gPlayerParty[monId]);
|
||||||
}
|
}
|
||||||
else if (gBattleStruct->mega.primalRevertedPartyIds[B_SIDE_PLAYER] & gBitTable[monId])
|
|
||||||
{
|
|
||||||
gBattleStruct->mega.primalRevertedPartyIds[B_SIDE_PLAYER] &= ~(gBitTable[monId]);
|
|
||||||
SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &baseSpecies);
|
|
||||||
CalculateMonStats(&gPlayerParty[monId]);
|
|
||||||
}
|
|
||||||
// While not exactly a mega evolution, Zygarde follows the same rules.
|
// While not exactly a mega evolution, Zygarde follows the same rules.
|
||||||
else if (GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, NULL) == SPECIES_ZYGARDE_COMPLETE)
|
else if (GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, NULL) == SPECIES_ZYGARDE_COMPLETE)
|
||||||
{
|
{
|
||||||
@ -9690,17 +9688,23 @@ void UndoMegaEvolution(u32 monId)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BattleFormChange(u32 monId, u32 side, u16 method)
|
bool32 IsBattlerPrimalReverted(u8 battlerId)
|
||||||
{
|
{
|
||||||
u32 targetSpecies;
|
return (gBaseStats[gBattleMons[battlerId].species].flags & SPECIES_FLAG_PRIMAL_REVERSION);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TryBattleFormChange(u8 battlerId, u16 method)
|
||||||
|
{
|
||||||
|
u16 targetSpecies;
|
||||||
|
u8 monId = gBattlerPartyIndexes[battlerId];
|
||||||
|
u8 side = GET_BATTLER_SIDE(battlerId);
|
||||||
struct Pokemon *party = (side == B_SIDE_PLAYER) ? gPlayerParty : gEnemyParty;
|
struct Pokemon *party = (side == B_SIDE_PLAYER) ? gPlayerParty : gEnemyParty;
|
||||||
|
|
||||||
targetSpecies = GetFormChangeTargetSpecies(&party[monId], method, 0);
|
targetSpecies = GetFormChangeTargetSpecies(&party[monId], method, 0);
|
||||||
if (targetSpecies != SPECIES_NONE)
|
if (targetSpecies != SPECIES_NONE)
|
||||||
{
|
{
|
||||||
TryToSetBattleFormChangeMoves(&party[monId], method);
|
|
||||||
SetMonData(&party[monId], MON_DATA_SPECIES, &targetSpecies);
|
SetMonData(&party[monId], MON_DATA_SPECIES, &targetSpecies);
|
||||||
CalculateMonStats(&party[monId]);
|
RecalcBattlerStats(battlerId, &party[monId]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -10362,3 +10366,19 @@ bool32 CanTargetBattler(u8 battlerAtk, u8 battlerDef, u16 move)
|
|||||||
return FALSE; // Pokémon affected by Heal Block cannot target allies with Pollen Puff
|
return FALSE; // Pokémon affected by Heal Block cannot target allies with Pollen Puff
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RecalcBattlerStats(u32 battler, struct Pokemon *mon)
|
||||||
|
{
|
||||||
|
CalculateMonStats(mon);
|
||||||
|
gBattleMons[battler].level = GetMonData(mon, MON_DATA_LEVEL);
|
||||||
|
gBattleMons[battler].hp = GetMonData(mon, MON_DATA_HP);
|
||||||
|
gBattleMons[battler].maxHP = GetMonData(mon, MON_DATA_MAX_HP);
|
||||||
|
gBattleMons[battler].attack = GetMonData(mon, MON_DATA_ATK);
|
||||||
|
gBattleMons[battler].defense = GetMonData(mon, MON_DATA_DEF);
|
||||||
|
gBattleMons[battler].speed = GetMonData(mon, MON_DATA_SPEED);
|
||||||
|
gBattleMons[battler].spAttack = GetMonData(mon, MON_DATA_SPATK);
|
||||||
|
gBattleMons[battler].spDefense = GetMonData(mon, MON_DATA_SPDEF);
|
||||||
|
gBattleMons[battler].ability = GetMonAbility(mon);
|
||||||
|
gBattleMons[battler].type1 = gBaseStats[gBattleMons[battler].species].type1;
|
||||||
|
gBattleMons[battler].type2 = gBaseStats[gBattleMons[battler].species].type2;
|
||||||
|
}
|
||||||
|
|||||||
@ -24117,7 +24117,7 @@ const struct BaseStats gBaseStats[] =
|
|||||||
.abilities = {ABILITY_PRIMORDIAL_SEA, ABILITY_PRIMORDIAL_SEA},
|
.abilities = {ABILITY_PRIMORDIAL_SEA, ABILITY_PRIMORDIAL_SEA},
|
||||||
.bodyColor = BODY_COLOR_BLUE,
|
.bodyColor = BODY_COLOR_BLUE,
|
||||||
.noFlip = FALSE,
|
.noFlip = FALSE,
|
||||||
.flags = SPECIES_FLAG_LEGENDARY,
|
.flags = SPECIES_FLAG_LEGENDARY | SPECIES_FLAG_PRIMAL_REVERSION,
|
||||||
},
|
},
|
||||||
|
|
||||||
[SPECIES_GROUDON_PRIMAL] =
|
[SPECIES_GROUDON_PRIMAL] =
|
||||||
@ -24142,7 +24142,7 @@ const struct BaseStats gBaseStats[] =
|
|||||||
.abilities = {ABILITY_DESOLATE_LAND, ABILITY_DESOLATE_LAND},
|
.abilities = {ABILITY_DESOLATE_LAND, ABILITY_DESOLATE_LAND},
|
||||||
.bodyColor = BODY_COLOR_RED,
|
.bodyColor = BODY_COLOR_RED,
|
||||||
.noFlip = FALSE,
|
.noFlip = FALSE,
|
||||||
.flags = SPECIES_FLAG_LEGENDARY,
|
.flags = SPECIES_FLAG_LEGENDARY | SPECIES_FLAG_PRIMAL_REVERSION,
|
||||||
},
|
},
|
||||||
|
|
||||||
[SPECIES_RATTATA_ALOLAN] =
|
[SPECIES_RATTATA_ALOLAN] =
|
||||||
|
|||||||
@ -293,8 +293,6 @@ const struct Evolution gEvolutionTable[NUM_SPECIES][EVOS_PER_MON] =
|
|||||||
[SPECIES_METAGROSS] = {{EVO_MEGA_EVOLUTION, ITEM_METAGROSSITE, SPECIES_METAGROSS_MEGA}},
|
[SPECIES_METAGROSS] = {{EVO_MEGA_EVOLUTION, ITEM_METAGROSSITE, SPECIES_METAGROSS_MEGA}},
|
||||||
[SPECIES_LATIAS] = {{EVO_MEGA_EVOLUTION, ITEM_LATIASITE, SPECIES_LATIAS_MEGA}},
|
[SPECIES_LATIAS] = {{EVO_MEGA_EVOLUTION, ITEM_LATIASITE, SPECIES_LATIAS_MEGA}},
|
||||||
[SPECIES_LATIOS] = {{EVO_MEGA_EVOLUTION, ITEM_LATIOSITE, SPECIES_LATIOS_MEGA}},
|
[SPECIES_LATIOS] = {{EVO_MEGA_EVOLUTION, ITEM_LATIOSITE, SPECIES_LATIOS_MEGA}},
|
||||||
[SPECIES_KYOGRE] = {{EVO_PRIMAL_REVERSION, ITEM_BLUE_ORB, SPECIES_KYOGRE_PRIMAL}},
|
|
||||||
[SPECIES_GROUDON] = {{EVO_PRIMAL_REVERSION, ITEM_RED_ORB, SPECIES_GROUDON_PRIMAL}},
|
|
||||||
[SPECIES_RAYQUAZA] = {{EVO_MOVE_MEGA_EVOLUTION, MOVE_DRAGON_ASCENT, SPECIES_RAYQUAZA_MEGA}},
|
[SPECIES_RAYQUAZA] = {{EVO_MOVE_MEGA_EVOLUTION, MOVE_DRAGON_ASCENT, SPECIES_RAYQUAZA_MEGA}},
|
||||||
|
|
||||||
#if P_GEN_4_POKEMON == TRUE
|
#if P_GEN_4_POKEMON == TRUE
|
||||||
|
|||||||
@ -1,5 +1,9 @@
|
|||||||
const struct FormChange *const gFormChangeTablePointers[NUM_SPECIES] =
|
const struct FormChange *const gFormChangeTablePointers[NUM_SPECIES] =
|
||||||
{
|
{
|
||||||
|
[SPECIES_KYOGRE] = sKyogreFormChangeTable,
|
||||||
|
[SPECIES_KYOGRE_PRIMAL] = sKyogreFormChangeTable,
|
||||||
|
[SPECIES_GROUDON] = sGroudonFormChangeTable,
|
||||||
|
[SPECIES_GROUDON_PRIMAL] = sGroudonFormChangeTable,
|
||||||
#if P_GEN_4_POKEMON == TRUE
|
#if P_GEN_4_POKEMON == TRUE
|
||||||
[SPECIES_GIRATINA] = sGiratinaFormChangeTable,
|
[SPECIES_GIRATINA] = sGiratinaFormChangeTable,
|
||||||
[SPECIES_GIRATINA_ORIGIN] = sGiratinaFormChangeTable,
|
[SPECIES_GIRATINA_ORIGIN] = sGiratinaFormChangeTable,
|
||||||
|
|||||||
@ -47,6 +47,18 @@ FORM_CHANGE_BATTLE_END:
|
|||||||
#define DAY 1
|
#define DAY 1
|
||||||
#define NIGHT 2
|
#define NIGHT 2
|
||||||
|
|
||||||
|
static const struct FormChange sKyogreFormChangeTable[] = {
|
||||||
|
{FORM_CHANGE_PRIMAL_REVERSION, SPECIES_KYOGRE_PRIMAL, ITEM_BLUE_ORB},
|
||||||
|
{FORM_CHANGE_BATTLE_END, SPECIES_KYOGRE},
|
||||||
|
{FORM_CHANGE_END},
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct FormChange sGroudonFormChangeTable[] = {
|
||||||
|
{FORM_CHANGE_PRIMAL_REVERSION, SPECIES_GROUDON_PRIMAL, ITEM_RED_ORB},
|
||||||
|
{FORM_CHANGE_BATTLE_END, SPECIES_GROUDON},
|
||||||
|
{FORM_CHANGE_END},
|
||||||
|
};
|
||||||
|
|
||||||
#if P_GEN_4_POKEMON == TRUE
|
#if P_GEN_4_POKEMON == TRUE
|
||||||
static const struct FormChange sGiratinaFormChangeTable[] = {
|
static const struct FormChange sGiratinaFormChangeTable[] = {
|
||||||
{FORM_CHANGE_ITEM_HOLD, SPECIES_GIRATINA, ITEM_NONE},
|
{FORM_CHANGE_ITEM_HOLD, SPECIES_GIRATINA, ITEM_NONE},
|
||||||
@ -178,7 +190,7 @@ static const struct FormChange sXerneasFormChangeTable[] = {
|
|||||||
|
|
||||||
static const struct FormChange sHoopaFormChangeTable[] = {
|
static const struct FormChange sHoopaFormChangeTable[] = {
|
||||||
{FORM_CHANGE_ITEM_USE, SPECIES_HOOPA_UNBOUND, ITEM_PRISON_BOTTLE, SPECIES_HOOPA},
|
{FORM_CHANGE_ITEM_USE, SPECIES_HOOPA_UNBOUND, ITEM_PRISON_BOTTLE, SPECIES_HOOPA},
|
||||||
// {FORM_CHANGE_WITHDRAW, SPECIES_HOOPA},
|
{FORM_CHANGE_WITHDRAW, SPECIES_HOOPA},
|
||||||
{FORM_CHANGE_END},
|
{FORM_CHANGE_END},
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -8397,6 +8397,16 @@ u16 GetFormChangeTargetSpeciesBoxMon(struct BoxPokemon *boxMon, u16 method, u32
|
|||||||
case FORM_CHANGE_BATTLE_END:
|
case FORM_CHANGE_BATTLE_END:
|
||||||
if (heldItem == formChanges[i].param1 || formChanges[i].param1 == ITEM_NONE)
|
if (heldItem == formChanges[i].param1 || formChanges[i].param1 == ITEM_NONE)
|
||||||
targetSpecies = formChanges[i].targetSpecies;
|
targetSpecies = formChanges[i].targetSpecies;
|
||||||
|
break;
|
||||||
|
case FORM_CHANGE_PRIMAL_REVERSION:
|
||||||
|
if (arg == formChanges[i].param1)
|
||||||
|
targetSpecies = formChanges[i].targetSpecies;
|
||||||
|
break;
|
||||||
|
case FORM_CHANGE_WITHDRAW:
|
||||||
|
case FORM_CHANGE_BATTLE_SWITCH:
|
||||||
|
case FORM_CHANGE_BATTLE_FAINT:
|
||||||
|
targetSpecies = formChanges[i].targetSpecies;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -8485,13 +8495,28 @@ bool32 ShouldShowFemaleDifferences(u16 species, u32 personality)
|
|||||||
return (gBaseStats[species].flags & SPECIES_FLAG_GENDER_DIFFERENCE) && GetGenderFromSpeciesAndPersonality(species, personality) == MON_FEMALE;
|
return (gBaseStats[species].flags & SPECIES_FLAG_GENDER_DIFFERENCE) && GetGenderFromSpeciesAndPersonality(species, personality) == MON_FEMALE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TryFormChange(u32 monId, u32 side, u16 method)
|
||||||
|
{
|
||||||
|
u32 targetSpecies;
|
||||||
|
struct Pokemon *party = (side == B_SIDE_PLAYER) ? gPlayerParty : gEnemyParty;
|
||||||
|
|
||||||
|
targetSpecies = GetFormChangeTargetSpecies(&party[monId], method, 0);
|
||||||
|
if (targetSpecies != SPECIES_NONE)
|
||||||
|
{
|
||||||
|
TryToSetBattleFormChangeMoves(&party[monId], method);
|
||||||
|
SetMonData(&party[monId], MON_DATA_SPECIES, &targetSpecies);
|
||||||
|
CalculateMonStats(&party[monId]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void TryToSetBattleFormChangeMoves(struct Pokemon *mon, u16 method)
|
void TryToSetBattleFormChangeMoves(struct Pokemon *mon, u16 method)
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL);
|
u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL);
|
||||||
const struct FormChange *formChanges = gFormChangeTablePointers[species];
|
const struct FormChange *formChanges = gFormChangeTablePointers[species];
|
||||||
|
|
||||||
if (formChanges == NULL || (method != FORM_CHANGE_BATTLE_BEGIN && method != FORM_CHANGE_BATTLE_END))
|
if (formChanges == NULL
|
||||||
|
|| (method != FORM_CHANGE_BATTLE_BEGIN && method != FORM_CHANGE_BATTLE_END))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (i = 0; formChanges[i].method != FORM_CHANGE_END; i++)
|
for (i = 0; formChanges[i].method != FORM_CHANGE_END; i++)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user