Refactored ability/item/ball battle handlers, added "UltraBeast" species flag for Beast Ball

This commit is contained in:
Maruno17
2021-11-18 22:52:19 +00:00
parent 8307222009
commit 048a18b415
33 changed files with 1265 additions and 1228 deletions

View File

@@ -248,11 +248,11 @@ class Battle::Battler
speedMult = 1.0
# Ability effects that alter calculated Speed
if abilityActive?
speedMult = BattleHandlers.triggerSpeedCalcAbility(self.ability,self,speedMult)
speedMult = Battle::AbilityEffects.triggerSpeedCalc(self.ability, self, speedMult)
end
# Item effects that alter calculated Speed
if itemActive?
speedMult = BattleHandlers.triggerSpeedCalcItem(self.item,self,speedMult)
speedMult = Battle::ItemEffects.triggerSpeedCalc(self.item, self, speedMult)
end
# Other effects
speedMult *= 2 if pbOwnSide.effects[PBEffects::Tailwind]>0
@@ -275,10 +275,10 @@ class Battle::Battler
ret += @effects[PBEffects::WeightChange]
ret = 1 if ret<1
if abilityActive? && !@battle.moldBreaker
ret = BattleHandlers.triggerWeightCalcAbility(self.ability,self,ret)
ret = Battle::AbilityEffects.triggerWeightCalc(self.ability, self, ret)
end
if itemActive?
ret = BattleHandlers.triggerWeightCalcItem(self.item,self,ret)
ret = Battle::ItemEffects.triggerWeightCalc(self.item, self, ret)
end
return [ret,1].max
end

View File

@@ -9,14 +9,14 @@ class Battle::Battler
# "counts as having that status", which includes Comatose which can't be
# cured.
def pbHasStatus?(checkStatus)
if BattleHandlers.triggerStatusCheckAbilityNonIgnorable(self.ability,self,checkStatus)
if Battle::AbilityEffects.triggerStatusCheckNonIgnorable(self.ability, self, checkStatus)
return true
end
return @status==checkStatus
end
def pbHasAnyStatus?
if BattleHandlers.triggerStatusCheckAbilityNonIgnorable(self.ability,self,nil)
if Battle::AbilityEffects.triggerStatusCheckNonIgnorable(self.ability, self, nil)
return true
end
return @status != :NONE
@@ -102,15 +102,15 @@ class Battle::Battler
# Ability immunity
immuneByAbility = false
immAlly = nil
if BattleHandlers.triggerStatusImmunityAbilityNonIgnorable(self.ability,self,newStatus)
if Battle::AbilityEffects.triggerStatusImmunityNonIgnorable(self.ability, self, newStatus)
immuneByAbility = true
elsif selfInflicted || !@battle.moldBreaker
if abilityActive? && BattleHandlers.triggerStatusImmunityAbility(self.ability,self,newStatus)
if abilityActive? && Battle::AbilityEffects.triggerStatusImmunity(self.ability, self, newStatus)
immuneByAbility = true
else
allAllies.each do |b|
next if !b.abilityActive?
next if !BattleHandlers.triggerStatusImmunityAllyAbility(b.ability,self,newStatus)
next if !Battle::AbilityEffects.triggerStatusImmunityFromAlly(b.ability, self, newStatus)
immuneByAbility = true
immAlly = b
break
@@ -192,15 +192,15 @@ class Battle::Battler
end
return false if hasImmuneType
# Ability immunity
if BattleHandlers.triggerStatusImmunityAbilityNonIgnorable(self.ability,self,newStatus)
if Battle::AbilityEffects.triggerStatusImmunityNonIgnorable(self.ability, self, newStatus)
return false
end
if abilityActive? && BattleHandlers.triggerStatusImmunityAbility(self.ability,self,newStatus)
if abilityActive? && Battle::AbilityEffects.triggerStatusImmunity(self.ability, self, newStatus)
return false
end
allAllies.each do |b|
next if !b.abilityActive?
next if !BattleHandlers.triggerStatusImmunityAllyAbility(b.ability,self,newStatus)
next if !Battle::AbilityEffects.triggerStatusImmunityFromAlly(b.ability, self, newStatus)
return false
end
# Safeguard immunity
@@ -252,7 +252,7 @@ class Battle::Battler
pbCheckFormOnStatusChange
# Synchronize
if abilityActive?
BattleHandlers.triggerAbilityOnStatusInflicted(self.ability,self,user,newStatus)
Battle::AbilityEffects.triggerOnStatusInflicted(self.ability, self, user, newStatus)
end
# Status cures
pbItemStatusCureCheck
@@ -287,18 +287,18 @@ class Battle::Battler
if !hasActiveAbility?(:SOUNDPROOF)
return false if @battle.allBattlers.any? { |b| b.effects[PBEffects::Uproar] > 0 }
end
if BattleHandlers.triggerStatusImmunityAbilityNonIgnorable(self.ability, self, :SLEEP)
if Battle::AbilityEffects.triggerStatusImmunityNonIgnorable(self.ability, self, :SLEEP)
return false
end
# NOTE: Bulbapedia claims that Flower Veil shouldn't prevent sleep due to
# drowsiness, but I disagree because that makes no sense. Also, the
# comparable Sweet Veil does prevent sleep due to drowsiness.
if abilityActive? && BattleHandlers.triggerStatusImmunityAbility(self.ability, self, :SLEEP)
if abilityActive? && Battle::AbilityEffects.triggerStatusImmunity(self.ability, self, :SLEEP)
return false
end
allAllies.each do |b|
next if !b.abilityActive?
next if !BattleHandlers.triggerStatusImmunityAllyAbility(b.ability, self, :SLEEP)
next if !Battle::AbilityEffects.triggerStatusImmunityFromAlly(b.ability, self, :SLEEP)
return false
end
# NOTE: Bulbapedia claims that Safeguard shouldn't prevent sleep due to

