Add hopefully support for Cherrim

This commit is contained in:
DizzyEggg 2019-06-15 14:46:35 +02:00
parent aaea5398f4
commit c80861d85e
4 changed files with 56 additions and 45 deletions

View file

@ -71,7 +71,7 @@ void TryClearRageAndFuryCutter(void);
u8 AtkCanceller_UnableToUseMove(void); u8 AtkCanceller_UnableToUseMove(void);
u8 AtkCanceller_UnableToUseMove2(void); u8 AtkCanceller_UnableToUseMove2(void);
bool8 HasNoMonsToSwitch(u8 battlerId, u8 r1, u8 r2); bool8 HasNoMonsToSwitch(u8 battlerId, u8 r1, u8 r2);
u8 CastformDataTypeChange(u8 battlerId); u8 TryWeatherFormChange(u8 battlerId);
bool32 TryChangeBattleWeather(u8 battler, u32 weatherEnumId, bool32 viaAbility); bool32 TryChangeBattleWeather(u8 battler, u32 weatherEnumId, bool32 viaAbility);
u8 AbilityBattleEffects(u8 caseID, u8 battlerId, u8 ability, u8 special, u16 moveArg); u8 AbilityBattleEffects(u8 caseID, u8 battlerId, u8 ability, u8 special, u16 moveArg);
u32 GetBattlerAbility(u8 battlerId); u32 GetBattlerAbility(u8 battlerId);

View file

