From c9bde52fd2d9512cc4bef5b78637f768e90ddb16 Mon Sep 17 00:00:00 2001 From: AlexOn1ine Date: Sun, 29 Dec 2024 10:23:46 +0100 Subject: [PATCH] fix last tests --- src/battle_util.c | 215 +++++++++++++++++++++++--------------------- test/battle/ai/ai.c | 14 +-- 2 files changed, 119 insertions(+), 110 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index 99cdb8858a..34d8cadb16 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -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++; diff --git a/test/battle/ai/ai.c b/test/battle/ai/ai.c index 60f9db1f5c..0883e3cc59 100644 --- a/test/battle/ai/ai.c +++ b/test/battle/ai/ai.c @@ -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);