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)
#===============================================================================
class Battle::Move::EffectDependsOnEnvironment < Battle::Move
attr_reader :secretPower
def flinchingMove?; return [6, 10, 12].include?(@secretPower); end
def pbOnStartUse(user, targets)
@@ -852,6 +854,8 @@ end
# Pokémon.
#===============================================================================
class Battle::Move::UseMoveDependingOnEnvironment < Battle::Move
attr_reader :npMove
def callsAnotherMove?; return true; end
def pbOnStartUse(user, targets)

View File

@@ -36,7 +36,7 @@ class Battle::AI
add_move_to_choices(choices, idxMove, MOVE_FAIL_SCORE)
next
end
target_data = move.pbTarget(@user.battler)
target_data = @move.pbTarget(@user.battler)
# TODO: Alter target_data if user has Protean and move is Curse.
case target_data.num_targets
when 0 # No targets, affects the user or a side or the whole field
@@ -88,6 +88,21 @@ class Battle::AI
# Set some extra class variables for the move/target combo being assessed.
#=============================================================================
def set_up_move_check(move)
case move.function
when "UseLastMoveUsed"
if @battle.lastMoveUsed &&
!move.moveBlacklist.include?(GameData::Move.get(@battle.lastMoveUsed).function_code)
move = Battle::Move.from_pokemon_move(@battle, Pokemon::Move.new(@battle.lastMoveUsed))
end
when "UseLastMoveUsedByTarget"
if target.battler.lastRegularMoveUsed &&
GameData::Move.get(target.battler.lastRegularMoveUsed).flags.any? { |f| f[/^CanMirrorMove$/i] }
move = Battle::Move.from_pokemon_move(@battle, Pokemon::Move.new(target.battler.lastRegularMoveUsed))
end
when "UseMoveDependingOnEnvironment"
move.move.pbOnStartUse(@user.battler, []) # Determine which move is used instead
move = Battle::Move.from_pokemon_move(@battle, Pokemon::Move.new(move.npMove))
end
@move.set_up(move, @user)
@battle.moldBreaker = @user.has_mold_breaker?
end

View File

