From 98f16c2afa1a6d00e83c4f16f84956e0e92b362f Mon Sep 17 00:00:00 2001 From: Maruno17 Date: Sat, 14 Jan 2023 23:51:39 +0000 Subject: [PATCH] More AI function code rewrites, ensured all AI procs next an appropriate value --- .../012_MoveEffects_ChangeMoveEffect.rb | 4 + .../011_Battle/005_AI/004_AI_ChooseMove.rb | 17 +++- .../005_AI/051_AI_MoveHandlers_Misc.rb | 48 +++++----- .../052_AI_MoveHandlers_BattlerStats.rb | 92 ++++++++++++------- .../053_AI_MoveHandlers_BattlerOther.rb | 44 +++++---- .../054_AI_MoveHandlers_MoveAttributes.rb | 57 ++++++------ .../005_AI/055_AI_MoveHandlers_MultiHit.rb | 1 + .../005_AI/056_AI_MoveHandlers_Healing.rb | 36 ++++---- .../005_AI/057_AI_MoveHandlers_Items.rb | 15 ++- .../058_AI_MoveHandlers_ChangeMoveEffect.rb | 76 +++++++++++---- .../059_AI_MoveHandlers_SwitchingActing.rb | 41 +++++---- .../070_AI_MoveHandlers_GeneralModifiers.rb | 21 +++-- 12 files changed, 280 insertions(+), 172 deletions(-) diff --git a/Data/Scripts/011_Battle/003_Move/012_MoveEffects_ChangeMoveEffect.rb b/Data/Scripts/011_Battle/003_Move/012_MoveEffects_ChangeMoveEffect.rb index 1abe4eec1..e5510d0a4 100644 --- a/Data/Scripts/011_Battle/003_Move/012_MoveEffects_ChangeMoveEffect.rb +++ b/Data/Scripts/011_Battle/003_Move/012_MoveEffects_ChangeMoveEffect.rb @@ -222,6 +222,8 @@ end # Effect depends on the environment. (Secret Power) #=============================================================================== class Battle::Move::EffectDependsOnEnvironment < Battle::Move + attr_reader :secretPower + def flinchingMove?; return [6, 10, 12].include?(@secretPower); end def pbOnStartUse(user, targets) @@ -852,6 +854,8 @@ end # Pokémon. #=============================================================================== class Battle::Move::UseMoveDependingOnEnvironment < Battle::Move + attr_reader :npMove + def callsAnotherMove?; return true; end def pbOnStartUse(user, targets) diff --git a/Data/Scripts/011_Battle/005_AI/004_AI_ChooseMove.rb b/Data/Scripts/011_Battle/005_AI/004_AI_ChooseMove.rb index 01c404432..a899c9611 100644 --- a/Data/Scripts/011_Battle/005_AI/004_AI_ChooseMove.rb +++ b/Data/Scripts/011_Battle/005_AI/004_AI_ChooseMove.rb @@ -36,7 +36,7 @@ class Battle::AI add_move_to_choices(choices, idxMove, MOVE_FAIL_SCORE) next end - target_data = move.pbTarget(@user.battler) + target_data = @move.pbTarget(@user.battler) # TODO: Alter target_data if user has Protean and move is Curse. case target_data.num_targets when 0 # No targets, affects the user or a side or the whole field @@ -88,6 +88,21 @@ class Battle::AI # Set some extra class variables for the move/target combo being assessed. #============================================================================= def set_up_move_check(move) + case move.function + when "UseLastMoveUsed" + if @battle.lastMoveUsed && + !move.moveBlacklist.include?(GameData::Move.get(@battle.lastMoveUsed).function_code) + move = Battle::Move.from_pokemon_move(@battle, Pokemon::Move.new(@battle.lastMoveUsed)) + end + when "UseLastMoveUsedByTarget" + if target.battler.lastRegularMoveUsed && + GameData::Move.get(target.battler.lastRegularMoveUsed).flags.any? { |f| f[/^CanMirrorMove$/i] } + move = Battle::Move.from_pokemon_move(@battle, Pokemon::Move.new(target.battler.lastRegularMoveUsed)) + end + when "UseMoveDependingOnEnvironment" + move.move.pbOnStartUse(@user.battler, []) # Determine which move is used instead + move = Battle::Move.from_pokemon_move(@battle, Pokemon::Move.new(move.npMove)) + end @move.set_up(move, @user) @battle.moldBreaker = @user.has_mold_breaker? end diff --git a/Data/Scripts/011_Battle/005_AI/051_AI_MoveHandlers_Misc.rb b/Data/Scripts/011_Battle/005_AI/051_AI_MoveHandlers_Misc.rb index 64aec468e..e484fcf5a 100644 --- a/Data/Scripts/011_Battle/005_AI/051_AI_MoveHandlers_Misc.rb +++ b/Data/Scripts/011_Battle/005_AI/051_AI_MoveHandlers_Misc.rb @@ -45,7 +45,7 @@ Battle::AI::Handlers::MoveEffectScore.copy("DoesNothingCongratulations", #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("FailsIfNotUserFirstTurn", proc { |move, user, ai, battle| - next true if user.turnCount > 0 + next user.turnCount > 0 } ) Battle::AI::Handlers::MoveEffectScore.add("FailsIfNotUserFirstTurn", @@ -68,7 +68,7 @@ Battle::AI::Handlers::MoveFailureCheck.add("FailsIfUserHasUnusedMove", has_unused_move = true break end - next true if !has_another_move || has_unused_move + next !has_another_move || has_unused_move } ) @@ -77,7 +77,7 @@ Battle::AI::Handlers::MoveFailureCheck.add("FailsIfUserHasUnusedMove", #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("FailsIfUserNotConsumedBerry", proc { |move, user, ai, battle| - next true if !user.battler.belched? + next !user.battler.belched? } ) @@ -86,7 +86,7 @@ Battle::AI::Handlers::MoveFailureCheck.add("FailsIfUserNotConsumedBerry", #=============================================================================== Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("FailsIfTargetHasNoItem", proc { |move, user, target, ai, battle| - next true if !target.item || !target.item_active? + next !target.item || !target.item_active? } ) @@ -97,7 +97,7 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("FailsUnlessTargetShares proc { |move, user, target, ai, battle| user_types = user.pbTypes(true) target_types = target.pbTypes(true) - next true if (user_types & target_types).empty? + next (user_types & target_types).empty? } ) @@ -162,7 +162,8 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("FailsIfTargetActed", #=============================================================================== Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("CrashDamageIfFailsUnusableInGravity", proc { |score, move, user, target, ai, battle| - next score - (100 - move.rough_accuracy) if user.battler.takesIndirectDamage? + score -= (100 - move.rough_accuracy) if user.battler.takesIndirectDamage? + next score } ) @@ -171,8 +172,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("CrashDamageIfFailsUnusab #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("StartSunWeather", proc { |move, user, ai, battle| - next true if [:HarshSun, :HeavyRain, :StrongWinds, - move.move.weatherType].include?(battle.field.weather) + next [:HarshSun, :HeavyRain, :StrongWinds, move.move.weatherType].include?(battle.field.weather) } ) Battle::AI::Handlers::MoveEffectScore.add("StartSunWeather", @@ -345,7 +345,7 @@ Battle::AI::Handlers::MoveEffectScore.add("StartHailWeather", #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("StartElectricTerrain", proc { |move, user, ai, battle| - next true if battle.field.terrain == :Electric + next battle.field.terrain == :Electric } ) Battle::AI::Handlers::MoveEffectScore.add("StartElectricTerrain", @@ -364,7 +364,7 @@ Battle::AI::Handlers::MoveEffectScore.add("StartElectricTerrain", #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("StartGrassyTerrain", proc { |move, user, ai, battle| - next true if battle.field.terrain == :Grassy + next battle.field.terrain == :Grassy } ) Battle::AI::Handlers::MoveEffectScore.add("StartGrassyTerrain", @@ -383,7 +383,7 @@ Battle::AI::Handlers::MoveEffectScore.add("StartGrassyTerrain", #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("StartMistyTerrain", proc { |move, user, ai, battle| - next true if battle.field.terrain == :Misty + next battle.field.terrain == :Misty } ) Battle::AI::Handlers::MoveEffectScore.add("StartMistyTerrain", @@ -402,7 +402,7 @@ Battle::AI::Handlers::MoveEffectScore.add("StartMistyTerrain", #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("StartPsychicTerrain", proc { |move, user, ai, battle| - next true if battle.field.terrain == :Psychic + next battle.field.terrain == :Psychic } ) Battle::AI::Handlers::MoveEffectScore.add("StartPsychicTerrain", @@ -421,7 +421,7 @@ Battle::AI::Handlers::MoveEffectScore.add("StartPsychicTerrain", #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("RemoveTerrain", proc { |move, user, ai, battle| - next true if battle.field.terrain == :None + next battle.field.terrain == :None } ) Battle::AI::Handlers::MoveEffectScore.add("RemoveTerrain", @@ -435,7 +435,7 @@ Battle::AI::Handlers::MoveEffectScore.add("RemoveTerrain", #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("AddSpikesToFoeSide", proc { |move, user, ai, battle| - next true if user.pbOpposingSide.effects[PBEffects::Spikes] >= 3 + next user.pbOpposingSide.effects[PBEffects::Spikes] >= 3 } ) Battle::AI::Handlers::MoveEffectScore.add("AddSpikesToFoeSide", @@ -471,7 +471,7 @@ Battle::AI::Handlers::MoveEffectScore.add("AddSpikesToFoeSide", #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("AddToxicSpikesToFoeSide", proc { |move, user, ai, battle| - next true if user.pbOpposingSide.effects[PBEffects::ToxicSpikes] >= 2 + next user.pbOpposingSide.effects[PBEffects::ToxicSpikes] >= 2 } ) Battle::AI::Handlers::MoveEffectScore.add("AddToxicSpikesToFoeSide", @@ -509,7 +509,7 @@ Battle::AI::Handlers::MoveEffectScore.add("AddToxicSpikesToFoeSide", #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("AddStealthRocksToFoeSide", proc { |move, user, ai, battle| - next true if user.pbOpposingSide.effects[PBEffects::StealthRock] + next user.pbOpposingSide.effects[PBEffects::StealthRock] } ) Battle::AI::Handlers::MoveEffectScore.add("AddStealthRocksToFoeSide", @@ -536,7 +536,7 @@ Battle::AI::Handlers::MoveEffectScore.add("AddStealthRocksToFoeSide", #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("AddStickyWebToFoeSide", proc { |move, user, ai, battle| - next true if user.pbOpposingSide.effects[PBEffects::StickyWeb] + next user.pbOpposingSide.effects[PBEffects::StickyWeb] } ) Battle::AI::Handlers::MoveEffectScore.add("AddStickyWebToFoeSide", @@ -603,8 +603,8 @@ Battle::AI::Handlers::MoveEffectScore.add("SwapSideEffects", score -= 10 if ![0, false, nil].include?(user.pbOwnSide.effects[e]) end end - next score end + next score } ) @@ -614,7 +614,7 @@ Battle::AI::Handlers::MoveEffectScore.add("SwapSideEffects", Battle::AI::Handlers::MoveFailureCheck.add("UserMakeSubstitute", proc { |move, user, ai, battle| next true if user.effects[PBEffects::Substitute] > 0 - next true if user.hp <= [user.totalhp / 4, 1].max + next user.hp <= [user.totalhp / 4, 1].max } ) Battle::AI::Handlers::MoveEffectScore.add("UserMakeSubstitute", @@ -649,13 +649,14 @@ Battle::AI::Handlers::MoveEffectScore.add("RemoveUserBindingAndEntryHazards", #=============================================================================== Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("AttackTwoTurnsLater", proc { |move, user, target, ai, battle| - next true if battle.positions[target.index].effects[PBEffects::FutureSightCounter] > 0 + next battle.positions[target.index].effects[PBEffects::FutureSightCounter] > 0 } ) Battle::AI::Handlers::MoveEffectScore.add("AttackTwoTurnsLater", proc { |score, move, user, ai, battle| # Future Sight tends to be wasteful if down to last Pokémon - next score - 20 if battle.pbAbleNonActiveCount(user.idxOwnSide) == 0 + score -= 20 if battle.pbAbleNonActiveCount(user.idxOwnSide) == 0 + next score } ) @@ -703,12 +704,13 @@ Battle::AI::Handlers::MoveEffectScore.add("BurnAttackerBeforeUserActs", #=============================================================================== Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("AllBattlersLoseHalfHPUserSkipsNextTurn", proc { |move, user, target, ai, battle| - next true if target.hp <= 1 + next target.hp <= 1 } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("AllBattlersLoseHalfHPUserSkipsNextTurn", proc { |score, move, user, target, ai, battle| - next score + 20 if target.hp >= target.totalhp / 2 + score += 20 if target.hp >= target.totalhp / 2 + next score } ) 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 8145c22f1..9ec1b0fd6 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 @@ -4,8 +4,8 @@ #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("RaiseUserAttack1", proc { |move, user, ai, battle| - next true if move.statusMove? && - !user.battler.pbCanRaiseStatStage?(move.move.statUp[0], user.battler, move.move) + next move.statusMove? && + !user.battler.pbCanRaiseStatStage?(move.move.statUp[0], user.battler, move.move) } ) Battle::AI::Handlers::MoveEffectScore.add("RaiseUserAttack1", @@ -30,6 +30,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("RaiseUserAttack2IfTarget if move.rough_damage >= target.hp * 0.9 next ai.get_score_for_target_stat_raise(score, user, move.move.statUp) end + next score } ) @@ -53,7 +54,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("RaiseUserAttack2IfTarge Battle::AI::Handlers::MoveFailureCheck.add("MaxUserAttackLoseHalfOfTotalHP", proc { |move, user, ai, battle| next true if user.hp <= [user.totalhp / 2, 1].max - next true if !user.battler.pbCanRaiseStatStage?(:ATTACK, user.battler, move.move) + next !user.battler.pbCanRaiseStatStage?(:ATTACK, user.battler, move.move) } ) Battle::AI::Handlers::MoveEffectScore.add("MaxUserAttackLoseHalfOfTotalHP", @@ -300,7 +301,7 @@ Battle::AI::Handlers::MoveEffectScore.copy("RaiseUserEvasion2", #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("RaiseUserCriticalHitRate2", proc { |move, user, ai, battle| - next true if user.effects[PBEffects::FocusEnergy] >= 2 + next user.effects[PBEffects::FocusEnergy] >= 2 } ) Battle::AI::Handlers::MoveEffectScore.add("RaiseUserCriticalHitRate2", @@ -329,15 +330,14 @@ Battle::AI::Handlers::MoveEffectScore.add("RaiseUserCriticalHitRate2", #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("RaiseUserAtkDef1", proc { |move, user, ai, battle| - if move.statusMove? - will_fail = true - (move.move.statUp.length / 2).times do |i| - next if !user.battler.pbCanRaiseStatStage?(move.move.statUp[i * 2], user.battler, move.move) - will_fail = false - break - end - next will_fail + next false if move.damagingMove? + will_fail = true + (move.move.statUp.length / 2).times do |i| + next if !user.battler.pbCanRaiseStatStage?(move.move.statUp[i * 2], user.battler, move.move) + will_fail = false + break end + next will_fail } ) Battle::AI::Handlers::MoveEffectScore.copy("RaiseUserAttack1", @@ -621,8 +621,8 @@ Battle::AI::Handlers::MoveEffectScore.copy("LowerUserAttack1", #=============================================================================== Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("RaiseTargetAttack1", proc { |move, user, target, ai, battle| - next true if move.statusMove? && - !target.battler.pbCanRaiseStatStage?(:ATTACK, user.battler, move.move) + next move.statusMove? && + !target.battler.pbCanRaiseStatStage?(:ATTACK, user.battler, move.move) } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("RaiseTargetAttack1", @@ -636,8 +636,8 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("RaiseTargetAttack1", #=============================================================================== Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("RaiseTargetAttack2ConfuseTarget", proc { |move, user, target, ai, battle| - next true if !target.battler.pbCanRaiseStatStage?(:ATTACK, user.battler, move.move) && - !target.battler.pbCanConfuse?(user.battler, false, move.move) + next !target.battler.pbCanRaiseStatStage?(:ATTACK, user.battler, move.move) && + !target.battler.pbCanConfuse?(user.battler, false, move.move) } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("RaiseTargetAttack2ConfuseTarget", @@ -658,8 +658,8 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("RaiseTargetAttack2Confus #=============================================================================== Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("RaiseTargetSpAtk1ConfuseTarget", proc { |move, user, target, ai, battle| - next true if !target.battler.pbCanRaiseStatStage?(:SPECIAL_ATTACK, user.battler, move.move) && - !target.battler.pbCanConfuse?(user.battler, false, move.move) + next !target.battler.pbCanRaiseStatStage?(:SPECIAL_ATTACK, user.battler, move.move) && + !target.battler.pbCanConfuse?(user.battler, false, move.move) } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("RaiseTargetSpAtk1ConfuseTarget", @@ -680,7 +680,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("RaiseTargetSpAtk1Confuse #=============================================================================== Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("RaiseTargetSpDef1", proc { |move, user, target, ai, battle| - next true if !target.battler.pbCanRaiseStatStage?(:SPECIAL_DEFENSE, user.battler, move.move) + next !target.battler.pbCanRaiseStatStage?(:SPECIAL_DEFENSE, user.battler, move.move) } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("RaiseTargetSpDef1", @@ -732,8 +732,8 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("RaiseTargetRandomStat2", #=============================================================================== Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("RaiseTargetAtkSpAtk2", proc { |move, user, target, ai, battle| - next true if !target.battler.pbCanRaiseStatStage?(:ATTACK, user.battler, move.move) && - !target.battler.pbCanRaiseStatStage?(:SPECIAL_ATTACK, user.battler, move.move) + next !target.battler.pbCanRaiseStatStage?(:ATTACK, user.battler, move.move) && + !target.battler.pbCanRaiseStatStage?(:SPECIAL_ATTACK, user.battler, move.move) } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("RaiseTargetAtkSpAtk2", @@ -748,8 +748,8 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("RaiseTargetAtkSpAtk2", #=============================================================================== Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("LowerTargetAttack1", proc { |move, user, target, ai, battle| - next true if move.statusMove? && - !target.battler.pbCanLowerStatStage?(move.move.statDown[0], user.battler, move.move) + next move.statusMove? && + !target.battler.pbCanLowerStatStage?(move.move.statDown[0], user.battler, move.move) } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("LowerTargetAttack1", @@ -844,6 +844,7 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("LowerTargetSpAtk2IfCanA !target.battler.pbCanLowerStatStage?(move.move.statDown[0], user.battler, move.move) next true if user.gender == 2 || target.gender == 2 || user.gender == target.gender next true if !battle.moldBreaker && target.has_active_ability?(:OBLIVIOUS) + next false } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("LowerTargetSpAtk2", @@ -907,10 +908,9 @@ Battle::AI::Handlers::MoveBasePower.add("LowerTargetSpeed1WeakerInGrassyTerrain" #=============================================================================== Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("LowerTargetSpeed1MakeTargetWeakerToFire", proc { |move, user, target, ai, battle| - if !target.effects[PBEffects::TarShot] - next true if move.statusMove? && - !target.battler.pbCanLowerStatStage?(move.move.statDown[0], user.battler, move.move) - end + next false if !target.effects[PBEffects::TarShot] + next move.statusMove? && + !target.battler.pbCanLowerStatStage?(move.move.statDown[0], user.battler, move.move) } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("LowerTargetSpeed1MakeTargetWeakerToFire", @@ -998,8 +998,8 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("LowerTargetEvasion1Remo target_opposing_side.effects[PBEffects::ToxicSpikes] > 0 || target_opposing_side.effects[PBEffects::StickyWeb]) next false if Settings::MECHANICS_GENERATION >= 8 && battle.field.terrain != :None - next true if move.statusMove? && - !target.battler.pbCanLowerStatStage?(move.move.statDown[0], user.battler, move.move) + next move.statusMove? && + !target.battler.pbCanLowerStatStage?(move.move.statDown[0], user.battler, move.move) } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("LowerTargetEvasion1RemoveSideEffects", @@ -1349,7 +1349,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("UserStealTargetPositiveS #=============================================================================== Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("InvertTargetStatStages", proc { |move, user, target, ai, battle| - next true if !target.battler.hasAlteredStatStages? + next !target.battler.hasAlteredStatStages? } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("InvertTargetStatStages", @@ -1399,7 +1399,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("ResetTargetStatStages", #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("ResetAllBattlersStatStages", proc { |move, user, ai, battle| - next true if battle.allBattlers.none? { |b| b.hasAlteredStatStages? } + next battle.allBattlers.none? { |b| b.hasAlteredStatStages? } } ) Battle::AI::Handlers::MoveEffectScore.add("ResetAllBattlersStatStages", @@ -1428,7 +1428,7 @@ Battle::AI::Handlers::MoveEffectScore.add("ResetAllBattlersStatStages", #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("StartUserSideImmunityToStatStageLowering", proc { |move, user, ai, battle| - next true if user.pbOwnSide.effects[PBEffects::Mist] > 0 + next user.pbOwnSide.effects[PBEffects::Mist] > 0 } ) @@ -1523,11 +1523,35 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("UserTargetAverageHP", ) #=============================================================================== -# TODO: Review score modifiers. +# #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("StartUserSideDoubleSpeed", proc { |move, user, ai, battle| - next true if user.pbOwnSide.effects[PBEffects::Tailwind] > 0 + next user.pbOwnSide.effects[PBEffects::Tailwind] > 0 + } +) +Battle::AI::Handlers::MoveEffectScore.add("StartUserSideDoubleSpeed", + proc { |score, move, user, ai, battle| + # Don't want to make allies faster if Trick Room will make them act later + next Battle::AI::MOVE_USELESS_SCORE if battle.field.effects[PBEffects::TrickRoom] > 1 + # Get the speeds of all battlers + ally_speeds = [] + foe_speeds = [] + ai.each_battler do |b| + spd = b.rough_stat(:SPEED) + (b.opposes?(user)) ? foe_speeds.push(spd) : ally_speeds.push(spd) + end + next Battle::AI::MOVE_USELESS_SCORE if ally_speeds.min > foe_speeds.max + # Compare speeds of all battlers + outspeeds = 0 + ally_speeds.each do |ally_speed| + foe_speeds.each do |foe_speed| + outspeeds += 1 if foe_speed > ally_speed && foe_speed < ally_speed * 2 + end + end + next Battle::AI::MOVE_USELESS_SCORE if outspeeds == 0 + # This move will achieve something + next score + 10 * outspeeds + 5 } ) 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 d6eda6ec1..15d3ccabe 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 @@ -3,7 +3,7 @@ #=============================================================================== Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("SleepTarget", proc { |move, user, target, ai, battle| - next true if move.statusMove? && !target.battler.pbCanSleep?(user.battler, false, move.move) + next move.statusMove? && !target.battler.pbCanSleep?(user.battler, false, move.move) } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("SleepTarget", @@ -59,12 +59,12 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("SleepTarget", #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("SleepTargetIfUserDarkrai", proc { |move, user, ai, battle| - next true if !user.battler.isSpecies?(:DARKRAI) && user.effects[PBEffects::TransformSpecies] != :DARKRAI + next !user.battler.isSpecies?(:DARKRAI) && user.effects[PBEffects::TransformSpecies] != :DARKRAI } ) Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("SleepTargetIfUserDarkrai", proc { |move, user, target, ai, battle| - next true if move.statusMove? && !target.battler.pbCanSleep?(user.battler, false, move.move) + next move.statusMove? && !target.battler.pbCanSleep?(user.battler, false, move.move) } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("SleepTarget", @@ -83,6 +83,7 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("SleepTargetNextTurn", proc { |move, user, target, ai, battle| next true if target.effects[PBEffects::Yawn] > 0 next true if !target.battler.pbCanSleep?(user.battler, false, move.move) + next false } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("SleepTarget", @@ -93,7 +94,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("SleepTarget", #=============================================================================== Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("PoisonTarget", proc { |move, user, target, ai, battle| - next true if move.statusMove? && !target.battler.pbCanPoison?(user.battler, false, move.move) + next move.statusMove? && !target.battler.pbCanPoison?(user.battler, false, move.move) } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("PoisonTarget", @@ -154,8 +155,8 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("PoisonTarget", #=============================================================================== Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("PoisonTargetLowerTargetSpeed1", proc { |move, user, target, ai, battle| - next true if !target.battler.pbCanPoison?(user.battler, false, move.move) && - !target.battler.pbCanLowerStatStage?(:SPEED, user.battler, move.move) + next !target.battler.pbCanPoison?(user.battler, false, move.move) && + !target.battler.pbCanLowerStatStage?(:SPEED, user.battler, move.move) } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("PoisonTargetLowerTargetSpeed1", @@ -181,7 +182,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("PoisonTarget", #=============================================================================== Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("ParalyzeTarget", proc { |move, user, target, ai, battle| - next true if move.statusMove? && !target.battler.pbCanParalyze?(user.battler, false, move.move) + next move.statusMove? && !target.battler.pbCanParalyze?(user.battler, false, move.move) } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("ParalyzeTarget", @@ -248,6 +249,7 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("ParalyzeTargetIfNotType eff = target.effectiveness_of_type_against_battler(move.rough_type, user) next true if Effectiveness.ineffective?(eff) next true if move.statusMove? && !target.battler.pbCanParalyze?(user.battler, false, move.move) + next false } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("ParalyzeTarget", @@ -277,7 +279,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("ParalyzeFlinchTarget", #=============================================================================== Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("BurnTarget", proc { |move, user, target, ai, battle| - next true if move.statusMove? && !target.battler.pbCanBurn?(user.battler, false, move.move) + next move.statusMove? && !target.battler.pbCanBurn?(user.battler, false, move.move) } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("BurnTarget", @@ -356,7 +358,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("BurnFlinchTarget", #=============================================================================== Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("FreezeTarget", proc { |move, user, target, ai, battle| - next true if move.statusMove? && !target.battler.pbCanFreeze?(user.battler, false, move.move) + next move.statusMove? && !target.battler.pbCanFreeze?(user.battler, false, move.move) } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("FreezeTarget", @@ -454,12 +456,12 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("ParalyzeBurnOrFreezeTarg #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("GiveUserStatusToTarget", proc { |move, user, ai, battle| - next true if user.status == :NONE + next user.status == :NONE } ) Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("GiveUserStatusToTarget", proc { |move, user, target, ai, battle| - next true if !target.battler.pbCanInflictStatus?(user.status, user.battler, false, move.move) + next !target.battler.pbCanInflictStatus?(user.status, user.battler, false, move.move) } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("GiveUserStatusToTarget", @@ -491,7 +493,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("GiveUserStatusToTarget", #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("CureUserBurnPoisonParalysis", proc { |move, user, ai, battle| - next true if ![:BURN, :POISON, :PARALYSIS].include?(user.status) + next ![:BURN, :POISON, :PARALYSIS].include?(user.status) } ) Battle::AI::Handlers::MoveEffectScore.add("CureUserBurnPoisonParalysis", @@ -542,7 +544,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("CureTargetBurn", #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("StartUserSideImmunityToInflictedStatus", proc { |move, user, ai, battle| - next true if user.pbOwnSide.effects[PBEffects::Safeguard] > 0 + next user.pbOwnSide.effects[PBEffects::Safeguard] > 0 } ) Battle::AI::Handlers::MoveEffectScore.add("StartUserSideImmunityToInflictedStatus", @@ -599,7 +601,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("FlinchTarget", #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("FlinchTargetFailsIfNotUserFirstTurn", proc { |move, user, ai, battle| - next true if user.turnCount > 0 + next user.turnCount > 0 } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("FlinchTarget", @@ -621,7 +623,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("FlinchTarget", #=============================================================================== Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("ConfuseTarget", proc { |move, user, target, ai, battle| - next true if move.statusMove? && !target.battler.pbCanConfuse?(user.battler, false, move.move) + next move.statusMove? && !target.battler.pbCanConfuse?(user.battler, false, move.move) } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("ConfuseTarget", @@ -660,7 +662,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("ConfuseTarget", #=============================================================================== Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("AttractTarget", proc { |move, user, target, ai, battle| - next true if move.statusMove? && !target.battler.pbCanAttract?(user.battler, false) + next move.statusMove? && !target.battler.pbCanAttract?(user.battler, false) } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("AttractTarget", @@ -703,7 +705,7 @@ Battle::AI::Handlers::MoveFailureCheck.add("SetUserTypesBasedOnEnvironment", new_type = env_types[battle.environment] || :NORMAL new_type = :NORMAL if !GameData::Type.exists?(new_type) end - next true if !GameData::Type.exists?(new_type) || !user.battler.pbHasOtherType?(new_type) + next !GameData::Type.exists?(new_type) || !user.battler.pbHasOtherType?(new_type) } ) Battle::AI::Handlers::MoveEffectScore.add("SetUserTypesBasedOnEnvironment", @@ -782,6 +784,7 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("SetUserTypesToTargetTyp next true if target.battler.pbTypes(true).empty? next true if user.battler.pbTypes == target.battler.pbTypes && user.effects[PBEffects::Type3] == target.effects[PBEffects::Type3] + next false } ) @@ -938,7 +941,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("AddGrassTypeToTarget", #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("UserLosesFireType", proc { |move, user, ai, battle| - next true if !user.has_type?(:FIRE) + next !user.has_type?(:FIRE) } ) @@ -1124,6 +1127,7 @@ Battle::AI::Handlers::MoveFailureCheck.add("StartUserAirborne", next true if user.effects[PBEffects::Ingrain] || user.effects[PBEffects::SmackDown] || user.effects[PBEffects::MagnetRise] > 0 + next false } ) Battle::AI::Handlers::MoveEffectScore.add("StartUserAirborne", @@ -1215,6 +1219,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("HitsTargetInSkyGroundsTa if ai.trainer.medium_skill? score -= 8 if battle.field.terrain != :None end + next score } ) @@ -1223,7 +1228,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("HitsTargetInSkyGroundsTa #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("StartGravity", proc { |move, user, ai, battle| - next true if battle.field.effects[PBEffects::Gravity] > 0 + next battle.field.effects[PBEffects::Gravity] > 0 } ) Battle::AI::Handlers::MoveEffectScore.add("StartGravity", @@ -1273,6 +1278,7 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("TransformUserIntoTarget next true if user.effects[PBEffects::Transform] next true if target.effects[PBEffects::Transform] || target.effects[PBEffects::Illusion] + next false } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("TransformUserIntoTarget", diff --git a/Data/Scripts/011_Battle/005_AI/054_AI_MoveHandlers_MoveAttributes.rb b/Data/Scripts/011_Battle/005_AI/054_AI_MoveHandlers_MoveAttributes.rb index 2de47d1c7..5055e0297 100644 --- a/Data/Scripts/011_Battle/005_AI/054_AI_MoveHandlers_MoveAttributes.rb +++ b/Data/Scripts/011_Battle/005_AI/054_AI_MoveHandlers_MoveAttributes.rb @@ -48,7 +48,7 @@ Battle::AI::Handlers::MoveBasePower.add("FixedDamageUserLevelRandom", #=============================================================================== Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("LowerTargetHPToUserHP", proc { |move, user, target, ai, battle| - next true if user.hp >= target.hp + next user.hp >= target.hp } ) Battle::AI::Handlers::MoveBasePower.add("LowerTargetHPToUserHP", @@ -64,6 +64,7 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("OHKO", proc { |move, user, target, ai, battle| next true if target.level > user.level next true if !battle.moldBreaker && target.has_active_ability?(:STURDY) + next false } ) Battle::AI::Handlers::MoveBasePower.add("OHKO", @@ -276,8 +277,8 @@ Battle::AI::Handlers::MoveBasePower.copy("DoublePowerIfTargetHPLessThanHalf", "DoublePowerIfTargetAsleepCureTarget") Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("DoublePowerIfTargetAsleepCureTarget", proc { |score, move, user, target, ai, battle| - next score - 20 if target.status == :SLEEP && # Will cure status - target.statusCount > 1 + score -= 20 if target.status == :SLEEP && target.statusCount > 1 # Will cure status + next score } ) @@ -297,7 +298,8 @@ Battle::AI::Handlers::MoveBasePower.copy("DoublePowerIfTargetPoisoned", "DoublePowerIfTargetParalyzedCureTarget") Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("DoublePowerIfTargetParalyzedCureTarget", proc { |score, move, user, target, ai, battle| - next score - 20 if target.status == :PARALYSIS # Will cure status + score -= 20 if target.status == :PARALYSIS # Will cure status + next score } ) @@ -315,7 +317,8 @@ Battle::AI::Handlers::MoveBasePower.add("DoublePowerIfTargetStatusProblem", #=============================================================================== Battle::AI::Handlers::MoveBasePower.add("DoublePowerIfUserHasNoItem", proc { |power, move, user, target, ai, battle| - next power * 2 if !user.item || user.has_active_item?(:FLYINGGEM) + power *= 2 if !user.item || user.has_active_item?(:FLYINGGEM) + next power } ) @@ -404,7 +407,8 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("DoublePowerIfTargetLostH #=============================================================================== Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("DoublePowerIfTargetActed", proc { |score, move, user, target, ai, battle| - next score + 15 if target.faster_than?(user) + score += 15 if target.faster_than?(user) + next score } ) @@ -413,7 +417,8 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("DoublePowerIfTargetActed #=============================================================================== Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("DoublePowerIfTargetNotActed", proc { |score, move, user, target, ai, battle| - next score + 15 if user.faster_than?(target) + score += 15 if user.faster_than?(target) + next score } ) @@ -439,7 +444,7 @@ Battle::AI::Handlers::MoveEffectScore.add("EnsureNextCriticalHit", #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("StartPreventCriticalHitsAgainstUserSide", proc { |move, user, ai, battle| - next true if user.pbOwnSide.effects[PBEffects::LuckyChant] > 0 + next user.pbOwnSide.effects[PBEffects::LuckyChant] > 0 } ) @@ -448,7 +453,7 @@ Battle::AI::Handlers::MoveFailureCheck.add("StartPreventCriticalHitsAgainstUserS #=============================================================================== Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("CannotMakeTargetFaint", proc { |move, user, target, ai, battle| - next true if target.hp == 1 + next target.hp == 1 } ) @@ -487,11 +492,8 @@ Battle::AI::Handlers::MoveEffectScore.add("UserEnduresFaintingThisTurn", #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("StartWeakenElectricMoves", proc { |move, user, ai, battle| - if Settings::MECHANICS_GENERATION >= 6 - next true if battle.field.effects[PBEffects::MudSportField] > 0 - else - next true if battle.allBattlers.any? { |b| b.effects[PBEffects::MudSport] } - end + next battle.field.effects[PBEffects::MudSportField] > 0 if Settings::MECHANICS_GENERATION >= 6 + next battle.allBattlers.any? { |b| b.effects[PBEffects::MudSport] } } ) Battle::AI::Handlers::MoveEffectScore.add("StartWeakenElectricMoves", @@ -521,11 +523,8 @@ Battle::AI::Handlers::MoveEffectScore.add("StartWeakenElectricMoves", #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("StartWeakenFireMoves", proc { |move, user, ai, battle| - if Settings::MECHANICS_GENERATION >= 6 - next true if battle.field.effects[PBEffects::WaterSportField] > 0 - else - next true if battle.allBattlers.any? { |b| b.effects[PBEffects::WaterSport] } - end + next battle.field.effects[PBEffects::WaterSportField] > 0 if Settings::MECHANICS_GENERATION >= 6 + next battle.allBattlers.any? { |b| b.effects[PBEffects::WaterSport] } } ) Battle::AI::Handlers::MoveEffectScore.add("StartWeakenFireMoves", @@ -555,7 +554,7 @@ Battle::AI::Handlers::MoveEffectScore.add("StartWeakenFireMoves", #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("StartWeakenPhysicalDamageAgainstUserSide", proc { |move, user, ai, battle| - next true if user.pbOwnSide.effects[PBEffects::Reflect] > 0 + next user.pbOwnSide.effects[PBEffects::Reflect] > 0 } ) Battle::AI::Handlers::MoveEffectScore.add("StartWeakenPhysicalDamageAgainstUserSide", @@ -584,7 +583,7 @@ Battle::AI::Handlers::MoveEffectScore.add("StartWeakenPhysicalDamageAgainstUserS #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("StartWeakenSpecialDamageAgainstUserSide", proc { |move, user, ai, battle| - next true if user.pbOwnSide.effects[PBEffects::LightScreen] > 0 + next user.pbOwnSide.effects[PBEffects::LightScreen] > 0 } ) Battle::AI::Handlers::MoveEffectScore.add("StartWeakenSpecialDamageAgainstUserSide", @@ -615,6 +614,7 @@ Battle::AI::Handlers::MoveFailureCheck.add("StartWeakenDamageAgainstUserSideIfHa proc { |move, user, ai, battle| next true if user.pbOwnSide.effects[PBEffects::AuroraVeil] > 0 next true if user.battler.effectiveWeather != :Hail + next false } ) Battle::AI::Handlers::MoveEffectScore.add("StartWeakenDamageAgainstUserSideIfHail", @@ -764,7 +764,7 @@ Battle::AI::Handlers::MoveEffectScore.add("ProtectUserFromTargetingMovesSpikyShi #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("ProtectUserSideFromDamagingMovesIfUserFirstTurn", proc { |move, user, ai, battle| - next true if user.turnCount > 0 + next user.turnCount > 0 } ) Battle::AI::Handlers::MoveEffectScore.add("ProtectUserSideFromDamagingMovesIfUserFirstTurn", @@ -778,7 +778,7 @@ Battle::AI::Handlers::MoveEffectScore.add("ProtectUserSideFromDamagingMovesIfUse #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("ProtectUserSideFromStatusMoves", proc { |move, user, ai, battle| - next true if user.pbOwnSide.effects[PBEffects::CraftyShield] + next user.pbOwnSide.effects[PBEffects::CraftyShield] } ) @@ -809,13 +809,12 @@ Battle::AI::Handlers::MoveFailureCheck.add("ProtectUserSideFromStatusMoves", #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("HoopaRemoveProtectionsBypassSubstituteLowerUserDef1", proc { |move, user, ai, battle| - next true if !user.battler.isSpecies?(:HOOPA) || user.battler.form != 1 + next !user.battler.isSpecies?(:HOOPA) || user.battler.form != 1 } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("HoopaRemoveProtectionsBypassSubstituteLowerUserDef1", proc { |score, move, user, target, ai, battle| - score = ai.get_score_for_target_stat_drop(score, user, move.move.statDown, false) - next score + next ai.get_score_for_target_stat_drop(score, user, move.move.statDown, false) } ) @@ -942,7 +941,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("PoisonTarget", #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("EnsureNextMoveAlwaysHits", proc { |move, user, ai, battle| - next true if user.effects[PBEffects::LockOn] > 0 + next user.effects[PBEffects::LockOn] > 0 } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("EnsureNextMoveAlwaysHits", @@ -1037,6 +1036,7 @@ Battle::AI::Handlers::MoveFailureCheck.add("TypeAndPowerDependOnUserBerry", item = user.item next true if !item || !item.is_berry? || !user.item_active? next true if item.flags.none? { |f| f[/^NaturalGift_/i] } + next false } ) Battle::AI::Handlers::MoveBasePower.add("TypeAndPowerDependOnUserBerry", @@ -1066,7 +1066,7 @@ Battle::AI::Handlers::MoveBasePower.add("TypeAndPowerDependOnUserBerry", #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("TypeDependsOnUserMorpekoFormRaiseUserSpeed1", proc { |move, user, ai, battle| - next true if !user.battler.isSpecies?(:MORPEKO) && user.effects[PBEffects::TransformSpecies] != :MORPEKO + next !user.battler.isSpecies?(:MORPEKO) && user.effects[PBEffects::TransformSpecies] != :MORPEKO } ) Battle::AI::Handlers::MoveEffectScore.copy("RaiseUserSpeed1", @@ -1093,6 +1093,7 @@ Battle::AI::Handlers::MoveBasePower.copy("TypeAndPowerDependOnWeather", Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("TargetMovesBecomeElectric", proc { |score, move, user, target, ai, battle| next Battle::AI::MOVE_USELESS_SCORE if !user.faster_than?(target) + next score } ) 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 9e2ccee69..7f85d5dab 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 @@ -384,6 +384,7 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("TwoTurnAttackInvulnerab next true if target.effects[PBEffects::Substitute] > 0 && !move.move.ignoresSubstitute?(user.battler) next true if Settings::MECHANICS_GENERATION >= 6 && target.battler.pbWeight >= 2000 # 200.0kg next true if target.battler.semiInvulnerable? || target.effects[PBEffects::SkyDrop] >= 0 + next false } ) diff --git a/Data/Scripts/011_Battle/005_AI/056_AI_MoveHandlers_Healing.rb b/Data/Scripts/011_Battle/005_AI/056_AI_MoveHandlers_Healing.rb index 1e6715bd8..eb6daf0e9 100644 --- a/Data/Scripts/011_Battle/005_AI/056_AI_MoveHandlers_Healing.rb +++ b/Data/Scripts/011_Battle/005_AI/056_AI_MoveHandlers_Healing.rb @@ -6,6 +6,7 @@ Battle::AI::Handlers::MoveFailureCheck.add("HealUserFullyAndFallAsleep", next true if !user.battler.canHeal? next true if user.battler.asleep? next true if !user.battler.pbCanSleep?(user.battler, false, move.move, true) + next false } ) Battle::AI::Handlers::MoveEffectScore.add("HealUserFullyAndFallAsleep", @@ -35,7 +36,7 @@ Battle::AI::Handlers::MoveEffectScore.add("HealUserFullyAndFallAsleep", #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("HealUserHalfOfTotalHP", proc { |move, user, ai, battle| - next true if !user.battler.canHeal? + next !user.battler.canHeal? } ) Battle::AI::Handlers::MoveEffectScore.add("HealUserHalfOfTotalHP", @@ -119,8 +120,7 @@ Battle::AI::Handlers::MoveEffectScore.add("HealUserHalfOfTotalHPLoseFlyingTypeTh #=============================================================================== Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("CureTargetStatusHealUserHalfOfTotalHP", proc { |move, user, target, ai, battle| - next true if !user.battler.canHeal? - next true if target.status == :NONE + next !user.battler.canHeal? || target.status == :NONE } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("CureTargetStatusHealUserHalfOfTotalHP", @@ -148,10 +148,9 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("CureTargetStatusHealUser Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("HealUserByTargetAttackLowerTargetAttack1", proc { |move, user, target, ai, battle| if !battle.moldBreaker && target.has_active_ability?(:CONTRARY) - next true if target.statStageAtMax?(:ATTACK) - else - next true if target.statStageAtMin?(:ATTACK) + next target.statStageAtMax?(:ATTACK) end + next target.statStageAtMin?(:ATTACK) } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("HealUserByTargetAttackLowerTargetAttack1", @@ -210,7 +209,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("HealUserByHalfOfDamageDo #=============================================================================== Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("HealUserByHalfOfDamageDoneIfTargetAsleep", proc { |move, user, target, ai, battle| - next true if !target.battler.asleep? + next !target.battler.asleep? } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("HealUserByHalfOfDamageDone", @@ -244,7 +243,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("HealUserByThreeQuartersO #=============================================================================== Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("HealUserAndAlliesQuarterOfTotalHP", proc { |move, user, target, ai, battle| - next true if !target.battler.canHeal? + next !target.battler.canHeal? } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("HealUserAndAlliesQuarterOfTotalHP", @@ -264,7 +263,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("HealUserAndAlliesQuarter #=============================================================================== Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("HealUserAndAlliesQuarterOfTotalHPCureStatus", proc { |move, user, target, ai, battle| - next true if !target.battler.canHeal? && target.status == :NONE + next !target.battler.canHeal? && target.status == :NONE } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("HealUserAndAlliesQuarterOfTotalHPCureStatus", @@ -286,7 +285,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("HealUserAndAlliesQuarter #=============================================================================== Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("HealTargetHalfOfTotalHP", proc { |move, user, target, ai, battle| - next true if !target.battler.canHeal? + next !target.battler.canHeal? } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("HealTargetHalfOfTotalHP", @@ -332,7 +331,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("HealTargetDependingOnGra #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("HealUserPositionNextTurn", proc { |move, user, ai, battle| - next true if battle.positions[user.index].effects[PBEffects::Wish] > 0 + next battle.positions[user.index].effects[PBEffects::Wish] > 0 } ) Battle::AI::Handlers::MoveEffectScore.add("HealUserPositionNextTurn", @@ -352,7 +351,7 @@ Battle::AI::Handlers::MoveEffectScore.add("HealUserPositionNextTurn", #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("StartHealUserEachTurn", proc { |move, user, ai, battle| - next true if user.effects[PBEffects::AquaRing] + next user.effects[PBEffects::AquaRing] } ) Battle::AI::Handlers::MoveEffectScore.add("StartHealUserEachTurn", @@ -368,7 +367,7 @@ Battle::AI::Handlers::MoveEffectScore.add("StartHealUserEachTurn", #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("StartHealUserEachTurnTrapUserInBattle", proc { |move, user, ai, battle| - next true if user.effects[PBEffects::Ingrain] + next user.effects[PBEffects::Ingrain] } ) Battle::AI::Handlers::MoveEffectScore.add("StartHealUserEachTurnTrapUserInBattle", @@ -385,7 +384,7 @@ Battle::AI::Handlers::MoveEffectScore.add("StartHealUserEachTurnTrapUserInBattle #=============================================================================== Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("StartDamageTargetEachTurnIfTargetAsleep", proc { |move, user, target, ai, battle| - next true if !target.battler.asleep? || target.effects[PBEffects::Nightmare] + next !target.battler.asleep? || target.effects[PBEffects::Nightmare] } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("StartDamageTargetEachTurnIfTargetAsleep", @@ -402,6 +401,7 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("StartLeechSeedTarget", proc { |move, user, target, ai, battle| next true if target.effects[PBEffects::LeechSeed] >= 0 next true if target.has_type?(:GRASS) || !target.battler.takesIndirectDamage? + next false } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("StartLeechSeedTarget", @@ -458,7 +458,7 @@ Battle::AI::Handlers::MoveEffectScore.add("UserLosesHalfOfTotalHP", #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("UserLosesHalfOfTotalHPExplosive", proc { |move, user, ai, battle| - next true if !battle.moldBreaker && battle.pbCheckGlobalAbility(:DAMP) + next !battle.moldBreaker && battle.pbCheckGlobalAbility(:DAMP) } ) Battle::AI::Handlers::MoveEffectScore.copy("UserLosesHalfOfTotalHP", @@ -496,7 +496,8 @@ Battle::AI::Handlers::MoveFailureCheck.copy("UserFaintsExplosive", "UserFaintsPowersUpInMistyTerrainExplosive") Battle::AI::Handlers::MoveBasePower.add("UserFaintsPowersUpInMistyTerrainExplosive", proc { |power, move, user, target, ai, battle| - next power * 3 / 2 if battle.field.terrain == :Misty + power = power * 3 / 2 if battle.field.terrain == :Misty + next power } ) Battle::AI::Handlers::MoveEffectScore.copy("UserFaintsExplosive", @@ -543,7 +544,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("UserFaintsLowerTargetAtk #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("UserFaintsHealAndCureReplacement", proc { |move, user, ai, battle| - next true if !battle.pbCanChooseNonActive?(user.index) + next !battle.pbCanChooseNonActive?(user.index) } ) Battle::AI::Handlers::MoveEffectScore.add("UserFaintsHealAndCureReplacement", @@ -592,6 +593,7 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("StartPerishCountsForAll next true if target.effects[PBEffects::PerishSong] > 0 next true if Battle::AbilityEffects.triggerMoveImmunity(target.ability, user.battler, target.battler, move.move, move.rough_type, battle, false) + next false } ) Battle::AI::Handlers::MoveEffectScore.add("StartPerishCountsForAllBattlers", diff --git a/Data/Scripts/011_Battle/005_AI/057_AI_MoveHandlers_Items.rb b/Data/Scripts/011_Battle/005_AI/057_AI_MoveHandlers_Items.rb index f1e086c07..6935dd4c8 100644 --- a/Data/Scripts/011_Battle/005_AI/057_AI_MoveHandlers_Items.rb +++ b/Data/Scripts/011_Battle/005_AI/057_AI_MoveHandlers_Items.rb @@ -26,6 +26,7 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("TargetTakesUserItem", proc { |move, user, target, ai, battle| next true if !user.item || user.battler.unlosableItem?(user.item) next true if target.item || target.battler.unlosableItem?(user.item) + next false } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("TargetTakesUserItem", @@ -50,6 +51,7 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("UserTargetSwapItems", next true if user.battler.unlosableItem?(user.item) || user.battler.unlosableItem?(target.item) next true if target.battler.unlosableItem?(target.item) || target.battler.unlosableItem?(user.item) next true if target.has_active_ability?(:STICKYHOLD) && !battle.moldBreaker + next false } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("UserTargetSwapItems", @@ -72,7 +74,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("UserTargetSwapItems", #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("RestoreUserConsumedItem", proc { |move, user, ai, battle| - next true if !user.battler.recycleItem || user.item + next !user.battler.recycleItem || user.item } ) Battle::AI::Handlers::MoveEffectScore.add("RestoreUserConsumedItem", @@ -133,6 +135,7 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("CorrodeTargetItem", target.effects[PBEffects::Substitute] > 0 next true if target.has_active_ability?(:STICKYHOLD) next true if battle.corrosiveGas[target.index % 2][target.party_index] + next false } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("CorrodeTargetItem", @@ -149,7 +152,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("CorrodeTargetItem", #=============================================================================== Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("StartTargetCannotUseItem", proc { |move, user, target, ai, battle| - next true if target.effects[PBEffects::Embargo] > 0 + next target.effects[PBEffects::Embargo] > 0 } ) @@ -160,7 +163,8 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("StartTargetCannotUseIte Battle::AI::Handlers::MoveEffectScore.add("StartNegateHeldItems", proc { |score, move, user, ai, battle| next Battle::AI::MOVE_USELESS_SCORE if battle.field.effects[PBEffects::MagicRoom] > 0 - next score + 30 if !user.item # && target.item + score += 30 if !user.item # && target.item + next score } ) @@ -170,7 +174,7 @@ Battle::AI::Handlers::MoveEffectScore.add("StartNegateHeldItems", Battle::AI::Handlers::MoveFailureCheck.add("UserConsumeBerryRaiseDefense2", proc { |move, user, ai, battle| item = user.item - next true if !item || !item.is_berry? || !user.item_active? + next !item || !item.is_berry? || !user.item_active? } ) Battle::AI::Handlers::MoveEffectScore.add("UserConsumeBerryRaiseDefense2", @@ -203,7 +207,7 @@ Battle::AI::Handlers::MoveEffectScore.add("UserConsumeBerryRaiseDefense2", #=============================================================================== Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("AllBattlersConsumeBerry", proc { |move, user, target, ai, battle| - next true if !target.item || !target.item.is_berry? || target.battler.semiInvulnerable? + next !target.item || !target.item.is_berry? || target.battler.semiInvulnerable? } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("AllBattlersConsumeBerry", @@ -268,6 +272,7 @@ Battle::AI::Handlers::MoveFailureCheck.add("ThrowUserItemAtTarget", next true if !item || !user.item_active? || user.battler.unlosableItem?(item) next true if item.is_berry? && !user.battler.canConsumeBerry? next true if item.flags.none? { |f| f[/^Fling_/i] } + next false } ) Battle::AI::Handlers::MoveBasePower.add("ThrowUserItemAtTarget", diff --git a/Data/Scripts/011_Battle/005_AI/058_AI_MoveHandlers_ChangeMoveEffect.rb b/Data/Scripts/011_Battle/005_AI/058_AI_MoveHandlers_ChangeMoveEffect.rb index 821221a7b..76113f1ba 100644 --- a/Data/Scripts/011_Battle/005_AI/058_AI_MoveHandlers_ChangeMoveEffect.rb +++ b/Data/Scripts/011_Battle/005_AI/058_AI_MoveHandlers_ChangeMoveEffect.rb @@ -11,6 +11,7 @@ Battle::AI::Handlers::MoveEffectScore.add("RedirectAllMovesToUser", score += 10 if b.hp <= b.totalhp / 3 end end + next score } ) @@ -55,7 +56,7 @@ Battle::AI::Handlers::MoveEffectScore.add("RandomlyDamageOrHealTarget", #=============================================================================== Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("HealAllyOrDamageFoe", proc { |move, user, target, ai, battle| - next true if !target.opposes?(user) && target.battler.canHeal? + next !target.opposes?(user) && target.battler.canHeal? } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("HealAllyOrDamageFoe", @@ -131,9 +132,42 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("CurseTargetOrLowerUserSp ) #=============================================================================== -# TODO: Review score modifiers. +# #=============================================================================== -# EffectDependsOnEnvironment +Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("EffectDependsOnEnvironment", + proc { |score, move, user, target, ai, battle| + # Determine this move's effect + move.move.pbOnStartUse(user.battler, [target.battler]) + function_code = nil + case move.move.secretPower + when 2 + function_code = "SleepTarget" + when 10 + function_code = "BurnTarget" + when 0, 1 + function_code = "ParalyzeTarget" + when 9 + function_code = "FreezeTarget" + when 5 + function_code = "LowerTargetAttack1" + when 14 + function_code = "LowerTargetDefense1" + when 3 + function_code = "LowerTargetSpAtk1" + when 4, 6, 12 + function_code = "LowerTargetSpeed1" + when 8 + function_code = "LowerTargetAccuracy1" + when 7, 11, 13 + function_code = "FlinchTarget" + end + if function_code + next Battle::AI::Handlers.apply_move_effect_against_target_score(function_code, + score, move, user, target, ai, battle) + end + next score + } +) #=============================================================================== # @@ -149,7 +183,7 @@ Battle::AI::Handlers::MoveBasePower.add("HitsAllFoesAndPowersUpInPsychicTerrain" #=============================================================================== Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("TargetNextFireMoveDamagesTarget", proc { |move, user, target, ai, battle| - next true if target.effects[PBEffects::Powder] + next target.effects[PBEffects::Powder] } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("TargetNextFireMoveDamagesTarget", @@ -192,17 +226,17 @@ Battle::AI::Handlers::MoveEffectScore.add("DoublePowerAfterFusionBolt", ) #=============================================================================== -# TODO: Review score modifiers. +# #=============================================================================== Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("PowerUpAllyMove", proc { |move, user, target, ai, battle| - next true if target.fainted? || target.effects[PBEffects::HelpingHand] + next target.effects[PBEffects::HelpingHand] } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("PowerUpAllyMove", proc { |score, move, user, target, ai, battle| next Battle::AI::MOVE_USELESS_SCORE if !target.check_for_move { |m| m.damagingMove? } - next score + 8 + next score + 4 } ) @@ -274,7 +308,7 @@ Battle::AI::Handlers::MoveEffectScore.add("CounterDamagePlusHalf", #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("UserAddStockpileRaiseDefSpDef1", proc { |move, user, ai, battle| - next true if user.effects[PBEffects::Stockpile] >= 3 + next user.effects[PBEffects::Stockpile] >= 3 } ) Battle::AI::Handlers::MoveEffectScore.add("UserAddStockpileRaiseDefSpDef1", @@ -295,7 +329,7 @@ Battle::AI::Handlers::MoveEffectScore.add("UserAddStockpileRaiseDefSpDef1", #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("PowerDependsOnUserStockpile", proc { |move, user, ai, battle| - next true if user.effects[PBEffects::Stockpile] == 0 + next user.effects[PBEffects::Stockpile] == 0 } ) Battle::AI::Handlers::MoveBasePower.add("PowerDependsOnUserStockpile", @@ -321,6 +355,7 @@ Battle::AI::Handlers::MoveFailureCheck.add("HealUserDependingOnUserStockpile", next true if !user.battler.canHeal? && user.effects[PBEffects::StockpileDef] == 0 && user.effects[PBEffects::StockpileSpDef] == 0 + next false } ) Battle::AI::Handlers::MoveEffectScore.add("HealUserDependingOnUserStockpile", @@ -378,27 +413,28 @@ Battle::AI::Handlers::MoveEffectScore.add("WaterPledge", ) #=============================================================================== -# TODO: Review score modifiers. +# NOTE: The move that this move will become is determined in def +# set_up_move_check, and the score for that move is calculated instead. If +# this move cannot become another move and will fail, the score for this +# move is calculated as normal (and the code below says it fails). #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("UseLastMoveUsed", proc { |move, user, ai, battle| next true if !battle.lastMoveUsed - next true if move.move.moveBlacklist.include?(GameData::Move.get(battle.lastMoveUsed).function_code) + next move.move.moveBlacklist.include?(GameData::Move.get(battle.lastMoveUsed).function_code) } ) #=============================================================================== -# TODO: Review score modifiers. +# NOTE: The move that this move will become is determined in def +# set_up_move_check, and the score for that move is calculated instead. If +# this move cannot become another move and will fail, the score for this +# move is calculated as normal (and the code below says it fails). #=============================================================================== Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("UseLastMoveUsedByTarget", proc { |move, user, target, ai, battle| next true if !target.battler.lastRegularMoveUsed - next true if GameData::Move.get(target.battler.lastRegularMoveUsed).flags.none? { |f| f[/^CanMirrorMove$/i] } - } -) -Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("UseLastMoveUsedByTarget", - proc { |score, move, user, target, ai, battle| - next Battle::AI::MOVE_USELESS_SCORE + next GameData::Move.get(target.battler.lastRegularMoveUsed).flags.none? { |f| f[/^CanMirrorMove$/i] } } ) @@ -408,7 +444,8 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("UseLastMoveUsedByTarget" # UseMoveTargetIsAboutToUse #=============================================================================== -# TODO: Review score modifiers. +# NOTE: The move that this move will become is determined in def +# set_up_move_check, and the score for that move is calculated instead. #=============================================================================== # UseMoveDependingOnEnvironment @@ -479,6 +516,7 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("ReplaceMoveThisBattleWi move.move.moveBlacklist.include?(last_move_data.function_code) || last_move_data.type == :SHADOW end + next false } ) Battle::AI::Handlers::MoveEffectScore.add("ReplaceMoveThisBattleWithTargetLastMoveUsed", 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 d1130c787..b7e4a8183 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 @@ -3,7 +3,7 @@ #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("FleeFromBattle", proc { |move, user, ai, battle| - next true if !battle.pbCanRun?(user.index) + next !battle.pbCanRun?(user.index) } ) @@ -12,11 +12,8 @@ Battle::AI::Handlers::MoveFailureCheck.add("FleeFromBattle", #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("SwitchOutUserStatusMove", proc { |move, user, ai, battle| - if user.wild? - next true if !battle.pbCanRun?(user.index) - else - next true if !battle.pbCanChooseNonActive?(user.index) - end + next !battle.pbCanRun?(user.index) if user.wild? + next !battle.pbCanChooseNonActive?(user.index) } ) Battle::AI::Handlers::MoveEffectScore.add("SwitchOutUserStatusMove", @@ -53,6 +50,7 @@ Battle::AI::Handlers::MoveEffectScore.add("SwitchOutUserDamagingMove", proc { |score, move, user, ai, battle| next 0 if !battle.pbCanChooseNonActive?(user.index) next 0 if ai.trainer.has_skill_flag?("ReserveLastPokemon") && battle.pbTeamAbleNonActiveCount(user.index) == 1 # Don't switch in ace + next score } ) @@ -83,7 +81,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("LowerTargetAtkSpAtk1Swit #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("SwitchOutUserPassOnEffects", proc { |move, user, ai, battle| - next true if !battle.pbCanChooseNonActive?(user.index) + next !battle.pbCanChooseNonActive?(user.index) } ) Battle::AI::Handlers::MoveEffectScore.add("SwitchOutUserPassOnEffects", @@ -130,6 +128,7 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("SwitchOutTargetStatusMo end next will_fail end + next false } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("SwitchOutTargetStatusMove", @@ -197,6 +196,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("BindTarget", score -= 8 end end + next score } ) @@ -216,10 +216,10 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("BindTarget", #=============================================================================== Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("TrapTargetInBattle", proc { |move, user, target, ai, battle| - if move.statusMove? - next true if target.effects[PBEffects::MeanLook] >= 0 - next true if Settings::MORE_TYPE_EFFECTS && target.has_type?(:GHOST) - end + next false if move.damagingMove? + next true if target.effects[PBEffects::MeanLook] >= 0 + next true if Settings::MORE_TYPE_EFFECTS && target.has_type?(:GHOST) + next false } ) @@ -228,10 +228,10 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("TrapTargetInBattle", #=============================================================================== Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("TrapTargetInBattleLowerTargetDefSpDef1EachTurn", proc { |move, user, target, ai, battle| - if move.statusMove? - next true if target.effects[PBEffects::Octolock] >= 0 - next true if Settings::MORE_TYPE_EFFECTS && target.has_type?(:GHOST) - end + next false if move.damagingMove? + next true if target.effects[PBEffects::Octolock] >= 0 + next true if Settings::MORE_TYPE_EFFECTS && target.has_type?(:GHOST) + next false } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("TrapTargetInBattleLowerTargetDefSpDef1EachTurn", @@ -260,7 +260,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("TrapUserAndTargetInBattl #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("TrapAllBattlersInBattleForOneTurn", proc { |move, user, ai, battle| - next true if battle.field.effects[PBEffects::FairyLock] > 0 + next battle.field.effects[PBEffects::FairyLock] > 0 } ) @@ -372,6 +372,7 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("TargetUsesItsLastUsedMo idxMove = i if m.id == target.battler.lastRegularMoveUsed end next true if target.battler.moves[idxMove].pp == 0 && target.battler.moves[idxMove].total_pp > 0 + next false } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("TargetUsesItsLastUsedMoveAgain", @@ -423,7 +424,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("LowerPPOfTargetLastMoveB Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("LowerPPOfTargetLastMoveBy4", proc { |move, user, target, ai, battle| last_move = target.battler.pbGetMoveWithID(target.battler.lastRegularMoveUsed) - next true if !last_move || last_move.pp == 0 || last_move.total_pp <= 0 + next !last_move || last_move.pp == 0 || last_move.total_pp <= 0 } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("LowerPPOfTargetLastMoveBy4", @@ -463,11 +464,13 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("DisableTargetUsingSameM proc { |move, user, target, ai, battle| next true if target.effects[PBEffects::Torment] next true if move.move.pbMoveFailedAromaVeil?(user.battler, target.battler, false) + next false } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("DisableTargetUsingSameMoveConsecutively", proc { |score, move, user, target, ai, battle| next 0 if target.effects[PBEffects::Torment] + next score } ) @@ -517,6 +520,7 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("DisableTargetStatusMove next true if move.move.pbMoveFailedAromaVeil?(user.battler, target.battler, false) next true if Settings::MECHANICS_GENERATION >= 6 && !battle.moldBreaker && target.has_active_ability?(:OBLIVIOUS) + next false } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("DisableTargetStatusMoves", @@ -533,6 +537,7 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("DisableTargetHealingMov proc { |move, user, target, ai, battle| next true if target.effects[PBEffects::HealBlock] > 0 next true if move.move.pbMoveFailedAromaVeil?(user.battler, target.battler, false) + next false } ) Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("DisableTargetHealingMoves", @@ -559,6 +564,6 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("DisableTargetSoundMoves" #=============================================================================== Battle::AI::Handlers::MoveFailureCheck.add("DisableTargetMovesKnownByUser", proc { |move, user, ai, battle| - next true if user.effects[PBEffects::Imprison] + next user.effects[PBEffects::Imprison] } ) 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 ee4add95f..f5830f8b6 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 @@ -28,7 +28,8 @@ #=============================================================================== Battle::AI::Handlers::GeneralMoveAgainstTargetScore.add(:shiny_target, proc { |score, move, user, target, ai, battle| - next score - 40 if target.wild? && target.battler.shiny? + score -= 40 if target.wild? && target.battler.shiny? + next score } ) @@ -48,8 +49,8 @@ Battle::AI::Handlers::GeneralMoveAgainstTargetScore.add(:add_predicted_damage, dmg = move.rough_damage score += [20.0 * dmg / target.hp, 25].min score += 10 if dmg > target.hp * 1.1 # Predicted to KO the target - next score.to_i end + next score.to_i } ) @@ -90,6 +91,7 @@ Battle::AI::Handlers::GeneralMoveAgainstTargetScore.add(:target_semi_invulnerabl end next Battle::AI::MOVE_USELESS_SCORE if miss end + next score } ) @@ -107,9 +109,10 @@ Battle::AI::Handlers::GeneralMoveAgainstTargetScore.add(:thawing_move_against_fr proc { |score, move, user, target, ai, battle| if ai.trainer.medium_skill? && target.status == :FROZEN if move.rough_type == :FIRE || (Settings::MECHANICS_GENERATION >= 6 && move.move.thawsUser?) - next score - 30 + score -= 30 end end + next score } ) @@ -134,10 +137,11 @@ Battle::AI::Handlers::GeneralMoveAgainstTargetScore.add(:flinching_effects, (move.damagingMove? && (user.has_active_item?([:KINGSROCK, :RAZORFANG]) || user.has_active_ability?(:STENCH))) - next score + 20 + score += 20 end end end + next score } ) @@ -162,7 +166,8 @@ Battle::AI::Handlers::GeneralMoveAgainstTargetScore.add(:flinching_effects, #=============================================================================== Battle::AI::Handlers::GeneralMoveAgainstTargetScore.add(:dance_move_against_dancer, proc { |score, move, user, target, ai, battle| - next score /= 2 if move.move.danceMove? && target.has_active_ability?(:DANCER) + score /= 2 if move.move.danceMove? && target.has_active_ability?(:DANCER) + next score } ) @@ -197,8 +202,8 @@ Battle::AI::Handlers::GeneralMoveAgainstTargetScore.add(:avoid_knocking_out_dest score -= 25 score -= 20 if battle.pbAbleNonActiveCount(user.idxOwnSide) == 0 end - next score end + next score } ) @@ -247,8 +252,8 @@ Battle::AI::Handlers::GeneralMoveScore.add(:thawing_move_when_frozen, break end end - next score end + next score } ) @@ -280,9 +285,9 @@ Battle::AI::Handlers::GeneralMoveScore.add(:good_move_for_choice_item, score *= move.accuracy / 100.0 if move.accuracy > 0 # Don't prefer moves with low PP score *= 0.9 if move.move.pp < 6 - next score end end + next score } )