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