mirror of
https://github.com/infinitefusion/infinitefusion-e18.git
synced 2025-12-08 13:44:59 +00:00
Rewrote AI calculations for remaining healing move effects
This commit is contained in:
@@ -243,21 +243,23 @@ Battle::AI::Handlers::MoveEffectScore.add("HealUserByThreeQuartersOfDamageDone",
|
|||||||
)
|
)
|
||||||
|
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
# TODO: Review score modifiers.
|
#
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
Battle::AI::Handlers::MoveFailureCheck.add("HealUserAndAlliesQuarterOfTotalHP",
|
Battle::AI::Handlers::MoveFailureCheck.add("HealUserAndAlliesQuarterOfTotalHP",
|
||||||
proc { |move, user, target, ai, battle|
|
proc { |move, user, target, ai, battle|
|
||||||
next true if battle.allSameSideBattlers(user.battler).none? { |b| b.canHeal? }
|
valid_targets = battle.allSameSideBattlers(user.battler) { |b| b.canHeal? }
|
||||||
|
next true if valid_targets.empty?
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
Battle::AI::Handlers::MoveEffectScore.add("HealUserAndAlliesQuarterOfTotalHP",
|
Battle::AI::Handlers::MoveEffectScore.add("HealUserAndAlliesQuarterOfTotalHP",
|
||||||
proc { |score, move, user, target, ai, battle|
|
proc { |score, move, user, target, ai, battle|
|
||||||
ally_amt = 30
|
|
||||||
battle.allSameSideBattlers(user.index).each do |b|
|
battle.allSameSideBattlers(user.index).each do |b|
|
||||||
if b.hp == b.totalhp || (ai.trainer.medium_skill? && !b.canHeal?)
|
next if !b.canHeal?
|
||||||
score -= ally_amt / 2
|
# Consider how much HP will be restored
|
||||||
elsif b.hp < b.totalhp * 3 / 4
|
if b.hp >= b.totalhp * 0.75
|
||||||
score += ally_amt
|
score -= 5
|
||||||
|
else
|
||||||
|
score += 15 * (b.totalhp - b.hp) / b.totalhp
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
next score
|
next score
|
||||||
@@ -265,30 +267,33 @@ Battle::AI::Handlers::MoveEffectScore.add("HealUserAndAlliesQuarterOfTotalHP",
|
|||||||
)
|
)
|
||||||
|
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
# TODO: Review score modifiers.
|
#
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
Battle::AI::Handlers::MoveFailureCheck.add("HealUserAndAlliesQuarterOfTotalHPCureStatus",
|
Battle::AI::Handlers::MoveFailureCheck.add("HealUserAndAlliesQuarterOfTotalHPCureStatus",
|
||||||
proc { |move, user, target, ai, battle|
|
proc { |move, user, target, ai, battle|
|
||||||
next true if battle.allSameSideBattlers(user.battler).none? { |b| b.canHeal? || b.status != :NONE }
|
valid_targets = battle.allSameSideBattlers(user.battler) { |b| b.canHeal? || b.status != :NONE }
|
||||||
|
next true if valid_targets.empty?
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
Battle::AI::Handlers::MoveEffectScore.add("HealUserAndAlliesQuarterOfTotalHPCureStatus",
|
Battle::AI::Handlers::MoveEffectScore.add("HealUserAndAlliesQuarterOfTotalHPCureStatus",
|
||||||
proc { |score, move, user, target, ai, battle|
|
proc { |score, move, user, target, ai, battle|
|
||||||
ally_amt = 80 / battle.pbSideSize(user.index)
|
|
||||||
battle.allSameSideBattlers(user.index).each do |b|
|
battle.allSameSideBattlers(user.index).each do |b|
|
||||||
if b.hp == b.totalhp || (ai.trainer.medium_skill? && !b.canHeal?)
|
next if !b.canHeal? && b.status == :NONE
|
||||||
score -= ally_amt
|
# Consider how much HP will be restored
|
||||||
elsif b.hp < b.totalhp * 3 / 4
|
if b.hp >= b.totalhp * 0.75
|
||||||
score += ally_amt
|
score -= 5
|
||||||
|
else
|
||||||
|
score += 15 * (b.totalhp - b.hp) / b.totalhp
|
||||||
end
|
end
|
||||||
score += ally_amt / 2 if b.pbHasAnyStatus?
|
# Check whether an existing status problem will be removed
|
||||||
|
score += 10 if user.status != :NONE
|
||||||
end
|
end
|
||||||
next score
|
next score
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
# TODO: Review score modifiers.
|
#
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
Battle::AI::Handlers::MoveFailureCheck.add("HealTargetHalfOfTotalHP",
|
Battle::AI::Handlers::MoveFailureCheck.add("HealTargetHalfOfTotalHP",
|
||||||
proc { |move, user, target, ai, battle|
|
proc { |move, user, target, ai, battle|
|
||||||
@@ -297,61 +302,97 @@ Battle::AI::Handlers::MoveFailureCheck.add("HealTargetHalfOfTotalHP",
|
|||||||
)
|
)
|
||||||
Battle::AI::Handlers::MoveEffectScore.add("HealTargetHalfOfTotalHP",
|
Battle::AI::Handlers::MoveEffectScore.add("HealTargetHalfOfTotalHP",
|
||||||
proc { |score, move, user, target, ai, battle|
|
proc { |score, move, user, target, ai, battle|
|
||||||
next 0 if user.opposes?(target)
|
next score - 40 if user.opposes?(target)
|
||||||
if target.hp < target.totalhp / 2 && target.effects[PBEffects::Substitute] == 0
|
# Consider how much HP will be restored
|
||||||
score += 20
|
heal_amt = target.totalhp / 2
|
||||||
|
heal_amt = target.totalhp * 0.75 if move.move.pulseMove? &&
|
||||||
|
user.has_active_ability?(:MEGALAUNCHER)
|
||||||
|
if target.hp >= target.totalhp * 0.5
|
||||||
|
score -= 10
|
||||||
|
else
|
||||||
|
heal_fraction = [target.totalhp - target.hp, heal_amt].min.to_f / target.totalhp
|
||||||
|
score += 40 * heal_fraction * (target.totalhp - target.hp) / target.totalhp
|
||||||
end
|
end
|
||||||
next score
|
next score
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
# TODO: Review score modifiers.
|
#
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
Battle::AI::Handlers::MoveFailureCheck.copy("HealTargetHalfOfTotalHP",
|
Battle::AI::Handlers::MoveFailureCheck.copy("HealTargetHalfOfTotalHP",
|
||||||
"HealTargetDependingOnGrassyTerrain")
|
"HealTargetDependingOnGrassyTerrain")
|
||||||
Battle::AI::Handlers::MoveEffectScore.add("HealTargetDependingOnGrassyTerrain",
|
Battle::AI::Handlers::MoveEffectScore.add("HealTargetDependingOnGrassyTerrain",
|
||||||
proc { |score, move, user, target, ai, battle|
|
proc { |score, move, user, target, ai, battle|
|
||||||
next 0 if user.hp == user.totalhp ||
|
next score - 40 if user.opposes?(target)
|
||||||
(ai.trainer.medium_skill? && !user.battler.canHeal?)
|
# Consider how much HP will be restored
|
||||||
score += 50
|
heal_amt = target.totalhp / 2
|
||||||
score -= user.hp * 100 / user.totalhp
|
heal_amt = (target.totalhp * 2 / 3.0).round if battle.field.terrain == :Grassy
|
||||||
if ai.trainer.medium_skill?
|
if target.hp >= target.totalhp * 0.5
|
||||||
score += 30 if battle.field.terrain == :Grassy
|
score -= 10
|
||||||
|
else
|
||||||
|
heal_fraction = [target.totalhp - target.hp, heal_amt].min.to_f / target.totalhp
|
||||||
|
score += 40 * heal_fraction * (target.totalhp - target.hp) / target.totalhp
|
||||||
end
|
end
|
||||||
next score
|
next score
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
# TODO: Review score modifiers.
|
#
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
Battle::AI::Handlers::MoveFailureCheck.add("HealUserPositionNextTurn",
|
Battle::AI::Handlers::MoveFailureCheck.add("HealUserPositionNextTurn",
|
||||||
proc { |move, user, target, ai, battle|
|
proc { |move, user, target, ai, battle|
|
||||||
next true if battle.positions[user.index].effects[PBEffects::Wish] > 0
|
next true if battle.positions[user.index].effects[PBEffects::Wish] > 0
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
Battle::AI::Handlers::MoveEffectScore.add("HealUserPositionNextTurn",
|
||||||
|
proc { |score, move, user, target, ai, battle|
|
||||||
|
# Consider how much HP will be restored
|
||||||
|
if user.hp >= user.totalhp * 0.5
|
||||||
|
score -= 10
|
||||||
|
else
|
||||||
|
score += 15 * (user.totalhp - user.hp) / user.totalhp
|
||||||
|
end
|
||||||
|
next score
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
# TODO: Review score modifiers.
|
#
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
Battle::AI::Handlers::MoveFailureCheck.add("StartHealUserEachTurn",
|
Battle::AI::Handlers::MoveFailureCheck.add("StartHealUserEachTurn",
|
||||||
proc { |move, user, target, ai, battle|
|
proc { |move, user, target, ai, battle|
|
||||||
next true if user.effects[PBEffects::AquaRing]
|
next true if user.effects[PBEffects::AquaRing]
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
Battle::AI::Handlers::MoveEffectScore.add("StartHealUserEachTurn",
|
||||||
|
proc { |score, move, user, target, ai, battle|
|
||||||
|
score += 10
|
||||||
|
score += 10 if user.has_active_item?(:BIGROOT)
|
||||||
|
next score
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
# TODO: Review score modifiers.
|
#
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
Battle::AI::Handlers::MoveFailureCheck.add("StartHealUserEachTurnTrapUserInBattle",
|
Battle::AI::Handlers::MoveFailureCheck.add("StartHealUserEachTurnTrapUserInBattle",
|
||||||
proc { |move, user, target, ai, battle|
|
proc { |move, user, target, ai, battle|
|
||||||
next true if user.effects[PBEffects::Ingrain]
|
next true if user.effects[PBEffects::Ingrain]
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
Battle::AI::Handlers::MoveEffectScore.add("StartHealUserEachTurnTrapUserInBattle",
|
||||||
|
proc { |score, move, user, target, ai, battle|
|
||||||
|
score += 5
|
||||||
|
score += 10 if user.turnCount < 2
|
||||||
|
score += 10 if user.has_active_item?(:BIGROOT)
|
||||||
|
next score
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
# TODO: Review score modifiers.
|
#
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
Battle::AI::Handlers::MoveFailureCheck.add("StartDamageTargetEachTurnIfTargetAsleep",
|
Battle::AI::Handlers::MoveFailureCheck.add("StartDamageTargetEachTurnIfTargetAsleep",
|
||||||
proc { |move, user, target, ai, battle|
|
proc { |move, user, target, ai, battle|
|
||||||
@@ -360,18 +401,13 @@ Battle::AI::Handlers::MoveFailureCheck.add("StartDamageTargetEachTurnIfTargetAsl
|
|||||||
)
|
)
|
||||||
Battle::AI::Handlers::MoveEffectScore.add("StartDamageTargetEachTurnIfTargetAsleep",
|
Battle::AI::Handlers::MoveEffectScore.add("StartDamageTargetEachTurnIfTargetAsleep",
|
||||||
proc { |score, move, user, target, ai, battle|
|
proc { |score, move, user, target, ai, battle|
|
||||||
if target.effects[PBEffects::Substitute] > 0
|
next score - 40 if target.statusCount <= 1
|
||||||
score -= 90
|
next score + 10 * target.statusCount
|
||||||
else
|
|
||||||
score -= 90 if target.statusCount <= 1
|
|
||||||
score += 50 if target.statusCount > 3
|
|
||||||
end
|
|
||||||
next score
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
# TODO: Review score modifiers.
|
#
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
Battle::AI::Handlers::MoveFailureCheck.add("StartLeechSeedTarget",
|
Battle::AI::Handlers::MoveFailureCheck.add("StartLeechSeedTarget",
|
||||||
proc { |move, user, target, ai, battle|
|
proc { |move, user, target, ai, battle|
|
||||||
@@ -381,12 +417,20 @@ Battle::AI::Handlers::MoveFailureCheck.add("StartLeechSeedTarget",
|
|||||||
)
|
)
|
||||||
Battle::AI::Handlers::MoveEffectScore.add("StartLeechSeedTarget",
|
Battle::AI::Handlers::MoveEffectScore.add("StartLeechSeedTarget",
|
||||||
proc { |score, move, user, target, ai, battle|
|
proc { |score, move, user, target, ai, battle|
|
||||||
if target.effects[PBEffects::LeechSeed] >= 0
|
score += 10 if user.turnCount < 2
|
||||||
score -= 90
|
if ai.trainer.medium_skill?
|
||||||
elsif target.has_type?(:GRASS)
|
if !user.check_for_move { |move| move.damagingMove? }
|
||||||
score -= 90
|
score += 20
|
||||||
elsif user.turnCount == 0
|
end
|
||||||
score += 60
|
score -= 20 if target.has_active_ability?([:LIQUIDOOZE]) || !target.takesIndirectDamage?
|
||||||
|
end
|
||||||
|
if ai.trainer.high_skill?
|
||||||
|
if user.check_for_move { |move| move.is_a?(Battle::Move::ProtectMove) }
|
||||||
|
score += 15
|
||||||
|
end
|
||||||
|
if target.check_for_move { |move| move.is_a?(Battle::Move::RemoveUserBindingAndEntryHazards) }
|
||||||
|
score -= 15
|
||||||
|
end
|
||||||
end
|
end
|
||||||
next score
|
next score
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user