From e8703e8b05772dfa2a660ee9295d03f42dcd4216 Mon Sep 17 00:00:00 2001 From: Maruno17 Date: Sun, 16 Oct 2022 14:53:49 +0100 Subject: [PATCH] More error fixes in AI --- .../005_AI/020_AI_MoveEffectScores_Generic.rb | 6 ++-- .../005_AI/021_AI_MoveBaseScores.rb | 6 ++++ .../052_AI_MoveHandlers_BattlerStats.rb | 2 +- .../053_AI_MoveHandlers_BattlerOther.rb | 2 +- .../005_AI/055_AI_MoveHandlers_MultiHit.rb | 32 +++++++------------ .../059_AI_MoveHandlers_SwitchingActing.rb | 4 +-- .../070_AI_MoveHandlers_GeneralModifiers.rb | 2 +- Data/Scripts/011_Battle/005_AI/103_AIMove.rb | 4 +-- 8 files changed, 29 insertions(+), 29 deletions(-) diff --git a/Data/Scripts/011_Battle/005_AI/020_AI_MoveEffectScores_Generic.rb b/Data/Scripts/011_Battle/005_AI/020_AI_MoveEffectScores_Generic.rb index 376626e5c..4de4527eb 100644 --- a/Data/Scripts/011_Battle/005_AI/020_AI_MoveEffectScores_Generic.rb +++ b/Data/Scripts/011_Battle/005_AI/020_AI_MoveEffectScores_Generic.rb @@ -140,7 +140,7 @@ class Battle::AI return score - +=begin mini_score = 1.0 # Determine whether the move boosts Attack, Special Attack or Speed (Bulk Up # is sometimes not considered a sweeping move) @@ -230,6 +230,7 @@ class Battle::AI end return mini_score +=end end #============================================================================= @@ -361,7 +362,7 @@ class Battle::AI return score - +=begin mini_score = 1.0 case stat when :ATTACK @@ -565,6 +566,7 @@ class Battle::AI end return mini_score +=end end #============================================================================= diff --git a/Data/Scripts/011_Battle/005_AI/021_AI_MoveBaseScores.rb b/Data/Scripts/011_Battle/005_AI/021_AI_MoveBaseScores.rb index 2a1820087..8458184a0 100644 --- a/Data/Scripts/011_Battle/005_AI/021_AI_MoveBaseScores.rb +++ b/Data/Scripts/011_Battle/005_AI/021_AI_MoveBaseScores.rb @@ -7,6 +7,8 @@ class Battle::AI #============================================================================= def pbGetDamagingMoveBaseScore return 100 + +=begin # Don't prefer moves that are ineffective because of abilities or effects return 0 if @target.immune_to_move? user_battler = @user.battler @@ -45,6 +47,7 @@ class Battle::AI damage_percentage += 40 if damage_percentage > 100 # Prefer moves likely to be lethal return damage_percentage.to_i +=end end #============================================================================= @@ -53,6 +56,8 @@ class Battle::AI #============================================================================= def pbGetStatusMoveBaseScore return 100 + +=begin # TODO: Call @target.immune_to_move? here too, not just for damaging moves # (only if this status move will be affected). @@ -295,5 +300,6 @@ class Battle::AI # "TargetActsLast", # "ProtectUserSideFromStatusMoves" return 100 +=end end end diff --git a/Data/Scripts/011_Battle/005_AI/052_AI_MoveHandlers_BattlerStats.rb b/Data/Scripts/011_Battle/005_AI/052_AI_MoveHandlers_BattlerStats.rb index b96ad17e2..c2e75f637 100644 --- a/Data/Scripts/011_Battle/005_AI/052_AI_MoveHandlers_BattlerStats.rb +++ b/Data/Scripts/011_Battle/005_AI/052_AI_MoveHandlers_BattlerStats.rb @@ -59,7 +59,7 @@ Battle::AI::Handlers::MoveEffectScore.add("MaxUserAttackLoseHalfOfTotalHP", proc { |score, move, user, target, ai, battle| score = ai.get_score_for_user_stat_raise(score) # Don't prefer the lower the user's HP is - score -= 80 * (1 - (@user.hp.to_f / @user.totalhp)) # 0 to -40 + score -= 80 * (1 - (user.hp.to_f / user.totalhp)) # 0 to -40 next score } ) diff --git a/Data/Scripts/011_Battle/005_AI/053_AI_MoveHandlers_BattlerOther.rb b/Data/Scripts/011_Battle/005_AI/053_AI_MoveHandlers_BattlerOther.rb index 24fd17a26..101a9da20 100644 --- a/Data/Scripts/011_Battle/005_AI/053_AI_MoveHandlers_BattlerOther.rb +++ b/Data/Scripts/011_Battle/005_AI/053_AI_MoveHandlers_BattlerOther.rb @@ -413,7 +413,7 @@ Battle::AI::Handlers::MoveEffectScore.copy("FreezeTarget", #=============================================================================== # #=============================================================================== -Battle::AI::Handlers::MoveEffectScore.add("FreezeTarget", +Battle::AI::Handlers::MoveEffectScore.add("FreezeFlinchTarget", proc { |score, move, user, target, ai, battle| score = Battle::AI::Handlers.apply_move_effect_score("FreezeTarget", score, move, user, target, ai, battle) diff --git a/Data/Scripts/011_Battle/005_AI/055_AI_MoveHandlers_MultiHit.rb b/Data/Scripts/011_Battle/005_AI/055_AI_MoveHandlers_MultiHit.rb index 9f6412b8c..271520500 100644 --- a/Data/Scripts/011_Battle/005_AI/055_AI_MoveHandlers_MultiHit.rb +++ b/Data/Scripts/011_Battle/005_AI/055_AI_MoveHandlers_MultiHit.rb @@ -37,24 +37,18 @@ Battle::AI::Handlers::MoveEffectScore.add("HitTwoTimesPoisonTarget", ) #=============================================================================== -# TODO: Review score modifiers. +# #=============================================================================== Battle::AI::Handlers::MoveBasePower.copy("HitTwoTimes", "HitTwoTimesFlinchTarget") Battle::AI::Handlers::MoveEffectScore.add("HitTwoTimesFlinchTarget", proc { |score, move, user, target, ai, battle| - dmg = move.rough_damage - num_hits = move.move.pbNumHits(user.battler, [target.battler]) - # Prefer if the target has a Substitute and the first hit can break it - if target.effects[PBEffects::Substitute] > 0 && !move.move.ignoresSubstitute?(user.battler) - score += 10 if target.effects[PBEffects::Substitute] < dmg / num_hits - end - # Flinching - if user.faster_than?(target) && target.effects[PBEffects::Substitute] < dmg / num_hits && - (battle.moldBreaker || !target.has_active_ability?(:INNERFOCUS)) - score += 10 - end - # TODO: Consider effects that trigger per hit. + # Score for hitting multiple times + score = Battle::AI::Handlers.apply_move_effect_score("HitTwoTimes", + score, move, user, target, ai, battle) + # Score for flinching + score = Battle::AI::Handlers.apply_move_effect_score("FlinchTarget", + score, move, user, target, ai, battle) next score } ) @@ -244,7 +238,7 @@ Battle::AI::Handlers::MoveEffectScore.add("TwoTurnAttack", has_protect_move = true end end - if move.rough_priority > 0 + if move.rough_priority(user) > 0 if target.check_for_move { |m| m.function == "ProtectUserSideFromPriorityMoves" } has_protect_move = true end @@ -305,18 +299,16 @@ Battle::AI::Handlers::MoveEffectScore.add("TwoTurnAttackBurnTarget", ) #=============================================================================== -# TODO: Review score modifiers. +# #=============================================================================== Battle::AI::Handlers::MoveEffectScore.add("TwoTurnAttackFlinchTarget", proc { |score, move, user, target, ai, battle| # Score for being a two turn attack score = Battle::AI::Handlers.apply_move_effect_score("TwoTurnAttack", score, move, user, target, ai, battle) - # Flinching - if user.faster_than?(target) && target.effects[PBEffects::Substitute] == 0 && - (battle.moldBreaker || !target.has_active_ability?(:INNERFOCUS)) - score += 10 - end + # Score for flinching + score = Battle::AI::Handlers.apply_move_effect_score("FlinchTarget", + score, move, user, target, ai, battle) next score } ) diff --git a/Data/Scripts/011_Battle/005_AI/059_AI_MoveHandlers_SwitchingActing.rb b/Data/Scripts/011_Battle/005_AI/059_AI_MoveHandlers_SwitchingActing.rb index 7cfe31180..696311cf4 100644 --- a/Data/Scripts/011_Battle/005_AI/059_AI_MoveHandlers_SwitchingActing.rb +++ b/Data/Scripts/011_Battle/005_AI/059_AI_MoveHandlers_SwitchingActing.rb @@ -316,8 +316,8 @@ Battle::AI::Handlers::MoveEffectScore.add("TargetUsesItsLastUsedMoveAgain", #=============================================================================== Battle::AI::Handlers::MoveEffectScore.add("HigherPriorityInGrassyTerrain", proc { |score, move, user, target, ai, battle| - if ai.trainer.medium_skill? && @battle.field.terrain == :Grassy - score += 40 if target.faster_than?(user) + if ai.trainer.medium_skill? && battle.field.terrain == :Grassy + score += 15 if target.faster_than?(user) end next score } diff --git a/Data/Scripts/011_Battle/005_AI/070_AI_MoveHandlers_GeneralModifiers.rb b/Data/Scripts/011_Battle/005_AI/070_AI_MoveHandlers_GeneralModifiers.rb index 31ec14e3d..cf1910bf2 100644 --- a/Data/Scripts/011_Battle/005_AI/070_AI_MoveHandlers_GeneralModifiers.rb +++ b/Data/Scripts/011_Battle/005_AI/070_AI_MoveHandlers_GeneralModifiers.rb @@ -283,7 +283,7 @@ Battle::AI::Handlers::GeneralMoveScore.add(:add_predicted_damage, dmg = move.rough_damage score += [15.0 * dmg / target.hp, 20].min score += 10 if dmg > target.hp * 1.1 # Predicted to KO the target - next score + next score.to_i end } ) diff --git a/Data/Scripts/011_Battle/005_AI/103_AIMove.rb b/Data/Scripts/011_Battle/005_AI/103_AIMove.rb index df9784589..1d201664b 100644 --- a/Data/Scripts/011_Battle/005_AI/103_AIMove.rb +++ b/Data/Scripts/011_Battle/005_AI/103_AIMove.rb @@ -116,7 +116,7 @@ class Battle::AI::AIMove end ##### Calculate target's defense stat ##### - defense, def_stage = pbGetDefenseStats(user, target) + defense, def_stage = @move.pbGetDefenseStats(user.battler, target.battler) if !user.has_active_ability?(:UNAWARE) || @ai.battle.moldBreaker def_stage = 6 if is_critical && def_stage > 6 defense = (defense.to_f * stage_mul[def_stage] / stage_div[def_stage]).floor @@ -552,7 +552,7 @@ class Battle::AI::AIMove # 3 = additional effect has an increased chance to work def additional_effect_usability(user, target) return 0 if @move.addlEffect == 0 # Doesn't have an additional effect - return 1 if target.has_active_ability?(:SHIELDDUST) && !battle.moldBreaker + return 1 if target.has_active_ability?(:SHIELDDUST) && !@ai.battle.moldBreaker return 3 if (Settings::MECHANICS_GENERATION >= 6 || self.function != "EffectDependsOnEnvironment") && (user.has_active_ability?(:SERENEGRACE) || user.pbOwnSide.effects[PBEffects::Rainbow] > 0) return 2