More AI function code rewrites, ensured all AI procs next an appropriate value

This commit is contained in:
Maruno17
2023-01-14 23:51:39 +00:00
parent 84bdd1f60b
commit 98f16c2afa
12 changed files with 280 additions and 172 deletions

View File

@@ -222,6 +222,8 @@ end
# Effect depends on the environment. (Secret Power) # Effect depends on the environment. (Secret Power)
#=============================================================================== #===============================================================================
class Battle::Move::EffectDependsOnEnvironment < Battle::Move class Battle::Move::EffectDependsOnEnvironment < Battle::Move
attr_reader :secretPower
def flinchingMove?; return [6, 10, 12].include?(@secretPower); end def flinchingMove?; return [6, 10, 12].include?(@secretPower); end
def pbOnStartUse(user, targets) def pbOnStartUse(user, targets)
@@ -852,6 +854,8 @@ end
# Pokémon. # Pokémon.
#=============================================================================== #===============================================================================
class Battle::Move::UseMoveDependingOnEnvironment < Battle::Move class Battle::Move::UseMoveDependingOnEnvironment < Battle::Move
attr_reader :npMove
def callsAnotherMove?; return true; end def callsAnotherMove?; return true; end
def pbOnStartUse(user, targets) def pbOnStartUse(user, targets)

View File

@@ -36,7 +36,7 @@ class Battle::AI
add_move_to_choices(choices, idxMove, MOVE_FAIL_SCORE) add_move_to_choices(choices, idxMove, MOVE_FAIL_SCORE)
next next
end 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. # TODO: Alter target_data if user has Protean and move is Curse.
case target_data.num_targets case target_data.num_targets
when 0 # No targets, affects the user or a side or the whole field 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. # Set some extra class variables for the move/target combo being assessed.
#============================================================================= #=============================================================================
def set_up_move_check(move) 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) @move.set_up(move, @user)
@battle.moldBreaker = @user.has_mold_breaker? @battle.moldBreaker = @user.has_mold_breaker?
end end

View File

