Renamed function code UseUserBaseDefenseInsteadOfUserBaseAttack, more AI function code changes

This commit is contained in:
Maruno17
2022-10-17 21:13:31 +01:00
parent e8703e8b05
commit 5a49bbbc94
11 changed files with 114 additions and 70 deletions

View File

@@ -809,6 +809,9 @@ module GameData
when "173" then new_code = "StartPsychicTerrain" when "173" then new_code = "StartPsychicTerrain"
when "174" then new_code = "FailsIfNotUserFirstTurn" when "174" then new_code = "FailsIfNotUserFirstTurn"
when "175" then new_code = "HitTwoTimesFlinchTarget" when "175" then new_code = "HitTwoTimesFlinchTarget"
#=========================================================================
# NOTE: The below was added in v21.
when "UseUserBaseDefenseInsteadOfUserBaseAttack" then new_code = "UseUserDefenseInsteadOfUserAttack"
end end
data[:function_code] = new_code data[:function_code] = new_code
return data return data

View File

@@ -408,7 +408,7 @@ end
# Recoil move. # Recoil move.
#=============================================================================== #===============================================================================
class Battle::Move::RecoilMove < Battle::Move class Battle::Move::RecoilMove < Battle::Move
def recoilMove?; return true; end def recoilMove?; return true; end
def pbRecoilDamage(user, target); return 1; end def pbRecoilDamage(user, target); return 1; end
def pbEffectAfterAllHits(user, target) def pbEffectAfterAllHits(user, target)

View File

@@ -1199,9 +1199,8 @@ end
# user's Attack (and Attack stat stages) to calculate damage. All other effects # user's Attack (and Attack stat stages) to calculate damage. All other effects
# are applied normally, applying the user's Attack modifiers and not the user's # are applied normally, applying the user's Attack modifiers and not the user's
# Defence modifiers. (Body Press) # Defence modifiers. (Body Press)
# TODO: Rename this function code to remove both "Base"s?
#=============================================================================== #===============================================================================
class Battle::Move::UseUserBaseDefenseInsteadOfUserBaseAttack < Battle::Move class Battle::Move::UseUserDefenseInsteadOfUserAttack < Battle::Move
def pbGetAttackStats(user, target) def pbGetAttackStats(user, target)
return user.defense, user.stages[:DEFENSE] + 6 return user.defense, user.stages[:DEFENSE] + 6
end end
@@ -1275,7 +1274,7 @@ end
# (Chip Away, Darkest Lariat, Sacred Sword) # (Chip Away, Darkest Lariat, Sacred Sword)
#=============================================================================== #===============================================================================
class Battle::Move::IgnoreTargetDefSpDefEvaStatStages < Battle::Move class Battle::Move::IgnoreTargetDefSpDefEvaStatStages < Battle::Move
def pbCalcAccuracyMultipliers(user, target, multipliers) def pbCalcAccuracyModifiers(user, target, modifiers)
super super
modifiers[:evasion_stage] = 0 modifiers[:evasion_stage] = 0
end end
@@ -1376,20 +1375,15 @@ class Battle::Move::TypeAndPowerDependOnUserBerry < Battle::Move
return ret return ret
end end
# This is a separate method so that the AI can use it as well def pbBaseDamage(baseDmg, user, target)
def pbNaturalGiftBaseDamage(heldItem) if user.item.id
if heldItem GameData::Item.get(user.item.id).flags.each do |flag|
GameData::Item.get(heldItem).flags.each do |flag|
return [$~[1].to_i, 10].max if flag[/^NaturalGift_(?:\w+)_(\d+)$/i] return [$~[1].to_i, 10].max if flag[/^NaturalGift_(?:\w+)_(\d+)$/i]
end end
end end
return 1 return 1
end end
def pbBaseDamage(baseDmg, user, target)
return pbNaturalGiftBaseDamage(user.item.id)
end
def pbEndOfMoveUsageEffect(user, targets, numHits, switchedBattlers) def pbEndOfMoveUsageEffect(user, targets, numHits, switchedBattlers)
# NOTE: The item is consumed even if this move was Protected against or it # NOTE: The item is consumed even if this move was Protected against or it
# missed. The item is not consumed if the target was switched out by # missed. The item is not consumed if the target was switched out by

View File

