Introduced FORM_BATTLE form changes

For species such as Xerneas and Zacian.
This commit is contained in:
LOuroboros 2022-08-28 11:48:39 -03:00
parent e5288449b4
commit df88317a98
6 changed files with 69 additions and 4 deletions

View File

@ -324,6 +324,8 @@
#define FORM_WITHDRAW 4
#define FORM_ITEM_HOLD_ABILITY 5
#define FORM_ITEM_USE_TIME 6
#define FORM_BATTLE_BEGIN 7
#define FORM_BATTLE_END 8
#define NUM_MALE_LINK_FACILITY_CLASSES 8
#define NUM_FEMALE_LINK_FACILITY_CLASSES 8

View File

@ -481,6 +481,7 @@ void CB2_InitBattle(void)
static void CB2_InitBattleInternal(void)
{
s32 i;
u16 targetSpecies;
SetHBlankCallback(NULL);
SetVBlankCallback(NULL);
@ -571,6 +572,19 @@ static void CB2_InitBattleInternal(void)
for (i = 0; i < PARTY_SIZE; i++)
AdjustFriendship(&gPlayerParty[i], FRIENDSHIP_EVENT_LEAGUE_BATTLE);
// Apply party-wide start-of-battle form changes
for (i = 0; i < PARTY_SIZE; i++)
{
// Player's side
targetSpecies = GetFormChangeTargetSpecies(&gPlayerParty[i], FORM_BATTLE_BEGIN, 0);
if (targetSpecies != SPECIES_NONE)
SetMonData(&gPlayerParty[i], MON_DATA_SPECIES, &targetSpecies);
// Opponent's side
targetSpecies = GetFormChangeTargetSpecies(&gEnemyParty[i], FORM_BATTLE_BEGIN, 0);
if (targetSpecies != SPECIES_NONE)
SetMonData(&gEnemyParty[i], MON_DATA_SPECIES, &targetSpecies);
}
gBattleCommunication[MULTIUSE_STATE] = 0;
}

View File

@ -9588,7 +9588,7 @@ void UndoMegaEvolution(u32 monId)
void UndoFormChange(u32 monId, u32 side, bool32 isSwitchingOut)
{
u32 i, currSpecies;
u32 i, currSpecies, targetSpecies;
struct Pokemon *party = (side == B_SIDE_PLAYER) ? gPlayerParty : gEnemyParty;
static const u16 species[][3] =
{
@ -9622,6 +9622,21 @@ void UndoFormChange(u32 monId, u32 side, bool32 isSwitchingOut)
break;
}
}
if (!isSwitchingOut)
{
// Apply party-wide end-of-battle form changes
for (i = 0; i < PARTY_SIZE; i++)
{
// Player's side
targetSpecies = GetFormChangeTargetSpecies(&gPlayerParty[i], FORM_BATTLE_END, 0);
if (targetSpecies != SPECIES_NONE)
SetMonData(&gPlayerParty[i], MON_DATA_SPECIES, &targetSpecies);
// Opponent's side
targetSpecies = GetFormChangeTargetSpecies(&gEnemyParty[i], FORM_BATTLE_END, 0);
if (targetSpecies != SPECIES_NONE)
SetMonData(&gEnemyParty[i], MON_DATA_SPECIES, &targetSpecies);
}
}
}
bool32 DoBattlersShareType(u32 battler1, u32 battler2)

View File