@@ -45,7 +45,7 @@ Battle::AI::Handlers::MoveEffectScore.copy("DoesNothingCongratulations",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("FailsIfNotUserFirstTurn", Battle::AI::Handlers::MoveFailureCheck.add("FailsIfNotUserFirstTurn",
proc { |move, user, ai, battle| proc { |move, user, ai, battle|
next true if user.turnCount > 0 next user.turnCount > 0
} }
) )
Battle::AI::Handlers::MoveEffectScore.add("FailsIfNotUserFirstTurn", Battle::AI::Handlers::MoveEffectScore.add("FailsIfNotUserFirstTurn",
@@ -68,7 +68,7 @@ Battle::AI::Handlers::MoveFailureCheck.add("FailsIfUserHasUnusedMove",
has_unused_move = true has_unused_move = true
break break
end 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", Battle::AI::Handlers::MoveFailureCheck.add("FailsIfUserNotConsumedBerry",
proc { |move, user, ai, battle| 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", Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("FailsIfTargetHasNoItem",
proc { |move, user, target, ai, battle| 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| proc { |move, user, target, ai, battle|
user_types = user.pbTypes(true) user_types = user.pbTypes(true)
target_types = target.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", Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("CrashDamageIfFailsUnusableInGravity",
proc { |score, move, user, target, ai, battle| 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", Battle::AI::Handlers::MoveFailureCheck.add("StartSunWeather",
proc { |move, user, ai, battle| proc { |move, user, ai, battle|
next true if [:HarshSun, :HeavyRain, :StrongWinds, next [:HarshSun, :HeavyRain, :StrongWinds, move.move.weatherType].include?(battle.field.weather)
move.move.weatherType].include?(battle.field.weather)
} }
) )
Battle::AI::Handlers::MoveEffectScore.add("StartSunWeather", Battle::AI::Handlers::MoveEffectScore.add("StartSunWeather",
@@ -345,7 +345,7 @@ Battle::AI::Handlers::MoveEffectScore.add("StartHailWeather",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("StartElectricTerrain", Battle::AI::Handlers::MoveFailureCheck.add("StartElectricTerrain",
proc { |move, user, ai, battle| proc { |move, user, ai, battle|
next true if battle.field.terrain == :Electric next battle.field.terrain == :Electric
} }
) )
Battle::AI::Handlers::MoveEffectScore.add("StartElectricTerrain", Battle::AI::Handlers::MoveEffectScore.add("StartElectricTerrain",
@@ -364,7 +364,7 @@ Battle::AI::Handlers::MoveEffectScore.add("StartElectricTerrain",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("StartGrassyTerrain", Battle::AI::Handlers::MoveFailureCheck.add("StartGrassyTerrain",
proc { |move, user, ai, battle| proc { |move, user, ai, battle|
next true if battle.field.terrain == :Grassy next battle.field.terrain == :Grassy
} }
) )
Battle::AI::Handlers::MoveEffectScore.add("StartGrassyTerrain", Battle::AI::Handlers::MoveEffectScore.add("StartGrassyTerrain",
@@ -383,7 +383,7 @@ Battle::AI::Handlers::MoveEffectScore.add("StartGrassyTerrain",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("StartMistyTerrain", Battle::AI::Handlers::MoveFailureCheck.add("StartMistyTerrain",
proc { |move, user, ai, battle| proc { |move, user, ai, battle|
next true if battle.field.terrain == :Misty next battle.field.terrain == :Misty
} }
) )
Battle::AI::Handlers::MoveEffectScore.add("StartMistyTerrain", Battle::AI::Handlers::MoveEffectScore.add("StartMistyTerrain",
@@ -402,7 +402,7 @@ Battle::AI::Handlers::MoveEffectScore.add("StartMistyTerrain",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("StartPsychicTerrain", Battle::AI::Handlers::MoveFailureCheck.add("StartPsychicTerrain",
proc { |move, user, ai, battle| proc { |move, user, ai, battle|
next true if battle.field.terrain == :Psychic next battle.field.terrain == :Psychic
} }
) )
Battle::AI::Handlers::MoveEffectScore.add("StartPsychicTerrain", Battle::AI::Handlers::MoveEffectScore.add("StartPsychicTerrain",
@@ -421,7 +421,7 @@ Battle::AI::Handlers::MoveEffectScore.add("StartPsychicTerrain",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("RemoveTerrain", Battle::AI::Handlers::MoveFailureCheck.add("RemoveTerrain",
proc { |move, user, ai, battle| proc { |move, user, ai, battle|
next true if battle.field.terrain == :None next battle.field.terrain == :None
} }
) )
Battle::AI::Handlers::MoveEffectScore.add("RemoveTerrain", Battle::AI::Handlers::MoveEffectScore.add("RemoveTerrain",
@@ -435,7 +435,7 @@ Battle::AI::Handlers::MoveEffectScore.add("RemoveTerrain",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("AddSpikesToFoeSide", Battle::AI::Handlers::MoveFailureCheck.add("AddSpikesToFoeSide",
proc { |move, user, ai, battle| 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", Battle::AI::Handlers::MoveEffectScore.add("AddSpikesToFoeSide",
@@ -471,7 +471,7 @@ Battle::AI::Handlers::MoveEffectScore.add("AddSpikesToFoeSide",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("AddToxicSpikesToFoeSide", Battle::AI::Handlers::MoveFailureCheck.add("AddToxicSpikesToFoeSide",
proc { |move, user, ai, battle| 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", Battle::AI::Handlers::MoveEffectScore.add("AddToxicSpikesToFoeSide",
@@ -509,7 +509,7 @@ Battle::AI::Handlers::MoveEffectScore.add("AddToxicSpikesToFoeSide",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("AddStealthRocksToFoeSide", Battle::AI::Handlers::MoveFailureCheck.add("AddStealthRocksToFoeSide",
proc { |move, user, ai, battle| 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", Battle::AI::Handlers::MoveEffectScore.add("AddStealthRocksToFoeSide",
@@ -536,7 +536,7 @@ Battle::AI::Handlers::MoveEffectScore.add("AddStealthRocksToFoeSide",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("AddStickyWebToFoeSide", Battle::AI::Handlers::MoveFailureCheck.add("AddStickyWebToFoeSide",
proc { |move, user, ai, battle| 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", 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]) score -= 10 if ![0, false, nil].include?(user.pbOwnSide.effects[e])
end end
end end
next score
end end
next score
} }
) )
@@ -614,7 +614,7 @@ Battle::AI::Handlers::MoveEffectScore.add("SwapSideEffects",
Battle::AI::Handlers::MoveFailureCheck.add("UserMakeSubstitute", Battle::AI::Handlers::MoveFailureCheck.add("UserMakeSubstitute",
proc { |move, user, ai, battle| proc { |move, user, ai, battle|
next true if user.effects[PBEffects::Substitute] > 0 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", Battle::AI::Handlers::MoveEffectScore.add("UserMakeSubstitute",
@@ -649,13 +649,14 @@ Battle::AI::Handlers::MoveEffectScore.add("RemoveUserBindingAndEntryHazards",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("AttackTwoTurnsLater", Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("AttackTwoTurnsLater",
proc { |move, user, target, ai, battle| 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", Battle::AI::Handlers::MoveEffectScore.add("AttackTwoTurnsLater",
proc { |score, move, user, ai, battle| proc { |score, move, user, ai, battle|
# Future Sight tends to be wasteful if down to last Pokémon # 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", Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("AllBattlersLoseHalfHPUserSkipsNextTurn",
proc { |move, user, target, ai, battle| proc { |move, user, target, ai, battle|
next true if target.hp <= 1 next target.hp <= 1
} }
) )
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("AllBattlersLoseHalfHPUserSkipsNextTurn", Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("AllBattlersLoseHalfHPUserSkipsNextTurn",
proc { |score, move, user, target, ai, battle| 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
} }
) )

View File

@@ -4,7 +4,7 @@
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("RaiseUserAttack1", Battle::AI::Handlers::MoveFailureCheck.add("RaiseUserAttack1",
proc { |move, user, ai, battle| proc { |move, user, ai, battle|
next true if move.statusMove? && next move.statusMove? &&
!user.battler.pbCanRaiseStatStage?(move.move.statUp[0], user.battler, move.move) !user.battler.pbCanRaiseStatStage?(move.move.statUp[0], user.battler, move.move)
} }
) )
@@ -30,6 +30,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("RaiseUserAttack2IfTarget
if move.rough_damage >= target.hp * 0.9 if move.rough_damage >= target.hp * 0.9
next ai.get_score_for_target_stat_raise(score, user, move.move.statUp) next ai.get_score_for_target_stat_raise(score, user, move.move.statUp)
end end
next score
} }
) )
@@ -53,7 +54,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("RaiseUserAttack2IfTarge
Battle::AI::Handlers::MoveFailureCheck.add("MaxUserAttackLoseHalfOfTotalHP", Battle::AI::Handlers::MoveFailureCheck.add("MaxUserAttackLoseHalfOfTotalHP",
proc { |move, user, ai, battle| proc { |move, user, ai, battle|
next true if user.hp <= [user.totalhp / 2, 1].max 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", Battle::AI::Handlers::MoveEffectScore.add("MaxUserAttackLoseHalfOfTotalHP",
@@ -300,7 +301,7 @@ Battle::AI::Handlers::MoveEffectScore.copy("RaiseUserEvasion2",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("RaiseUserCriticalHitRate2", Battle::AI::Handlers::MoveFailureCheck.add("RaiseUserCriticalHitRate2",
proc { |move, user, ai, battle| 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", Battle::AI::Handlers::MoveEffectScore.add("RaiseUserCriticalHitRate2",
@@ -329,7 +330,7 @@ Battle::AI::Handlers::MoveEffectScore.add("RaiseUserCriticalHitRate2",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("RaiseUserAtkDef1", Battle::AI::Handlers::MoveFailureCheck.add("RaiseUserAtkDef1",
proc { |move, user, ai, battle| proc { |move, user, ai, battle|
if move.statusMove? next false if move.damagingMove?
will_fail = true will_fail = true
(move.move.statUp.length / 2).times do |i| (move.move.statUp.length / 2).times do |i|
next if !user.battler.pbCanRaiseStatStage?(move.move.statUp[i * 2], user.battler, move.move) next if !user.battler.pbCanRaiseStatStage?(move.move.statUp[i * 2], user.battler, move.move)
@@ -337,7 +338,6 @@ Battle::AI::Handlers::MoveFailureCheck.add("RaiseUserAtkDef1",
break break
end end
next will_fail next will_fail
end
} }
) )
Battle::AI::Handlers::MoveEffectScore.copy("RaiseUserAttack1", Battle::AI::Handlers::MoveEffectScore.copy("RaiseUserAttack1",
@@ -621,7 +621,7 @@ Battle::AI::Handlers::MoveEffectScore.copy("LowerUserAttack1",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("RaiseTargetAttack1", Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("RaiseTargetAttack1",
proc { |move, user, target, ai, battle| proc { |move, user, target, ai, battle|
next true if move.statusMove? && next move.statusMove? &&
!target.battler.pbCanRaiseStatStage?(:ATTACK, user.battler, move.move) !target.battler.pbCanRaiseStatStage?(:ATTACK, user.battler, move.move)
} }
) )
@@ -636,7 +636,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("RaiseTargetAttack1",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("RaiseTargetAttack2ConfuseTarget", Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("RaiseTargetAttack2ConfuseTarget",
proc { |move, user, target, ai, battle| proc { |move, user, target, ai, battle|
next true if !target.battler.pbCanRaiseStatStage?(:ATTACK, user.battler, move.move) && next !target.battler.pbCanRaiseStatStage?(:ATTACK, user.battler, move.move) &&
!target.battler.pbCanConfuse?(user.battler, false, move.move) !target.battler.pbCanConfuse?(user.battler, false, move.move)
} }
) )
@@ -658,7 +658,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("RaiseTargetAttack2Confus
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("RaiseTargetSpAtk1ConfuseTarget", Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("RaiseTargetSpAtk1ConfuseTarget",
proc { |move, user, target, ai, battle| proc { |move, user, target, ai, battle|
next true if !target.battler.pbCanRaiseStatStage?(:SPECIAL_ATTACK, user.battler, move.move) && next !target.battler.pbCanRaiseStatStage?(:SPECIAL_ATTACK, user.battler, move.move) &&
!target.battler.pbCanConfuse?(user.battler, false, move.move) !target.battler.pbCanConfuse?(user.battler, false, move.move)
} }
) )
@@ -680,7 +680,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("RaiseTargetSpAtk1Confuse
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("RaiseTargetSpDef1", Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("RaiseTargetSpDef1",
proc { |move, user, target, ai, battle| 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", Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("RaiseTargetSpDef1",
@@ -732,7 +732,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("RaiseTargetRandomStat2",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("RaiseTargetAtkSpAtk2", Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("RaiseTargetAtkSpAtk2",
proc { |move, user, target, ai, battle| proc { |move, user, target, ai, battle|
next true if !target.battler.pbCanRaiseStatStage?(:ATTACK, user.battler, move.move) && next !target.battler.pbCanRaiseStatStage?(:ATTACK, user.battler, move.move) &&
!target.battler.pbCanRaiseStatStage?(:SPECIAL_ATTACK, user.battler, move.move) !target.battler.pbCanRaiseStatStage?(:SPECIAL_ATTACK, user.battler, move.move)
} }
) )
@@ -748,7 +748,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("RaiseTargetAtkSpAtk2",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("LowerTargetAttack1", Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("LowerTargetAttack1",
proc { |move, user, target, ai, battle| proc { |move, user, target, ai, battle|
next true if move.statusMove? && next move.statusMove? &&
!target.battler.pbCanLowerStatStage?(move.move.statDown[0], user.battler, move.move) !target.battler.pbCanLowerStatStage?(move.move.statDown[0], user.battler, move.move)
} }
) )
@@ -844,6 +844,7 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("LowerTargetSpAtk2IfCanA
!target.battler.pbCanLowerStatStage?(move.move.statDown[0], user.battler, move.move) !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 user.gender == 2 || target.gender == 2 || user.gender == target.gender
next true if !battle.moldBreaker && target.has_active_ability?(:OBLIVIOUS) next true if !battle.moldBreaker && target.has_active_ability?(:OBLIVIOUS)
next false
} }
) )
Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("LowerTargetSpAtk2", Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("LowerTargetSpAtk2",
@@ -907,10 +908,9 @@ Battle::AI::Handlers::MoveBasePower.add("LowerTargetSpeed1WeakerInGrassyTerrain"
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("LowerTargetSpeed1MakeTargetWeakerToFire", Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("LowerTargetSpeed1MakeTargetWeakerToFire",
proc { |move, user, target, ai, battle| proc { |move, user, target, ai, battle|
if !target.effects[PBEffects::TarShot] next false if !target.effects[PBEffects::TarShot]
next true if move.statusMove? && next move.statusMove? &&
!target.battler.pbCanLowerStatStage?(move.move.statDown[0], user.battler, move.move) !target.battler.pbCanLowerStatStage?(move.move.statDown[0], user.battler, move.move)
end
} }
) )
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("LowerTargetSpeed1MakeTargetWeakerToFire", Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("LowerTargetSpeed1MakeTargetWeakerToFire",
@@ -998,7 +998,7 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("LowerTargetEvasion1Remo
target_opposing_side.effects[PBEffects::ToxicSpikes] > 0 || target_opposing_side.effects[PBEffects::ToxicSpikes] > 0 ||
target_opposing_side.effects[PBEffects::StickyWeb]) target_opposing_side.effects[PBEffects::StickyWeb])
next false if Settings::MECHANICS_GENERATION >= 8 && battle.field.terrain != :None next false if Settings::MECHANICS_GENERATION >= 8 && battle.field.terrain != :None
next true if move.statusMove? && next move.statusMove? &&
!target.battler.pbCanLowerStatStage?(move.move.statDown[0], user.battler, move.move) !target.battler.pbCanLowerStatStage?(move.move.statDown[0], user.battler, move.move)
} }
) )
@@ -1349,7 +1349,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("UserStealTargetPositiveS
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("InvertTargetStatStages", Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("InvertTargetStatStages",
proc { |move, user, target, ai, battle| proc { |move, user, target, ai, battle|
next true if !target.battler.hasAlteredStatStages? next !target.battler.hasAlteredStatStages?
} }
) )
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("InvertTargetStatStages", Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("InvertTargetStatStages",
@@ -1399,7 +1399,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("ResetTargetStatStages",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("ResetAllBattlersStatStages", Battle::AI::Handlers::MoveFailureCheck.add("ResetAllBattlersStatStages",
proc { |move, user, ai, battle| 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", Battle::AI::Handlers::MoveEffectScore.add("ResetAllBattlersStatStages",
@@ -1428,7 +1428,7 @@ Battle::AI::Handlers::MoveEffectScore.add("ResetAllBattlersStatStages",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("StartUserSideImmunityToStatStageLowering", Battle::AI::Handlers::MoveFailureCheck.add("StartUserSideImmunityToStatStageLowering",
proc { |move, user, ai, battle| 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", Battle::AI::Handlers::MoveFailureCheck.add("StartUserSideDoubleSpeed",
proc { |move, user, ai, battle| 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
} }
) )

View File

@@ -3,7 +3,7 @@
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("SleepTarget", Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("SleepTarget",
proc { |move, user, target, ai, battle| 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", Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("SleepTarget",
@@ -59,12 +59,12 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("SleepTarget",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("SleepTargetIfUserDarkrai", Battle::AI::Handlers::MoveFailureCheck.add("SleepTargetIfUserDarkrai",
proc { |move, user, ai, battle| 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", Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("SleepTargetIfUserDarkrai",
proc { |move, user, target, ai, battle| 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", Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("SleepTarget",
@@ -83,6 +83,7 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("SleepTargetNextTurn",
proc { |move, user, target, ai, battle| proc { |move, user, target, ai, battle|
next true if target.effects[PBEffects::Yawn] > 0 next true if target.effects[PBEffects::Yawn] > 0
next true if !target.battler.pbCanSleep?(user.battler, false, move.move) next true if !target.battler.pbCanSleep?(user.battler, false, move.move)
next false
} }
) )
Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("SleepTarget", Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("SleepTarget",
@@ -93,7 +94,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("SleepTarget",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("PoisonTarget", Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("PoisonTarget",
proc { |move, user, target, ai, battle| 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", Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("PoisonTarget",
@@ -154,7 +155,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("PoisonTarget",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("PoisonTargetLowerTargetSpeed1", Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("PoisonTargetLowerTargetSpeed1",
proc { |move, user, target, ai, battle| proc { |move, user, target, ai, battle|
next true if !target.battler.pbCanPoison?(user.battler, false, move.move) && next !target.battler.pbCanPoison?(user.battler, false, move.move) &&
!target.battler.pbCanLowerStatStage?(:SPEED, user.battler, move.move) !target.battler.pbCanLowerStatStage?(:SPEED, user.battler, move.move)
} }
) )
@@ -181,7 +182,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("PoisonTarget",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("ParalyzeTarget", Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("ParalyzeTarget",
proc { |move, user, target, ai, battle| 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", 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) eff = target.effectiveness_of_type_against_battler(move.rough_type, user)
next true if Effectiveness.ineffective?(eff) next true if Effectiveness.ineffective?(eff)
next true if move.statusMove? && !target.battler.pbCanParalyze?(user.battler, false, move.move) next true if move.statusMove? && !target.battler.pbCanParalyze?(user.battler, false, move.move)
next false
} }
) )
Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("ParalyzeTarget", Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("ParalyzeTarget",
@@ -277,7 +279,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("ParalyzeFlinchTarget",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("BurnTarget", Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("BurnTarget",
proc { |move, user, target, ai, battle| 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", Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("BurnTarget",
@@ -356,7 +358,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("BurnFlinchTarget",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("FreezeTarget", Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("FreezeTarget",
proc { |move, user, target, ai, battle| 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", Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("FreezeTarget",
@@ -454,12 +456,12 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("ParalyzeBurnOrFreezeTarg
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("GiveUserStatusToTarget", Battle::AI::Handlers::MoveFailureCheck.add("GiveUserStatusToTarget",
proc { |move, user, ai, battle| proc { |move, user, ai, battle|
next true if user.status == :NONE next user.status == :NONE
} }
) )
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("GiveUserStatusToTarget", Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("GiveUserStatusToTarget",
proc { |move, user, target, ai, battle| 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", Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("GiveUserStatusToTarget",
@@ -491,7 +493,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("GiveUserStatusToTarget",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("CureUserBurnPoisonParalysis", Battle::AI::Handlers::MoveFailureCheck.add("CureUserBurnPoisonParalysis",
proc { |move, user, ai, battle| 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", Battle::AI::Handlers::MoveEffectScore.add("CureUserBurnPoisonParalysis",
@@ -542,7 +544,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("CureTargetBurn",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("StartUserSideImmunityToInflictedStatus", Battle::AI::Handlers::MoveFailureCheck.add("StartUserSideImmunityToInflictedStatus",
proc { |move, user, ai, battle| 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", Battle::AI::Handlers::MoveEffectScore.add("StartUserSideImmunityToInflictedStatus",
@@ -599,7 +601,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("FlinchTarget",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("FlinchTargetFailsIfNotUserFirstTurn", Battle::AI::Handlers::MoveFailureCheck.add("FlinchTargetFailsIfNotUserFirstTurn",
proc { |move, user, ai, battle| proc { |move, user, ai, battle|
next true if user.turnCount > 0 next user.turnCount > 0
} }
) )
Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("FlinchTarget", Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("FlinchTarget",
@@ -621,7 +623,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("FlinchTarget",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("ConfuseTarget", Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("ConfuseTarget",
proc { |move, user, target, ai, battle| 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", Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("ConfuseTarget",
@@ -660,7 +662,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("ConfuseTarget",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("AttractTarget", Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("AttractTarget",
proc { |move, user, target, ai, battle| 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", 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 = env_types[battle.environment] || :NORMAL
new_type = :NORMAL if !GameData::Type.exists?(new_type) new_type = :NORMAL if !GameData::Type.exists?(new_type)
end 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", 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 target.battler.pbTypes(true).empty?
next true if user.battler.pbTypes == target.battler.pbTypes && next true if user.battler.pbTypes == target.battler.pbTypes &&
user.effects[PBEffects::Type3] == target.effects[PBEffects::Type3] 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", Battle::AI::Handlers::MoveFailureCheck.add("UserLosesFireType",
proc { |move, user, ai, battle| 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] || next true if user.effects[PBEffects::Ingrain] ||
user.effects[PBEffects::SmackDown] || user.effects[PBEffects::SmackDown] ||
user.effects[PBEffects::MagnetRise] > 0 user.effects[PBEffects::MagnetRise] > 0
next false
} }
) )
Battle::AI::Handlers::MoveEffectScore.add("StartUserAirborne", Battle::AI::Handlers::MoveEffectScore.add("StartUserAirborne",
@@ -1215,6 +1219,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("HitsTargetInSkyGroundsTa
if ai.trainer.medium_skill? if ai.trainer.medium_skill?
score -= 8 if battle.field.terrain != :None score -= 8 if battle.field.terrain != :None
end end
next score
} }
) )
@@ -1223,7 +1228,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("HitsTargetInSkyGroundsTa
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("StartGravity", Battle::AI::Handlers::MoveFailureCheck.add("StartGravity",
proc { |move, user, ai, battle| 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", 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 user.effects[PBEffects::Transform]
next true if target.effects[PBEffects::Transform] || next true if target.effects[PBEffects::Transform] ||
target.effects[PBEffects::Illusion] target.effects[PBEffects::Illusion]
next false
} }
) )
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("TransformUserIntoTarget", Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("TransformUserIntoTarget",

View File

@@ -48,7 +48,7 @@ Battle::AI::Handlers::MoveBasePower.add("FixedDamageUserLevelRandom",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("LowerTargetHPToUserHP", Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("LowerTargetHPToUserHP",
proc { |move, user, target, ai, battle| proc { |move, user, target, ai, battle|
next true if user.hp >= target.hp next user.hp >= target.hp
} }
) )
Battle::AI::Handlers::MoveBasePower.add("LowerTargetHPToUserHP", Battle::AI::Handlers::MoveBasePower.add("LowerTargetHPToUserHP",
@@ -64,6 +64,7 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("OHKO",
proc { |move, user, target, ai, battle| proc { |move, user, target, ai, battle|
next true if target.level > user.level next true if target.level > user.level
next true if !battle.moldBreaker && target.has_active_ability?(:STURDY) next true if !battle.moldBreaker && target.has_active_ability?(:STURDY)
next false
} }
) )
Battle::AI::Handlers::MoveBasePower.add("OHKO", Battle::AI::Handlers::MoveBasePower.add("OHKO",
@@ -276,8 +277,8 @@ Battle::AI::Handlers::MoveBasePower.copy("DoublePowerIfTargetHPLessThanHalf",
"DoublePowerIfTargetAsleepCureTarget") "DoublePowerIfTargetAsleepCureTarget")
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("DoublePowerIfTargetAsleepCureTarget", Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("DoublePowerIfTargetAsleepCureTarget",
proc { |score, move, user, target, ai, battle| proc { |score, move, user, target, ai, battle|
next score - 20 if target.status == :SLEEP && # Will cure status score -= 20 if target.status == :SLEEP && target.statusCount > 1 # Will cure status
target.statusCount > 1 next score
} }
) )
@@ -297,7 +298,8 @@ Battle::AI::Handlers::MoveBasePower.copy("DoublePowerIfTargetPoisoned",
"DoublePowerIfTargetParalyzedCureTarget") "DoublePowerIfTargetParalyzedCureTarget")
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("DoublePowerIfTargetParalyzedCureTarget", Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("DoublePowerIfTargetParalyzedCureTarget",
proc { |score, move, user, target, ai, battle| 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", Battle::AI::Handlers::MoveBasePower.add("DoublePowerIfUserHasNoItem",
proc { |power, move, user, target, ai, battle| 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", Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("DoublePowerIfTargetActed",
proc { |score, move, user, target, ai, battle| 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", Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("DoublePowerIfTargetNotActed",
proc { |score, move, user, target, ai, battle| 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", Battle::AI::Handlers::MoveFailureCheck.add("StartPreventCriticalHitsAgainstUserSide",
proc { |move, user, ai, battle| 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", Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("CannotMakeTargetFaint",
proc { |move, user, target, ai, battle| 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", Battle::AI::Handlers::MoveFailureCheck.add("StartWeakenElectricMoves",
proc { |move, user, ai, battle| proc { |move, user, ai, battle|
if Settings::MECHANICS_GENERATION >= 6 next battle.field.effects[PBEffects::MudSportField] > 0 if Settings::MECHANICS_GENERATION >= 6
next true if battle.field.effects[PBEffects::MudSportField] > 0 next battle.allBattlers.any? { |b| b.effects[PBEffects::MudSport] }
else
next true if battle.allBattlers.any? { |b| b.effects[PBEffects::MudSport] }
end
} }
) )
Battle::AI::Handlers::MoveEffectScore.add("StartWeakenElectricMoves", Battle::AI::Handlers::MoveEffectScore.add("StartWeakenElectricMoves",
@@ -521,11 +523,8 @@ Battle::AI::Handlers::MoveEffectScore.add("StartWeakenElectricMoves",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("StartWeakenFireMoves", Battle::AI::Handlers::MoveFailureCheck.add("StartWeakenFireMoves",
proc { |move, user, ai, battle| proc { |move, user, ai, battle|
if Settings::MECHANICS_GENERATION >= 6 next battle.field.effects[PBEffects::WaterSportField] > 0 if Settings::MECHANICS_GENERATION >= 6
next true if battle.field.effects[PBEffects::WaterSportField] > 0 next battle.allBattlers.any? { |b| b.effects[PBEffects::WaterSport] }
else
next true if battle.allBattlers.any? { |b| b.effects[PBEffects::WaterSport] }
end
} }
) )
Battle::AI::Handlers::MoveEffectScore.add("StartWeakenFireMoves", Battle::AI::Handlers::MoveEffectScore.add("StartWeakenFireMoves",
@@ -555,7 +554,7 @@ Battle::AI::Handlers::MoveEffectScore.add("StartWeakenFireMoves",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("StartWeakenPhysicalDamageAgainstUserSide", Battle::AI::Handlers::MoveFailureCheck.add("StartWeakenPhysicalDamageAgainstUserSide",
proc { |move, user, ai, battle| 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", Battle::AI::Handlers::MoveEffectScore.add("StartWeakenPhysicalDamageAgainstUserSide",
@@ -584,7 +583,7 @@ Battle::AI::Handlers::MoveEffectScore.add("StartWeakenPhysicalDamageAgainstUserS
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("StartWeakenSpecialDamageAgainstUserSide", Battle::AI::Handlers::MoveFailureCheck.add("StartWeakenSpecialDamageAgainstUserSide",
proc { |move, user, ai, battle| 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", Battle::AI::Handlers::MoveEffectScore.add("StartWeakenSpecialDamageAgainstUserSide",
@@ -615,6 +614,7 @@ Battle::AI::Handlers::MoveFailureCheck.add("StartWeakenDamageAgainstUserSideIfHa
proc { |move, user, ai, battle| proc { |move, user, ai, battle|
next true if user.pbOwnSide.effects[PBEffects::AuroraVeil] > 0 next true if user.pbOwnSide.effects[PBEffects::AuroraVeil] > 0
next true if user.battler.effectiveWeather != :Hail next true if user.battler.effectiveWeather != :Hail
next false
} }
) )
Battle::AI::Handlers::MoveEffectScore.add("StartWeakenDamageAgainstUserSideIfHail", Battle::AI::Handlers::MoveEffectScore.add("StartWeakenDamageAgainstUserSideIfHail",
@@ -764,7 +764,7 @@ Battle::AI::Handlers::MoveEffectScore.add("ProtectUserFromTargetingMovesSpikyShi
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("ProtectUserSideFromDamagingMovesIfUserFirstTurn", Battle::AI::Handlers::MoveFailureCheck.add("ProtectUserSideFromDamagingMovesIfUserFirstTurn",
proc { |move, user, ai, battle| proc { |move, user, ai, battle|
next true if user.turnCount > 0 next user.turnCount > 0
} }
) )
Battle::AI::Handlers::MoveEffectScore.add("ProtectUserSideFromDamagingMovesIfUserFirstTurn", Battle::AI::Handlers::MoveEffectScore.add("ProtectUserSideFromDamagingMovesIfUserFirstTurn",
@@ -778,7 +778,7 @@ Battle::AI::Handlers::MoveEffectScore.add("ProtectUserSideFromDamagingMovesIfUse
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("ProtectUserSideFromStatusMoves", Battle::AI::Handlers::MoveFailureCheck.add("ProtectUserSideFromStatusMoves",
proc { |move, user, ai, battle| 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", Battle::AI::Handlers::MoveFailureCheck.add("HoopaRemoveProtectionsBypassSubstituteLowerUserDef1",
proc { |move, user, ai, battle| 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", Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("HoopaRemoveProtectionsBypassSubstituteLowerUserDef1",
proc { |score, move, user, target, ai, battle| proc { |score, move, user, target, ai, battle|
score = ai.get_score_for_target_stat_drop(score, user, move.move.statDown, false) next ai.get_score_for_target_stat_drop(score, user, move.move.statDown, false)
next score
} }
) )
@@ -942,7 +941,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("PoisonTarget",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("EnsureNextMoveAlwaysHits", Battle::AI::Handlers::MoveFailureCheck.add("EnsureNextMoveAlwaysHits",
proc { |move, user, ai, battle| 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", Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("EnsureNextMoveAlwaysHits",
@@ -1037,6 +1036,7 @@ Battle::AI::Handlers::MoveFailureCheck.add("TypeAndPowerDependOnUserBerry",
item = user.item item = user.item
next true if !item || !item.is_berry? || !user.item_active? next true if !item || !item.is_berry? || !user.item_active?
next true if item.flags.none? { |f| f[/^NaturalGift_/i] } next true if item.flags.none? { |f| f[/^NaturalGift_/i] }
next false
} }
) )
Battle::AI::Handlers::MoveBasePower.add("TypeAndPowerDependOnUserBerry", Battle::AI::Handlers::MoveBasePower.add("TypeAndPowerDependOnUserBerry",
@@ -1066,7 +1066,7 @@ Battle::AI::Handlers::MoveBasePower.add("TypeAndPowerDependOnUserBerry",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("TypeDependsOnUserMorpekoFormRaiseUserSpeed1", Battle::AI::Handlers::MoveFailureCheck.add("TypeDependsOnUserMorpekoFormRaiseUserSpeed1",
proc { |move, user, ai, battle| 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", Battle::AI::Handlers::MoveEffectScore.copy("RaiseUserSpeed1",
@@ -1093,6 +1093,7 @@ Battle::AI::Handlers::MoveBasePower.copy("TypeAndPowerDependOnWeather",
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("TargetMovesBecomeElectric", Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("TargetMovesBecomeElectric",
proc { |score, move, user, target, ai, battle| proc { |score, move, user, target, ai, battle|
next Battle::AI::MOVE_USELESS_SCORE if !user.faster_than?(target) next Battle::AI::MOVE_USELESS_SCORE if !user.faster_than?(target)
next score
} }
) )

View File

@@ -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 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 Settings::MECHANICS_GENERATION >= 6 && target.battler.pbWeight >= 2000 # 200.0kg
next true if target.battler.semiInvulnerable? || target.effects[PBEffects::SkyDrop] >= 0 next true if target.battler.semiInvulnerable? || target.effects[PBEffects::SkyDrop] >= 0
next false
} }
) )

View File

@@ -6,6 +6,7 @@ Battle::AI::Handlers::MoveFailureCheck.add("HealUserFullyAndFallAsleep",
next true if !user.battler.canHeal? next true if !user.battler.canHeal?
next true if user.battler.asleep? next true if user.battler.asleep?
next true if !user.battler.pbCanSleep?(user.battler, false, move.move, true) next true if !user.battler.pbCanSleep?(user.battler, false, move.move, true)
next false
} }
) )
Battle::AI::Handlers::MoveEffectScore.add("HealUserFullyAndFallAsleep", Battle::AI::Handlers::MoveEffectScore.add("HealUserFullyAndFallAsleep",
@@ -35,7 +36,7 @@ Battle::AI::Handlers::MoveEffectScore.add("HealUserFullyAndFallAsleep",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("HealUserHalfOfTotalHP", Battle::AI::Handlers::MoveFailureCheck.add("HealUserHalfOfTotalHP",
proc { |move, user, ai, battle| proc { |move, user, ai, battle|
next true if !user.battler.canHeal? next !user.battler.canHeal?
} }
) )
Battle::AI::Handlers::MoveEffectScore.add("HealUserHalfOfTotalHP", Battle::AI::Handlers::MoveEffectScore.add("HealUserHalfOfTotalHP",
@@ -119,8 +120,7 @@ Battle::AI::Handlers::MoveEffectScore.add("HealUserHalfOfTotalHPLoseFlyingTypeTh
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("CureTargetStatusHealUserHalfOfTotalHP", Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("CureTargetStatusHealUserHalfOfTotalHP",
proc { |move, user, target, ai, battle| proc { |move, user, target, ai, battle|
next true if !user.battler.canHeal? next !user.battler.canHeal? || target.status == :NONE
next true if target.status == :NONE
} }
) )
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("CureTargetStatusHealUserHalfOfTotalHP", Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("CureTargetStatusHealUserHalfOfTotalHP",
@@ -148,10 +148,9 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("CureTargetStatusHealUser
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("HealUserByTargetAttackLowerTargetAttack1", Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("HealUserByTargetAttackLowerTargetAttack1",
proc { |move, user, target, ai, battle| proc { |move, user, target, ai, battle|
if !battle.moldBreaker && target.has_active_ability?(:CONTRARY) if !battle.moldBreaker && target.has_active_ability?(:CONTRARY)
next true if target.statStageAtMax?(:ATTACK) next target.statStageAtMax?(:ATTACK)
else
next true if target.statStageAtMin?(:ATTACK)
end end
next target.statStageAtMin?(:ATTACK)
} }
) )
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("HealUserByTargetAttackLowerTargetAttack1", Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("HealUserByTargetAttackLowerTargetAttack1",
@@ -210,7 +209,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("HealUserByHalfOfDamageDo
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("HealUserByHalfOfDamageDoneIfTargetAsleep", Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("HealUserByHalfOfDamageDoneIfTargetAsleep",
proc { |move, user, target, ai, battle| proc { |move, user, target, ai, battle|
next true if !target.battler.asleep? next !target.battler.asleep?
} }
) )
Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("HealUserByHalfOfDamageDone", Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("HealUserByHalfOfDamageDone",
@@ -244,7 +243,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("HealUserByThreeQuartersO
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("HealUserAndAlliesQuarterOfTotalHP", Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("HealUserAndAlliesQuarterOfTotalHP",
proc { |move, user, target, ai, battle| proc { |move, user, target, ai, battle|
next true if !target.battler.canHeal? next !target.battler.canHeal?
} }
) )
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("HealUserAndAlliesQuarterOfTotalHP", Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("HealUserAndAlliesQuarterOfTotalHP",
@@ -264,7 +263,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("HealUserAndAlliesQuarter
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("HealUserAndAlliesQuarterOfTotalHPCureStatus", Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("HealUserAndAlliesQuarterOfTotalHPCureStatus",
proc { |move, user, target, ai, battle| 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", Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("HealUserAndAlliesQuarterOfTotalHPCureStatus",
@@ -286,7 +285,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("HealUserAndAlliesQuarter
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("HealTargetHalfOfTotalHP", Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("HealTargetHalfOfTotalHP",
proc { |move, user, target, ai, battle| proc { |move, user, target, ai, battle|
next true if !target.battler.canHeal? next !target.battler.canHeal?
} }
) )
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("HealTargetHalfOfTotalHP", Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("HealTargetHalfOfTotalHP",
@@ -332,7 +331,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("HealTargetDependingOnGra
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("HealUserPositionNextTurn", Battle::AI::Handlers::MoveFailureCheck.add("HealUserPositionNextTurn",
proc { |move, user, ai, battle| 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", Battle::AI::Handlers::MoveEffectScore.add("HealUserPositionNextTurn",
@@ -352,7 +351,7 @@ Battle::AI::Handlers::MoveEffectScore.add("HealUserPositionNextTurn",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("StartHealUserEachTurn", Battle::AI::Handlers::MoveFailureCheck.add("StartHealUserEachTurn",
proc { |move, user, ai, battle| proc { |move, user, ai, battle|
next true if user.effects[PBEffects::AquaRing] next user.effects[PBEffects::AquaRing]
} }
) )
Battle::AI::Handlers::MoveEffectScore.add("StartHealUserEachTurn", Battle::AI::Handlers::MoveEffectScore.add("StartHealUserEachTurn",
@@ -368,7 +367,7 @@ Battle::AI::Handlers::MoveEffectScore.add("StartHealUserEachTurn",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("StartHealUserEachTurnTrapUserInBattle", Battle::AI::Handlers::MoveFailureCheck.add("StartHealUserEachTurnTrapUserInBattle",
proc { |move, user, ai, battle| proc { |move, user, ai, battle|
next true if user.effects[PBEffects::Ingrain] next user.effects[PBEffects::Ingrain]
} }
) )
Battle::AI::Handlers::MoveEffectScore.add("StartHealUserEachTurnTrapUserInBattle", Battle::AI::Handlers::MoveEffectScore.add("StartHealUserEachTurnTrapUserInBattle",
@@ -385,7 +384,7 @@ Battle::AI::Handlers::MoveEffectScore.add("StartHealUserEachTurnTrapUserInBattle
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("StartDamageTargetEachTurnIfTargetAsleep", Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("StartDamageTargetEachTurnIfTargetAsleep",
proc { |move, user, target, ai, battle| 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", Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("StartDamageTargetEachTurnIfTargetAsleep",
@@ -402,6 +401,7 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("StartLeechSeedTarget",
proc { |move, user, target, ai, battle| proc { |move, user, target, ai, battle|
next true if target.effects[PBEffects::LeechSeed] >= 0 next true if target.effects[PBEffects::LeechSeed] >= 0
next true if target.has_type?(:GRASS) || !target.battler.takesIndirectDamage? next true if target.has_type?(:GRASS) || !target.battler.takesIndirectDamage?
next false
} }
) )
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("StartLeechSeedTarget", Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("StartLeechSeedTarget",
@@ -458,7 +458,7 @@ Battle::AI::Handlers::MoveEffectScore.add("UserLosesHalfOfTotalHP",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("UserLosesHalfOfTotalHPExplosive", Battle::AI::Handlers::MoveFailureCheck.add("UserLosesHalfOfTotalHPExplosive",
proc { |move, user, ai, battle| 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", Battle::AI::Handlers::MoveEffectScore.copy("UserLosesHalfOfTotalHP",
@@ -496,7 +496,8 @@ Battle::AI::Handlers::MoveFailureCheck.copy("UserFaintsExplosive",
"UserFaintsPowersUpInMistyTerrainExplosive") "UserFaintsPowersUpInMistyTerrainExplosive")
Battle::AI::Handlers::MoveBasePower.add("UserFaintsPowersUpInMistyTerrainExplosive", Battle::AI::Handlers::MoveBasePower.add("UserFaintsPowersUpInMistyTerrainExplosive",
proc { |power, move, user, target, ai, battle| 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", Battle::AI::Handlers::MoveEffectScore.copy("UserFaintsExplosive",
@@ -543,7 +544,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("UserFaintsLowerTargetAtk
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("UserFaintsHealAndCureReplacement", Battle::AI::Handlers::MoveFailureCheck.add("UserFaintsHealAndCureReplacement",
proc { |move, user, ai, battle| proc { |move, user, ai, battle|
next true if !battle.pbCanChooseNonActive?(user.index) next !battle.pbCanChooseNonActive?(user.index)
} }
) )
Battle::AI::Handlers::MoveEffectScore.add("UserFaintsHealAndCureReplacement", 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 target.effects[PBEffects::PerishSong] > 0
next true if Battle::AbilityEffects.triggerMoveImmunity(target.ability, user.battler, target.battler, next true if Battle::AbilityEffects.triggerMoveImmunity(target.ability, user.battler, target.battler,
move.move, move.rough_type, battle, false) move.move, move.rough_type, battle, false)
next false
} }
) )
Battle::AI::Handlers::MoveEffectScore.add("StartPerishCountsForAllBattlers", Battle::AI::Handlers::MoveEffectScore.add("StartPerishCountsForAllBattlers",

View File

@@ -26,6 +26,7 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("TargetTakesUserItem",
proc { |move, user, target, ai, battle| proc { |move, user, target, ai, battle|
next true if !user.item || user.battler.unlosableItem?(user.item) next true if !user.item || user.battler.unlosableItem?(user.item)
next true if target.item || target.battler.unlosableItem?(user.item) next true if target.item || target.battler.unlosableItem?(user.item)
next false
} }
) )
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("TargetTakesUserItem", 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 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.battler.unlosableItem?(target.item) || target.battler.unlosableItem?(user.item)
next true if target.has_active_ability?(:STICKYHOLD) && !battle.moldBreaker next true if target.has_active_ability?(:STICKYHOLD) && !battle.moldBreaker
next false
} }
) )
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("UserTargetSwapItems", Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("UserTargetSwapItems",
@@ -72,7 +74,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("UserTargetSwapItems",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("RestoreUserConsumedItem", Battle::AI::Handlers::MoveFailureCheck.add("RestoreUserConsumedItem",
proc { |move, user, ai, battle| 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", Battle::AI::Handlers::MoveEffectScore.add("RestoreUserConsumedItem",
@@ -133,6 +135,7 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("CorrodeTargetItem",
target.effects[PBEffects::Substitute] > 0 target.effects[PBEffects::Substitute] > 0
next true if target.has_active_ability?(:STICKYHOLD) next true if target.has_active_ability?(:STICKYHOLD)
next true if battle.corrosiveGas[target.index % 2][target.party_index] next true if battle.corrosiveGas[target.index % 2][target.party_index]
next false
} }
) )
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("CorrodeTargetItem", Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("CorrodeTargetItem",
@@ -149,7 +152,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("CorrodeTargetItem",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("StartTargetCannotUseItem", Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("StartTargetCannotUseItem",
proc { |move, user, target, ai, battle| 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", Battle::AI::Handlers::MoveEffectScore.add("StartNegateHeldItems",
proc { |score, move, user, ai, battle| proc { |score, move, user, ai, battle|
next Battle::AI::MOVE_USELESS_SCORE if battle.field.effects[PBEffects::MagicRoom] > 0 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", Battle::AI::Handlers::MoveFailureCheck.add("UserConsumeBerryRaiseDefense2",
proc { |move, user, ai, battle| proc { |move, user, ai, battle|
item = user.item 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", Battle::AI::Handlers::MoveEffectScore.add("UserConsumeBerryRaiseDefense2",
@@ -203,7 +207,7 @@ Battle::AI::Handlers::MoveEffectScore.add("UserConsumeBerryRaiseDefense2",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("AllBattlersConsumeBerry", Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("AllBattlersConsumeBerry",
proc { |move, user, target, ai, battle| 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", 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 || !user.item_active? || user.battler.unlosableItem?(item)
next true if item.is_berry? && !user.battler.canConsumeBerry? next true if item.is_berry? && !user.battler.canConsumeBerry?
next true if item.flags.none? { |f| f[/^Fling_/i] } next true if item.flags.none? { |f| f[/^Fling_/i] }
next false
} }
) )
Battle::AI::Handlers::MoveBasePower.add("ThrowUserItemAtTarget", Battle::AI::Handlers::MoveBasePower.add("ThrowUserItemAtTarget",

View File

@@ -11,6 +11,7 @@ Battle::AI::Handlers::MoveEffectScore.add("RedirectAllMovesToUser",
score += 10 if b.hp <= b.totalhp / 3 score += 10 if b.hp <= b.totalhp / 3
end end
end end
next score
} }
) )
@@ -55,7 +56,7 @@ Battle::AI::Handlers::MoveEffectScore.add("RandomlyDamageOrHealTarget",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("HealAllyOrDamageFoe", Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("HealAllyOrDamageFoe",
proc { |move, user, target, ai, battle| 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", 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", Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("TargetNextFireMoveDamagesTarget",
proc { |move, user, target, ai, battle| proc { |move, user, target, ai, battle|
next true if target.effects[PBEffects::Powder] next target.effects[PBEffects::Powder]
} }
) )
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("TargetNextFireMoveDamagesTarget", 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", Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("PowerUpAllyMove",
proc { |move, user, target, ai, battle| 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", Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("PowerUpAllyMove",
proc { |score, move, user, target, ai, battle| proc { |score, move, user, target, ai, battle|
next Battle::AI::MOVE_USELESS_SCORE if !target.check_for_move { |m| m.damagingMove? } 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", Battle::AI::Handlers::MoveFailureCheck.add("UserAddStockpileRaiseDefSpDef1",
proc { |move, user, ai, battle| 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", Battle::AI::Handlers::MoveEffectScore.add("UserAddStockpileRaiseDefSpDef1",
@@ -295,7 +329,7 @@ Battle::AI::Handlers::MoveEffectScore.add("UserAddStockpileRaiseDefSpDef1",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("PowerDependsOnUserStockpile", Battle::AI::Handlers::MoveFailureCheck.add("PowerDependsOnUserStockpile",
proc { |move, user, ai, battle| 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", Battle::AI::Handlers::MoveBasePower.add("PowerDependsOnUserStockpile",
@@ -321,6 +355,7 @@ Battle::AI::Handlers::MoveFailureCheck.add("HealUserDependingOnUserStockpile",
next true if !user.battler.canHeal? && next true if !user.battler.canHeal? &&
user.effects[PBEffects::StockpileDef] == 0 && user.effects[PBEffects::StockpileDef] == 0 &&
user.effects[PBEffects::StockpileSpDef] == 0 user.effects[PBEffects::StockpileSpDef] == 0
next false
} }
) )
Battle::AI::Handlers::MoveEffectScore.add("HealUserDependingOnUserStockpile", 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", Battle::AI::Handlers::MoveFailureCheck.add("UseLastMoveUsed",
proc { |move, user, ai, battle| proc { |move, user, ai, battle|
next true if !battle.lastMoveUsed 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", Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("UseLastMoveUsedByTarget",
proc { |move, user, target, ai, battle| proc { |move, user, target, ai, battle|
next true if !target.battler.lastRegularMoveUsed next true if !target.battler.lastRegularMoveUsed
next true if GameData::Move.get(target.battler.lastRegularMoveUsed).flags.none? { |f| f[/^CanMirrorMove$/i] } next 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
} }
) )
@@ -408,7 +444,8 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("UseLastMoveUsedByTarget"
# UseMoveTargetIsAboutToUse # 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 # UseMoveDependingOnEnvironment
@@ -479,6 +516,7 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("ReplaceMoveThisBattleWi
move.move.moveBlacklist.include?(last_move_data.function_code) || move.move.moveBlacklist.include?(last_move_data.function_code) ||
last_move_data.type == :SHADOW last_move_data.type == :SHADOW
end end
next false
} }
) )
Battle::AI::Handlers::MoveEffectScore.add("ReplaceMoveThisBattleWithTargetLastMoveUsed", Battle::AI::Handlers::MoveEffectScore.add("ReplaceMoveThisBattleWithTargetLastMoveUsed",

View File

@@ -3,7 +3,7 @@
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("FleeFromBattle", Battle::AI::Handlers::MoveFailureCheck.add("FleeFromBattle",
proc { |move, user, ai, battle| 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", Battle::AI::Handlers::MoveFailureCheck.add("SwitchOutUserStatusMove",
proc { |move, user, ai, battle| proc { |move, user, ai, battle|
if user.wild? next !battle.pbCanRun?(user.index) if user.wild?
next true if !battle.pbCanRun?(user.index) next !battle.pbCanChooseNonActive?(user.index)
else
next true if !battle.pbCanChooseNonActive?(user.index)
end
} }
) )
Battle::AI::Handlers::MoveEffectScore.add("SwitchOutUserStatusMove", Battle::AI::Handlers::MoveEffectScore.add("SwitchOutUserStatusMove",
@@ -53,6 +50,7 @@ Battle::AI::Handlers::MoveEffectScore.add("SwitchOutUserDamagingMove",
proc { |score, move, user, ai, battle| proc { |score, move, user, ai, battle|
next 0 if !battle.pbCanChooseNonActive?(user.index) 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 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", Battle::AI::Handlers::MoveFailureCheck.add("SwitchOutUserPassOnEffects",
proc { |move, user, ai, battle| proc { |move, user, ai, battle|
next true if !battle.pbCanChooseNonActive?(user.index) next !battle.pbCanChooseNonActive?(user.index)
} }
) )
Battle::AI::Handlers::MoveEffectScore.add("SwitchOutUserPassOnEffects", Battle::AI::Handlers::MoveEffectScore.add("SwitchOutUserPassOnEffects",
@@ -130,6 +128,7 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("SwitchOutTargetStatusMo
end end
next will_fail next will_fail
end end
next false
} }
) )
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("SwitchOutTargetStatusMove", Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("SwitchOutTargetStatusMove",
@@ -197,6 +196,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("BindTarget",
score -= 8 score -= 8
end end
end end
next score
} }
) )
@@ -216,10 +216,10 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("BindTarget",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("TrapTargetInBattle", Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("TrapTargetInBattle",
proc { |move, user, target, ai, battle| proc { |move, user, target, ai, battle|
if move.statusMove? next false if move.damagingMove?
next true if target.effects[PBEffects::MeanLook] >= 0 next true if target.effects[PBEffects::MeanLook] >= 0
next true if Settings::MORE_TYPE_EFFECTS && target.has_type?(:GHOST) next true if Settings::MORE_TYPE_EFFECTS && target.has_type?(:GHOST)
end next false
} }
) )
@@ -228,10 +228,10 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("TrapTargetInBattle",
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("TrapTargetInBattleLowerTargetDefSpDef1EachTurn", Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("TrapTargetInBattleLowerTargetDefSpDef1EachTurn",
proc { |move, user, target, ai, battle| proc { |move, user, target, ai, battle|
if move.statusMove? next false if move.damagingMove?
next true if target.effects[PBEffects::Octolock] >= 0 next true if target.effects[PBEffects::Octolock] >= 0
next true if Settings::MORE_TYPE_EFFECTS && target.has_type?(:GHOST) next true if Settings::MORE_TYPE_EFFECTS && target.has_type?(:GHOST)
end next false
} }
) )
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("TrapTargetInBattleLowerTargetDefSpDef1EachTurn", Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("TrapTargetInBattleLowerTargetDefSpDef1EachTurn",
@@ -260,7 +260,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("TrapUserAndTargetInBattl
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("TrapAllBattlersInBattleForOneTurn", Battle::AI::Handlers::MoveFailureCheck.add("TrapAllBattlersInBattleForOneTurn",
proc { |move, user, ai, battle| 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 idxMove = i if m.id == target.battler.lastRegularMoveUsed
end end
next true if target.battler.moves[idxMove].pp == 0 && target.battler.moves[idxMove].total_pp > 0 next true if target.battler.moves[idxMove].pp == 0 && target.battler.moves[idxMove].total_pp > 0
next false
} }
) )
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("TargetUsesItsLastUsedMoveAgain", Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("TargetUsesItsLastUsedMoveAgain",
@@ -423,7 +424,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("LowerPPOfTargetLastMoveB
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("LowerPPOfTargetLastMoveBy4", Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("LowerPPOfTargetLastMoveBy4",
proc { |move, user, target, ai, battle| proc { |move, user, target, ai, battle|
last_move = target.battler.pbGetMoveWithID(target.battler.lastRegularMoveUsed) 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", Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("LowerPPOfTargetLastMoveBy4",
@@ -463,11 +464,13 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("DisableTargetUsingSameM
proc { |move, user, target, ai, battle| proc { |move, user, target, ai, battle|
next true if target.effects[PBEffects::Torment] next true if target.effects[PBEffects::Torment]
next true if move.move.pbMoveFailedAromaVeil?(user.battler, target.battler, false) next true if move.move.pbMoveFailedAromaVeil?(user.battler, target.battler, false)
next false
} }
) )
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("DisableTargetUsingSameMoveConsecutively", Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("DisableTargetUsingSameMoveConsecutively",
proc { |score, move, user, target, ai, battle| proc { |score, move, user, target, ai, battle|
next 0 if target.effects[PBEffects::Torment] 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 move.move.pbMoveFailedAromaVeil?(user.battler, target.battler, false)
next true if Settings::MECHANICS_GENERATION >= 6 && next true if Settings::MECHANICS_GENERATION >= 6 &&
!battle.moldBreaker && target.has_active_ability?(:OBLIVIOUS) !battle.moldBreaker && target.has_active_ability?(:OBLIVIOUS)
next false
} }
) )
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("DisableTargetStatusMoves", Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("DisableTargetStatusMoves",
@@ -533,6 +537,7 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("DisableTargetHealingMov
proc { |move, user, target, ai, battle| proc { |move, user, target, ai, battle|
next true if target.effects[PBEffects::HealBlock] > 0 next true if target.effects[PBEffects::HealBlock] > 0
next true if move.move.pbMoveFailedAromaVeil?(user.battler, target.battler, false) next true if move.move.pbMoveFailedAromaVeil?(user.battler, target.battler, false)
next false
} }
) )
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("DisableTargetHealingMoves", Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("DisableTargetHealingMoves",
@@ -559,6 +564,6 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("DisableTargetSoundMoves"
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("DisableTargetMovesKnownByUser", Battle::AI::Handlers::MoveFailureCheck.add("DisableTargetMovesKnownByUser",
proc { |move, user, ai, battle| proc { |move, user, ai, battle|
next true if user.effects[PBEffects::Imprison] next user.effects[PBEffects::Imprison]
} }
) )

View File

@@ -28,7 +28,8 @@
#=============================================================================== #===============================================================================
Battle::AI::Handlers::GeneralMoveAgainstTargetScore.add(:shiny_target, Battle::AI::Handlers::GeneralMoveAgainstTargetScore.add(:shiny_target,
proc { |score, move, user, target, ai, battle| 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 dmg = move.rough_damage
score += [20.0 * dmg / target.hp, 25].min score += [20.0 * dmg / target.hp, 25].min
score += 10 if dmg > target.hp * 1.1 # Predicted to KO the target score += 10 if dmg > target.hp * 1.1 # Predicted to KO the target
next score.to_i
end end
next score.to_i
} }
) )
@@ -90,6 +91,7 @@ Battle::AI::Handlers::GeneralMoveAgainstTargetScore.add(:target_semi_invulnerabl
end end
next Battle::AI::MOVE_USELESS_SCORE if miss next Battle::AI::MOVE_USELESS_SCORE if miss
end end
next score
} }
) )
@@ -107,9 +109,10 @@ Battle::AI::Handlers::GeneralMoveAgainstTargetScore.add(:thawing_move_against_fr
proc { |score, move, user, target, ai, battle| proc { |score, move, user, target, ai, battle|
if ai.trainer.medium_skill? && target.status == :FROZEN if ai.trainer.medium_skill? && target.status == :FROZEN
if move.rough_type == :FIRE || (Settings::MECHANICS_GENERATION >= 6 && move.move.thawsUser?) if move.rough_type == :FIRE || (Settings::MECHANICS_GENERATION >= 6 && move.move.thawsUser?)
next score - 30 score -= 30
end end
end end
next score
} }
) )
@@ -134,10 +137,11 @@ Battle::AI::Handlers::GeneralMoveAgainstTargetScore.add(:flinching_effects,
(move.damagingMove? && (move.damagingMove? &&
(user.has_active_item?([:KINGSROCK, :RAZORFANG]) || (user.has_active_item?([:KINGSROCK, :RAZORFANG]) ||
user.has_active_ability?(:STENCH))) user.has_active_ability?(:STENCH)))
next score + 20 score += 20
end end
end 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, Battle::AI::Handlers::GeneralMoveAgainstTargetScore.add(:dance_move_against_dancer,
proc { |score, move, user, target, ai, battle| 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 -= 25
score -= 20 if battle.pbAbleNonActiveCount(user.idxOwnSide) == 0 score -= 20 if battle.pbAbleNonActiveCount(user.idxOwnSide) == 0
end end
next score
end end
next score
} }
) )
@@ -247,8 +252,8 @@ Battle::AI::Handlers::GeneralMoveScore.add(:thawing_move_when_frozen,
break break
end end
end end
next score
end 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 score *= move.accuracy / 100.0 if move.accuracy > 0
# Don't prefer moves with low PP # Don't prefer moves with low PP
score *= 0.9 if move.move.pp < 6 score *= 0.9 if move.move.pp < 6
end
end
next score next score
end
end
} }
) )