@@ -65,7 +65,7 @@ class Battle::AI
case stat case stat
when :ATTACK when :ATTACK
return false if !@user.check_for_move { |m| m.physicalMove?(move.type) && return false if !@user.check_for_move { |m| m.physicalMove?(move.type) &&
m.function != "UseUserBaseDefenseInsteadOfUserBaseAttack" && m.function != "UseUserDefenseInsteadOfUserAttack" &&
m.function != "UseTargetAttackInsteadOfUserAttack" } m.function != "UseTargetAttackInsteadOfUserAttack" }
when :DEFENSE when :DEFENSE
each_foe_battler(@user.side) do |b, i| each_foe_battler(@user.side) do |b, i|
@@ -278,7 +278,7 @@ class Battle::AI
score -= 20 score -= 20
else else
has_physical_moves = @user.check_for_move { |m| m.physicalMove?(m.type) && has_physical_moves = @user.check_for_move { |m| m.physicalMove?(m.type) &&
m.function != "UseUserBaseDefenseInsteadOfUserBaseAttack" && m.function != "UseUserDefenseInsteadOfUserAttack" &&
m.function != "UseTargetAttackInsteadOfUserAttack" } m.function != "UseTargetAttackInsteadOfUserAttack" }
inc = (has_physical_moves) ? 5 : 10 inc = (has_physical_moves) ? 5 : 10
score += inc * (3 - old_stage) * inc_mult score += inc * (3 - old_stage) * inc_mult

View File

