pokeemerald-expansion/test/battle/ai/can_use_all_moves.c
2026-01-25 10:12:41 +01:00

707 lines
21 KiB
C

#include "global.h"
#include "test/battle.h"
#include "battle_ai_util.h"
// All tests here compare the move to Splash, a move that does nothing and scores 90: the same as Thundershock on a ground type.
// The switch case for effects skips moves that have been human reviewed in three categories: something is wrong in some way; the move is equivalent to Splash for a good reason but a test is not known to exist; a test is known to exist.
// Jump to "TODO: AI HANDLING" and "TODO: AI TESTS"
// In many cases, AI handling exists but is likely insufficient in some way.
AI_DOUBLE_BATTLE_TEST("AI uses Final Gambit")
{
GIVEN {
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT);
PLAYER(SPECIES_WOBBUFFET);
PLAYER(SPECIES_WOBBUFFET);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH, MOVE_FINAL_GAMBIT); }
OPPONENT(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { EXPECT_MOVE(opponentLeft, MOVE_FINAL_GAMBIT); SEND_OUT(playerLeft, 2); }
}
}
AI_DOUBLE_BATTLE_TEST("AI uses Guillotine")
{
GIVEN {
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT);
PLAYER(SPECIES_WOBBUFFET);
PLAYER(SPECIES_WOBBUFFET);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH, MOVE_GUILLOTINE); }
OPPONENT(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { EXPECT_MOVE(opponentLeft, MOVE_GUILLOTINE); SEND_OUT(playerLeft, 2); }
}
}
AI_DOUBLE_BATTLE_TEST("AI uses Sheer Cold")
{
GIVEN {
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT);
PLAYER(SPECIES_WOBBUFFET);
PLAYER(SPECIES_WOBBUFFET);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH, MOVE_SHEER_COLD); }
OPPONENT(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { EXPECT_MOVE(opponentLeft, MOVE_SHEER_COLD); SEND_OUT(playerLeft, 2); }
}
}
AI_DOUBLE_BATTLE_TEST("AI can use all moves, 1-100")
{
u32 moveStart = 0;
u32 moveCap = 100;
if (moveCap > MOVES_COUNT)
moveCap = MOVES_COUNT - 1;
s32 j;
u32 move = MOVE_NONE;
enum BattleMoveEffects effect;
for (j = moveStart + 1; j <= moveCap; j++)
{
effect = GetMoveEffect(j);
// Stat raising effects are not meant to be used when you have only Splash.
if (IsStatRaisingEffect(effect))
continue;
switch (effect)
{
//TODO: AI HANDLING
case EFFECT_OHKO: // Guillotine is crashing the test entirely.
case EFFECT_MIST:
case EFFECT_TELEPORT:
//TODO: AI TESTS
case EFFECT_RESTORE_HP:
case EFFECT_MIMIC:
case EFFECT_DISABLE:
// tests exist elsewhere
// Skipped on purpose.
case EFFECT_PROTECT:
case EFFECT_NON_VOLATILE_STATUS:
case EFFECT_DO_NOTHING:
case EFFECT_HOLD_HANDS:
case EFFECT_CELEBRATE:
case EFFECT_HAPPY_HOUR:
break;
default:
PARAMETRIZE { move = j; }
}
}
GIVEN {
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_HP_AWARE | AI_FLAG_OMNISCIENT);
PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); }
PLAYER(SPECIES_WOBBUFFET);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH, move); Status1(STATUS1_BURN); Item(ITEM_STARF_BERRY); }
OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, move); Item(ITEM_STARF_BERRY); }
OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { EXPECT_MOVE(opponentLeft, move); }
}
}
AI_DOUBLE_BATTLE_TEST("AI can use all moves, 101-200")
{
u32 moveStart = 100;
u32 moveCap = 200;
if (moveCap > MOVES_COUNT)
moveCap = MOVES_COUNT - 1;
s32 j;
u32 move = MOVE_NONE;
enum BattleMoveEffects effect;
for (j = moveStart + 1; j <= moveCap; j++)
{
effect = GetMoveEffect(j);
// Stat raising effects are not meant to be used when you have only Splash.
if (IsStatRaisingEffect(effect))
continue;
switch (effect)
{
//TODO: AI HANDLING
case EFFECT_LIGHT_SCREEN:
case EFFECT_REFLECT:
case EFFECT_BIDE:
case EFFECT_NIGHTMARE:
case EFFECT_SNORE:
case EFFECT_SKETCH:
case EFFECT_BELLY_DRUM:
case EFFECT_DESTINY_BOND:
case EFFECT_MIRROR_MOVE:
case EFFECT_REST:
case EFFECT_SUBSTITUTE:
//TODO: AI TESTS
case EFFECT_RESTORE_HP:
case EFFECT_MIMIC:
case EFFECT_SOFTBOILED:
case EFFECT_DREAM_EATER:
case EFFECT_CONVERSION:
case EFFECT_PERISH_SONG:
case EFFECT_FOCUS_ENERGY:
case EFFECT_SPITE:
// tests exist elsewhere
case EFFECT_HAZE:
// Skipped on purpose.
case EFFECT_PROTECT:
case EFFECT_NON_VOLATILE_STATUS:
case EFFECT_DO_NOTHING:
case EFFECT_HOLD_HANDS:
case EFFECT_CELEBRATE:
case EFFECT_HAPPY_HOUR:
break;
default:
PARAMETRIZE { move = j; }
}
}
GIVEN {
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_HP_AWARE | AI_FLAG_OMNISCIENT);
PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); }
PLAYER(SPECIES_WOBBUFFET);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH, move); Status1(STATUS1_BURN); Item(ITEM_STARF_BERRY); }
OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, move); Item(ITEM_STARF_BERRY); }
OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { EXPECT_MOVE(opponentLeft, move); }
}
}
AI_DOUBLE_BATTLE_TEST("AI can use all moves, 201-300")
{
u32 moveStart = 200;
u32 moveCap = 300;
if (moveCap > MOVES_COUNT)
moveCap = MOVES_COUNT - 1;
s32 j;
u32 move = MOVE_NONE;
enum BattleMoveEffects effect;
for (j = moveStart + 1; j <= moveCap; j++)
{
effect = GetMoveEffect(j);
// Stat raising effects are not meant to be used when you have only Splash.
if (IsStatRaisingEffect(effect))
continue;
switch (effect)
{
//TODO: AI HANDLING
case EFFECT_SLEEP_TALK: // logic exists but does not account for Rest correctly
case EFFECT_SAFEGUARD: // logic exists but does not account for Rest correctly
case EFFECT_FOLLOW_ME:
case EFFECT_SNATCH:
case EFFECT_GRUDGE:
case EFFECT_CAMOUFLAGE:
case EFFECT_IMPRISON:
case EFFECT_INGRAIN:
case EFFECT_MAGIC_COAT:
case EFFECT_MUD_SPORT:
//TODO: AI TESTS
case EFFECT_RESTORE_HP:
case EFFECT_SOFTBOILED:
case EFFECT_ENDURE:
case EFFECT_BATON_PASS:
case EFFECT_ENCORE:
case EFFECT_MORNING_SUN:
case EFFECT_MOONLIGHT:
case EFFECT_SYNTHESIS:
case EFFECT_SPIT_UP:
case EFFECT_SWALLOW:
case EFFECT_WISH:
case EFFECT_RECYCLE:
// tests exist elsewhere
case EFFECT_HEAL_BELL:
case EFFECT_SUNNY_DAY:
case EFFECT_RAIN_DANCE:
#if B_PREFERRED_ICE_WEATHER == B_ICE_WEATHER_SNOW
case EFFECT_SNOWSCAPE:
#else
case EFFECT_HAIL:
#endif
case EFFECT_ROLE_PLAY:
case EFFECT_REFRESH:
// Skipped on purpose.
case EFFECT_PROTECT:
case EFFECT_NON_VOLATILE_STATUS:
case EFFECT_SANDSTORM:
case EFFECT_DO_NOTHING:
case EFFECT_HOLD_HANDS:
case EFFECT_CELEBRATE:
case EFFECT_HAPPY_HOUR:
break;
default:
PARAMETRIZE { move = j; }
}
}
GIVEN {
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_HP_AWARE | AI_FLAG_OMNISCIENT);
PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); }
PLAYER(SPECIES_WOBBUFFET);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH, move); Status1(STATUS1_BURN); Item(ITEM_STARF_BERRY); }
OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, move); Item(ITEM_STARF_BERRY); }
OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { EXPECT_MOVE(opponentLeft, move); }
}
}
AI_DOUBLE_BATTLE_TEST("AI can use all moves, 301-400")
{
u32 moveStart = 300;
u32 moveCap = 400;
if (moveCap > MOVES_COUNT)
moveCap = MOVES_COUNT - 1;
s32 j;
u32 move = MOVE_NONE;
enum BattleMoveEffects effect;
for (j = moveStart + 1; j <= moveCap; j++)
{
effect = GetMoveEffect(j);
// Stat raising effects are not meant to be used when you have only Splash.
if (IsStatRaisingEffect(effect))
continue;
switch (effect)
{
//TODO: AI HANDLING
case EFFECT_SHEER_COLD: // Guillotine is crashing the test entirely.
case EFFECT_WATER_SPORT:
case EFFECT_LUCKY_CHANT:
case EFFECT_ME_FIRST:
case EFFECT_PSYCHO_SHIFT:
case EFFECT_COPYCAT:
case EFFECT_LAST_RESORT:
case EFFECT_AQUA_RING:
case EFFECT_HEALING_WISH:
case EFFECT_LUNAR_DANCE:
//TODO: AI TESTS
case EFFECT_RESTORE_HP:
case EFFECT_ROOST:
case EFFECT_GUARD_SWAP:
case EFFECT_POWER_SWAP:
case EFFECT_HEART_SWAP:
case EFFECT_TAILWIND:
case EFFECT_POWER_TRICK:
case EFFECT_MAGNET_RISE:
// tests exist elsewhere
case EFFECT_GRAVITY:
case EFFECT_HEAL_BELL:
case EFFECT_ATTACK_UP_USER_ALLY:
// Skipped on purpose.
case EFFECT_PROTECT:
case EFFECT_NON_VOLATILE_STATUS:
case EFFECT_DO_NOTHING:
case EFFECT_HOLD_HANDS:
case EFFECT_CELEBRATE:
case EFFECT_HAPPY_HOUR:
break;
default:
PARAMETRIZE { move = j; }
}
}
GIVEN {
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_HP_AWARE | AI_FLAG_OMNISCIENT);
PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); }
PLAYER(SPECIES_WOBBUFFET);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH, move); Status1(STATUS1_BURN); Item(ITEM_STARF_BERRY); }
OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, move); Item(ITEM_STARF_BERRY); }
OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { EXPECT_MOVE(opponentLeft, move); }
}
}
AI_DOUBLE_BATTLE_TEST("AI can use all moves, 401-500")
{
u32 moveStart = 400;
u32 moveCap = 500;
if (moveCap > MOVES_COUNT)
moveCap = MOVES_COUNT - 1;
s32 j;
u32 move = MOVE_NONE;
enum BattleMoveEffects effect;
for (j = moveStart + 1; j <= moveCap; j++)
{
effect = GetMoveEffect(j);
// Stat raising effects are not meant to be used when you have only Splash.
if (IsStatRaisingEffect(effect))
continue;
switch (effect)
{
//TODO: AI HANDLING
case EFFECT_HEALING_WISH:
case EFFECT_LUNAR_DANCE:
case EFFECT_WONDER_ROOM:
case EFFECT_FOLLOW_ME:
case EFFECT_MAGIC_ROOM:
case EFFECT_AFTER_YOU:
//TODO: AI TESTS
case EFFECT_RESTORE_HP:
case EFFECT_CAPTIVATE:
case EFFECT_DARK_VOID: // Gen 4-6's case is not being handled
// tests exist elsewhere
case EFFECT_TRICK_ROOM:
case EFFECT_GUARD_SPLIT:
case EFFECT_POWER_SPLIT:
// Skipped on purpose.
case EFFECT_PROTECT:
case EFFECT_NON_VOLATILE_STATUS:
case EFFECT_DO_NOTHING:
case EFFECT_HOLD_HANDS:
case EFFECT_CELEBRATE:
case EFFECT_HAPPY_HOUR:
break;
default:
PARAMETRIZE { move = j; }
}
}
GIVEN {
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_HP_AWARE | AI_FLAG_OMNISCIENT);
PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); }
PLAYER(SPECIES_WOBBUFFET);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH, move); Status1(STATUS1_BURN); Item(ITEM_STARF_BERRY); }
OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, move); Item(ITEM_STARF_BERRY); }
OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { EXPECT_MOVE(opponentLeft, move); }
}
}
AI_DOUBLE_BATTLE_TEST("AI can use all moves, 501-600")
{
u32 moveStart = 515;
u32 moveCap = 600;
if (moveCap > MOVES_COUNT)
moveCap = MOVES_COUNT - 1;
s32 j;
u32 move = MOVE_NONE;
enum BattleMoveEffects effect;
for (j = moveStart + 1; j <= moveCap; j++)
{
effect = GetMoveEffect(j);
// Stat raising effects are not meant to be used when you have only Splash.
if (IsStatRaisingEffect(effect))
continue;
switch (effect)
{
case EFFECT_FINAL_GAMBIT:
//TODO: AI HANDLING
case EFFECT_ALLY_SWITCH:
case EFFECT_QUASH:
case EFFECT_REFLECT_TYPE:
case EFFECT_SKY_DROP:
case EFFECT_MAT_BLOCK:
case EFFECT_ION_DELUGE:
case EFFECT_AROMATIC_MIST:
case EFFECT_POWDER:
case EFFECT_ELECTRIFY:
//TODO: AI TESTS
case EFFECT_RESTORE_HP:
case EFFECT_HEAL_PULSE:
case EFFECT_BELCH:
case EFFECT_TOPSY_TURVY:
case EFFECT_FAIRY_LOCK:
// tests exist elsewhere
case EFFECT_FLOWER_SHIELD:
case EFFECT_ROTOTILLER:
case EFFECT_GRASSY_TERRAIN:
case EFFECT_MISTY_TERRAIN:
// Skipped on purpose.
case EFFECT_PROTECT:
case EFFECT_NON_VOLATILE_STATUS:
case EFFECT_DO_NOTHING:
case EFFECT_HOLD_HANDS:
case EFFECT_CELEBRATE:
case EFFECT_HAPPY_HOUR:
break;
default:
PARAMETRIZE { move = j; }
}
}
GIVEN {
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_HP_AWARE | AI_FLAG_OMNISCIENT);
PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); }
PLAYER(SPECIES_WOBBUFFET);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH, move); Status1(STATUS1_BURN); Item(ITEM_STARF_BERRY); }
OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, move); Item(ITEM_STARF_BERRY); }
OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { EXPECT_MOVE(opponentLeft, move); }
}
}
AI_DOUBLE_BATTLE_TEST("AI can use all moves, 601-700")
{
u32 moveStart = 600;
u32 moveCap = 700;
if (moveCap > MOVES_COUNT)
moveCap = MOVES_COUNT - 1;
s32 j;
u32 move = MOVE_NONE;
enum BattleMoveEffects effect;
for (j = moveStart + 1; j <= moveCap; j++)
{
effect = GetMoveEffect(j);
// Stat raising effects are not meant to be used when you have only Splash.
if (IsStatRaisingEffect(effect))
continue;
switch (effect)
{
//TODO: AI HANDLING
case EFFECT_FAIL_IF_NOT_ARG_TYPE:
case EFFECT_STUFF_CHEEKS:
case EFFECT_NO_RETREAT:
case EFFECT_TEATIME:
//TODO: AI TESTS
case EFFECT_RESTORE_HP:
case EFFECT_SHORE_UP:
case EFFECT_HEAL_PULSE:
case EFFECT_LASER_FOCUS:
case EFFECT_PURIFY:
case EFFECT_INSTRUCT:
case EFFECT_SOAK:
// tests exist elsewhere
case EFFECT_ELECTRIC_TERRAIN:
case EFFECT_PSYCHIC_TERRAIN:
case EFFECT_AURORA_VEIL:
case EFFECT_GEAR_UP:
case EFFECT_MAGNETIC_FLUX:
// Skipped on purpose.
case EFFECT_PROTECT:
case EFFECT_NON_VOLATILE_STATUS:
case EFFECT_DO_NOTHING:
case EFFECT_HOLD_HANDS:
case EFFECT_CELEBRATE:
case EFFECT_HAPPY_HOUR:
break;
default:
PARAMETRIZE { move = j; }
}
}
GIVEN {
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_HP_AWARE | AI_FLAG_OMNISCIENT);
PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); }
PLAYER(SPECIES_WOBBUFFET);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH, move); Status1(STATUS1_BURN); Item(ITEM_STARF_BERRY); }
OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, move); Item(ITEM_STARF_BERRY); }
OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { EXPECT_MOVE(opponentLeft, move); }
}
}
AI_DOUBLE_BATTLE_TEST("AI can use all moves, 701-800")
{
u32 moveStart = 700;
u32 moveCap = 800;
if (moveCap > MOVES_COUNT)
moveCap = MOVES_COUNT - 1;
s32 j;
u32 move = MOVE_NONE;
enum BattleMoveEffects effect;
for (j = moveStart + 1; j <= moveCap; j++)
{
effect = GetMoveEffect(j);
// Stat raising effects are not meant to be used when you have only Splash.
if (IsStatRaisingEffect(effect))
continue;
switch (effect)
{
//TODO: AI HANDLING
case EFFECT_CLANGOROUS_SOUL:
case EFFECT_POLTERGEIST:
case EFFECT_COACHING:
case EFFECT_REVIVAL_BLESSING:
case EFFECT_FILLET_AWAY:
//TODO: AI TESTS
case EFFECT_RESTORE_HP:
case EFFECT_STEEL_ROLLER:
case EFFECT_JUNGLE_HEALING:
case EFFECT_POWER_TRICK:
case EFFECT_TAKE_HEART:
// tests exist elsewhere
case EFFECT_COURT_CHANGE:
case EFFECT_DOODLE:
case EFFECT_LIFE_DEW:
// Skipped on purpose.
case EFFECT_PROTECT:
case EFFECT_NON_VOLATILE_STATUS:
case EFFECT_DO_NOTHING:
case EFFECT_HOLD_HANDS:
case EFFECT_CELEBRATE:
case EFFECT_HAPPY_HOUR:
break;
default:
PARAMETRIZE { move = j; }
}
}
GIVEN {
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_HP_AWARE | AI_FLAG_OMNISCIENT);
PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); }
PLAYER(SPECIES_WOBBUFFET);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH, move); Status1(STATUS1_BURN); Item(ITEM_STARF_BERRY); }
OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, move); Item(ITEM_STARF_BERRY); }
OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { EXPECT_MOVE(opponentLeft, move); }
}
}
AI_DOUBLE_BATTLE_TEST("AI can use all moves, 801-900")
{
u32 moveStart = 800;
u32 moveCap = 900;
if (moveCap > MOVES_COUNT)
moveCap = MOVES_COUNT - 1;
s32 j;
u32 move = MOVE_NONE;
enum BattleMoveEffects effect;
for (j = moveStart + 1; j <= moveCap; j++)
{
effect = GetMoveEffect(j);
// Stat raising effects are not meant to be used when you have only Splash.
if (IsStatRaisingEffect(effect))
continue;
switch (effect)
{
//TODO: AI HANDLING
case EFFECT_SHED_TAIL:
case EFFECT_FAIL_IF_NOT_ARG_TYPE:
//TODO: AI TESTS
case EFFECT_CHILLY_RECEPTION:
case EFFECT_TIDY_UP:
// tests exist elsewhere
case EFFECT_SNOWSCAPE:
case EFFECT_DRAGON_CHEER:
// Skipped on purpose.
case EFFECT_PROTECT:
case EFFECT_NON_VOLATILE_STATUS:
case EFFECT_DO_NOTHING:
case EFFECT_HOLD_HANDS:
case EFFECT_CELEBRATE:
case EFFECT_HAPPY_HOUR:
break;
default:
PARAMETRIZE { move = j; }
}
}
GIVEN {
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_HP_AWARE | AI_FLAG_OMNISCIENT);
PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); }
PLAYER(SPECIES_WOBBUFFET);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH, move); Status1(STATUS1_BURN); Item(ITEM_STARF_BERRY); }
OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_POUND, move); Item(ITEM_STARF_BERRY); }
OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { EXPECT_MOVE(opponentLeft, move); }
}
}