From c80861d85ec0b1b48c73f1809946789652c74607 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 15 Jun 2019 14:46:35 +0200 Subject: [PATCH] Add hopefully support for Cherrim --- include/battle_util.h | 2 +- src/battle_gfx_sfx_util.c | 5 +- src/battle_script_commands.c | 2 +- src/battle_util.c | 92 ++++++++++++++++++++---------------- 4 files changed, 56 insertions(+), 45 deletions(-) diff --git a/include/battle_util.h b/include/battle_util.h index e9ad59ca73..3832292617 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -71,7 +71,7 @@ void TryClearRageAndFuryCutter(void); u8 AtkCanceller_UnableToUseMove(void); u8 AtkCanceller_UnableToUseMove2(void); bool8 HasNoMonsToSwitch(u8 battlerId, u8 r1, u8 r2); -u8 CastformDataTypeChange(u8 battlerId); +u8 TryWeatherFormChange(u8 battlerId); bool32 TryChangeBattleWeather(u8 battler, u32 weatherEnumId, bool32 viaAbility); u8 AbilityBattleEffects(u8 caseID, u8 battlerId, u8 ability, u8 special, u16 moveArg); u32 GetBattlerAbility(u8 battlerId); diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index 339974701d..5cb15671d1 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -23,6 +23,7 @@ #include "palette.h" #include "contest.h" #include "constants/songs.h" +#include "constants/battle_config.h" #include "constants/rgb.h" 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, 0x80 + battlerId * 16, 0x20); - if (species == SPECIES_CASTFORM) + if (species == SPECIES_CASTFORM || species == SPECIES_CHERRIM) { paletteOffset = 0x100 + battlerId * 16; LZDecompressWram(lzPaletteData, gBattleStruct->castformPalette[0]); @@ -876,7 +877,7 @@ void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, bool8 notTransform LZDecompressWram(lzPaletteData, gDecompressionBuffer); LoadPalette(gDecompressionBuffer, paletteOffset, 32); - if (targetSpecies == SPECIES_CASTFORM) + if (targetSpecies == SPECIES_CASTFORM || targetSpecies == SPECIES_CHERRIM) { gSprites[gBattlerSpriteIds[battlerAtk]].anims = gMonFrontAnimsPtrTable[targetSpecies]; LZDecompressWram(lzPaletteData, gBattleStruct->castformPalette[0]); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 12c207314f..51f924e24c 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -10864,7 +10864,7 @@ static void atkE7_trycastformdatachange(void) u8 form; gBattlescriptCurrInstr++; - form = CastformDataTypeChange(gBattleScripting.battler); + form = TryWeatherFormChange(gBattleScripting.battler); if (form) { BattleScriptPushCursorAndCallback(BattleScript_CastformChange); diff --git a/src/battle_util.c b/src/battle_util.c index 8846286387..3ebe46e01d 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2578,50 +2578,59 @@ bool8 HasNoMonsToSwitch(u8 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2) } } -enum +u8 TryWeatherFormChange(u8 battler) { - CASTFORM_NO_CHANGE, //0 - CASTFORM_TO_NORMAL, //1 - CASTFORM_TO_FIRE, //2 - CASTFORM_TO_WATER, //3 - CASTFORM_TO_ICE, //4 -}; + u8 ret = 0; + bool32 weatherEffect = WEATHER_HAS_EFFECT; -u8 CastformDataTypeChange(u8 battler) -{ - 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)) + if (gBattleMons[battler].species == SPECIES_CASTFORM) { - SET_BATTLER_TYPE(battler, TYPE_NORMAL); - return CASTFORM_TO_NORMAL; + if (gBattleMons[battler].ability != ABILITY_FORECAST || gBattleMons[battler].hp == 0) + { + 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) - return CASTFORM_NO_CHANGE; - if (!(gBattleWeather & (WEATHER_RAIN_ANY | WEATHER_SUN_ANY | WEATHER_HAIL_ANY)) && !IS_BATTLER_OF_TYPE(battler, TYPE_NORMAL)) + else if (gBattleMons[battler].species == SPECIES_CHERRIM) { - SET_BATTLER_TYPE(battler, TYPE_NORMAL); - formChange = CASTFORM_TO_NORMAL; + if (gBattleMons[battler].ability != ABILITY_FLOWER_GIFT || gBattleMons[battler].hp == 0) + 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)) - { - 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; + + return ret; } - static const u16 sWeatherFlagsInfo[][3] = { [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; case ABILITY_FORECAST: - effect = CastformDataTypeChange(battler); + case ABILITY_FLOWER_GIFT: + effect = TryWeatherFormChange(battler); if (effect != 0) { 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? for (target1 = 0; target1 < gBattlersCount; target1++) { - effect = CastformDataTypeChange(target1); + effect = TryWeatherFormChange(target1); if (effect != 0) { BattleScriptPushCursorAndCallback(BattleScript_CastformChange); @@ -3500,9 +3510,9 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA case ABILITYEFFECT_FORECAST: // 6 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) { BattleScriptPushCursorAndCallback(BattleScript_CastformChange);