pokeemerald-expansion/test/battle/ai/ai_flag_sequence_switching.c
Hedara 78124e88d7 Merge commit '0e33bf916e80e4dcf4f96ca0419a8b2fda5da51d' into master-to-upcoming
Conflicts:
	src/battle_main.c
	test/battle/ability/beads_of_ruin.c
	test/battle/ability/commander.c
	test/battle/ability/desolate_land.c
	test/battle/ability/primordial_sea.c
	test/battle/ability/supreme_overlord.c
	test/battle/ability/sword_of_ruin.c
	test/battle/ability/tablets_of_ruin.c
	test/battle/ability/vessel_of_ruin.c
	test/battle/ai/ai.c
	test/battle/ai/ai_multi.c
	test/battle/ai/ai_switching.c
	test/battle/gimmick/dynamax.c
	test/battle/move_effect/counter.c
	test/battle/move_effect/fling.c
	test/battle/move_effect/mirror_coat.c
	test/battle/move_effect/misty_explosion.c
	test/battle/move_effect/protect.c
	test/battle/move_effect/psychic_terrain.c
	test/battle/move_effect/sticky_web.c
	test/battle/trainer_slides.c
2026-01-04 11:28:59 +01:00

132 lines
5.2 KiB
C

#include "global.h"
#include "test/battle.h"
AI_SINGLE_BATTLE_TEST("AI_FLAG_SEQUENCE_SWITCHING: AI will always switch after a KO in exactly party order")
{
u32 aiSequenceSwitchingFlag = 0;
PARAMETRIZE { aiSequenceSwitchingFlag = 0; }
PARAMETRIZE { aiSequenceSwitchingFlag = AI_FLAG_SEQUENCE_SWITCHING; }
GIVEN {
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiSequenceSwitchingFlag);
PLAYER(SPECIES_SWELLOW) { Level (50); }
OPPONENT(SPECIES_MACHOP) { Level(5); }
OPPONENT(SPECIES_MACHOKE) { Level(5); }
OPPONENT(SPECIES_MACHAMP) { Level(5); }
OPPONENT(SPECIES_MANKEY) { Level(5); }
OPPONENT(SPECIES_PRIMEAPE) { Level(5); }
OPPONENT(SPECIES_MAGNEZONE) { Level(100); }
} WHEN {
TURN { MOVE(player, MOVE_WING_ATTACK); }
if (aiSequenceSwitchingFlag) {
TURN { MOVE(player, MOVE_WING_ATTACK); }
TURN { MOVE(player, MOVE_WING_ATTACK); }
TURN { MOVE(player, MOVE_WING_ATTACK); }
TURN { MOVE(player, MOVE_WING_ATTACK); }
}
} SCENE {
if (aiSequenceSwitchingFlag) {
MESSAGE(AI_TRAINER_NAME " sent out Machoke!");
MESSAGE(AI_TRAINER_NAME " sent out Machamp!");
MESSAGE(AI_TRAINER_NAME " sent out Mankey!");
MESSAGE(AI_TRAINER_NAME " sent out Primeape!");
MESSAGE(AI_TRAINER_NAME " sent out Magnezone!");
}
else {
MESSAGE(AI_TRAINER_NAME " sent out Magnezone!");
}
}
}
AI_SINGLE_BATTLE_TEST("AI_FLAG_SEQUENCE_SWITCHING: Roar and Dragon Tail still force switch to random party member")
{
enum Move move;
PARAMETRIZE { move = MOVE_ROAR; }
PARAMETRIZE { move = MOVE_DRAGON_TAIL; }
PASSES_RANDOMLY(1, 2, RNG_FORCE_RANDOM_SWITCH);
GIVEN {
ASSUME(GetMoveEffect(MOVE_ROAR) == EFFECT_ROAR);
ASSUME(GetMoveEffect(MOVE_DRAGON_TAIL) == EFFECT_HIT_SWITCH_TARGET);
AI_FLAGS(AI_FLAG_SEQUENCE_SWITCHING);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_BULBASAUR);
OPPONENT(SPECIES_CHARMANDER);
OPPONENT(SPECIES_SQUIRTLE) { HP(0); }
} WHEN {
TURN { MOVE(player, move); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, move, player);
MESSAGE("The opposing Bulbasaur was dragged out!");
}
}
AI_SINGLE_BATTLE_TEST("AI_FLAG_SEQUENCE_SWITCHING: AI will always switch into lowest party index after U-Turn, Parting Shot, Baton Pass, and Chilly Reception")
{
u32 j, aiSequenceSwitchingFlag = 0, move = MOVE_NONE;
static const u32 switchMoves[] = {
MOVE_U_TURN,
MOVE_PARTING_SHOT,
MOVE_BATON_PASS,
MOVE_CHILLY_RECEPTION,
};
for (j = 0; j < ARRAY_COUNT(switchMoves); j++)
{
PARAMETRIZE { aiSequenceSwitchingFlag = 0; move = switchMoves[j]; }
PARAMETRIZE { aiSequenceSwitchingFlag = AI_FLAG_SEQUENCE_SWITCHING; move = switchMoves[j]; }
}
GIVEN {
ASSUME(GetMoveEffect(MOVE_U_TURN) == EFFECT_HIT_ESCAPE);
ASSUME(GetMoveEffect(MOVE_PARTING_SHOT) == EFFECT_PARTING_SHOT);
ASSUME(GetMoveEffect(MOVE_BATON_PASS) == EFFECT_BATON_PASS);
ASSUME(GetMoveEffect(MOVE_CHILLY_RECEPTION) == EFFECT_WEATHER_AND_SWITCH);
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiSequenceSwitchingFlag);
PLAYER(SPECIES_SWELLOW) { Level (50); }
OPPONENT(SPECIES_MACHOP) { Level(1); Moves(move); }
OPPONENT(SPECIES_MACHOP) { Level(2); Moves(move); }
OPPONENT(SPECIES_MACHOP) { Level(3); Moves(move); }
OPPONENT(SPECIES_MACHOP) { Level(4); Moves(move); }
OPPONENT(SPECIES_MACHOP) { Level(5); Moves(move); }
OPPONENT(SPECIES_MAGNEZONE) { Level(100); Moves(move); }
} WHEN {
if (aiSequenceSwitchingFlag) {
TURN { EXPECT_MOVE(opponent, move) ; EXPECT_SEND_OUT(opponent, 1); }
TURN { EXPECT_MOVE(opponent, move) ; EXPECT_SEND_OUT(opponent, 0); }
TURN { EXPECT_MOVE(opponent, move) ; EXPECT_SEND_OUT(opponent, 1); }
TURN { EXPECT_MOVE(opponent, move) ; EXPECT_SEND_OUT(opponent, 0); }
TURN { EXPECT_MOVE(opponent, move) ; EXPECT_SEND_OUT(opponent, 1); }
}
else {
TURN { EXPECT_MOVE(opponent, move) ; EXPECT_SEND_OUT(opponent, 5); }
}
}
}
AI_SINGLE_BATTLE_TEST("AI_FLAG_SEQUENCE_SWITCHING: AI will not switch mid-battle")
{
u32 aiSequenceSwitchingFlag = 0;
PARAMETRIZE { aiSequenceSwitchingFlag = 0; }
PARAMETRIZE { aiSequenceSwitchingFlag = AI_FLAG_SEQUENCE_SWITCHING; }
GIVEN {
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiSequenceSwitchingFlag);
PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_LICK); }
OPPONENT(SPECIES_GASTLY) { Moves(MOVE_SHADOW_BALL); }
OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_KARATE_CHOP); }
} WHEN {
if (aiSequenceSwitchingFlag == AI_FLAG_SEQUENCE_SWITCHING) {
TURN { MOVE(player, MOVE_LICK) ; EXPECT_MOVE(opponent, MOVE_SHADOW_BALL); }
}
else {
TURN { MOVE(player, MOVE_LICK) ; EXPECT_SWITCH(opponent, 1); }
}
}
}