diff --git a/include/battle.h b/include/battle.h index 6c528866cf..3861aa8339 100755 --- a/include/battle.h +++ b/include/battle.h @@ -61,6 +61,7 @@ struct DisableStruct { u32 transformedMonPersonality; bool8 transformedMonShininess; + u16 transformedMonSpecies; u16 disabledMove; u16 encoredMove; u8 protectUses:4; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 4fd3c472e8..de8d68cb51 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -11310,6 +11310,7 @@ static void Cmd_transformdataexecution(void) gBattleMons[gBattlerAttacker].volatiles.transformed = TRUE; gDisableStructs[gBattlerAttacker].disabledMove = MOVE_NONE; gDisableStructs[gBattlerAttacker].disableTimer = 0; + gDisableStructs[gBattlerAttacker].transformedMonSpecies = gBattleMons[gBattlerAttacker].species; gDisableStructs[gBattlerAttacker].transformedMonPersonality = gBattleMons[gBattlerTarget].personality; if (B_TRANSFORM_SHINY >= GEN_4) gDisableStructs[gBattlerAttacker].transformedMonShininess = gBattleMons[gBattlerTarget].isShiny; diff --git a/src/battle_util.c b/src/battle_util.c index 9787bbe282..ee3ae241f7 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8145,8 +8145,13 @@ static inline u32 CalcDefenseStat(struct DamageContext *ctx) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); break; case HOLD_EFFECT_EVIOLITE: - if (CanEvolve(gBattleMons[battlerDef].species)) - modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); + { + u16 species = gBattleMons[battlerDef].species; + if (gBattleMons[battlerDef].volatiles.transformed && gDisableStructs[battlerDef].transformedMonSpecies != SPECIES_NONE) + species = gDisableStructs[battlerDef].transformedMonSpecies; + if (CanEvolve(species)) + modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); + } break; case HOLD_EFFECT_ASSAULT_VEST: if (!usesDefStat) diff --git a/test/battle/hold_effect/eviolite.c b/test/battle/hold_effect/eviolite.c index 1aa0622e43..5387d50929 100644 --- a/test/battle/hold_effect/eviolite.c +++ b/test/battle/hold_effect/eviolite.c @@ -1,4 +1,82 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Eviolite (Hold Effect) test titles") +ASSUMPTIONS +{ + ASSUME(gItemsInfo[ITEM_EVIOLITE].holdEffect == HOLD_EFFECT_EVIOLITE); +} + +SINGLE_BATTLE_TEST("Eviolite boosts Defense and Sp. Def for unevolved Pokemon", s16 damage) +{ + u16 move; + u32 item; + + PARAMETRIZE { move = MOVE_SCRATCH; item = ITEM_EVIOLITE; } + PARAMETRIZE { move = MOVE_SCRATCH; item = ITEM_NONE; } + PARAMETRIZE { move = MOVE_WATER_GUN; item = ITEM_EVIOLITE; } + PARAMETRIZE { move = MOVE_WATER_GUN; item = ITEM_NONE; } + + GIVEN { + ASSUME(GetMoveCategory(MOVE_SCRATCH) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_WATER_GUN) == DAMAGE_CATEGORY_SPECIAL); + PLAYER(SPECIES_PIKACHU) { Item(item); } + OPPONENT(SPECIES_MAGIKARP) { Moves(MOVE_SCRATCH, MOVE_WATER_GUN); } + } WHEN { + TURN { MOVE(opponent, move); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, move, opponent); + HP_BAR(player, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.5), results[1].damage); + EXPECT_MUL_EQ(results[2].damage, Q_4_12(1.5), results[3].damage); + } +} + +SINGLE_BATTLE_TEST("Eviolite does not boost Defense or Sp. Def for evolved Pokemon", s16 damage) +{ + u16 move; + u32 item; + + PARAMETRIZE { move = MOVE_SCRATCH; item = ITEM_EVIOLITE; } + PARAMETRIZE { move = MOVE_SCRATCH; item = ITEM_NONE; } + PARAMETRIZE { move = MOVE_WATER_GUN; item = ITEM_EVIOLITE; } + PARAMETRIZE { move = MOVE_WATER_GUN; item = ITEM_NONE; } + + GIVEN { + ASSUME(GetMoveCategory(MOVE_SCRATCH) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_WATER_GUN) == DAMAGE_CATEGORY_SPECIAL); + PLAYER(SPECIES_RAICHU) { Item(item); } + OPPONENT(SPECIES_MAGIKARP) { Moves(MOVE_SCRATCH, MOVE_WATER_GUN); } + } WHEN { + TURN { MOVE(opponent, move); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, move, opponent); + HP_BAR(player, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.0), results[1].damage); + EXPECT_MUL_EQ(results[2].damage, Q_4_12(1.0), results[3].damage); + } +} + +SINGLE_BATTLE_TEST("Eviolite uses original species after Transform", s16 damage) +{ + u32 item; + + PARAMETRIZE { item = ITEM_EVIOLITE; } + PARAMETRIZE { item = ITEM_NONE; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_TRANSFORM) == EFFECT_TRANSFORM); + PLAYER(SPECIES_PIKACHU) { Item(item); Moves(MOVE_TRANSFORM, MOVE_CELEBRATE); } + OPPONENT(SPECIES_GYARADOS) { Moves(MOVE_SCRATCH, MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(player, MOVE_TRANSFORM); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_SCRATCH); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TRANSFORM, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); + HP_BAR(player, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.5), results[1].damage); + } +}