#=============================================================================== # SpeedCalcAbility handlers #=============================================================================== BattleHandlers::SpeedCalcAbility.add(:CHLOROPHYLL, proc { |ability,battler,mult| next mult * 2 if [:Sun, :HarshSun].include?(battler.battle.pbWeather) } ) BattleHandlers::SpeedCalcAbility.add(:QUICKFEET, proc { |ability,battler,mult| next mult*1.5 if battler.pbHasAnyStatus? } ) BattleHandlers::SpeedCalcAbility.add(:SANDRUSH, proc { |ability,battler,mult| next mult * 2 if [:Sandstorm].include?(battler.battle.pbWeather) } ) BattleHandlers::SpeedCalcAbility.add(:SLOWSTART, proc { |ability,battler,mult| next mult/2 if battler.effects[PBEffects::SlowStart]>0 } ) BattleHandlers::SpeedCalcAbility.add(:SLUSHRUSH, proc { |ability,battler,mult| next mult * 2 if [:Hail].include?(battler.battle.pbWeather) } ) BattleHandlers::SpeedCalcAbility.add(:SURGESURFER, proc { |ability,battler,mult| next mult*2 if battler.battle.field.terrain == :Electric } ) BattleHandlers::SpeedCalcAbility.add(:SWIFTSWIM, proc { |ability,battler,mult| next mult * 2 if [:Rain, :HeavyRain].include?(battler.battle.pbWeather) } ) BattleHandlers::SpeedCalcAbility.add(:UNBURDEN, proc { |ability,battler,mult| next mult*2 if battler.effects[PBEffects::Unburden] && !battler.item } ) #=============================================================================== # WeightCalcAbility handlers #=============================================================================== BattleHandlers::WeightCalcAbility.add(:HEAVYMETAL, proc { |ability,battler,w| next w*2 } ) BattleHandlers::WeightCalcAbility.add(:LIGHTMETAL, proc { |ability,battler,w| next [w/2,1].max } ) #=============================================================================== # AbilityOnHPDroppedBelowHalf handlers #=============================================================================== BattleHandlers::AbilityOnHPDroppedBelowHalf.add(:EMERGENCYEXIT, proc { |ability,battler,battle| next false if battler.effects[PBEffects::SkyDrop]>=0 || battler.inTwoTurnAttack?("0CE") # Sky Drop # In wild battles if battle.wildBattle? next false if battler.opposes? && battle.pbSideBattlerCount(battler.index)>1 next false if !battle.pbCanRun?(battler.index) battle.pbShowAbilitySplash(battler,true) battle.pbHideAbilitySplash(battler) pbSEPlay("Battle flee") battle.pbDisplay(_INTL("{1} fled from battle!",battler.pbThis)) battle.decision = 3 # Escaped next true end # In trainer battles next false if battle.pbAllFainted?(battler.idxOpposingSide) next false if !battle.pbCanSwitch?(battler.index) # Battler can't switch out next false if !battle.pbCanChooseNonActive?(battler.index) # No Pokémon can switch in battle.pbShowAbilitySplash(battler,true) battle.pbHideAbilitySplash(battler) if !PokeBattle_SceneConstants::USE_ABILITY_SPLASH battle.pbDisplay(_INTL("{1}'s {2} activated!",battler.pbThis,battler.abilityName)) end battle.pbDisplay(_INTL("{1} went back to {2}!", battler.pbThis,battle.pbGetOwnerName(battler.index))) if battle.endOfRound # Just switch out battle.scene.pbRecall(battler.index) if !battler.fainted? battler.pbAbilitiesOnSwitchOut # Inc. primordial weather check next true end newPkmn = battle.pbGetReplacementPokemonIndex(battler.index) # Owner chooses next false if newPkmn<0 # Shouldn't ever do this battle.pbRecallAndReplace(battler.index,newPkmn) battle.pbClearChoice(battler.index) # Replacement Pokémon does nothing this round next true } ) BattleHandlers::AbilityOnHPDroppedBelowHalf.copy(:EMERGENCYEXIT,:WIMPOUT) #=============================================================================== # StatusCheckAbilityNonIgnorable handlers #=============================================================================== BattleHandlers::StatusCheckAbilityNonIgnorable.add(:COMATOSE, proc { |ability,battler,status| next false if !battler.isSpecies?(:KOMALA) next true if status.nil? || status == :SLEEP } ) #=============================================================================== # StatusImmunityAbility handlers #=============================================================================== BattleHandlers::StatusImmunityAbility.add(:FLOWERVEIL, proc { |ability,battler,status| next true if battler.pbHasType?(:GRASS) } ) BattleHandlers::StatusImmunityAbility.add(:IMMUNITY, proc { |ability,battler,status| next true if status == :POISON } ) BattleHandlers::StatusImmunityAbility.add(:INSOMNIA, proc { |ability,battler,status| next true if status == :SLEEP } ) BattleHandlers::StatusImmunityAbility.copy(:INSOMNIA,:SWEETVEIL,:VITALSPIRIT) BattleHandlers::StatusImmunityAbility.add(:LEAFGUARD, proc { |ability,battler,status| next true if [:Sun, :HarshSun].include?(battler.battle.pbWeather) } ) BattleHandlers::StatusImmunityAbility.add(:LIMBER, proc { |ability,battler,status| next true if status == :PARALYSIS } ) BattleHandlers::StatusImmunityAbility.add(:MAGMAARMOR, proc { |ability,battler,status| next true if status == :FROZEN } ) BattleHandlers::StatusImmunityAbility.add(:WATERVEIL, proc { |ability,battler,status| next true if status == :BURN } ) BattleHandlers::StatusImmunityAbility.copy(:WATERVEIL,:WATERBUBBLE) #=============================================================================== # StatusImmunityAbilityNonIgnorable handlers #=============================================================================== BattleHandlers::StatusImmunityAbilityNonIgnorable.add(:COMATOSE, proc { |ability,battler,status| next true if battler.isSpecies?(:KOMALA) } ) BattleHandlers::StatusImmunityAbilityNonIgnorable.add(:SHIELDSDOWN, proc { |ability,battler,status| next true if battler.isSpecies?(:MINIOR) && battler.form<7 } ) #=============================================================================== # StatusImmunityAllyAbility handlers #=============================================================================== BattleHandlers::StatusImmunityAllyAbility.add(:FLOWERVEIL, proc { |ability,battler,status| next true if battler.pbHasType?(:GRASS) } ) BattleHandlers::StatusImmunityAbility.add(:SWEETVEIL, proc { |ability,battler,status| next true if status == :SLEEP } ) #=============================================================================== # AbilityOnStatusInflicted handlers #=============================================================================== BattleHandlers::AbilityOnStatusInflicted.add(:SYNCHRONIZE, proc { |ability,battler,user,status| next if !user || user.index==battler.index case status when :POISON if user.pbCanPoisonSynchronize?(battler) battler.battle.pbShowAbilitySplash(battler) msg = nil if !PokeBattle_SceneConstants::USE_ABILITY_SPLASH msg = _INTL("{1}'s {2} poisoned {3}!",battler.pbThis,battler.abilityName,user.pbThis(true)) end user.pbPoison(nil,msg,(battler.statusCount>0)) battler.battle.pbHideAbilitySplash(battler) end when :BURN if user.pbCanBurnSynchronize?(battler) battler.battle.pbShowAbilitySplash(battler) msg = nil if !PokeBattle_SceneConstants::USE_ABILITY_SPLASH msg = _INTL("{1}'s {2} burned {3}!",battler.pbThis,battler.abilityName,user.pbThis(true)) end user.pbBurn(nil,msg) battler.battle.pbHideAbilitySplash(battler) end when :PARALYSIS if user.pbCanParalyzeSynchronize?(battler) battler.battle.pbShowAbilitySplash(battler) msg = nil if !PokeBattle_SceneConstants::USE_ABILITY_SPLASH msg = _INTL("{1}'s {2} paralyzed {3}! It may be unable to move!", battler.pbThis,battler.abilityName,user.pbThis(true)) end user.pbParalyze(nil,msg) battler.battle.pbHideAbilitySplash(battler) end end } ) #=============================================================================== # StatusCureAbility handlers #=============================================================================== BattleHandlers::StatusCureAbility.add(:IMMUNITY, proc { |ability,battler| next if battler.status != :POISON battler.battle.pbShowAbilitySplash(battler) battler.pbCureStatus(PokeBattle_SceneConstants::USE_ABILITY_SPLASH) if !PokeBattle_SceneConstants::USE_ABILITY_SPLASH battler.battle.pbDisplay(_INTL("{1}'s {2} cured its poisoning!",battler.pbThis,battler.abilityName)) end battler.battle.pbHideAbilitySplash(battler) } ) BattleHandlers::StatusCureAbility.add(:INSOMNIA, proc { |ability,battler| next if battler.status != :SLEEP battler.battle.pbShowAbilitySplash(battler) battler.pbCureStatus(PokeBattle_SceneConstants::USE_ABILITY_SPLASH) if !PokeBattle_SceneConstants::USE_ABILITY_SPLASH battler.battle.pbDisplay(_INTL("{1}'s {2} woke it up!",battler.pbThis,battler.abilityName)) end battler.battle.pbHideAbilitySplash(battler) } ) BattleHandlers::StatusCureAbility.copy(:INSOMNIA,:VITALSPIRIT) BattleHandlers::StatusCureAbility.add(:LIMBER, proc { |ability,battler| next if battler.status != :PARALYSIS battler.battle.pbShowAbilitySplash(battler) battler.pbCureStatus(PokeBattle_SceneConstants::USE_ABILITY_SPLASH) if !PokeBattle_SceneConstants::USE_ABILITY_SPLASH battler.battle.pbDisplay(_INTL("{1}'s {2} cured its paralysis!",battler.pbThis,battler.abilityName)) end battler.battle.pbHideAbilitySplash(battler) } ) BattleHandlers::StatusCureAbility.add(:MAGMAARMOR, proc { |ability,battler| next if battler.status != :FROZEN battler.battle.pbShowAbilitySplash(battler) battler.pbCureStatus(PokeBattle_SceneConstants::USE_ABILITY_SPLASH) if !PokeBattle_SceneConstants::USE_ABILITY_SPLASH battler.battle.pbDisplay(_INTL("{1}'s {2} defrosted it!",battler.pbThis,battler.abilityName)) end battler.battle.pbHideAbilitySplash(battler) } ) BattleHandlers::StatusCureAbility.add(:OBLIVIOUS, proc { |ability,battler| next if battler.effects[PBEffects::Attract]<0 && (battler.effects[PBEffects::Taunt]==0 || Settings::MECHANICS_GENERATION <= 5) battler.battle.pbShowAbilitySplash(battler) if battler.effects[PBEffects::Attract]>=0 battler.pbCureAttract if PokeBattle_SceneConstants::USE_ABILITY_SPLASH battler.battle.pbDisplay(_INTL("{1} got over its infatuation.",battler.pbThis)) else battler.battle.pbDisplay(_INTL("{1}'s {2} cured its infatuation status!", battler.pbThis,battler.abilityName)) end end if battler.effects[PBEffects::Taunt]>0 && Settings::MECHANICS_GENERATION >= 6 battler.effects[PBEffects::Taunt] = 0 if PokeBattle_SceneConstants::USE_ABILITY_SPLASH battler.battle.pbDisplay(_INTL("{1}'s Taunt wore off!",battler.pbThis)) else battler.battle.pbDisplay(_INTL("{1}'s {2} made its taunt wear off!", battler.pbThis,battler.abilityName)) end end battler.battle.pbHideAbilitySplash(battler) } ) BattleHandlers::StatusCureAbility.add(:OWNTEMPO, proc { |ability,battler| next if battler.effects[PBEffects::Confusion]==0 battler.battle.pbShowAbilitySplash(battler) battler.pbCureConfusion if PokeBattle_SceneConstants::USE_ABILITY_SPLASH battler.battle.pbDisplay(_INTL("{1} snapped out of its confusion.",battler.pbThis)) else battler.battle.pbDisplay(_INTL("{1}'s {2} snapped it out of its confusion!", battler.pbThis,battler.abilityName)) end battler.battle.pbHideAbilitySplash(battler) } ) BattleHandlers::StatusCureAbility.add(:WATERVEIL, proc { |ability,battler| next if battler.status != :BURN battler.battle.pbShowAbilitySplash(battler) battler.pbCureStatus(PokeBattle_SceneConstants::USE_ABILITY_SPLASH) if !PokeBattle_SceneConstants::USE_ABILITY_SPLASH battler.battle.pbDisplay(_INTL("{1}'s {2} healed its burn!",battler.pbThis,battler.abilityName)) end battler.battle.pbHideAbilitySplash(battler) } ) BattleHandlers::StatusCureAbility.copy(:WATERVEIL,:WATERBUBBLE) #=============================================================================== # StatLossImmunityAbility handlers #=============================================================================== BattleHandlers::StatLossImmunityAbility.add(:BIGPECKS, proc { |ability,battler,stat,battle,showMessages| next false if stat!=:DEFENSE if showMessages battle.pbShowAbilitySplash(battler) if PokeBattle_SceneConstants::USE_ABILITY_SPLASH battle.pbDisplay(_INTL("{1}'s {2} cannot be lowered!",battler.pbThis,GameData::Stat.get(stat).name)) else battle.pbDisplay(_INTL("{1}'s {2} prevents {3} loss!",battler.pbThis, battler.abilityName,GameData::Stat.get(stat).name)) end battle.pbHideAbilitySplash(battler) end next true } ) BattleHandlers::StatLossImmunityAbility.add(:CLEARBODY, proc { |ability,battler,stat,battle,showMessages| if showMessages battle.pbShowAbilitySplash(battler) if PokeBattle_SceneConstants::USE_ABILITY_SPLASH battle.pbDisplay(_INTL("{1}'s stats cannot be lowered!",battler.pbThis)) else battle.pbDisplay(_INTL("{1}'s {2} prevents stat loss!",battler.pbThis,battler.abilityName)) end battle.pbHideAbilitySplash(battler) end next true } ) BattleHandlers::StatLossImmunityAbility.copy(:CLEARBODY,:WHITESMOKE) BattleHandlers::StatLossImmunityAbility.add(:FLOWERVEIL, proc { |ability,battler,stat,battle,showMessages| next false if !battler.pbHasType?(:GRASS) if showMessages battle.pbShowAbilitySplash(battler) if PokeBattle_SceneConstants::USE_ABILITY_SPLASH battle.pbDisplay(_INTL("{1}'s stats cannot be lowered!",battler.pbThis)) else battle.pbDisplay(_INTL("{1}'s {2} prevents stat loss!",battler.pbThis,battler.abilityName)) end battle.pbHideAbilitySplash(battler) end next true } ) BattleHandlers::StatLossImmunityAbility.add(:HYPERCUTTER, proc { |ability,battler,stat,battle,showMessages| next false if stat!=:ATTACK if showMessages battle.pbShowAbilitySplash(battler) if PokeBattle_SceneConstants::USE_ABILITY_SPLASH battle.pbDisplay(_INTL("{1}'s {2} cannot be lowered!",battler.pbThis,GameData::Stat.get(stat).name)) else battle.pbDisplay(_INTL("{1}'s {2} prevents {3} loss!",battler.pbThis, battler.abilityName,GameData::Stat.get(stat).name)) end battle.pbHideAbilitySplash(battler) end next true } ) BattleHandlers::StatLossImmunityAbility.add(:KEENEYE, proc { |ability,battler,stat,battle,showMessages| next false if stat!=:ACCURACY if showMessages battle.pbShowAbilitySplash(battler) if PokeBattle_SceneConstants::USE_ABILITY_SPLASH battle.pbDisplay(_INTL("{1}'s {2} cannot be lowered!",battler.pbThis,GameData::Stat.get(stat).name)) else battle.pbDisplay(_INTL("{1}'s {2} prevents {3} loss!",battler.pbThis, battler.abilityName,GameData::Stat.get(stat).name)) end battle.pbHideAbilitySplash(battler) end next true } ) #=============================================================================== # StatLossImmunityAbilityNonIgnorable handlers #=============================================================================== BattleHandlers::StatLossImmunityAbilityNonIgnorable.add(:FULLMETALBODY, proc { |ability,battler,stat,battle,showMessages| if showMessages battle.pbShowAbilitySplash(battler) if PokeBattle_SceneConstants::USE_ABILITY_SPLASH battle.pbDisplay(_INTL("{1}'s stats cannot be lowered!",battler.pbThis)) else battle.pbDisplay(_INTL("{1}'s {2} prevents stat loss!",battler.pbThis,battler.abilityName)) end battle.pbHideAbilitySplash(battler) end next true } ) #=============================================================================== # StatLossImmunityAllyAbility handlers #=============================================================================== BattleHandlers::StatLossImmunityAllyAbility.add(:FLOWERVEIL, proc { |ability,bearer,battler,stat,battle,showMessages| next false if !battler.pbHasType?(:GRASS) if showMessages battle.pbShowAbilitySplash(bearer) if PokeBattle_SceneConstants::USE_ABILITY_SPLASH battle.pbDisplay(_INTL("{1}'s stats cannot be lowered!",battler.pbThis)) else battle.pbDisplay(_INTL("{1}'s {2} prevents {3}'s stat loss!", bearer.pbThis,bearer.abilityName,battler.pbThis(true))) end battle.pbHideAbilitySplash(bearer) end next true } ) #=============================================================================== # AbilityOnStatGain handlers #=============================================================================== # There aren't any! #=============================================================================== # AbilityOnStatLoss handlers #=============================================================================== BattleHandlers::AbilityOnStatLoss.add(:COMPETITIVE, proc { |ability,battler,stat,user| next if user && !user.opposes?(battler) battler.pbRaiseStatStageByAbility(:SPECIAL_ATTACK,2,battler,GameData::Ability.get(ability).real_name) } ) BattleHandlers::AbilityOnStatLoss.add(:DEFIANT, proc { |ability,battler,stat,user| next if user && !user.opposes?(battler) battler.pbRaiseStatStageByAbility(:ATTACK,2,battler,GameData::Ability.get(ability).real_name) } ) #=============================================================================== # PriorityChangeAbility handlers #=============================================================================== BattleHandlers::PriorityChangeAbility.add(:GALEWINGS, proc { |ability,battler,move,pri| next pri+1 if battler.hp==battler.totalhp && move.type == :FLYING } ) BattleHandlers::PriorityChangeAbility.add(:PRANKSTER, proc { |ability,battler,move,pri| if move.statusMove? battler.effects[PBEffects::Prankster] = true next pri+1 end } ) BattleHandlers::PriorityChangeAbility.add(:TRIAGE, proc { |ability,battler,move,pri| next pri+3 if move.healingMove? } ) #=============================================================================== # PriorityBracketChangeAbility handlers #=============================================================================== BattleHandlers::PriorityBracketChangeAbility.add(:STALL, proc { |ability,battler,subPri,battle| next -1 if subPri==0 } ) #=============================================================================== # PriorityBracketUseAbility handlers #=============================================================================== # There aren't any! #=============================================================================== # AbilityOnFlinch handlers #=============================================================================== BattleHandlers::AbilityOnFlinch.add(:STEADFAST, proc { |ability,battler,battle| battler.pbRaiseStatStageByAbility(:SPEED,1,battler,GameData::Ability.get(ability).real_name) } ) #=============================================================================== # MoveBlockingAbility handlers #=============================================================================== BattleHandlers::MoveBlockingAbility.add(:DAZZLING, proc { |ability,bearer,user,targets,move,battle| next false if battle.choices[user.index][4]<=0 next false if !bearer.opposes?(user) ret = false targets.each do |b| next if !b.opposes?(user) ret = true end next ret } ) BattleHandlers::MoveBlockingAbility.copy(:DAZZLING,:QUEENLYMAJESTY) #=============================================================================== # MoveImmunityTargetAbility handlers #=============================================================================== BattleHandlers::MoveImmunityTargetAbility.add(:BULLETPROOF, proc { |ability,user,target,move,type,battle| next false if !move.bombMove? battle.pbShowAbilitySplash(target) if PokeBattle_SceneConstants::USE_ABILITY_SPLASH battle.pbDisplay(_INTL("It doesn't affect {1}...",target.pbThis(true))) else battle.pbDisplay(_INTL("{1}'s {2} made {3} ineffective!", target.pbThis,target.abilityName,move.name)) end battle.pbHideAbilitySplash(target) next true } ) BattleHandlers::MoveImmunityTargetAbility.add(:FLASHFIRE, proc { |ability,user,target,move,type,battle| next false if user.index==target.index next false if type != :FIRE battle.pbShowAbilitySplash(target) if !target.effects[PBEffects::FlashFire] target.effects[PBEffects::FlashFire] = true if PokeBattle_SceneConstants::USE_ABILITY_SPLASH battle.pbDisplay(_INTL("The power of {1}'s Fire-type moves rose!",target.pbThis(true))) else battle.pbDisplay(_INTL("The power of {1}'s Fire-type moves rose because of its {2}!", target.pbThis(true),target.abilityName)) end else if PokeBattle_SceneConstants::USE_ABILITY_SPLASH battle.pbDisplay(_INTL("It doesn't affect {1}...",target.pbThis(true))) else battle.pbDisplay(_INTL("{1}'s {2} made {3} ineffective!", target.pbThis,target.abilityName,move.name)) end end battle.pbHideAbilitySplash(target) next true } ) BattleHandlers::MoveImmunityTargetAbility.add(:LIGHTNINGROD, proc { |ability,user,target,move,type,battle| next pbBattleMoveImmunityStatAbility(user,target,move,type,:ELECTRIC,:SPECIAL_ATTACK,1,battle) } ) BattleHandlers::MoveImmunityTargetAbility.add(:MOTORDRIVE, proc { |ability,user,target,move,type,battle| next pbBattleMoveImmunityStatAbility(user,target,move,type,:ELECTRIC,:SPEED,1,battle) } ) BattleHandlers::MoveImmunityTargetAbility.add(:SAPSIPPER, proc { |ability,user,target,move,type,battle| next pbBattleMoveImmunityStatAbility(user,target,move,type,:GRASS,:ATTACK,1,battle) } ) BattleHandlers::MoveImmunityTargetAbility.add(:SOUNDPROOF, proc { |ability,user,target,move,type,battle| next false if !move.soundMove? battle.pbShowAbilitySplash(target) if PokeBattle_SceneConstants::USE_ABILITY_SPLASH battle.pbDisplay(_INTL("It doesn't affect {1}...",target.pbThis(true))) else battle.pbDisplay(_INTL("{1}'s {2} blocks {3}!",target.pbThis,target.abilityName,move.name)) end battle.pbHideAbilitySplash(target) next true } ) BattleHandlers::MoveImmunityTargetAbility.add(:STORMDRAIN, proc { |ability,user,target,move,type,battle| next pbBattleMoveImmunityStatAbility(user,target,move,type,:WATER,:SPECIAL_ATTACK,1,battle) } ) BattleHandlers::MoveImmunityTargetAbility.add(:TELEPATHY, proc { |ability,user,target,move,type,battle| next false if move.statusMove? next false if user.index==target.index || target.opposes?(user) battle.pbShowAbilitySplash(target) if PokeBattle_SceneConstants::USE_ABILITY_SPLASH battle.pbDisplay(_INTL("{1} avoids attacks by its ally Pokémon!",target.pbThis(true))) else battle.pbDisplay(_INTL("{1} avoids attacks by its ally Pokémon with {2}!", target.pbThis,target.abilityName)) end battle.pbHideAbilitySplash(target) next true } ) BattleHandlers::MoveImmunityTargetAbility.add(:VOLTABSORB, proc { |ability,user,target,move,type,battle| next pbBattleMoveImmunityHealAbility(user,target,move,type,:ELECTRIC,battle) } ) BattleHandlers::MoveImmunityTargetAbility.add(:WATERABSORB, proc { |ability,user,target,move,type,battle| next pbBattleMoveImmunityHealAbility(user,target,move,type,:WATER,battle) } ) BattleHandlers::MoveImmunityTargetAbility.copy(:WATERABSORB,:DRYSKIN) BattleHandlers::MoveImmunityTargetAbility.add(:WONDERGUARD, proc { |ability,user,target,move,type,battle| next false if move.statusMove? next false if !type || Effectiveness.super_effective?(target.damageState.typeMod) battle.pbShowAbilitySplash(target) if PokeBattle_SceneConstants::USE_ABILITY_SPLASH battle.pbDisplay(_INTL("It doesn't affect {1}...",target.pbThis(true))) else battle.pbDisplay(_INTL("{1} avoided damage with {2}!",target.pbThis,target.abilityName)) end battle.pbHideAbilitySplash(target) next true } ) #=============================================================================== # MoveBaseTypeModifierAbility handlers #=============================================================================== BattleHandlers::MoveBaseTypeModifierAbility.add(:AERILATE, proc { |ability,user,move,type| next if type != :NORMAL || !GameData::Type.exists?(:FLYING) move.powerBoost = true next :FLYING } ) BattleHandlers::MoveBaseTypeModifierAbility.add(:GALVANIZE, proc { |ability,user,move,type| next if type != :NORMAL || !GameData::Type.exists?(:ELECTRIC) move.powerBoost = true next :ELECTRIC } ) BattleHandlers::MoveBaseTypeModifierAbility.add(:LIQUIDVOICE, proc { |ability,user,move,type| next :WATER if GameData::Type.exists?(:WATER) && move.soundMove? } ) BattleHandlers::MoveBaseTypeModifierAbility.add(:NORMALIZE, proc { |ability,user,move,type| next if !GameData::Type.exists?(:NORMAL) move.powerBoost = true if Settings::MECHANICS_GENERATION >= 7 next :NORMAL } ) BattleHandlers::MoveBaseTypeModifierAbility.add(:PIXILATE, proc { |ability,user,move,type| next if type != :NORMAL || !GameData::Type.exists?(:FAIRY) move.powerBoost = true next :FAIRY } ) BattleHandlers::MoveBaseTypeModifierAbility.add(:REFRIGERATE, proc { |ability,user,move,type| next if type != :NORMAL || !GameData::Type.exists?(:ICE) move.powerBoost = true next :ICE } ) #=============================================================================== # AccuracyCalcUserAbility handlers #=============================================================================== BattleHandlers::AccuracyCalcUserAbility.add(:COMPOUNDEYES, proc { |ability,mods,user,target,move,type| mods[:accuracy_multiplier] *= 1.3 } ) BattleHandlers::AccuracyCalcUserAbility.add(:HUSTLE, proc { |ability,mods,user,target,move,type| mods[:accuracy_multiplier] *= 0.8 if move.physicalMove? } ) BattleHandlers::AccuracyCalcUserAbility.add(:KEENEYE, proc { |ability,mods,user,target,move,type| mods[:evasion_stage] = 0 if mods[:evasion_stage] > 0 && Settings::MECHANICS_GENERATION >= 6 } ) BattleHandlers::AccuracyCalcUserAbility.add(:NOGUARD, proc { |ability,mods,user,target,move,type| mods[:base_accuracy] = 0 } ) BattleHandlers::AccuracyCalcUserAbility.add(:UNAWARE, proc { |ability,mods,user,target,move,type| mods[:evasion_stage] = 0 if move.damagingMove? } ) BattleHandlers::AccuracyCalcUserAbility.add(:VICTORYSTAR, proc { |ability,mods,user,target,move,type| mods[:accuracy_multiplier] *= 1.1 } ) #=============================================================================== # AccuracyCalcUserAllyAbility handlers #=============================================================================== BattleHandlers::AccuracyCalcUserAllyAbility.add(:VICTORYSTAR, proc { |ability,mods,user,target,move,type| mods[:accuracy_multiplier] *= 1.1 } ) #=============================================================================== # AccuracyCalcTargetAbility handlers #=============================================================================== BattleHandlers::AccuracyCalcTargetAbility.add(:LIGHTNINGROD, proc { |ability,mods,user,target,move,type| mods[:base_accuracy] = 0 if type == :ELECTRIC } ) BattleHandlers::AccuracyCalcTargetAbility.add(:NOGUARD, proc { |ability,mods,user,target,move,type| mods[:base_accuracy] = 0 } ) BattleHandlers::AccuracyCalcTargetAbility.add(:SANDVEIL, proc { |ability,mods,user,target,move,type| mods[:evasion_multiplier] *= 1.25 if target.battle.pbWeather == :Sandstorm } ) BattleHandlers::AccuracyCalcTargetAbility.add(:SNOWCLOAK, proc { |ability,mods,user,target,move,type| mods[:evasion_multiplier] *= 1.25 if target.battle.pbWeather == :Hail } ) BattleHandlers::AccuracyCalcTargetAbility.add(:STORMDRAIN, proc { |ability,mods,user,target,move,type| mods[:base_accuracy] = 0 if type == :WATER } ) BattleHandlers::AccuracyCalcTargetAbility.add(:TANGLEDFEET, proc { |ability,mods,user,target,move,type| mods[:accuracy_multiplier] /= 2 if target.effects[PBEffects::Confusion] > 0 } ) BattleHandlers::AccuracyCalcTargetAbility.add(:UNAWARE, proc { |ability,mods,user,target,move,type| mods[:accuracy_stage] = 0 if move.damagingMove? } ) BattleHandlers::AccuracyCalcTargetAbility.add(:WONDERSKIN, proc { |ability,mods,user,target,move,type| if move.statusMove? && user.opposes?(target) mods[:base_accuracy] = 50 if mods[:base_accuracy] > 50 end } ) #=============================================================================== # DamageCalcUserAbility handlers #=============================================================================== BattleHandlers::DamageCalcUserAbility.add(:AERILATE, proc { |ability,user,target,move,mults,baseDmg,type| mults[:base_damage_multiplier] *= 1.2 if move.powerBoost } ) BattleHandlers::DamageCalcUserAbility.copy(:AERILATE,:PIXILATE,:REFRIGERATE,:GALVANIZE) 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? mults[:base_damage_multiplier] *= 1.3 end } ) BattleHandlers::DamageCalcUserAbility.add(:BLAZE, proc { |ability,user,target,move,mults,baseDmg,type| if user.hp <= user.totalhp / 3 && type == :FIRE mults[:attack_multiplier] *= 1.5 end } ) BattleHandlers::DamageCalcUserAbility.add(:DEFEATIST, proc { |ability,user,target,move,mults,baseDmg,type| mults[:attack_multiplier] /= 2 if user.hp <= user.totalhp / 2 } ) BattleHandlers::DamageCalcUserAbility.add(:FLAREBOOST, proc { |ability,user,target,move,mults,baseDmg,type| if user.burned? && move.specialMove? mults[:base_damage_multiplier] *= 1.5 end } ) BattleHandlers::DamageCalcUserAbility.add(:FLASHFIRE, proc { |ability,user,target,move,mults,baseDmg,type| if user.effects[PBEffects::FlashFire] && type == :FIRE mults[:attack_multiplier] *= 1.5 end } ) BattleHandlers::DamageCalcUserAbility.add(:FLOWERGIFT, proc { |ability,user,target,move,mults,baseDmg,type| if move.physicalMove? && [:Sun, :HarshSun].include?(user.battle.pbWeather) mults[:attack_multiplier] *= 1.5 end } ) BattleHandlers::DamageCalcUserAbility.add(:GUTS, proc { |ability,user,target,move,mults,baseDmg,type| if user.pbHasAnyStatus? && move.physicalMove? mults[:attack_multiplier] *= 1.5 end } ) BattleHandlers::DamageCalcUserAbility.add(:HUGEPOWER, proc { |ability,user,target,move,mults,baseDmg,type| mults[:attack_multiplier] *= 2 if move.physicalMove? } ) BattleHandlers::DamageCalcUserAbility.copy(:HUGEPOWER,:PUREPOWER) BattleHandlers::DamageCalcUserAbility.add(:HUSTLE, proc { |ability,user,target,move,mults,baseDmg,type| mults[:attack_multiplier] *= 1.5 if move.physicalMove? } ) BattleHandlers::DamageCalcUserAbility.add(:IRONFIST, proc { |ability,user,target,move,mults,baseDmg,type| mults[:base_damage_multiplier] *= 1.2 if move.punchingMove? } ) BattleHandlers::DamageCalcUserAbility.add(:MEGALAUNCHER, proc { |ability,user,target,move,mults,baseDmg,type| mults[:base_damage_multiplier] *= 1.5 if move.pulseMove? } ) BattleHandlers::DamageCalcUserAbility.add(:MINUS, proc { |ability,user,target,move,mults,baseDmg,type| next if !move.specialMove? user.eachAlly do |b| next if !b.hasActiveAbility?([:MINUS, :PLUS]) mults[:attack_multiplier] *= 1.5 break end } ) BattleHandlers::DamageCalcUserAbility.copy(:MINUS,:PLUS) BattleHandlers::DamageCalcUserAbility.add(:NEUROFORCE, proc { |ability,user,target,move,mults,baseDmg,type| if Effectiveness.super_effective?(target.damageState.typeMod) mults[:final_damage_multiplier] *= 1.25 end } ) BattleHandlers::DamageCalcUserAbility.add(:OVERGROW, proc { |ability,user,target,move,mults,baseDmg,type| if user.hp <= user.totalhp / 3 && type == :GRASS mults[:attack_multiplier] *= 1.5 end } ) BattleHandlers::DamageCalcUserAbility.add(:RECKLESS, proc { |ability,user,target,move,mults,baseDmg,type| mults[:base_damage_multiplier] *= 1.2 if move.recoilMove? } ) BattleHandlers::DamageCalcUserAbility.add(:RIVALRY, proc { |ability,user,target,move,mults,baseDmg,type| if user.gender!=2 && target.gender!=2 if user.gender==target.gender mults[:base_damage_multiplier] *= 1.25 else mults[:base_damage_multiplier] *= 0.75 end end } ) BattleHandlers::DamageCalcUserAbility.add(:SANDFORCE, proc { |ability,user,target,move,mults,baseDmg,type| if user.battle.pbWeather == :Sandstorm && [:ROCK, :GROUND, :STEEL].include?(type) mults[:base_damage_multiplier] *= 1.3 end } ) BattleHandlers::DamageCalcUserAbility.add(:SHEERFORCE, proc { |ability,user,target,move,mults,baseDmg,type| mults[:base_damage_multiplier] *= 1.3 if move.addlEffect > 0 } ) BattleHandlers::DamageCalcUserAbility.add(:SLOWSTART, proc { |ability,user,target,move,mults,baseDmg,type| mults[:attack_multiplier] /= 2 if user.effects[PBEffects::SlowStart] > 0 && move.physicalMove? } ) BattleHandlers::DamageCalcUserAbility.add(:SOLARPOWER, proc { |ability,user,target,move,mults,baseDmg,type| if move.specialMove? && [:Sun, :HarshSun].include?(user.battle.pbWeather) mults[:attack_multiplier] *= 1.5 end } ) BattleHandlers::DamageCalcUserAbility.add(:SNIPER, proc { |ability,user,target,move,mults,baseDmg,type| if target.damageState.critical mults[:final_damage_multiplier] *= 1.5 end } ) BattleHandlers::DamageCalcUserAbility.add(:STAKEOUT, proc { |ability,user,target,move,mults,baseDmg,type| mults[:attack_multiplier] *= 2 if target.battle.choices[target.index][0] == :SwitchOut } ) BattleHandlers::DamageCalcUserAbility.add(:STEELWORKER, proc { |ability,user,target,move,mults,baseDmg,type| mults[:attack_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? } ) BattleHandlers::DamageCalcUserAbility.add(:SWARM, proc { |ability,user,target,move,mults,baseDmg,type| if user.hp <= user.totalhp / 3 && type == :BUG mults[:attack_multiplier] *= 1.5 end } ) BattleHandlers::DamageCalcUserAbility.add(:TECHNICIAN, proc { |ability,user,target,move,mults,baseDmg,type| if user.index != target.index && move && move.id != :STRUGGLE && baseDmg * mults[:base_damage_multiplier] <= 60 mults[:base_damage_multiplier] *= 1.5 end } ) BattleHandlers::DamageCalcUserAbility.add(:TINTEDLENS, proc { |ability,user,target,move,mults,baseDmg,type| mults[:final_damage_multiplier] *= 2 if Effectiveness.resistant?(target.damageState.typeMod) } ) BattleHandlers::DamageCalcUserAbility.add(:TORRENT, proc { |ability,user,target,move,mults,baseDmg,type| if user.hp <= user.totalhp / 3 && type == :WATER mults[:attack_multiplier] *= 1.5 end } ) BattleHandlers::DamageCalcUserAbility.add(:TOUGHCLAWS, proc { |ability,user,target,move,mults,baseDmg,type| mults[:base_damage_multiplier] *= 4 / 3.0 if move.contactMove? } ) BattleHandlers::DamageCalcUserAbility.add(:TOXICBOOST, proc { |ability,user,target,move,mults,baseDmg,type| if user.poisoned? && move.physicalMove? mults[:base_damage_multiplier] *= 1.5 end } ) BattleHandlers::DamageCalcUserAbility.add(:WATERBUBBLE, proc { |ability,user,target,move,mults,baseDmg,type| mults[:attack_multiplier] *= 2 if type == :WATER } ) #=============================================================================== # DamageCalcUserAllyAbility handlers #=============================================================================== BattleHandlers::DamageCalcUserAllyAbility.add(:BATTERY, proc { |ability,user,target,move,mults,baseDmg,type| next if !move.specialMove? mults[:final_damage_multiplier] *= 1.3 } ) BattleHandlers::DamageCalcUserAllyAbility.add(:FLOWERGIFT, proc { |ability,user,target,move,mults,baseDmg,type| if move.physicalMove? && [:Sun, :HarshSun].include?(user.battle.pbWeather) mults[:attack_multiplier] *= 1.5 end } ) #=============================================================================== # DamageCalcTargetAbility handlers #=============================================================================== BattleHandlers::DamageCalcTargetAbility.add(:DRYSKIN, proc { |ability,user,target,move,mults,baseDmg,type| mults[:base_damage_multiplier] *= 1.25 if type == :FIRE } ) BattleHandlers::DamageCalcTargetAbility.add(:FILTER, proc { |ability,user,target,move,mults,baseDmg,type| if Effectiveness.super_effective?(target.damageState.typeMod) mults[:final_damage_multiplier] *= 0.75 end } ) BattleHandlers::DamageCalcTargetAbility.copy(:FILTER,:SOLIDROCK) BattleHandlers::DamageCalcTargetAbility.add(:FLOWERGIFT, proc { |ability,user,target,move,mults,baseDmg,type| if move.specialMove? && [:Sun, :HarshSun].include?(user.battle.pbWeather) mults[:defense_multiplier] *= 1.5 end } ) BattleHandlers::DamageCalcTargetAbility.add(:FLUFFY, proc { |ability,user,target,move,mults,baseDmg,type| mults[:final_damage_multiplier] *= 2 if move.calcType == :FIRE mults[:final_damage_multiplier] /= 2 if move.contactMove? } ) BattleHandlers::DamageCalcTargetAbility.add(:FURCOAT, proc { |ability,user,target,move,mults,baseDmg,type| mults[:defense_multiplier] *= 2 if move.physicalMove? || move.function == "122" # Psyshock } ) BattleHandlers::DamageCalcTargetAbility.add(:GRASSPELT, proc { |ability,user,target,move,mults,baseDmg,type| if user.battle.field.terrain == :Grassy mults[:defense_multiplier] *= 1.5 end } ) BattleHandlers::DamageCalcTargetAbility.add(:HEATPROOF, proc { |ability,user,target,move,mults,baseDmg,type| mults[:base_damage_multiplier] /= 2 if type == :FIRE } ) BattleHandlers::DamageCalcTargetAbility.add(:MARVELSCALE, proc { |ability,user,target,move,mults,baseDmg,type| if target.pbHasAnyStatus? && move.physicalMove? mults[:defense_multiplier] *= 1.5 end } ) BattleHandlers::DamageCalcTargetAbility.add(:MULTISCALE, proc { |ability,user,target,move,mults,baseDmg,type| mults[:final_damage_multiplier] /= 2 if target.hp == target.totalhp } ) BattleHandlers::DamageCalcTargetAbility.add(:THICKFAT, proc { |ability,user,target,move,mults,baseDmg,type| mults[:base_damage_multiplier] /= 2 if type == :FIRE || type == :ICE } ) BattleHandlers::DamageCalcTargetAbility.add(:WATERBUBBLE, proc { |ability,user,target,move,mults,baseDmg,type| mults[:final_damage_multiplier] /= 2 if type == :FIRE } ) #=============================================================================== # DamageCalcTargetAbilityNonIgnorable handlers #=============================================================================== BattleHandlers::DamageCalcTargetAbilityNonIgnorable.add(:PRISMARMOR, proc { |ability,user,target,move,mults,baseDmg,type| if Effectiveness.super_effective?(target.damageState.typeMod) mults[:final_damage_multiplier] *= 0.75 end } ) BattleHandlers::DamageCalcTargetAbilityNonIgnorable.add(:SHADOWSHIELD, proc { |ability,user,target,move,mults,baseDmg,type| if target.hp==target.totalhp mults[:final_damage_multiplier] /= 2 end } ) #=============================================================================== # DamageCalcTargetAllyAbility handlers #=============================================================================== BattleHandlers::DamageCalcTargetAllyAbility.add(:FLOWERGIFT, proc { |ability,user,target,move,mults,baseDmg,type| if move.specialMove? && [:Sun, :HarshSun].include?(user.battle.pbWeather) mults[:defense_multiplier] *= 1.5 end } ) BattleHandlers::DamageCalcTargetAllyAbility.add(:FRIENDGUARD, proc { |ability,user,target,move,mults,baseDmg,type| mults[:final_damage_multiplier] *= 0.75 } ) #=============================================================================== # CriticalCalcUserAbility handlers #=============================================================================== BattleHandlers::CriticalCalcUserAbility.add(:MERCILESS, proc { |ability,user,target,c| next 99 if target.poisoned? } ) BattleHandlers::CriticalCalcUserAbility.add(:SUPERLUCK, proc { |ability,user,target,c| next c+1 } ) #=============================================================================== # CriticalCalcTargetAbility handlers #=============================================================================== BattleHandlers::CriticalCalcTargetAbility.add(:BATTLEARMOR, proc { |ability,user,target,c| next -1 } ) BattleHandlers::CriticalCalcTargetAbility.copy(:BATTLEARMOR,:SHELLARMOR) #=============================================================================== # TargetAbilityOnHit handlers #=============================================================================== BattleHandlers::TargetAbilityOnHit.add(:AFTERMATH, proc { |ability,user,target,move,battle| next if !target.fainted? next if !move.pbContactMove?(user) battle.pbShowAbilitySplash(target) if !battle.moldBreaker dampBattler = battle.pbCheckGlobalAbility(:DAMP) if dampBattler battle.pbShowAbilitySplash(dampBattler) if PokeBattle_SceneConstants::USE_ABILITY_SPLASH battle.pbDisplay(_INTL("{1} cannot use {2}!",target.pbThis,target.abilityName)) else battle.pbDisplay(_INTL("{1} cannot use {2} because of {3}'s {4}!", target.pbThis,target.abilityName,dampBattler.pbThis(true),dampBattler.abilityName)) end battle.pbHideAbilitySplash(dampBattler) battle.pbHideAbilitySplash(target) next end end if user.takesIndirectDamage?(PokeBattle_SceneConstants::USE_ABILITY_SPLASH) && user.affectedByContactEffect?(PokeBattle_SceneConstants::USE_ABILITY_SPLASH) battle.scene.pbDamageAnimation(user) user.pbReduceHP(user.totalhp/4,false) battle.pbDisplay(_INTL("{1} was caught in the aftermath!",user.pbThis)) end battle.pbHideAbilitySplash(target) } ) BattleHandlers::TargetAbilityOnHit.add(:ANGERPOINT, proc { |ability,user,target,move,battle| next if !target.damageState.critical next if !target.pbCanRaiseStatStage?(:ATTACK,target) battle.pbShowAbilitySplash(target) target.stages[:ATTACK] = 6 battle.pbCommonAnimation("StatUp",target) if PokeBattle_SceneConstants::USE_ABILITY_SPLASH battle.pbDisplay(_INTL("{1} maxed its {2}!",target.pbThis,GameData::Stat.get(:ATTACK).name)) else battle.pbDisplay(_INTL("{1}'s {2} maxed its {3}!", target.pbThis,target.abilityName,GameData::Stat.get(:ATTACK).name)) end battle.pbHideAbilitySplash(target) } ) BattleHandlers::TargetAbilityOnHit.add(:CURSEDBODY, proc { |ability,user,target,move,battle| next if user.fainted? next if user.effects[PBEffects::Disable]>0 regularMove = nil user.eachMove do |m| next if m.id!=user.lastRegularMoveUsed regularMove = m break end next if !regularMove || (regularMove.pp==0 && regularMove.total_pp>0) next if battle.pbRandom(100)>=30 battle.pbShowAbilitySplash(target) if !move.pbMoveFailedAromaVeil?(target,user,PokeBattle_SceneConstants::USE_ABILITY_SPLASH) user.effects[PBEffects::Disable] = 3 user.effects[PBEffects::DisableMove] = regularMove.id if PokeBattle_SceneConstants::USE_ABILITY_SPLASH battle.pbDisplay(_INTL("{1}'s {2} was disabled!",user.pbThis,regularMove.name)) else battle.pbDisplay(_INTL("{1}'s {2} was disabled by {3}'s {4}!", user.pbThis,regularMove.name,target.pbThis(true),target.abilityName)) end battle.pbHideAbilitySplash(target) user.pbItemStatusCureCheck end battle.pbHideAbilitySplash(target) } ) BattleHandlers::TargetAbilityOnHit.add(:CUTECHARM, proc { |ability,user,target,move,battle| next if target.fainted? next if !move.pbContactMove?(user) next if battle.pbRandom(100)>=30 battle.pbShowAbilitySplash(target) if user.pbCanAttract?(target,PokeBattle_SceneConstants::USE_ABILITY_SPLASH) && user.affectedByContactEffect?(PokeBattle_SceneConstants::USE_ABILITY_SPLASH) msg = nil if !PokeBattle_SceneConstants::USE_ABILITY_SPLASH msg = _INTL("{1}'s {2} made {3} fall in love!",target.pbThis, target.abilityName,user.pbThis(true)) end user.pbAttract(target,msg) end battle.pbHideAbilitySplash(target) } ) BattleHandlers::TargetAbilityOnHit.add(:EFFECTSPORE, proc { |ability,user,target,move,battle| # NOTE: This ability has a 30% chance of triggering, not a 30% chance of # inflicting a status condition. It can try (and fail) to inflict a # status condition that the user is immune to. next if !move.pbContactMove?(user) next if battle.pbRandom(100)>=30 r = battle.pbRandom(3) next if r==0 && user.asleep? next if r==1 && user.poisoned? next if r==2 && user.paralyzed? battle.pbShowAbilitySplash(target) if user.affectedByPowder?(PokeBattle_SceneConstants::USE_ABILITY_SPLASH) && user.affectedByContactEffect?(PokeBattle_SceneConstants::USE_ABILITY_SPLASH) case r when 0 if user.pbCanSleep?(target,PokeBattle_SceneConstants::USE_ABILITY_SPLASH) msg = nil if !PokeBattle_SceneConstants::USE_ABILITY_SPLASH msg = _INTL("{1}'s {2} made {3} fall asleep!",target.pbThis, target.abilityName,user.pbThis(true)) end user.pbSleep(msg) end when 1 if user.pbCanPoison?(target,PokeBattle_SceneConstants::USE_ABILITY_SPLASH) msg = nil if !PokeBattle_SceneConstants::USE_ABILITY_SPLASH msg = _INTL("{1}'s {2} poisoned {3}!",target.pbThis, target.abilityName,user.pbThis(true)) end user.pbPoison(target,msg) end when 2 if user.pbCanParalyze?(target,PokeBattle_SceneConstants::USE_ABILITY_SPLASH) msg = nil if !PokeBattle_SceneConstants::USE_ABILITY_SPLASH msg = _INTL("{1}'s {2} paralyzed {3}! It may be unable to move!", target.pbThis,target.abilityName,user.pbThis(true)) end user.pbParalyze(target,msg) end end end battle.pbHideAbilitySplash(target) } ) BattleHandlers::TargetAbilityOnHit.add(:FLAMEBODY, proc { |ability,user,target,move,battle| next if !move.pbContactMove?(user) next if user.burned? || battle.pbRandom(100)>=30 battle.pbShowAbilitySplash(target) if user.pbCanBurn?(target,PokeBattle_SceneConstants::USE_ABILITY_SPLASH) && user.affectedByContactEffect?(PokeBattle_SceneConstants::USE_ABILITY_SPLASH) msg = nil if !PokeBattle_SceneConstants::USE_ABILITY_SPLASH msg = _INTL("{1}'s {2} burned {3}!",target.pbThis,target.abilityName,user.pbThis(true)) end user.pbBurn(target,msg) end battle.pbHideAbilitySplash(target) } ) BattleHandlers::TargetAbilityOnHit.add(:GOOEY, proc { |ability,user,target,move,battle| next if !move.pbContactMove?(user) user.pbLowerStatStageByAbility(:SPEED,1,target,true,true,GameData::Ability.get(ability).real_name) } ) BattleHandlers::TargetAbilityOnHit.copy(:GOOEY,:TANGLINGHAIR) BattleHandlers::TargetAbilityOnHit.add(:ILLUSION, proc { |ability,user,target,move,battle| # NOTE: This intentionally doesn't show the ability splash. next if !target.effects[PBEffects::Illusion] target.effects[PBEffects::Illusion] = nil battle.scene.pbChangePokemon(target,target.pokemon) battle.pbDisplay(_INTL("{1}'s illusion wore off!",target.pbThis)) battle.pbSetSeen(target) } ) BattleHandlers::TargetAbilityOnHit.add(:INNARDSOUT, proc { |ability,user,target,move,battle| next if !target.fainted? || user.dummy battle.pbShowAbilitySplash(target) if user.takesIndirectDamage?(PokeBattle_SceneConstants::USE_ABILITY_SPLASH) battle.scene.pbDamageAnimation(user) user.pbReduceHP(target.damageState.hpLost,false) if PokeBattle_SceneConstants::USE_ABILITY_SPLASH battle.pbDisplay(_INTL("{1} is hurt!",user.pbThis)) else battle.pbDisplay(_INTL("{1} is hurt by {2}'s {3}!",user.pbThis, target.pbThis(true),target.abilityName)) end end battle.pbHideAbilitySplash(target) } ) BattleHandlers::TargetAbilityOnHit.add(:IRONBARBS, proc { |ability,user,target,move,battle| next if !move.pbContactMove?(user) battle.pbShowAbilitySplash(target) if user.takesIndirectDamage?(PokeBattle_SceneConstants::USE_ABILITY_SPLASH) && user.affectedByContactEffect?(PokeBattle_SceneConstants::USE_ABILITY_SPLASH) battle.scene.pbDamageAnimation(user) user.pbReduceHP(user.totalhp/8,false) if PokeBattle_SceneConstants::USE_ABILITY_SPLASH battle.pbDisplay(_INTL("{1} is hurt!",user.pbThis)) else battle.pbDisplay(_INTL("{1} is hurt by {2}'s {3}!",user.pbThis, target.pbThis(true),target.abilityName)) end end battle.pbHideAbilitySplash(target) } ) BattleHandlers::TargetAbilityOnHit.copy(:IRONBARBS,:ROUGHSKIN) BattleHandlers::TargetAbilityOnHit.add(:JUSTIFIED, proc { |ability,user,target,move,battle| next if move.calcType != :DARK target.pbRaiseStatStageByAbility(:ATTACK,1,target,GameData::Ability.get(ability).real_name) } ) BattleHandlers::TargetAbilityOnHit.add(:MUMMY, proc { |ability,user,target,move,battle| next if !move.pbContactMove?(user) next if user.fainted? next if user.unstoppableAbility? || user.ability == ability oldAbil = nil battle.pbShowAbilitySplash(target) if user.opposes?(target) if user.affectedByContactEffect?(PokeBattle_SceneConstants::USE_ABILITY_SPLASH) oldAbil = user.ability battle.pbShowAbilitySplash(user,true,false) if user.opposes?(target) user.ability = ability battle.pbReplaceAbilitySplash(user) if user.opposes?(target) if PokeBattle_SceneConstants::USE_ABILITY_SPLASH battle.pbDisplay(_INTL("{1}'s Ability became {2}!",user.pbThis,user.abilityName)) else battle.pbDisplay(_INTL("{1}'s Ability became {2} because of {3}!", user.pbThis,user.abilityName,target.pbThis(true))) end battle.pbHideAbilitySplash(user) if user.opposes?(target) end battle.pbHideAbilitySplash(target) if user.opposes?(target) user.pbOnAbilityChanged(oldAbil) if oldAbil != nil } ) BattleHandlers::TargetAbilityOnHit.add(:POISONPOINT, proc { |ability,user,target,move,battle| next if !move.pbContactMove?(user) next if user.poisoned? || battle.pbRandom(100)>=30 battle.pbShowAbilitySplash(target) if user.pbCanPoison?(target,PokeBattle_SceneConstants::USE_ABILITY_SPLASH) && user.affectedByContactEffect?(PokeBattle_SceneConstants::USE_ABILITY_SPLASH) msg = nil if !PokeBattle_SceneConstants::USE_ABILITY_SPLASH msg = _INTL("{1}'s {2} poisoned {3}!",target.pbThis,target.abilityName,user.pbThis(true)) end user.pbPoison(target,msg) end battle.pbHideAbilitySplash(target) } ) BattleHandlers::TargetAbilityOnHit.add(:RATTLED, proc { |ability,user,target,move,battle| next if ![:BUG, :DARK, :GHOST].include?(move.calcType) target.pbRaiseStatStageByAbility(:SPEED,1,target,GameData::Ability.get(ability).real_name) } ) BattleHandlers::TargetAbilityOnHit.add(:STAMINA, proc { |ability,user,target,move,battle| target.pbRaiseStatStageByAbility(:DEFENSE,1,target,GameData::Ability.get(ability).real_name) } ) BattleHandlers::TargetAbilityOnHit.add(:STATIC, proc { |ability,user,target,move,battle| next if !move.pbContactMove?(user) next if user.paralyzed? || battle.pbRandom(100)>=30 battle.pbShowAbilitySplash(target) if user.pbCanParalyze?(target,PokeBattle_SceneConstants::USE_ABILITY_SPLASH) && user.affectedByContactEffect?(PokeBattle_SceneConstants::USE_ABILITY_SPLASH) msg = nil if !PokeBattle_SceneConstants::USE_ABILITY_SPLASH msg = _INTL("{1}'s {2} paralyzed {3}! It may be unable to move!", target.pbThis,target.abilityName,user.pbThis(true)) end user.pbParalyze(target,msg) end battle.pbHideAbilitySplash(target) } ) BattleHandlers::TargetAbilityOnHit.add(:WATERCOMPACTION, proc { |ability,user,target,move,battle| next if move.calcType != :WATER target.pbRaiseStatStageByAbility(:DEFENSE,2,target,GameData::Ability.get(ability).real_name) } ) BattleHandlers::TargetAbilityOnHit.add(:WEAKARMOR, proc { |ability,user,target,move,battle| next if !move.physicalMove? next if !target.pbCanLowerStatStage?(:DEFENSE, target) && !target.pbCanRaiseStatStage?(:SPEED, target) battle.pbShowAbilitySplash(target) target.pbLowerStatStageByAbility(:DEFENSE, 1, target, false,GameData::Ability.get(ability).real_name) target.pbRaiseStatStageByAbility(:SPEED, (Settings::MECHANICS_GENERATION >= 7) ? 2 : 1, target, false,GameData::Ability.get(ability).real_name) battle.pbHideAbilitySplash(target) } ) #=============================================================================== # UserAbilityOnHit handlers #=============================================================================== BattleHandlers::UserAbilityOnHit.add(:POISONTOUCH, proc { |ability,user,target,move,battle| next if !move.contactMove? next if battle.pbRandom(100)>=30 battle.pbShowAbilitySplash(user) if target.hasActiveAbility?(:SHIELDDUST) && !battle.moldBreaker battle.pbShowAbilitySplash(target) if !PokeBattle_SceneConstants::USE_ABILITY_SPLASH battle.pbDisplay(_INTL("{1} is unaffected!",target.pbThis)) end battle.pbHideAbilitySplash(target) elsif target.pbCanPoison?(user,PokeBattle_SceneConstants::USE_ABILITY_SPLASH) msg = nil if !PokeBattle_SceneConstants::USE_ABILITY_SPLASH msg = _INTL("{1}'s {2} poisoned {3}!",user.pbThis,user.abilityName,target.pbThis(true)) end target.pbPoison(user,msg) end battle.pbHideAbilitySplash(user) } ) #=============================================================================== # UserAbilityEndOfMove handlers #=============================================================================== BattleHandlers::UserAbilityEndOfMove.add(:BEASTBOOST, 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 userStats = user.plainStats highestStatValue = 0 userStats.each_value { |value| highestStatValue = value if highestStatValue < value } GameData::Stat.each_main_battle do |s| next if userStats[s.id] < highestStatValue if user.pbCanRaiseStatStage?(s.id, user) user.pbRaiseStatStageByAbility(s.id, numFainted, user,GameData::Ability.get(ability).real_name) end break end } ) BattleHandlers::UserAbilityEndOfMove.add(:MAGICIAN, proc { |ability,user,targets,move,battle| next if battle.futureSight next if !move.pbDamagingMove? next if user.item next if battle.wildBattle? && user.opposes? targets.each do |b| next if b.damageState.unaffected || b.damageState.substitute next if !b.item next if b.unlosableItem?(b.item) || user.unlosableItem?(b.item) battle.pbShowAbilitySplash(user) if b.hasActiveAbility?(:STICKYHOLD) battle.pbShowAbilitySplash(b) if user.opposes?(b) if PokeBattle_SceneConstants::USE_ABILITY_SPLASH battle.pbDisplay(_INTL("{1}'s item cannot be stolen!",b.pbThis)) end battle.pbHideAbilitySplash(b) if user.opposes?(b) next end user.item = b.item b.item = nil b.effects[PBEffects::Unburden] = true if battle.wildBattle? && !user.initialItem && b.initialItem==user.item user.setInitialItem(user.item) b.setInitialItem(nil) end if PokeBattle_SceneConstants::USE_ABILITY_SPLASH battle.pbDisplay(_INTL("{1} stole {2}'s {3}!",user.pbThis, b.pbThis(true),user.itemName)) else battle.pbDisplay(_INTL("{1} stole {2}'s {3} with {4}!",user.pbThis, b.pbThis(true),user.itemName,user.abilityName)) end battle.pbHideAbilitySplash(user) user.pbHeldItemTriggerCheck break end } ) BattleHandlers::UserAbilityEndOfMove.add(:MOXIE, 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.pbRaiseStatStageByAbility(:ATTACK,numFainted,user,GameData::Ability.get(ability).real_name) } ) #=============================================================================== # TargetAbilityAfterMoveUse handlers #=============================================================================== BattleHandlers::TargetAbilityAfterMoveUse.add(:BERSERK, proc { |ability,target,user,move,switched,battle| next if !move.damagingMove? next if target.damageState.initialHP=target.totalhp/2 next if !target.pbCanRaiseStatStage?(:SPECIAL_ATTACK,target) target.pbRaiseStatStageByAbility(:SPECIAL_ATTACK,1,target,GameData::Ability.get(ability).real_name) } ) BattleHandlers::TargetAbilityAfterMoveUse.add(:COLORCHANGE, proc { |ability,target,user,move,switched,battle| next if target.damageState.calcDamage==0 || target.damageState.substitute next if !move.calcType || GameData::Type.get(move.calcType).pseudo_type next if target.pbHasType?(move.calcType) && !target.pbHasOtherType?(move.calcType) typeName = GameData::Type.get(move.calcType).name battle.pbShowAbilitySplash(target) target.pbChangeTypes(move.calcType) battle.pbDisplay(_INTL("{1}'s {2} made it the {3} type!",target.pbThis, target.abilityName,typeName)) battle.pbHideAbilitySplash(target) } ) BattleHandlers::TargetAbilityAfterMoveUse.add(:PICKPOCKET, proc { |ability,target,user,move,switched,battle| # NOTE: According to Bulbapedia, this can still trigger to steal the user's # item even if it was switched out by a Red Card. This doesn't make # sense, so this code doesn't do it. next if battle.wildBattle? && target.opposes? next if !move.contactMove? next if switched.include?(user.index) next if user.effects[PBEffects::Substitute]>0 || target.damageState.substitute next if target.item || !user.item next if user.unlosableItem?(user.item) || target.unlosableItem?(user.item) battle.pbShowAbilitySplash(target) if user.hasActiveAbility?(:STICKYHOLD) battle.pbShowAbilitySplash(user) if target.opposes?(user) if PokeBattle_SceneConstants::USE_ABILITY_SPLASH battle.pbDisplay(_INTL("{1}'s item cannot be stolen!",user.pbThis)) end battle.pbHideAbilitySplash(user) if target.opposes?(user) battle.pbHideAbilitySplash(target) next end target.item = user.item user.item = nil user.effects[PBEffects::Unburden] = true if battle.wildBattle? && !target.initialItem && user.initialItem==target.item target.setInitialItem(target.item) user.setInitialItem(nil) end battle.pbDisplay(_INTL("{1} pickpocketed {2}'s {3}!",target.pbThis, user.pbThis(true),target.itemName)) battle.pbHideAbilitySplash(target) target.pbHeldItemTriggerCheck } ) #=============================================================================== # EORWeatherAbility handlers #=============================================================================== BattleHandlers::EORWeatherAbility.add(:DRYSKIN, proc { |ability,weather,battler,battle| case weather when :Sun, :HarshSun battle.pbShowAbilitySplash(battler) battle.scene.pbDamageAnimation(battler) battler.pbReduceHP(battler.totalhp/8,false) battle.pbDisplay(_INTL("{1} was hurt by the sunlight!",battler.pbThis)) battle.pbHideAbilitySplash(battler) battler.pbItemHPHealCheck when :Rain, :HeavyRain next if !battler.canHeal? battle.pbShowAbilitySplash(battler) battler.pbRecoverHP(battler.totalhp/8) if PokeBattle_SceneConstants::USE_ABILITY_SPLASH battle.pbDisplay(_INTL("{1}'s HP was restored.",battler.pbThis)) else battle.pbDisplay(_INTL("{1}'s {2} restored its HP.",battler.pbThis,battler.abilityName)) end battle.pbHideAbilitySplash(battler) end } ) BattleHandlers::EORWeatherAbility.add(:ICEBODY, proc { |ability,weather,battler,battle| next unless weather == :Hail next if !battler.canHeal? battle.pbShowAbilitySplash(battler) battler.pbRecoverHP(battler.totalhp/16) if PokeBattle_SceneConstants::USE_ABILITY_SPLASH battle.pbDisplay(_INTL("{1}'s HP was restored.",battler.pbThis)) else battle.pbDisplay(_INTL("{1}'s {2} restored its HP.",battler.pbThis,battler.abilityName)) end battle.pbHideAbilitySplash(battler) } ) BattleHandlers::EORWeatherAbility.add(:RAINDISH, proc { |ability,weather,battler,battle| next unless [:Rain, :HeavyRain].include?(weather) next if !battler.canHeal? battle.pbShowAbilitySplash(battler) battler.pbRecoverHP(battler.totalhp/16) if PokeBattle_SceneConstants::USE_ABILITY_SPLASH battle.pbDisplay(_INTL("{1}'s HP was restored.",battler.pbThis)) else battle.pbDisplay(_INTL("{1}'s {2} restored its HP.",battler.pbThis,battler.abilityName)) end battle.pbHideAbilitySplash(battler) } ) BattleHandlers::EORWeatherAbility.add(:SOLARPOWER, proc { |ability,weather,battler,battle| next unless [:Sun, :HarshSun].include?(weather) battle.pbShowAbilitySplash(battler) battle.scene.pbDamageAnimation(battler) battler.pbReduceHP(battler.totalhp/8,false) battle.pbDisplay(_INTL("{1} was hurt by the sunlight!",battler.pbThis)) battle.pbHideAbilitySplash(battler) battler.pbItemHPHealCheck } ) #=============================================================================== # EORHealingAbility handlers #=============================================================================== BattleHandlers::EORHealingAbility.add(:HEALER, proc { |ability,battler,battle| next unless battle.pbRandom(100)<30 battler.eachAlly do |b| next if b.status == :NONE battle.pbShowAbilitySplash(battler) oldStatus = b.status b.pbCureStatus(PokeBattle_SceneConstants::USE_ABILITY_SPLASH) if !PokeBattle_SceneConstants::USE_ABILITY_SPLASH case oldStatus when :SLEEP battle.pbDisplay(_INTL("{1}'s {2} woke its partner up!",battler.pbThis,battler.abilityName)) when :POISON battle.pbDisplay(_INTL("{1}'s {2} cured its partner's poison!",battler.pbThis,battler.abilityName)) when :BURN battle.pbDisplay(_INTL("{1}'s {2} healed its partner's burn!",battler.pbThis,battler.abilityName)) when :PARALYSIS battle.pbDisplay(_INTL("{1}'s {2} cured its partner's paralysis!",battler.pbThis,battler.abilityName)) when :FROZEN battle.pbDisplay(_INTL("{1}'s {2} defrosted its partner!",battler.pbThis,battler.abilityName)) end end battle.pbHideAbilitySplash(battler) end } ) BattleHandlers::EORHealingAbility.add(:HYDRATION, proc { |ability,battler,battle| next if battler.status == :NONE next if ![:Rain, :HeavyRain].include?(battle.pbWeather) battle.pbShowAbilitySplash(battler) oldStatus = battler.status battler.pbCureStatus(PokeBattle_SceneConstants::USE_ABILITY_SPLASH) if !PokeBattle_SceneConstants::USE_ABILITY_SPLASH case oldStatus when :SLEEP battle.pbDisplay(_INTL("{1}'s {2} woke it up!",battler.pbThis,battler.abilityName)) when :POISON battle.pbDisplay(_INTL("{1}'s {2} cured its poison!",battler.pbThis,battler.abilityName)) when :BURN battle.pbDisplay(_INTL("{1}'s {2} healed its burn!",battler.pbThis,battler.abilityName)) when :PARALYSIS battle.pbDisplay(_INTL("{1}'s {2} cured its paralysis!",battler.pbThis,battler.abilityName)) when :FROZEN battle.pbDisplay(_INTL("{1}'s {2} defrosted it!",battler.pbThis,battler.abilityName)) end end battle.pbHideAbilitySplash(battler) } ) BattleHandlers::EORHealingAbility.add(:SHEDSKIN, proc { |ability,battler,battle| next if battler.status == :NONE next unless battle.pbRandom(100)<30 battle.pbShowAbilitySplash(battler) oldStatus = battler.status battler.pbCureStatus(PokeBattle_SceneConstants::USE_ABILITY_SPLASH) if !PokeBattle_SceneConstants::USE_ABILITY_SPLASH case oldStatus when :SLEEP battle.pbDisplay(_INTL("{1}'s {2} woke it up!",battler.pbThis,battler.abilityName)) when :POISON battle.pbDisplay(_INTL("{1}'s {2} cured its poison!",battler.pbThis,battler.abilityName)) when :BURN battle.pbDisplay(_INTL("{1}'s {2} healed its burn!",battler.pbThis,battler.abilityName)) when :PARALYSIS battle.pbDisplay(_INTL("{1}'s {2} cured its paralysis!",battler.pbThis,battler.abilityName)) when :FROZEN battle.pbDisplay(_INTL("{1}'s {2} defrosted it!",battler.pbThis,battler.abilityName)) end end battle.pbHideAbilitySplash(battler) } ) #=============================================================================== # EOREffectAbility handlers #=============================================================================== BattleHandlers::EOREffectAbility.add(:BADDREAMS, proc { |ability,battler,battle| battle.eachOtherSideBattler(battler.index) do |b| next if !b.near?(battler) || !b.asleep? battle.pbShowAbilitySplash(battler) next if !b.takesIndirectDamage?(PokeBattle_SceneConstants::USE_ABILITY_SPLASH) oldHP = b.hp b.pbReduceHP(b.totalhp/8) if PokeBattle_SceneConstants::USE_ABILITY_SPLASH battle.pbDisplay(_INTL("{1} is tormented!",b.pbThis)) else battle.pbDisplay(_INTL("{1} is tormented by {2}'s {3}!",b.pbThis, battler.pbThis(true),battler.abilityName)) end battle.pbHideAbilitySplash(battler) b.pbItemHPHealCheck b.pbAbilitiesOnDamageTaken(oldHP) b.pbFaint if b.fainted? end } ) BattleHandlers::EOREffectAbility.add(:MOODY, proc { |ability,battler,battle| randomUp = [] randomDown = [] GameData::Stat.each_battle do |s| randomUp.push(s.id) if battler.pbCanRaiseStatStage?(s.id, battler) randomDown.push(s.id) if battler.pbCanLowerStatStage?(s.id, battler) end next if randomUp.length==0 && randomDown.length==0 battle.pbShowAbilitySplash(battler) if randomUp.length>0 r = battle.pbRandom(randomUp.length) battler.pbRaiseStatStageByAbility(randomUp[r],2,battler,false,GameData::Ability.get(ability).real_name) randomDown.delete(randomUp[r]) end if randomDown.length>0 r = battle.pbRandom(randomDown.length) battler.pbLowerStatStageByAbility(randomDown[r],1,battler,false,GameData::Ability.get(ability).real_name) end battle.pbHideAbilitySplash(battler) battler.pbItemStatRestoreCheck if randomDown.length>0 } ) BattleHandlers::EOREffectAbility.add(:SPEEDBOOST, proc { |ability,battler,battle| # A Pokémon's turnCount is 0 if it became active after the beginning of a # round if battler.turnCount>0 && battler.pbCanRaiseStatStage?(:SPEED,battler) ability_name = GameData::Ability.get(ability).real_name battler.pbRaiseStatStageByAbility(:SPEED,1,battler,true,ability_name) end } ) #=============================================================================== # EORGainItemAbility handlers #=============================================================================== BattleHandlers::EORGainItemAbility.add(:HARVEST, proc { |ability,battler,battle| next if battler.item next if !battler.recycleItem || !GameData::Item.get(battler.recycleItem).is_berry? if ![:Sun, :HarshSun].include?(battle.pbWeather) next unless battle.pbRandom(100)<50 end battle.pbShowAbilitySplash(battler) battler.item = battler.recycleItem battler.setRecycleItem(nil) battler.setInitialItem(battler.item) if !battler.initialItem battle.pbDisplay(_INTL("{1} harvested one {2}!",battler.pbThis,battler.itemName)) battle.pbHideAbilitySplash(battler) battler.pbHeldItemTriggerCheck } ) BattleHandlers::EORGainItemAbility.add(:PICKUP, proc { |ability,battler,battle| next if battler.item foundItem = nil; fromBattler = nil; use = 0 battle.eachBattler do |b| next if b.index==battler.index next if b.effects[PBEffects::PickupUse]<=use foundItem = b.effects[PBEffects::PickupItem] fromBattler = b use = b.effects[PBEffects::PickupUse] end next if !foundItem battle.pbShowAbilitySplash(battler) battler.item = foundItem fromBattler.effects[PBEffects::PickupItem] = nil fromBattler.effects[PBEffects::PickupUse] = 0 fromBattler.setRecycleItem(nil) if fromBattler.recycleItem==foundItem if battle.wildBattle? && !battler.initialItem && fromBattler.initialItem==foundItem battler.setInitialItem(foundItem) fromBattler.setInitialItem(nil) end battle.pbDisplay(_INTL("{1} found one {2}!",battler.pbThis,battler.itemName)) battle.pbHideAbilitySplash(battler) battler.pbHeldItemTriggerCheck } ) #=============================================================================== # CertainSwitchingUserAbility handlers #=============================================================================== # There aren't any! #=============================================================================== # TrappingTargetAbility handlers #=============================================================================== BattleHandlers::TrappingTargetAbility.add(:ARENATRAP, proc { |ability,switcher,bearer,battle| next true if !switcher.airborne? } ) BattleHandlers::TrappingTargetAbility.add(:MAGNETPULL, proc { |ability,switcher,bearer,battle| next true if switcher.pbHasType?(:STEEL) } ) BattleHandlers::TrappingTargetAbility.add(:SHADOWTAG, proc { |ability,switcher,bearer,battle| next true if !switcher.hasActiveAbility?(:SHADOWTAG) } ) #=============================================================================== # AbilityOnSwitchIn handlers #=============================================================================== BattleHandlers::AbilityOnSwitchIn.add(:AIRLOCK, proc { |ability,battler,battle| battle.pbShowAbilitySplash(battler) if !PokeBattle_SceneConstants::USE_ABILITY_SPLASH battle.pbDisplay(_INTL("{1} has {2}!",battler.pbThis,battler.abilityName)) end battle.pbDisplay(_INTL("The effects of the weather disappeared.")) battle.pbHideAbilitySplash(battler) } ) BattleHandlers::AbilityOnSwitchIn.copy(:AIRLOCK,:CLOUDNINE) BattleHandlers::AbilityOnSwitchIn.add(:ANTICIPATION, proc { |ability,battler,battle| next if !battler.pbOwnedByPlayer? battlerTypes = battler.pbTypes(true) type1 = battlerTypes[0] type2 = battlerTypes[1] || type1 type3 = battlerTypes[2] || type2 found = false battle.eachOtherSideBattler(battler.index) do |b| b.eachMove do |m| next if m.statusMove? if type1 moveType = m.type if Settings::MECHANICS_GENERATION >= 6 && m.function == "090" # Hidden Power moveType = pbHiddenPower(b.pokemon)[0] end eff = Effectiveness.calculate(moveType,type1,type2,type3) next if Effectiveness.ineffective?(eff) next if !Effectiveness.super_effective?(eff) && m.function != "070" # OHKO else next if m.function != "070" # OHKO end found = true break end break if found end if found battle.pbShowAbilitySplash(battler) battle.pbDisplay(_INTL("{1} shuddered with anticipation!",battler.pbThis)) battle.pbHideAbilitySplash(battler) end } ) BattleHandlers::AbilityOnSwitchIn.add(:AURABREAK, proc { |ability,battler,battle| battle.pbShowAbilitySplash(battler) battle.pbDisplay(_INTL("{1} reversed all other Pokémon's auras!",battler.pbThis)) battle.pbHideAbilitySplash(battler) } ) BattleHandlers::AbilityOnSwitchIn.add(:COMATOSE, proc { |ability,battler,battle| battle.pbShowAbilitySplash(battler) battle.pbDisplay(_INTL("{1} is drowsing!",battler.pbThis)) battle.pbHideAbilitySplash(battler) } ) BattleHandlers::AbilityOnSwitchIn.add(:DARKAURA, proc { |ability,battler,battle| battle.pbShowAbilitySplash(battler) battle.pbDisplay(_INTL("{1} is radiating a dark aura!",battler.pbThis)) battle.pbHideAbilitySplash(battler) } ) BattleHandlers::AbilityOnSwitchIn.add(:DELTASTREAM, proc { |ability,battler,battle| pbBattleWeatherAbility(:StrongWinds, battler, battle, true) } ) BattleHandlers::AbilityOnSwitchIn.add(:DESOLATELAND, proc { |ability,battler,battle| pbBattleWeatherAbility(:HarshSun, battler, battle, true) } ) BattleHandlers::AbilityOnSwitchIn.add(:DOWNLOAD, proc { |ability,battler,battle| oDef = oSpDef = 0 battle.eachOtherSideBattler(battler.index) do |b| oDef += b.defense oSpDef += b.spdef end stat = (oDef