From ba4652405351a99ec2e2b4fac662619b54063212 Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Fri, 21 Feb 2025 04:01:52 -0500 Subject: [PATCH 01/14] Big Root AI Fix (#6309) --- src/battle_ai_main.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index d65a5eaeaf21..bcdd1b9ae3a6 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -3210,6 +3210,12 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_BIG_ROOT && effectiveness >= AI_EFFECTIVENESS_x1) ADJUST_SCORE(DECENT_EFFECT); break; + case EFFECT_DREAM_EATER: + case EFFECT_STRENGTH_SAP: + case EFFECT_AQUA_RING: + if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_BIG_ROOT) + ADJUST_SCORE(DECENT_EFFECT); + break; case EFFECT_EXPLOSION: case EFFECT_MEMENTO: if (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_WILL_SUICIDE && gBattleMons[battlerDef].statStages[STAT_EVASION] < 7) @@ -3431,8 +3437,6 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) case EFFECT_MOONLIGHT: if (ShouldRecover(battlerAtk, battlerDef, move, 50)) ADJUST_SCORE(GOOD_EFFECT); - if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_BIG_ROOT) - ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_TOXIC: case EFFECT_POISON: @@ -3507,7 +3511,8 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) || aiData->abilities[battlerDef] == ABILITY_MAGIC_GUARD) break; ADJUST_SCORE(GOOD_EFFECT); - if (!HasDamagingMove(battlerDef) || IsBattlerTrapped(battlerDef, FALSE)) + if (!HasDamagingMove(battlerDef) || IsBattlerTrapped(battlerDef, FALSE) + || aiData->holdEffects[battlerAtk] == HOLD_EFFECT_BIG_ROOT) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_DO_NOTHING: From 48fc44df3184a43258009b5bf5d8389983a97ba3 Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Fri, 21 Feb 2025 12:11:47 -0500 Subject: [PATCH 02/14] Fix AI hold effect considerations (#6310) --- include/battle_ai_util.h | 1 + src/battle_ai_main.c | 9 +++------ src/battle_ai_switch_items.c | 6 +++--- src/battle_ai_util.c | 25 ++++++++++++++----------- src/battle_util.c | 2 +- 5 files changed, 22 insertions(+), 21 deletions(-) diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index c74cad2e780e..eb8ca35cf8e0 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -213,5 +213,6 @@ bool32 AI_ShouldSetUpHazards(u32 battlerAtk, u32 battlerDef, struct AiLogicData void IncreaseTidyUpScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score); bool32 AI_ShouldSpicyExtract(u32 battlerAtk, u32 battlerAtkPartner, u32 move, struct AiLogicData *aiData); void IncreaseSubstituteMoveScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score); +bool32 IsBattlerItemEnabled(u32 battler); #endif //GUARD_BATTLE_AI_UTIL_H diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index bcdd1b9ae3a6..584d60d4dd2f 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -2216,9 +2216,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } break; case EFFECT_NATURAL_GIFT: - if (aiData->abilities[battlerAtk] == ABILITY_KLUTZ - || gFieldStatuses & STATUS_FIELD_MAGIC_ROOM - || GetPocketByItemId(gBattleMons[battlerAtk].item) != POCKET_BERRIES) + if (!IsBattlerItemEnabled(battlerAtk) || GetPocketByItemId(gBattleMons[battlerAtk].item) != POCKET_BERRIES) ADJUST_SCORE(-10); break; case EFFECT_GRASSY_TERRAIN: @@ -2325,8 +2323,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } break; case EFFECT_EMBARGO: - if (aiData->abilities[battlerDef] == ABILITY_KLUTZ - || gFieldStatuses & STATUS_FIELD_MAGIC_ROOM + if (!IsBattlerItemEnabled(battlerAtk) || gDisableStructs[battlerDef].embargoTimer != 0 || PartnerMoveIsSameAsAttacker(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); @@ -2577,7 +2574,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } // move effect checks // Choice items - if (HOLD_EFFECT_CHOICE(aiData->holdEffects[battlerAtk]) && gBattleMons[battlerAtk].ability != ABILITY_KLUTZ) + if (HOLD_EFFECT_CHOICE(aiData->holdEffects[battlerAtk]) && IsBattlerItemEnabled(battlerAtk)) { // Don't use user-target moves ie. Swords Dance, with exceptions if ((moveTarget & MOVE_TARGET_USER) diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 23d96dedfe2e..e5ff01fab65b 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -854,7 +854,7 @@ static bool32 ShouldSwitchIfBadChoiceLock(u32 battler) { u32 holdEffect = GetBattlerHoldEffect(battler, FALSE); - if (HOLD_EFFECT_CHOICE(holdEffect) && gBattleMons[battler].ability != ABILITY_KLUTZ) + if (HOLD_EFFECT_CHOICE(holdEffect) && IsBattlerItemEnabled(battler)) { if (gMovesInfo[gLastUsedMove].category == DAMAGE_CATEGORY_STATUS) return SetSwitchinAndSwitch(battler, PARTY_SIZE); @@ -1249,10 +1249,10 @@ bool32 IsMonGrounded(u16 heldItemEffect, u32 ability, u8 type1, u8 type2) { // List that makes mon not grounded if (type1 == TYPE_FLYING || type2 == TYPE_FLYING || ability == ABILITY_LEVITATE - || (heldItemEffect == HOLD_EFFECT_AIR_BALLOON && ability != ABILITY_KLUTZ)) + || (heldItemEffect == HOLD_EFFECT_AIR_BALLOON && !(ability == ABILITY_KLUTZ || (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM)))) { // List that overrides being off the ground - if ((heldItemEffect == HOLD_EFFECT_IRON_BALL && ability != ABILITY_KLUTZ) || (gFieldStatuses & STATUS_FIELD_GRAVITY) || (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM)) + if ((heldItemEffect == HOLD_EFFECT_IRON_BALL && !(ability == ABILITY_KLUTZ || (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM))) || (gFieldStatuses & STATUS_FIELD_GRAVITY) || (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM)) return TRUE; else return FALSE; diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index dadf39c61eb5..622426f2bd0e 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -412,22 +412,12 @@ static inline s32 DmgRoll(s32 dmg) bool32 IsDamageMoveUnusable(u32 battlerAtk, u32 battlerDef, u32 move, u32 moveType) { struct AiLogicData *aiData = AI_DATA; - u32 battlerDefAbility; u32 partnerBattlerDefAbility; if (DoesBattlerIgnoreAbilityChecks(aiData->abilities[battlerAtk], move)) - { - battlerDefAbility = ABILITY_NONE; partnerBattlerDefAbility = ABILITY_NONE; - } else - { - battlerDefAbility = aiData->abilities[battlerDef]; partnerBattlerDefAbility = aiData->abilities[BATTLE_PARTNER(battlerDef)]; - } - - if (battlerDef == BATTLE_PARTNER(battlerAtk)) - battlerDefAbility = aiData->abilities[battlerDef]; if (gBattleStruct->commandingDondozo & (1u << battlerDef)) return TRUE; @@ -469,7 +459,7 @@ bool32 IsDamageMoveUnusable(u32 battlerAtk, u32 battlerDef, u32 move, u32 moveTy return TRUE; break; case EFFECT_POLTERGEIST: - if (AI_DATA->items[battlerDef] == ITEM_NONE || gFieldStatuses & STATUS_FIELD_MAGIC_ROOM || battlerDefAbility == ABILITY_KLUTZ) + if (AI_DATA->items[battlerDef] == ITEM_NONE || !IsBattlerItemEnabled(battlerDef)) return TRUE; break; case EFFECT_FIRST_TURN_ONLY: @@ -4141,3 +4131,16 @@ void IncreaseSubstituteMoveScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 * if (AI_DATA->hpPercents[battlerAtk] > 70) ADJUST_SCORE_PTR(WEAK_EFFECT); } + +bool32 IsBattlerItemEnabled(u32 battler) +{ + if (AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_NEGATE_UNAWARE) + return TRUE; + if (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM) + return FALSE; + if (gStatuses3[battler] & STATUS3_EMBARGO) + return FALSE; + if (gBattleMons[battler].ability == ABILITY_KLUTZ && !(gStatuses3[battler] & STATUS3_GASTRO_ACID)) + return FALSE; + return TRUE; +} diff --git a/src/battle_util.c b/src/battle_util.c index 09679f656ac2..5c32262b43b7 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8606,7 +8606,7 @@ u32 GetBattlerHoldEffectInternal(u32 battler, bool32 checkNegating, bool32 check return HOLD_EFFECT_NONE; if (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM) return HOLD_EFFECT_NONE; - if (checkAbility && GetBattlerAbility(battler) == ABILITY_KLUTZ) + if (checkAbility && GetBattlerAbility(battler) == ABILITY_KLUTZ && !(gStatuses3[battler] & STATUS3_GASTRO_ACID)) return HOLD_EFFECT_NONE; } From 4cf219e5c739365e183c20b97e5508b3dae15ac9 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Sat, 22 Feb 2025 16:28:53 +0100 Subject: [PATCH 03/14] Resized gimmick indicators to reduce VRAM usage (#6319) Co-authored-by: Hedara --- graphics/battle_interface/alpha_indicator.png | Bin 211 -> 178 bytes graphics/battle_interface/bug_indicator.png | Bin 4942 -> 568 bytes graphics/battle_interface/dark_indicator.png | Bin 4980 -> 560 bytes graphics/battle_interface/dragon_indicator.png | Bin 5015 -> 567 bytes .../battle_interface/dynamax_indicator.png | Bin 268 -> 184 bytes .../battle_interface/electric_indicator.png | Bin 4876 -> 555 bytes graphics/battle_interface/fairy_indicator.png | Bin 5006 -> 570 bytes .../battle_interface/fighting_indicator.png | Bin 5009 -> 563 bytes graphics/battle_interface/fire_indicator.png | Bin 4928 -> 565 bytes graphics/battle_interface/flying_indicator.png | Bin 4929 -> 568 bytes graphics/battle_interface/ghost_indicator.png | Bin 4941 -> 566 bytes graphics/battle_interface/grass_indicator.png | Bin 4887 -> 557 bytes graphics/battle_interface/ground_indicator.png | Bin 4873 -> 551 bytes graphics/battle_interface/ice_indicator.png | Bin 4905 -> 558 bytes graphics/battle_interface/mega_indicator.png | Bin 365 -> 218 bytes graphics/battle_interface/normal_indicator.png | Bin 4885 -> 559 bytes graphics/battle_interface/omega_indicator.png | Bin 209 -> 177 bytes graphics/battle_interface/poison_indicator.png | Bin 4937 -> 566 bytes .../battle_interface/psychic_indicator.png | Bin 5168 -> 563 bytes graphics/battle_interface/rock_indicator.png | Bin 4933 -> 563 bytes graphics/battle_interface/steel_indicator.png | Bin 4904 -> 555 bytes .../battle_interface/stellar_indicator.png | Bin 5418 -> 582 bytes graphics/battle_interface/water_indicator.png | Bin 4896 -> 560 bytes src/battle_gimmick.c | 8 ++++---- src/data/graphics/gimmicks.h | 4 ++-- 25 files changed, 6 insertions(+), 6 deletions(-) diff --git a/graphics/battle_interface/alpha_indicator.png b/graphics/battle_interface/alpha_indicator.png index 84cfee2cf1364598c2acd71ee78d8777d7389959..bfa504e89a793f04efcea7bec8e072947a6b7d80 100644 GIT binary patch delta 111 zcmcc2xQS7*Gr-TCmrII^fq{Y7)59eQNOJ(O00%RWlnFWKKT*-g)xgumF@$60TJPm-tnHWsG=ss@ L)z4*}Q$iB}4o4s0 delta 144 zcmdnQc$rbLGr-TCmrII^fq{Y7)59eQNDF{42Q!e=(B%)FsOXbs?&;zfA~E%B&rV(j z0}kfQKX2>{eONPt*iRmvJ8|_s%Z5D>Og26@13yoeI_Yen@;1_J-9?Fa{}>{x8Etn| lc^(29#g`i4nda-upao=e05J$$3Z4w2JYD@<);T3K0RSE9DI@>@ diff --git a/graphics/battle_interface/bug_indicator.png b/graphics/battle_interface/bug_indicator.png index 7ab7dc6dfa37f207ea32e8655499176ff9db3b21..2e5893ead84d92997cddc13b965874f9f6a612ad 100644 GIT binary patch delta 147 zcmX@7wu8l@Gr-TCmrII^fq{Y7)59eQNOJ(O00%RWlnFWK&%nUgn(6Eu;OXqFP*9Yg zmYI{vz@Ra4^MB?tMwaNuVp}KA6|#3X@^om`f;u@wq0sj}B1KPvj>FVdQ&MBb@0Pf8ybpQYW literal 4942 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 f=U literal 5015 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 delta 218 zcmdnN*uzxc8Q|y6%O%Cdz`(%k>ERLtqy<2jg&9b`z556xz+U3%>&pI|nOo41rTanI za-fiSiEBhjaDG}zd16s2gS(Fl&=`fX)FK6AJ(I%LB@cm0I7$lq+<`L2KsJL{gQh%? zVo7)Ob!1@J*w6hZkrl`{m}qJp#F*sm?(%;r`=_HI5lERLtq&a|CfP)!G%7mQrpS+$~lu2Xa=3~rdj4aWQ z#kNjP5wf>Z^>lFz;h346ut4BLBZGF!Gxm)NCNmE5r+#Q=2;p+(b+OmJBE!(Th`DNC STz@^#C>jo%PC~D-Ftuces?li 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 literal 5006 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 aB@jvnC+s3S|0=@G2m*Isw?nQGDgOmy+lEd6 diff --git a/graphics/battle_interface/fire_indicator.png b/graphics/battle_interface/fire_indicator.png index 4d3e59d543ac9e0f2b73933f1b74573a4e1b4411..bffb030804c2d49292048ee505d227b371c4259e 100644 GIT binary patch delta 144 zcmX@0ww1-AGr-TCmrII^fq{Y7)59eQNOJ(O00%RWlnFWK&%nUgn(6Eu;OXqFP*9Yg zmYI{vz@Ra4^B3kaMwaNuVp}Iq60&#E_jGX#;h346ut1=ou<&E?MyE_Y1@0pcp0^t~ t=m;>MU^i|s={d+hok=^5btT&+h6+Ar=0p2?=Kw8X@O1TaS?83{1OTB+DkcB` literal 4928 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 literal 4941 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 L?O!@`QTl%Y7XWa~ diff --git a/graphics/battle_interface/grass_indicator.png b/graphics/battle_interface/grass_indicator.png index 81fa2589d0dab5e7e803560121a84f5b761aab16..78f6f7aeada37c33e1b59c33065d5a9c90291a04 100644 GIT binary patch delta 136 zcmbQPwwA@BGr-TCmrII^fq{Y7)59eQNOJ(O00%RWlnFWK&%nUgn(6Eu;OXqFP*9Yg zmYI{vz@Ra4^CjjoMwaNuVp}H{2-(}Hd%8G=aLi0jSRhc)z@Rf kB7`DY7D}8-Xr0B(ke0#J^tvf!EzocVPgg&ebxsLQ0P2_}?*IS* literal 4887 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 diff --git a/graphics/battle_interface/ice_indicator.png b/graphics/battle_interface/ice_indicator.png index a40d96f01831d9941c476babde6cbf4f7c8d7bac..c7d7062eb8b70484c953cacce50c5d1b3cae6ffb 100644 GIT binary patch delta 137 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 diff --git a/graphics/battle_interface/mega_indicator.png b/graphics/battle_interface/mega_indicator.png index 93e113ded4efb535746dab44eeeb83f9210b0d65..62fcddd65808a8d3f81b41fb41a1eedfbf7b5fde 100644 GIT binary patch delta 144 zcmaFMbc<23Gr-TCmrII^fq{Y7)59eQNOJ(O00%RWlnFWKKhaQHP@jR}RXhWO)pQ01 z@q!xBU5pcBZ31mPT^vI=W-dK;Q1E~O2eYH1pfLO8`rU~c2fyEBUS~Wh>*c#m*N(Jv ufAniA^VnFuPcxy?Yq{8hGcv1B-I6yv&e$ucT(1YTgu&C*&t;ucLK6Ti{Vsn1 delta 292 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 BQG@^h diff --git a/graphics/battle_interface/omega_indicator.png b/graphics/battle_interface/omega_indicator.png index 8e21007a800ba1102177d9205420dc248aa5fd4f..f491251c50a6c1bb072ca22723400f6fc25a0a25 100644 GIT binary patch delta 110 zcmcb}xRFt@Gr-TCmrII^fq{Y7)59eQNOJ(O00%RWlnFWKKT*-gMc>oKF@$60+S4Zm z859@}9Vqw`zu9P8g54YTAJg9KS-WhoxgnPbA~E&snVo_R z1{}bP0l+XkKcC#3)Y literal 4937 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 BWw8JN diff --git a/graphics/battle_interface/psychic_indicator.png b/graphics/battle_interface/psychic_indicator.png index f70352d2ee8ff03b193e2d29bdfeb1de824850cf..4f3dec93195a6b32f6a8c08f92285af9b0152085 100644 GIT binary patch delta 143 zcmdm>v6;o9Gr-TCmrII^fq{Y7)59eQNOJ(O00%RWlnFWK&%nUglIiRm;OXqFP*9Yg zmYI{vz@Ra4Gbc+aBg^XaGY2QP3fnvDdAc};aLi0jSRk;WkwLrT+4JY@8*enI2y8a` r(5zurC(taf*tCjmUAJfspENT=bRCmpL0a(_pdAdJu6{1-oD!M0HGNsEy% z6D}tZOxN!%h~C`g>(u|NyWVE%p|za{=hPBwJLjc;l^C^9ypXz6b!rthIXl$8{qf6} z#BLXgw|zt3{>fQ!E2_K3Dnc)*7cLbnWoX8q{;)ZGUNc+gvDVzqy-zPJq(7^u=^aUOeqNk&pmc(}Bk8Ln zGj|2u@Oo4g^Jzpz?}4~|*FJZQ*&Ensn$-GsMwH3NSR%Me z$GMst&^klslk)IF%B0lCzvVa2PIvUrbgk$2>k4{yZ<^e&pMIuvci6Ep8%yTocb^t% zInUg~Lkq)ynh?gAsVKc5X{^@fb*!U)dwTb@EwOq2m!p;mH%5uYEVjB$8&=*Ty|^{z z{-wORHxqslZd#J^TN3H=8YgzY-IRY!#JloYF!8|e*YB3L)_GEki>3VN`Zf<2H|8d{ z0PZNX*KWg)X9;5qrz;km<@)6xJ-bc3q2$2^pBGd2waT2Fj)wKxeskj(-B`bU#r?&# z59@YpyY#|FFAq0oR-0=DaR<(qiH}If3lBR@-@ibTCg~}Re$>DJ7{9QY@|5*BzUNBI z-OfhN(r&|TzUSU+wYRP+_P8%S+))%UF@`Oi_;TgGlD?A-5$zLg&%;Z%KVH4(i5=V< zM*Qr@;74gLh8pFE=E5tb*H*iQA62H!Z7o@rbuRWnp;mP9{8=sU0jrFy`9<|W+|HM* z9Nli*(`R>)e#^`2%gQXw|N5C1OB0l>CGqz?OOfYyY&<&0mh>@O=9M=Y3CDA~XAyQH z*J`mR5r59h#E&mpY@EhwkCSJt zrflzw32t>!Zd<=`_H}-gM#2R-3VMHb_6iP%w;j0Y|w(*WH z@&qCEpL}#?SwInaOM0SDNA9=0BP8DrpQxGXS#1lJU#{zFqb_gDEvn);{4m-!VEp(0 zpj}Ey;bFcXxBWX2&_dlqC70W~@8A{`9BSU+(pik6SYNpWZn?t()6-tF|8g6}m9@ zKpoHAMRgi~dCSZzcn&#xT2byAg1vL({ETeQ0pA&8;PRc?hnubrFsrBPqUstCt>U?_ zt(esBl4guADE9uQC~jm=%AwLtbkae`^6gvy{6ZOh&+VkyDfYW1E02wCO51#^_w&{% zq;lujSR)H}sk$+OJg;#7`iibS|Aw}#GBchPkEEqKI+b#dB|KU2jL^0J`#Z$jw_QD` z5l@but9hQ1^4uJ{@5H3S%eu;Ox!xPV;5Fl5z%CMp@=%S6g2*&djABx0!2l)@_yHy@ zg2rP8k`zXpnjDXEW#j;V2fm31092R( zA(>Q4wVr1Zkgd2p@N5xN$t0_ZAznaUB$kkb8XZPrQkWDP6lB5^VY0siiLaB%dEtR` zh9JP3fV|vb(DJBMqtQq)GAJ6If=cIdxl|fVg<%L-K>8%L0Wm>p{S*ttAVwgjM|HT? zfNRtw3nn7fBp3u_GSHJ=<)_k$#joMj`XLqoA5;^frP3)hs!By2?x8mXB?6G4g#OY) z9|?Y^sNtAilb}PfphQej zVoEs-h|6FAD48EjW59A6hl5(7WGHWrMyEo+a^fmPfl;+;g;il8oHtt{5|CjE?TtjD zL=1A^0QLZ`mT8RoH>yZng+&+;3!ij0oxx=@STLJS<8ZlygBI;J&T9pUyoJW&{Mh1bqG$OS*Kox0dA<=pQ!O_ifjUW{6@Bl(vgGd}?+hgP50ujwG{Of>-Dhiw(X?F#U z+vRj{@7~d?Cg3km>`kB0hxfTQRQ8vbxi+w??2dX?{cy0n+{V?Jz>~ODHqL;p2T@T_ LSl|zz#-;xUweYZq diff --git a/graphics/battle_interface/rock_indicator.png b/graphics/battle_interface/rock_indicator.png index 0329ec678cd1f66fd5d73625a319ccbd6dbcad8f..3f92eb296ede4596992c046c01a66e6f73421c2b 100644 GIT binary patch delta 126 zcmX@AwwXn-Gr-TCmrII^fq{Y7)59eQNOJ(O00%RWlnFWKKlvfED3iv-%|DpS7+Inp zi*21eO~~F!*VDx@gkxrM!UBPUW(Mt!XV0IrZ#-aPKj9#M+J|OI1xJBqX|2{p5=RnR bXE8H0JzzFDH09l8ppguou6{1-oD!MC~D-Ftuc zes?mt(j^g-o!p%W1j1x-WLPw~PPLp9CxG8OT|GcB;c!MwtRWgU5_Nj55>uf>L%I$n zq9#m9AecJu6viFxo$o9%yNTYk5eJ^tnfA9aE3S2%zI3;QD}E<);J?M_DTYG|JHBLO z;0io)x<>JJ%7Uawuh`X;sYxfOx^Lsu*~U-j7x~vKWx1ut zHnOflZajC7kjh+JrQMp3wl~El&f=)gEQ@x&>_9HMn%|srpChKcOt8()$O;_xBDb>s_V}l{9R0RK^wN^Et_4;`>{E2s1EYs4;O1evMS)vNkkVw8*bY{v>8a=494#7OU;@G4UDR z#n3!STvCo!Lz5X)Xv~@MXcuSnAEpB!jefQ>)4~DyiSS z_gZ#eN{~7~p4S_~e&?Jo%DwAY<^P?1Yv-SxG5$(#=(}rgwK*O2bT?e6OwVfVrd;@9c9zFe z?jI>bSv-AxT?pb^>C!l9?PmyHNjp`^5wY-}h|RK!EgnISJ^$SG^~#;ahOMD= z;-LIj&+=g1%*1x}@bIOhB|aaT-Hx?%jwDUk`E>5d?sif{@D;W$rK|nA;HuuO-LST?d2P4U-fhb24FpYq8@5B!z zBBl_KR@gTCC1Ihu> zSv)e2&S8?dD1!#U5X9qf>Eocp8r%SD5Yz$%z$qBOVe;s7Cc=fukb=u5Lns1~c}g0c ztUwVamxn4?T!=XiB1(^eu7p+Nqq0CL02IWc(-<@cLgugm0EEDDGLMG9WG9@a?zCxSWaWn$P79gAww)Sj|`(6HkrdkX3j&%CEcY|3;V7i_aZY1O5RS!N<&lPrT*eLx?6_93ui(x$OO> zAhirTAl-85QuCn^Jbhb9IZ_?B^%T`yy6oK1{FKI@QX5Y_Y~h%}VgEn~Y#eowD{%s0 z(hSRKLntnF1wwm+SR%5&VK>7zVBS8s;om^S6o-YxICLQKdz^Lmx@QxVw@1wD{C9q1 zHfK5Xn$1twdgWg+m*qc|etE^A=7d*%Vg-*-q4eObw|(O?U``N=mW1sOjnDoIKd@|u diff --git a/graphics/battle_interface/steel_indicator.png b/graphics/battle_interface/steel_indicator.png index e84d9fa1b0c5cdd1fb95488d342a2c79b21ab748..682d738c1a7d2207c9b36807c365ec25393bd454 100644 GIT binary patch delta 118 zcmZ3Xwwgt;Gr-TCmrII^fq{Y7)59eQNOJ(O00%RWlnFWKKlwbfD3iv-&Ci(27+Inp zi*23UB4lr+>gnPb!Z9;BVS&JgW(I9$W_t;S$Ug~!bpp&fEz=nnHu8k6uw*Eo!OU>x SUder+Q4F50elF{r5}E*|KOjB; literal 4904 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 literal 5418 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 NczgH?_I|r4^>5NoF(&{3 diff --git a/graphics/battle_interface/water_indicator.png b/graphics/battle_interface/water_indicator.png index bdeb401f4abebf6b78b170c334e10aab6996efe5..c7d1894793711559df5c0ae79bdd1e1d65398855 100644 GIT binary patch delta 139 zcmZ3Wwt>Z>Gr-TCmrII^fq{Y7)59eQNOJ(O00%RWlnFWK&%nUgn(6Eu;OXqFP*9Yg zmYI{vz@Ra4^G)V5MwaNuVp}Jd3)$OidAc};aLi0jSRk;WfkAu5Gxp66CiYs*@;nE5 o#59`aTMlIXIG7c&@EHSxy9(p2i6yVL1I=gfboFyt=akR{0G?(k1ONa4 literal 4896 zcmeHKX;c$g77ik!g5rjtjS}MmqLqybStKF^grLE&sDL0=DwR-57Ly7Dv>Oz)6uqV{%^|&BxCK4!V=pYyRkja(XE|{sm+!50 zzHD62XmT3eSn3@qTG|lt@78zoM@J>qRW9CeWo>!Oou_FV`r>t5Lmalld$D(gA$s_g zAx~2hBj-(b_jxl%dN0ag6WMgRS7e_h>L{Z&=E5cWK_>~Zqu<^ZH+RXVU3bF8IEk~FjeA#THfKi6rbMrEf$2I zPD$UtY;5VcO1TY6covi*7baB10?0L#GVdj~hxpDW|mj+<{7Uom0&pOJRK*LyG2 z7L;xFM?@dTX(~)Z;Pyd2wiClEOup-;u5v`virY6AT>L#l7I-lv==}8)R_R+VR}^iY z91-j!TF=M+#n0;XyVVw(IS#JB6jkg@k2y0W>(I?jSs@#z*4&VylA7Jkk=d|n_fV+h z`u?Ulf`o#Qx58I9LyzPx84+;Uban&tVZhnxqnqUG@ch?%qLu6HYUS8Mx8E{3lO?Up z)5SR}E{<>R_6?yYT1s22OO$M?+)l zs0g8VbyZQj-VDe9s8MNut~}=7Mg%{bSN&?eG`aE0qOf00OA?2XSpSjf>KM_e1jZHUT>{;45~2(RCUjLpn;88|fk{Jm}BgJDFp3>KZqP^lO_J@kZMJRs=~=r29=Vc>^{ z5rXM81|5p|#bat>Y)=X~`q^J=(8Zb4k)sSO4pRZB9?Z)6YD#~xMEco-lt78Av}P|L z_E$&(S9}rctJug9b2>c(0q&o9ze0b?-3$gOiA3P5K@DVhVqYPRoL?Z*w^S^ovFXe&7HJ$pD1ZZ4 z1GrkQNzi{83d2=cD1nfAvOIV&>;b#8U=MdT5AI6b%s2h4}IRX|;V{|9WAlLM#Y&{wOqlc#%&|?z-eqA=Oxq!Wj@p-fA){B(zZ#=r|@Hfr? zsJ~D0P5OS9>$_avq`)_UzjxPnxxPt(ZvubsuK$}{{l9$fU~2FWD1rQ#u^SW!K7^Rk znPGn5E(={+<)sS63#A!1Z&nw7)F=M3Js&+WFSCr%nKS!B$=b!0<%Y_#*H^in;IMun z0zUn;0TFr%#bzjZT2Qic9D&iA5KH{5A6X6U1r1zNHG32=L1JI;u)a6Y1$nlA96j1Q zWd!{r{otVTEJmzta&ofkS*!B)7tVW|y}~4YuRBqcb#`dQ@Jl;@BSq{N Date: Sat, 22 Feb 2025 21:56:48 +0100 Subject: [PATCH 04/14] Fixes intimidate missing timing during a mega evo / switch (#6322) Co-authored-by: Bassoonian --- src/battle_main.c | 3 +++ test/battle/ability/intimidate.c | 15 +++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/src/battle_main.c b/src/battle_main.c index 61e61aeb34bc..bc3c9bdd1e88 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3259,6 +3259,9 @@ void SwitchInClearSetData(u32 battler) gCurrentMove = MOVE_NONE; gBattleStruct->arenaTurnCounter = 0xFF; + // Restore struct member so replacement does not miss timing + gSpecialStatuses[battler].switchInAbilityDone = FALSE; + // Reset damage to prevent things like red card activating if the switched-in mon is holding it gSpecialStatuses[battler].physicalDmg = 0; gSpecialStatuses[battler].specialDmg = 0; diff --git a/test/battle/ability/intimidate.c b/test/battle/ability/intimidate.c index 6aea91de2539..1923a5fe2728 100644 --- a/test/battle/ability/intimidate.c +++ b/test/battle/ability/intimidate.c @@ -375,3 +375,18 @@ DOUBLE_BATTLE_TEST("Intimidate will correctly decrease the attack of the second ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); } } + +SINGLE_BATTLE_TEST("Intimdate does not lose timing after mega evolution and switch out by a hit escape move") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_U_TURN].effect == EFFECT_HIT_ESCAPE); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_MANECTRIC) { Item(ITEM_MANECTITE); } + OPPONENT(SPECIES_ARBOK) { Ability(ABILITY_INTIMIDATE); } + } WHEN { + TURN { MOVE(opponent, MOVE_U_TURN, gimmick: GIMMICK_MEGA); SEND_OUT(opponent, 1); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_INTIMIDATE); + ABILITY_POPUP(opponent, ABILITY_INTIMIDATE); + } +} From 320c6cf11f09e8f9c895591904bc6923a3a903e5 Mon Sep 17 00:00:00 2001 From: PhallenTree <168426989+PhallenTree@users.noreply.github.com> Date: Sun, 23 Feb 2025 19:50:52 +0000 Subject: [PATCH 05/14] Fixes Coaching on semi-invulnerable ally, Air Balloon being stolen, Immunity abilities being ignored by Mold Breaker (#6327) --- data/battle_scripts_1.s | 2 ++ include/battle.h | 3 ++- src/battle_script_commands.c | 2 +- src/battle_util.c | 16 +++++++++++++--- test/battle/ability/own_tempo.c | 8 ++------ test/battle/ability/pastel_veil.c | 1 - test/battle/hold_effect/air_balloon.c | 1 - test/battle/hold_effect/jaboca_berry.c | 4 ++-- test/battle/move_effect/coaching.c | 1 - test/battle/move_effect/two_turns_attack.c | 2 -- 10 files changed, 22 insertions(+), 18 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 3016540a806c..758c6e8bbf63 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1035,6 +1035,7 @@ BattleScript_EffectCoaching:: setallytonexttarget EffectCoaching_CheckAllyStats goto BattleScript_ButItFailed EffectCoaching_CheckAllyStats: + accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_ATK, MAX_STAT_STAGE, BattleScript_CoachingWorks jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_DEF, MAX_STAT_STAGE, BattleScript_CoachingWorks goto BattleScript_ButItFailed @ ally at max atk, def @@ -3775,6 +3776,7 @@ BattleScript_TwoTurnMovesSecondTurn:: BattleScript_TwoTurnMovesSecondTurnRet: setbyte sB_ANIM_TURN, 1 + setbyte sB_ANIM_TARGETS_HIT, 0 clearstatusfromeffect BS_ATTACKER, MOVE_EFFECT_CHARGING clearsemiinvulnerablebit @ only for moves with EFFECT_SEMI_INVULNERABLE/EFFECT_SKY_DROP return diff --git a/include/battle.h b/include/battle.h index 2659c088440f..4e9313d10d2d 100644 --- a/include/battle.h +++ b/include/battle.h @@ -829,7 +829,8 @@ struct BattleStruct u16 commanderActive[MAX_BATTLERS_COUNT]; u32 stellarBoostFlags[NUM_BATTLE_SIDES]; // stored as a bitfield of flags for all types for each side u8 redCardActivates:1; - u8 padding:7; + u8 bypassMoldBreakerChecks:1; // for ABILITYEFFECT_IMMUNITY + u8 padding:6; u8 usedEjectItem; u8 usedMicleBerry; u8 trainerSlideSpriteIds[MAX_BATTLERS_COUNT]; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index c3dc01631464..a74e0e5bcc7b 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3639,7 +3639,7 @@ void SetMoveEffect(bool32 primary, bool32 certain) gProtectStructs[gBattlerTarget].banefulBunkered = FALSE; gProtectStructs[gBattlerTarget].obstructed = FALSE; gProtectStructs[gBattlerTarget].silkTrapped = FALSE; - gProtectStructs[gBattlerAttacker].burningBulwarked = FALSE; + gProtectStructs[gBattlerTarget].burningBulwarked = FALSE; BattleScriptPush(gBattlescriptCurrInstr + 1); if (gCurrentMove == MOVE_HYPERSPACE_FURY) gBattlescriptCurrInstr = BattleScript_HyperspaceFuryRemoveProtect; diff --git a/src/battle_util.c b/src/battle_util.c index 5c32262b43b7..8096e8e48778 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -6251,6 +6251,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITYEFFECT_IMMUNITY: + gBattleStruct->bypassMoldBreakerChecks = TRUE; for (battler = 0; battler < gBattlersCount; battler++) { switch (GetBattlerAbility(battler)) @@ -6341,6 +6342,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 return effect; } } + gBattleStruct->bypassMoldBreakerChecks = FALSE; break; case ABILITYEFFECT_SYNCHRONIZE: if (gLastUsedAbility == ABILITY_SYNCHRONIZE && (gHitMarker & HITMARKER_SYNCHRONISE_EFFECT)) @@ -6570,7 +6572,9 @@ u32 GetBattlerAbility(u32 battler) && gBattleMons[battler].ability == ABILITY_COMATOSE) return ABILITY_NONE; - if (noAbilityShield && CanBreakThroughAbility(gBattlerAttacker, battler, gBattleMons[gBattlerAttacker].ability)) + if (!gBattleStruct->bypassMoldBreakerChecks + && noAbilityShield + && CanBreakThroughAbility(gBattlerAttacker, battler, gBattleMons[gBattlerAttacker].ability)) return ABILITY_NONE; return gBattleMons[battler].ability; @@ -6584,7 +6588,9 @@ u32 GetBattlerAbility(u32 battler) && noAbilityShield) return ABILITY_NONE; - if (noAbilityShield && CanBreakThroughAbility(gBattlerAttacker, battler, gBattleMons[gBattlerAttacker].ability)) + if (!gBattleStruct->bypassMoldBreakerChecks + && noAbilityShield + && CanBreakThroughAbility(gBattlerAttacker, battler, gBattleMons[gBattlerAttacker].ability)) return ABILITY_NONE; return gBattleMons[battler].ability; @@ -11436,8 +11442,12 @@ bool32 CanStealItem(u32 battlerStealing, u32 battlerItem, u16 item) return FALSE; } + // It's supposed to pop before trying to steal but this also works + if (ItemId_GetHoldEffect(item) == HOLD_EFFECT_AIR_BALLOON) + return FALSE; + if (!CanBattlerGetOrLoseItem(battlerItem, item) // Battler with item cannot have it stolen - ||!CanBattlerGetOrLoseItem(battlerStealing, item)) // Stealer cannot take the item + || !CanBattlerGetOrLoseItem(battlerStealing, item)) // Stealer cannot take the item return FALSE; return TRUE; diff --git a/test/battle/ability/own_tempo.c b/test/battle/ability/own_tempo.c index 1f3f49c0060c..01ecdc94347f 100644 --- a/test/battle/ability/own_tempo.c +++ b/test/battle/ability/own_tempo.c @@ -58,7 +58,6 @@ SINGLE_BATTLE_TEST("Own Tempo prevents confusion from moves by the user") SINGLE_BATTLE_TEST("Mold Breaker ignores Own Tempo") { - KNOWN_FAILING; // Ideally the func CanBeConfused should be split into AttackerCanBeConfused and TargetCanBeConfused or we do it in the same func but have a check for when battlerAtk == battlerDef GIVEN { ASSUME(gMovesInfo[MOVE_CONFUSE_RAY].effect == EFFECT_CONFUSE); PLAYER(SPECIES_PINSIR) { Ability(ABILITY_MOLD_BREAKER); } @@ -66,16 +65,13 @@ SINGLE_BATTLE_TEST("Mold Breaker ignores Own Tempo") } WHEN { TURN { MOVE(player, MOVE_CONFUSE_RAY); } } SCENE { - NONE_OF { - ABILITY_POPUP(opponent, ABILITY_OWN_TEMPO); - MESSAGE("The opposing Slowpoke's Own Tempo prevents confusion!"); - } + ANIMATION(ANIM_TYPE_MOVE, MOVE_CONFUSE_RAY, player); + NOT MESSAGE("The opposing Slowpoke's Own Tempo prevents confusion!"); } } SINGLE_BATTLE_TEST("Mold Breaker does not prevent Own Tempo from curing confusion right after") { - KNOWN_FAILING; GIVEN { ASSUME(gMovesInfo[MOVE_CONFUSE_RAY].effect == EFFECT_CONFUSE); PLAYER(SPECIES_PINSIR) { Ability(ABILITY_MOLD_BREAKER); }; diff --git a/test/battle/ability/pastel_veil.c b/test/battle/ability/pastel_veil.c index a6b6168547eb..2b721fd095ca 100644 --- a/test/battle/ability/pastel_veil.c +++ b/test/battle/ability/pastel_veil.c @@ -33,7 +33,6 @@ DOUBLE_BATTLE_TEST("Pastel Veil prevents Poison Sting poison on partner") SINGLE_BATTLE_TEST("Pastel Veil immediately cures Mold Breaker poison") { - KNOWN_FAILING; GIVEN { ASSUME(gMovesInfo[MOVE_TOXIC].effect == EFFECT_TOXIC); PLAYER(SPECIES_PINSIR) { Ability(ABILITY_MOLD_BREAKER); } diff --git a/test/battle/hold_effect/air_balloon.c b/test/battle/hold_effect/air_balloon.c index 293e1d80ca1f..c99423edc14c 100644 --- a/test/battle/hold_effect/air_balloon.c +++ b/test/battle/hold_effect/air_balloon.c @@ -105,7 +105,6 @@ SINGLE_BATTLE_TEST("Air Balloon pops before it can be stolen with Magician") SINGLE_BATTLE_TEST("Air Balloon pops before it can be stolen with Thief or Covet") { u32 move; - KNOWN_FAILING; PARAMETRIZE { move = MOVE_THIEF; } PARAMETRIZE { move = MOVE_COVET; } GIVEN { diff --git a/test/battle/hold_effect/jaboca_berry.c b/test/battle/hold_effect/jaboca_berry.c index 373780be712f..8e69ff1bac4e 100644 --- a/test/battle/hold_effect/jaboca_berry.c +++ b/test/battle/hold_effect/jaboca_berry.c @@ -54,7 +54,7 @@ SINGLE_BATTLE_TEST("Jaboca Berry tirggers before Bug Bite can steal it") HP_BAR(opponent); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); HP_BAR(player); - MESSAGE("Wyanut was hurt by the opposing Wobbuffet's Jaboca Berry!"); - NOT MESSAGE("Wynaut stole and ate the opposing its target's Jaboca Berry!"); + MESSAGE("Wynaut was hurt by the opposing Wobbuffet's Jaboca Berry!"); + NOT MESSAGE("Wynaut stole and ate the opposing Wobbuffet's Jaboca Berry!"); } } diff --git a/test/battle/move_effect/coaching.c b/test/battle/move_effect/coaching.c index 451ac8049527..4d5581ac338e 100644 --- a/test/battle/move_effect/coaching.c +++ b/test/battle/move_effect/coaching.c @@ -58,7 +58,6 @@ DOUBLE_BATTLE_TEST("Coaching bypasses Crafty Shield") DOUBLE_BATTLE_TEST("Coaching fails if all allies are is semi-invulnerable") { - KNOWN_FAILING; // Coaching succeeds GIVEN { ASSUME(gMovesInfo[MOVE_FLY].effect == EFFECT_SEMI_INVULNERABLE); PLAYER(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/two_turns_attack.c b/test/battle/move_effect/two_turns_attack.c index efeb419ce554..78dd62f093fc 100644 --- a/test/battle/move_effect/two_turns_attack.c +++ b/test/battle/move_effect/two_turns_attack.c @@ -49,7 +49,6 @@ SINGLE_BATTLE_TEST("Razor Wind needs a charging turn") SINGLE_BATTLE_TEST("Razor Wind doesn't need to charge with Power Herb") { - KNOWN_FAILING; GIVEN { PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_POWER_HERB); } OPPONENT(SPECIES_WOBBUFFET); @@ -69,7 +68,6 @@ SINGLE_BATTLE_TEST("Razor Wind doesn't need to charge with Power Herb") MESSAGE("Wobbuffet became fully charged due to its Power Herb!"); if (B_UPDATED_MOVE_DATA < GEN_5) MESSAGE("Wobbuffet used Razor Wind!"); - // For some reason, this breaks with and only with Razor Wind... ANIMATION(ANIM_TYPE_MOVE, MOVE_RAZOR_WIND, player); HP_BAR(opponent); } From c3962c2d3b1fba4c96a4464299de5eb33dbbd9fd Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Sun, 23 Feb 2025 22:11:41 +0100 Subject: [PATCH 06/14] Shifted the follower graphicsIds (#6329) Co-authored-by: Hedara --- include/constants/event_objects.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/include/constants/event_objects.h b/include/constants/event_objects.h index 306aa055aad5..db8d96cae484 100644 --- a/include/constants/event_objects.h +++ b/include/constants/event_objects.h @@ -270,10 +270,10 @@ #define OBJ_EVENT_GFX_VAR_E (OBJ_EVENT_GFX_VARS + 0xE) #define OBJ_EVENT_GFX_VAR_F (OBJ_EVENT_GFX_VARS + 0xF) -#define OBJ_EVENT_MON (1u << 15) -#define OBJ_EVENT_MON_SHINY (1u << 14) -#define OBJ_EVENT_MON_FEMALE (1u << 13) -#define OBJ_EVENT_MON_SPECIES_MASK (~(7u << 13)) +#define OBJ_EVENT_MON (1u << 14) +#define OBJ_EVENT_MON_SHINY (1u << 13) +#define OBJ_EVENT_MON_FEMALE (1u << 12) +#define OBJ_EVENT_MON_SPECIES_MASK (~(7u << 12)) // Used to call a specific species' follower graphics. Useful for static encounters. #define OBJ_EVENT_GFX_SPECIES(name) (SPECIES_##name + OBJ_EVENT_MON) From ce0491dffa531bd3455a5ec1f87da332b3d97d3c Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Mon, 24 Feb 2025 16:41:10 -0500 Subject: [PATCH 07/14] Update SCOPE.md with Intergenerational Feature Compatibility (#6325) --- docs/team_procedures/scope.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/team_procedures/scope.md b/docs/team_procedures/scope.md index e3c736c1cce7..3293cea6dceb 100644 --- a/docs/team_procedures/scope.md +++ b/docs/team_procedures/scope.md @@ -54,6 +54,7 @@ Pull Requests that fall into this category are not in scope by default and shoul 2. **Fangame Features**: Adds a popular feature from other fangames 3. **Popular Non-SS Features**: Exceptions can be made for uniquely popular or requested features (Drowsy, PLA Legend Plate, etc.) 4. **External Program**: External programs like poryscript, porymoves, etc. +5. **Intergenerational Feature Compatibility**: Addresses limitations and issues resulting from including all generational behaviours in a GBA native title, and extrapolation of features no longer supported by GameFreak ## Workflow for Proposed Feature Scope Discussion For the contributor: From 766b9b00ca8edbd7bc9b106896b9bf35bfd94949 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Tue, 25 Feb 2025 13:10:17 +0100 Subject: [PATCH 08/14] Fixed curing status2 with items in double battles (#6335) Co-authored-by: Hedara --- src/item_use.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/item_use.c b/src/item_use.c index 5d797029bbe5..e7acde9ffaf2 100644 --- a/src/item_use.c +++ b/src/item_use.c @@ -1171,6 +1171,15 @@ void ItemUseInBattle_PartyMenuChooseMove(u8 taskId) ItemUseInBattle_ShowPartyMenu(taskId); } +static bool32 SelectedMonHasStatus2(u16 itemId) +{ + if (gPartyMenu.slotId == 0) + return gBattleMons[0].status2 & GetItemStatus2Mask(itemId); + else if (gBattleTypeFlags & (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI) && gPartyMenu.slotId == 1) + return gBattleMons[2].status2 & GetItemStatus2Mask(itemId); + return FALSE; +} + // Returns whether an item can be used in battle and sets the fail text. bool32 CannotUseItemsInBattle(u16 itemId, struct Pokemon *mon) { @@ -1243,13 +1252,13 @@ bool32 CannotUseItemsInBattle(u16 itemId, struct Pokemon *mon) break; case EFFECT_ITEM_CURE_STATUS: if (!((GetMonData(mon, MON_DATA_STATUS) & GetItemStatus1Mask(itemId)) - || (gPartyMenu.slotId == 0 && gBattleMons[gBattlerInMenuId].status2 & GetItemStatus2Mask(itemId)))) + || SelectedMonHasStatus2(itemId))) cannotUse = TRUE; break; case EFFECT_ITEM_HEAL_AND_CURE_STATUS: if ((hp == 0 || hp == GetMonData(mon, MON_DATA_MAX_HP)) && !((GetMonData(mon, MON_DATA_STATUS) & GetItemStatus1Mask(itemId)) - || (gPartyMenu.slotId == 0 && gBattleMons[gBattlerInMenuId].status2 & GetItemStatus2Mask(itemId)))) + || SelectedMonHasStatus2(itemId))) cannotUse = TRUE; break; case EFFECT_ITEM_REVIVE: From 2a6fd2495418200af20c4c12cebbd9b8975604b7 Mon Sep 17 00:00:00 2001 From: Bivurnum <147376167+Bivurnum@users.noreply.github.com> Date: Tue, 25 Feb 2025 15:15:09 -0600 Subject: [PATCH 09/14] fix for multi 2vs1 opponent sends out too many mons bug (#6324) --- src/battle_util.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/battle_util.c b/src/battle_util.c index 8096e8e48778..28da294042dd 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -3816,6 +3816,21 @@ bool32 HasNoMonsToSwitch(u32 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2 playerId = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); party = gEnemyParty; + // Edge case: If both opposing Pokemon were knocked out on the same turn, + // make sure opponent only sents out the final Pokemon once. + if (battler == playerId + && (gHitMarker & HITMARKER_FAINTED(flankId)) + && (gHitMarker & HITMARKER_FAINTED(playerId))) + { + u8 count = 0; + for (i = 0; i < PARTY_SIZE; i++) + if (IsValidForBattle(&party[i])) + count++; + + if (count < 2) + return TRUE; + } + if (partyIdBattlerOn1 == PARTY_SIZE) partyIdBattlerOn1 = gBattlerPartyIndexes[flankId]; if (partyIdBattlerOn2 == PARTY_SIZE) From 13acf18d74560f4c30b3d0396767774c0e0328fe Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Tue, 25 Feb 2025 22:28:10 +0100 Subject: [PATCH 10/14] Fixes effect paralyze not being absorbed by absorbing abilities (#6338) --- data/battle_scripts_1.s | 1 - src/battle_script_commands.c | 3 +++ test/battle/ability/motor_drive.c | 14 ++++++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 test/battle/ability/motor_drive.c diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 758c6e8bbf63..66159bc7fbad 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -3651,7 +3651,6 @@ BattleScript_EffectParalyze:: typecalc jumpifmovehadnoeffect BattleScript_ButItFailed jumpifstatus BS_TARGET, STATUS1_PARALYSIS, BattleScript_AlreadyParalyzed - jumpifelectricabilityaffected BS_TARGET, ABILITY_VOLT_ABSORB, BattleScript_VoltAbsorbHeal tryparalyzetype BS_ATTACKER, BS_TARGET, BattleScript_NotAffected jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed jumpifterrainaffected BS_TARGET, STATUS_FIELD_MISTY_TERRAIN, BattleScript_MistyTerrainPrevents diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index a74e0e5bcc7b..9f900d451b60 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1244,6 +1244,9 @@ static void Cmd_attackcanceler(void) return; if (AbilityBattleEffects(ABILITYEFFECT_MOVES_BLOCK, gBattlerTarget, 0, 0, 0)) return; + if (gMovesInfo[gCurrentMove].effect == EFFECT_PARALYZE && AbilityBattleEffects(ABILITYEFFECT_ABSORBING, gBattlerTarget, 0, 0, gCurrentMove)) + return; + if (!gBattleMons[gBattlerAttacker].pp[gCurrMovePos] && gCurrentMove != MOVE_STRUGGLE && !(gHitMarker & (HITMARKER_ALLOW_NO_PP | HITMARKER_NO_ATTACKSTRING | HITMARKER_NO_PPDEDUCT)) && !(gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)) diff --git a/test/battle/ability/motor_drive.c b/test/battle/ability/motor_drive.c new file mode 100644 index 000000000000..83dc2a37e1c0 --- /dev/null +++ b/test/battle/ability/motor_drive.c @@ -0,0 +1,14 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("Motor Drive absorbs status moves") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_EMOLGA) { Ability(ABILITY_MOTOR_DRIVE); } + } WHEN { + TURN { MOVE(player, MOVE_THUNDER_WAVE); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_MOTOR_DRIVE); + } +} From cf43787d72448063e31c2ab8ad02521120d3f31a Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Tue, 25 Feb 2025 22:28:22 +0100 Subject: [PATCH 11/14] Added MOVE_TARGET_OPPONENT and added it to Me First, (#6336) Co-authored-by: Hedara --- include/constants/battle.h | 2 +- src/battle_controller_opponent.c | 4 ++-- src/battle_controller_player.c | 21 +++++++-------------- src/battle_controller_player_partner.c | 2 +- src/battle_gfx_sfx_util.c | 2 +- src/battle_util.c | 4 ++-- src/contest.c | 2 +- src/data/moves_info.h | 2 +- test/test_runner_battle.c | 2 +- 9 files changed, 17 insertions(+), 24 deletions(-) diff --git a/include/constants/battle.h b/include/constants/battle.h index 37cdf440d481..93c61bdd59e4 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -510,7 +510,7 @@ #define MOVE_TARGET_SELECTED 0 #define MOVE_TARGET_DEPENDS (1 << 0) -#define MOVE_TARGET_USER_OR_SELECTED (1 << 1) +#define MOVE_TARGET_OPPONENT (1 << 1) #define MOVE_TARGET_RANDOM (1 << 2) #define MOVE_TARGET_BOTH (1 << 3) #define MOVE_TARGET_USER (1 << 4) diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index 2fbf8cf69f97..e0507bfaf131 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -565,7 +565,7 @@ static void OpponentHandleChooseMove(u32 battler) default: { u16 chosenMove = moveInfo->moves[chosenMoveId]; - if (GetBattlerMoveTargetType(battler, chosenMove) & (MOVE_TARGET_USER_OR_SELECTED | MOVE_TARGET_USER)) + if (GetBattlerMoveTargetType(battler, chosenMove) & MOVE_TARGET_USER) gBattlerTarget = battler; if (GetBattlerMoveTargetType(battler, chosenMove) & MOVE_TARGET_BOTH) { @@ -600,7 +600,7 @@ static void OpponentHandleChooseMove(u32 battler) move = moveInfo->moves[chosenMoveId]; } while (move == MOVE_NONE); - if (GetBattlerMoveTargetType(battler, move) & (MOVE_TARGET_USER_OR_SELECTED | MOVE_TARGET_USER)) + if (GetBattlerMoveTargetType(battler, move) & MOVE_TARGET_USER) BtlController_EmitTwoReturnValues(battler, BUFFER_B, 10, (chosenMoveId) | (battler << 8)); else if (IsDoubleBattle()) { diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 77ce6083f979..4bf2388fc6ff 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -499,8 +499,6 @@ void HandleInputChooseTarget(u32 battler) case B_POSITION_PLAYER_RIGHT: if (battler != gMultiUsePlayerCursor) i++; - else if (moveTarget & MOVE_TARGET_USER_OR_SELECTED) - i++; break; case B_POSITION_OPPONENT_LEFT: case B_POSITION_OPPONENT_RIGHT: @@ -509,7 +507,8 @@ void HandleInputChooseTarget(u32 battler) } if (gAbsentBattlerFlags & (1u << gMultiUsePlayerCursor) - || !CanTargetBattler(battler, gMultiUsePlayerCursor, move)) + || !CanTargetBattler(battler, gMultiUsePlayerCursor, move) + || (moveTarget & MOVE_TARGET_OPPONENT && GetBattlerSide(gMultiUsePlayerCursor) == B_SIDE_PLAYER)) i = 0; } while (i == 0); } @@ -549,8 +548,6 @@ void HandleInputChooseTarget(u32 battler) case B_POSITION_PLAYER_RIGHT: if (battler != gMultiUsePlayerCursor) i++; - else if (moveTarget & MOVE_TARGET_USER_OR_SELECTED) - i++; break; case B_POSITION_OPPONENT_LEFT: case B_POSITION_OPPONENT_RIGHT: @@ -559,7 +556,8 @@ void HandleInputChooseTarget(u32 battler) } if (gAbsentBattlerFlags & (1u << gMultiUsePlayerCursor) - || !CanTargetBattler(battler, gMultiUsePlayerCursor, move)) + || !CanTargetBattler(battler, gMultiUsePlayerCursor, move) + || (moveTarget & MOVE_TARGET_OPPONENT && GetBattlerSide(gMultiUsePlayerCursor) == B_SIDE_PLAYER)) i = 0; } while (i == 0); } @@ -694,12 +692,7 @@ void HandleInputChooseMove(u32 battler) else gMultiUsePlayerCursor = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerSide(battler))); - if (!gBattleResources->bufferA[battler][1]) // not a double battle - { - if (moveTarget & MOVE_TARGET_USER_OR_SELECTED && !gBattleResources->bufferA[battler][2]) - canSelectTarget = 1; - } - else // double battle + if (gBattleResources->bufferA[battler][1]) // a double battle { if (!(moveTarget & (MOVE_TARGET_RANDOM | MOVE_TARGET_BOTH | MOVE_TARGET_DEPENDS | MOVE_TARGET_FOES_AND_ALLY | MOVE_TARGET_OPPONENTS_FIELD | MOVE_TARGET_USER | MOVE_TARGET_ALLY))) canSelectTarget = 1; // either selected or user @@ -710,7 +703,7 @@ void HandleInputChooseMove(u32 battler) { canSelectTarget = 0; } - else if (!(moveTarget & (MOVE_TARGET_USER | MOVE_TARGET_USER_OR_SELECTED)) && CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_BATTLER, battler) <= 1) + else if (!(moveTarget & MOVE_TARGET_USER) && CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_BATTLER, battler) <= 1) { gMultiUsePlayerCursor = GetDefaultMoveTarget(battler); canSelectTarget = 0; @@ -753,7 +746,7 @@ void HandleInputChooseMove(u32 battler) case 1: gBattlerControllerFuncs[battler] = HandleInputChooseTarget; - if (moveTarget & (MOVE_TARGET_USER | MOVE_TARGET_USER_OR_SELECTED)) + if (moveTarget & MOVE_TARGET_USER) gMultiUsePlayerCursor = battler; else if (gAbsentBattlerFlags & (1u << GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT))) gMultiUsePlayerCursor = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c index f987c333ce4b..8bc27751b4bb 100644 --- a/src/battle_controller_player_partner.c +++ b/src/battle_controller_player_partner.c @@ -354,7 +354,7 @@ static void PlayerPartnerHandleChooseMove(u32 battler) chosenMoveId = gBattleStruct->aiMoveOrAction[battler]; gBattlerTarget = gBattleStruct->aiChosenTarget[battler]; - if (gMovesInfo[moveInfo->moves[chosenMoveId]].target & (MOVE_TARGET_USER | MOVE_TARGET_USER_OR_SELECTED)) + if (gMovesInfo[moveInfo->moves[chosenMoveId]].target & MOVE_TARGET_USER) gBattlerTarget = battler; else if (gMovesInfo[moveInfo->moves[chosenMoveId]].target & MOVE_TARGET_BOTH) { diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index bbe7924c46cf..262ccecc68da 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -325,7 +325,7 @@ static u8 GetBattlePalaceMoveGroup(u8 battler, u16 move) switch (GetBattlerMoveTargetType(battler, move)) { case MOVE_TARGET_SELECTED: - case MOVE_TARGET_USER_OR_SELECTED: + case MOVE_TARGET_OPPONENT: case MOVE_TARGET_RANDOM: case MOVE_TARGET_BOTH: case MOVE_TARGET_FOES_AND_ALLY: diff --git a/src/battle_util.c b/src/battle_util.c index 28da294042dd..dd53e73d478b 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8430,6 +8430,7 @@ u32 GetMoveTarget(u16 move, u8 setTarget) switch (moveTarget) { case MOVE_TARGET_SELECTED: + case MOVE_TARGET_OPPONENT: side = BATTLE_OPPOSITE(GetBattlerSide(gBattlerAttacker)); if (IsAffectedByFollowMe(gBattlerAttacker, side, move)) { @@ -8489,7 +8490,6 @@ u32 GetMoveTarget(u16 move, u8 setTarget) else targetBattler = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerSide(gBattlerAttacker))); break; - case MOVE_TARGET_USER_OR_SELECTED: case MOVE_TARGET_USER: default: targetBattler = gBattlerAttacker; @@ -8850,7 +8850,7 @@ u32 GetMoveTargetCount(struct DamageCalculationData *damageCalcData) case MOVE_TARGET_DEPENDS: case MOVE_TARGET_SELECTED: case MOVE_TARGET_RANDOM: - case MOVE_TARGET_USER_OR_SELECTED: + case MOVE_TARGET_OPPONENT: return IsBattlerAlive(battlerDef); case MOVE_TARGET_USER: return IsBattlerAlive(battlerAtk); diff --git a/src/contest.c b/src/contest.c index 71383b648317..8b217356d249 100644 --- a/src/contest.c +++ b/src/contest.c @@ -5487,10 +5487,10 @@ static void SetMoveTargetPosition(u16 move) { switch (GetBattlerMoveTargetType(gBattlerAttacker, move)) { - case MOVE_TARGET_USER_OR_SELECTED: case MOVE_TARGET_USER: gBattlerTarget = B_POSITION_PLAYER_RIGHT; break; + case MOVE_TARGET_OPPONENT: case MOVE_TARGET_SELECTED: case MOVE_TARGET_RANDOM: case MOVE_TARGET_BOTH: diff --git a/src/data/moves_info.h b/src/data/moves_info.h index f826a05fb4ea..2bf3fd4be254 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -9600,7 +9600,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = MOVE_TARGET_OPPONENT, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPD_UP_2 }, diff --git a/test/test_runner_battle.c b/test/test_runner_battle.c index 5340ddb4c951..d50668ca301a 100644 --- a/test/test_runner_battle.c +++ b/test/test_runner_battle.c @@ -2043,7 +2043,7 @@ s32 MoveGetTarget(s32 battlerId, u32 moveId, struct MoveContext *ctx, u32 source { target = BATTLE_OPPOSITE(battlerId); } - else if (move->target == MOVE_TARGET_SELECTED) + else if (move->target == MOVE_TARGET_SELECTED || move->target == MOVE_TARGET_OPPONENT) { // In AI Doubles not specified target allows any target for EXPECT_MOVE. if (GetBattleTest()->type != BATTLE_TEST_AI_DOUBLES) From cf481b134341997dcc4c133d8f3224881a206e06 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Wed, 26 Feb 2025 10:43:23 +0100 Subject: [PATCH 12/14] Fixes recoil moves causing recoil when absorbed (#6341) --- src/battle_script_commands.c | 1 + test/battle/move_flags/recoil.c | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 9f900d451b60..bf7e69d8042f 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5821,6 +5821,7 @@ static void Cmd_moveend(void) else if (gMovesInfo[gCurrentMove].recoil > 0 && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && IsBattlerAlive(gBattlerAttacker) + && TARGET_TURN_DAMAGED && gBattleScripting.savedDmg != 0) // Some checks may be redundant alongside this one { gBattleMoveDamage = max(1, gBattleScripting.savedDmg * max(1, gMovesInfo[gCurrentMove].recoil) / 100); diff --git a/test/battle/move_flags/recoil.c b/test/battle/move_flags/recoil.c index bdada8a11479..6740fb2fa88b 100644 --- a/test/battle/move_flags/recoil.c +++ b/test/battle/move_flags/recoil.c @@ -83,3 +83,22 @@ SINGLE_BATTLE_TEST("Flare Blitz deals 33% of recoil damage to the user and can b EXPECT_MUL_EQ(directDamage, UQ_4_12(0.33), recoilDamage); } } + +SINGLE_BATTLE_TEST("Flare Blitz is absorbed by Flash Fire and no recoil damage is dealt") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_FLARE_BLITZ].recoil > 0); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_VULPIX) { Ability(ABILITY_FLASH_FIRE); }; + } WHEN { + TURN { MOVE(opponent, MOVE_TACKLE); MOVE(player, MOVE_FLARE_BLITZ); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); + HP_BAR(player); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLARE_BLITZ, player); + HP_BAR(opponent); + HP_BAR(player); + } + } +} From 56a3819b61387570794589f007cd114918067458 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Wed, 26 Feb 2025 15:07:54 +0100 Subject: [PATCH 13/14] Fixed protect not resetting the counter in earlier gens (#6342) Co-authored-by: Hedara --- src/battle_script_commands.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index bf7e69d8042f..0e8a7c283a61 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -11035,7 +11035,8 @@ static void TryResetProtectUseCounter(u32 battler) u32 lastMove = gLastResultingMoves[battler]; if (lastMove == MOVE_UNAVAILABLE || (!gBattleMoveEffects[gMovesInfo[lastMove].effect].usesProtectCounter - && (B_ALLY_SWITCH_FAIL_CHANCE >= GEN_9 && gMovesInfo[lastMove].effect != EFFECT_ALLY_SWITCH))) + && ((B_ALLY_SWITCH_FAIL_CHANCE >= GEN_9 && gMovesInfo[lastMove].effect != EFFECT_ALLY_SWITCH) + || B_ALLY_SWITCH_FAIL_CHANCE < GEN_9))) gDisableStructs[battler].protectUses = 0; } From e9347a0c9e2f02620016107dabbe46890842b4e1 Mon Sep 17 00:00:00 2001 From: Hedara Date: Wed, 26 Feb 2025 22:10:23 +0100 Subject: [PATCH 14/14] Forgot to remove commented code --- src/battle_ai_util.c | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 69f99c9f998e..f7b5ab9c64c0 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -423,17 +423,6 @@ static inline s32 DmgRoll(s32 dmg) bool32 IsDamageMoveUnusable(u32 battlerAtk, u32 battlerDef, u32 move, u32 moveType) { struct AiLogicData *aiData = AI_DATA; - /* - u32 battlerDefAbility; - - if (DoesBattlerIgnoreAbilityChecks(battlerAtk, aiData->abilities[battlerAtk], move)) - battlerDefAbility = ABILITY_NONE; - else - battlerDefAbility = aiData->abilities[battlerDef]; - - if (battlerDef == BATTLE_PARTNER(battlerAtk)) - battlerDefAbility = aiData->abilities[battlerDef]; - */ if (gBattleStruct->battlerState[battlerDef].commandingDondozo) return TRUE;