From 436ef7e59a729d0b3b7d964035c09495a217a3d4 Mon Sep 17 00:00:00 2001 From: Nephrite Date: Fri, 9 Feb 2024 23:01:27 +0900 Subject: [PATCH] Tweaks + RETURN_MOVE_HAS_MOVE_EFFECT_WITH macro Macro makes it easier to build functions that check a move's move effects --- src/battle_util.c | 73 ++++++++++------------------ test/battle/move_effect/upper_hand.c | 4 +- 2 files changed, 27 insertions(+), 50 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index 80e5c6b9fb..f4ae946774 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -10740,20 +10740,6 @@ bool32 IsBattlerAffectedByHazards(u32 battler, bool32 toxicSpikes) return ret; } -bool32 MoveIsAffectedBySheerForce(u16 move) -{ - u32 i; - GET_ADDITIONAL_EFFECTS_AND_COUNT(move, additionalEffectsCount, additionalEffects); - - for (i = 0; i < additionalEffectsCount; i++) - { - if (additionalEffects[i].chance > 0) - return TRUE; - } - - return FALSE; -} - bool32 TestSheerForceFlag(u32 battler, u16 move) { return GetBattlerAbility(battler) == ABILITY_SHEER_FORCE && MoveIsAffectedBySheerForce(move); @@ -11026,43 +11012,35 @@ bool32 IsGen6ExpShareEnabled(void) return FlagGet(I_EXP_SHARE_FLAG); } +#define R_CHECK_MOVE_EFFECT(...) RECURSIVELY(R_FOR_EACH(CHECK_MOVE_EFFECT, __VA_ARGS__)) +#define CHECK_MOVE_EFFECT(_condition) && effects[i]._condition + +/* Quick way of checking if a move has move effects with match a few +comma-separated conditions. Each condition has to check a field of AdditionalEffect. */ +#define RETURN_MOVE_HAS_MOVE_EFFECT_WITH(condition1, ...) \ + u32 i; \ + GET_ADDITIONAL_EFFECTS_AND_COUNT(move, count, effects); \ + for (i = 0; i < count; i++) \ + { \ + if (effects[i].condition1 R_CHECK_MOVE_EFFECT(__VA_ARGS__)) \ + return TRUE; \ + } \ + return FALSE; + + bool32 MoveHasMoveEffect(u32 move, u32 moveEffect) { - u32 i; - GET_ADDITIONAL_EFFECTS_AND_COUNT(move, count, effects); - - for (i = 0; i < count; i++) - { - if (effects[i].moveEffect == moveEffect && effects[i].self == FALSE) - return TRUE; - } - return FALSE; + RETURN_MOVE_HAS_MOVE_EFFECT_WITH(moveEffect == moveEffect, self == FALSE) } bool32 MoveHasMoveEffectWithChance(u32 move, u32 moveEffect, u32 chance) { - u32 i; - GET_ADDITIONAL_EFFECTS_AND_COUNT(move, count, effects); - - for (i = 0; i < count; i++) - { - if (effects[i].moveEffect == moveEffect && effects[i].chance == chance) - return TRUE; - } - return FALSE; + RETURN_MOVE_HAS_MOVE_EFFECT_WITH(moveEffect == moveEffect, chance == chance) } bool32 MoveHasMoveEffectSelf(u32 move, u32 moveEffect) { - u32 i; - GET_ADDITIONAL_EFFECTS_AND_COUNT(move, count, effects); - - for (i = 0; i < count; i++) - { - if (effects[i].moveEffect == moveEffect && effects[i].self == TRUE) - return TRUE; - } - return FALSE; + RETURN_MOVE_HAS_MOVE_EFFECT_WITH(moveEffect == moveEffect, self == TRUE) } bool32 MoveHasMoveEffectSelfArg(u32 move, u32 moveEffect, u32 argument) @@ -11072,13 +11050,12 @@ bool32 MoveHasMoveEffectSelfArg(u32 move, u32 moveEffect, u32 argument) bool32 MoveHasChargeTurnMoveEffect(u32 move) { - u8 i = 0; - for (i = 0; i < gMovesInfo[move].numAdditionalEffects; i++) - { - if (gMovesInfo[move].additionalEffects[i].onChargeTurnOnly) - return TRUE; - } - return FALSE; + RETURN_MOVE_HAS_MOVE_EFFECT_WITH(onChargeTurnOnly == TRUE) +} + +bool32 MoveIsAffectedBySheerForce(u16 move) +{ + RETURN_MOVE_HAS_MOVE_EFFECT_WITH(chance > 0) } bool8 CanMonParticipateInSkyBattle(struct Pokemon *mon) diff --git a/test/battle/move_effect/upper_hand.c b/test/battle/move_effect/upper_hand.c index f93f5d2192..42aaea4a50 100644 --- a/test/battle/move_effect/upper_hand.c +++ b/test/battle/move_effect/upper_hand.c @@ -99,12 +99,12 @@ SINGLE_BATTLE_TEST("Upper Hand fails if the target moves first") } } -SINGLE_BATTLE_TEST("Upper Hand is boosted by Sheer Force") +SINGLE_BATTLE_TEST("Upper Hand is boosted by Sheer Force") // why does this move need a special test? { GIVEN { ASSUME(gMovesInfo[MOVE_EXTREME_SPEED].category == DAMAGE_CATEGORY_PHYSICAL); ASSUME(gMovesInfo[MOVE_EXTREME_SPEED].priority == 2); - ASSUME(gMovesInfo[MOVE_UPPER_HAND].sheerForceBoost == TRUE); + ASSUME(MoveIsAffectedBySheerForce(MOVE_UPPER_HAND) == TRUE); PLAYER(SPECIES_HARIYAMA) { Ability(ABILITY_SHEER_FORCE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN {