From 2ce3f4db7888cf0fea42e188148536c3b20c834c Mon Sep 17 00:00:00 2001 From: kittenchilly Date: Thu, 14 Sep 2023 06:08:24 -0500 Subject: [PATCH] Implement Enigma Berry's hold effect + tests (#3300) * Fix Enigma Berry * Tests * Update enigma_berry.c --- src/battle_util.c | 29 +++++++++++++ test/battle/hold_effect/enigma_berry.c | 60 ++++++++++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 test/battle/hold_effect/enigma_berry.c diff --git a/src/battle_util.c b/src/battle_util.c index aabb6e6e8..0b0aadab3 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -6554,6 +6554,29 @@ static u8 TrySetMicleBerry(u32 battler, u32 itemId, bool32 end2) return 0; } +static u8 TrySetEnigmaBerry(u32 battler) +{ + if (IsBattlerAlive(battler) + && TARGET_TURN_DAMAGED + && !DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) + && !(gBattleScripting.overrideBerryRequirements && gBattleMons[battler].hp == gBattleMons[battler].maxHP) +#if B_HEAL_BLOCKING >= GEN_5 + && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK) +#endif + && gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE) + { + gBattleScripting.battler = battler; + gBattleMoveDamage = (gBattleMons[battler].maxHP * 25 / 100) * -1; + if (GetBattlerAbility(battler) == ABILITY_RIPEN) + gBattleMoveDamage *= 2; + + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_ItemHealHP_RemoveItemRet; + return ITEM_HP_CHANGE; + } + return 0; +} + static u8 DamagedStatBoostBerryEffect(u8 battler, u8 statId, u8 split) { if (IsBattlerAlive(battler) @@ -6767,6 +6790,9 @@ static u8 ItemEffectMoveEnd(u32 battler, u16 holdEffect) case HOLD_EFFECT_SP_DEFENSE_UP: effect = StatRaiseBerry(battler, gLastUsedItem, STAT_SPDEF, FALSE); break; + case HOLD_EFFECT_ENIGMA_BERRY: // consume and heal if hit by super effective move + effect = TrySetEnigmaBerry(battler); + break; case HOLD_EFFECT_KEE_BERRY: // consume and boost defense if used physical move effect = DamagedStatBoostBerryEffect(battler, STAT_DEF, SPLIT_PHYSICAL); break; @@ -7730,6 +7756,9 @@ u8 ItemBattleEffects(u8 caseID, u8 battler, bool8 moveTurn) gBattleScripting.statChanger = SET_STATCHANGER(STAT_SPATK, 1, FALSE); } break; + case HOLD_EFFECT_ENIGMA_BERRY: // consume and heal if hit by super effective move + effect = TrySetEnigmaBerry(battler); + break; case HOLD_EFFECT_JABOCA_BERRY: // consume and damage attacker if used physical move if (IsBattlerAlive(battler) && TARGET_TURN_DAMAGED diff --git a/test/battle/hold_effect/enigma_berry.c b/test/battle/hold_effect/enigma_berry.c new file mode 100644 index 000000000..6758ac402 --- /dev/null +++ b/test/battle/hold_effect/enigma_berry.c @@ -0,0 +1,60 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + gItems[ITEM_ENIGMA_BERRY].holdEffect == HOLD_EFFECT_ENIGMA_BERRY; +} + +SINGLE_BATTLE_TEST("Enigma Berry recovers 25% of HP if hit by super effective move") +{ + GIVEN { + PLAYER(SPECIES_WYNAUT) { MaxHP(100); HP(2); Item(ITEM_ENIGMA_BERRY); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_ENDURE); MOVE(opponent, MOVE_BITE); } + } SCENE { + s32 maxHP = GetMonData(&PLAYER_PARTY[0], MON_DATA_MAX_HP); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ENDURE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Wynaut's Enigma Berry restored health!"); + HP_BAR(player, damage: -maxHP / 4); + } +} + +SINGLE_BATTLE_TEST("Enigma Berry does nothing if not hit by super effective move") +{ + GIVEN { + PLAYER(SPECIES_MIGHTYENA) { MaxHP(100); HP(2); Item(ITEM_ENIGMA_BERRY); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_ENDURE); MOVE(opponent, MOVE_BITE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ENDURE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, opponent); + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Mightyena's Enigma Berry restored health!"); + } + } +} + +SINGLE_BATTLE_TEST("Enigma Berry does nothing if Heal Block applies") +{ + GIVEN { + PLAYER(SPECIES_WYNAUT) { MaxHP(100); HP(2); Item(ITEM_ENIGMA_BERRY); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_HEAL_BLOCK); } + TURN { MOVE(player, MOVE_ENDURE); MOVE(opponent, MOVE_BITE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_HEAL_BLOCK, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ENDURE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, opponent); + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Wynaut's Enigma Berry restored health!"); + } + } +}