Files
infinitefusion-e18/Data/Scripts/012_Battle/008_BattleHandlers_Items.rb

1586 lines
54 KiB
Ruby

#===============================================================================
# SpeedCalcItem handlers
#===============================================================================
BattleHandlers::SpeedCalcItem.add(:CHOICESCARF,
proc { |item,battler,mult|
next (mult*1.5).round
}
)
BattleHandlers::SpeedCalcItem.add(:MACHOBRACE,
proc { |item,battler,mult|
next mult/2
}
)
BattleHandlers::SpeedCalcItem.copy(:MACHOBRACE,:POWERANKLET,:POWERBAND,
:POWERBELT,:POWERBRACER,
:POWERLENS,:POWERWEIGHT)
BattleHandlers::SpeedCalcItem.add(:QUICKPOWDER,
proc { |item,battler,mult|
next mult*2 if battler.isSpecies?(:DITTO) &&
!battler.effects[PBEffects::Transform]
}
)
BattleHandlers::SpeedCalcItem.add(:IRONBALL,
proc { |item,battler,mult|
next mult/2
}
)
#===============================================================================
# WeightCalcItem handlers
#===============================================================================
BattleHandlers::WeightCalcItem.add(:FLOATSTONE,
proc { |item,battler,w|
next [w/2,1].max
}
)
#===============================================================================
# HPHealItem handlers
#===============================================================================
BattleHandlers::HPHealItem.add(:AGUAVBERRY,
proc { |item,battler,battle,forced|
next pbBattleConfusionBerry(battler,battle,item,forced,4,
_INTL("For {1}, the {2} was too bitter!",battler.pbThis(true),PBItems.getName(item)))
}
)
BattleHandlers::HPHealItem.add(:APICOTBERRY,
proc { |item,battler,battle,forced|
next pbBattleStatIncreasingBerry(battler,battle,item,forced,PBStats::SPDEF)
}
)
BattleHandlers::HPHealItem.add(:BERRYJUICE,
proc { |item,battler,battle,forced|
next false if !forced && battler.hp>battler.totalhp/2
itemName = PBItems.getName(item)
PBDebug.log("[Item triggered] #{battler.pbThis}'s #{itemName}") if forced
battle.pbCommonAnimation("UseItem",battler) if !forced
battler.pbRecoverHP(20)
if forced
battle.pbDisplay(_INTL("{1}'s HP was restored.",battler.pbThis))
else
battle.pbDisplay(_INTL("{1} restored its health using its {2}!",battler.pbThis,
itemName))
end
next true
}
)
BattleHandlers::HPHealItem.add(:FIGYBERRY,
proc { |item,battler,battle,forced|
next pbBattleConfusionBerry(battler,battle,item,forced,0,
_INTL("For {1}, the {2} was too spicy!",battler.pbThis(true),PBItems.getName(item)))
}
)
BattleHandlers::HPHealItem.add(:GANLONBERRY,
proc { |item,battler,battle,forced|
next pbBattleStatIncreasingBerry(battler,battle,item,forced,PBStats::DEFENSE)
}
)
BattleHandlers::HPHealItem.add(:IAPAPABERRY,
proc { |item,battler,battle,forced|
next pbBattleConfusionBerry(battler,battle,item,forced,1,
_INTL("For {1}, the {2} was too sour!",battler.pbThis(true),PBItems.getName(item)))
}
)
BattleHandlers::HPHealItem.add(:LANSATBERRY,
proc { |item,battler,battle,forced|
next false if !forced && !battler.pbCanConsumeBerry?(item)
next false if battler.effects[PBEffects::FocusEnergy]>=2
battle.pbCommonAnimation("EatBerry",battler) if !forced
battler.effects[PBEffects::FocusEnergy] = 2
itemName = PBItems.getName(item)
battle.pbDisplay(_INTL("{1} used its {2} to get pumped!",battler.pbThis,itemName))
next true
}
)
BattleHandlers::HPHealItem.add(:LIECHIBERRY,
proc { |item,battler,battle,forced|
next pbBattleStatIncreasingBerry(battler,battle,item,forced,PBStats::ATTACK)
}
)
BattleHandlers::HPHealItem.add(:MAGOBERRY,
proc { |item,battler,battle,forced|
next pbBattleConfusionBerry(battler,battle,item,forced,2,
_INTL("For {1}, the {2} was too sweet!",battler.pbThis(true),PBItems.getName(item)))
}
)
BattleHandlers::HPHealItem.add(:MICLEBERRY,
proc { |item,battler,battle,forced|
next false if !forced && !battler.pbCanConsumeBerry?(item)
next false if !battler.effects[PBEffects::MicleBerry]
battle.pbCommonAnimation("EatBerry",battler) if !forced
battler.effects[PBEffects::MicleBerry] = true
itemName = PBItems.getName(item)
if forced
PBDebug.log("[Item triggered] #{battler.pbThis}'s #{itemName}")
battle.pbDisplay(_INTL("{1} boosted the accuracy of its next move!",battler.pbThis))
else
battle.pbDisplay(_INTL("{1} boosted the accuracy of its next move using its {2}!",
battler.pbThis,itemName))
end
next true
}
)
BattleHandlers::HPHealItem.add(:ORANBERRY,
proc { |item,battler,battle,forced|
next false if !forced && battle.pbCheckOpposingAbility(:UNNERVE,battler.index)
next false if !forced && battler.hp>battler.totalhp/2
battle.pbCommonAnimation("EatBerry",battler) if !forced
battler.pbRecoverHP(10)
itemName = PBItems.getName(item)
if forced
PBDebug.log("[Item triggered] #{battler.pbThis}'s #{itemName}")
battle.pbDisplay(_INTL("{1}'s HP was restored.",battler.pbThis))
else
battle.pbDisplay(_INTL("{1} restored a little HP using its {2}!",battler.pbThis,
itemName))
end
next true
}
)
BattleHandlers::HPHealItem.add(:PETAYABERRY,
proc { |item,battler,battle,forced|
next pbBattleStatIncreasingBerry(battler,battle,item,forced,PBStats::SPATK)
}
)
BattleHandlers::HPHealItem.add(:SALACBERRY,
proc { |item,battler,battle,forced|
next pbBattleStatIncreasingBerry(battler,battle,item,forced,PBStats::SPEED)
}
)
BattleHandlers::HPHealItem.add(:SITRUSBERRY,
proc { |item,battler,battle,forced|
next false if !forced && battle.pbCheckOpposingAbility(:UNNERVE,battler.index)
next false if !forced && battler.hp>battler.totalhp/2
battle.pbCommonAnimation("EatBerry",battler) if !forced
battler.pbRecoverHP(battler.totalhp/4)
itemName = PBItems.getName(item)
if forced
PBDebug.log("[Item triggered] #{battler.pbThis}'s #{itemName}")
battle.pbDisplay(_INTL("{1}'s HP was restored.",battler.pbThis))
else
battle.pbDisplay(_INTL("{1} restored its health using its {2}!",battler.pbThis,
itemName))
end
next true
}
)
BattleHandlers::HPHealItem.add(:STARFBERRY,
proc { |item,battler,battle,forced|
stats = []
PBStats.eachMainBattleStat { |s| stats.push(s) if battler.pbCanRaiseStatStage?(s,battler) }
next false if stats.length==0
stat = stats[battle.pbRandom(stats.length)]
next pbBattleStatIncreasingBerry(battler,battle,item,forced,stat,2)
}
)
BattleHandlers::HPHealItem.add(:WIKIBERRY,
proc { |item,battler,battle,forced|
next pbBattleConfusionBerry(battler,battle,item,forced,3,
_INTL("For {1}, the {2} was too dry!",battler.pbThis(true),PBItems.getName(item)))
}
)
#===============================================================================
# StatusCureItem handlers
#===============================================================================
BattleHandlers::StatusCureItem.add(:ASPEARBERRY,
proc { |item,battler,battle,forced|
next false if !forced && battle.pbCheckOpposingAbility(:UNNERVE,battler.index)
next false if battler.status!=PBStatuses::FROZEN
itemName = PBItems.getName(item)
PBDebug.log("[Item triggered] #{battler.pbThis}'s #{itemName}") if forced
battle.pbCommonAnimation("EatBerry",battler) if !forced
battler.pbCureStatus(forced)
battle.pbDisplay(_INTL("{1}'s {2} defrosted it!",battler.pbThis,itemName)) if !forced
next true
}
)
BattleHandlers::StatusCureItem.add(:CHERIBERRY,
proc { |item,battler,battle,forced|
next false if !forced && battle.pbCheckOpposingAbility(:UNNERVE,battler.index)
next false if battler.status!=PBStatuses::PARALYSIS
itemName = PBItems.getName(item)
PBDebug.log("[Item triggered] #{battler.pbThis}'s #{itemName}") if forced
battle.pbCommonAnimation("EatBerry",battler) if !forced
battler.pbCureStatus(forced)
battle.pbDisplay(_INTL("{1}'s {2} cured its paralysis!",battler.pbThis,itemName)) if !forced
next true
}
)
BattleHandlers::StatusCureItem.add(:CHESTOBERRY,
proc { |item,battler,battle,forced|
next false if !forced && battle.pbCheckOpposingAbility(:UNNERVE,battler.index)
next false if battler.status!=PBStatuses::SLEEP
itemName = PBItems.getName(item)
PBDebug.log("[Item triggered] #{battler.pbThis}'s #{itemName}") if forced
battle.pbCommonAnimation("EatBerry",battler) if !forced
battler.pbCureStatus(forced)
battle.pbDisplay(_INTL("{1}'s {2} woke it up!",battler.pbThis,itemName)) if !forced
next true
}
)
BattleHandlers::StatusCureItem.add(:LUMBERRY,
proc { |item,battler,battle,forced|
next false if !forced && battle.pbCheckOpposingAbility(:UNNERVE,battler.index)
next false if battler.status==PBStatuses::NONE &&
battler.effects[PBEffects::Confusion]==0
itemName = PBItems.getName(item)
PBDebug.log("[Item triggered] #{battler.pbThis}'s #{itemName}") if forced
battle.pbCommonAnimation("EatBerry",battler) if !forced
oldStatus = battler.status
oldConfusion = (battler.effects[PBEffects::Confusion]>0)
battler.pbCureStatus(forced)
battler.pbCureConfusion
if forced
battle.pbDisplay(_INTL("{1} snapped out of its confusion.",battler.pbThis)) if oldConfusion
else
case oldStatus
when PBStatuses::SLEEP
battle.pbDisplay(_INTL("{1}'s {2} woke it up!",battler.pbThis,itemName))
when PBStatuses::POISON
battle.pbDisplay(_INTL("{1}'s {2} cured its poisoning!",battler.pbThis,itemName))
when PBStatuses::BURN
battle.pbDisplay(_INTL("{1}'s {2} healed its burn!",battler.pbThis,itemName))
when PBStatuses::PARALYSIS
battle.pbDisplay(_INTL("{1}'s {2} cured its paralysis!",battler.pbThis,itemName))
when PBStatuses::FROZEN
battle.pbDisplay(_INTL("{1}'s {2} defrosted it!",battler.pbThis,itemName))
end
if oldConfusion
battle.pbDisplay(_INTL("{1}'s {2} snapped it out of its confusion!",battler.pbThis,itemName))
end
end
next true
}
)
BattleHandlers::StatusCureItem.add(:MENTALHERB,
proc { |item,battler,battle,forced|
next false if battler.effects[PBEffects::Attract]==-1 &&
battler.effects[PBEffects::Taunt]==0 &&
battler.effects[PBEffects::Encore]==0 &&
!battler.effects[PBEffects::Torment] &&
battler.effects[PBEffects::Disable]==0 &&
battler.effects[PBEffects::HealBlock]==0
itemName = PBItems.getName(item)
PBDebug.log("[Item triggered] #{battler.pbThis}'s #{itemName}")
battle.pbCommonAnimation("UseItem",battler) if !forced
if battler.effects[PBEffects::Attract]>=0
if forced
battle.pbDisplay(_INTL("{1} got over its infatuation.",battler.pbThis))
else
battle.pbDisplay(_INTL("{1} cured its infatuation status using its {2}!",
battler.pbThis,itemName))
end
battler.pbCureAttract
end
battle.pbDisplay(_INTL("{1}'s taunt wore off!",battler.pbThis)) if battler.effects[PBEffects::Taunt]>0
battler.effects[PBEffects::Taunt] = 0
battle.pbDisplay(_INTL("{1}'s encore ended!",battler.pbThis)) if battler.effects[PBEffects::Encore]>0
battler.effects[PBEffects::Encore] = 0
battler.effects[PBEffects::EncoreMove] = 0
battle.pbDisplay(_INTL("{1}'s torment wore off!",battler.pbThis)) if battler.effects[PBEffects::Torment]
battler.effects[PBEffects::Torment] = false
battle.pbDisplay(_INTL("{1} is no longer disabled!",battler.pbThis)) if battler.effects[PBEffects::Disable]>0
battler.effects[PBEffects::Disable] = 0
battle.pbDisplay(_INTL("{1}'s Heal Block wore off!",battler.pbThis)) if battler.effects[PBEffects::HealBlock]>0
battler.effects[PBEffects::HealBlock] = 0
next true
}
)
BattleHandlers::StatusCureItem.add(:PECHABERRY,
proc { |item,battler,battle,forced|
next false if !forced && battle.pbCheckOpposingAbility(:UNNERVE,battler.index)
next false if battler.status!=PBStatuses::POISON
itemName = PBItems.getName(item)
PBDebug.log("[Item triggered] #{battler.pbThis}'s #{itemName}") if forced
battle.pbCommonAnimation("EatBerry",battler) if !forced
battler.pbCureStatus(forced)
battle.pbDisplay(_INTL("{1}'s {2} cured its poisoning!",battler.pbThis,itemName)) if !forced
next true
}
)
BattleHandlers::StatusCureItem.add(:PERSIMBERRY,
proc { |item,battler,battle,forced|
next false if !forced && battle.pbCheckOpposingAbility(:UNNERVE,battler.index)
next false if battler.effects[PBEffects::Confusion]==0
itemName = PBItems.getName(item)
PBDebug.log("[Item triggered] #{battler.pbThis}'s #{itemName}") if forced
battle.pbCommonAnimation("EatBerry",battler) if !forced
battler.pbCureConfusion
if forced
battle.pbDisplay(_INTL("{1} snapped out of its confusion.",battler.pbThis))
else
battle.pbDisplay(_INTL("{1}'s {2} snapped it out of its confusion!",battler.pbThis,
itemName))
end
next true
}
)
BattleHandlers::StatusCureItem.add(:RAWSTBERRY,
proc { |item,battler,battle,forced|
next false if !forced && battle.pbCheckOpposingAbility(:UNNERVE,battler.index)
next false if battler.status!=PBStatuses::BURN
itemName = PBItems.getName(item)
PBDebug.log("[Item triggered] #{battler.pbThis}'s #{itemName}") if forced
battle.pbCommonAnimation("EatBerry",battler) if !forced
battler.pbCureStatus(forced)
battle.pbDisplay(_INTL("{1}'s {2} healed its burn!",battler.pbThis,itemName)) if !forced
next true
}
)
#===============================================================================
# PriorityBracketChangeItem handlers
#===============================================================================
BattleHandlers::PriorityBracketChangeItem.add(:CUSTAPBERRY,
proc { |item,battler,subPri,battle|
next if !battler.pbCanConsumeBerry?(item)
next 1 if subPri<1
}
)
BattleHandlers::PriorityBracketChangeItem.add(:LAGGINGTAIL,
proc { |item,battler,subPri,battle|
next -1 if subPri==0
}
)
BattleHandlers::PriorityBracketChangeItem.copy(:LAGGINGTAIL,:FULLINCENSE)
BattleHandlers::PriorityBracketChangeItem.add(:QUICKCLAW,
proc { |item,battler,subPri,battle|
next 1 if subPri<1 && battle.pbRandom(100)<20
}
)
#===============================================================================
# PriorityBracketUseItem handlers
#===============================================================================
BattleHandlers::PriorityBracketUseItem.add(:CUSTAPBERRY,
proc { |item,battler,battle|
battle.pbCommonAnimation("EatBerry",battler)
battle.pbDisplay(_INTL("{1}'s {2} let it move first!",battler.pbThis,battler.itemName))
battler.pbConsumeItem
}
)
BattleHandlers::PriorityBracketUseItem.add(:QUICKCLAW,
proc { |item,battler,battle|
battle.pbCommonAnimation("UseItem",battler)
battle.pbDisplay(_INTL("{1}'s {2} let it move first!",battler.pbThis,battler.itemName))
}
)
#===============================================================================
# AccuracyCalcUserItem handlers
#===============================================================================
BattleHandlers::AccuracyCalcUserItem.add(:WIDELENS,
proc { |item,mods,user,target,move,type|
mods[ACC_MULT] = (mods[ACC_MULT]*1.1).round
}
)
BattleHandlers::AccuracyCalcUserItem.add(:ZOOMLENS,
proc { |item,mods,user,target,move,type|
if (target.battle.choices[target.index][0]!=:UseMove &&
target.battle.choices[target.index][0]!=:Shift) ||
target.movedThisRound?
mods[ACC_MULT] = (mods[ACC_MULT]*1.2).round
end
}
)
#===============================================================================
# AccuracyCalcTargetItem handlers
#===============================================================================
BattleHandlers::AccuracyCalcTargetItem.add(:BRIGHTPOWDER,
proc { |item,mods,user,target,move,type|
mods[ACC_MULT] = (mods[ACC_MULT]*0.9).round
}
)
BattleHandlers::AccuracyCalcTargetItem.copy(:BRIGHTPOWDER,:LAXINCENSE)
#===============================================================================
# DamageCalcUserItem handlers
#===============================================================================
BattleHandlers::DamageCalcUserItem.add(:ADAMANTORB,
proc { |item,user,target,move,mults,baseDmg,type|
if user.isSpecies?(:DIALGA) &&
(isConst?(type,PBTypes,:DRAGON) || isConst?(type,PBTypes,:STEEL))
mults[BASE_DMG_MULT] = (mults[BASE_DMG_MULT]*1.2).round
end
}
)
BattleHandlers::DamageCalcUserItem.add(:BLACKBELT,
proc { |item,user,target,move,mults,baseDmg,type|
mults[BASE_DMG_MULT] = (mults[BASE_DMG_MULT]*1.2).round if isConst?(type,PBTypes,:FIGHTING)
}
)
BattleHandlers::DamageCalcUserItem.copy(:BLACKBELT,:FISTPLATE)
BattleHandlers::DamageCalcUserItem.add(:BLACKGLASSES,
proc { |item,user,target,move,mults,baseDmg,type|
mults[BASE_DMG_MULT] = (mults[BASE_DMG_MULT]*1.2).round if isConst?(type,PBTypes,:DARK)
}
)
BattleHandlers::DamageCalcUserItem.copy(:BLACKGLASSES,:DREADPLATE)
BattleHandlers::DamageCalcUserItem.add(:BUGGEM,
proc { |item,user,target,move,mults,baseDmg,type|
pbBattleGem(user,:BUG,move,mults,type)
}
)
BattleHandlers::DamageCalcUserItem.add(:CHARCOAL,
proc { |item,user,target,move,mults,baseDmg,type|
mults[BASE_DMG_MULT] = (mults[BASE_DMG_MULT]*1.2).round if isConst?(type,PBTypes,:FIRE)
}
)
BattleHandlers::DamageCalcUserItem.copy(:CHARCOAL,:FLAMEPLATE)
BattleHandlers::DamageCalcUserItem.add(:CHOICEBAND,
proc { |item,user,target,move,mults,baseDmg,type|
mults[BASE_DMG_MULT] = (mults[BASE_DMG_MULT]*1.5).round if move.physicalMove?
}
)
BattleHandlers::DamageCalcUserItem.add(:CHOICESPECS,
proc { |item,user,target,move,mults,baseDmg,type|
mults[BASE_DMG_MULT] = (mults[BASE_DMG_MULT]*1.5).round if move.specialMove?
}
)
BattleHandlers::DamageCalcUserItem.add(:DARKGEM,
proc { |item,user,target,move,mults,baseDmg,type|
pbBattleGem(user,:DARK,move,mults,type)
}
)
BattleHandlers::DamageCalcUserItem.add(:DEEPSEATOOTH,
proc { |item,user,target,move,mults,baseDmg,type|
if user.isSpecies?(:CLAMPERL) && move.specialMove?
mults[ATK_MULT] *= 2
end
}
)
BattleHandlers::DamageCalcUserItem.add(:DRAGONFANG,
proc { |item,user,target,move,mults,baseDmg,type|
mults[BASE_DMG_MULT] = (mults[BASE_DMG_MULT]*1.2).round if isConst?(type,PBTypes,:DRAGON)
}
)
BattleHandlers::DamageCalcUserItem.copy(:DRAGONFANG,:DRACOPLATE)
BattleHandlers::DamageCalcUserItem.add(:DRAGONGEM,
proc { |item,user,target,move,mults,baseDmg,type|
pbBattleGem(user,:DRAGON,move,mults,type)
}
)
BattleHandlers::DamageCalcUserItem.add(:ELECTRICGEM,
proc { |item,user,target,move,mults,baseDmg,type|
pbBattleGem(user,:ELECTRIC,move,mults,type)
}
)
BattleHandlers::DamageCalcUserItem.add(:EXPERTBELT,
proc { |item,user,target,move,mults,baseDmg,type|
if PBTypes.superEffective?(target.damageState.typeMod)
mults[FINAL_DMG_MULT] = (mults[FINAL_DMG_MULT]*1.2).round
end
}
)
BattleHandlers::DamageCalcUserItem.add(:FAIRYGEM,
proc { |item,user,target,move,mults,baseDmg,type|
pbBattleGem(user,:FAIRY,move,mults,type)
}
)
BattleHandlers::DamageCalcUserItem.add(:FIGHTINGGEM,
proc { |item,user,target,move,mults,baseDmg,type|
pbBattleGem(user,:FIGHTING,move,mults,type)
}
)
BattleHandlers::DamageCalcUserItem.add(:FIREGEM,
proc { |item,user,target,move,mults,baseDmg,type|
pbBattleGem(user,:FIRE,move,mults,type)
}
)
BattleHandlers::DamageCalcUserItem.add(:FLYINGGEM,
proc { |item,user,target,move,mults,baseDmg,type|
pbBattleGem(user,:FLYING,move,mults,type)
}
)
BattleHandlers::DamageCalcUserItem.add(:GHOSTGEM,
proc { |item,user,target,move,mults,baseDmg,type|
pbBattleGem(user,:GHOST,move,mults,type)
}
)
BattleHandlers::DamageCalcUserItem.add(:GRASSGEM,
proc { |item,user,target,move,mults,baseDmg,type|
pbBattleGem(user,:GRASS,move,mults,type)
}
)
BattleHandlers::DamageCalcUserItem.add(:GRISEOUSORB,
proc { |item,user,target,move,mults,baseDmg,type|
if user.isSpecies?(:GIRATINA) &&
(isConst?(type,PBTypes,:DRAGON) || isConst?(type,PBTypes,:GHOST))
mults[BASE_DMG_MULT] = (mults[BASE_DMG_MULT]*1.2).round
end
}
)
BattleHandlers::DamageCalcUserItem.add(:GROUNDGEM,
proc { |item,user,target,move,mults,baseDmg,type|
pbBattleGem(user,:GROUND,move,mults,type)
}
)
BattleHandlers::DamageCalcUserItem.add(:HARDSTONE,
proc { |item,user,target,move,mults,baseDmg,type|
mults[BASE_DMG_MULT] = (mults[BASE_DMG_MULT]*1.2).round if isConst?(type,PBTypes,:ROCK)
}
)
BattleHandlers::DamageCalcUserItem.copy(:HARDSTONE,:STONEPLATE,:ROCKINCENSE)
BattleHandlers::DamageCalcUserItem.add(:ICEGEM,
proc { |item,user,target,move,mults,baseDmg,type|
pbBattleGem(user,:ICE,move,mults,type)
}
)
BattleHandlers::DamageCalcUserItem.add(:LIFEORB,
proc { |item,user,target,move,mults,baseDmg,type|
if !move.is_a?(PokeBattle_Confusion)
mults[FINAL_DMG_MULT] = (mults[FINAL_DMG_MULT]*1.3).round
end
}
)
BattleHandlers::DamageCalcUserItem.add(:LIGHTBALL,
proc { |item,user,target,move,mults,baseDmg,type|
if user.isSpecies?(:PIKACHU)
mults[ATK_MULT] *= 2
end
}
)
BattleHandlers::DamageCalcUserItem.add(:LUSTROUSORB,
proc { |item,user,target,move,mults,baseDmg,type|
if user.isSpecies?(:PALKIA) &&
(isConst?(type,PBTypes,:DRAGON) || isConst?(type,PBTypes,:WATER))
mults[BASE_DMG_MULT] = (mults[BASE_DMG_MULT]*1.2).round
end
}
)
BattleHandlers::DamageCalcUserItem.add(:MAGNET,
proc { |item,user,target,move,mults,baseDmg,type|
mults[BASE_DMG_MULT] = (mults[BASE_DMG_MULT]*1.2).round if isConst?(type,PBTypes,:ELECTRIC)
}
)
BattleHandlers::DamageCalcUserItem.copy(:MAGNET,:ZAPPLATE)
BattleHandlers::DamageCalcUserItem.add(:METALCOAT,
proc { |item,user,target,move,mults,baseDmg,type|
mults[BASE_DMG_MULT] = (mults[BASE_DMG_MULT]*1.2).round if isConst?(type,PBTypes,:STEEL)
}
)
BattleHandlers::DamageCalcUserItem.copy(:METALCOAT,:IRONPLATE)
BattleHandlers::DamageCalcUserItem.add(:METRONOME,
proc { |item,user,target,move,mults,baseDmg,type|
met = 1+0.2*[user.effects[PBEffects::Metronome],5].min
mults[FINAL_DMG_MULT] = (mults[FINAL_DMG_MULT]*met).round
}
)
BattleHandlers::DamageCalcUserItem.add(:MIRACLESEED,
proc { |item,user,target,move,mults,baseDmg,type|
mults[BASE_DMG_MULT] = (mults[BASE_DMG_MULT]*1.2).round if isConst?(type,PBTypes,:GRASS)
}
)
BattleHandlers::DamageCalcUserItem.copy(:MIRACLESEED,:MEADOWPLATE,:ROSEINCENSE)
BattleHandlers::DamageCalcUserItem.add(:MUSCLEBAND,
proc { |item,user,target,move,mults,baseDmg,type|
mults[BASE_DMG_MULT] = (mults[BASE_DMG_MULT]*1.1).round if move.physicalMove?
}
)
BattleHandlers::DamageCalcUserItem.add(:MYSTICWATER,
proc { |item,user,target,move,mults,baseDmg,type|
mults[BASE_DMG_MULT] = (mults[BASE_DMG_MULT]*1.2).round if isConst?(type,PBTypes,:WATER)
}
)
BattleHandlers::DamageCalcUserItem.copy(:MYSTICWATER,:SPLASHPLATE,:SEAINCENSE,:WAVEINCENSE)
BattleHandlers::DamageCalcUserItem.add(:NEVERMELTICE,
proc { |item,user,target,move,mults,baseDmg,type|
mults[BASE_DMG_MULT] = (mults[BASE_DMG_MULT]*1.2).round if isConst?(type,PBTypes,:ICE)
}
)
BattleHandlers::DamageCalcUserItem.copy(:NEVERMELTICE,:ICICLEPLATE)
BattleHandlers::DamageCalcUserItem.add(:NORMALGEM,
proc { |item,user,target,move,mults,baseDmg,type|
pbBattleGem(user,:NORMAL,move,mults,type)
}
)
BattleHandlers::DamageCalcUserItem.add(:PIXIEPLATE,
proc { |item,user,target,move,mults,baseDmg,type|
mults[BASE_DMG_MULT] = (mults[BASE_DMG_MULT]*1.2).round if isConst?(type,PBTypes,:FAIRY)
}
)
BattleHandlers::DamageCalcUserItem.add(:POISONBARB,
proc { |item,user,target,move,mults,baseDmg,type|
mults[BASE_DMG_MULT] = (mults[BASE_DMG_MULT]*1.2).round if isConst?(type,PBTypes,:POISON)
}
)
BattleHandlers::DamageCalcUserItem.copy(:POISONBARB,:TOXICPLATE)
BattleHandlers::DamageCalcUserItem.add(:POISONGEM,
proc { |item,user,target,move,mults,baseDmg,type|
pbBattleGem(user,:POISON,move,mults,type)
}
)
BattleHandlers::DamageCalcUserItem.add(:PSYCHICGEM,
proc { |item,user,target,move,mults,baseDmg,type|
pbBattleGem(user,:PSYCHIC,move,mults,type)
}
)
BattleHandlers::DamageCalcUserItem.add(:ROCKGEM,
proc { |item,user,target,move,mults,baseDmg,type|
pbBattleGem(user,:ROCK,move,mults,type)
}
)
BattleHandlers::DamageCalcUserItem.add(:SHARPBEAK,
proc { |item,user,target,move,mults,baseDmg,type|
mults[BASE_DMG_MULT] = (mults[BASE_DMG_MULT]*1.2).round if isConst?(type,PBTypes,:FLYING)
}
)
BattleHandlers::DamageCalcUserItem.copy(:SHARPBEAK,:SKYPLATE)
BattleHandlers::DamageCalcUserItem.add(:SILKSCARF,
proc { |item,user,target,move,mults,baseDmg,type|
mults[BASE_DMG_MULT] = (mults[BASE_DMG_MULT]*1.2).round if isConst?(type,PBTypes,:NORMAL)
}
)
BattleHandlers::DamageCalcUserItem.add(:SILVERPOWDER,
proc { |item,user,target,move,mults,baseDmg,type|
mults[BASE_DMG_MULT] = (mults[BASE_DMG_MULT]*1.2).round if isConst?(type,PBTypes,:BUG)
}
)
BattleHandlers::DamageCalcUserItem.copy(:SILVERPOWDER,:INSECTPLATE)
BattleHandlers::DamageCalcUserItem.add(:SOFTSAND,
proc { |item,user,target,move,mults,baseDmg,type|
mults[BASE_DMG_MULT] = (mults[BASE_DMG_MULT]*1.2).round if isConst?(type,PBTypes,:GROUND)
}
)
BattleHandlers::DamageCalcUserItem.copy(:SOFTSAND,:EARTHPLATE)
BattleHandlers::DamageCalcUserItem.add(:SOULDEW,
proc { |item,user,target,move,mults,baseDmg,type|
next if !user.isSpecies?(:LATIAS) && !user.isSpecies?(:LATIOS)
if NEWEST_BATTLE_MECHANICS
if isConst?(type,PBTypes,:PSYCHIC) || isConst?(type,PBTypes,:DRAGON)
mults[FINAL_DMG_MULT] = (mults[FINAL_DMG_MULT]*1.2).round
end
else
if move.specialMove? && !user.battle.rules["souldewclause"]
mults[ATK_MULT] = (mults[ATK_MULT]*1.5).round
end
end
}
)
BattleHandlers::DamageCalcUserItem.add(:SPELLTAG,
proc { |item,user,target,move,mults,baseDmg,type|
mults[BASE_DMG_MULT] = (mults[BASE_DMG_MULT]*1.2).round if isConst?(type,PBTypes,:GHOST)
}
)
BattleHandlers::DamageCalcUserItem.copy(:SPELLTAG,:SPOOKYPLATE)
BattleHandlers::DamageCalcUserItem.add(:STEELGEM,
proc { |item,user,target,move,mults,baseDmg,type|
pbBattleGem(user,:STEEL,move,mults,type)
}
)
BattleHandlers::DamageCalcUserItem.add(:THICKCLUB,
proc { |item,user,target,move,mults,baseDmg,type|
if (user.isSpecies?(:CUBONE) || user.isSpecies?(:MAROWAK)) && move.physicalMove?
mults[ATK_MULT] *= 2
end
}
)
BattleHandlers::DamageCalcUserItem.add(:TWISTEDSPOON,
proc { |item,user,target,move,mults,baseDmg,type|
mults[BASE_DMG_MULT] = (mults[BASE_DMG_MULT]*1.2).round if isConst?(type,PBTypes,:PSYCHIC)
}
)
BattleHandlers::DamageCalcUserItem.copy(:TWISTEDSPOON,:MINDPLATE,:ODDINCENSE)
BattleHandlers::DamageCalcUserItem.add(:WATERGEM,
proc { |item,user,target,move,mults,baseDmg,type|
pbBattleGem(user,:WATER,move,mults,type)
}
)
BattleHandlers::DamageCalcUserItem.add(:WISEGLASSES,
proc { |item,user,target,move,mults,baseDmg,type|
mults[BASE_DMG_MULT] = (mults[BASE_DMG_MULT]*1.1).round if move.specialMove?
}
)
#===============================================================================
# DamageCalcTargetItem handlers
#===============================================================================
# NOTE: Species-specific held items consider the original species, not the
# transformed species, and still work while transformed. The exceptions
# are Metal/Quick Powder, which don't work if the holder is transformed.
BattleHandlers::DamageCalcTargetItem.add(:ASSAULTVEST,
proc { |item,user,target,move,mults,baseDmg,type|
mults[DEF_MULT] = (mults[DEF_MULT]*1.5).round if move.specialMove?
}
)
BattleHandlers::DamageCalcTargetItem.add(:BABIRIBERRY,
proc { |item,user,target,move,mults,baseDmg,type|
pbBattleTypeWeakingBerry(:STEEL,type,target,mults)
}
)
BattleHandlers::DamageCalcTargetItem.add(:CHARTIBERRY,
proc { |item,user,target,move,mults,baseDmg,type|
pbBattleTypeWeakingBerry(:ROCK,type,target,mults)
}
)
BattleHandlers::DamageCalcTargetItem.add(:CHILANBERRY,
proc { |item,user,target,move,mults,baseDmg,type|
pbBattleTypeWeakingBerry(:NORMAL,type,target,mults)
}
)
BattleHandlers::DamageCalcTargetItem.add(:CHOPLEBERRY,
proc { |item,user,target,move,mults,baseDmg,type|
pbBattleTypeWeakingBerry(:FIGHTING,type,target,mults)
}
)
BattleHandlers::DamageCalcTargetItem.add(:COBABERRY,
proc { |item,user,target,move,mults,baseDmg,type|
pbBattleTypeWeakingBerry(:FLYING,type,target,mults)
}
)
BattleHandlers::DamageCalcTargetItem.add(:COLBURBERRY,
proc { |item,user,target,move,mults,baseDmg,type|
pbBattleTypeWeakingBerry(:DARK,type,target,mults)
}
)
BattleHandlers::DamageCalcTargetItem.add(:DEEPSEASCALE,
proc { |item,user,target,move,mults,baseDmg,type|
if isConst?(target.species,PBSpecies,:CLAMPERL) && move.specialMove?
mults[DEF_MULT] *= 2
end
}
)
BattleHandlers::DamageCalcTargetItem.add(:EVIOLITE,
proc { |item,user,target,move,mults,baseDmg,type|
# NOTE: Eviolite cares about whether the Pokémon itself can evolve, which
# means it also cares about the Pokémon's form. Some forms cannot
# evolve even if the species generally can, and such forms are not
# affected by Eviolite.
evos = pbGetEvolvedFormData(target.pokemon.fSpecies,true)
mults[DEF_MULT] = (mults[DEF_MULT]*1.5).round if evos && evos.length>0
}
)
BattleHandlers::DamageCalcTargetItem.add(:HABANBERRY,
proc { |item,user,target,move,mults,baseDmg,type|
pbBattleTypeWeakingBerry(:DRAGON,type,target,mults)
}
)
BattleHandlers::DamageCalcTargetItem.add(:KASIBBERRY,
proc { |item,user,target,move,mults,baseDmg,type|
pbBattleTypeWeakingBerry(:GHOST,type,target,mults)
}
)
BattleHandlers::DamageCalcTargetItem.add(:KEBIABERRY,
proc { |item,user,target,move,mults,baseDmg,type|
pbBattleTypeWeakingBerry(:POISON,type,target,mults)
}
)
BattleHandlers::DamageCalcTargetItem.add(:METALPOWDER,
proc { |item,user,target,move,mults,baseDmg,type|
if isConst?(target.species,PBSpecies,:DITTO) &&
!target.effects[PBEffects::Transform]
mults[DEF_MULT] = (mults[DEF_MULT]*1.5).round
end
}
)
BattleHandlers::DamageCalcTargetItem.add(:OCCABERRY,
proc { |item,user,target,move,mults,baseDmg,type|
pbBattleTypeWeakingBerry(:FIRE,type,target,mults)
}
)
BattleHandlers::DamageCalcTargetItem.add(:PASSHOBERRY,
proc { |item,user,target,move,mults,baseDmg,type|
pbBattleTypeWeakingBerry(:WATER,type,target,mults)
}
)
BattleHandlers::DamageCalcTargetItem.add(:PAYAPABERRY,
proc { |item,user,target,move,mults,baseDmg,type|
pbBattleTypeWeakingBerry(:PSYCHIC,type,target,mults)
}
)
BattleHandlers::DamageCalcTargetItem.add(:RINDOBERRY,
proc { |item,user,target,move,mults,baseDmg,type|
pbBattleTypeWeakingBerry(:GRASS,type,target,mults)
}
)
BattleHandlers::DamageCalcTargetItem.add(:ROSELIBERRY,
proc { |item,user,target,move,mults,baseDmg,type|
pbBattleTypeWeakingBerry(:FAIRY,type,target,mults)
}
)
BattleHandlers::DamageCalcTargetItem.add(:SHUCABERRY,
proc { |item,user,target,move,mults,baseDmg,type|
pbBattleTypeWeakingBerry(:GROUND,type,target,mults)
}
)
BattleHandlers::DamageCalcTargetItem.add(:SOULDEW,
proc { |item,user,target,move,mults,baseDmg,type|
next if NEWEST_BATTLE_MECHANICS
next if !isConst?(target.species,PBSpecies,:LATIAS) &&
!isConst?(target.species,PBSpecies,:LATIOS)
if move.specialMove? && !user.battle.rules["souldewclause"]
mults[DEF_MULT] = (mults[DEF_MULT]*1.5).round
end
}
)
BattleHandlers::DamageCalcTargetItem.add(:TANGABERRY,
proc { |item,user,target,move,mults,baseDmg,type|
pbBattleTypeWeakingBerry(:BUG,type,target,mults)
}
)
BattleHandlers::DamageCalcTargetItem.add(:WACANBERRY,
proc { |item,user,target,move,mults,baseDmg,type|
pbBattleTypeWeakingBerry(:ELECTRIC,type,target,mults)
}
)
BattleHandlers::DamageCalcTargetItem.add(:YACHEBERRY,
proc { |item,user,target,move,mults,baseDmg,type|
pbBattleTypeWeakingBerry(:ICE,type,target,mults)
}
)
#===============================================================================
# CriticalCalcUserItem handlers
#===============================================================================
BattleHandlers::CriticalCalcUserItem.add(:LUCKYPUNCH,
proc { |item,user,target,c|
next c+2 if user.isSpecies?(:CHANSEY)
}
)
BattleHandlers::CriticalCalcUserItem.add(:RAZORCLAW,
proc { |item,user,target,c|
next c+1
}
)
BattleHandlers::CriticalCalcUserItem.copy(:RAZORCLAW,:SCOPELENS)
BattleHandlers::CriticalCalcUserItem.add(:STICK,
proc { |item,user,target,c|
next c+2 if user.isSpecies?(:FARFETCHD)
}
)
#===============================================================================
# CriticalCalcTargetItem handlers
#===============================================================================
# There aren't any!
#===============================================================================
# TargetItemOnHit handlers
#===============================================================================
BattleHandlers::TargetItemOnHit.add(:ABSORBBULB,
proc { |item,user,target,move,battle|
next if !isConst?(move.calcType,PBTypes,:WATER)
next if !target.pbCanRaiseStatStage?(PBStats::SPATK,target)
battle.pbCommonAnimation("UseItem",target)
target.pbRaiseStatStageByCause(PBStats::SPATK,1,target,target.itemName)
target.pbConsumeItem
}
)
BattleHandlers::TargetItemOnHit.add(:AIRBALLOON,
proc { |item,user,target,move,battle|
battle.pbDisplay(_INTL("{1}'s {2} popped!",target.pbThis,target.itemName))
target.pbConsumeItem(false,true)
}
)
BattleHandlers::TargetItemOnHit.add(:CELLBATTERY,
proc { |item,user,target,move,battle|
next if !isConst?(move.calcType,PBTypes,:ELECTRIC)
next if !target.pbCanRaiseStatStage?(PBStats::ATTACK,target)
battle.pbCommonAnimation("UseItem",target)
target.pbRaiseStatStageByCause(PBStats::ATTACK,1,target,target.itemName)
target.pbConsumeItem
}
)
BattleHandlers::TargetItemOnHit.add(:ENIGMABERRY,
proc { |item,user,target,move,battle|
next if target.damageState.substitute || target.damageState.disguise
next if !PBTypes.superEffective?(target.damageState.typeMod)
BattleHandlers.triggerTargetItemOnHitPositiveBerry(item,target,battle,false)
}
)
BattleHandlers::TargetItemOnHit.add(:JABOCABERRY,
proc { |item,user,target,move,battle|
next if battle.pbCheckOpposingAbility(:UNNERVE,target.index)
next if !move.physicalMove?
next if !user.takesIndirectDamage?
battle.pbCommonAnimation("EatBerry",target)
battle.scene.pbDamageAnimation(user)
user.pbReduceHP(user.totalhp/8,false)
battle.pbDisplay(_INTL("{1} consumed its {2} and hurt {3}!",target.pbThis,
target.itemName,user.pbThis(true)))
target.pbConsumeItem
}
)
# NOTE: Kee Berry supposedly shouldn't trigger if the user has Sheer Force, but
# I'm ignoring this. Weakness Policy has the same kind of effect and
# nowhere says it should be stopped by Sheer Force. I suspect this
# stoppage is either a false report that no one ever corrected, or an
# effect that later changed and wasn't noticed.
BattleHandlers::TargetItemOnHit.add(:KEEBERRY,
proc { |item,user,target,move,battle|
next if !move.physicalMove?
BattleHandlers.triggerTargetItemOnHitPositiveBerry(item,target,battle,false)
}
)
BattleHandlers::TargetItemOnHit.add(:LUMINOUSMOSS,
proc { |item,user,target,move,battle|
next if !isConst?(move.calcType,PBTypes,:WATER)
next if !target.pbCanRaiseStatStage?(PBStats::SPDEF,target)
battle.pbCommonAnimation("UseItem",target)
target.pbRaiseStatStageByCause(PBStats::SPDEF,1,target,target.itemName)
target.pbConsumeItem
}
)
# NOTE: Maranga Berry supposedly shouldn't trigger if the user has Sheer Force,
# but I'm ignoring this. Weakness Policy has the same kind of effect and
# nowhere says it should be stopped by Sheer Force. I suspect this
# stoppage is either a false report that no one ever corrected, or an
# effect that later changed and wasn't noticed.
BattleHandlers::TargetItemOnHit.add(:MARANGABERRY,
proc { |item,user,target,move,battle|
next if !move.specialMove?
BattleHandlers.triggerTargetItemOnHitPositiveBerry(item,target,battle,false)
}
)
BattleHandlers::TargetItemOnHit.add(:ROCKYHELMET,
proc { |item,user,target,move,battle|
next if !move.pbContactMove?(user) || !user.affectedByContactEffect?
next if !user.takesIndirectDamage?
battle.scene.pbDamageAnimation(user)
user.pbReduceHP(user.totalhp/6,false)
battle.pbDisplay(_INTL("{1} was hurt by the {2}!",user.pbThis,target.itemName))
}
)
BattleHandlers::TargetItemOnHit.add(:ROWAPBERRY,
proc { |item,user,target,move,battle|
next if battle.pbCheckOpposingAbility(:UNNERVE,target.index)
next if !move.specialMove?
next if !user.takesIndirectDamage?
battle.pbCommonAnimation("EatBerry",target)
battle.scene.pbDamageAnimation(user)
user.pbReduceHP(user.totalhp/8,false)
battle.pbDisplay(_INTL("{1} consumed its {2} and hurt {3}!",target.pbThis,
target.itemName,user.pbThis(true)))
target.pbConsumeItem
}
)
BattleHandlers::TargetItemOnHit.add(:SNOWBALL,
proc { |item,user,target,move,battle|
next if !isConst?(move.calcType,PBTypes,:ICE)
next if !target.pbCanRaiseStatStage?(PBStats::ATTACK,target)
battle.pbCommonAnimation("UseItem",target)
target.pbRaiseStatStageByCause(PBStats::ATTACK,1,target,target.itemName)
target.pbConsumeItem
}
)
BattleHandlers::TargetItemOnHit.add(:STICKYBARB,
proc { |item,user,target,move,battle|
next if !move.pbContactMove?(user) || !user.affectedByContactEffect?
next if user.fainted? || user.item>0
user.item = target.item
target.item = 0
target.effects[PBEffects::Unburden] = true
if battle.wildBattle? && !user.opposes?
if user.initialItem==0 && target.initialItem==user.item
user.setInitialItem(user.item)
target.setInitialItem(0)
end
end
battle.pbDisplay(_INTL("{1}'s {2} was transferred to {3}!",
target.pbThis,user.itemName,user.pbThis(true)))
}
)
BattleHandlers::TargetItemOnHit.add(:WEAKNESSPOLICY,
proc { |item,user,target,move,battle|
next if target.damageState.disguise
next if !PBTypes.superEffective?(target.damageState.typeMod)
next if !target.pbCanRaiseStatStage?(PBStats::ATTACK,target) &&
!target.pbCanRaiseStatStage?(PBStats::SPATK,target)
battle.pbCommonAnimation("UseItem",target)
showAnim = true
if target.pbCanRaiseStatStage?(PBStats::ATTACK,target)
target.pbRaiseStatStageByCause(PBStats::ATTACK,2,target,target.itemName,showAnim)
showAnim = false
end
if target.pbCanRaiseStatStage?(PBStats::SPATK,target)
target.pbRaiseStatStageByCause(PBStats::SPATK,2,target,target.itemName,showAnim)
end
target.pbConsumeItem
}
)
#===============================================================================
# TargetItemOnHitPositiveBerry handlers
# NOTE: This is for berries that have an effect when Pluck/Bug Bite/Fling
# forces their use.
#===============================================================================
BattleHandlers::TargetItemOnHitPositiveBerry.add(:ENIGMABERRY,
proc { |item,battler,battle,forced|
next false if !battler.canHeal?
next false if !forced && battle.pbCheckOpposingAbility(:UNNERVE,battler.index)
itemName = PBItems.getName(item)
PBDebug.log("[Item triggered] #{battler.pbThis}'s #{itemName}") if forced
battle.pbCommonAnimation("EatBerry",battler) if !forced
battler.pbRecoverHP(battler.totalhp/4)
if forced
battle.pbDisplay(_INTL("{1}'s HP was restored.",battler.pbThis))
else
battle.pbDisplay(_INTL("{1} restored its health using its {2}!",battler.pbThis,
itemName))
end
next true
}
)
BattleHandlers::TargetItemOnHitPositiveBerry.add(:KEEBERRY,
proc { |item,battler,battle,forced|
next false if !forced && battle.pbCheckOpposingAbility(:UNNERVE,battler.index)
next false if !battler.pbCanRaiseStatStage?(PBStats::DEFENSE,battler)
itemName = PBItems.getName(item)
if !forced
battle.pbCommonAnimation("EatBerry",battler)
next battler.pbRaiseStatStageByCause(PBStats::DEFENSE,1,battler,itemName)
end
PBDebug.log("[Item triggered] #{battler.pbThis}'s #{itemName}")
next battler.pbRaiseStatStage(PBStats::DEFENSE,1,battler)
}
)
BattleHandlers::TargetItemOnHitPositiveBerry.add(:MARANGABERRY,
proc { |item,battler,battle,forced|
next false if !forced && battle.pbCheckOpposingAbility(:UNNERVE,battler.index)
next false if !battler.pbCanRaiseStatStage?(PBStats::SPDEF,battler)
itemName = PBItems.getName(item)
if !forced
battle.pbCommonAnimation("EatBerry",battler)
next battler.pbRaiseStatStageByCause(PBStats::SPDEF,1,battler,itemName)
end
PBDebug.log("[Item triggered] #{battler.pbThis}'s #{itemName}")
next battler.pbRaiseStatStage(PBStats::SPDEF,1,battler)
}
)
#===============================================================================
# TargetItemAfterMoveUse handlers
#===============================================================================
BattleHandlers::TargetItemAfterMoveUse.add(:EJECTBUTTON,
proc { |item,battler,user,move,switched,battle|
next if battle.pbAllFainted?(battler.idxOpposingSide)
next if !battle.pbCanChooseNonActive?(battler.index)
battle.pbCommonAnimation("UseItem",battler)
battle.pbDisplay(_INTL("{1} is switched out with the {2}!",battler.pbThis,battler.itemName))
battler.pbConsumeItem(true,false)
newPkmn = battle.pbGetReplacementPokemonIndex(battler.index) # Owner chooses
next if newPkmn<0
battle.pbRecallAndReplace(battler.index,newPkmn)
battle.pbClearChoice(battler.index) # Replacement Pokémon does nothing this round
switched.push(battler.index)
}
)
BattleHandlers::TargetItemAfterMoveUse.add(:REDCARD,
proc { |item,battler,user,move,switched,battle|
next if user.fainted? || switched.include?(user.index)
newPkmn = battle.pbGetReplacementPokemonIndex(user.index,true) # Random
next if newPkmn<0
battle.pbCommonAnimation("UseItem",battler)
battle.pbDisplay(_INTL("{1} held up its {2} against {3}!",
battler.pbThis,battler.itemName,user.pbThis(true)))
battler.pbConsumeItem
battle.pbRecallAndReplace(user.index,newPkmn)
battle.pbDisplay(_INTL("{1} was dragged out!",user.pbThis))
battle.pbClearChoice(user.index) # Replacement Pokémon does nothing this round
switched.push(user.index)
}
)
#===============================================================================
# UserItemAfterMoveUse handlers
#===============================================================================
BattleHandlers::UserItemAfterMoveUse.add(:LIFEORB,
proc { |item,user,targets,move,numHits,battle|
next if !user.takesIndirectDamage?
next if !move.pbDamagingMove? || numHits==0
hitBattler = false
targets.each do |b|
hitBattler = true if !b.damageState.unaffected && !b.damageState.substitute
break if hitBattler
end
next if !hitBattler
PBDebug.log("[Item triggered] #{user.pbThis}'s #{user.itemName} (recoil)")
user.pbReduceHP(user.totalhp/10)
battle.pbDisplay(_INTL("{1} lost some of its HP!",user.pbThis))
user.pbItemHPHealCheck
user.pbFaint if user.fainted?
}
)
BattleHandlers::UserItemAfterMoveUse.add(:SHELLBELL,
proc { |item,user,targets,move,numHits,battle|
next if !user.canHeal?
totalDamage = 0
targets.each { |b| totalDamage += b.damageState.totalHPLost }
next if totalDamage<=0
user.pbRecoverHP(totalDamage/8)
battle.pbDisplay(_INTL("{1} restored a little HP using its {2}!",
user.pbThis,user.itemName))
}
)
#===============================================================================
# EndOfMoveItem handlers
#===============================================================================
BattleHandlers::EndOfMoveItem.add(:LEPPABERRY,
proc { |item,battler,battle,forced|
next false if !forced && battle.pbCheckOpposingAbility(:UNNERVE,battler.index)
found = []
battler.pokemon.moves.each_with_index do |m,i|
next if !m || m.id==0
next if m.totalpp<=0 || m.pp==m.totalpp
next if !forced && m.pp>0
found.push(i)
end
next false if found.length==0
itemName = PBItems.getName(item)
PBDebug.log("[Item triggered] #{battler.pbThis}'s #{itemName}") if forced
battle.pbCommonAnimation("EatBerry",battler) if !forced
choice = found[battle.pbRandom(found.length)]
pkmnMove = battler.pokemon.moves[choice]
pkmnMove.pp += 10
pkmnMove.pp = pkmnMove.totalpp if pkmnMove.pp>pkmnMove.totalpp
battler.moves[choice].pp = pkmnMove.pp
moveName = PBMoves.getName(pkmnMove.id)
if forced
battle.pbDisplay(_INTL("{1} restored its {2}'s PP.",battler.pbThis,moveName))
else
battle.pbDisplay(_INTL("{1}'s {2} restored its {3}'s PP!",battler.pbThis,itemName,moveName))
end
next true
}
)
#===============================================================================
# EndOfMoveStatRestoreItem handlers
#===============================================================================
BattleHandlers::EndOfMoveStatRestoreItem.add(:WHITEHERB,
proc { |item,battler,battle,forced|
reducedStats = false
PBStats.eachBattleStat do |s|
next if battler.stages[s]>=0
battler.stages[s] = 0
reducedStats = true
end
next false if !reducedStats
itemName = PBItems.getName(item)
PBDebug.log("[Item triggered] #{battler.pbThis}'s #{itemName}") if forced
battle.pbCommonAnimation("UseItem",battler) if !forced
if forced
battle.pbDisplay(_INTL("{1}'s status returned to normal!",battler.pbThis))
else
battle.pbDisplay(_INTL("{1} returned its status to normal using its {2}!",
battler.pbThis,itemName))
end
next true
}
)
#===============================================================================
# ExpGainModifierItem handlers
#===============================================================================
BattleHandlers::ExpGainModifierItem.add(:LUCKYEGG,
proc { |item,battler,exp|
next exp*3/2
}
)
#===============================================================================
# EVGainModifierItem handlers
#===============================================================================
BattleHandlers::EVGainModifierItem.add(:MACHOBRACE,
proc { |item,battler,evYield|
evYield.collect! { |a| a*2 }
}
)
BattleHandlers::EVGainModifierItem.add(:POWERANKLET,
proc { |item,battler,evYield|
evYield[PBStats::SPEED] += 4
}
)
BattleHandlers::EVGainModifierItem.add(:POWERBAND,
proc { |item,battler,evYield|
evYield[PBStats::SPDEF] += 4
}
)
BattleHandlers::EVGainModifierItem.add(:POWERBELT,
proc { |item,battler,evYield|
evYield[PBStats::DEFENSE] += 4
}
)
BattleHandlers::EVGainModifierItem.add(:POWERBRACER,
proc { |item,battler,evYield|
evYield[PBStats::ATTACK] += 4
}
)
BattleHandlers::EVGainModifierItem.add(:POWERLENS,
proc { |item,battler,evYield|
evYield[PBStats::SPATK] += 4
}
)
BattleHandlers::EVGainModifierItem.add(:POWERWEIGHT,
proc { |item,battler,evYield|
evYield[PBStats::HP] += 4
}
)
#===============================================================================
# WeatherExtenderItem handlers
#===============================================================================
BattleHandlers::WeatherExtenderItem.add(:DAMPROCK,
proc { |item,weather,duration,battler,battle|
next 8 if weather==PBWeather::Rain
}
)
BattleHandlers::WeatherExtenderItem.add(:HEATROCK,
proc { |item,weather,duration,battler,battle|
next 8 if weather==PBWeather::Sun
}
)
BattleHandlers::WeatherExtenderItem.add(:ICYROCK,
proc { |item,weather,duration,battler,battle|
next 8 if weather==PBWeather::Hail
}
)
BattleHandlers::WeatherExtenderItem.add(:SMOOTHROCK,
proc { |item,weather,duration,battler,battle|
next 8 if weather==PBWeather::Sandstorm
}
)
#===============================================================================
# TerrainExtenderItem handlers
#===============================================================================
BattleHandlers::TerrainExtenderItem.add(:TERRAINEXTENDER,
proc { |item,terrain,duration,battler,battle|
next 8
}
)
#===============================================================================
# TerrainStatBoostItem handlers
#===============================================================================
BattleHandlers::TerrainStatBoostItem.add(:ELECTRICSEED,
proc { |item,battler,battle|
next false if battle.field.terrain!=PBBattleTerrains::Electric
next false if !battler.pbCanRaiseStatStage?(PBStats::DEFENSE,battler)
itemName = PBItems.getName(item)
battle.pbCommonAnimation("UseItem",battler)
next battler.pbRaiseStatStageByCause(PBStats::DEFENSE,1,battler,itemName)
}
)
BattleHandlers::TerrainStatBoostItem.add(:GRASSYSEED,
proc { |item,battler,battle|
next false if battle.field.terrain!=PBBattleTerrains::Grassy
next false if !battler.pbCanRaiseStatStage?(PBStats::DEFENSE,battler)
itemName = PBItems.getName(item)
battle.pbCommonAnimation("UseItem",battler)
next battler.pbRaiseStatStageByCause(PBStats::DEFENSE,1,battler,itemName)
}
)
BattleHandlers::TerrainStatBoostItem.add(:MISTYSEED,
proc { |item,battler,battle|
next false if battle.field.terrain!=PBBattleTerrains::Misty
next false if !battler.pbCanRaiseStatStage?(PBStats::SPDEF,battler)
itemName = PBItems.getName(item)
battle.pbCommonAnimation("UseItem",battler)
next battler.pbRaiseStatStageByCause(PBStats::SPDEF,1,battler,itemName)
}
)
BattleHandlers::TerrainStatBoostItem.add(:PSYCHICSEED,
proc { |item,battler,battle|
next false if battle.field.terrain!=PBBattleTerrains::Psychic
next false if !battler.pbCanRaiseStatStage?(PBStats::SPDEF,battler)
itemName = PBItems.getName(item)
battle.pbCommonAnimation("UseItem",battler)
next battler.pbRaiseStatStageByCause(PBStats::SPDEF,1,battler,itemName)
}
)
#===============================================================================
# EORHealingItem handlers
#===============================================================================
BattleHandlers::EORHealingItem.add(:BLACKSLUDGE,
proc { |item,battler,battle|
if battler.pbHasType?(:POISON)
next if !battler.canHeal?
battle.pbCommonAnimation("UseItem",battler)
battler.pbRecoverHP(battler.totalhp/16)
battle.pbDisplay(_INTL("{1} restored a little HP using its {2}!",
battler.pbThis,battler.itemName))
elsif battler.takesIndirectDamage?
oldHP = battler.hp
battle.pbCommonAnimation("UseItem",battler)
battler.pbReduceHP(battler.totalhp/8)
battle.pbDisplay(_INTL("{1} is hurt by its {2}!",battler.pbThis,battler.itemName))
battler.pbItemHPHealCheck
battler.pbAbilitiesOnDamageTaken(oldHP)
battler.pbFaint if battler.fainted?
end
}
)
BattleHandlers::EORHealingItem.add(:LEFTOVERS,
proc { |item,battler,battle|
next if !battler.canHeal?
battle.pbCommonAnimation("UseItem",battler)
battler.pbRecoverHP(battler.totalhp/16)
battle.pbDisplay(_INTL("{1} restored a little HP using its {2}!",
battler.pbThis,battler.itemName))
}
)
#===============================================================================
# EOREffectItem handlers
#===============================================================================
BattleHandlers::EOREffectItem.add(:FLAMEORB,
proc { |item,battler,battle|
next if !battler.pbCanBurn?(battler,false)
battler.pbBurn(nil,_INTL("{1} was burned by the {2}!",battler.pbThis,battler.itemName))
}
)
BattleHandlers::EOREffectItem.add(:STICKYBARB,
proc { |item,battler,battle|
next if !battler.takesIndirectDamage?
oldHP = battler.hp
battle.scene.pbDamageAnimation(battler)
battler.pbReduceHP(battler.totalhp/8,false)
battle.pbDisplay(_INTL("{1} is hurt by its {2}!",battler.pbThis,battler.itemName))
battler.pbItemHPHealCheck
battler.pbAbilitiesOnDamageTaken(oldHP)
battler.pbFaint if battler.fainted?
}
)
BattleHandlers::EOREffectItem.add(:TOXICORB,
proc { |item,battler,battle|
next if !battler.pbCanPoison?(battler,false)
battler.pbPoison(nil,_INTL("{1} was badly poisoned by the {2}!",
battler.pbThis,battler.itemName),true)
}
)
#===============================================================================
# CertainSwitchingUserItem handlers
#===============================================================================
BattleHandlers::CertainSwitchingUserItem.add(:SHEDSHELL,
proc { |item,battler,battle|
next true
}
)
#===============================================================================
# TrappingTargetItem handlers
#===============================================================================
# There aren't any!
#===============================================================================
# ItemOnSwitchIn handlers
#===============================================================================
BattleHandlers::ItemOnSwitchIn.add(:AIRBALLOON,
proc { |item,battler,battle|
battle.pbDisplay(_INTL("{1} floats in the air with its {2}!",
battler.pbThis,battler.itemName))
}
)
#===============================================================================
# ItemOnIntimidated handlers
#===============================================================================
BattleHandlers::ItemOnIntimidated.add(:ADRENALINEORB,
proc { |item,battler,battle|
next false if !battler.pbCanRaiseStatStage?(PBStats::SPEED,battler)
itemName = PBItems.getName(item)
battle.pbCommonAnimation("UseItem",battler)
next battler.pbRaiseStatStageByCause(PBStats::SPEED,1,battler,itemName)
}
)
#===============================================================================
# RunFromBattleItem handlers
#===============================================================================
BattleHandlers::RunFromBattleItem.add(:SMOKEBALL,
proc { |item,battler|
next true
}
)