Fix Eviolite to use original species after Transform (#9285)

This commit is contained in:
GGbond 2026-02-23 21:51:32 +08:00 committed by GitHub
parent d2ae1175c4
commit 8334c68422
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 88 additions and 3 deletions

View File

@ -61,6 +61,7 @@ struct DisableStruct
{
u32 transformedMonPersonality;
bool8 transformedMonShininess;
u16 transformedMonSpecies;
u16 disabledMove;
u16 encoredMove;
u8 protectUses:4;

View File

@ -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;

View File

@ -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)

View File

@ -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);
}
}