Enum conversion for enum MoveEffects and enum BattleMoveEffects (#7366)

This commit is contained in:
hedara90 2025-07-19 10:28:25 +02:00 committed by GitHub
parent e502c078e8
commit 2f6e1ea6d3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 161 additions and 138 deletions

View File

@ -124,7 +124,7 @@ ARMCC := $(PREFIX)gcc
PATH_ARMCC := PATH="$(PATH)" $(ARMCC)
CC1 := $(shell $(PATH_ARMCC) --print-prog-name=cc1) -quiet
override CFLAGS += -mthumb -mthumb-interwork -O$(O_LEVEL) -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -Wno-pointer-to-int-cast -std=gnu17 -Werror -Wall -Wno-strict-aliasing -Wno-attribute-alias -Woverride-init -Wnonnull
override CFLAGS += -mthumb -mthumb-interwork -O$(O_LEVEL) -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -Wno-pointer-to-int-cast -std=gnu17 -Werror -Wall -Wno-strict-aliasing -Wno-attribute-alias -Woverride-init -Wnonnull -Wenum-conversion
ifneq ($(LTO),0)
ifneq ($(TEST),1)

View File

@ -189,8 +189,8 @@ bool32 ShouldFakeOut(u32 battlerAtk, u32 battlerDef, u32 move);
bool32 HasThawingMove(u32 battler);
bool32 IsStatRaisingEffect(enum BattleMoveEffects effect);
bool32 IsStatLoweringEffect(enum BattleMoveEffects effect);
bool32 IsSelfStatLoweringEffect(enum BattleMoveEffects effect);
bool32 IsSelfStatRaisingEffect(enum BattleMoveEffects effect);
bool32 IsSelfStatLoweringEffect(enum MoveEffects effect);
bool32 IsSelfStatRaisingEffect(enum MoveEffects effect);
bool32 IsSwitchOutEffect(enum BattleMoveEffects effect);
bool32 IsChaseEffect(enum BattleMoveEffects effect);
bool32 IsAttackBoostMoveEffect(enum BattleMoveEffects effect);

View File

@ -389,7 +389,7 @@ enum BattleWeather
#define B_WEATHER_ANY (B_WEATHER_RAIN | B_WEATHER_SANDSTORM | B_WEATHER_SUN | B_WEATHER_HAIL | B_WEATHER_STRONG_WINDS | B_WEATHER_SNOW | B_WEATHER_FOG)
#define B_WEATHER_PRIMAL_ANY (B_WEATHER_RAIN_PRIMAL | B_WEATHER_SUN_PRIMAL | B_WEATHER_STRONG_WINDS)
enum MoveEffects
enum __attribute__((packed)) MoveEffects
{
MOVE_EFFECT_NONE,
MOVE_EFFECT_SLEEP,

View File

@ -1,7 +1,7 @@
#ifndef GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H
#define GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H
enum BattleMoveEffects
enum __attribute__((packed)) BattleMoveEffects
{
EFFECT_PLACEHOLDER,
EFFECT_HIT,

View File

@ -30,7 +30,7 @@ enum SheerForceBoost
struct AdditionalEffect
{
u16 moveEffect;
enum MoveEffects moveEffect;
u8 self:1;
u8 onlyIfTargetRaisedStats:1;
u8 onChargeTurnOnly:1;
@ -67,7 +67,7 @@ struct MoveInfo
{
const u8 *name;
const u8 *description;
u16 effect;
enum BattleMoveEffects effect;
u16 type:5; // Up to 32
enum DamageCategory category:2;
u16 power:9; // up to 511

View File

@ -5164,6 +5164,8 @@ case EFFECT_GUARD_SPLIT:
case MOVE_EFFECT_EVS_PLUS_2:
ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_EVASION));
break;
default:
break;
}
}
else
@ -5207,6 +5209,8 @@ case EFFECT_GUARD_SPLIT:
ADJUST_SCORE(IncreaseStatUpScoreContrary(battlerAtk, battlerDef, STAT_CHANGE_SPEED));
ADJUST_SCORE(IncreaseStatUpScoreContrary(battlerAtk, battlerDef, STAT_CHANGE_SPDEF));
break;
default:
break;
}
}
}
@ -5214,133 +5218,134 @@ case EFFECT_GUARD_SPLIT:
{
switch (additionalEffect->moveEffect)
{
case MOVE_EFFECT_FLINCH:
score += ShouldTryToFlinch(battlerAtk, battlerDef, aiData->abilities[battlerAtk], aiData->abilities[battlerDef], move);
case MOVE_EFFECT_FLINCH:
score += ShouldTryToFlinch(battlerAtk, battlerDef, aiData->abilities[battlerAtk], aiData->abilities[battlerDef], move);
break;
case MOVE_EFFECT_SPD_MINUS_1:
case MOVE_EFFECT_SPD_MINUS_2:
ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, STAT_SPEED));
break;
case MOVE_EFFECT_ATK_MINUS_1:
case MOVE_EFFECT_DEF_MINUS_1:
case MOVE_EFFECT_SP_ATK_MINUS_1:
case MOVE_EFFECT_SP_DEF_MINUS_1:
case MOVE_EFFECT_ACC_MINUS_1:
case MOVE_EFFECT_EVS_MINUS_1:
if (aiData->abilities[battlerDef] != ABILITY_CONTRARY)
ADJUST_SCORE(DECENT_EFFECT);
break;
case MOVE_EFFECT_ATK_MINUS_2:
case MOVE_EFFECT_DEF_MINUS_2:
case MOVE_EFFECT_SP_ATK_MINUS_2:
case MOVE_EFFECT_SP_DEF_MINUS_2:
case MOVE_EFFECT_ACC_MINUS_2:
case MOVE_EFFECT_EVS_MINUS_2:
if (aiData->abilities[battlerDef] != ABILITY_CONTRARY)
ADJUST_SCORE(DECENT_EFFECT);
break;
case MOVE_EFFECT_POISON:
IncreasePoisonScore(battlerAtk, battlerDef, move, &score);
break;
case MOVE_EFFECT_CLEAR_SMOG:
score += AI_TryToClearStats(battlerAtk, battlerDef, FALSE);
break;
case MOVE_EFFECT_BUG_BITE: // And pluck
if (gBattleMons[battlerDef].volatiles.substitute || aiData->abilities[battlerDef] == ABILITY_STICKY_HOLD)
break;
case MOVE_EFFECT_SPD_MINUS_1:
case MOVE_EFFECT_SPD_MINUS_2:
ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, STAT_SPEED));
else if (GetItemPocket(aiData->items[battlerDef]) == POCKET_BERRIES)
ADJUST_SCORE(DECENT_EFFECT);
break;
case MOVE_EFFECT_INCINERATE:
if (gBattleMons[battlerDef].volatiles.substitute || aiData->abilities[battlerDef] == ABILITY_STICKY_HOLD)
break;
case MOVE_EFFECT_ATK_MINUS_1:
case MOVE_EFFECT_DEF_MINUS_1:
case MOVE_EFFECT_SP_ATK_MINUS_1:
case MOVE_EFFECT_SP_DEF_MINUS_1:
case MOVE_EFFECT_ACC_MINUS_1:
case MOVE_EFFECT_EVS_MINUS_1:
if (aiData->abilities[battlerDef] != ABILITY_CONTRARY)
ADJUST_SCORE(DECENT_EFFECT);
break;
case MOVE_EFFECT_ATK_MINUS_2:
case MOVE_EFFECT_DEF_MINUS_2:
case MOVE_EFFECT_SP_ATK_MINUS_2:
case MOVE_EFFECT_SP_DEF_MINUS_2:
case MOVE_EFFECT_ACC_MINUS_2:
case MOVE_EFFECT_EVS_MINUS_2:
if (aiData->abilities[battlerDef] != ABILITY_CONTRARY)
ADJUST_SCORE(DECENT_EFFECT);
break;
case MOVE_EFFECT_POISON:
IncreasePoisonScore(battlerAtk, battlerDef, move, &score);
break;
case MOVE_EFFECT_CLEAR_SMOG:
score += AI_TryToClearStats(battlerAtk, battlerDef, FALSE);
break;
case MOVE_EFFECT_BUG_BITE: // And pluck
if (gBattleMons[battlerDef].volatiles.substitute || aiData->abilities[battlerDef] == ABILITY_STICKY_HOLD)
break;
else if (GetItemPocket(aiData->items[battlerDef]) == POCKET_BERRIES)
ADJUST_SCORE(DECENT_EFFECT);
break;
case MOVE_EFFECT_INCINERATE:
if (gBattleMons[battlerDef].volatiles.substitute || aiData->abilities[battlerDef] == ABILITY_STICKY_HOLD)
break;
else if (GetItemPocket(aiData->items[battlerDef]) == POCKET_BERRIES || aiData->holdEffects[battlerDef] == HOLD_EFFECT_GEMS)
ADJUST_SCORE(DECENT_EFFECT);
break;
case MOVE_EFFECT_STEAL_ITEM:
else if (GetItemPocket(aiData->items[battlerDef]) == POCKET_BERRIES || aiData->holdEffects[battlerDef] == HOLD_EFFECT_GEMS)
ADJUST_SCORE(DECENT_EFFECT);
break;
case MOVE_EFFECT_STEAL_ITEM:
{
bool32 canSteal = FALSE;
if (B_TRAINERS_KNOCK_OFF_ITEMS == TRUE)
canSteal = TRUE;
if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER || IsOnPlayerSide(battlerAtk))
canSteal = TRUE;
if (canSteal && aiData->items[battlerAtk] == ITEM_NONE
&& aiData->items[battlerDef] != ITEM_NONE
&& CanBattlerGetOrLoseItem(battlerDef, aiData->items[battlerDef])
&& CanBattlerGetOrLoseItem(battlerAtk, aiData->items[battlerDef])
&& !HasMoveWithEffect(battlerAtk, EFFECT_ACROBATICS)
&& aiData->abilities[battlerDef] != ABILITY_STICKY_HOLD)
{
bool32 canSteal = FALSE;
if (B_TRAINERS_KNOCK_OFF_ITEMS == TRUE)
canSteal = TRUE;
if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER || IsOnPlayerSide(battlerAtk))
canSteal = TRUE;
if (canSteal && aiData->items[battlerAtk] == ITEM_NONE
&& aiData->items[battlerDef] != ITEM_NONE
&& CanBattlerGetOrLoseItem(battlerDef, aiData->items[battlerDef])
&& CanBattlerGetOrLoseItem(battlerAtk, aiData->items[battlerDef])
&& !HasMoveWithEffect(battlerAtk, EFFECT_ACROBATICS)
&& aiData->abilities[battlerDef] != ABILITY_STICKY_HOLD)
switch (aiData->holdEffects[battlerDef])
{
switch (aiData->holdEffects[battlerDef])
{
case HOLD_EFFECT_NONE:
break;
case HOLD_EFFECT_CHOICE_BAND:
case HOLD_EFFECT_CHOICE_SCARF:
case HOLD_EFFECT_CHOICE_SPECS:
case HOLD_EFFECT_NONE:
break;
case HOLD_EFFECT_CHOICE_BAND:
case HOLD_EFFECT_CHOICE_SCARF:
case HOLD_EFFECT_CHOICE_SPECS:
ADJUST_SCORE(DECENT_EFFECT);
break;
case HOLD_EFFECT_TOXIC_ORB:
if (ShouldPoison(battlerAtk, battlerAtk))
ADJUST_SCORE(DECENT_EFFECT);
break;
case HOLD_EFFECT_TOXIC_ORB:
if (ShouldPoison(battlerAtk, battlerAtk))
ADJUST_SCORE(DECENT_EFFECT);
break;
case HOLD_EFFECT_FLAME_ORB:
if (ShouldBurn(battlerAtk, battlerAtk, aiData->abilities[battlerAtk]))
ADJUST_SCORE(DECENT_EFFECT);
break;
case HOLD_EFFECT_BLACK_SLUDGE:
if (IS_BATTLER_OF_TYPE(battlerAtk, TYPE_POISON))
ADJUST_SCORE(DECENT_EFFECT);
break;
case HOLD_EFFECT_IRON_BALL:
if (HasMoveWithEffect(battlerAtk, EFFECT_FLING))
ADJUST_SCORE(DECENT_EFFECT);
break;
case HOLD_EFFECT_LAGGING_TAIL:
case HOLD_EFFECT_STICKY_BARB:
break;
default:
ADJUST_SCORE(WEAK_EFFECT);
break;
}
break;
case HOLD_EFFECT_FLAME_ORB:
if (ShouldBurn(battlerAtk, battlerAtk, aiData->abilities[battlerAtk]))
ADJUST_SCORE(DECENT_EFFECT);
break;
case HOLD_EFFECT_BLACK_SLUDGE:
if (IS_BATTLER_OF_TYPE(battlerAtk, TYPE_POISON))
ADJUST_SCORE(DECENT_EFFECT);
break;
case HOLD_EFFECT_IRON_BALL:
if (HasMoveWithEffect(battlerAtk, EFFECT_FLING))
ADJUST_SCORE(DECENT_EFFECT);
break;
case HOLD_EFFECT_LAGGING_TAIL:
case HOLD_EFFECT_STICKY_BARB:
break;
default:
ADJUST_SCORE(WEAK_EFFECT);
break;
}
break;
}
break;
case MOVE_EFFECT_STEALTH_ROCK:
case MOVE_EFFECT_SPIKES:
if (AI_ShouldSetUpHazards(battlerAtk, battlerDef, aiData));
{
if (gDisableStructs[battlerAtk].isFirstTurn)
ADJUST_SCORE(BEST_EFFECT);
else
ADJUST_SCORE(DECENT_EFFECT);
}
break;
case MOVE_EFFECT_FEINT:
if (GetMoveEffect(predictedMove) == EFFECT_PROTECT)
ADJUST_SCORE(GOOD_EFFECT);
break;
case MOVE_EFFECT_THROAT_CHOP:
if (IsSoundMove(GetBestDmgMoveFromBattler(battlerDef, battlerAtk, AI_DEFENDING)))
{
if (AI_IsFaster(battlerAtk, battlerDef, move))
ADJUST_SCORE(GOOD_EFFECT);
else
ADJUST_SCORE(DECENT_EFFECT);
}
break;
case MOVE_EFFECT_WRAP:
if (!HasMoveWithEffect(battlerDef, EFFECT_RAPID_SPIN) && ShouldTrap(battlerAtk, battlerDef, move))
}
break;
case MOVE_EFFECT_STEALTH_ROCK:
case MOVE_EFFECT_SPIKES:
if (AI_ShouldSetUpHazards(battlerAtk, battlerDef, aiData));
{
if (gDisableStructs[battlerAtk].isFirstTurn)
ADJUST_SCORE(BEST_EFFECT);
break;
case MOVE_EFFECT_SALT_CURE:
if (IS_BATTLER_OF_TYPE(battlerDef, TYPE_WATER) || IS_BATTLER_OF_TYPE(battlerDef, TYPE_STEEL))
else
ADJUST_SCORE(DECENT_EFFECT);
break;
}
break;
case MOVE_EFFECT_FEINT:
if (GetMoveEffect(predictedMove) == EFFECT_PROTECT)
ADJUST_SCORE(GOOD_EFFECT);
break;
case MOVE_EFFECT_THROAT_CHOP:
if (IsSoundMove(GetBestDmgMoveFromBattler(battlerDef, battlerAtk, AI_DEFENDING)))
{
if (AI_IsFaster(battlerAtk, battlerDef, move))
ADJUST_SCORE(GOOD_EFFECT);
else
ADJUST_SCORE(DECENT_EFFECT);
}
break;
case MOVE_EFFECT_WRAP:
if (!HasMoveWithEffect(battlerDef, EFFECT_RAPID_SPIN) && ShouldTrap(battlerAtk, battlerDef, move))
ADJUST_SCORE(BEST_EFFECT);
break;
case MOVE_EFFECT_SALT_CURE:
if (IS_BATTLER_OF_TYPE(battlerDef, TYPE_WATER) || IS_BATTLER_OF_TYPE(battlerDef, TYPE_STEEL))
ADJUST_SCORE(DECENT_EFFECT);
break;
default:
break;
}
}
}
@ -6092,12 +6097,14 @@ static s32 AI_PredictSwitch(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
{
switch (GetMoveAdditionalEffectById(move, i)->moveEffect)
{
case MOVE_EFFECT_WRAP:
ADJUST_SCORE(AWFUL_EFFECT);
break;
case MOVE_EFFECT_FEINT:
ADJUST_SCORE(WORST_EFFECT);
break;
case MOVE_EFFECT_WRAP:
ADJUST_SCORE(AWFUL_EFFECT);
break;
case MOVE_EFFECT_FEINT:
ADJUST_SCORE(WORST_EFFECT);
break;
default:
break;
}
}

View File

@ -1021,6 +1021,8 @@ static bool32 AI_IsMoveEffectInPlus(u32 battlerAtk, u32 battlerDef, u32 move, s3
return TRUE;
}
break;
default:
break;
}
}
else // consider move effects that hinder the target
@ -1072,6 +1074,8 @@ static bool32 AI_IsMoveEffectInPlus(u32 battlerAtk, u32 battlerDef, u32 move, s3
if (CanLowerStat(battlerAtk, battlerDef, abilityDef, STAT_ATK + (additionalEffect->moveEffect - MOVE_EFFECT_ATK_MINUS_2)) && noOfHitsToKo != 1)
return TRUE;
break;
default:
break;
}
}
}
@ -1148,6 +1152,8 @@ static bool32 AI_IsMoveEffectInMinus(u32 battlerAtk, u32 battlerDef, u32 move, s
|| (noOfHitsToKo != 1 && !(abilityDef == ABILITY_CONTRARY && !DoesBattlerIgnoreAbilityChecks(battlerAtk, abilityAtk, move))))
return TRUE;
break;
default:
break;
}
}
break;
@ -1740,6 +1746,8 @@ bool32 IsHazardMove(u32 move)
{
case MOVE_EFFECT_STEELSURGE:
return TRUE;
default:
break;
}
}
return FALSE;
@ -1768,6 +1776,8 @@ bool32 IsHazardClearingMove(u32 move)
{
case MOVE_EFFECT_DEFOG:
return TRUE;
default:
break;
}
}
@ -2744,7 +2754,7 @@ bool32 IsStatLoweringEffect(enum BattleMoveEffects effect)
}
}
bool32 IsSelfStatLoweringEffect(enum BattleMoveEffects effect)
bool32 IsSelfStatLoweringEffect(enum MoveEffects effect)
{
// Self stat lowering moves like Overheart, Superpower etc.
switch (effect)
@ -2772,7 +2782,7 @@ bool32 IsSelfStatLoweringEffect(enum BattleMoveEffects effect)
}
}
bool32 IsSelfStatRaisingEffect(enum BattleMoveEffects effect)
bool32 IsSelfStatRaisingEffect(enum MoveEffects effect)
{
// Self stat lowering moves like Power Up Punch or Charge Beam
switch (effect)
@ -2872,6 +2882,8 @@ static inline bool32 IsMoveSleepClauseTrigger(u32 move)
case MOVE_EFFECT_EFFECT_SPORE_SIDE:
case MOVE_EFFECT_YAWN_FOE:
return TRUE;
default:
break;
}
}
return FALSE;
@ -4318,12 +4330,14 @@ bool32 HasMoveThatChangesKOThreshold(u32 battlerId, u32 noOfHitsToFaint, u32 aiI
switch (gMovesInfo[moves[i]].additionalEffects[i].moveEffect)
{
case MOVE_EFFECT_SPD_MINUS_1:
case MOVE_EFFECT_SPD_MINUS_2:
{
if(aiIsFaster)
return TRUE;
}
case MOVE_EFFECT_SPD_MINUS_1:
case MOVE_EFFECT_SPD_MINUS_2:
{
if(aiIsFaster)
return TRUE;
}
default:
break;
}
}
}

View File

@ -867,6 +867,8 @@ static void AddMovePoints(u8 caseId, u16 arg1, u8 arg2, u8 arg3)
if (additionalEffect->self == TRUE && (additionalEffect->chance == 100 || additionalEffect->chance == 0))
baseFromEffect += 2;
break;
default:
break;
}
}