@ -31,11 +31,13 @@ const struct FormChange *const gFormChangeTablePointers[NUM_SPECIES] =
[SPECIES_LANDORUS_THERIAN] = sLandorusTherianFormChangeTable,
[SPECIES_KELDEO] = sKeldeoFormChangeTable,
[SPECIES_KELDEO_RESOLUTE] = sKeldeoResoluteFormChangeTable,
[SPECIES_GENESECT] = sGenesectFormChangeTable,
[SPECIES_GENESECT] = sGenesectFormChangeTable,
[SPECIES_GENESECT_DOUSE_DRIVE] = sGenesectFormChangeTable,
[SPECIES_GENESECT_SHOCK_DRIVE] = sGenesectFormChangeTable,
[SPECIES_GENESECT_BURN_DRIVE] = sGenesectFormChangeTable,
[SPECIES_GENESECT_CHILL_DRIVE] = sGenesectFormChangeTable,
[SPECIES_XERNEAS] = sXerneasFormChangeTable,
[SPECIES_XERNEAS_ACTIVE] = sXerneasFormChangeTable,
[SPECIES_HOOPA] = sHoopaFormChangeTable,
[SPECIES_HOOPA_UNBOUND] = sHoopaUnboundFormChangeTable,
[SPECIES_ORICORIO] = sOricorioFormChangeTable,
@ -60,5 +62,9 @@ const struct FormChange *const gFormChangeTablePointers[NUM_SPECIES] =
[SPECIES_SILVALLY_ROCK] = sSilvallyFormChangeTable,
[SPECIES_SILVALLY_STEEL] = sSilvallyFormChangeTable,
[SPECIES_SILVALLY_WATER] = sSilvallyFormChangeTable,
[SPECIES_ZACIAN] = sZacianFormChangeTable,
[SPECIES_ZACIAN_CROWNED_SWORD] = sZacianFormChangeTable,
[SPECIES_ZAMAZENTA] = sZamazentaFormChangeTable,
[SPECIES_ZAMAZENTA_CROWNED_SHIELD] = sZamazentaFormChangeTable,
#endif
};

View File

@ -33,6 +33,14 @@ FORM_ITEM_USE_TIME:
param1 = item to use
param2 = DAY if form change activates in the daytime
NIGHT if form change activates at nighttime
FORM_BATTLE_BEGIN:
Form change activates when the Pokémon is sent out at the beginning of a battle
param1 = item to hold, optional
FORM_BATTLE_END:
Form change activates at the end of a battle
param1 = item to hold, optional
*/
// FORM_MOVE param2 Arguments
@ -185,5 +193,23 @@ static const struct FormChange sSilvallyFormChangeTable[] = {
};
#endif
static const struct FormChange sXerneasFormChangeTable[] = {
{FORM_BATTLE_BEGIN, SPECIES_XERNEAS_ACTIVE, ITEM_NONE},
{FORM_BATTLE_END, SPECIES_XERNEAS, ITEM_NONE},
{FORM_CHANGE_END},
};
static const struct FormChange sZacianFormChangeTable[] = {
{FORM_BATTLE_BEGIN, SPECIES_ZACIAN_CROWNED_SWORD, ITEM_RUSTED_SWORD},
{FORM_BATTLE_END, SPECIES_ZACIAN, ITEM_RUSTED_SWORD},
{FORM_CHANGE_END},
};
static const struct FormChange sZamazentaFormChangeTable[] = {
{FORM_BATTLE_BEGIN, SPECIES_ZAMAZENTA_CROWNED_SHIELD, ITEM_RUSTED_SHIELD},
{FORM_BATTLE_END, SPECIES_ZAMAZENTA, ITEM_RUSTED_SHIELD},
{FORM_CHANGE_END},
};
#undef WHEN_LEARNED
#undef WHEN_FORGOTTEN

View File

@ -8237,13 +8237,13 @@ u8 GetFormIdFromFormSpeciesId(u16 formSpeciesId)
return targetFormId;
}
u16 GetFormChangeTargetSpecies(struct Pokemon *mon, u16 method, u32 arg)
u16 GetFormChangeTargetSpecies(struct Pokemon *mon, u16 method, u32 arg)
{
return GetFormChangeTargetSpeciesBoxMon(&mon->box, method, arg);
}
// Returns SPECIES_NONE if no form change is possible
u16 GetFormChangeTargetSpeciesBoxMon(struct BoxPokemon *mon, u16 method, u32 arg)
u16 GetFormChangeTargetSpeciesBoxMon(struct BoxPokemon *mon, u16 method, u32 arg)
{
u32 i;
u16 targetSpecies = SPECIES_NONE;
@ -8264,6 +8264,8 @@ u16 GetFormChangeTargetSpeciesBoxMon(struct BoxPokemon *mon, u16 method, u32 arg
switch (method)
{
case FORM_ITEM_HOLD:
case FORM_BATTLE_BEGIN:
case FORM_BATTLE_END:
if (heldItem == formChanges[i].param1 || formChanges[i].param1 == ITEM_NONE)
targetSpecies = formChanges[i].targetSpecies;
break;