Tidying up of Gen 8 ability code, fixed Analytic's effect, added trigger for berry consuming when Unnerve ends

This commit is contained in:
Maruno17
2021-10-17 19:49:25 +01:00
parent c68e5e7abf
commit 72c50db6c0
6 changed files with 373 additions and 370 deletions

View File

@@ -373,6 +373,8 @@ class PokeBattle_Battler
:STANCECHANGE,
:ZENMODE,
# Abilities intended to be inherent properties of a certain species
:ASONECHILLINGNEIGH,
:ASONEGRIMNEIGH,
:COMATOSE,
:RKSSYSTEM
]
@@ -402,6 +404,8 @@ class PokeBattle_Battler
:ILLUSION,
:IMPOSTER,
# Abilities intended to be inherent properties of a certain species
:ASONECHILLINGNEIGH,
:ASONEGRIMNEIGH,
:COMATOSE,
:RKSSYSTEM,
# Abilities that can't be negated

View File

@@ -11,8 +11,9 @@ class PokeBattle_Battler
# Treat self as fainted
@hp = 0
@fainted = true
# Check for end of Neutralizing Gas
# Check for end of Neutralizing Gas/Unnerve
pbAbilitiesOnNeutralizingGasEnding if hasActiveAbility?(:NEUTRALIZINGGAS, true)
pbItemsOnUnnerveEnding if hasActiveAbility?(:UNNERVE, true)
# Check for end of primordial weather
@battle.pbEndPrimordialWeather
end
@@ -28,6 +29,7 @@ class PokeBattle_Battler
BattleHandlers.triggerAbilityOnBattlerFainting(b.ability,b,self,@battle)
end
pbAbilitiesOnNeutralizingGasEnding if hasActiveAbility?(:NEUTRALIZINGGAS, true)
pbItemsOnUnnerveEnding if hasActiveAbility?(:UNNERVE, true)
end
# Used for Emergency Exit/Wimp Out. Returns whether self has switched out.
@@ -105,6 +107,8 @@ class PokeBattle_Battler
def pbOnLosingAbility(oldAbil, suppressed = false)
if oldAbil == :NEUTRALIZINGGAS && (suppressed || !@effects[PBEffects::GastroAcid])
pbAbilitiesOnNeutralizingGasEnding
elsif oldAbil == :UNNERVE && (suppressed || !@effects[PBEffects::GastroAcid])
pbItemsOnUnnerveEnding
elsif oldAbil == :ILLUSION && @effects[PBEffects::Illusion]
@effects[PBEffects::Illusion] = nil
if !@effects[PBEffects::Transform]
@@ -316,4 +320,10 @@ class PokeBattle_Battler
return false if !itemActive?
return BattleHandlers.triggerItemOnStatDropped(self.item, self, move_user, @battle)
end
def pbItemsOnUnnerveEnding
@battle.pbPriority(true).each do |b|
b.pbHeldItemTriggerCheck if b.item && b.item.is_berry?
end
end
end

View File

@@ -100,7 +100,7 @@ class PokeBattle_Move
# Checks whether the move will be ineffective against the target.
def pbFailsAgainstTarget?(user, target, show_message); return false; end
def pbMoveFailedLastInRound?(user)
def pbMoveFailedLastInRound?(user, showMessage = true)
unmoved = false
@battle.eachBattler do |b|
next if b.index==user.index
@@ -110,7 +110,7 @@ class PokeBattle_Move
break
end
if !unmoved
@battle.pbDisplay(_INTL("But it failed!"))
@battle.pbDisplay(_INTL("But it failed!")) if showMessage
return true
end
return false

View File