@ -23,6 +23,7 @@
#include "palette.h" #include "palette.h"
#include "contest.h" #include "contest.h"
#include "constants/songs.h" #include "constants/songs.h"
#include "constants/battle_config.h"
#include "constants/rgb.h" #include "constants/rgb.h"
extern struct MusicPlayerInfo gMPlayInfo_SE1; extern struct MusicPlayerInfo gMPlayInfo_SE1;
@ -557,7 +558,7 @@ static void BattleLoadMonSpriteGfx(struct Pokemon *mon, u32 battlerId, bool32 op
LoadPalette(gDecompressionBuffer, paletteOffset, 0x20); LoadPalette(gDecompressionBuffer, paletteOffset, 0x20);
LoadPalette(gDecompressionBuffer, 0x80 + battlerId * 16, 0x20); LoadPalette(gDecompressionBuffer, 0x80 + battlerId * 16, 0x20);
if (species == SPECIES_CASTFORM) if (species == SPECIES_CASTFORM || species == SPECIES_CHERRIM)
{ {
paletteOffset = 0x100 + battlerId * 16; paletteOffset = 0x100 + battlerId * 16;
LZDecompressWram(lzPaletteData, gBattleStruct->castformPalette[0]); LZDecompressWram(lzPaletteData, gBattleStruct->castformPalette[0]);
@ -876,7 +877,7 @@ void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, bool8 notTransform
LZDecompressWram(lzPaletteData, gDecompressionBuffer); LZDecompressWram(lzPaletteData, gDecompressionBuffer);
LoadPalette(gDecompressionBuffer, paletteOffset, 32); LoadPalette(gDecompressionBuffer, paletteOffset, 32);
if (targetSpecies == SPECIES_CASTFORM) if (targetSpecies == SPECIES_CASTFORM || targetSpecies == SPECIES_CHERRIM)
{ {
gSprites[gBattlerSpriteIds[battlerAtk]].anims = gMonFrontAnimsPtrTable[targetSpecies]; gSprites[gBattlerSpriteIds[battlerAtk]].anims = gMonFrontAnimsPtrTable[targetSpecies];
LZDecompressWram(lzPaletteData, gBattleStruct->castformPalette[0]); LZDecompressWram(lzPaletteData, gBattleStruct->castformPalette[0]);

View file

@ -10864,7 +10864,7 @@ static void atkE7_trycastformdatachange(void)
u8 form; u8 form;
gBattlescriptCurrInstr++; gBattlescriptCurrInstr++;
form = CastformDataTypeChange(gBattleScripting.battler); form = TryWeatherFormChange(gBattleScripting.battler);
if (form) if (form)
{ {
BattleScriptPushCursorAndCallback(BattleScript_CastformChange); BattleScriptPushCursorAndCallback(BattleScript_CastformChange);

View file

@ -2578,50 +2578,59 @@ bool8 HasNoMonsToSwitch(u8 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2)
} }
} }
enum u8 TryWeatherFormChange(u8 battler)
{ {
CASTFORM_NO_CHANGE, //0 u8 ret = 0;
CASTFORM_TO_NORMAL, //1 bool32 weatherEffect = WEATHER_HAS_EFFECT;
CASTFORM_TO_FIRE, //2
CASTFORM_TO_WATER, //3
CASTFORM_TO_ICE, //4
};
u8 CastformDataTypeChange(u8 battler) if (gBattleMons[battler].species == SPECIES_CASTFORM)
{
u8 formChange = 0;
if (gBattleMons[battler].species != SPECIES_CASTFORM || gBattleMons[battler].ability != ABILITY_FORECAST || gBattleMons[battler].hp == 0)
return CASTFORM_NO_CHANGE;
if (!WEATHER_HAS_EFFECT && !IS_BATTLER_OF_TYPE(battler, TYPE_NORMAL))
{ {
SET_BATTLER_TYPE(battler, TYPE_NORMAL); if (gBattleMons[battler].ability != ABILITY_FORECAST || gBattleMons[battler].hp == 0)
return CASTFORM_TO_NORMAL; {
ret = 0;
}
else if (!weatherEffect && !IS_BATTLER_OF_TYPE(battler, TYPE_NORMAL))
{
SET_BATTLER_TYPE(battler, TYPE_NORMAL);
ret = 1;
}
else if (!weatherEffect)
{
ret = 0;
}
else if (!(gBattleWeather & (WEATHER_RAIN_ANY | WEATHER_SUN_ANY | WEATHER_HAIL_ANY)) && !IS_BATTLER_OF_TYPE(battler, TYPE_NORMAL))
{
SET_BATTLER_TYPE(battler, TYPE_NORMAL);
ret = 1;
}
else if (gBattleWeather & WEATHER_SUN_ANY && !IS_BATTLER_OF_TYPE(battler, TYPE_FIRE))
{
SET_BATTLER_TYPE(battler, TYPE_FIRE);
ret = 2;
}
else if (gBattleWeather & WEATHER_RAIN_ANY && !IS_BATTLER_OF_TYPE(battler, TYPE_WATER))
{
SET_BATTLER_TYPE(battler, TYPE_WATER);
ret = 3;
}
else if (gBattleWeather & WEATHER_HAIL_ANY && !IS_BATTLER_OF_TYPE(battler, TYPE_ICE))
{
SET_BATTLER_TYPE(battler, TYPE_ICE);
ret = 4;
}
} }
if (!WEATHER_HAS_EFFECT) else if (gBattleMons[battler].species == SPECIES_CHERRIM)
return CASTFORM_NO_CHANGE;
if (!(gBattleWeather & (WEATHER_RAIN_ANY | WEATHER_SUN_ANY | WEATHER_HAIL_ANY)) && !IS_BATTLER_OF_TYPE(battler, TYPE_NORMAL))
{ {
SET_BATTLER_TYPE(battler, TYPE_NORMAL); if (gBattleMons[battler].ability != ABILITY_FLOWER_GIFT || gBattleMons[battler].hp == 0)
formChange = CASTFORM_TO_NORMAL; ret = 0;
else if (gBattleMonForms[battler] == 0 && weatherEffect && gBattleWeather & WEATHER_SUN_ANY)
ret = 3;
else if (gBattleMonForms[battler] != 0 && (!weatherEffect || !(gBattleWeather & WEATHER_SUN_ANY)))
ret = 1;
} }
if (gBattleWeather & WEATHER_SUN_ANY && !IS_BATTLER_OF_TYPE(battler, TYPE_FIRE))
{ return ret;
SET_BATTLER_TYPE(battler, TYPE_FIRE);
formChange = CASTFORM_TO_FIRE;
}
if (gBattleWeather & WEATHER_RAIN_ANY && !IS_BATTLER_OF_TYPE(battler, TYPE_WATER))
{
SET_BATTLER_TYPE(battler, TYPE_WATER);
formChange = CASTFORM_TO_WATER;
}
if (gBattleWeather & WEATHER_HAIL_ANY && !IS_BATTLER_OF_TYPE(battler, TYPE_ICE))
{
SET_BATTLER_TYPE(battler, TYPE_ICE);
formChange = CASTFORM_TO_ICE;
}
return formChange;
} }
static const u16 sWeatherFlagsInfo[][3] = static const u16 sWeatherFlagsInfo[][3] =
{ {
[ENUM_WEATHER_RAIN] = {WEATHER_RAIN_TEMPORARY, WEATHER_RAIN_PERMANENT, HOLD_EFFECT_DAMP_ROCK}, [ENUM_WEATHER_RAIN] = {WEATHER_RAIN_TEMPORARY, WEATHER_RAIN_PERMANENT, HOLD_EFFECT_DAMP_ROCK},
@ -2915,7 +2924,8 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA
} }
break; break;
case ABILITY_FORECAST: case ABILITY_FORECAST:
effect = CastformDataTypeChange(battler); case ABILITY_FLOWER_GIFT:
effect = TryWeatherFormChange(battler);
if (effect != 0) if (effect != 0)
{ {
BattleScriptPushCursorAndCallback(BattleScript_CastformChange); BattleScriptPushCursorAndCallback(BattleScript_CastformChange);
@ -2935,7 +2945,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA
// that's a weird choice for a variable, why not use i or battler? // that's a weird choice for a variable, why not use i or battler?
for (target1 = 0; target1 < gBattlersCount; target1++) for (target1 = 0; target1 < gBattlersCount; target1++)
{ {
effect = CastformDataTypeChange(target1); effect = TryWeatherFormChange(target1);
if (effect != 0) if (effect != 0)
{ {
BattleScriptPushCursorAndCallback(BattleScript_CastformChange); BattleScriptPushCursorAndCallback(BattleScript_CastformChange);
@ -3500,9 +3510,9 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA
case ABILITYEFFECT_FORECAST: // 6 case ABILITYEFFECT_FORECAST: // 6
for (battler = 0; battler < gBattlersCount; battler++) for (battler = 0; battler < gBattlersCount; battler++)
{ {
if (gBattleMons[battler].ability == ABILITY_FORECAST) if (gBattleMons[battler].ability == ABILITY_FORECAST || gBattleMons[battler].ability == ABILITY_FLOWER_GIFT)
{ {
effect = CastformDataTypeChange(battler); effect = TryWeatherFormChange(battler);
if (effect) if (effect)
{ {
BattleScriptPushCursorAndCallback(BattleScript_CastformChange); BattleScriptPushCursorAndCallback(BattleScript_CastformChange);