@@ -728,7 +728,7 @@ Battle::AI::Handlers::MoveFailureCheck.add("RaiseTargetAtkSpAtk2",
) )
Battle::AI::Handlers::MoveEffectScore.add("RaiseTargetAtkSpAtk2", Battle::AI::Handlers::MoveEffectScore.add("RaiseTargetAtkSpAtk2",
proc { |score, move, user, target, ai, battle| proc { |score, move, user, target, ai, battle|
next score - 50 if target.opposes?(user) next score - 40 if target.opposes?(user)
next score - 40 if !battle.moldBreaker && target.has_active_ability?(:CONTRARY) next score - 40 if !battle.moldBreaker && target.has_active_ability?(:CONTRARY)
score -= target.stages[:ATTACK] * 10 score -= target.stages[:ATTACK] * 10
score -= target.stages[:SPECIAL_ATTACK] * 10 score -= target.stages[:SPECIAL_ATTACK] * 10

View File

@@ -396,24 +396,13 @@ Battle::AI::Handlers::MoveFailureCheck.add("StartPreventCriticalHitsAgainstUserS
) )
#=============================================================================== #===============================================================================
# TODO: Review score modifiers. #
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("CannotMakeTargetFaint", Battle::AI::Handlers::MoveFailureCheck.add("CannotMakeTargetFaint",
proc { |move, user, target, ai, battle| proc { |move, user, target, ai, battle|
next true if target.hp == 1 next true if target.hp == 1
} }
) )
Battle::AI::Handlers::MoveEffectScore.add("CannotMakeTargetFaint",
proc { |score, move, user, target, ai, battle|
next 0 if target.hp == 1
if target.hp <= target.totalhp / 8
score -= 20
elsif target.hp <= target.totalhp / 4
score -= 10
end
next score
}
)
#=============================================================================== #===============================================================================
# TODO: Review score modifiers. # TODO: Review score modifiers.
@@ -661,21 +650,37 @@ Battle::AI::Handlers::MoveEffectScore.add("HoopaRemoveProtectionsBypassSubstitut
) )
#=============================================================================== #===============================================================================
# TODO: Review score modifiers. #
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveEffectScore.add("RecoilQuarterOfDamageDealt", Battle::AI::Handlers::MoveEffectScore.add("RecoilQuarterOfDamageDealt",
proc { |score, move, user, target, ai, battle| proc { |score, move, user, target, ai, battle|
next score - 8 next score if !user.battler.takesIndirectDamage? || user.has_active_ability?(:ROCKHEAD)
dmg = move.rough_damage / 4
if dmg >= user.hp
reserves = battle.pbAbleNonActiveCount(user.idxOwnSide)
foes = battle.pbAbleNonActiveCount(user.idxOpposingSide)
next score - 40 if reserves <= foes
end
score -= 10 * [dmg, user.hp].min / user.hp
next score
} }
) )
#=============================================================================== #===============================================================================
# TODO: Review score modifiers. #
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveEffectScore.add("RecoilThirdOfDamageDealtParalyzeTarget", Battle::AI::Handlers::MoveEffectScore.add("RecoilThirdOfDamageDealtParalyzeTarget",
proc { |score, move, user, target, ai, battle| proc { |score, move, user, target, ai, battle|
# Score for being a recoil move # Score for being a recoil move
score -= 10 if user.battler.takesIndirectDamage? && !user.has_active_ability?(:ROCKHEAD)
dmg = move.rough_damage / 3
if dmg >= user.hp
reserves = battle.pbAbleNonActiveCount(user.idxOwnSide)
foes = battle.pbAbleNonActiveCount(user.idxOpposingSide)
next score - 40 if reserves <= foes
end
score -= 10 * [dmg, user.hp].min / user.hp
end
# Score for paralysing # Score for paralysing
score = Battle::AI::Handlers.apply_move_effect_score("ParalyzeTarget", score = Battle::AI::Handlers.apply_move_effect_score("ParalyzeTarget",
score, move, user, target, ai, battle) score, move, user, target, ai, battle)
@@ -684,12 +689,20 @@ Battle::AI::Handlers::MoveEffectScore.add("RecoilThirdOfDamageDealtParalyzeTarge
) )
#=============================================================================== #===============================================================================
# TODO: Review score modifiers. #
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveEffectScore.add("RecoilThirdOfDamageDealtBurnTarget", Battle::AI::Handlers::MoveEffectScore.add("RecoilThirdOfDamageDealtBurnTarget",
proc { |score, move, user, target, ai, battle| proc { |score, move, user, target, ai, battle|
# Score for being a recoil move # Score for being a recoil move
score -= 10 if user.battler.takesIndirectDamage? && !user.has_active_ability?(:ROCKHEAD)
dmg = move.rough_damage / 3
if dmg >= user.hp
reserves = battle.pbAbleNonActiveCount(user.idxOwnSide)
foes = battle.pbAbleNonActiveCount(user.idxOpposingSide)
next score - 40 if reserves <= foes
end
score -= 10 * [dmg, user.hp].min / user.hp
end
# Score for burning # Score for burning
score = Battle::AI::Handlers.apply_move_effect_score("BurnTarget", score = Battle::AI::Handlers.apply_move_effect_score("BurnTarget",
score, move, user, target, ai, battle) score, move, user, target, ai, battle)
@@ -698,11 +711,19 @@ Battle::AI::Handlers::MoveEffectScore.add("RecoilThirdOfDamageDealtBurnTarget",
) )
#=============================================================================== #===============================================================================
# TODO: Review score modifiers. #
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveEffectScore.add("RecoilHalfOfDamageDealt", Battle::AI::Handlers::MoveEffectScore.add("RecoilHalfOfDamageDealt",
proc { |score, move, user, target, ai, battle| proc { |score, move, user, target, ai, battle|
next score - 15 next score if !user.battler.takesIndirectDamage? || user.has_active_ability?(:ROCKHEAD)
dmg = move.rough_damage / 2
if dmg >= user.hp
reserves = battle.pbAbleNonActiveCount(user.idxOwnSide)
foes = battle.pbAbleNonActiveCount(user.idxOpposingSide)
next score - 40 if reserves <= foes
end
score -= 10 * [dmg, user.hp].min / user.hp
next score
} }
) )
@@ -736,63 +757,91 @@ Battle::AI::Handlers::MoveEffectScore.add("CategoryDependsOnHigherDamagePoisonTa
# CategoryDependsOnHigherDamageIgnoreTargetAbility # CategoryDependsOnHigherDamageIgnoreTargetAbility
#=============================================================================== #===============================================================================
# TODO: Review score modifiers. #
#=============================================================================== #===============================================================================
# UseUserBaseDefenseInsteadOfUserBaseAttack # UseUserDefenseInsteadOfUserAttack
#=============================================================================== #===============================================================================
# TODO: Review score modifiers. #
#=============================================================================== #===============================================================================
# UseTargetAttackInsteadOfUserAttack # UseTargetAttackInsteadOfUserAttack
#=============================================================================== #===============================================================================
# TODO: Review score modifiers. #
#=============================================================================== #===============================================================================
# UseTargetDefenseInsteadOfTargetSpDef # UseTargetDefenseInsteadOfTargetSpDef
#=============================================================================== #===============================================================================
# TODO: Review score modifiers. #
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("EnsureNextMoveAlwaysHits",
proc { |move, user, target, ai, battle|
next true if user.effects[PBEffects::LockOn] > 0
}
)
Battle::AI::Handlers::MoveEffectScore.add("EnsureNextMoveAlwaysHits", Battle::AI::Handlers::MoveEffectScore.add("EnsureNextMoveAlwaysHits",
proc { |score, move, user, target, ai, battle| proc { |score, move, user, target, ai, battle|
next score - 50 if user.effects[PBEffects::LockOn] > 0 next score - 40 if user.has_active_ability?(:NOGUARD) || target.has_active_ability?(:NOGUARD)
next score - 40 if target.effects[PBEffects::Telekinesis] > 0
# Prefer if the user knows moves with low accuracy
user.check_for_move do |m|
next if target.effects[PBEffects::Minimize] && m.tramplesMinimize? && Settings::MECHANICS_GENERATION >= 6
# TODO: There are other effects that make a move certain to hit. Account
# for those as well, or is that too micro-managey?
acc = m.accuracy
acc = m.pbBaseAccuracy(user.battler, target.battler) if ai.trainer.medium_skill?
score += 4 if acc < 90 && acc != 0
score += 8 if acc < 50 && acc != 0
end
# Not worth it if the user or the target is at low HP
score -= 10 if user.hp < user.totalhp / 2
score -= 8 if target.hp < target.totalhp / 2
next score
} }
) )
#=============================================================================== #===============================================================================
# TODO: Review score modifiers. #
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveEffectScore.add("StartNegateTargetEvasionStatStageAndGhostImmunity", Battle::AI::Handlers::MoveEffectScore.add("StartNegateTargetEvasionStatStageAndGhostImmunity",
proc { |score, move, user, target, ai, battle| proc { |score, move, user, target, ai, battle|
if target.effects[PBEffects::Foresight] next score - 40 if target.effects[PBEffects::Foresight] || user.has_active_ability?(:SCRAPPY)
score -= 90 # Check if the user knows any moves that would benefit from negating the
elsif target.has_type?(:GHOST) # target's Ghost type immunity
score += 70 if target.has_type?(:GHOST)
elsif target.stages[:EVASION] <= 0 user.check_for_move do |m|
score -= 60 next if !m.damagingMove?
score += 10 if Effectiveness.ineffective_type?(m.pbCalcType(user.battler), :GHOST)
end
end end
# Prefer if the target has increased evasion
score += 10 * target.stages[:EVASION] if target.stages[:EVASION] > 0
next score next score
} }
) )
#=============================================================================== #===============================================================================
# TODO: Review score modifiers. #
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveEffectScore.add("StartNegateTargetEvasionStatStageAndDarkImmunity", Battle::AI::Handlers::MoveEffectScore.add("StartNegateTargetEvasionStatStageAndDarkImmunity",
proc { |score, move, user, target, ai, battle| proc { |score, move, user, target, ai, battle|
if target.effects[PBEffects::MiracleEye] next score - 40 if target.effects[PBEffects::MiracleEye]
score -= 50 # Check if the user knows any moves that would benefit from negating the
elsif target.has_type?(:DARK) # target's Dark type immunity
score += 70 if target.has_type?(:DARK)
elsif target.stages[:EVASION] <= 0 user.check_for_move do |m|
score -= 60 next if !m.damagingMove?
score += 10 if Effectiveness.ineffective_type?(m.pbCalcType(user.battler), :DARK)
end
end end
# Prefer if the target has increased evasion
score += 10 * target.stages[:EVASION] if target.stages[:EVASION] > 0
next score next score
} }
) )
#=============================================================================== #===============================================================================
# TODO: Review score modifiers. #
#=============================================================================== #===============================================================================
# IgnoreTargetDefSpDefEvaStatStages # IgnoreTargetDefSpDefEvaStatStages
@@ -811,7 +860,7 @@ Battle::AI::Handlers::MoveBasePower.add("TypeDependsOnUserIVs",
) )
#=============================================================================== #===============================================================================
# TODO: Review score modifiers. #
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("TypeAndPowerDependOnUserBerry", Battle::AI::Handlers::MoveFailureCheck.add("TypeAndPowerDependOnUserBerry",
proc { |move, user, target, ai, battle| proc { |move, user, target, ai, battle|
@@ -822,8 +871,7 @@ Battle::AI::Handlers::MoveFailureCheck.add("TypeAndPowerDependOnUserBerry",
) )
Battle::AI::Handlers::MoveBasePower.add("TypeAndPowerDependOnUserBerry", Battle::AI::Handlers::MoveBasePower.add("TypeAndPowerDependOnUserBerry",
proc { |power, move, user, target, ai, battle| proc { |power, move, user, target, ai, battle|
# TODO: Can't this just call move.move.pbBaseDamage? ret = move.move.pbBaseDamage(1, user.battler, target.battler)
ret = move.move.pbNaturalGiftBaseDamage(user.item_id)
next (ret == 1) ? 0 : ret next (ret == 1) ? 0 : ret
} }
) )
@@ -844,18 +892,15 @@ Battle::AI::Handlers::MoveBasePower.add("TypeAndPowerDependOnUserBerry",
# TypeDependsOnUserDrive # TypeDependsOnUserDrive
#=============================================================================== #===============================================================================
# TODO: Review score modifiers. #
#=============================================================================== #===============================================================================
Battle::AI::Handlers::MoveFailureCheck.add("TypeDependsOnUserMorpekoFormRaiseUserSpeed1", Battle::AI::Handlers::MoveFailureCheck.add("TypeDependsOnUserMorpekoFormRaiseUserSpeed1",
proc { |move, user, target, ai, battle| proc { |move, user, target, ai, battle|
next true if !user.battler.isSpecies?(:MORPEKO) && user.effects[PBEffects::TransformSpecies] != :MORPEKO next true if !user.battler.isSpecies?(:MORPEKO) && user.effects[PBEffects::TransformSpecies] != :MORPEKO
} }
) )
Battle::AI::Handlers::MoveEffectScore.add("TypeDependsOnUserMorpekoFormRaiseUserSpeed1", Battle::AI::Handlers::MoveEffectScore.copy("RaiseUserSpeed1",
proc { |score, move, user, target, ai, battle| "TypeDependsOnUserMorpekoFormRaiseUserSpeed1")
next score + 20 if user.stages[:SPEED] <= 0
}
)
#=============================================================================== #===============================================================================
# #

View File

@@ -301,7 +301,7 @@ Battle::AI::Handlers::MoveEffectScore.add("TargetUsesItsLastUsedMoveAgain",
proc { |score, move, user, target, ai, battle| proc { |score, move, user, target, ai, battle|
# Without lots of code here to determine good/bad moves and relative # Without lots of code here to determine good/bad moves and relative
# speeds, using this move is likely to just be a waste of a turn # speeds, using this move is likely to just be a waste of a turn
next score - 50 next score - 40
} }
) )

View File

@@ -148,7 +148,7 @@ Battle::AI::Handlers::GeneralMoveScore.add(:target_semi_invulnerable,
miss = false if move.move.hitsDivingTargets? miss = false if move.move.hitsDivingTargets?
end end
end end
next score - 50 if miss next score - 40 if miss
end end
} }
) )

View File

@@ -367,7 +367,9 @@ class Battle::AI::AIMove
defense = [(defense * multipliers[:defense_multiplier]).round, 1].max defense = [(defense * multipliers[:defense_multiplier]).round, 1].max
damage = ((((2.0 * user.level / 5) + 2).floor * power * atk / defense).floor / 50).floor + 2 damage = ((((2.0 * user.level / 5) + 2).floor * power * atk / defense).floor / 50).floor + 2
damage = [(damage * multipliers[:final_damage_multiplier]).round, 1].max damage = [(damage * multipliers[:final_damage_multiplier]).round, 1].max
return damage.floor ret = damage.floor
ret = target.hp - 1 if @move.nonLethal?(user_battler, target_battler) && ret >= target.hp
return ret
end end
#============================================================================= #=============================================================================

View File

@@ -2011,7 +2011,7 @@ Power = 80
Accuracy = 100 Accuracy = 100
TotalPP = 10 TotalPP = 10
Target = NearOther Target = NearOther
FunctionCode = UseUserBaseDefenseInsteadOfUserBaseAttack FunctionCode = UseUserDefenseInsteadOfUserAttack
Flags = Contact,CanProtect,CanMirrorMove,CannotMetronome Flags = Contact,CanProtect,CanMirrorMove,CannotMetronome
Description = The user attacks by slamming its body into the target. Power increases the higher the user's Defense is. Description = The user attacks by slamming its body into the target. Power increases the higher the user's Defense is.
#------------------------------- #-------------------------------

View File

@@ -2011,7 +2011,7 @@ Power = 80
Accuracy = 100 Accuracy = 100
TotalPP = 10 TotalPP = 10
Target = NearOther Target = NearOther
FunctionCode = UseUserBaseDefenseInsteadOfUserBaseAttack FunctionCode = UseUserDefenseInsteadOfUserAttack
Flags = Contact,CanProtect,CanMirrorMove,CannotMetronome Flags = Contact,CanProtect,CanMirrorMove,CannotMetronome
Description = The user attacks by slamming its body into the target. Power increases the higher the user's Defense is. Description = The user attacks by slamming its body into the target. Power increases the higher the user's Defense is.
#------------------------------- #-------------------------------