@@ -140,6 +140,8 @@ BattleHandlers::StatusImmunityAbility.add(:IMMUNITY,
}
)
BattleHandlers::StatusImmunityAbility.copy(:IMMUNITY, :PASTELVEIL)
BattleHandlers::StatusImmunityAbility.add(:INSOMNIA,
proc { |ability,battler,status|
next true if status == :SLEEP
@@ -540,6 +542,12 @@ BattleHandlers::PriorityChangeAbility.add(:TRIAGE,
# PriorityBracketChangeAbility handlers
#===============================================================================
BattleHandlers::PriorityBracketChangeAbility.add(:QUICKDRAW,
proc { |ability, battler, subPri, battle|
next 1 if subPri == 0 && battle.pbRandom(100) < 30
}
)
BattleHandlers::PriorityBracketChangeAbility.add(:STALL,
proc { |ability,battler,subPri,battle|
next -1 if subPri==0
@@ -550,7 +558,13 @@ BattleHandlers::PriorityBracketChangeAbility.add(:STALL,
# PriorityBracketUseAbility handlers
#===============================================================================
# There aren't any!
BattleHandlers::PriorityBracketUseAbility.add(:QUICKDRAW,
proc { |ability, battler, battle|
battle.pbShowAbilitySplash(battler)
battle.pbDisplay(_INTL("{1} made {2} move faster!", battler.abilityName, battler.pbThis(true)))
battle.pbHideAbilitySplash(battler)
}
)
#===============================================================================
# AbilityOnFlinch handlers
@@ -888,9 +902,14 @@ BattleHandlers::DamageCalcUserAbility.copy(:AERILATE, :PIXILATE, :REFRIGERATE, :
BattleHandlers::DamageCalcUserAbility.add(:ANALYTIC,
proc { |ability,user,target,move,mults,baseDmg,type|
if (target.battle.choices[target.index][0]!=:UseMove &&
target.battle.choices[target.index][0]!=:Shift) ||
target.movedThisRound?
# NOTE: If another battler faints earlier in the round, but it would have
# moved after the user, then Analytic would not power up the move.
# However, this makes the determination so much more complicated
# (involving pbPriority and counting or not counting speed/priority
# modifiers depending on which Generation's mechanics are being used),
# so I'm choosing to ignore it. The effect is thus: "power up the move
# if all other battlers on the field right now have already moved".
if move.pbMoveFailedLastInRound?(user, false)
mults[:base_damage_multiplier] *= 1.3
end
}
@@ -910,6 +929,12 @@ BattleHandlers::DamageCalcUserAbility.add(:DEFEATIST,
}
)
BattleHandlers::DamageCalcUserAbility.add(:DRAGONSMAW,
proc { |ability, user, target, move, mults, baseDmg, type|
mults[:attack_multiplier] *= 1.5 if type == :DRAGON
}
)
BattleHandlers::DamageCalcUserAbility.add(:FLAREBOOST,
proc { |ability,user,target,move,mults,baseDmg,type|
if user.burned? && move.specialMove?
@@ -934,6 +959,12 @@ BattleHandlers::DamageCalcUserAbility.add(:FLOWERGIFT,
}
)
BattleHandlers::DamageCalcUserAbility.add(:GORILLATACTICS,
proc { |ability, user, target, move, mults, baseDmg, type|
mults[:attack_multiplier] *= 1.5
}
)
BattleHandlers::DamageCalcUserAbility.add(:GUTS,
proc { |ability,user,target,move,mults,baseDmg,type|
if user.pbHasAnyStatus? && move.physicalMove?
@@ -997,6 +1028,12 @@ BattleHandlers::DamageCalcUserAbility.add(:OVERGROW,
}
)
BattleHandlers::DamageCalcUserAbility.add(:PUNKROCK,
proc { |ability, user, target, move, mults, baseDmg, type|
mults[:attack_multiplier] *= 1.3 if move.soundMove?
}
)
BattleHandlers::DamageCalcUserAbility.add(:RECKLESS,
proc { |ability,user,target,move,mults,baseDmg,type|
mults[:base_damage_multiplier] *= 1.2 if move.recoilMove?
@@ -1064,6 +1101,12 @@ BattleHandlers::DamageCalcUserAbility.add(:STEELWORKER,
}
)
BattleHandlers::DamageCalcUserAbility.add(:STEELYSPIRIT,
proc { |ability, user, target, move, mults, baseDmg, type|
mults[:final_damage_multiplier] *= 1.5 if type == :STEEL
}
)
BattleHandlers::DamageCalcUserAbility.add(:STRONGJAW,
proc { |ability,user,target,move,mults,baseDmg,type|
mults[:base_damage_multiplier] *= 1.5 if move.bitingMove?
@@ -1115,6 +1158,12 @@ BattleHandlers::DamageCalcUserAbility.add(:TOXICBOOST,
}
)
BattleHandlers::DamageCalcUserAbility.add(:TRANSISTOR,
proc { |ability, user, target, move, mults, baseDmg, type|
mults[:attack_multiplier] *= 1.5 if type == :ELECTRIC
}
)
BattleHandlers::DamageCalcUserAbility.add(:WATERBUBBLE,
proc { |ability,user,target,move,mults,baseDmg,type|
mults[:attack_multiplier] *= 2 if type == :WATER
@@ -1140,6 +1189,18 @@ BattleHandlers::DamageCalcUserAllyAbility.add(:FLOWERGIFT,
}
)
BattleHandlers::DamageCalcUserAllyAbility.add(:POWERSPOT,
proc { |ability, user, target, move, mults, baseDmg, type|
mults[:final_damage_multiplier] *= 1.3
}
)
BattleHandlers::DamageCalcUserAllyAbility.add(:STEELYSPIRIT,
proc { |ability, user, target, move, mults, baseDmg, type|
mults[:final_damage_multiplier] *= 1.5 if type == :STEEL
}
)
#===============================================================================
# DamageCalcTargetAbility handlers
#===============================================================================
@@ -1196,6 +1257,12 @@ BattleHandlers::DamageCalcTargetAbility.add(:HEATPROOF,
}
)
BattleHandlers::DamageCalcTargetAbility.add(:ICESCALES,
proc { |ability, user, target, move, mults, baseDmg, type|
mults[:final_damage_multiplier] /= 2 if move.specialMove?
}
)
BattleHandlers::DamageCalcTargetAbility.add(:MARVELSCALE,
proc { |ability,user,target,move,mults,baseDmg,type|
if target.pbHasAnyStatus? && move.physicalMove?
@@ -1210,6 +1277,12 @@ BattleHandlers::DamageCalcTargetAbility.add(:MULTISCALE,
}
)
BattleHandlers::DamageCalcTargetAbility.add(:PUNKROCK,
proc { |ability, user, target, move, mults, baseDmg, type|
mults[:final_damage_multiplier] /= 2 if move.soundMove?
}
)
BattleHandlers::DamageCalcTargetAbility.add(:THICKFAT,
proc { |ability,user,target,move,mults,baseDmg,type|
mults[:base_damage_multiplier] /= 2 if type == :FIRE || type == :ICE
@@ -1340,6 +1413,23 @@ BattleHandlers::TargetAbilityOnHit.add(:ANGERPOINT,
}
)
BattleHandlers::TargetAbilityOnHit.add(:COTTONDOWN,
proc { |ability, user, target, move, battle|
has_effect = false
battle.eachBattler do |b|
next if !b.pbCanLowerStatStage?(:DEFENSE, target)
has_effect = true
break
end
next if !has_effect
battle.pbShowAbilitySplash(battler)
battle.eachBattler do |b|
b.pbLowerStatStageByAbility(:SPEED, 1, target, false)
end
battle.pbHideAbilitySplash(battler)
}
)
BattleHandlers::TargetAbilityOnHit.add(:CURSEDBODY,
proc { |ability,user,target,move,battle|
next if user.fainted?
@@ -1545,6 +1635,28 @@ BattleHandlers::TargetAbilityOnHit.add(:MUMMY,
}
)
BattleHandlers::TargetAbilityOnHit.add(:PERISHBODY,
proc { |ability, user, target, move, battle|
next if !move.pbContactMove?(user)
next if user.fainted?
next if user.effects[PBEffects::PerishSong] > 0 || target.effects[PBEffects::PerishSong] > 0
battle.pbShowAbilitySplash(target)
if user.affectedByContactEffect?(PokeBattle_SceneConstants::USE_ABILITY_SPLASH)
user.effects[PBEffects::PerishSong] = 4
user.effects[PBEffects::PerishSongUser] = target.index
target.effects[PBEffects::PerishSong] = 4
target.effects[PBEffects::PerishSongUser] = target.index
if PokeBattle_SceneConstants::USE_ABILITY_SPLASH
battle.pbDisplay(_INTL("Both Pokémon will faint in three turns!"))
else
battle.pbDisplay(_INTL("Both Pokémon will faint in three turns because of {1}'s {2}!",
target.pbThis(true), target.abilityName))
end
end
battle.pbHideAbilitySplash(target)
}
)
BattleHandlers::TargetAbilityOnHit.add(:POISONPOINT,
proc { |ability,user,target,move,battle|
next if !move.pbContactMove?(user)
@@ -1569,6 +1681,12 @@ BattleHandlers::TargetAbilityOnHit.add(:RATTLED,
}
)
BattleHandlers::TargetAbilityOnHit.add(:SANDSPIT,
proc { |ability, user, target, move, battle|
pbBattleWeatherAbility(:Sandstorm, battler, battle)
}
)
BattleHandlers::TargetAbilityOnHit.add(:STAMINA,
proc { |ability,user,target,move,battle|
target.pbRaiseStatStageByAbility(:DEFENSE,1,target)
@@ -1593,6 +1711,42 @@ BattleHandlers::TargetAbilityOnHit.add(:STATIC,
}
)
BattleHandlers::TargetAbilityOnHit.add(:WANDERINGSPIRIT,
proc { |ability, user, target, move, battle|
next if !move.pbContactMove?(user)
next if user.ungainableAbility? || [:RECEIVER, :WONDERGUARD].include?(user.ability_id)
oldUserAbil = nil
oldTargetAbil = nil
battle.pbShowAbilitySplash(target) if user.opposes?(target)
if user.affectedByContactEffect?(PokeBattle_SceneConstants::USE_ABILITY_SPLASH)
battle.pbShowAbilitySplash(user, true, false) if user.opposes?(target)
oldUserAbil = user.ability
oldTargetAbil = target.ability
user.ability = oldTargetAbil
target.ability = oldUserAbil
if user.opposes?(target)
battle.pbReplaceAbilitySplash(user)
battle.pbReplaceAbilitySplash(target)
end
if PokeBattle_SceneConstants::USE_ABILITY_SPLASH
battle.pbDisplay(_INTL("{1} swapped Abilities with {2}!", target.pbThis, user.pbThis(true)))
else
battle.pbDisplay(_INTL("{1} swapped its {2} Ability with {3}'s {4} Ability!",
target.pbThis, user.abilityName, user.pbThis(true), target.abilityName))
end
if user.opposes?(target)
battle.pbHideAbilitySplash(user)
battle.pbHideAbilitySplash(target)
end
end
battle.pbHideAbilitySplash(target) if user.opposes?(target)
user.pbOnLosingAbility(oldUserAbil)
target.pbOnLosingAbility(oldTargetAbil)
user.pbTriggerAbilityOnGainingIt
target.pbTriggerAbilityOnGainingIt
}
)
BattleHandlers::TargetAbilityOnHit.add(:WATERCOMPACTION,
proc { |ability,user,target,move,battle|
next if move.calcType != :WATER
@@ -1662,6 +1816,34 @@ BattleHandlers::UserAbilityEndOfMove.add(:BEASTBOOST,
}
)
BattleHandlers::UserAbilityEndOfMove.add(:CHILLINGNEIGH,
proc { |ability, user, targets, move, battle|
next if battle.pbAllFainted?(user.idxOpposingSide)
numFainted = 0
targets.each { |b| numFainted += 1 if b.damageState.fainted }
next if numFainted == 0 || !user.pbCanRaiseStatStage?(:ATTACK, user)
user.ability_id = :CHILLINGNEIGH # So the As One abilities can just copy this
user.pbRaiseStatStageByAbility(:ATTACK, 1, user)
user.ability_id = ability
}
)
BattleHandlers::UserAbilityEndOfMove.copy(:CHILLINGNEIGH, :ASONECHILLINGNEIGH)
BattleHandlers::UserAbilityEndOfMove.add(:GRIMNEIGH,
proc { |ability, user, targets, move, battle|
next if battle.pbAllFainted?(user.idxOpposingSide)
numFainted = 0
targets.each { |b| numFainted += 1 if b.damageState.fainted }
next if numFainted == 0 || !user.pbCanRaiseStatStage?(:SPECIAL_ATTACK, user)
user.ability_id = :GRIMNEIGH # So the As One abilities can just copy this
user.pbRaiseStatStageByAbility(:SPECIAL_ATTACK, 1, user)
user.ability_id = ability
}
)
BattleHandlers::UserAbilityEndOfMove.copy(:GRIMNEIGH, :ASONEGRIMNEIGH)
BattleHandlers::UserAbilityEndOfMove.add(:MAGICIAN,
proc { |ability,user,targets,move,battle|
next if battle.futureSight
@@ -1817,6 +1999,19 @@ BattleHandlers::EORWeatherAbility.add(:ICEBODY,
}
)
BattleHandlers::EORWeatherAbility.add(:ICEFACE,
proc { |ability, weather, battler, battle|
next if weather != :Hail
next if !battler.canRestoreIceFace || battler.form != 1
battle.pbShowAbilitySplash(battler)
if !PokeBattle_SceneConstants::USE_ABILITY_SPLASH
battle.pbDisplay(_INTL("{1}'s {2} activated!", battler.pbThis, battler.abilityName))
end
battler.pbChangeForm(0, _INTL("{1} transformed!", battler.pbThis))
battle.pbHideAbilitySplash(battler)
}
)
BattleHandlers::EORWeatherAbility.add(:RAINDISH,
proc { |ability,weather,battler,battle|
next unless [:Rain, :HeavyRain].include?(weather)
@@ -1995,6 +2190,20 @@ BattleHandlers::EOREffectAbility.add(:SPEEDBOOST,
# EORGainItemAbility handlers
#===============================================================================
BattleHandlers::EORGainItemAbility.add(:BALLFETCH,
proc { |ability, battler, battle|
next if battler.item
next if battle.first_poke_ball.nil?
battle.pbShowAbilitySplash(battler)
battler.item = battle.first_poke_ball
battler.setInitialItem(battler.item) if !battler.initialItem
battle.first_poke_ball = nil
battle.pbDisplay(_INTL("{1} retrieved the thrown {2}!", battler.pbThis, battler.itemName))
battle.pbHideAbilitySplash(battler)
battler.pbHeldItemTriggerCheck
}
)
BattleHandlers::EORGainItemAbility.add(:HARVEST,
proc { |ability,battler,battle|
next if battler.item
@@ -2122,6 +2331,21 @@ BattleHandlers::AbilityOnSwitchIn.add(:ANTICIPATION,
}
)
BattleHandlers::AbilityOnSwitchIn.add(:ASONECHILLINGNEIGH,
proc { |ability, battler, battle|
battle.pbShowAbilitySplash(battler)
battle.pbDisplay(_INTL("{1} has two Abilities!", battler.pbThis))
battle.pbHideAbilitySplash(battler)
battler.ability_id = :UNNERVE
battle.pbShowAbilitySplash(battler)
battle.pbDisplay(_INTL("{1} is too nervous to eat Berries!", battler.pbOpposingTeam))
battle.pbHideAbilitySplash(battler)
battler.ability_id = ability
}
)
BattleHandlers::AbilityOnSwitchIn.copy(:ASONECHILLINGNEIGH, :ASONEGRIMNEIGH)
BattleHandlers::AbilityOnSwitchIn.add(:AURABREAK,
proc { |ability,battler,battle|
battle.pbShowAbilitySplash(battler)
@@ -2138,6 +2362,30 @@ BattleHandlers::AbilityOnSwitchIn.add(:COMATOSE,
}
)
BattleHandlers::AbilityOnSwitchIn.add(:CURIOUSMEDICINE,
proc { |ability, battler, battle|
has_effect = false
battler.eachAlly do |b|
next if !b.hasAlteredStatStages?
has_effect = true
break
end
next if !has_effect
battle.pbShowAbilitySplash(battler)
battler.eachAlly do |b|
next if !b.hasAlteredStatStages?
b.pbResetStatStages
if PokeBattle_SceneConstants::USE_ABILITY_SPLASH
battle.pbDisplay(_INTL("{1}'s stat changes were removed!", b.pbThis))
else
battle.pbDisplay(_INTL("{1}'s stat changes were removed by {2}'s {3}!",
b.pbThis, battler.pbThis(true), battler.abilityName))
end
end
battle.pbHideAbilitySplash(battler)
}
)
BattleHandlers::AbilityOnSwitchIn.add(:DARKAURA,
proc { |ability,battler,battle|
battle.pbShowAbilitySplash(battler)
@@ -2146,6 +2394,12 @@ BattleHandlers::AbilityOnSwitchIn.add(:DARKAURA,
}
)
BattleHandlers::AbilityOnSwitchIn.add(:DAUNTLESSSHIELD,
proc { |ability, battler, battle|
battler.pbRaiseStatStageByAbility(:ATTACK, 1, battler)
}
)
BattleHandlers::AbilityOnSwitchIn.add(:DELTASTREAM,
proc { |ability,battler,battle|
pbBattleWeatherAbility(:StrongWinds, battler, battle, true)
@@ -2225,11 +2479,11 @@ BattleHandlers::AbilityOnSwitchIn.add(:FOREWARN,
"PowerLowerWithUserHappiness",
"PowerHigherWithUserHP",
"PowerHigherWithTargetFasterThanUser",
"TypeDependsOnUserIVs",
"TypeAndPowerDependOnUserBerry",
"PowerHigherWithLessPP",
"PowerLowerWithUserHP",
"PowerHigherWithTargetWeight"].include?(m.function)
power = 80 if Settings::MECHANICS_GENERATION <= 5 && m.function == "TypeDependsOnUserIVs"
next if power<highestPower
forewarnMoves = [] if power>highestPower
forewarnMoves.push(m.name)
@@ -2284,6 +2538,19 @@ BattleHandlers::AbilityOnSwitchIn.add(:GRASSYSURGE,
}
)
BattleHandlers::AbilityOnSwitchIn.add(:ICEFACE,
proc { |ability, battler, battle|
next if !battler.isSpecies?(:EISCUE) || battler.form != 1
next if battler.effectiveWeather != :Hail
battle.pbShowAbilitySplash(battler)
if !PokeBattle_SceneConstants::USE_ABILITY_SPLASH
battle.pbDisplay(_INTL("{1}'s {2} activated!", battler.pbThis, battler.abilityName))
end
battler.pbChangeForm(0, _INTL("{1} transformed!", battler.pbThis))
battle.pbHideAbilitySplash(battler)
}
)
BattleHandlers::AbilityOnSwitchIn.add(:IMPOSTER,
proc { |ability,battler,battle|
next if battler.effects[PBEffects::Transform]
@@ -2321,6 +2588,19 @@ BattleHandlers::AbilityOnSwitchIn.add(:INTIMIDATE,
}
)
BattleHandlers::AbilityOnSwitchIn.add(:INTREPIDSWORD,
proc { |ability, battler, battle|
battler.pbRaiseStatStageByAbility(:ATTACK, 1, battler)
}
)
BattleHandlers::AbilityOnSwitchIn.add(:MIMICRY,
proc { |ability, battler, battle|
next if battle.field.terrain == :None
BattleHandlers.triggerAbilityOnTerrainChange(ability, battler, battle, false)
}
)
BattleHandlers::AbilityOnSwitchIn.add(:MISTYSURGE,
proc { |ability,battler,battle|
next if battle.field.terrain == :Misty
@@ -2365,6 +2645,28 @@ BattleHandlers::AbilityOnSwitchIn.add(:NEUTRALIZINGGAS,
}
)
BattleHandlers::AbilityOnSwitchIn.add(:PASTELVEIL,
proc { |ability, battler, battle|
has_effect = false
battler.eachAlly do |b|
next if b.status != :POISON
has_effect = true
break
end
next if !has_effect
battle.pbShowAbilitySplash(battler)
battler.eachAlly do |b|
next if b.status != :POISON
b.pbCureStatus(PokeBattle_SceneConstants::USE_ABILITY_SPLASH)
if !PokeBattle_SceneConstants::USE_ABILITY_SPLASH
battle.pbDisplay(_INTL("{1}'s {2} cured {3}'s poisoning!",
battler.pbThis, battler.abilityName, b.pbThis(true)))
end
end
battle.pbHideAbilitySplash(battler)
}
)
BattleHandlers::AbilityOnSwitchIn.add(:PRESSURE,
proc { |ability,battler,battle|
battle.pbShowAbilitySplash(battler)
@@ -2394,6 +2696,43 @@ BattleHandlers::AbilityOnSwitchIn.add(:SANDSTREAM,
}
)
BattleHandlers::AbilityOnSwitchIn.add(:SCREENCLEANER,
proc { |ability, battler, battle|
next if target.pbOwnSide.effects[PBEffects::AuroraVeil] == 0 &&
target.pbOwnSide.effects[PBEffects::LightScreen] == 0 &&
target.pbOwnSide.effects[PBEffects::Reflect] == 0 &&
target.pbOpposingSide.effects[PBEffects::AuroraVeil] == 0 &&
target.pbOpposingSide.effects[PBEffects::LightScreen] == 0 &&
target.pbOpposingSide.effects[PBEffects::Reflect] == 0
battle.pbShowAbilitySplash(battler)
if battler.pbOpposingSide.effects[PBEffects::AuroraVeil] > 0
battler.pbOpposingSide.effects[PBEffects::AuroraVeil] = 0
battle.pbDisplay(_INTL("{1}'s Aurora Veil wore off!", battler.pbOpposingTeam))
end
if battler.pbOpposingSide.effects[PBEffects::LightScreen] > 0
battler.pbOpposingSide.effects[PBEffects::LightScreen] = 0
battle.pbDisplay(_INTL("{1}'s Light Screen wore off!", battler.pbOpposingTeam))
end
if battler.pbOpposingSide.effects[PBEffects::Reflect] > 0
battler.pbOpposingSide.effects[PBEffects::Reflect] = 0
battle.pbDisplay(_INTL("{1}'s Reflect wore off!", battler.pbOpposingTeam))
end
if battler.pbOwnSide.effects[PBEffects::AuroraVeil] > 0
battler.pbOwnSide.effects[PBEffects::AuroraVeil] = 0
battle.pbDisplay(_INTL("{1}'s Aurora Veil wore off!", battler.pbTeam))
end
if battler.pbOwnSide.effects[PBEffects::LightScreen] > 0
battler.pbOwnSide.effects[PBEffects::LightScreen] = 0
battle.pbDisplay(_INTL("{1}'s Light Screen wore off!", battler.pbTeam))
end
if battler.pbOwnSide.effects[PBEffects::Reflect] > 0
battler.pbOwnSide.effects[PBEffects::Reflect] = 0
battle.pbDisplay(_INTL("{1}'s Reflect wore off!", battler.pbTeam))
end
battle.pbHideAbilitySplash(battler)
}
)
BattleHandlers::AbilityOnSwitchIn.add(:SLOWSTART,
proc { |ability,battler,battle|
battle.pbShowAbilitySplash(battler)

View File

@@ -1,351 +0,0 @@
BattleHandlers::AbilityOnSwitchIn.add(:INTREPIDSWORD,
proc { |ability, battler, battle|
battler.pbRaiseStatStageByAbility(:ATTACK, 1, battler)
}
)
BattleHandlers::AbilityOnSwitchIn.add(:DAUNTLESSSHIELD,
proc { |ability, battler, battle|
battler.pbRaiseStatStageByAbility(:ATTACK, 1, battler)
}
)
BattleHandlers::AbilityOnSwitchIn.add(:CURIOUSMEDICINE,
proc { |ability, battler, battle|
has_effect = false
battler.eachAlly do |b|
next if !b.hasAlteredStatStages?
has_effect = true
break
end
next if !has_effect
battle.pbShowAbilitySplash(battler)
battler.eachAlly do |b|
next if !b.hasAlteredStatStages?
b.pbResetStatStages
if PokeBattle_SceneConstants::USE_ABILITY_SPLASH
battle.pbDisplay(_INTL("{1}'s stat changes were removed!", b.pbThis))
else
battle.pbDisplay(_INTL("{1}'s stat changes were removed by {2}'s {3}!",
b.pbThis, battler.pbThis(true), battler.abilityName))
end
end
battle.pbHideAbilitySplash(battler)
}
)
BattleHandlers::AbilityOnSwitchIn.add(:SCREENCLEANER,
proc { |ability, battler, battle|
next if target.pbOwnSide.effects[PBEffects::AuroraVeil] == 0 &&
target.pbOwnSide.effects[PBEffects::LightScreen] == 0 &&
target.pbOwnSide.effects[PBEffects::Reflect] == 0 &&
target.pbOpposingSide.effects[PBEffects::AuroraVeil] == 0 &&
target.pbOpposingSide.effects[PBEffects::LightScreen] == 0 &&
target.pbOpposingSide.effects[PBEffects::Reflect] == 0
battle.pbShowAbilitySplash(battler)
if battler.pbOpposingSide.effects[PBEffects::AuroraVeil] > 0
battler.pbOpposingSide.effects[PBEffects::AuroraVeil] = 0
battle.pbDisplay(_INTL("{1}'s Aurora Veil wore off!", battler.pbOpposingTeam))
end
if battler.pbOpposingSide.effects[PBEffects::LightScreen] > 0
battler.pbOpposingSide.effects[PBEffects::LightScreen] = 0
battle.pbDisplay(_INTL("{1}'s Light Screen wore off!", battler.pbOpposingTeam))
end
if battler.pbOpposingSide.effects[PBEffects::Reflect] > 0
battler.pbOpposingSide.effects[PBEffects::Reflect] = 0
battle.pbDisplay(_INTL("{1}'s Reflect wore off!", battler.pbOpposingTeam))
end
if battler.pbOwnSide.effects[PBEffects::AuroraVeil] > 0
battler.pbOwnSide.effects[PBEffects::AuroraVeil] = 0
battle.pbDisplay(_INTL("{1}'s Aurora Veil wore off!", battler.pbTeam))
end
if battler.pbOwnSide.effects[PBEffects::LightScreen] > 0
battler.pbOwnSide.effects[PBEffects::LightScreen] = 0
battle.pbDisplay(_INTL("{1}'s Light Screen wore off!", battler.pbTeam))
end
if battler.pbOwnSide.effects[PBEffects::Reflect] > 0
battler.pbOwnSide.effects[PBEffects::Reflect] = 0
battle.pbDisplay(_INTL("{1}'s Reflect wore off!", battler.pbTeam))
end
battle.pbHideAbilitySplash(battler)
}
)
BattleHandlers::TargetAbilityOnHit.add(:SANDSPIT,
proc { |ability, user, target, move, battle|
pbBattleWeatherAbility(:Sandstorm, battler, battle)
}
)
BattleHandlers::TargetAbilityOnHit.add(:COTTONDOWN,
proc { |ability, user, target, move, battle|
has_effect = false
battle.eachBattler do |b|
next if !b.pbCanLowerStatStage?(:DEFENSE, target)
has_effect = true
break
end
next if !has_effect
battle.pbShowAbilitySplash(battler)
battle.eachBattler do |b|
b.pbLowerStatStageByAbility(:SPEED, 1, target, false)
end
battle.pbHideAbilitySplash(battler)
}
)
BattleHandlers::TargetAbilityOnHit.add(:PERISHBODY,
proc { |ability, user, target, move, battle|
next if !move.pbContactMove?(user)
next if user.fainted?
next if user.effects[PBEffects::PerishSong] > 0 || target.effects[PBEffects::PerishSong] > 0
battle.pbShowAbilitySplash(target)
if user.affectedByContactEffect?(PokeBattle_SceneConstants::USE_ABILITY_SPLASH)
user.effects[PBEffects::PerishSong] = 4
user.effects[PBEffects::PerishSongUser] = target.index
target.effects[PBEffects::PerishSong] = 4
target.effects[PBEffects::PerishSongUser] = target.index
if PokeBattle_SceneConstants::USE_ABILITY_SPLASH
battle.pbDisplay(_INTL("Both Pokémon will faint in three turns!"))
else
battle.pbDisplay(_INTL("Both Pokémon will faint in three turns because of {1}'s {2}!",
target.pbThis(true), target.abilityName))
end
end
battle.pbHideAbilitySplash(target)
}
)
BattleHandlers::TargetAbilityOnHit.add(:WANDERINGSPIRIT,
proc { |ability, user, target, move, battle|
next if !move.pbContactMove?(user)
next if user.ungainableAbility? || [:RECEIVER, :WONDERGUARD].include?(user.ability_id)
oldUserAbil = nil
oldTargetAbil = nil
battle.pbShowAbilitySplash(target) if user.opposes?(target)
if user.affectedByContactEffect?(PokeBattle_SceneConstants::USE_ABILITY_SPLASH)
battle.pbShowAbilitySplash(user, true, false) if user.opposes?(target)
oldUserAbil = user.ability
oldTargetAbil = target.ability
user.ability = oldTargetAbil
target.ability = oldUserAbil
if user.opposes?(target)
battle.pbReplaceAbilitySplash(user)
battle.pbReplaceAbilitySplash(target)
end
if PokeBattle_SceneConstants::USE_ABILITY_SPLASH
battle.pbDisplay(_INTL("{1} swapped Abilities with {2}!", target.pbThis, user.pbThis(true)))
else
battle.pbDisplay(_INTL("{1} swapped its {2} Ability with {3}'s {4} Ability!",
target.pbThis, user.abilityName, user.pbThis(true), target.abilityName))
end
if user.opposes?(target)
battle.pbHideAbilitySplash(user)
battle.pbHideAbilitySplash(target)
end
end
battle.pbHideAbilitySplash(target) if user.opposes?(target)
user.pbOnLosingAbility(oldUserAbil)
target.pbOnLosingAbility(oldTargetAbil)
user.pbTriggerAbilityOnGainingIt
target.pbTriggerAbilityOnGainingIt
}
)
BattleHandlers::UserAbilityEndOfMove.add(:CHILLINGNEIGH,
proc { |ability, user, targets, move, battle|
next if battle.pbAllFainted?(user.idxOpposingSide)
numFainted = 0
targets.each { |b| numFainted += 1 if b.damageState.fainted }
next if numFainted == 0 || !user.pbCanRaiseStatStage?(:ATTACK, user)
user.ability_id = :CHILLINGNEIGH # So the As One abilities can just copy this
user.pbRaiseStatStageByAbility(:ATTACK, 1, user)
user.ability_id = ability
}
)
BattleHandlers::UserAbilityEndOfMove.add(:GRIMNEIGH,
proc { |ability, user, targets, move, battle|
next if battle.pbAllFainted?(user.idxOpposingSide)
numFainted = 0
targets.each { |b| numFainted += 1 if b.damageState.fainted }
next if numFainted == 0 || !user.pbCanRaiseStatStage?(:SPECIAL_ATTACK, user)
user.ability_id = :GRIMNEIGH # So the As One abilities can just copy this
user.pbRaiseStatStageByAbility(:SPECIAL_ATTACK, 1, user)
user.ability_id = ability
}
)
BattleHandlers::DamageCalcUserAbility.add(:TRANSISTOR ,
proc { |ability, user, target, move, mults, baseDmg, type|
mults[:attack_multiplier] *= 1.5 if type == :ELECTRIC
}
)
BattleHandlers::DamageCalcUserAbility.add(:DRAGONSMAW ,
proc { |ability, user, target, move, mults, baseDmg, type|
mults[:attack_multiplier] *= 1.5 if type == :DRAGON
}
)
BattleHandlers::DamageCalcUserAbility.add(:PUNKROCK ,
proc { |ability, user, target, move, mults, baseDmg, type|
mults[:attack_multiplier] *= 1.3 if move.soundMove?
}
)
BattleHandlers::DamageCalcTargetAbility.add(:PUNKROCK,
proc { |ability, user, target, move, mults, baseDmg, type|
mults[:final_damage_multiplier] /= 2 if move.soundMove?
}
)
BattleHandlers::DamageCalcUserAbility.add(:STEELYSPIRIT ,
proc { |ability, user, target, move, mults, baseDmg, type|
mults[:final_damage_multiplier] *= 1.5 if type == :STEEL
}
)
BattleHandlers::DamageCalcUserAllyAbility.add(:STEELYSPIRIT,
proc { |ability, user, target, move, mults, baseDmg, type|
mults[:final_damage_multiplier] *= 1.5 if type == :STEEL
}
)
BattleHandlers::DamageCalcUserAllyAbility.add(:POWERSPOT,
proc { |ability, user, target, move, mults, baseDmg, type|
mults[:final_damage_multiplier] *= 1.3
}
)
BattleHandlers::DamageCalcTargetAbility.add(:ICESCALES,
proc { |ability, user, target, move, mults, baseDmg, type|
mults[:final_damage_multiplier] /= 2 if move.specialMove?
}
)
BattleHandlers::StatusImmunityAbility.copy(:IMMUNITY, :PASTELVEIL)
BattleHandlers::StatusImmunityAbility.add(:PASTELVEIL,
proc { |ability, battler, status|
next true if status == :POISON
}
)
BattleHandlers::AbilityOnSwitchIn.add(:PASTELVEIL,
proc { |ability, battler, battle|
has_effect = false
battler.eachAlly do |b|
next if b.status != :POISON
has_effect = true
break
end
next if !has_effect
battle.pbShowAbilitySplash(battler)
battler.eachAlly do |b|
next if b.status != :POISON
b.pbCureStatus(PokeBattle_SceneConstants::USE_ABILITY_SPLASH)
if !PokeBattle_SceneConstants::USE_ABILITY_SPLASH
battle.pbDisplay(_INTL("{1}'s {2} cured {3}'s poisoning!",
battler.pbThis, battler.abilityName, b.pbThis(true)))
end
end
battle.pbHideAbilitySplash(battler)
}
)
BattleHandlers::PriorityBracketChangeAbility.add(:QUICKDRAW,
proc { |ability, battler, subPri, battle|
next 1 if subPri == 0 && battle.pbRandom(100) < 30
}
)
BattleHandlers::PriorityBracketUseAbility.add(:QUICKDRAW,
proc { |ability, battler, battle|
battle.pbShowAbilitySplash(battler)
battle.pbDisplay(_INTL("{1} made {2} move faster!", battler.abilityName, battler.pbThis(true)))
battle.pbHideAbilitySplash(battler)
}
)
BattleHandlers::EORGainItemAbility.add(:BALLFETCH,
proc { |ability, battler, battle|
next if battler.item
next if battle.first_poke_ball.nil?
battle.pbShowAbilitySplash(battler)
battler.item = battle.first_poke_ball
battler.setInitialItem(battler.item) if !battler.initialItem
battle.first_poke_ball = nil
battle.pbDisplay(_INTL("{1} retrieved the thrown {2}!", battler.pbThis, battler.itemName))
battle.pbHideAbilitySplash(battler)
battler.pbHeldItemTriggerCheck
}
)
BattleHandlers::AbilityOnSwitchIn.add(:ASONECHILLINGNEIGH,
proc { |ability, battler, battle|
battle.pbShowAbilitySplash(battler)
battle.pbDisplay(_INTL("{1} has two Abilities!", battler.pbThis))
battle.pbHideAbilitySplash(battler)
battler.ability_id = :UNNERVE
battle.pbShowAbilitySplash(battler)
battle.pbDisplay(_INTL("{1} is too nervous to eat Berries!", battler.pbOpposingTeam))
battle.pbHideAbilitySplash(battler)
battler.ability_id = ability
}
)
BattleHandlers::AbilityOnSwitchIn.copy(:ASONECHILLINGNEIGH, :ASONEGRIMNEIGH)
BattleHandlers::UserAbilityEndOfMove.copy(:CHILLINGNEIGH, :ASONECHILLINGNEIGH)
BattleHandlers::UserAbilityEndOfMove.copy(:GRIMNEIGH, :ASONEGRIMNEIGH)
BattleHandlers::AbilityOnSwitchIn.add(:ICEFACE,
proc { |ability, battler, battle|
next if !battler.isSpecies?(:EISCUE) || battler.form != 1
next if battler.effectiveWeather != :Hail
battle.pbShowAbilitySplash(battler)
if !PokeBattle_SceneConstants::USE_ABILITY_SPLASH
battle.pbDisplay(_INTL("{1}'s {2} activated!", battler.pbThis, battler.abilityName))
end
battler.pbChangeForm(0, _INTL("{1} transformed!", battler.pbThis))
battle.pbHideAbilitySplash(battler)
}
)
BattleHandlers::EORWeatherAbility.add(:ICEFACE,
proc { |ability, weather, battler, battle|
next if weather != :Hail
next if !battler.canRestoreIceFace || battler.form != 1
battle.pbShowAbilitySplash(battler)
if !PokeBattle_SceneConstants::USE_ABILITY_SPLASH
battle.pbDisplay(_INTL("{1}'s {2} activated!", battler.pbThis, battler.abilityName))
end
battler.pbChangeForm(0, _INTL("{1} transformed!", battler.pbThis))
battle.pbHideAbilitySplash(battler)
}
)
BattleHandlers::DamageCalcUserAbility.add(:GORILLATACTICS,
proc { |ability, user, target, move, mults, baseDmg, type|
mults[:attack_multiplier] *= 1.5
}
)
BattleHandlers::AbilityOnSwitchIn.add(:MIMICRY,
proc { |ability, battler, battle|
next if battle.field.terrain == :None
BattleHandlers.triggerAbilityOnTerrainChange(ability, battler, battle, false)
}
)
=begin
#===============================================================================
Neutralizing Gas
Suppresses all other abilities. Once this ability stops applying, triggers all
abilities that activate when gained (if this happens because bearer switches
out, abilities trigger before the replacement switches in).
=end