View File

@@ -59,7 +59,7 @@ class Battle::Battler
@battle.pbDisplay(arrStatTexts[[increment-1,2].min])
# Trigger abilities upon stat gain
if abilityActive?
BattleHandlers.triggerAbilityOnStatGain(self.ability,self,stat,user)
Battle::AbilityEffects.triggerOnStatGain(self.ability, self, stat, user)
end
return true
end
@@ -88,7 +88,7 @@ class Battle::Battler
@battle.pbDisplay(arrStatTexts[[increment-1,2].min])
# Trigger abilities upon stat gain
if abilityActive?
BattleHandlers.triggerAbilityOnStatGain(self.ability,self,stat,user)
Battle::AbilityEffects.triggerOnStatGain(self.ability, self, stat, user)
end
return true
end
@@ -138,15 +138,15 @@ class Battle::Battler
return false
end
if abilityActive?
return false if BattleHandlers.triggerStatLossImmunityAbility(
return false if Battle::AbilityEffects.triggerStatLossImmunity(
self.ability,self,stat,@battle,showFailMsg) if !@battle.moldBreaker
return false if BattleHandlers.triggerStatLossImmunityAbilityNonIgnorable(
return false if Battle::AbilityEffects.triggerStatLossImmunityNonIgnorable(
self.ability,self,stat,@battle,showFailMsg)
end
if !@battle.moldBreaker
allAllies.each do |b|
next if !b.abilityActive?
return false if BattleHandlers.triggerStatLossImmunityAllyAbility(
return false if Battle::AbilityEffects.triggerStatLossImmunityFromAlly(
b.ability,b,self,stat,@battle,showFailMsg)
end
end
@@ -218,7 +218,7 @@ class Battle::Battler
@battle.pbDisplay(arrStatTexts[[increment-1,2].min])
# Trigger abilities upon stat loss
if abilityActive?
BattleHandlers.triggerAbilityOnStatLoss(self.ability,self,stat,user)
Battle::AbilityEffects.triggerOnStatLoss(self.ability, self, stat, user)
end
return true
end
@@ -264,7 +264,7 @@ class Battle::Battler
@battle.pbDisplay(arrStatTexts[[increment-1,2].min])
# Trigger abilities upon stat loss
if abilityActive?
BattleHandlers.triggerAbilityOnStatLoss(self.ability,self,stat,user)
Battle::AbilityEffects.triggerOnStatLoss(self.ability, self, stat, user)
end
return true
end
@@ -320,8 +320,8 @@ class Battle::Battler
return false
end
if abilityActive?
if BattleHandlers.triggerStatLossImmunityAbility(self.ability,self,:ATTACK,@battle,false) ||
BattleHandlers.triggerStatLossImmunityAbilityNonIgnorable(self.ability,self,:ATTACK,@battle,false)
if Battle::AbilityEffects.triggerStatLossImmunity(self.ability, self, :ATTACK, @battle, false) ||
Battle::AbilityEffects.triggerStatLossImmunityNonIgnorable(self.ability, self, :ATTACK, @battle, false)
@battle.pbDisplay(_INTL("{1}'s {2} prevented {3}'s {4} from working!",
pbThis,abilityName,user.pbThis(true),user.abilityName))
return false
@@ -329,7 +329,7 @@ class Battle::Battler
end
allAllies.each do |b|
next if !b.abilityActive?
if BattleHandlers.triggerStatLossImmunityAllyAbility(b.ability,b,self,:ATTACK,@battle,false)
if Battle::AbilityEffects.triggerStatLossImmunityFromAlly(b.ability, b, self, :ATTACK, @battle, false)
@battle.pbDisplay(_INTL("{1} is protected from {2}'s {3} by {4}'s {5}!",
pbThis,user.pbThis(true),user.abilityName,b.pbThis(true),b.abilityName))
return false

View File

@@ -4,7 +4,7 @@ class Battle::Battler
#=============================================================================
def pbAbilitiesOnSwitchOut
if abilityActive?
BattleHandlers.triggerAbilityOnSwitchOut(self.ability,self,false)
Battle::AbilityEffects.triggerOnSwitchOut(self.ability, self, false)
end
# Reset form
@battle.peer.pbOnLeavingBattle(@battle,@pokemon,@battle.usedInBattle[idxOwnSide][@index/2])
@@ -22,11 +22,11 @@ class Battle::Battler
# Self fainted; check all other battlers to see if their abilities trigger
@battle.pbPriority(true).each do |b|
next if !b || !b.abilityActive?
BattleHandlers.triggerAbilityChangeOnBattlerFainting(b.ability,b,self,@battle)
Battle::AbilityEffects.triggerChangeOnBattlerFainting(b.ability, b, self, @battle)
end
@battle.pbPriority(true).each do |b|
next if !b || !b.abilityActive?
BattleHandlers.triggerAbilityOnBattlerFainting(b.ability,b,self,@battle)
Battle::AbilityEffects.triggerOnBattlerFainting(b.ability, b, self, @battle)
end
pbAbilitiesOnNeutralizingGasEnding if hasActiveAbility?(:NEUTRALIZINGGAS, true)
pbItemsOnUnnerveEnding if hasActiveAbility?(:UNNERVE, true)
@@ -36,18 +36,18 @@ class Battle::Battler
def pbAbilitiesOnDamageTaken(move_user = nil)
return false if !@droppedBelowHalfHP
return false if !abilityActive?
return BattleHandlers.triggerAbilityOnHPDroppedBelowHalf(self.ability, self, move_user, @battle)
return Battle::AbilityEffects.triggerOnHPDroppedBelowHalf(self.ability, self, move_user, @battle)
end
def pbAbilityOnTerrainChange(ability_changed = false)
return if !abilityActive?
BattleHandlers.triggerAbilityOnTerrainChange(self.ability, self, @battle, ability_changed)
Battle::AbilityEffects.triggerOnTerrainChange(self.ability, self, @battle, ability_changed)
end
# Used for Rattled's Gen 8 effect. Called when Intimidate is triggered.
def pbAbilitiesOnIntimidated
return if !abilityActive?
BattleHandlers.triggerAbilityOnIntimidated(self.ability, self, @battle)
Battle::AbilityEffects.triggerOnIntimidated(self.ability, self, @battle)
end
def pbAbilitiesOnNeutralizingGasEnding
@@ -57,7 +57,7 @@ class Battle::Battler
@battle.pbPriority(true).each do |b|
next if b.fainted?
next if !b.unstoppableAbility? && !b.abilityActive?
BattleHandlers.triggerAbilityOnSwitchIn(b.ability, b, @battle)
Battle::AbilityEffects.triggerOnSwitchIn(b.ability, b, @battle)
end
end
@@ -84,7 +84,7 @@ class Battle::Battler
@battle.pbDisplay(_INTL("{1} traced {2}'s {3}!",pbThis,choice.pbThis(true),choice.abilityName))
@battle.pbHideAbilitySplash(self)
if !onSwitchIn && (unstoppableAbility? || abilityActive?)
BattleHandlers.triggerAbilityOnSwitchIn(self.ability,self,@battle)
Battle::AbilityEffects.triggerOnSwitchIn(self.ability, self, @battle)
end
end
end
@@ -96,7 +96,7 @@ class Battle::Battler
# Cures status conditions, confusion and infatuation.
def pbAbilityStatusCureCheck
if abilityActive?
BattleHandlers.triggerStatusCureAbility(self.ability,self)
Battle::AbilityEffects.triggerStatusCure(self.ability, self)
end
end
@@ -195,7 +195,7 @@ class Battle::Battler
pbContinualAbilityChecks(true) # Don't trigger Traced ability as it's triggered below
# Abilities that trigger upon switching in
if (!fainted? && unstoppableAbility?) || abilityActive?
BattleHandlers.triggerAbilityOnSwitchIn(self.ability, self, @battle)
Battle::AbilityEffects.triggerOnSwitchIn(self.ability, self, @battle)
end
# Status-curing ability check
pbAbilityStatusCureCheck
@@ -300,7 +300,7 @@ class Battle::Battler
# when forcibly consumed by Pluck/Fling.
if item_to_use
itm = item_to_use || self.item
if BattleHandlers.triggerTargetItemOnHitPositiveBerry(itm, self, @battle, true)
if Battle::ItemEffects.triggerOnBeingHitPositiveBerry(itm, self, @battle, true)
pbHeldItemTriggered(itm, false, fling)
end
end
@@ -311,7 +311,7 @@ class Battle::Battler
def pbItemHPHealCheck(item_to_use = nil, fling = false)
return if !item_to_use && !itemActive?
itm = item_to_use || self.item
if BattleHandlers.triggerHPHealItem(itm, self, @battle, !item_to_use.nil?)
if Battle::ItemEffects.triggerHPHeal(itm, self, @battle, !item_to_use.nil?)
pbHeldItemTriggered(itm, item_to_use.nil?, fling)
elsif !item_to_use
pbItemTerrainStatBoostCheck
@@ -326,7 +326,7 @@ class Battle::Battler
return if fainted?
return if !item_to_use && !itemActive?
itm = item_to_use || self.item
if BattleHandlers.triggerStatusCureItem(itm, self, @battle, !item_to_use.nil?)
if Battle::ItemEffects.triggerStatusCure(itm, self, @battle, !item_to_use.nil?)
pbHeldItemTriggered(itm, item_to_use.nil?, fling)
end
end
@@ -338,9 +338,9 @@ class Battle::Battler
return if fainted?
return if !item_to_use && !itemActive?
itm = item_to_use || self.item
if BattleHandlers.triggerEndOfMoveItem(itm, self, @battle, !item_to_use.nil?)
if Battle::ItemEffects.triggerOnEndOfUsingMove(itm, self, @battle, !item_to_use.nil?)
pbHeldItemTriggered(itm, item_to_use.nil?, fling)
elsif BattleHandlers.triggerEndOfMoveStatRestoreItem(itm, self, @battle, !item_to_use.nil?)
elsif Battle::ItemEffects.triggerOnEndOfUsingMoveStatRestore(itm, self, @battle, !item_to_use.nil?)
pbHeldItemTriggered(itm, item_to_use.nil?, fling)
end
end
@@ -354,7 +354,7 @@ class Battle::Battler
return if fainted?
return if !item_to_use && !itemActive?
itm = item_to_use || self.item
if BattleHandlers.triggerEndOfMoveStatRestoreItem(itm, self, @battle, !item_to_use.nil?)
if Battle::ItemEffects.triggerOnEndOfUsingMoveStatRestore(itm, self, @battle, !item_to_use.nil?)
pbHeldItemTriggered(itm, item_to_use.nil?, fling)
end
end
@@ -362,7 +362,7 @@ class Battle::Battler
# Called when the battle terrain changes and when a Pokémon loses HP.
def pbItemTerrainStatBoostCheck
return if !itemActive?
if BattleHandlers.triggerTerrainStatBoostItem(self.item, self, @battle)
if Battle::ItemEffects.triggerTerrainStatBoost(self.item, self, @battle)
pbHeldItemTriggered(self.item)
end
end
@@ -371,7 +371,7 @@ class Battle::Battler
# Intimidate has no effect on the Pokémon).
def pbItemOnIntimidatedCheck
return if !itemActive?
if BattleHandlers.triggerItemOnIntimidated(self.item, self, @battle)
if Battle::ItemEffects.triggerOnIntimidated(self.item, self, @battle)
pbHeldItemTriggered(self.item)
end
end
@@ -380,7 +380,7 @@ class Battle::Battler
def pbItemOnStatDropped(move_user = nil)
return false if !@statsDropped
return false if !itemActive?
return BattleHandlers.triggerItemOnStatDropped(self.item, self, move_user, @battle)
return Battle::ItemEffects.triggerOnStatLoss(self.item, self, move_user, @battle)
end
def pbItemsOnUnnerveEnding

View File

@@ -281,7 +281,7 @@ class Battle::Battler
# Dazzling/Queenly Majesty make the move fail here
@battle.pbPriority(true).each do |b|
next if !b || !b.abilityActive?
if BattleHandlers.triggerMoveBlockingAbility(b.ability,b,user,targets,move,@battle)
if Battle::AbilityEffects.triggerMoveBlocking(b.ability, b, user, targets, move, @battle)
@battle.pbDisplayBrief(_INTL("{1} used {2}!",user.pbThis,move.name))
@battle.pbShowAbilitySplash(b)
@battle.pbDisplay(_INTL("{1} cannot use {2}!",user.pbThis,move.name))
@@ -603,7 +603,7 @@ class Battle::Battler
next if !b.damageState.missed || b.damageState.magicCoat
pbMissMessage(move,user,b)
if user.itemActive?
BattleHandlers.triggerUserItemOnMissing(user.item, user, b, move, hitNum, @battle)
Battle::ItemEffects.triggerOnMissingTarget(user.item, user, b, move, hitNum, @battle)
end
break if move.pbRepeatHit? # Dragon Darts only shows one failure message
end
@@ -649,7 +649,7 @@ class Battle::Battler
next if !b.damageState.missed
pbMissMessage(move, user, b)
if user.itemActive?
BattleHandlers.triggerUserItemOnMissing(user.item, user, b, move, hitNum, @battle)
Battle::ItemEffects.triggerOnMissingTarget(user.item, user, b, move, hitNum, @battle)
end
end
end

View File

@@ -243,7 +243,7 @@ class Battle::Battler
if @effects[PBEffects::Flinch]
@battle.pbDisplay(_INTL("{1} flinched and couldn't move!",pbThis))
if abilityActive?
BattleHandlers.triggerAbilityOnFlinch(self.ability,self,@battle)
Battle::AbilityEffects.triggerOnFlinch(self.ability, self, @battle)
end
@lastMoveFailed = true
return false

View File

@@ -7,7 +7,7 @@ class Battle::Battler
# Target's ability
if target.abilityActive?(true)
oldHP = user.hp
BattleHandlers.triggerTargetAbilityOnHit(target.ability,user,target,move,@battle)
Battle::AbilityEffects.triggerOnBeingHit(target.ability, user, target, move, @battle)
user.pbItemHPHealCheck if user.hp<oldHP
end
# Cramorant - Gulp Missile
@@ -32,13 +32,13 @@ class Battle::Battler
end
# User's ability
if user.abilityActive?(true)
BattleHandlers.triggerUserAbilityOnHit(user.ability,user,target,move,@battle)
Battle::AbilityEffects.triggerOnDealingHit(user.ability, user, target, move, @battle)
user.pbItemHPHealCheck
end
# Target's item
if target.itemActive?(true)
oldHP = user.hp
BattleHandlers.triggerTargetItemOnHit(target.item,user,target,move,@battle)
Battle::ItemEffects.triggerOnBeingHit(target.item, user, target, move, @battle)
user.pbItemHPHealCheck if user.hp<oldHP
end
end
@@ -111,7 +111,7 @@ class Battle::Battler
end
# User's ability
if user.abilityActive?
BattleHandlers.triggerUserAbilityEndOfMove(user.ability,user,targets,move,@battle)
Battle::AbilityEffects.triggerOnEndOfUsingMove(user.ability, user, targets, move, @battle)
end
# Greninja - Battle Bond
if !user.fainted? && !user.effects[PBEffects::Transform] &&
@@ -182,7 +182,7 @@ class Battle::Battler
@battle.pbPriority(true).each do |b|
if targets.any? { |targetB| targetB.index==b.index }
if !b.damageState.unaffected && b.damageState.calcDamage > 0 && b.itemActive?
BattleHandlers.triggerTargetItemAfterMoveUse(b.item, b, user, move, switched_battlers, @battle)
Battle::ItemEffects.triggerAfterMoveUseFromTarget(b.item, b, user, move, switched_battlers, @battle)
end
end
# Target's Eject Pack
@@ -194,13 +194,13 @@ class Battle::Battler
end
# User's held item (Life Orb, Shell Bell, Throat Spray, Eject Pack)
if !switched_battlers.include?(user.index) && user.itemActive? # Only if user hasn't switched out
BattleHandlers.triggerUserItemAfterMoveUse(user.item,user,targets,move,numHits,@battle)
Battle::ItemEffects.triggerAfterMoveUseFromUser(user.item, user, targets, move, numHits, @battle)
end
# Target's ability (Berserk, Color Change, Emergency Exit, Pickpocket, Wimp Out)
@battle.pbPriority(true).each do |b|
if targets.any? { |targetB| targetB.index==b.index }
if !b.damageState.unaffected && !switched_battlers.include?(b.index) && b.abilityActive?
BattleHandlers.triggerTargetAbilityAfterMoveUse(b.ability, b, user, move, switched_battlers, @battle)
Battle::AbilityEffects.triggerAfterMoveUseFromTarget(b.ability, b, user, move, switched_battlers, @battle)
end
end
# Target's Emergency Exit, Wimp Out (including for Pokémon hurt by Flame Burst)