Fixes EndTurn Eject Pack (#7813)

This commit is contained in:
Alex 2025-09-29 11:49:09 +02:00 committed by GitHub
parent ac75fe04d8
commit bd1a4db380
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 35 additions and 49 deletions

View File

@ -61,8 +61,8 @@ enum EndTurnResolutionOrder
ENDTURN_TERRAIN,
ENDTURN_THIRD_EVENT_BLOCK,
ENDTURN_EMERGENCY_EXIT_4,
ENDTURN_ABILITIES,
ENDTURN_FOURTH_EVENT_BLOCK,
ENDTURN_FORM_CHANGE_ABILITIES,
ENDTURN_EJECT_PACK,
ENDTURN_DYNAMAX,
ENDTURN_COUNT,
};
@ -101,13 +101,6 @@ enum ThirdEventBlock
THIRD_EVENT_BLOCK_ITEMS,
};
// Form changing abilities and Eject Pack
enum FourthEventBlock
{
FOURTH_EVENT_BLOCK_HUNGER_SWITCH,
FOURTH_EVENT_BLOCK_EJECT_PACK,
};
static u32 GetBattlerSideForMessage(u32 side)
{
u32 battler = 0;
@ -1458,7 +1451,7 @@ static bool32 HandleEndTurnThirdEventBlock(u32 battler)
return effect;
}
static bool32 HandleEndTurnAbilities(u32 battler)
static bool32 HandleEndTurnFormChangeAbilities(u32 battler)
{
bool32 effect = FALSE;
@ -1472,6 +1465,7 @@ static bool32 HandleEndTurnAbilities(u32 battler)
case ABILITY_SCHOOLING:
case ABILITY_SHIELDS_DOWN:
case ABILITY_ZEN_MODE:
case ABILITY_HUNGER_SWITCH:
if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, battler, ability, 0, MOVE_NONE))
effect = TRUE;
}
@ -1479,38 +1473,10 @@ static bool32 HandleEndTurnAbilities(u32 battler)
return effect;
}
static bool32 HandleEndTurnFourthEventBlock(u32 battler)
static bool32 HandleEndTurnEjectPack(u32 battler)
{
bool32 effect = FALSE;
switch (gBattleStruct->eventBlockCounter)
{
case FOURTH_EVENT_BLOCK_HUNGER_SWITCH:
{
u32 ability = GetBattlerAbility(battler);
if (ability == ABILITY_HUNGER_SWITCH)
{
if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, battler, ability, 0, MOVE_NONE))
effect = TRUE;
}
gBattleStruct->eventBlockCounter++;
break;
}
case FOURTH_EVENT_BLOCK_EJECT_PACK:
{
enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE);
if (holdEffect == HOLD_EFFECT_EJECT_PACK)
{
if (ItemBattleEffects(ITEMEFFECT_NORMAL, battler))
effect = TRUE;
}
gBattleStruct->eventBlockCounter = 0;
gBattleStruct->turnEffectsBattlerId++;
break;
}
}
return effect;
gBattleStruct->turnEffectsBattlerId++;
return TrySwitchInEjectPack(ITEMEFFECT_NORMAL);
}
static bool32 HandleEndTurnDynamax(u32 battler)
@ -1577,8 +1543,8 @@ static bool32 (*const sEndTurnEffectHandlers[])(u32 battler) =
[ENDTURN_TERRAIN] = HandleEndTurnTerrain,
[ENDTURN_THIRD_EVENT_BLOCK] = HandleEndTurnThirdEventBlock,
[ENDTURN_EMERGENCY_EXIT_4] = HandleEndTurnEmergencyExit,
[ENDTURN_ABILITIES] = HandleEndTurnAbilities,
[ENDTURN_FOURTH_EVENT_BLOCK] = HandleEndTurnFourthEventBlock,
[ENDTURN_FORM_CHANGE_ABILITIES] = HandleEndTurnFormChangeAbilities,
[ENDTURN_EJECT_PACK] = HandleEndTurnEjectPack,
[ENDTURN_DYNAMAX] = HandleEndTurnDynamax,
};

View File

@ -11499,14 +11499,11 @@ bool32 TrySwitchInEjectPack(enum ItemCaseId caseID)
gBattleScripting.battler = battler;
gLastUsedItem = gBattleMons[battler].item;
if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN)
{
BattleScriptPushCursorAndCallback(BattleScript_EjectPackActivate_End3);
}
else if (caseID == ITEMEFFECT_NORMAL)
BattleScriptExecute(BattleScript_EjectPackActivate_End2);
else
{
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_EjectPackActivate_Ret;
}
BattleScriptCall(BattleScript_EjectPackActivate_Ret);
gAiLogicData->ejectPackSwitch = TRUE;
return TRUE;
}

View File

@ -338,3 +338,26 @@ SINGLE_BATTLE_TEST("Eject Pack does not activate if mon is switched in due to Ej
NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent);
}
}
DOUBLE_BATTLE_TEST("Eject Pack will trigger on the fastest mon at the end of the turn")
{
GIVEN {
ASSUME(MoveHasAdditionalEffect(MOVE_SYRUP_BOMB, MOVE_EFFECT_SYRUP_BOMB) == TRUE);
PLAYER(SPECIES_WOBBUFFET) { Speed(1); Item(ITEM_EJECT_PACK); }
PLAYER(SPECIES_WYNAUT) { Speed(10); Item(ITEM_EJECT_PACK); }
PLAYER(SPECIES_WOBBUFFET) { Speed(2); }
OPPONENT(SPECIES_WYNAUT) { Speed(4); }
OPPONENT(SPECIES_WOBBUFFET) { Speed(3); }
} WHEN {
TURN {
MOVE(opponentLeft, MOVE_SYRUP_BOMB, target: playerLeft);
MOVE(opponentRight, MOVE_SYRUP_BOMB, target: playerRight);
SEND_OUT(playerRight, 2);
}
} SCENE {
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_SYRUP_BOMB_SPEED_DROP, playerRight);
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_SYRUP_BOMB_SPEED_DROP, playerLeft);
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerRight);
NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerLeft);
}
}