From b5af343dc4539da467c95acf92aeb92a4f59bdaf Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Thu, 14 Mar 2024 21:20:13 +0100 Subject: [PATCH] Reverts additional move effect macros (#4277) --- include/battle_util.h | 2 +- include/pokemon.h | 12 +++----- src/battle_ai_main.c | 27 +++++++--------- src/battle_ai_util.c | 23 ++++++-------- src/battle_script_commands.c | 21 ++++++------- src/battle_util.c | 60 +++++++++++++++++++++++------------- 6 files changed, 75 insertions(+), 70 deletions(-) diff --git a/include/battle_util.h b/include/battle_util.h index 9ebb2e01e6..8606e7ae0b 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -201,7 +201,7 @@ bool32 IsHealBlockPreventingMove(u32 battler, u32 move); bool32 HasEnoughHpToEatBerry(u32 battler, u32 hpFraction, u32 itemId); bool32 IsPartnerMonFromSameTrainer(u32 battler); u8 GetCategoryBasedOnStats(u32 battler); -bool32 MoveIsAffectedBySheerForce(u16 move); +bool32 MoveIsAffectedBySheerForce(u32 move); bool32 TestIfSheerForceAffected(u32 battler, u16 move); void TryRestoreHeldItems(void); bool32 CanStealItem(u32 battlerStealing, u32 battlerItem, u16 item); diff --git a/include/pokemon.h b/include/pokemon.h index fa2c0f6e06..4baf6a85a1 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -467,7 +467,8 @@ struct MoveInfo u32 strikeCount:4; // Max 15 hits. Defaults to 1 if not set. May apply its effect on each hit. u32 criticalHitStage:2; u32 alwaysCriticalHit:1; - // 14 bits left to complete this word - continues into flags + u32 numAdditionalEffects:2; // limited to 3 - don't want to get too crazy + // 12 bits left to complete this word - continues into flags // Flags u32 makesContact:1; @@ -516,7 +517,7 @@ struct MoveInfo u32 argument; // primary/secondary effects - uintptr_t additionalEffects; + const struct AdditionalEffect *additionalEffects; // contest parameters u8 contestEffect; @@ -526,12 +527,7 @@ struct MoveInfo }; #define EFFECTS_ARR(...) (const struct AdditionalEffect[]) {__VA_ARGS__} -#define ADDITIONAL_EFFECTS(...) ((min(ARRAY_COUNT(EFFECTS_ARR( __VA_ARGS__ )), 15)) << 28) + (uintptr_t)(EFFECTS_ARR( __VA_ARGS__ )) - -// Retrieve a move's additional effects and the count thereof -#define GET_ADDITIONAL_EFFECTS(move) (void *)(gMovesInfo[move].additionalEffects & 0x8FFFFFF) -#define GET_ADDITIONAL_EFFECT_COUNT(move) (gMovesInfo[move].additionalEffects >> 28) -#define GET_ADDITIONAL_EFFECTS_AND_COUNT(move, _count, _effects) u32 _count = GET_ADDITIONAL_EFFECT_COUNT(move); const struct AdditionalEffect *_effects = GET_ADDITIONAL_EFFECTS(move) +#define ADDITIONAL_EFFECTS(...) EFFECTS_ARR( __VA_ARGS__ ), .numAdditionalEffects = ARRAY_COUNT(EFFECTS_ARR( __VA_ARGS__ )) // Just a hack to make a move boosted by Sheer Force despite having no secondary effects affected #define SHEER_FORCE_HACK { .moveEffect = 0, .chance = 100, } diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index c552f446db..6dd50eaaa1 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -3149,9 +3149,6 @@ static u32 AI_CalcMoveScore(u32 battlerAtk, u32 battlerDef, u32 move) u32 movesetIndex = AI_THINKING_STRUCT->movesetIndex; u32 effectiveness = aiData->effectiveness[battlerAtk][battlerDef][movesetIndex]; - // additional effects - GET_ADDITIONAL_EFFECTS_AND_COUNT(move, additionalEffectsCount, additionalEffects); - s32 score = 0; u32 predictedMove = aiData->predictedMoves[battlerDef]; u32 predictedMoveSlot = GetMoveSlot(GetMovesArray(battlerDef), predictedMove); @@ -4381,19 +4378,19 @@ static u32 AI_CalcMoveScore(u32 battlerAtk, u32 battlerDef, u32 move) } // move effect checks // check move additional effects that are likely to happen - for (i = 0; i < additionalEffectsCount; i++) + for (i = 0; i < gMovesInfo[move].numAdditionalEffects; i++) { // Only consider effects with a guaranteed chance to happen - if (!MoveEffectIsGuaranteed(battlerAtk, aiData->abilities[battlerAtk], &additionalEffects[i])) + if (!MoveEffectIsGuaranteed(battlerAtk, aiData->abilities[battlerAtk], &gMovesInfo[move].additionalEffects[i])) continue; // Consider move effects that target self - if (additionalEffects[i].self) + if (gMovesInfo[move].additionalEffects[i].self) { - u32 oneStageStatId = STAT_CHANGE_ATK + additionalEffects[i].moveEffect - MOVE_EFFECT_ATK_PLUS_1; - u32 twoStageStatId = STAT_CHANGE_ATK_2 + additionalEffects[i].moveEffect - MOVE_EFFECT_ATK_PLUS_1; + u32 oneStageStatId = STAT_CHANGE_ATK + gMovesInfo[move].additionalEffects[i].moveEffect - MOVE_EFFECT_ATK_PLUS_1; + u32 twoStageStatId = STAT_CHANGE_ATK_2 + gMovesInfo[move].additionalEffects[i].moveEffect - MOVE_EFFECT_ATK_PLUS_1; - switch (additionalEffects[i].moveEffect) + switch (gMovesInfo[move].additionalEffects[i].moveEffect) { case MOVE_EFFECT_SPD_PLUS_2: case MOVE_EFFECT_SPD_PLUS_1: @@ -4444,7 +4441,7 @@ static u32 AI_CalcMoveScore(u32 battlerAtk, u32 battlerDef, u32 move) } else // consider move effects that hinder the target { - switch (additionalEffects[i].moveEffect) + switch (gMovesInfo[move].additionalEffects[i].moveEffect) { case MOVE_EFFECT_FLINCH: score += ShouldTryToFlinch(battlerAtk, battlerDef, aiData->abilities[battlerAtk], aiData->abilities[battlerDef], move); @@ -4736,10 +4733,9 @@ static s32 AI_SetupFirstTurn(u32 battlerAtk, u32 battlerDef, u32 move, s32 score { // TEMPORARY - should applied to all moves regardless of EFFECT // Consider move effects - GET_ADDITIONAL_EFFECTS_AND_COUNT(move, additionalEffectsCount, additionalEffects); - for (i = 0; i < additionalEffectsCount; i++) + for (i = 0; i < gMovesInfo[move].numAdditionalEffects; i++) { - switch (additionalEffects[i].moveEffect) + switch (gMovesInfo[move].additionalEffects[i].moveEffect) { case MOVE_EFFECT_STEALTH_ROCK: case MOVE_EFFECT_SPIKES: @@ -4793,10 +4789,9 @@ static s32 AI_Risky(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { // TEMPORARY - should applied to all moves regardless of EFFECT // Consider move effects - GET_ADDITIONAL_EFFECTS_AND_COUNT(move, additionalEffectsCount, additionalEffects); - for (i = 0; i < additionalEffectsCount; i++) + for (i = 0; i < gMovesInfo[move].numAdditionalEffects; i++) { - switch (additionalEffects[i].moveEffect) + switch (gMovesInfo[move].additionalEffects[i].moveEffect) { case MOVE_EFFECT_ALL_STATS_UP: if (Random() & 1) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index bf5b250700..5d6e778277 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -596,7 +596,6 @@ static bool32 AI_IsMoveEffectInPlus(u32 battlerAtk, u32 battlerDef, u32 move, s3 u32 i; u32 abilityDef = AI_DATA->abilities[battlerDef]; u32 abilityAtk = AI_DATA->abilities[battlerAtk]; - GET_ADDITIONAL_EFFECTS_AND_COUNT(move, additionalEffectsCount, additionalEffects); switch (gMovesInfo[move].effect) { @@ -611,12 +610,12 @@ static bool32 AI_IsMoveEffectInPlus(u32 battlerAtk, u32 battlerDef, u32 move, s3 } // check ADDITIONAL_EFFECTS - for (i = 0; i < additionalEffectsCount; i++) + for (i = 0; i < gMovesInfo[move].numAdditionalEffects; i++) { // Consider move effects that target self - if (additionalEffects[i].self) + if (gMovesInfo[move].additionalEffects[i].self) { - switch (additionalEffects[i].moveEffect) + switch (gMovesInfo[move].additionalEffects[i].moveEffect) { case MOVE_EFFECT_ATK_PLUS_1: if (BattlerStatCanRise(battlerAtk, abilityAtk, STAT_ATK)) @@ -646,7 +645,7 @@ static bool32 AI_IsMoveEffectInPlus(u32 battlerAtk, u32 battlerDef, u32 move, s3 } else // consider move effects that hinder the target { - switch (additionalEffects[i].moveEffect) + switch (gMovesInfo[move].additionalEffects[i].moveEffect) { case MOVE_EFFECT_POISON: case MOVE_EFFECT_TOXIC: @@ -680,7 +679,7 @@ static bool32 AI_IsMoveEffectInPlus(u32 battlerAtk, u32 battlerDef, u32 move, s3 case MOVE_EFFECT_SP_DEF_MINUS_1: case MOVE_EFFECT_ACC_MINUS_1: case MOVE_EFFECT_EVS_MINUS_1: - if (ShouldLowerStat(battlerDef, abilityDef, STAT_ATK + (additionalEffects[i].moveEffect - MOVE_EFFECT_ATK_MINUS_1)) && noOfHitsToKo != 1) + if (ShouldLowerStat(battlerDef, abilityDef, STAT_ATK + (gMovesInfo[move].additionalEffects[i].moveEffect - MOVE_EFFECT_ATK_MINUS_1)) && noOfHitsToKo != 1) return TRUE; break; case MOVE_EFFECT_ATK_MINUS_2: @@ -690,7 +689,7 @@ static bool32 AI_IsMoveEffectInPlus(u32 battlerAtk, u32 battlerDef, u32 move, s3 case MOVE_EFFECT_SP_DEF_MINUS_2: case MOVE_EFFECT_ACC_MINUS_2: case MOVE_EFFECT_EVS_MINUS_2: - if (ShouldLowerStat(battlerDef, abilityDef, STAT_ATK + (additionalEffects[i].moveEffect - MOVE_EFFECT_ATK_MINUS_2)) && noOfHitsToKo != 1) + if (ShouldLowerStat(battlerDef, abilityDef, STAT_ATK + (gMovesInfo[move].additionalEffects[i].moveEffect - MOVE_EFFECT_ATK_MINUS_1)) && noOfHitsToKo != 1) return TRUE; break; } @@ -721,11 +720,9 @@ static bool32 AI_IsMoveEffectInMinus(u32 battlerAtk, u32 battlerDef, u32 move, s break; default: { - GET_ADDITIONAL_EFFECTS_AND_COUNT(move, additionalEffectsCount, additionalEffects); - - for (i = 0; i < additionalEffectsCount; i++) + for (i = 0; i < gMovesInfo[move].numAdditionalEffects; i++) { - switch (additionalEffects[i].moveEffect) + switch (gMovesInfo[move].additionalEffects[i].moveEffect) { case MOVE_EFFECT_ATK_MINUS_1: case MOVE_EFFECT_DEF_MINUS_1: @@ -737,12 +734,12 @@ static bool32 AI_IsMoveEffectInMinus(u32 battlerAtk, u32 battlerDef, u32 move, s case MOVE_EFFECT_DEF_SPDEF_DOWN: case MOVE_EFFECT_SP_DEF_MINUS_1: case MOVE_EFFECT_SP_DEF_MINUS_2: - if ((additionalEffects[i].self && GetBattlerAbility(battlerAtk) != ABILITY_CONTRARY) + if ((gMovesInfo[move].additionalEffects[i].self && GetBattlerAbility(battlerAtk) != ABILITY_CONTRARY) || (noOfHitsToKo != 1 && abilityDef == ABILITY_CONTRARY && !IsMoldBreakerTypeAbility(abilityAtk))) return TRUE; break; case MOVE_EFFECT_RECHARGE: - return additionalEffects[i].self; + return gMovesInfo[move].additionalEffects[i].self; } } break; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index f70fd9df23..7c51af43be 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3858,21 +3858,21 @@ static void Cmd_setadditionaleffects(void) if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)) { - GET_ADDITIONAL_EFFECTS_AND_COUNT(gCurrentMove, additionalEffectsCount, additionalEffects); - if (additionalEffectsCount > gBattleStruct->additionalEffectsCounter) + if (gMovesInfo[gCurrentMove].numAdditionalEffects > gBattleStruct->additionalEffectsCounter) { - u32 percentChance, i = gBattleStruct->additionalEffectsCounter; + u32 percentChance; + const struct AdditionalEffect *additionalEffect = &gMovesInfo[gCurrentMove].additionalEffects[gBattleStruct->additionalEffectsCounter]; const u8 *currentPtr = gBattlescriptCurrInstr; // Various checks for if this move effect can be applied this turn - if (CanApplyAdditionalEffect(&additionalEffects[i])) + if (CanApplyAdditionalEffect(additionalEffect)) { - percentChance = CalcSecondaryEffectChance(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), &additionalEffects[i]); + percentChance = CalcSecondaryEffectChance(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), additionalEffect); // Activate effect if it's primary (chance == 0) or if RNGesus says so - if ((percentChance == 0) || RandomPercentage(RNG_SECONDARY_EFFECT + (i % 3), percentChance)) + if ((percentChance == 0) || RandomPercentage(RNG_SECONDARY_EFFECT + gBattleStruct->additionalEffectsCounter, percentChance)) { - gBattleScripting.moveEffect = additionalEffects[i].moveEffect | (MOVE_EFFECT_AFFECTS_USER * (additionalEffects[i].self)); + gBattleScripting.moveEffect = additionalEffect->moveEffect | (MOVE_EFFECT_AFFECTS_USER * (additionalEffect->self)); SetMoveEffect( percentChance == 0, // a primary effect @@ -3887,7 +3887,7 @@ static void Cmd_setadditionaleffects(void) // Call setadditionaleffects again in the case of a move with multiple effects gBattleStruct->additionalEffectsCounter++; - if (additionalEffectsCount > gBattleStruct->additionalEffectsCounter) + if (gMovesInfo[gCurrentMove].numAdditionalEffects > gBattleStruct->additionalEffectsCounter) gBattleScripting.moveEffect = MOVE_EFFECT_CONTINUE; else gBattleScripting.moveEffect = gBattleStruct->additionalEffectsCounter = 0; @@ -15756,13 +15756,12 @@ static bool8 CanAbilityPreventStatLoss(u16 abilityDef, bool8 byIntimidate) static bool8 CanBurnHitThaw(u16 move) { u8 i; - GET_ADDITIONAL_EFFECTS_AND_COUNT(move, additionalEffectsCount, additionalEffects); if (B_BURN_HIT_THAW >= GEN_6) { - for (i = 0; i < additionalEffectsCount; i++) + for (i = 0; i < gMovesInfo[move].numAdditionalEffects; i++) { - if (additionalEffects[i].moveEffect == MOVE_EFFECT_BURN) + if (gMovesInfo[move].additionalEffects[i].moveEffect == MOVE_EFFECT_BURN) return TRUE; } } diff --git a/src/battle_util.c b/src/battle_util.c index 41b10b5d1e..523026f8eb 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -11078,35 +11078,41 @@ 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_HAS_MOVE_ADDITIONAL_EFFECT(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 MoveHasAdditionalEffect(u32 move, u32 moveEffect) { - RETURN_HAS_MOVE_ADDITIONAL_EFFECT(moveEffect == moveEffect, self == FALSE) + u32 i; + for (i = 0; i < gMovesInfo[move].numAdditionalEffects; i++) + { + if (gMovesInfo[move].additionalEffects[i].moveEffect == moveEffect + && gMovesInfo[move].additionalEffects[i].self == FALSE) + return TRUE; + } + return FALSE; } bool32 MoveHasAdditionalEffectWithChance(u32 move, u32 moveEffect, u32 chance) { - RETURN_HAS_MOVE_ADDITIONAL_EFFECT(moveEffect == moveEffect, chance == chance) + u32 i; + for (i = 0; i < gMovesInfo[move].numAdditionalEffects; i++) + { + if (gMovesInfo[move].additionalEffects[i].moveEffect == moveEffect + && gMovesInfo[move].additionalEffects[i].chance == chance) + return TRUE; + } + return FALSE; } bool32 MoveHasAdditionalEffectSelf(u32 move, u32 moveEffect) { - RETURN_HAS_MOVE_ADDITIONAL_EFFECT(moveEffect == moveEffect, self == TRUE) + u32 i; + for (i = 0; i < gMovesInfo[move].numAdditionalEffects; i++) + { + if (gMovesInfo[move].additionalEffects[i].moveEffect == moveEffect + && gMovesInfo[move].additionalEffects[i].self == TRUE) + return TRUE; + } + return FALSE; } bool32 MoveHasAdditionalEffectSelfArg(u32 move, u32 moveEffect, u32 argument) @@ -11116,12 +11122,24 @@ bool32 MoveHasAdditionalEffectSelfArg(u32 move, u32 moveEffect, u32 argument) bool32 MoveHasChargeTurnAdditionalEffect(u32 move) { - RETURN_HAS_MOVE_ADDITIONAL_EFFECT(onChargeTurnOnly == TRUE) + u32 i; + for (i = 0; i < gMovesInfo[move].numAdditionalEffects; i++) + { + if (gMovesInfo[move].additionalEffects[i].onChargeTurnOnly) + return TRUE; + } + return FALSE; } -bool32 MoveIsAffectedBySheerForce(u16 move) +bool32 MoveIsAffectedBySheerForce(u32 move) { - RETURN_HAS_MOVE_ADDITIONAL_EFFECT(chance > 0) + u32 i; + for (i = 0; i < gMovesInfo[move].numAdditionalEffects; i++) + { + if (gMovesInfo[move].additionalEffects[i].chance > 0) + return TRUE; + } + return FALSE; } bool8 CanMonParticipateInSkyBattle(struct Pokemon *mon)