diff --git a/Data/Scripts/011_Battle/001_Battler/007_Battler_UseMove.rb b/Data/Scripts/011_Battle/001_Battler/007_Battler_UseMove.rb index cdc4ee799..3e5f6c9bc 100644 --- a/Data/Scripts/011_Battle/001_Battler/007_Battler_UseMove.rb +++ b/Data/Scripts/011_Battle/001_Battler/007_Battler_UseMove.rb @@ -602,6 +602,9 @@ class PokeBattle_Battler targets.each do |b| next if !b.damageState.missed || b.damageState.magicCoat pbMissMessage(move,user,b) + if user.itemActive? + BattleHandlers.triggerUserItemOnMissing(user.item, user, b, move, hitNum, @battle) + end break if move.pbRepeatHit? # Dragon Darts only shows one failure message end move.pbCrashDamage(user) @@ -642,7 +645,13 @@ class PokeBattle_Battler end # Messages about missed target(s) (relevant for multi-target moves only) if !move.pbRepeatHit? - targets.each { |b| pbMissMessage(move, user, b) if b.damageState.missed } + targets.each do |b| + next if !b.damageState.missed + pbMissMessage(move, user, b) + if user.itemActive? + BattleHandlers.triggerUserItemOnMissing(user.item, user, b, move, hitNum, @battle) + end + end end # Deal the damage (to all allies first simultaneously, then all foes # simultaneously) diff --git a/Data/Scripts/011_Battle/001_Battler/009_Battler_UseMove_SuccessChecks.rb b/Data/Scripts/011_Battle/001_Battler/009_Battler_UseMove_SuccessChecks.rb index a881139ca..186de042a 100644 --- a/Data/Scripts/011_Battle/001_Battler/009_Battler_UseMove_SuccessChecks.rb +++ b/Data/Scripts/011_Battle/001_Battler/009_Battler_UseMove_SuccessChecks.rb @@ -556,6 +556,7 @@ class PokeBattle_Battler miss = true if !move.hitsFlyingTargets? end end + target.damageState.invulnerable = true if miss if !miss # Called by another move return true if skipAccuracyCheck diff --git a/Data/Scripts/011_Battle/002_BattleHandlers.rb b/Data/Scripts/011_Battle/002_BattleHandlers.rb index f8d9cb0b5..679d8aef8 100644 --- a/Data/Scripts/011_Battle/002_BattleHandlers.rb +++ b/Data/Scripts/011_Battle/002_BattleHandlers.rb @@ -32,6 +32,7 @@ module BattleHandlers AbilityOnFlinch = AbilityHandlerHash.new # Steadfast MoveBlockingAbility = AbilityHandlerHash.new MoveImmunityTargetAbility = AbilityHandlerHash.new + UserItemOnMissing = ItemHandlerHash.new # Blunder Policy # Move usage MoveBaseTypeModifierAbility = AbilityHandlerHash.new # Accuracy calculation @@ -234,6 +235,10 @@ module BattleHandlers return (ret!=nil) ? ret : false end + def self.triggerUserItemOnMissing(item, user, target, move, hit_num, battle) + UserItemOnMissing.trigger(item, user, target, move, hit_num, battle) + end + #============================================================================= def self.triggerMoveBaseTypeModifierAbility(ability,user,move,type) diff --git a/Data/Scripts/011_Battle/004_BattleHandlers_Items.rb b/Data/Scripts/011_Battle/004_BattleHandlers_Items.rb index 60d96a97b..9ae07c050 100644 --- a/Data/Scripts/011_Battle/004_BattleHandlers_Items.rb +++ b/Data/Scripts/011_Battle/004_BattleHandlers_Items.rb @@ -422,6 +422,22 @@ BattleHandlers::PriorityBracketUseItem.add(:QUICKCLAW, } ) +#=============================================================================== +# UserItemOnMissing handlers +#=============================================================================== + +BattleHandlers::PriorityBracketUseItem.add(:BLUNDERPOLICY, + proc { |item, user, target, move, hit_num, battle| + next if hit_num > 0 || target.damageState.invulnerable + next if ["OHKO", "OHKOIce", "OHKOHitsUndergroundTarget"].include?(move.function) + next if !user.pbCanRaiseStatStage?(:SPEED, user) + battle.pbCommonAnimation("UseItem", user) + user.pbRaiseStatStageByCause(:SPEED, 2, user, user.itemName) + battle.pbDisplay(_INTL("The {1} was used up...", user.itemName)) + user.pbHeldItemTriggered(item) + } +) + #=============================================================================== # AccuracyCalcUserItem handlers #=============================================================================== diff --git a/Data/Scripts/011_Battle/007_PokeBattle_DamageState.rb b/Data/Scripts/011_Battle/007_PokeBattle_DamageState.rb index 99a0afd3e..28afcb6da 100644 --- a/Data/Scripts/011_Battle/007_PokeBattle_DamageState.rb +++ b/Data/Scripts/011_Battle/007_PokeBattle_DamageState.rb @@ -9,6 +9,7 @@ class PokeBattle_DamageState attr_accessor :fainted # Whether battler was knocked out by the move attr_accessor :missed # Whether the move failed the accuracy check + attr_accessor :invulnerable # If the move missed due to two turn move invulnerability attr_accessor :calcDamage # Calculated damage attr_accessor :hpLost # HP lost by opponent, inc. HP lost by a substitute attr_accessor :critical # Critical hit flag @@ -29,6 +30,7 @@ class PokeBattle_DamageState @unaffected = false @protected = false @missed = false + @invulnerable = false @magicCoat = false @magicBounce = false @totalHPLost = 0 diff --git a/Data/Scripts/013_Items/Gen 8 items.rb b/Data/Scripts/013_Items/Gen 8 items.rb index 733c4cc68..7f0a3dfe7 100644 --- a/Data/Scripts/013_Items/Gen 8 items.rb +++ b/Data/Scripts/013_Items/Gen 8 items.rb @@ -388,11 +388,6 @@ When holder's stat(s) is lowered, consume item and holder switches out. Not triggered by Parting Shot, or if a faster mon's Eject Button/Eject Pack triggers. -Blunder Policy -If holder's move fails its accuracy check, consume item and holder gets +2 -Speed. Doesn't trigger if move was an OHKO move, or Triple Kick that hit at -least once. - Pokémon Box Link Key item, unusable. Enables pressing a button while in the party screen to open the "Organise Boxes" mode of Pokémon storage. This is disabled at certain times,