diff --git a/include/battle.h b/include/battle.h index ed3f4de6af..107d7cde27 100644 --- a/include/battle.h +++ b/include/battle.h @@ -155,20 +155,21 @@ struct ProtectStruct u32 statRaised:1; u32 usedCustapBerry:1; // also quick claw u32 touchedProtectLike:1; - u32 unused:9; + u32 disableEjectPack:1; + u32 pranksterElevated:1; + u32 quickDraw:1; + u32 beakBlastCharge:1; + u32 quash:1; + u32 shellTrap:1; + u32 eatMirrorHerb:1; + u32 activateOpportunist:2; // 2 - to copy stats. 1 - stats copied (do not repeat). 0 - no stats to copy // End of 32-bit bitfield - u16 disableEjectPack:1; - u16 pranksterElevated:1; - u16 quickDraw:1; - u16 beakBlastCharge:1; - u16 quash:1; - u16 shellTrap:1; - u16 eatMirrorHerb:1; - u16 activateOpportunist:2; // 2 - to copy stats. 1 - stats copied (do not repeat). 0 - no stats to copy u16 usedAllySwitch:1; u16 lashOutAffected:1; u16 assuranceDoubled:1; - u16 padding:4; + u16 myceliumMight:1; + u16 laggingTail:1; + u16 padding:11; // End of 16-bit bitfield u16 physicalDmg; u16 specialDmg; diff --git a/src/battle_main.c b/src/battle_main.c index 8c1d79961e..dc2114fbd9 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4487,6 +4487,10 @@ static void HandleTurnActionSelectionState(void) gBattleStruct->chosenMovePositions[battler] = gBattleResources->bufferB[battler][2] & ~RET_GIMMICK; gChosenMoveByBattler[battler] = gBattleMons[battler].moves[gBattleStruct->chosenMovePositions[battler]]; gBattleStruct->moveTarget[battler] = gBattleResources->bufferB[battler][3]; + if (IsBattleMoveStatus(gChosenMoveByBattler[battler]) && GetBattlerAbility(battler) == ABILITY_MYCELIUM_MIGHT) + gProtectStructs[battler].myceliumMight = TRUE; + if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_LAGGING_TAIL) + gProtectStructs[battler].laggingTail = TRUE; // Check to see if any gimmicks need to be prepared. if (gBattleResources->bufferB[battler][2] & RET_GIMMICK) @@ -4820,9 +4824,13 @@ s32 GetBattleMovePriority(u32 battler, u32 ability, u32 move) if (GetActiveGimmick(battler) == GIMMICK_DYNAMAX && GetMoveCategory(move) == DAMAGE_CATEGORY_STATUS) return GetMovePriority(MOVE_MAX_GUARD); - if (ability == ABILITY_GALE_WINGS - && (GetGenConfig(GEN_CONFIG_GALE_WINGS) < GEN_7 || IsBattlerAtMaxHp(battler)) - && GetMoveType(move) == TYPE_FLYING) + if (gProtectStructs[battler].quash) + { + priority = -8; + } + else if (ability == ABILITY_GALE_WINGS + && (GetGenConfig(GEN_CONFIG_GALE_WINGS) < GEN_7 || IsBattlerAtMaxHp(battler)) + && GetMoveType(move) == TYPE_FLYING) { priority++; } @@ -4836,10 +4844,9 @@ s32 GetBattleMovePriority(u32 battler, u32 ability, u32 move) priority++; } else if (ability == ABILITY_TRIAGE && IsHealingMove(move)) + { priority += 3; - - if (gProtectStructs[battler].quash) - priority = -8; + } return priority; } @@ -4856,16 +4863,16 @@ s32 GetWhichBattlerFasterArgs(u32 battler1, u32 battler2, bool32 ignoreChosenMov // Lagging Tail - always last bool32 battler1HasQuickEffect = gProtectStructs[battler1].quickDraw || gProtectStructs[battler1].usedCustapBerry; bool32 battler2HasQuickEffect = gProtectStructs[battler2].quickDraw || gProtectStructs[battler2].usedCustapBerry; - bool32 battler1HasStallingAbility = ability1 == ABILITY_STALL || (ability1 == ABILITY_MYCELIUM_MIGHT && IsBattleMoveStatus(gChosenMoveByBattler[battler1])); - bool32 battler2HasStallingAbility = ability2 == ABILITY_STALL || (ability2 == ABILITY_MYCELIUM_MIGHT && IsBattleMoveStatus(gChosenMoveByBattler[battler2])); + bool32 battler1HasStallingAbility = ability1 == ABILITY_STALL || gProtectStructs[battler1].myceliumMight; + bool32 battler2HasStallingAbility = ability2 == ABILITY_STALL || gProtectStructs[battler2].myceliumMight; if (battler1HasQuickEffect && !battler2HasQuickEffect) strikesFirst = 1; else if (battler2HasQuickEffect && !battler1HasQuickEffect) strikesFirst = -1; - else if (holdEffectBattler1 == HOLD_EFFECT_LAGGING_TAIL && holdEffectBattler2 != HOLD_EFFECT_LAGGING_TAIL) + else if (gProtectStructs[battler1].laggingTail && !gProtectStructs[battler2].laggingTail) strikesFirst = -1; - else if (holdEffectBattler2 == HOLD_EFFECT_LAGGING_TAIL && holdEffectBattler1 != HOLD_EFFECT_LAGGING_TAIL) + else if (gProtectStructs[battler2].laggingTail && !gProtectStructs[battler1].laggingTail) strikesFirst = 1; else if (battler1HasStallingAbility && !battler2HasStallingAbility) strikesFirst = -1; diff --git a/test/battle/ability/mycelium_might.c b/test/battle/ability/mycelium_might.c index 8491aede51..7ffac1c641 100644 --- a/test/battle/ability/mycelium_might.c +++ b/test/battle/ability/mycelium_might.c @@ -67,3 +67,30 @@ SINGLE_BATTLE_TEST("Mycelium Might vs Stall action order depends on speed") } } } + +DOUBLE_BATTLE_TEST("Mycelium Might priority bracket will not change if the ability is changed mid-turn") +{ + GIVEN { + PLAYER(SPECIES_TOEDSCOOL) { Speed(100); Ability(ABILITY_MYCELIUM_MIGHT); } + PLAYER(SPECIES_WOBBUFFET) { Speed(10); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(30); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(20); } + } WHEN { + TURN { + MOVE(opponentLeft, MOVE_WORRY_SEED, target: playerLeft); + MOVE(playerLeft, MOVE_SCREECH, target: opponentLeft); + } + TURN {} + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_WORRY_SEED, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCREECH, playerLeft); + + // Turn 2 + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerRight); + } +} diff --git a/test/battle/hold_effect/lagging_tail.c b/test/battle/hold_effect/lagging_tail.c new file mode 100644 index 0000000000..13312034e1 --- /dev/null +++ b/test/battle/hold_effect/lagging_tail.c @@ -0,0 +1,31 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gItemsInfo[ITEM_LAGGING_TAIL].holdEffect == HOLD_EFFECT_LAGGING_TAIL); +} + +DOUBLE_BATTLE_TEST("Lagging Tail priority bracket will not change if the item is removed is changed mid-turn") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(100); Item(ITEM_LAGGING_TAIL); } + PLAYER(SPECIES_WYNAUT) { Speed(10); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(30); Item(ITEM_BERRY_JUICE); } + OPPONENT(SPECIES_WYNAUT) { Speed(20); } + } WHEN { + TURN { MOVE(opponentLeft, MOVE_TRICK, target: playerLeft); } + TURN {} + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TRICK, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerLeft); + + // Turn 2 + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentLeft); // Now last because of Tricking Lagging Tail onto itself + } +}