@@ -45,7 +45,7 @@ Battle::AI::Handlers::MoveEffectScore.copy("DoesNothingCongratulations",
#===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("FailsIfNotUserFirstTurn",
proc { |move, user, ai, battle|
next true if user.turnCount > 0
next user.turnCount > 0
}
)
Battle::AI::Handlers::MoveEffectScore.add("FailsIfNotUserFirstTurn",
@@ -68,7 +68,7 @@ Battle::AI::Handlers::MoveFailureCheck.add("FailsIfUserHasUnusedMove",
has_unused_move = true
break
end
next true if !has_another_move || has_unused_move
next !has_another_move || has_unused_move
}
)
@@ -77,7 +77,7 @@ Battle::AI::Handlers::MoveFailureCheck.add("FailsIfUserHasUnusedMove",
#===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("FailsIfUserNotConsumedBerry",
proc { |move, user, ai, battle|
next true if !user.battler.belched?
next !user.battler.belched?
}
)
@@ -86,7 +86,7 @@ Battle::AI::Handlers::MoveFailureCheck.add("FailsIfUserNotConsumedBerry",
#===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("FailsIfTargetHasNoItem",
proc { |move, user, target, ai, battle|
next true if !target.item || !target.item_active?
next !target.item || !target.item_active?
}
)
@@ -97,7 +97,7 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("FailsUnlessTargetShares
proc { |move, user, target, ai, battle|
user_types = user.pbTypes(true)
target_types = target.pbTypes(true)
next true if (user_types & target_types).empty?
next (user_types & target_types).empty?
}
)
@@ -162,7 +162,8 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("FailsIfTargetActed",
#===============================================================================
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("CrashDamageIfFailsUnusableInGravity",
proc { |score, move, user, target, ai, battle|
next score - (100 - move.rough_accuracy) if user.battler.takesIndirectDamage?
score -= (100 - move.rough_accuracy) if user.battler.takesIndirectDamage?
next score
}
)
@@ -171,8 +172,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("CrashDamageIfFailsUnusab
#===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("StartSunWeather",
proc { |move, user, ai, battle|
next true if [:HarshSun, :HeavyRain, :StrongWinds,
move.move.weatherType].include?(battle.field.weather)
next [:HarshSun, :HeavyRain, :StrongWinds, move.move.weatherType].include?(battle.field.weather)
}
)
Battle::AI::Handlers::MoveEffectScore.add("StartSunWeather",
@@ -345,7 +345,7 @@ Battle::AI::Handlers::MoveEffectScore.add("StartHailWeather",
#===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("StartElectricTerrain",
proc { |move, user, ai, battle|
next true if battle.field.terrain == :Electric
next battle.field.terrain == :Electric
}
)
Battle::AI::Handlers::MoveEffectScore.add("StartElectricTerrain",
@@ -364,7 +364,7 @@ Battle::AI::Handlers::MoveEffectScore.add("StartElectricTerrain",
#===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("StartGrassyTerrain",
proc { |move, user, ai, battle|
next true if battle.field.terrain == :Grassy
next battle.field.terrain == :Grassy
}
)
Battle::AI::Handlers::MoveEffectScore.add("StartGrassyTerrain",
@@ -383,7 +383,7 @@ Battle::AI::Handlers::MoveEffectScore.add("StartGrassyTerrain",
#===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("StartMistyTerrain",
proc { |move, user, ai, battle|
next true if battle.field.terrain == :Misty
next battle.field.terrain == :Misty
}
)
Battle::AI::Handlers::MoveEffectScore.add("StartMistyTerrain",
@@ -402,7 +402,7 @@ Battle::AI::Handlers::MoveEffectScore.add("StartMistyTerrain",
#===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("StartPsychicTerrain",
proc { |move, user, ai, battle|
next true if battle.field.terrain == :Psychic
next battle.field.terrain == :Psychic
}
)
Battle::AI::Handlers::MoveEffectScore.add("StartPsychicTerrain",
@@ -421,7 +421,7 @@ Battle::AI::Handlers::MoveEffectScore.add("StartPsychicTerrain",
#===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("RemoveTerrain",
proc { |move, user, ai, battle|
next true if battle.field.terrain == :None
next battle.field.terrain == :None
}
)
Battle::AI::Handlers::MoveEffectScore.add("RemoveTerrain",
@@ -435,7 +435,7 @@ Battle::AI::Handlers::MoveEffectScore.add("RemoveTerrain",
#===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("AddSpikesToFoeSide",
proc { |move, user, ai, battle|
next true if user.pbOpposingSide.effects[PBEffects::Spikes] >= 3
next user.pbOpposingSide.effects[PBEffects::Spikes] >= 3
}
)
Battle::AI::Handlers::MoveEffectScore.add("AddSpikesToFoeSide",
@@ -471,7 +471,7 @@ Battle::AI::Handlers::MoveEffectScore.add("AddSpikesToFoeSide",
#===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("AddToxicSpikesToFoeSide",
proc { |move, user, ai, battle|
next true if user.pbOpposingSide.effects[PBEffects::ToxicSpikes] >= 2
next user.pbOpposingSide.effects[PBEffects::ToxicSpikes] >= 2
}
)
Battle::AI::Handlers::MoveEffectScore.add("AddToxicSpikesToFoeSide",
@@ -509,7 +509,7 @@ Battle::AI::Handlers::MoveEffectScore.add("AddToxicSpikesToFoeSide",
#===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("AddStealthRocksToFoeSide",
proc { |move, user, ai, battle|
next true if user.pbOpposingSide.effects[PBEffects::StealthRock]
next user.pbOpposingSide.effects[PBEffects::StealthRock]
}
)
Battle::AI::Handlers::MoveEffectScore.add("AddStealthRocksToFoeSide",
@@ -536,7 +536,7 @@ Battle::AI::Handlers::MoveEffectScore.add("AddStealthRocksToFoeSide",
#===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("AddStickyWebToFoeSide",
proc { |move, user, ai, battle|
next true if user.pbOpposingSide.effects[PBEffects::StickyWeb]
next user.pbOpposingSide.effects[PBEffects::StickyWeb]
}
)
Battle::AI::Handlers::MoveEffectScore.add("AddStickyWebToFoeSide",
@@ -603,8 +603,8 @@ Battle::AI::Handlers::MoveEffectScore.add("SwapSideEffects",
score -= 10 if ![0, false, nil].include?(user.pbOwnSide.effects[e])
end
end
next score
end
next score
}
)
@@ -614,7 +614,7 @@ Battle::AI::Handlers::MoveEffectScore.add("SwapSideEffects",
Battle::AI::Handlers::MoveFailureCheck.add("UserMakeSubstitute",
proc { |move, user, ai, battle|
next true if user.effects[PBEffects::Substitute] > 0
next true if user.hp <= [user.totalhp / 4, 1].max
next user.hp <= [user.totalhp / 4, 1].max
}
)
Battle::AI::Handlers::MoveEffectScore.add("UserMakeSubstitute",
@@ -649,13 +649,14 @@ Battle::AI::Handlers::MoveEffectScore.add("RemoveUserBindingAndEntryHazards",
#===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("AttackTwoTurnsLater",
proc { |move, user, target, ai, battle|
next true if battle.positions[target.index].effects[PBEffects::FutureSightCounter] > 0
next battle.positions[target.index].effects[PBEffects::FutureSightCounter] > 0
}
)
Battle::AI::Handlers::MoveEffectScore.add("AttackTwoTurnsLater",
proc { |score, move, user, ai, battle|
# Future Sight tends to be wasteful if down to last Pokémon
next score - 20 if battle.pbAbleNonActiveCount(user.idxOwnSide) == 0
score -= 20 if battle.pbAbleNonActiveCount(user.idxOwnSide) == 0
next score
}
)
@@ -703,12 +704,13 @@ Battle::AI::Handlers::MoveEffectScore.add("BurnAttackerBeforeUserActs",
#===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("AllBattlersLoseHalfHPUserSkipsNextTurn",
proc { |move, user, target, ai, battle|
next true if target.hp <= 1
next target.hp <= 1
}
)
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("AllBattlersLoseHalfHPUserSkipsNextTurn",
proc { |score, move, user, target, ai, battle|
next score + 20 if target.hp >= target.totalhp / 2
score += 20 if target.hp >= target.totalhp / 2
next score
}
)

View File

@@ -4,8 +4,8 @@
#===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("RaiseUserAttack1",
proc { |move, user, ai, battle|
next true if move.statusMove? &&
!user.battler.pbCanRaiseStatStage?(move.move.statUp[0], user.battler, move.move)
next move.statusMove? &&
!user.battler.pbCanRaiseStatStage?(move.move.statUp[0], user.battler, move.move)
}
)
Battle::AI::Handlers::MoveEffectScore.add("RaiseUserAttack1",
@@ -30,6 +30,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("RaiseUserAttack2IfTarget
if move.rough_damage >= target.hp * 0.9
next ai.get_score_for_target_stat_raise(score, user, move.move.statUp)
end
next score
}
)
@@ -53,7 +54,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("RaiseUserAttack2IfTarge
Battle::AI::Handlers::MoveFailureCheck.add("MaxUserAttackLoseHalfOfTotalHP",
proc { |move, user, ai, battle|
next true if user.hp <= [user.totalhp / 2, 1].max
next true if !user.battler.pbCanRaiseStatStage?(:ATTACK, user.battler, move.move)
next !user.battler.pbCanRaiseStatStage?(:ATTACK, user.battler, move.move)
}
)
Battle::AI::Handlers::MoveEffectScore.add("MaxUserAttackLoseHalfOfTotalHP",
@@ -300,7 +301,7 @@ Battle::AI::Handlers::MoveEffectScore.copy("RaiseUserEvasion2",
#===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("RaiseUserCriticalHitRate2",
proc { |move, user, ai, battle|
next true if user.effects[PBEffects::FocusEnergy] >= 2
next user.effects[PBEffects::FocusEnergy] >= 2
}
)
Battle::AI::Handlers::MoveEffectScore.add("RaiseUserCriticalHitRate2",
@@ -329,15 +330,14 @@ Battle::AI::Handlers::MoveEffectScore.add("RaiseUserCriticalHitRate2",
#===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("RaiseUserAtkDef1",
proc { |move, user, ai, battle|
if move.statusMove?
will_fail = true
(move.move.statUp.length / 2).times do |i|
next if !user.battler.pbCanRaiseStatStage?(move.move.statUp[i * 2], user.battler, move.move)
will_fail = false
break
end
next will_fail
next false if move.damagingMove?
will_fail = true
(move.move.statUp.length / 2).times do |i|
next if !user.battler.pbCanRaiseStatStage?(move.move.statUp[i * 2], user.battler, move.move)
will_fail = false
break
end
next will_fail
}
)
Battle::AI::Handlers::MoveEffectScore.copy("RaiseUserAttack1",
@@ -621,8 +621,8 @@ Battle::AI::Handlers::MoveEffectScore.copy("LowerUserAttack1",
#===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("RaiseTargetAttack1",
proc { |move, user, target, ai, battle|
next true if move.statusMove? &&
!target.battler.pbCanRaiseStatStage?(:ATTACK, user.battler, move.move)
next move.statusMove? &&
!target.battler.pbCanRaiseStatStage?(:ATTACK, user.battler, move.move)
}
)
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("RaiseTargetAttack1",
@@ -636,8 +636,8 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("RaiseTargetAttack1",
#===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("RaiseTargetAttack2ConfuseTarget",
proc { |move, user, target, ai, battle|
next true if !target.battler.pbCanRaiseStatStage?(:ATTACK, user.battler, move.move) &&
!target.battler.pbCanConfuse?(user.battler, false, move.move)
next !target.battler.pbCanRaiseStatStage?(:ATTACK, user.battler, move.move) &&
!target.battler.pbCanConfuse?(user.battler, false, move.move)
}
)
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("RaiseTargetAttack2ConfuseTarget",
@@ -658,8 +658,8 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("RaiseTargetAttack2Confus
#===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("RaiseTargetSpAtk1ConfuseTarget",
proc { |move, user, target, ai, battle|
next true if !target.battler.pbCanRaiseStatStage?(:SPECIAL_ATTACK, user.battler, move.move) &&
!target.battler.pbCanConfuse?(user.battler, false, move.move)
next !target.battler.pbCanRaiseStatStage?(:SPECIAL_ATTACK, user.battler, move.move) &&
!target.battler.pbCanConfuse?(user.battler, false, move.move)
}
)
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("RaiseTargetSpAtk1ConfuseTarget",
@@ -680,7 +680,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("RaiseTargetSpAtk1Confuse
#===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("RaiseTargetSpDef1",
proc { |move, user, target, ai, battle|
next true if !target.battler.pbCanRaiseStatStage?(:SPECIAL_DEFENSE, user.battler, move.move)
next !target.battler.pbCanRaiseStatStage?(:SPECIAL_DEFENSE, user.battler, move.move)
}
)
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("RaiseTargetSpDef1",
@@ -732,8 +732,8 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("RaiseTargetRandomStat2",
#===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("RaiseTargetAtkSpAtk2",
proc { |move, user, target, ai, battle|
next true if !target.battler.pbCanRaiseStatStage?(:ATTACK, user.battler, move.move) &&
!target.battler.pbCanRaiseStatStage?(:SPECIAL_ATTACK, user.battler, move.move)
next !target.battler.pbCanRaiseStatStage?(:ATTACK, user.battler, move.move) &&
!target.battler.pbCanRaiseStatStage?(:SPECIAL_ATTACK, user.battler, move.move)
}
)
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("RaiseTargetAtkSpAtk2",
@@ -748,8 +748,8 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("RaiseTargetAtkSpAtk2",
#===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("LowerTargetAttack1",
proc { |move, user, target, ai, battle|
next true if move.statusMove? &&
!target.battler.pbCanLowerStatStage?(move.move.statDown[0], user.battler, move.move)
next move.statusMove? &&
!target.battler.pbCanLowerStatStage?(move.move.statDown[0], user.battler, move.move)
}
)
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("LowerTargetAttack1",
@@ -844,6 +844,7 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("LowerTargetSpAtk2IfCanA
!target.battler.pbCanLowerStatStage?(move.move.statDown[0], user.battler, move.move)
next true if user.gender == 2 || target.gender == 2 || user.gender == target.gender
next true if !battle.moldBreaker && target.has_active_ability?(:OBLIVIOUS)
next false
}
)
Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("LowerTargetSpAtk2",
@@ -907,10 +908,9 @@ Battle::AI::Handlers::MoveBasePower.add("LowerTargetSpeed1WeakerInGrassyTerrain"
#===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("LowerTargetSpeed1MakeTargetWeakerToFire",
proc { |move, user, target, ai, battle|
if !target.effects[PBEffects::TarShot]
next true if move.statusMove? &&
!target.battler.pbCanLowerStatStage?(move.move.statDown[0], user.battler, move.move)
end
next false if !target.effects[PBEffects::TarShot]
next move.statusMove? &&
!target.battler.pbCanLowerStatStage?(move.move.statDown[0], user.battler, move.move)
}
)
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("LowerTargetSpeed1MakeTargetWeakerToFire",
@@ -998,8 +998,8 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("LowerTargetEvasion1Remo
target_opposing_side.effects[PBEffects::ToxicSpikes] > 0 ||
target_opposing_side.effects[PBEffects::StickyWeb])
next false if Settings::MECHANICS_GENERATION >= 8 && battle.field.terrain != :None
next true if move.statusMove? &&
!target.battler.pbCanLowerStatStage?(move.move.statDown[0], user.battler, move.move)
next move.statusMove? &&
!target.battler.pbCanLowerStatStage?(move.move.statDown[0], user.battler, move.move)
}
)
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("LowerTargetEvasion1RemoveSideEffects",
@@ -1349,7 +1349,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("UserStealTargetPositiveS
#===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("InvertTargetStatStages",
proc { |move, user, target, ai, battle|
next true if !target.battler.hasAlteredStatStages?
next !target.battler.hasAlteredStatStages?
}
)
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("InvertTargetStatStages",
@@ -1399,7 +1399,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("ResetTargetStatStages",
#===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("ResetAllBattlersStatStages",
proc { |move, user, ai, battle|
next true if battle.allBattlers.none? { |b| b.hasAlteredStatStages? }
next battle.allBattlers.none? { |b| b.hasAlteredStatStages? }
}
)
Battle::AI::Handlers::MoveEffectScore.add("ResetAllBattlersStatStages",
@@ -1428,7 +1428,7 @@ Battle::AI::Handlers::MoveEffectScore.add("ResetAllBattlersStatStages",
#===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("StartUserSideImmunityToStatStageLowering",
proc { |move, user, ai, battle|
next true if user.pbOwnSide.effects[PBEffects::Mist] > 0
next user.pbOwnSide.effects[PBEffects::Mist] > 0
}
)
@@ -1523,11 +1523,35 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("UserTargetAverageHP",
)
#===============================================================================
# TODO: Review score modifiers.
#
#===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("StartUserSideDoubleSpeed",
proc { |move, user, ai, battle|
next true if user.pbOwnSide.effects[PBEffects::Tailwind] > 0
next user.pbOwnSide.effects[PBEffects::Tailwind] > 0
}
)
Battle::AI::Handlers::MoveEffectScore.add("StartUserSideDoubleSpeed",
proc { |score, move, user, ai, battle|
# Don't want to make allies faster if Trick Room will make them act later
next Battle::AI::MOVE_USELESS_SCORE if battle.field.effects[PBEffects::TrickRoom] > 1
# Get the speeds of all battlers
ally_speeds = []
foe_speeds = []
ai.each_battler do |b|
spd = b.rough_stat(:SPEED)
(b.opposes?(user)) ? foe_speeds.push(spd) : ally_speeds.push(spd)
end
next Battle::AI::MOVE_USELESS_SCORE if ally_speeds.min > foe_speeds.max
# Compare speeds of all battlers
outspeeds = 0
ally_speeds.each do |ally_speed|
foe_speeds.each do |foe_speed|
outspeeds += 1 if foe_speed > ally_speed && foe_speed < ally_speed * 2
end
end
next Battle::AI::MOVE_USELESS_SCORE if outspeeds == 0
# This move will achieve something
next score + 10 * outspeeds + 5
}
)

View File

@@ -3,7 +3,7 @@
#===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("SleepTarget",
proc { |move, user, target, ai, battle|
next true if move.statusMove? && !target.battler.pbCanSleep?(user.battler, false, move.move)
next move.statusMove? && !target.battler.pbCanSleep?(user.battler, false, move.move)
}
)
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("SleepTarget",
@@ -59,12 +59,12 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("SleepTarget",
#===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("SleepTargetIfUserDarkrai",
proc { |move, user, ai, battle|
next true if !user.battler.isSpecies?(:DARKRAI) && user.effects[PBEffects::TransformSpecies] != :DARKRAI
next !user.battler.isSpecies?(:DARKRAI) && user.effects[PBEffects::TransformSpecies] != :DARKRAI
}
)
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("SleepTargetIfUserDarkrai",
proc { |move, user, target, ai, battle|
next true if move.statusMove? && !target.battler.pbCanSleep?(user.battler, false, move.move)
next move.statusMove? && !target.battler.pbCanSleep?(user.battler, false, move.move)
}
)
Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("SleepTarget",
@@ -83,6 +83,7 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("SleepTargetNextTurn",
proc { |move, user, target, ai, battle|
next true if target.effects[PBEffects::Yawn] > 0
next true if !target.battler.pbCanSleep?(user.battler, false, move.move)
next false
}
)
Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("SleepTarget",
@@ -93,7 +94,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("SleepTarget",
#===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("PoisonTarget",
proc { |move, user, target, ai, battle|
next true if move.statusMove? && !target.battler.pbCanPoison?(user.battler, false, move.move)
next move.statusMove? && !target.battler.pbCanPoison?(user.battler, false, move.move)
}
)
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("PoisonTarget",
@@ -154,8 +155,8 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("PoisonTarget",
#===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("PoisonTargetLowerTargetSpeed1",
proc { |move, user, target, ai, battle|
next true if !target.battler.pbCanPoison?(user.battler, false, move.move) &&
!target.battler.pbCanLowerStatStage?(:SPEED, user.battler, move.move)
next !target.battler.pbCanPoison?(user.battler, false, move.move) &&
!target.battler.pbCanLowerStatStage?(:SPEED, user.battler, move.move)
}
)
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("PoisonTargetLowerTargetSpeed1",
@@ -181,7 +182,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("PoisonTarget",
#===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("ParalyzeTarget",
proc { |move, user, target, ai, battle|
next true if move.statusMove? && !target.battler.pbCanParalyze?(user.battler, false, move.move)
next move.statusMove? && !target.battler.pbCanParalyze?(user.battler, false, move.move)
}
)
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("ParalyzeTarget",
@@ -248,6 +249,7 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("ParalyzeTargetIfNotType
eff = target.effectiveness_of_type_against_battler(move.rough_type, user)
next true if Effectiveness.ineffective?(eff)
next true if move.statusMove? && !target.battler.pbCanParalyze?(user.battler, false, move.move)
next false
}
)
Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("ParalyzeTarget",
@@ -277,7 +279,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("ParalyzeFlinchTarget",
#===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("BurnTarget",
proc { |move, user, target, ai, battle|
next true if move.statusMove? && !target.battler.pbCanBurn?(user.battler, false, move.move)
next move.statusMove? && !target.battler.pbCanBurn?(user.battler, false, move.move)
}
)
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("BurnTarget",
@@ -356,7 +358,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("BurnFlinchTarget",
#===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("FreezeTarget",
proc { |move, user, target, ai, battle|
next true if move.statusMove? && !target.battler.pbCanFreeze?(user.battler, false, move.move)
next move.statusMove? && !target.battler.pbCanFreeze?(user.battler, false, move.move)
}
)
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("FreezeTarget",
@@ -454,12 +456,12 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("ParalyzeBurnOrFreezeTarg
#===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("GiveUserStatusToTarget",
proc { |move, user, ai, battle|
next true if user.status == :NONE
next user.status == :NONE
}
)
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("GiveUserStatusToTarget",
proc { |move, user, target, ai, battle|
next true if !target.battler.pbCanInflictStatus?(user.status, user.battler, false, move.move)
next !target.battler.pbCanInflictStatus?(user.status, user.battler, false, move.move)
}
)
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("GiveUserStatusToTarget",
@@ -491,7 +493,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("GiveUserStatusToTarget",
#===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("CureUserBurnPoisonParalysis",
proc { |move, user, ai, battle|
next true if ![:BURN, :POISON, :PARALYSIS].include?(user.status)
next ![:BURN, :POISON, :PARALYSIS].include?(user.status)
}
)
Battle::AI::Handlers::MoveEffectScore.add("CureUserBurnPoisonParalysis",
@@ -542,7 +544,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("CureTargetBurn",
#===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("StartUserSideImmunityToInflictedStatus",
proc { |move, user, ai, battle|
next true if user.pbOwnSide.effects[PBEffects::Safeguard] > 0
next user.pbOwnSide.effects[PBEffects::Safeguard] > 0
}
)
Battle::AI::Handlers::MoveEffectScore.add("StartUserSideImmunityToInflictedStatus",
@@ -599,7 +601,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("FlinchTarget",
#===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("FlinchTargetFailsIfNotUserFirstTurn",
proc { |move, user, ai, battle|
next true if user.turnCount > 0
next user.turnCount > 0
}
)
Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("FlinchTarget",
@@ -621,7 +623,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("FlinchTarget",
#===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("ConfuseTarget",
proc { |move, user, target, ai, battle|
next true if move.statusMove? && !target.battler.pbCanConfuse?(user.battler, false, move.move)
next move.statusMove? && !target.battler.pbCanConfuse?(user.battler, false, move.move)
}
)
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("ConfuseTarget",
@@ -660,7 +662,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("ConfuseTarget",
#===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("AttractTarget",
proc { |move, user, target, ai, battle|
next true if move.statusMove? && !target.battler.pbCanAttract?(user.battler, false)
next move.statusMove? && !target.battler.pbCanAttract?(user.battler, false)
}
)
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("AttractTarget",
@@ -703,7 +705,7 @@ Battle::AI::Handlers::MoveFailureCheck.add("SetUserTypesBasedOnEnvironment",
new_type = env_types[battle.environment] || :NORMAL
new_type = :NORMAL if !GameData::Type.exists?(new_type)
end
next true if !GameData::Type.exists?(new_type) || !user.battler.pbHasOtherType?(new_type)
next !GameData::Type.exists?(new_type) || !user.battler.pbHasOtherType?(new_type)
}
)
Battle::AI::Handlers::MoveEffectScore.add("SetUserTypesBasedOnEnvironment",
@@ -782,6 +784,7 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("SetUserTypesToTargetTyp
next true if target.battler.pbTypes(true).empty?
next true if user.battler.pbTypes == target.battler.pbTypes &&
user.effects[PBEffects::Type3] == target.effects[PBEffects::Type3]
next false
}
)
@@ -938,7 +941,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("AddGrassTypeToTarget",
#===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("UserLosesFireType",
proc { |move, user, ai, battle|
next true if !user.has_type?(:FIRE)
next !user.has_type?(:FIRE)
}
)
@@ -1124,6 +1127,7 @@ Battle::AI::Handlers::MoveFailureCheck.add("StartUserAirborne",
next true if user.effects[PBEffects::Ingrain] ||
user.effects[PBEffects::SmackDown] ||
user.effects[PBEffects::MagnetRise] > 0
next false
}
)
Battle::AI::Handlers::MoveEffectScore.add("StartUserAirborne",
@@ -1215,6 +1219,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("HitsTargetInSkyGroundsTa
if ai.trainer.medium_skill?
score -= 8 if battle.field.terrain != :None
end
next score
}
)
@@ -1223,7 +1228,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("HitsTargetInSkyGroundsTa
#===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("StartGravity",
proc { |move, user, ai, battle|
next true if battle.field.effects[PBEffects::Gravity] > 0
next battle.field.effects[PBEffects::Gravity] > 0
}
)
Battle::AI::Handlers::MoveEffectScore.add("StartGravity",
@@ -1273,6 +1278,7 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("TransformUserIntoTarget
next true if user.effects[PBEffects::Transform]
next true if target.effects[PBEffects::Transform] ||
target.effects[PBEffects::Illusion]
next false
}
)
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("TransformUserIntoTarget",

View File

@@ -48,7 +48,7 @@ Battle::AI::Handlers::MoveBasePower.add("FixedDamageUserLevelRandom",
#===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("LowerTargetHPToUserHP",
proc { |move, user, target, ai, battle|
next true if user.hp >= target.hp
next user.hp >= target.hp
}
)
Battle::AI::Handlers::MoveBasePower.add("LowerTargetHPToUserHP",
@@ -64,6 +64,7 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("OHKO",
proc { |move, user, target, ai, battle|
next true if target.level > user.level
next true if !battle.moldBreaker && target.has_active_ability?(:STURDY)
next false
}
)
Battle::AI::Handlers::MoveBasePower.add("OHKO",
@@ -276,8 +277,8 @@ Battle::AI::Handlers::MoveBasePower.copy("DoublePowerIfTargetHPLessThanHalf",
"DoublePowerIfTargetAsleepCureTarget")
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("DoublePowerIfTargetAsleepCureTarget",
proc { |score, move, user, target, ai, battle|
next score - 20 if target.status == :SLEEP && # Will cure status
target.statusCount > 1
score -= 20 if target.status == :SLEEP && target.statusCount > 1 # Will cure status
next score
}
)
@@ -297,7 +298,8 @@ Battle::AI::Handlers::MoveBasePower.copy("DoublePowerIfTargetPoisoned",
"DoublePowerIfTargetParalyzedCureTarget")
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("DoublePowerIfTargetParalyzedCureTarget",
proc { |score, move, user, target, ai, battle|
next score - 20 if target.status == :PARALYSIS # Will cure status
score -= 20 if target.status == :PARALYSIS # Will cure status
next score
}
)
@@ -315,7 +317,8 @@ Battle::AI::Handlers::MoveBasePower.add("DoublePowerIfTargetStatusProblem",
#===============================================================================
Battle::AI::Handlers::MoveBasePower.add("DoublePowerIfUserHasNoItem",
proc { |power, move, user, target, ai, battle|
next power * 2 if !user.item || user.has_active_item?(:FLYINGGEM)
power *= 2 if !user.item || user.has_active_item?(:FLYINGGEM)
next power
}
)
@@ -404,7 +407,8 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("DoublePowerIfTargetLostH
#===============================================================================
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("DoublePowerIfTargetActed",
proc { |score, move, user, target, ai, battle|
next score + 15 if target.faster_than?(user)
score += 15 if target.faster_than?(user)
next score
}
)
@@ -413,7 +417,8 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("DoublePowerIfTargetActed
#===============================================================================
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("DoublePowerIfTargetNotActed",
proc { |score, move, user, target, ai, battle|
next score + 15 if user.faster_than?(target)
score += 15 if user.faster_than?(target)
next score
}
)
@@ -439,7 +444,7 @@ Battle::AI::Handlers::MoveEffectScore.add("EnsureNextCriticalHit",
#===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("StartPreventCriticalHitsAgainstUserSide",
proc { |move, user, ai, battle|
next true if user.pbOwnSide.effects[PBEffects::LuckyChant] > 0
next user.pbOwnSide.effects[PBEffects::LuckyChant] > 0
}
)
@@ -448,7 +453,7 @@ Battle::AI::Handlers::MoveFailureCheck.add("StartPreventCriticalHitsAgainstUserS
#===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("CannotMakeTargetFaint",
proc { |move, user, target, ai, battle|
next true if target.hp == 1
next target.hp == 1
}
)
@@ -487,11 +492,8 @@ Battle::AI::Handlers::MoveEffectScore.add("UserEnduresFaintingThisTurn",
#===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("StartWeakenElectricMoves",
proc { |move, user, ai, battle|
if Settings::MECHANICS_GENERATION >= 6
next true if battle.field.effects[PBEffects::MudSportField] > 0
else
next true if battle.allBattlers.any? { |b| b.effects[PBEffects::MudSport] }
end
next battle.field.effects[PBEffects::MudSportField] > 0 if Settings::MECHANICS_GENERATION >= 6
next battle.allBattlers.any? { |b| b.effects[PBEffects::MudSport] }
}
)
Battle::AI::Handlers::MoveEffectScore.add("StartWeakenElectricMoves",
@@ -521,11 +523,8 @@ Battle::AI::Handlers::MoveEffectScore.add("StartWeakenElectricMoves",
#===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("StartWeakenFireMoves",
proc { |move, user, ai, battle|
if Settings::MECHANICS_GENERATION >= 6
next true if battle.field.effects[PBEffects::WaterSportField] > 0
else
next true if battle.allBattlers.any? { |b| b.effects[PBEffects::WaterSport] }
end
next battle.field.effects[PBEffects::WaterSportField] > 0 if Settings::MECHANICS_GENERATION >= 6
next battle.allBattlers.any? { |b| b.effects[PBEffects::WaterSport] }
}
)
Battle::AI::Handlers::MoveEffectScore.add("StartWeakenFireMoves",
@@ -555,7 +554,7 @@ Battle::AI::Handlers::MoveEffectScore.add("StartWeakenFireMoves",
#===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("StartWeakenPhysicalDamageAgainstUserSide",
proc { |move, user, ai, battle|
next true if user.pbOwnSide.effects[PBEffects::Reflect] > 0
next user.pbOwnSide.effects[PBEffects::Reflect] > 0
}
)
Battle::AI::Handlers::MoveEffectScore.add("StartWeakenPhysicalDamageAgainstUserSide",
@@ -584,7 +583,7 @@ Battle::AI::Handlers::MoveEffectScore.add("StartWeakenPhysicalDamageAgainstUserS
#===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("StartWeakenSpecialDamageAgainstUserSide",
proc { |move, user, ai, battle|
next true if user.pbOwnSide.effects[PBEffects::LightScreen] > 0
next user.pbOwnSide.effects[PBEffects::LightScreen] > 0
}
)
Battle::AI::Handlers::MoveEffectScore.add("StartWeakenSpecialDamageAgainstUserSide",
@@ -615,6 +614,7 @@ Battle::AI::Handlers::MoveFailureCheck.add("StartWeakenDamageAgainstUserSideIfHa
proc { |move, user, ai, battle|
next true if user.pbOwnSide.effects[PBEffects::AuroraVeil] > 0
next true if user.battler.effectiveWeather != :Hail
next false
}
)
Battle::AI::Handlers::MoveEffectScore.add("StartWeakenDamageAgainstUserSideIfHail",
@@ -764,7 +764,7 @@ Battle::AI::Handlers::MoveEffectScore.add("ProtectUserFromTargetingMovesSpikyShi
#===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("ProtectUserSideFromDamagingMovesIfUserFirstTurn",
proc { |move, user, ai, battle|
next true if user.turnCount > 0
next user.turnCount > 0
}
)
Battle::AI::Handlers::MoveEffectScore.add("ProtectUserSideFromDamagingMovesIfUserFirstTurn",
@@ -778,7 +778,7 @@ Battle::AI::Handlers::MoveEffectScore.add("ProtectUserSideFromDamagingMovesIfUse
#===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("ProtectUserSideFromStatusMoves",
proc { |move, user, ai, battle|
next true if user.pbOwnSide.effects[PBEffects::CraftyShield]
next user.pbOwnSide.effects[PBEffects::CraftyShield]
}
)
@@ -809,13 +809,12 @@ Battle::AI::Handlers::MoveFailureCheck.add("ProtectUserSideFromStatusMoves",
#===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("HoopaRemoveProtectionsBypassSubstituteLowerUserDef1",
proc { |move, user, ai, battle|
next true if !user.battler.isSpecies?(:HOOPA) || user.battler.form != 1
next !user.battler.isSpecies?(:HOOPA) || user.battler.form != 1
}
)
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("HoopaRemoveProtectionsBypassSubstituteLowerUserDef1",
proc { |score, move, user, target, ai, battle|
score = ai.get_score_for_target_stat_drop(score, user, move.move.statDown, false)
next score
next ai.get_score_for_target_stat_drop(score, user, move.move.statDown, false)
}
)
@@ -942,7 +941,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("PoisonTarget",
#===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("EnsureNextMoveAlwaysHits",
proc { |move, user, ai, battle|
next true if user.effects[PBEffects::LockOn] > 0
next user.effects[PBEffects::LockOn] > 0
}
)
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("EnsureNextMoveAlwaysHits",
@@ -1037,6 +1036,7 @@ Battle::AI::Handlers::MoveFailureCheck.add("TypeAndPowerDependOnUserBerry",
item = user.item
next true if !item || !item.is_berry? || !user.item_active?
next true if item.flags.none? { |f| f[/^NaturalGift_/i] }
next false
}
)
Battle::AI::Handlers::MoveBasePower.add("TypeAndPowerDependOnUserBerry",
@@ -1066,7 +1066,7 @@ Battle::AI::Handlers::MoveBasePower.add("TypeAndPowerDependOnUserBerry",
#===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("TypeDependsOnUserMorpekoFormRaiseUserSpeed1",
proc { |move, user, ai, battle|
next true if !user.battler.isSpecies?(:MORPEKO) && user.effects[PBEffects::TransformSpecies] != :MORPEKO
next !user.battler.isSpecies?(:MORPEKO) && user.effects[PBEffects::TransformSpecies] != :MORPEKO
}
)
Battle::AI::Handlers::MoveEffectScore.copy("RaiseUserSpeed1",
@@ -1093,6 +1093,7 @@ Battle::AI::Handlers::MoveBasePower.copy("TypeAndPowerDependOnWeather",
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("TargetMovesBecomeElectric",
proc { |score, move, user, target, ai, battle|
next Battle::AI::MOVE_USELESS_SCORE if !user.faster_than?(target)
next score
}
)

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

View File

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

View File

@@ -11,6 +11,7 @@ Battle::AI::Handlers::MoveEffectScore.add("RedirectAllMovesToUser",
score += 10 if b.hp <= b.totalhp / 3
end
end
next score
}
)
@@ -55,7 +56,7 @@ Battle::AI::Handlers::MoveEffectScore.add("RandomlyDamageOrHealTarget",
#===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("HealAllyOrDamageFoe",
proc { |move, user, target, ai, battle|
next true if !target.opposes?(user) && target.battler.canHeal?
next !target.opposes?(user) && target.battler.canHeal?
}
)
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("HealAllyOrDamageFoe",
@@ -131,9 +132,42 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("CurseTargetOrLowerUserSp
)
#===============================================================================
# TODO: Review score modifiers.
#
#===============================================================================
# EffectDependsOnEnvironment
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("EffectDependsOnEnvironment",
proc { |score, move, user, target, ai, battle|
# Determine this move's effect
move.move.pbOnStartUse(user.battler, [target.battler])
function_code = nil
case move.move.secretPower
when 2
function_code = "SleepTarget"
when 10
function_code = "BurnTarget"
when 0, 1
function_code = "ParalyzeTarget"
when 9
function_code = "FreezeTarget"
when 5
function_code = "LowerTargetAttack1"
when 14
function_code = "LowerTargetDefense1"
when 3
function_code = "LowerTargetSpAtk1"
when 4, 6, 12
function_code = "LowerTargetSpeed1"
when 8
function_code = "LowerTargetAccuracy1"
when 7, 11, 13
function_code = "FlinchTarget"
end
if function_code
next Battle::AI::Handlers.apply_move_effect_against_target_score(function_code,
score, move, user, target, ai, battle)
end
next score
}
)
#===============================================================================
#
@@ -149,7 +183,7 @@ Battle::AI::Handlers::MoveBasePower.add("HitsAllFoesAndPowersUpInPsychicTerrain"
#===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("TargetNextFireMoveDamagesTarget",
proc { |move, user, target, ai, battle|
next true if target.effects[PBEffects::Powder]
next target.effects[PBEffects::Powder]
}
)
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("TargetNextFireMoveDamagesTarget",
@@ -192,17 +226,17 @@ Battle::AI::Handlers::MoveEffectScore.add("DoublePowerAfterFusionBolt",
)
#===============================================================================
# TODO: Review score modifiers.
#
#===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("PowerUpAllyMove",
proc { |move, user, target, ai, battle|
next true if target.fainted? || target.effects[PBEffects::HelpingHand]
next target.effects[PBEffects::HelpingHand]
}
)
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("PowerUpAllyMove",
proc { |score, move, user, target, ai, battle|
next Battle::AI::MOVE_USELESS_SCORE if !target.check_for_move { |m| m.damagingMove? }
next score + 8
next score + 4
}
)
@@ -274,7 +308,7 @@ Battle::AI::Handlers::MoveEffectScore.add("CounterDamagePlusHalf",
#===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("UserAddStockpileRaiseDefSpDef1",
proc { |move, user, ai, battle|
next true if user.effects[PBEffects::Stockpile] >= 3
next user.effects[PBEffects::Stockpile] >= 3
}
)
Battle::AI::Handlers::MoveEffectScore.add("UserAddStockpileRaiseDefSpDef1",
@@ -295,7 +329,7 @@ Battle::AI::Handlers::MoveEffectScore.add("UserAddStockpileRaiseDefSpDef1",
#===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("PowerDependsOnUserStockpile",
proc { |move, user, ai, battle|
next true if user.effects[PBEffects::Stockpile] == 0
next user.effects[PBEffects::Stockpile] == 0
}
)
Battle::AI::Handlers::MoveBasePower.add("PowerDependsOnUserStockpile",
@@ -321,6 +355,7 @@ Battle::AI::Handlers::MoveFailureCheck.add("HealUserDependingOnUserStockpile",
next true if !user.battler.canHeal? &&
user.effects[PBEffects::StockpileDef] == 0 &&
user.effects[PBEffects::StockpileSpDef] == 0
next false
}
)
Battle::AI::Handlers::MoveEffectScore.add("HealUserDependingOnUserStockpile",
@@ -378,27 +413,28 @@ Battle::AI::Handlers::MoveEffectScore.add("WaterPledge",
)
#===============================================================================
# TODO: Review score modifiers.
# NOTE: The move that this move will become is determined in def
# set_up_move_check, and the score for that move is calculated instead. If
# this move cannot become another move and will fail, the score for this
# move is calculated as normal (and the code below says it fails).
#===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("UseLastMoveUsed",
proc { |move, user, ai, battle|
next true if !battle.lastMoveUsed
next true if move.move.moveBlacklist.include?(GameData::Move.get(battle.lastMoveUsed).function_code)
next move.move.moveBlacklist.include?(GameData::Move.get(battle.lastMoveUsed).function_code)
}
)
#===============================================================================
# TODO: Review score modifiers.
# NOTE: The move that this move will become is determined in def
# set_up_move_check, and the score for that move is calculated instead. If
# this move cannot become another move and will fail, the score for this
# move is calculated as normal (and the code below says it fails).
#===============================================================================
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("UseLastMoveUsedByTarget",
proc { |move, user, target, ai, battle|
next true if !target.battler.lastRegularMoveUsed
next true if GameData::Move.get(target.battler.lastRegularMoveUsed).flags.none? { |f| f[/^CanMirrorMove$/i] }
}
)
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("UseLastMoveUsedByTarget",
proc { |score, move, user, target, ai, battle|
next Battle::AI::MOVE_USELESS_SCORE
next GameData::Move.get(target.battler.lastRegularMoveUsed).flags.none? { |f| f[/^CanMirrorMove$/i] }
}
)
@@ -408,7 +444,8 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("UseLastMoveUsedByTarget"
# UseMoveTargetIsAboutToUse
#===============================================================================
# TODO: Review score modifiers.
# NOTE: The move that this move will become is determined in def
# set_up_move_check, and the score for that move is calculated instead.
#===============================================================================
# UseMoveDependingOnEnvironment
@@ -479,6 +516,7 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("ReplaceMoveThisBattleWi
move.move.moveBlacklist.include?(last_move_data.function_code) ||
last_move_data.type == :SHADOW
end
next false
}
)
Battle::AI::Handlers::MoveEffectScore.add("ReplaceMoveThisBattleWithTargetLastMoveUsed",

View File

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

View File

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