mirror of
https://github.com/rh-hideout/pokeemerald-expansion.git
synced 2026-03-21 18:04:50 -05:00
707 lines
21 KiB
C
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); }
|
|
}
|
|
}
|