pokeemmo/test/battle/hold_effect/weakness_berry.c
2025-10-27 16:41:22 +00:00

127 lines
5.2 KiB
C

#include "global.h"
#include "test/battle.h"
static const u16 sMoveItemTable[][4] =
{
{ TYPE_NORMAL, MOVE_SCRATCH, ITEM_CHILAN_BERRY, SPECIES_WOBBUFFET },
{ TYPE_FIGHTING, MOVE_KARATE_CHOP, ITEM_CHOPLE_BERRY, SPECIES_RAMPARDOS },
{ TYPE_FLYING, MOVE_WING_ATTACK, ITEM_COBA_BERRY, SPECIES_HARIYAMA },
{ TYPE_POISON, MOVE_POISON_STING, ITEM_KEBIA_BERRY, SPECIES_GOGOAT },
{ TYPE_GROUND, MOVE_MUD_SHOT, ITEM_SHUCA_BERRY, SPECIES_RAMPARDOS },
{ TYPE_ROCK, MOVE_ROCK_THROW, ITEM_CHARTI_BERRY, SPECIES_CORVISQUIRE },
{ TYPE_BUG, MOVE_BUG_BITE, ITEM_TANGA_BERRY, SPECIES_WOBBUFFET },
{ TYPE_GHOST, MOVE_SHADOW_PUNCH, ITEM_KASIB_BERRY, SPECIES_WOBBUFFET },
{ TYPE_STEEL, MOVE_METAL_CLAW, ITEM_BABIRI_BERRY, SPECIES_RAMPARDOS },
{ TYPE_FIRE, MOVE_EMBER, ITEM_OCCA_BERRY, SPECIES_GOGOAT },
{ TYPE_WATER, MOVE_WATER_GUN, ITEM_PASSHO_BERRY, SPECIES_RAMPARDOS },
{ TYPE_GRASS, MOVE_VINE_WHIP, ITEM_RINDO_BERRY, SPECIES_RAMPARDOS },
{ TYPE_ELECTRIC, MOVE_THUNDER_SHOCK, ITEM_WACAN_BERRY, SPECIES_CORVISQUIRE },
{ TYPE_PSYCHIC, MOVE_CONFUSION, ITEM_PAYAPA_BERRY, SPECIES_HARIYAMA },
{ TYPE_ICE, MOVE_AURORA_BEAM, ITEM_YACHE_BERRY, SPECIES_DRAGONAIR },
{ TYPE_DRAGON, MOVE_DRAGON_BREATH, ITEM_HABAN_BERRY, SPECIES_DRAGONAIR },
{ TYPE_DARK, MOVE_BITE, ITEM_COLBUR_BERRY, SPECIES_WOBBUFFET },
{ TYPE_FAIRY, MOVE_DISARMING_VOICE, ITEM_ROSELI_BERRY, SPECIES_DRAGONAIR },
};
SINGLE_BATTLE_TEST("Weakness berries decrease the base power of moves by half", s16 damage)
{
u32 move = 0, item = 0, defender = 0;
enum Type type = TYPE_NONE;
for (u32 j = 0; j < ARRAY_COUNT(sMoveItemTable); j++)
{
PARAMETRIZE { type = sMoveItemTable[j][0]; move = sMoveItemTable[j][1]; defender = sMoveItemTable[j][3]; item = ITEM_NONE; }
PARAMETRIZE { type = sMoveItemTable[j][0]; move = sMoveItemTable[j][1]; defender = sMoveItemTable[j][3]; item = sMoveItemTable[j][2]; }
}
GIVEN {
ASSUME(GetMovePower(move) > 0);
ASSUME(GetMoveType(move) == type);
ASSUME(GetSpeciesType(defender, 0) == GetSpeciesType(defender, 1));
if (type != TYPE_NORMAL) {
ASSUME(gTypeEffectivenessTable[type][GetSpeciesType(defender, 0)] > UQ_4_12(1.0));
}
if (item != ITEM_NONE) {
ASSUME(GetItemHoldEffect(item) == HOLD_EFFECT_RESIST_BERRY);
ASSUME(GetItemHoldEffectParam(item) == type);
}
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(defender) { Item(item); }
} WHEN {
TURN { MOVE(player, move); }
} SCENE {
if (1 == i % 2) {
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent);
}
HP_BAR(opponent, captureDamage: &results[i].damage);
} FINALLY {
for (u32 j = 0; j < ARRAY_COUNT(sMoveItemTable); j++) {
EXPECT_MUL_EQ(results[j*2].damage, Q_4_12(0.5), results[(j*2)+1].damage);
}
}
}
SINGLE_BATTLE_TEST("Weakness berries do not activate unless a move is super effective", s16 damage)
{
u32 move = 0, item = 0, defender = 0;
enum Type type = TYPE_NONE;
for (u32 j = 0; j < ARRAY_COUNT(sMoveItemTable); j++)
{
if (TYPE_NORMAL == type)
{
// ITEM_CHILAN_BERRY activates without a weakness
}
else if (TYPE_FAIRY == type)
{
PARAMETRIZE { type = sMoveItemTable[j][0]; move = sMoveItemTable[j][1]; item = sMoveItemTable[j][2]; defender = SPECIES_WOBBUFFET; }
}
else
{
PARAMETRIZE { type = sMoveItemTable[j][0]; move = sMoveItemTable[j][1]; item = sMoveItemTable[j][2]; defender = SPECIES_SABLEYE; }
}
}
GIVEN {
ASSUME(GetMovePower(move) > 0);
ASSUME(uq4_12_multiply(gTypeEffectivenessTable[type][GetSpeciesType(defender, 0)],
gTypeEffectivenessTable[type][GetSpeciesType(defender, 1)]) <= UQ_4_12(1.0));
ASSUME(GetItemHoldEffect(item) == HOLD_EFFECT_RESIST_BERRY);
ASSUME(GetItemHoldEffectParam(item) == type);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(defender) { Item(item); }
} WHEN {
TURN { MOVE(player, move); }
} SCENE {
NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent);
}
}
SINGLE_BATTLE_TEST("Weakness berries do not decrease the power of Struggle", s16 damage)
{
u32 item = 0;
PARAMETRIZE { item = ITEM_NONE; }
PARAMETRIZE { item = ITEM_CHILAN_BERRY; }
GIVEN {
if (item != ITEM_NONE) {
ASSUME(GetItemHoldEffect(item) == HOLD_EFFECT_RESIST_BERRY);
ASSUME(GetItemHoldEffectParam(item) == TYPE_NORMAL);
}
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET) { Item(item); }
} WHEN {
TURN { MOVE(player, MOVE_STRUGGLE); }
} SCENE {
NONE_OF {
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent);
MESSAGE("The Chilan Berry weakened the damage to the opposing Wobbuffet!");
}
ANIMATION(ANIM_TYPE_MOVE, MOVE_STRUGGLE, player);
HP_BAR(opponent, captureDamage: &results[i].damage);
} FINALLY {
EXPECT_EQ(results[0].damage, results[1].damage);
}
}