mirror of
https://github.com/infinitefusion/infinitefusion-e18.git
synced 2025-12-07 13:15:01 +00:00
More AI function code rewrites, ensured all AI procs next an appropriate value
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
#===============================================================================
|
||||
Battle::AI::Handlers::MoveFailureCheck.add("RaiseUserAttack1",
|
||||
proc { |move, user, ai, battle|
|
||||
next true if move.statusMove? &&
|
||||
next move.statusMove? &&
|
||||
!user.battler.pbCanRaiseStatStage?(move.move.statUp[0], user.battler, move.move)
|
||||
}
|
||||
)
|
||||
@@ -30,6 +30,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("RaiseUserAttack2IfTarget
|
||||
if move.rough_damage >= target.hp * 0.9
|
||||
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,7 +330,7 @@ Battle::AI::Handlers::MoveEffectScore.add("RaiseUserCriticalHitRate2",
|
||||
#===============================================================================
|
||||
Battle::AI::Handlers::MoveFailureCheck.add("RaiseUserAtkDef1",
|
||||
proc { |move, user, ai, battle|
|
||||
if move.statusMove?
|
||||
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)
|
||||
@@ -337,7 +338,6 @@ Battle::AI::Handlers::MoveFailureCheck.add("RaiseUserAtkDef1",
|
||||
break
|
||||
end
|
||||
next will_fail
|
||||
end
|
||||
}
|
||||
)
|
||||
Battle::AI::Handlers::MoveEffectScore.copy("RaiseUserAttack1",
|
||||
@@ -621,7 +621,7 @@ Battle::AI::Handlers::MoveEffectScore.copy("LowerUserAttack1",
|
||||
#===============================================================================
|
||||
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("RaiseTargetAttack1",
|
||||
proc { |move, user, target, ai, battle|
|
||||
next true if move.statusMove? &&
|
||||
next move.statusMove? &&
|
||||
!target.battler.pbCanRaiseStatStage?(:ATTACK, user.battler, move.move)
|
||||
}
|
||||
)
|
||||
@@ -636,7 +636,7 @@ 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) &&
|
||||
next !target.battler.pbCanRaiseStatStage?(:ATTACK, user.battler, move.move) &&
|
||||
!target.battler.pbCanConfuse?(user.battler, false, move.move)
|
||||
}
|
||||
)
|
||||
@@ -658,7 +658,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("RaiseTargetAttack2Confus
|
||||
#===============================================================================
|
||||
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("RaiseTargetSpAtk1ConfuseTarget",
|
||||
proc { |move, user, target, ai, battle|
|
||||
next true if !target.battler.pbCanRaiseStatStage?(:SPECIAL_ATTACK, user.battler, move.move) &&
|
||||
next !target.battler.pbCanRaiseStatStage?(:SPECIAL_ATTACK, user.battler, move.move) &&
|
||||
!target.battler.pbCanConfuse?(user.battler, false, move.move)
|
||||
}
|
||||
)
|
||||
@@ -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,7 +732,7 @@ 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) &&
|
||||
next !target.battler.pbCanRaiseStatStage?(:ATTACK, user.battler, move.move) &&
|
||||
!target.battler.pbCanRaiseStatStage?(:SPECIAL_ATTACK, user.battler, move.move)
|
||||
}
|
||||
)
|
||||
@@ -748,7 +748,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("RaiseTargetAtkSpAtk2",
|
||||
#===============================================================================
|
||||
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("LowerTargetAttack1",
|
||||
proc { |move, user, target, ai, battle|
|
||||
next true if move.statusMove? &&
|
||||
next move.statusMove? &&
|
||||
!target.battler.pbCanLowerStatStage?(move.move.statDown[0], user.battler, move.move)
|
||||
}
|
||||
)
|
||||
@@ -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? &&
|
||||
next false if !target.effects[PBEffects::TarShot]
|
||||
next move.statusMove? &&
|
||||
!target.battler.pbCanLowerStatStage?(move.move.statDown[0], user.battler, move.move)
|
||||
end
|
||||
}
|
||||
)
|
||||
Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("LowerTargetSpeed1MakeTargetWeakerToFire",
|
||||
@@ -998,7 +998,7 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("LowerTargetEvasion1Remo
|
||||
target_opposing_side.effects[PBEffects::ToxicSpikes] > 0 ||
|
||||
target_opposing_side.effects[PBEffects::StickyWeb])
|
||||
next false if Settings::MECHANICS_GENERATION >= 8 && battle.field.terrain != :None
|
||||
next true if move.statusMove? &&
|
||||
next move.statusMove? &&
|
||||
!target.battler.pbCanLowerStatStage?(move.move.statDown[0], user.battler, move.move)
|
||||
}
|
||||
)
|
||||
@@ -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
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
@@ -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,7 +155,7 @@ 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) &&
|
||||
next !target.battler.pbCanPoison?(user.battler, false, move.move) &&
|
||||
!target.battler.pbCanLowerStatStage?(:SPEED, user.battler, move.move)
|
||||
}
|
||||
)
|
||||
@@ -181,7 +182,7 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.copy("PoisonTarget",
|
||||
#===============================================================================
|
||||
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("ParalyzeTarget",
|
||||
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",
|
||||
|
||||
@@ -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
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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 false if move.damagingMove?
|
||||
next true if target.effects[PBEffects::MeanLook] >= 0
|
||||
next true if Settings::MORE_TYPE_EFFECTS && target.has_type?(:GHOST)
|
||||
end
|
||||
next false
|
||||
}
|
||||
)
|
||||
|
||||
@@ -228,10 +228,10 @@ Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("TrapTargetInBattle",
|
||||
#===============================================================================
|
||||
Battle::AI::Handlers::MoveFailureAgainstTargetCheck.add("TrapTargetInBattleLowerTargetDefSpDef1EachTurn",
|
||||
proc { |move, user, target, ai, battle|
|
||||
if move.statusMove?
|
||||
next false if move.damagingMove?
|
||||
next true if target.effects[PBEffects::Octolock] >= 0
|
||||
next true if Settings::MORE_TYPE_EFFECTS && target.has_type?(:GHOST)
|
||||
end
|
||||
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]
|
||||
}
|
||||
)
|
||||
|
||||
@@ -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
|
||||
end
|
||||
end
|
||||
next score
|
||||
end
|
||||
end
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user