fix last tests

This commit is contained in:
AlexOn1ine 2024-12-29 10:23:46 +01:00
parent 3ac4f81de9
commit c9bde52fd2
2 changed files with 119 additions and 110 deletions

View File

@ -96,6 +96,109 @@ static const u8 sPkblToEscapeFactor[][3] = {
static const u8 sGoNearCounterToCatchFactor[] = {4, 3, 2, 1};
static const u8 sGoNearCounterToEscapeFactor[] = {4, 4, 4, 4};
struct BattleWeatherInfo
{
u16 flag;
u8 rock;
u8 endMessage;
u8 continuesMessage;
u8 animation;
};
static const struct BattleWeatherInfo sBattleWeatherInfo[BATTLE_WEATHER_COUNT] =
{
[BATTLE_WEATHER_RAIN] =
{
.flag = B_WEATHER_RAIN_NORMAL,
.rock = HOLD_EFFECT_DAMP_ROCK,
.endMessage = B_MSG_WEATHER_END_RAIN,
.continuesMessage = B_MSG_WEATHER_TURN_RAIN,
.animation = B_ANIM_RAIN_CONTINUES,
},
[BATTLE_WEATHER_RAIN_PRIMAL] =
{
.flag = B_WEATHER_RAIN_PRIMAL,
.rock = HOLD_EFFECT_DAMP_ROCK,
.endMessage = B_MSG_WEATHER_END_RAIN,
.continuesMessage = B_MSG_WEATHER_TURN_RAIN,
.animation = B_ANIM_RAIN_CONTINUES,
},
[BATTLE_WEATHER_RAIN_DOWNPOUR] =
{
.flag = B_WEATHER_RAIN_NORMAL,
.rock = HOLD_EFFECT_DAMP_ROCK,
.endMessage = B_MSG_WEATHER_END_RAIN,
.continuesMessage = B_MSG_WEATHER_TURN_DOWNPOUR,
.animation = B_ANIM_RAIN_CONTINUES,
},
[BATTLE_WEATHER_SUN] =
{
.flag = B_WEATHER_SUN_NORMAL,
.rock = HOLD_EFFECT_HEAT_ROCK,
.endMessage = B_MSG_WEATHER_END_SUN,
.continuesMessage = B_MSG_WEATHER_TURN_SUN,
.animation = B_ANIM_SUN_CONTINUES,
},
[BATTLE_WEATHER_SUN_PRIMAL] =
{
.flag = B_WEATHER_SUN_PRIMAL,
.rock = HOLD_EFFECT_HEAT_ROCK,
.endMessage = B_MSG_WEATHER_END_SUN,
.continuesMessage = B_MSG_WEATHER_TURN_SUN,
.animation = B_ANIM_SUN_CONTINUES,
},
[BATTLE_WEATHER_SANDSTORM] =
{
.flag = B_WEATHER_SANDSTORM,
.rock = HOLD_EFFECT_SMOOTH_ROCK,
.endMessage = B_MSG_WEATHER_END_SANDSTORM,
.continuesMessage = B_MSG_WEATHER_TURN_SANDSTORM,
.animation = B_ANIM_SANDSTORM_CONTINUES,
},
[BATTLE_WEATHER_HAIL] =
{
.flag = B_WEATHER_HAIL,
.rock = HOLD_EFFECT_ICY_ROCK,
.endMessage = B_MSG_WEATHER_END_HAIL,
.continuesMessage = B_MSG_WEATHER_TURN_HAIL,
.animation = B_ANIM_HAIL_CONTINUES,
},
[BATTLE_WEATHER_SNOW] =
{
.flag = B_WEATHER_SNOW,
.rock = HOLD_EFFECT_ICY_ROCK,
.endMessage = B_MSG_WEATHER_END_SNOW,
.continuesMessage = B_MSG_WEATHER_TURN_SNOW,
.animation = B_ANIM_SNOW_CONTINUES,
},
[BATTLE_WEATHER_FOG] =
{
.flag = B_WEATHER_FOG,
.rock = HOLD_EFFECT_NONE,
.endMessage = B_MSG_WEATHER_END_FOG,
.continuesMessage = B_MSG_WEATHER_TURN_FOG,
.animation = B_ANIM_FOG_CONTINUES,
},
[BATTLE_WEATHER_STRONG_WINDS] =
{
.flag = B_WEATHER_STRONG_WINDS,
.rock = HOLD_EFFECT_NONE,
.endMessage = B_MSG_WEATHER_END_STRONG_WINDS,
.continuesMessage = B_MSG_WEATHER_TURN_STRONG_WINDS,
.animation = B_ANIM_STRONG_WINDS,
},
};
static u8 CalcBeatUpPower(void)
{
u8 basePower;
@ -1564,108 +1667,6 @@ static bool32 EndTurnTerrain(u32 terrainFlag, u32 stringTableId)
return FALSE;
}
struct BattleWeatherInfo
{
u16 flag;
u8 rock;
u8 endMessage;
u8 continuesMessage;
u8 animation;
};
static const struct BattleWeatherInfo sBattleWeatherInfo[BATTLE_WEATHER_COUNT] =
{
[BATTLE_WEATHER_RAIN] =
{
.flag = B_WEATHER_RAIN_NORMAL,
.rock = HOLD_EFFECT_DAMP_ROCK,
.endMessage = B_MSG_WEATHER_END_RAIN,
.continuesMessage = B_MSG_WEATHER_TURN_RAIN,
.animation = B_ANIM_RAIN_CONTINUES,
},
[BATTLE_WEATHER_RAIN_PRIMAL] =
{
.flag = B_WEATHER_RAIN_PRIMAL,
.rock = HOLD_EFFECT_DAMP_ROCK,
.endMessage = B_MSG_WEATHER_END_RAIN,
.continuesMessage = B_MSG_WEATHER_TURN_RAIN,
.animation = B_ANIM_RAIN_CONTINUES,
},
[BATTLE_WEATHER_RAIN_DOWNPOUR] =
{
.flag = B_WEATHER_RAIN_NORMAL,
.rock = HOLD_EFFECT_DAMP_ROCK,
.endMessage = B_MSG_WEATHER_END_RAIN,
.continuesMessage = B_MSG_WEATHER_TURN_DOWNPOUR,
.animation = B_ANIM_RAIN_CONTINUES,
},
[BATTLE_WEATHER_SUN] =
{
.flag = B_WEATHER_SUN_NORMAL,
.rock = HOLD_EFFECT_HEAT_ROCK,
.endMessage = B_MSG_WEATHER_END_SUN,
.continuesMessage = B_MSG_WEATHER_TURN_SUN,
.animation = B_ANIM_SUN_CONTINUES,
},
[BATTLE_WEATHER_SUN_PRIMAL] =
{
.flag = B_WEATHER_SUN_PRIMAL,
.rock = HOLD_EFFECT_HEAT_ROCK,
.endMessage = B_MSG_WEATHER_END_SUN,
.continuesMessage = B_MSG_WEATHER_TURN_SUN,
.animation = B_ANIM_SUN_CONTINUES,
},
[BATTLE_WEATHER_SANDSTORM] =
{
.flag = B_WEATHER_SANDSTORM,
.rock = HOLD_EFFECT_SMOOTH_ROCK,
.endMessage = B_MSG_WEATHER_END_SANDSTORM,
.continuesMessage = B_MSG_WEATHER_TURN_SANDSTORM,
.animation = B_ANIM_SANDSTORM_CONTINUES,
},
[BATTLE_WEATHER_HAIL] =
{
.flag = B_WEATHER_HAIL,
.rock = HOLD_EFFECT_ICY_ROCK,
.endMessage = B_MSG_WEATHER_END_HAIL,
.continuesMessage = B_MSG_WEATHER_TURN_HAIL,
.animation = B_ANIM_HAIL_CONTINUES,
},
[BATTLE_WEATHER_SNOW] =
{
.flag = B_WEATHER_SNOW,
.rock = HOLD_EFFECT_ICY_ROCK,
.endMessage = B_MSG_WEATHER_END_SNOW,
.continuesMessage = B_MSG_WEATHER_TURN_SNOW,
.animation = B_ANIM_SNOW_CONTINUES,
},
[BATTLE_WEATHER_FOG] =
{
.flag = B_WEATHER_FOG,
.rock = HOLD_EFFECT_NONE,
.endMessage = B_MSG_WEATHER_END_FOG,
.continuesMessage = B_MSG_WEATHER_TURN_FOG,
.animation = B_ANIM_FOG_CONTINUES,
},
[BATTLE_WEATHER_STRONG_WINDS] =
{
.flag = B_WEATHER_STRONG_WINDS,
.rock = HOLD_EFFECT_NONE,
.endMessage = B_MSG_WEATHER_END_STRONG_WINDS,
.continuesMessage = B_MSG_WEATHER_TURN_STRONG_WINDS,
.animation = B_ANIM_STRONG_WINDS,
},
};
static bool32 TryEndTurnWeather(void)
{
u32 effect = 0;
@ -6490,12 +6491,20 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
}
break;
case ABILITY_ICE_FACE:
if (IsBattlerWeatherAffected(battler, B_WEATHER_HAIL | B_WEATHER_SNOW)
u32 battlerWeatherAffected = IsBattlerWeatherAffected(battler, B_WEATHER_HAIL | B_WEATHER_SNOW);
if (battlerWeatherAffected && gBattleMons[battler].species == SPECIES_EISCUE)
{
// If Hail/Snow activates when in Eiscue is in base, prevent reversion when Eiscue Noice gets broken
gDisableStructs[battler].weatherAbilityDone = TRUE;
}
if (!gDisableStructs[battler].weatherAbilityDone
&& battlerWeatherAffected
&& gBattleMons[battler].species == SPECIES_EISCUE_NOICE
&& !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED))
{
// TODO: Convert this to a proper FORM_CHANGE type.
gBattleScripting.battler = battler;
gDisableStructs[battler].weatherAbilityDone = TRUE;
gBattleMons[battler].species = SPECIES_EISCUE_ICE;
BattleScriptPushCursorAndCallback(BattleScript_BattlerFormChangeWithStringEnd3);
effect++;

View File

@ -261,20 +261,20 @@ AI_SINGLE_BATTLE_TEST("AI chooses the safest option to faint the target, taking
u16 abilityAtk = ABILITY_NONE, holdItemAtk = ITEM_NONE;
// Psychic is not very effective, but always hits. Solarbeam requires a charging turn, Double Edge has recoil and Focus Blast can miss;
// PARAMETRIZE { abilityAtk = ABILITY_STURDY; move1 = MOVE_FOCUS_BLAST; move2 = MOVE_SOLAR_BEAM; move3 = MOVE_PSYCHIC; move4 = MOVE_DOUBLE_EDGE; expectedMove = MOVE_PSYCHIC; }
PARAMETRIZE { abilityAtk = ABILITY_STURDY; move1 = MOVE_FOCUS_BLAST; move2 = MOVE_SOLAR_BEAM; move3 = MOVE_PSYCHIC; move4 = MOVE_DOUBLE_EDGE; expectedMove = MOVE_PSYCHIC; }
// Same as above, but ai mon has rock head ability, so it can use Double Edge without taking recoil damage. Psychic can also lower Special Defense,
// but because it faints the target it doesn't matter.
// PARAMETRIZE { abilityAtk = ABILITY_ROCK_HEAD; move1 = MOVE_FOCUS_BLAST; move2 = MOVE_SOLAR_BEAM; move3 = MOVE_PSYCHIC; move4 = MOVE_DOUBLE_EDGE;
// expectedMove = MOVE_PSYCHIC; expectedMove2 = MOVE_DOUBLE_EDGE; }
PARAMETRIZE { abilityAtk = ABILITY_ROCK_HEAD; move1 = MOVE_FOCUS_BLAST; move2 = MOVE_SOLAR_BEAM; move3 = MOVE_PSYCHIC; move4 = MOVE_DOUBLE_EDGE;
expectedMove = MOVE_PSYCHIC; expectedMove2 = MOVE_DOUBLE_EDGE; }
// This time it's Solarbeam + Psychic, because the weather is sunny.
PARAMETRIZE { abilityAtk = ABILITY_DROUGHT; move1 = MOVE_FOCUS_BLAST; move2 = MOVE_SOLAR_BEAM; move3 = MOVE_PSYCHIC; move4 = MOVE_DOUBLE_EDGE;
expectedMove = MOVE_PSYCHIC; expectedMove2 = MOVE_SOLAR_BEAM; }
// Psychic and Solar Beam are chosen because user is holding Power Herb
// PARAMETRIZE { abilityAtk = ABILITY_STURDY; holdItemAtk = ITEM_POWER_HERB; move1 = MOVE_FOCUS_BLAST; move2 = MOVE_SOLAR_BEAM; move3 = MOVE_PSYCHIC; move4 = MOVE_DOUBLE_EDGE;
// expectedMove = MOVE_PSYCHIC; expectedMove2 = MOVE_SOLAR_BEAM; }
PARAMETRIZE { abilityAtk = ABILITY_STURDY; holdItemAtk = ITEM_POWER_HERB; move1 = MOVE_FOCUS_BLAST; move2 = MOVE_SOLAR_BEAM; move3 = MOVE_PSYCHIC; move4 = MOVE_DOUBLE_EDGE;
expectedMove = MOVE_PSYCHIC; expectedMove2 = MOVE_SOLAR_BEAM; }
// Skull Bash is chosen because it's the most accurate and is holding Power Herb
// PARAMETRIZE { abilityAtk = ABILITY_STURDY; holdItemAtk = ITEM_POWER_HERB; move1 = MOVE_FOCUS_BLAST; move2 = MOVE_SKULL_BASH; move3 = MOVE_SLAM; move4 = MOVE_DOUBLE_EDGE;
// expectedMove = MOVE_SKULL_BASH; }
PARAMETRIZE { abilityAtk = ABILITY_STURDY; holdItemAtk = ITEM_POWER_HERB; move1 = MOVE_FOCUS_BLAST; move2 = MOVE_SKULL_BASH; move3 = MOVE_SLAM; move4 = MOVE_DOUBLE_EDGE;
expectedMove = MOVE_SKULL_BASH; }
GIVEN {
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT);