From eadf89e6f910b38135ad41efcc84f19c9cbbe2ad Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sun, 11 May 2025 05:36:52 -0400 Subject: [PATCH] Allow different flags for Badge boost (#6805) --- include/config/battle.h | 18 +++++++++++++----- src/battle_main.c | 2 +- src/battle_util.c | 16 +++++++--------- 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/include/config/battle.h b/include/config/battle.h index c03fefc0fc..22f2f38475 100644 --- a/include/config/battle.h +++ b/include/config/battle.h @@ -188,11 +188,19 @@ #define B_SERENE_GRACE_BOOST GEN_LATEST // In Gen5+, Serene Grace boosts the added flinch chance of King's Rock and Razor Fang. // Flag settings -// To use the following features in scripting, replace the 0s with the flag ID you're assigning it to. -// Eg: Replace with FLAG_UNUSED_0x264 so you can use that flag to toggle the feature. +// To use the following features, change the 0 for a flag present in include/constants/flags.h, preferably an unused one. +// Eg: You may rename FLAG_UNUSED_0x264 to a descriptive name and use it below. + +// Badge boost flags +#define B_FLAG_BADGE_BOOST_ATTACK FLAG_BADGE01_GET // If this flag is set and B_BADGE_BOOST == GEN_3, it will multiply the player's Pokémon's Attack by x1.1 +#define B_FLAG_BADGE_BOOST_DEFENSE FLAG_BADGE05_GET // If this flag is set and B_BADGE_BOOST == GEN_3, it will multiply the player's Pokémon's Defense by x1.1 +#define B_FLAG_BADGE_BOOST_SPEED FLAG_BADGE03_GET // If this flag is set and B_BADGE_BOOST == GEN_3, it will multiply the player's Pokémon's Speed by x1.1 +#define B_FLAG_BADGE_BOOST_SPATK FLAG_BADGE07_GET // If this flag is set and B_BADGE_BOOST == GEN_3, it will multiply the player's Pokémon's Sp. Atk by x1.1 +#define B_FLAG_BADGE_BOOST_SPDEF FLAG_BADGE07_GET // If this flag is set and B_BADGE_BOOST == GEN_3, it will multiply the player's Pokémon's Sp. Def by x1.1 +// Other battle flags #define B_FLAG_INVERSE_BATTLE 0 // If this flag is set, the battle's type effectiveness are inversed. For example, fire is super effective against water. #define B_FLAG_FORCE_DOUBLE_WILD 0 // If this flag is set, all land and surfing wild battles will be double battles. -#define B_SMART_WILD_AI_FLAG 0 // If not 0, you can set this flag in a script to enable smart wild pokemon +#define B_SMART_WILD_AI_FLAG 0 // If this flag is set, wild Pokémon will become smart, with all AI flags enabled. #define B_FLAG_NO_BAG_USE 0 // If this flag is set, the ability to use the bag in battle is disabled. #define B_FLAG_NO_CATCHING 0 // If this flag is set, the ability to catch wild Pokémon is disabled. #define B_FLAG_NO_RUNNING 0 // If this flag is set, the ability to escape from wild battles is disabled. Also makes Roar/Whirlwind and Teleport (under Gen8) fail. @@ -203,8 +211,8 @@ #define B_FLAG_SLEEP_CLAUSE 0 // If this flag is set, sleep clause is enabled; if the player / AI has already put a Pokémon on the opponent's side to sleep and it is still sleeping, another one can't be put to sleep. AI requires AI_FLAG_CHECK_BAD_MOVE to understand. // Var Settings -// To use the following features in scripting, replace the 0s with the var ID you're assigning it to. -// Eg: Replace with VAR_UNUSED_0x40F7 so you can use B_VAR_STARTING_STATUS for that feature. +// To use the following features, change the 0 for a var present in include/constants/vars.h, preferably an unused one. +// Eg: You may rename VAR_UNUSED_0x404E to a descriptive name and use it below. #define B_VAR_STARTING_STATUS 0 // If this var has a value, assigning a STATUS_FIELD_xx_TERRAIN to it before battle causes the battle to start with that terrain active. #define B_VAR_STARTING_STATUS_TIMER 0 // If this var has a value greater or equal than 1 field terrains will last that number of turns, otherwise they will last until they're overwritten. #define B_VAR_WILD_AI_FLAGS 0 // If not 0, you can use this var to add to default wild AI flags. NOT usable with flags above (1 << 15) diff --git a/src/battle_main.c b/src/battle_main.c index 2346a2094f..aa90e2b8d5 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4720,7 +4720,7 @@ u32 GetBattlerTotalSpeedStatArgs(u32 battler, u32 ability, enum ItemHoldEffect h // player's badge boost if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_FRONTIER)) - && ShouldGetStatBadgeBoost(FLAG_BADGE03_GET, battler) + && ShouldGetStatBadgeBoost(B_FLAG_BADGE_BOOST_SPEED, battler) && GetBattlerSide(battler) == B_SIDE_PLAYER) { speed = (speed * 110) / 100; diff --git a/src/battle_util.c b/src/battle_util.c index 3150dd9d96..d4a7a7c135 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8919,11 +8919,10 @@ static inline u32 CalcAttackStat(struct DamageCalculationData *damageCalcData, u break; } - // The offensive stats of a Player's Pokémon are boosted by x1.1 (+10%) if they have the 1st badge and 7th badges. - // Having the 1st badge boosts physical attack while having the 7th badge boosts special attack. - if (ShouldGetStatBadgeBoost(FLAG_BADGE01_GET, battlerAtk) && IsBattleMovePhysical(move)) + // The offensive stats of a Player's Pokémon are boosted by x1.1 (+10%) if they have the corresponding flags set (eg. Badges) + if (ShouldGetStatBadgeBoost(B_FLAG_BADGE_BOOST_ATTACK, battlerAtk) && IsBattleMovePhysical(move)) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.1)); - if (ShouldGetStatBadgeBoost(FLAG_BADGE07_GET, battlerAtk) && IsBattleMoveSpecial(move)) + if (ShouldGetStatBadgeBoost(B_FLAG_BADGE_BOOST_SPATK, battlerAtk) && IsBattleMoveSpecial(move)) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.1)); return uq4_12_multiply_by_int_half_down(modifier, atkStat); @@ -9094,11 +9093,10 @@ static inline u32 CalcDefenseStat(struct DamageCalculationData *damageCalcData, if (IS_BATTLER_OF_TYPE(battlerDef, TYPE_ICE) && IsBattlerWeatherAffected(battlerDef, B_WEATHER_SNOW) && usesDefStat) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); - // The defensive stats of a Player's Pokémon are boosted by x1.1 (+10%) if they have the 5th badge and 7th badges. - // Having the 5th badge boosts physical defense while having the 7th badge boosts special defense. - if (ShouldGetStatBadgeBoost(FLAG_BADGE05_GET, battlerDef) && IsBattleMovePhysical(move)) + // The offensive stats of a Player's Pokémon are boosted by x1.1 (+10%) if they have the corresponding flags set (eg. Badges) + if (ShouldGetStatBadgeBoost(B_FLAG_BADGE_BOOST_DEFENSE, battlerDef) && IsBattleMovePhysical(move)) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.1)); - if (ShouldGetStatBadgeBoost(FLAG_BADGE07_GET, battlerDef) && IsBattleMoveSpecial(move)) + if (ShouldGetStatBadgeBoost(B_FLAG_BADGE_BOOST_SPDEF, battlerDef) && IsBattleMoveSpecial(move)) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.1)); return uq4_12_multiply_by_int_half_down(modifier, defStat); @@ -10441,7 +10439,7 @@ bool32 SetIllusionMon(struct Pokemon *mon, u32 battler) bool32 ShouldGetStatBadgeBoost(u16 badgeFlag, u32 battler) { - if (B_BADGE_BOOST == GEN_3) + if (B_BADGE_BOOST == GEN_3 && badgeFlag != 0) { if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_FRONTIER)) return FALSE;