mirror of
https://github.com/infinitefusion/infinitefusion-e18.git
synced 2025-12-08 13:44:59 +00:00
AI function code rewrites for protection moves
This commit is contained in:
@@ -711,108 +711,253 @@ Battle::AI::Handlers::MoveEffectScore.add("RemoveScreens",
|
|||||||
)
|
)
|
||||||
|
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
# TODO: Review score modifiers.
|
#
|
||||||
# TODO: This code shouldn't make use of target.
|
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
Battle::AI::Handlers::MoveEffectScore.add("ProtectUser",
|
Battle::AI::Handlers::MoveEffectScore.add("ProtectUser",
|
||||||
proc { |score, move, user, ai, battle|
|
proc { |score, move, user, ai, battle|
|
||||||
score += 12 if user.turnCount == 0
|
# Useless if the success chance is 25% or lower
|
||||||
# Prefer for each foe that can attack
|
next Battle::AI::MOVE_USELESS_SCORE if user.effects[PBEffects::ProtectRate] >= 4
|
||||||
|
# Score changes for each foe
|
||||||
useless = true
|
useless = true
|
||||||
ai.each_foe_battler(user.side) do |b, i|
|
ai.each_foe_battler(user.side) do |b, i|
|
||||||
next if !b.can_attack?
|
next if !b.can_attack?
|
||||||
|
next if !b.check_for_move { |m| m.canProtectAgainst? }
|
||||||
|
# TODO: Include b's Unseen Fist somehow? We don't know which move b will
|
||||||
|
# be using, so we don't know if Unseen Fist will apply.
|
||||||
useless = false
|
useless = false
|
||||||
|
# General preference
|
||||||
score += 4
|
score += 4
|
||||||
score += 4 if b.effects[PBEffects::TwoTurnAttack]
|
# Prefer if the foe is in the middle of using a two turn attack
|
||||||
|
score += 8 if b.effects[PBEffects::TwoTurnAttack] &&
|
||||||
|
GameData::Move.get(b.effects[PBEffects::TwoTurnAttack]).flags.any? { |f| f[/^CanProtect$/i] }
|
||||||
|
# Prefer if foe takes EOR damage, don't prefer if they have EOR healing
|
||||||
|
b_eor_damage = b.rough_end_of_round_damage
|
||||||
|
if b_eor_damage > 0
|
||||||
|
score += 5
|
||||||
|
elsif b_eor_damage < 0
|
||||||
|
score -= 5
|
||||||
|
end
|
||||||
end
|
end
|
||||||
next Battle::AI::MOVE_USELESS_SCORE if useless
|
next Battle::AI::MOVE_USELESS_SCORE if useless
|
||||||
|
# Prefer if the user has EOR healing, don't prefer if they take EOR damage
|
||||||
|
user_eor_damage = user.rough_end_of_round_damage
|
||||||
|
if user_eor_damage >= user.hp
|
||||||
|
next Battle::AI::MOVE_USELESS_SCORE
|
||||||
|
elsif user_eor_damage > 0
|
||||||
|
score -= 5
|
||||||
|
elsif user_eor_damage < 0
|
||||||
|
score += 5
|
||||||
|
end
|
||||||
# Don't prefer if the user used a protection move last turn, making this one
|
# Don't prefer if the user used a protection move last turn, making this one
|
||||||
# less likely to work
|
# less likely to work
|
||||||
score -= (user.effects[PBEffects::ProtectRate] - 1) * 8
|
score -= (user.effects[PBEffects::ProtectRate] - 1) * (Settings::MECHANICS_GENERATION >= 6) ? 12 : 8
|
||||||
next score
|
next score
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
# TODO: Review score modifiers.
|
#
|
||||||
# TODO: This code shouldn't make use of target.
|
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
Battle::AI::Handlers::MoveEffectScore.add("ProtectUserBanefulBunker",
|
Battle::AI::Handlers::MoveEffectScore.add("ProtectUserBanefulBunker",
|
||||||
proc { |score, move, user, ai, battle|
|
proc { |score, move, user, ai, battle|
|
||||||
next Battle::AI::MOVE_USELESS_SCORE if user.effects[PBEffects::ProtectRate] > 1 # ||
|
# Useless if the success chance is 25% or lower
|
||||||
# target.effects[PBEffects::HyperBeam] > 0
|
next Battle::AI::MOVE_USELESS_SCORE if user.effects[PBEffects::ProtectRate] >= 4
|
||||||
if ai.trainer.medium_skill?
|
# Score changes for each foe
|
||||||
score -= user.effects[PBEffects::ProtectRate] * 40
|
useless = true
|
||||||
|
ai.each_foe_battler(user.side) do |b, i|
|
||||||
|
next if !b.can_attack?
|
||||||
|
next if !b.check_for_move { |m| m.canProtectAgainst? }
|
||||||
|
# TODO: Include b's Unseen Fist somehow? We don't know which move b will
|
||||||
|
# be using, so we don't know if Unseen Fist will apply.
|
||||||
|
useless = false
|
||||||
|
# General preference
|
||||||
|
score += 4
|
||||||
|
# Prefer if the foe is likely to be poisoned by this move
|
||||||
|
if b.check_for_move { |m| m.contactMove? }
|
||||||
|
poison_score = Battle::AI::Handlers.apply_move_effect_against_target_score("PoisonTarget",
|
||||||
|
0, move, user, b, ai, battle)
|
||||||
|
score += poison_score / 2 # Halved because we don't know what move b will use
|
||||||
|
end
|
||||||
|
# Prefer if the foe is in the middle of using a two turn attack
|
||||||
|
score += 8 if b.effects[PBEffects::TwoTurnAttack] &&
|
||||||
|
GameData::Move.get(b.effects[PBEffects::TwoTurnAttack]).flags.any? { |f| f[/^CanProtect$/i] }
|
||||||
|
# Prefer if foe takes EOR damage, don't prefer if they have EOR healing
|
||||||
|
b_eor_damage = b.rough_end_of_round_damage
|
||||||
|
if b_eor_damage > 0
|
||||||
|
score += 5
|
||||||
|
elsif b_eor_damage < 0
|
||||||
|
score -= 5
|
||||||
|
end
|
||||||
end
|
end
|
||||||
score += 10 if user.turnCount == 0
|
next Battle::AI::MOVE_USELESS_SCORE if useless
|
||||||
# score += 15 if target.effects[PBEffects::TwoTurnAttack]
|
# Prefer if the user has EOR healing, don't prefer if they take EOR damage
|
||||||
score += 15 # Because of possible poisoning
|
user_eor_damage = user.rough_end_of_round_damage
|
||||||
|
if user_eor_damage >= user.hp
|
||||||
|
next Battle::AI::MOVE_USELESS_SCORE
|
||||||
|
elsif user_eor_damage > 0
|
||||||
|
score -= 5
|
||||||
|
elsif user_eor_damage < 0
|
||||||
|
score += 5
|
||||||
|
end
|
||||||
|
# Don't prefer if the user used a protection move last turn, making this one
|
||||||
|
# less likely to work
|
||||||
|
score -= (user.effects[PBEffects::ProtectRate] - 1) * (Settings::MECHANICS_GENERATION >= 6) ? 12 : 8
|
||||||
next score
|
next score
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
# TODO: Review score modifiers.
|
# TODO: Special scoring for Aegislash.
|
||||||
# TODO: This code shouldn't make use of target.
|
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
Battle::AI::Handlers::MoveEffectScore.add("ProtectUserFromDamagingMovesKingsShield",
|
Battle::AI::Handlers::MoveEffectScore.add("ProtectUserFromDamagingMovesKingsShield",
|
||||||
proc { |score, move, user, ai, battle|
|
proc { |score, move, user, ai, battle|
|
||||||
if user.effects[PBEffects::ProtectRate] > 1 # ||
|
# Useless if the success chance is 25% or lower
|
||||||
# target.effects[PBEffects::HyperBeam] > 0
|
next Battle::AI::MOVE_USELESS_SCORE if user.effects[PBEffects::ProtectRate] >= 4
|
||||||
score -= 50
|
# Score changes for each foe
|
||||||
else
|
useless = true
|
||||||
if ai.trainer.medium_skill?
|
ai.each_foe_battler(user.side) do |b, i|
|
||||||
score -= user.effects[PBEffects::ProtectRate] * 40
|
next if !b.can_attack?
|
||||||
|
next if !b.check_for_move { |m| m.damagingMove? && m.canProtectAgainst? }
|
||||||
|
# TODO: Include b's Unseen Fist somehow? We don't know which move b will
|
||||||
|
# be using, so we don't know if Unseen Fist will apply.
|
||||||
|
useless = false
|
||||||
|
# General preference
|
||||||
|
score += 4
|
||||||
|
# Prefer if the foe's Attack can be lowered by this move
|
||||||
|
if b.battler.affectedByContactEffect? && b.check_for_move { |m| m.contactMove? }
|
||||||
|
drop_score = ai.get_score_for_target_stat_drop(
|
||||||
|
0, b, [:ATTACK, (Settings::MECHANICS_GENERATION >= 8) ? 1 : 2], false)
|
||||||
|
score += drop_score / 2 # Halved because we don't know what move b will use
|
||||||
|
end
|
||||||
|
# Prefer if the foe is in the middle of using a two turn attack
|
||||||
|
score += 8 if b.effects[PBEffects::TwoTurnAttack] &&
|
||||||
|
GameData::Move.get(b.effects[PBEffects::TwoTurnAttack]).flags.any? { |f| f[/^CanProtect$/i] }
|
||||||
|
# Prefer if foe takes EOR damage, don't prefer if they have EOR healing
|
||||||
|
b_eor_damage = b.rough_end_of_round_damage
|
||||||
|
if b_eor_damage > 0
|
||||||
|
score += 5
|
||||||
|
elsif b_eor_damage < 0
|
||||||
|
score -= 5
|
||||||
end
|
end
|
||||||
score += 50 if user.turnCount == 0
|
|
||||||
# score += 30 if target.effects[PBEffects::TwoTurnAttack]
|
|
||||||
end
|
end
|
||||||
|
next Battle::AI::MOVE_USELESS_SCORE if useless
|
||||||
|
# Prefer if the user has EOR healing, don't prefer if they take EOR damage
|
||||||
|
user_eor_damage = user.rough_end_of_round_damage
|
||||||
|
if user_eor_damage >= user.hp
|
||||||
|
next Battle::AI::MOVE_USELESS_SCORE
|
||||||
|
elsif user_eor_damage > 0
|
||||||
|
score -= 5
|
||||||
|
elsif user_eor_damage < 0
|
||||||
|
score += 5
|
||||||
|
end
|
||||||
|
# Don't prefer if the user used a protection move last turn, making this one
|
||||||
|
# less likely to work
|
||||||
|
score -= (user.effects[PBEffects::ProtectRate] - 1) * (Settings::MECHANICS_GENERATION >= 6) ? 12 : 8
|
||||||
next score
|
next score
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
# TODO: Review score modifiers.
|
#
|
||||||
# TODO: This code shouldn't make use of target.
|
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
Battle::AI::Handlers::MoveEffectScore.add("ProtectUserFromDamagingMovesObstruct",
|
Battle::AI::Handlers::MoveEffectScore.add("ProtectUserFromDamagingMovesObstruct",
|
||||||
proc { |score, move, user, ai, battle|
|
proc { |score, move, user, ai, battle|
|
||||||
if user.effects[PBEffects::ProtectRate] > 1 # ||
|
# Useless if the success chance is 25% or lower
|
||||||
# target.effects[PBEffects::HyperBeam] > 0
|
next Battle::AI::MOVE_USELESS_SCORE if user.effects[PBEffects::ProtectRate] >= 4
|
||||||
score -= 50
|
# Score changes for each foe
|
||||||
else
|
useless = true
|
||||||
if ai.trainer.medium_skill?
|
ai.each_foe_battler(user.side) do |b, i|
|
||||||
score -= user.effects[PBEffects::ProtectRate] * 40
|
next if !b.can_attack?
|
||||||
|
next if !b.check_for_move { |m| m.damagingMove? && m.canProtectAgainst? }
|
||||||
|
# TODO: Include b's Unseen Fist somehow? We don't know which move b will
|
||||||
|
# be using, so we don't know if Unseen Fist will apply.
|
||||||
|
useless = false
|
||||||
|
# General preference
|
||||||
|
score += 4
|
||||||
|
# Prefer if the foe's Attack can be lowered by this move
|
||||||
|
if b.battler.affectedByContactEffect? && b.check_for_move { |m| m.contactMove? }
|
||||||
|
drop_score = ai.get_score_for_target_stat_drop(0, b, [:DEFENSE, 2], false)
|
||||||
|
score += drop_score / 2 # Halved because we don't know what move b will use
|
||||||
|
end
|
||||||
|
# Prefer if the foe is in the middle of using a two turn attack
|
||||||
|
score += 8 if b.effects[PBEffects::TwoTurnAttack] &&
|
||||||
|
GameData::Move.get(b.effects[PBEffects::TwoTurnAttack]).flags.any? { |f| f[/^CanProtect$/i] }
|
||||||
|
# Prefer if foe takes EOR damage, don't prefer if they have EOR healing
|
||||||
|
b_eor_damage = b.rough_end_of_round_damage
|
||||||
|
if b_eor_damage > 0
|
||||||
|
score += 5
|
||||||
|
elsif b_eor_damage < 0
|
||||||
|
score -= 5
|
||||||
end
|
end
|
||||||
score += 50 if user.turnCount == 0
|
|
||||||
# score += 30 if target.effects[PBEffects::TwoTurnAttack]
|
|
||||||
end
|
end
|
||||||
|
next Battle::AI::MOVE_USELESS_SCORE if useless
|
||||||
|
# Prefer if the user has EOR healing, don't prefer if they take EOR damage
|
||||||
|
user_eor_damage = user.rough_end_of_round_damage
|
||||||
|
if user_eor_damage >= user.hp
|
||||||
|
next Battle::AI::MOVE_USELESS_SCORE
|
||||||
|
elsif user_eor_damage > 0
|
||||||
|
score -= 5
|
||||||
|
elsif user_eor_damage < 0
|
||||||
|
score += 5
|
||||||
|
end
|
||||||
|
# Don't prefer if the user used a protection move last turn, making this one
|
||||||
|
# less likely to work
|
||||||
|
score -= (user.effects[PBEffects::ProtectRate] - 1) * (Settings::MECHANICS_GENERATION >= 6) ? 12 : 8
|
||||||
next score
|
next score
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
# TODO: Review score modifiers.
|
#
|
||||||
# TODO: This code shouldn't make use of target.
|
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
Battle::AI::Handlers::MoveEffectScore.add("ProtectUserFromTargetingMovesSpikyShield",
|
Battle::AI::Handlers::MoveEffectScore.add("ProtectUserFromTargetingMovesSpikyShield",
|
||||||
proc { |score, move, user, ai, battle|
|
proc { |score, move, user, ai, battle|
|
||||||
if user.effects[PBEffects::ProtectRate] > 1 # ||
|
# Useless if the success chance is 25% or lower
|
||||||
# target.effects[PBEffects::HyperBeam] > 0
|
next Battle::AI::MOVE_USELESS_SCORE if user.effects[PBEffects::ProtectRate] >= 4
|
||||||
score -= 90
|
# Score changes for each foe
|
||||||
else
|
useless = true
|
||||||
if ai.trainer.medium_skill?
|
ai.each_foe_battler(user.side) do |b, i|
|
||||||
score -= user.effects[PBEffects::ProtectRate] * 40
|
next if !b.can_attack?
|
||||||
|
next if !b.check_for_move { |m| m.canProtectAgainst? }
|
||||||
|
# TODO: Include b's Unseen Fist somehow? We don't know which move b will
|
||||||
|
# be using, so we don't know if Unseen Fist will apply.
|
||||||
|
useless = false
|
||||||
|
# General preference
|
||||||
|
score += 4
|
||||||
|
# Prefer if this move will deal damage
|
||||||
|
if b.battler.affectedByContactEffect? && b.check_for_move { |m| m.contactMove? }
|
||||||
|
score += 5
|
||||||
|
end
|
||||||
|
# Prefer if the foe is in the middle of using a two turn attack
|
||||||
|
score += 8 if b.effects[PBEffects::TwoTurnAttack] &&
|
||||||
|
GameData::Move.get(b.effects[PBEffects::TwoTurnAttack]).flags.any? { |f| f[/^CanProtect$/i] }
|
||||||
|
# Prefer if foe takes EOR damage, don't prefer if they have EOR healing
|
||||||
|
b_eor_damage = b.rough_end_of_round_damage
|
||||||
|
if b_eor_damage > 0
|
||||||
|
score += 5
|
||||||
|
elsif b_eor_damage < 0
|
||||||
|
score -= 5
|
||||||
end
|
end
|
||||||
score += 50 if user.turnCount == 0
|
|
||||||
# score += 30 if target.effects[PBEffects::TwoTurnAttack]
|
|
||||||
end
|
end
|
||||||
|
next Battle::AI::MOVE_USELESS_SCORE if useless
|
||||||
|
# Prefer if the user has EOR healing, don't prefer if they take EOR damage
|
||||||
|
user_eor_damage = user.rough_end_of_round_damage
|
||||||
|
if user_eor_damage >= user.hp
|
||||||
|
next Battle::AI::MOVE_USELESS_SCORE
|
||||||
|
elsif user_eor_damage > 0
|
||||||
|
score -= 5
|
||||||
|
elsif user_eor_damage < 0
|
||||||
|
score += 5
|
||||||
|
end
|
||||||
|
# Don't prefer if the user used a protection move last turn, making this one
|
||||||
|
# less likely to work
|
||||||
|
score -= (user.effects[PBEffects::ProtectRate] - 1) * (Settings::MECHANICS_GENERATION >= 6) ? 12 : 8
|
||||||
next score
|
next score
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
# TODO: Review score modifiers.
|
#
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
Battle::AI::Handlers::MoveFailureCheck.add("ProtectUserSideFromDamagingMovesIfUserFirstTurn",
|
Battle::AI::Handlers::MoveFailureCheck.add("ProtectUserSideFromDamagingMovesIfUserFirstTurn",
|
||||||
proc { |move, user, ai, battle|
|
proc { |move, user, ai, battle|
|
||||||
@@ -821,30 +966,176 @@ Battle::AI::Handlers::MoveFailureCheck.add("ProtectUserSideFromDamagingMovesIfUs
|
|||||||
)
|
)
|
||||||
Battle::AI::Handlers::MoveEffectScore.add("ProtectUserSideFromDamagingMovesIfUserFirstTurn",
|
Battle::AI::Handlers::MoveEffectScore.add("ProtectUserSideFromDamagingMovesIfUserFirstTurn",
|
||||||
proc { |score, move, user, ai, battle|
|
proc { |score, move, user, ai, battle|
|
||||||
next score + 25 # Use it or lose it
|
# Score changes for each foe
|
||||||
|
useless = true
|
||||||
|
ai.each_foe_battler(user.side) do |b, i|
|
||||||
|
next if !b.can_attack?
|
||||||
|
next if !b.check_for_move { |m| m.damagingMove? && m.canProtectAgainst? }
|
||||||
|
# TODO: Include b's Unseen Fist somehow? We don't know which move b will
|
||||||
|
# be using, so we don't know if Unseen Fist will apply.
|
||||||
|
useless = false
|
||||||
|
# General preference
|
||||||
|
score += 4
|
||||||
|
# Prefer if the foe is in the middle of using a two turn attack
|
||||||
|
score += 8 if b.effects[PBEffects::TwoTurnAttack] &&
|
||||||
|
GameData::Move.get(b.effects[PBEffects::TwoTurnAttack]).flags.any? { |f| f[/^CanProtect$/i] }
|
||||||
|
# Prefer if foe takes EOR damage, don't prefer if they have EOR healing
|
||||||
|
b_eor_damage = b.rough_end_of_round_damage
|
||||||
|
if b_eor_damage > 0
|
||||||
|
score += 5
|
||||||
|
elsif b_eor_damage < 0
|
||||||
|
score -= 5
|
||||||
|
end
|
||||||
|
end
|
||||||
|
next Battle::AI::MOVE_USELESS_SCORE if useless
|
||||||
|
# Prefer if the user has EOR healing, don't prefer if they take EOR damage
|
||||||
|
user_eor_damage = user.rough_end_of_round_damage
|
||||||
|
if user_eor_damage >= user.hp
|
||||||
|
next Battle::AI::MOVE_USELESS_SCORE
|
||||||
|
elsif user_eor_damage > 0
|
||||||
|
score -= 5
|
||||||
|
elsif user_eor_damage < 0
|
||||||
|
score += 5
|
||||||
|
end
|
||||||
|
# Use it or lose it
|
||||||
|
score += 10
|
||||||
|
next score
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
# TODO: Review score modifiers.
|
#
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
Battle::AI::Handlers::MoveFailureCheck.add("ProtectUserSideFromStatusMoves",
|
Battle::AI::Handlers::MoveFailureCheck.add("ProtectUserSideFromStatusMoves",
|
||||||
proc { |move, user, ai, battle|
|
proc { |move, user, ai, battle|
|
||||||
next user.pbOwnSide.effects[PBEffects::CraftyShield]
|
next user.pbOwnSide.effects[PBEffects::CraftyShield]
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
Battle::AI::Handlers::MoveEffectScore.add("ProtectUserSideFromStatusMoves",
|
||||||
|
proc { |score, move, user, ai, battle|
|
||||||
|
# Score changes for each foe
|
||||||
|
useless = true
|
||||||
|
ai.each_foe_battler(user.side) do |b, i|
|
||||||
|
next if !b.can_attack?
|
||||||
|
next if !b.check_for_move { |m| m.statusMove? && m.pbTarget(b.battler).targets_foe &&
|
||||||
|
!m.pbTarget(b.battler).targets_all }
|
||||||
|
useless = false
|
||||||
|
# General preference
|
||||||
|
score += 4
|
||||||
|
# Prefer if foe takes EOR damage, don't prefer if they have EOR healing
|
||||||
|
b_eor_damage = b.rough_end_of_round_damage
|
||||||
|
if b_eor_damage > 0
|
||||||
|
score += 5
|
||||||
|
elsif b_eor_damage < 0
|
||||||
|
score -= 5
|
||||||
|
end
|
||||||
|
end
|
||||||
|
next Battle::AI::MOVE_USELESS_SCORE if useless
|
||||||
|
# Prefer if the user has EOR healing, don't prefer if they take EOR damage
|
||||||
|
user_eor_damage = user.rough_end_of_round_damage
|
||||||
|
if user_eor_damage >= user.hp
|
||||||
|
next Battle::AI::MOVE_USELESS_SCORE
|
||||||
|
elsif user_eor_damage > 0
|
||||||
|
score -= 5
|
||||||
|
elsif user_eor_damage < 0
|
||||||
|
score += 5
|
||||||
|
end
|
||||||
|
next score
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
# TODO: Review score modifiers.
|
#
|
||||||
# TODO: This code shouldn't make use of target.
|
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
# ProtectUserSideFromPriorityMoves
|
Battle::AI::Handlers::MoveFailureCheck.add("ProtectUserSideFromPriorityMoves",
|
||||||
|
proc { |move, user, ai, battle|
|
||||||
|
next user.pbOwnSide.effects[PBEffects::QuickGuard]
|
||||||
|
}
|
||||||
|
)
|
||||||
|
Battle::AI::Handlers::MoveEffectScore.add("ProtectUserSideFromPriorityMoves",
|
||||||
|
proc { |score, move, user, ai, battle|
|
||||||
|
# Useless if the success chance is 25% or lower
|
||||||
|
next Battle::AI::MOVE_USELESS_SCORE if user.effects[PBEffects::ProtectRate] >= 4
|
||||||
|
# Score changes for each foe
|
||||||
|
useless = true
|
||||||
|
ai.each_foe_battler(user.side) do |b, i|
|
||||||
|
next if !b.can_attack?
|
||||||
|
# TODO: There are more calculations that could be done to get a more
|
||||||
|
# accurate priority number.
|
||||||
|
next if !b.check_for_move { |m| m.priority > 0 && m.canProtectAgainst? }
|
||||||
|
useless = false
|
||||||
|
# General preference
|
||||||
|
score += 4
|
||||||
|
# Prefer if foe takes EOR damage, don't prefer if they have EOR healing
|
||||||
|
b_eor_damage = b.rough_end_of_round_damage
|
||||||
|
if b_eor_damage > 0
|
||||||
|
score += 5
|
||||||
|
elsif b_eor_damage < 0
|
||||||
|
score -= 5
|
||||||
|
end
|
||||||
|
end
|
||||||
|
next Battle::AI::MOVE_USELESS_SCORE if useless
|
||||||
|
# Prefer if the user has EOR healing, don't prefer if they take EOR damage
|
||||||
|
user_eor_damage = user.rough_end_of_round_damage
|
||||||
|
if user_eor_damage >= user.hp
|
||||||
|
next Battle::AI::MOVE_USELESS_SCORE
|
||||||
|
elsif user_eor_damage > 0
|
||||||
|
score -= 5
|
||||||
|
elsif user_eor_damage < 0
|
||||||
|
score += 5
|
||||||
|
end
|
||||||
|
# Don't prefer if the user used a protection move last turn, making this one
|
||||||
|
# less likely to work
|
||||||
|
score -= (user.effects[PBEffects::ProtectRate] - 1) * (Settings::MECHANICS_GENERATION >= 6) ? 12 : 8
|
||||||
|
next score
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
# TODO: Review score modifiers.
|
#
|
||||||
# TODO: This code shouldn't make use of target.
|
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
# ProtectUserSideFromMultiTargetDamagingMoves
|
Battle::AI::Handlers::MoveFailureCheck.add("ProtectUserSideFromMultiTargetDamagingMoves",
|
||||||
|
proc { |move, user, ai, battle|
|
||||||
|
next user.pbOwnSide.effects[PBEffects::WideGuard]
|
||||||
|
}
|
||||||
|
)
|
||||||
|
Battle::AI::Handlers::MoveEffectScore.add("ProtectUserSideFromMultiTargetDamagingMoves",
|
||||||
|
proc { |score, move, user, ai, battle|
|
||||||
|
# Useless if the success chance is 25% or lower
|
||||||
|
next Battle::AI::MOVE_USELESS_SCORE if user.effects[PBEffects::ProtectRate] >= 4
|
||||||
|
# Score changes for each foe
|
||||||
|
useless = true
|
||||||
|
ai.each_battler(user.side) do |b, i|
|
||||||
|
next if b.index == user.index || !b.can_attack?
|
||||||
|
next if !b.check_for_move { |m| (Settings::MECHANICS_GENERATION >= 7 || move.damagingMove?) &&
|
||||||
|
m.pbTarget(b.battler).num_targets > 1 }
|
||||||
|
useless = false
|
||||||
|
# General preference
|
||||||
|
score += 4
|
||||||
|
# Prefer if foe takes EOR damage, don't prefer if they have EOR healing
|
||||||
|
b_eor_damage = b.rough_end_of_round_damage
|
||||||
|
if b_eor_damage > 0
|
||||||
|
score += (b.opposes?(user)) ? 5 : -5
|
||||||
|
elsif b_eor_damage < 0
|
||||||
|
score -= (b.opposes?(user)) ? 5 : -5
|
||||||
|
end
|
||||||
|
end
|
||||||
|
next Battle::AI::MOVE_USELESS_SCORE if useless
|
||||||
|
# Prefer if the user has EOR healing, don't prefer if they take EOR damage
|
||||||
|
user_eor_damage = user.rough_end_of_round_damage
|
||||||
|
if user_eor_damage >= user.hp
|
||||||
|
next Battle::AI::MOVE_USELESS_SCORE
|
||||||
|
elsif user_eor_damage > 0
|
||||||
|
score -= 5
|
||||||
|
elsif user_eor_damage < 0
|
||||||
|
score += 5
|
||||||
|
end
|
||||||
|
# Don't prefer if the user used a protection move last turn, making this one
|
||||||
|
# less likely to work
|
||||||
|
score -= (user.effects[PBEffects::ProtectRate] - 1) * (Settings::MECHANICS_GENERATION >= 6) ? 12 : 8
|
||||||
|
next score
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
# TODO: Review score modifiers.
|
# TODO: Review score modifiers.
|
||||||
|
|||||||
@@ -287,11 +287,10 @@ class Battle::AI::AIBattler
|
|||||||
#=============================================================================
|
#=============================================================================
|
||||||
|
|
||||||
def can_attack?
|
def can_attack?
|
||||||
return false if self.effects[PBEffects::SkyDrop] >= 0
|
|
||||||
return false if self.effects[PBEffects::HyperBeam] > 0
|
return false if self.effects[PBEffects::HyperBeam] > 0
|
||||||
return false if status == :SLEEP && statusCount > 1
|
return false if status == :SLEEP && statusCount > 1
|
||||||
return false if status == :FROZEN # Only 20% chance of unthawing; assune it won't
|
return false if status == :FROZEN # Only 20% chance of unthawing; assune it won't
|
||||||
return false if self.effects[PBEffects::Truant]
|
return false if self.effects[PBEffects::Truant] && has_active_ability?(:TRUANT)
|
||||||
return false if self.effects[PBEffects::Flinch]
|
return false if self.effects[PBEffects::Flinch]
|
||||||
# NOTE: Confusion/infatuation/paralysis have higher chances of allowing the
|
# NOTE: Confusion/infatuation/paralysis have higher chances of allowing the
|
||||||
# attack, so the battler is treated as able to attack in those cases.
|
# attack, so the battler is treated as able to attack in those cases.
|
||||||
|
|||||||
Reference in New Issue
Block a user