Lunos

Forecasting Castform

May 18th, 2022 (edited)
465
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 4.30 KB | None | 0 0
  1. diff --git a/src/battle_util.c b/src/battle_util.c
  2. index e4b70e02b..e586ebd56 100644
  3. --- a/src/battle_util.c
  4. +++ b/src/battle_util.c
  5. @@ -3995,9 +3995,12 @@ static bool32 TryChangeBattleTerrain(u32 battler, u32 statusFlag, u8 *timer)
  6.  
  7.  static bool32 ShouldChangeFormHpBased(u32 battler)
  8.  {
  9. -    // Ability,     form >, form <=, hp divided
  10. -    static const u16 forms[][4] =
  11. +    // Ability,     form >, form <=, hp divided, extra argument
  12. +    static const u16 forms[][5] =
  13.      {
  14. +        {ABILITY_FORECAST, SPECIES_CASTFORM, SPECIES_CASTFORM_SUNNY, 1, B_WEATHER_SUN},
  15. +        {ABILITY_FORECAST, SPECIES_CASTFORM, SPECIES_CASTFORM_RAINY, 1, B_WEATHER_RAIN},
  16. +        {ABILITY_FORECAST, SPECIES_CASTFORM, SPECIES_CASTFORM_SNOWY, 1, B_WEATHER_HAIL},
  17.          {ABILITY_ZEN_MODE, SPECIES_DARMANITAN, SPECIES_DARMANITAN_ZEN_MODE, 2},
  18.          {ABILITY_SHIELDS_DOWN, SPECIES_MINIOR, SPECIES_MINIOR_CORE_RED, 2},
  19.          {ABILITY_SHIELDS_DOWN, SPECIES_MINIOR_METEOR_BLUE, SPECIES_MINIOR_CORE_BLUE, 2},
  20. @@ -4013,10 +4016,22 @@ static bool32 ShouldChangeFormHpBased(u32 battler)
  21.      };
  22.      u32 i;
  23.      u16 battlerAbility = GetBattlerAbility(battler);
  24. +    u32 currSpecies;
  25. +    struct Pokemon *party = (GetBattlerSide(battler) == B_SIDE_PLAYER) ? gPlayerParty : gEnemyParty;
  26. +    currSpecies = GetMonData(&party[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES, NULL);
  27.  
  28.      for (i = 0; i < ARRAY_COUNT(forms); i++)
  29.      {
  30. -        if (battlerAbility == forms[i][0])
  31. +        if (battlerAbility == forms[i][0] && currSpecies == SPECIES_CASTFORM)
  32. +        {
  33. +            if (gBattleMons[battler].species == forms[i][1]
  34. +                && gBattleWeather & forms[i][4])
  35. +            {
  36. +                gBattleMons[battler].species = forms[i][2];
  37. +                return TRUE;
  38. +            }
  39. +        }
  40. +        else if (battlerAbility == forms[i][0])
  41.          {
  42.              if (gBattleMons[battler].species == forms[i][2]
  43.                  && gBattleMons[battler].hp > gBattleMons[battler].maxHP / forms[i][3])
  44. @@ -4524,6 +4539,12 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
  45.              }
  46.              break;
  47.          case ABILITY_FORECAST:
  48. +            if (ShouldChangeFormHpBased(battler))
  49. +            {
  50. +                BattleScriptPushCursorAndCallback(BattleScript_AttackerFormChangeEnd3);
  51. +                effect++;
  52. +            }
  53. +            break;
  54.          case ABILITY_FLOWER_GIFT:
  55.              effect = TryWeatherFormChange(battler);
  56.              if (effect)
  57. @@ -5602,21 +5623,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
  58.          }
  59.          break;
  60.      case ABILITYEFFECT_FORECAST: // 6
  61. -        for (battler = 0; battler < gBattlersCount; battler++)
  62. -        {
  63. -            u16 battlerAbility = GetBattlerAbility(battler);
  64. -            if (battlerAbility == ABILITY_FORECAST || battlerAbility == ABILITY_FLOWER_GIFT)
  65. -            {
  66. -                effect = TryWeatherFormChange(battler);
  67. -                if (effect)
  68. -                {
  69. -                    BattleScriptPushCursorAndCallback(BattleScript_CastformChange);
  70. -                    gBattleScripting.battler = battler;
  71. -                    gBattleStruct->formToChangeInto = effect - 1;
  72. -                    return effect;
  73. -                }
  74. -            }
  75. -        }
  76.          break;
  77.      case ABILITYEFFECT_SYNCHRONIZE:
  78.          if (gLastUsedAbility == ABILITY_SYNCHRONIZE && (gHitMarker & HITMARKER_SYNCHRONISE_EFFECT))
  79. @@ -9401,7 +9407,9 @@ void UndoFormChange(u32 monId, u32 side, bool32 isSwitchingOut)
  80.      static const u16 species[][3] =
  81.      {
  82.          // Changed Form ID                      Default Form ID               Should change on switch
  83. +        {SPECIES_CASTFORM_SUNNY,                SPECIES_CASTFORM,             FALSE},
  84. +        {SPECIES_CASTFORM_RAINY,                SPECIES_CASTFORM,             FALSE},
  85. +        {SPECIES_CASTFORM_SNOWY,                SPECIES_CASTFORM,             FALSE},
  86.          {SPECIES_MIMIKYU_BUSTED,                SPECIES_MIMIKYU,              FALSE},
  87.          {SPECIES_GRENINJA_ASH,                  SPECIES_GRENINJA_BATTLE_BOND, FALSE},
  88.          {SPECIES_MELOETTA_PIROUETTE,            SPECIES_MELOETTA,             FALSE},
  89.          {SPECIES_AEGISLASH_BLADE,               SPECIES_AEGISLASH,            TRUE},
  90.  
Add Comment
Please, Sign In to add comment