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 1fec2b87b..49234bd8c 100644 --- a/Data/Scripts/011_Battle/001_Battler/007_Battler_UseMove.rb +++ b/Data/Scripts/011_Battle/001_Battler/007_Battler_UseMove.rb @@ -397,7 +397,7 @@ class PokeBattle_Battler end end # Magic Coat/Magic Bounce checks (for moves which don't target Pokémon) - if targets.length==0 && move.canMagicCoat? + if targets.length==0 && move.statusMove? && move.canMagicCoat? @battle.pbPriority(true).each do |b| next if b.fainted? || !b.opposes?(user) next if b.semiInvulnerable? diff --git a/Data/Scripts/011_Battle/001_Battler/008_Battler_UseMove_Targeting.rb b/Data/Scripts/011_Battle/001_Battler/008_Battler_UseMove_Targeting.rb index c3cd1a6df..9b1e84b79 100644 --- a/Data/Scripts/011_Battle/001_Battler/008_Battler_UseMove_Targeting.rb +++ b/Data/Scripts/011_Battle/001_Battler/008_Battler_UseMove_Targeting.rb @@ -9,7 +9,7 @@ class PokeBattle_Battler def pbChangeUser(choice,move,user) # Snatch move.snatched = false - if move.canSnatch? + if move.statusMove? && move.canSnatch? newUser = nil; strength = 100 @battle.eachBattler do |b| next if b.effects[PBEffects::Snatch]==0 || 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 33e23c676..37a3cd2d5 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 @@ -385,7 +385,7 @@ class PokeBattle_Battler end end # Magic Coat/Magic Bounce - if move.canMagicCoat? && !target.semiInvulnerable? && target.opposes?(user) + if move.statusMove? && move.canMagicCoat? && !target.semiInvulnerable? && target.opposes?(user) if target.effects[PBEffects::MagicCoat] target.damageState.magicCoat = true target.effects[PBEffects::MagicCoat] = false diff --git a/Data/Scripts/011_Battle/002_Move/001_PokeBattle_Move.rb b/Data/Scripts/011_Battle/002_Move/001_PokeBattle_Move.rb index 964c48e06..66784c852 100644 --- a/Data/Scripts/011_Battle/002_Move/001_PokeBattle_Move.rb +++ b/Data/Scripts/011_Battle/002_Move/001_PokeBattle_Move.rb @@ -91,32 +91,31 @@ class PokeBattle_Move def damagingMove?; return @category!=2; end def statusMove?; return @category==2; end - def usableWhenAsleep?; return false; end - def unusableInGravity?; return false; end - def healingMove?; return false; end - def recoilMove?; return false; end - def flinchingMove?; return false; end - def callsAnotherMove?; return false; end + def usableWhenAsleep?; return false; end + def unusableInGravity?; return false; end + def healingMove?; return false; end + def recoilMove?; return false; end + def flinchingMove?; return false; end + def callsAnotherMove?; return false; end # Whether the move can/will hit more than once in the same turn (including # Beat Up which may instead hit just once). Not the same as pbNumHits>1. - def multiHitMove?; return false; end - def chargingTurnMove?; return false; end - def successCheckPerHit?; return false; end - def hitsFlyingTargets?; return false; end - def hitsDiggingTargets?; return false; end - def hitsDivingTargets?; return false; end - def ignoresReflect?; return false; end # For Brick Break - def cannotRedirect?; return false; end # For Future Sight/Doom Desire - def worksWithNoTargets?; return false; end # For Explosion - def damageReducedByBurn?; return true; end # For Facade - def triggersHyperMode?; return false; end + def multiHitMove?; return false; end + def chargingTurnMove?; return false; end + def successCheckPerHit?; return false; end + def hitsFlyingTargets?; return false; end + def hitsDiggingTargets?; return false; end + def hitsDivingTargets?; return false; end + def ignoresReflect?; return false; end # For Brick Break + def cannotRedirect?; return false; end # For Future Sight/Doom Desire + def worksWithNoTargets?; return false; end # For Explosion + def damageReducedByBurn?; return true; end # For Facade + def triggersHyperMode?; return false; end + def canSnatch?; return false; end + def canMagicCoat?; return false; end def contactMove?; return @flags[/a/]; end def canProtectAgainst?; return @flags[/b/]; end - def canMagicCoat?; return @flags[/c/]; end - def canSnatch?; return @flags[/d/]; end def canMirrorMove?; return @flags[/e/]; end - def canKingsRock?; return @flags[/f/]; end def thawsUser?; return @flags[/g/]; end def highCriticalRate?; return @flags[/h/]; end def bitingMove?; return @flags[/i/]; end diff --git a/Data/Scripts/011_Battle/002_Move/004_Move_Effects_Generic.rb b/Data/Scripts/011_Battle/002_Move/004_Move_Effects_Generic.rb index 63c4f21fd..a9a1d43d0 100644 --- a/Data/Scripts/011_Battle/002_Move/004_Move_Effects_Generic.rb +++ b/Data/Scripts/011_Battle/002_Move/004_Move_Effects_Generic.rb @@ -88,6 +88,8 @@ end # Generic status problem-inflicting classes. #=============================================================================== class PokeBattle_SleepMove < PokeBattle_Move + def canMagicCoat?; return true; end + def pbFailsAgainstTarget?(user,target) return false if damagingMove? return !target.pbCanSleep?(user,true,self) @@ -107,6 +109,8 @@ end class PokeBattle_PoisonMove < PokeBattle_Move + def canMagicCoat?; return true; end + def initialize(battle,move) super @toxic = false @@ -131,6 +135,8 @@ end class PokeBattle_ParalysisMove < PokeBattle_Move + def canMagicCoat?; return true; end + def pbFailsAgainstTarget?(user,target) return false if damagingMove? return !target.pbCanParalyze?(user,true,self) @@ -150,6 +156,8 @@ end class PokeBattle_BurnMove < PokeBattle_Move + def canMagicCoat?; return true; end + def pbFailsAgainstTarget?(user,target) return false if damagingMove? return !target.pbCanBurn?(user,true,self) @@ -169,6 +177,8 @@ end class PokeBattle_FreezeMove < PokeBattle_Move + def canMagicCoat?; return true; end + def pbFailsAgainstTarget?(user,target) return false if damagingMove? return !target.pbCanFreeze?(user,true,self) @@ -207,6 +217,8 @@ end class PokeBattle_ConfuseMove < PokeBattle_Move + def canMagicCoat?; return true; end + def pbFailsAgainstTarget?(user,target) return false if damagingMove? return !target.pbCanConfuse?(user,true,self) @@ -230,6 +242,8 @@ end # Generic user's stat increase/decrease classes. #=============================================================================== class PokeBattle_StatUpMove < PokeBattle_Move + def canSnatch?; return true; end + def pbMoveFailed?(user,targets) return false if damagingMove? return !user.pbCanRaiseStatStage?(@statUp[0],user,self,true) @@ -250,6 +264,8 @@ end class PokeBattle_MultiStatUpMove < PokeBattle_Move + def canSnatch?; return true; end + def pbMoveFailed?(user,targets) return false if damagingMove? failed = true @@ -308,6 +324,8 @@ end # Generic target's stat increase/decrease classes. #=============================================================================== class PokeBattle_TargetStatDownMove < PokeBattle_Move + def canMagicCoat?; return true; end + def pbFailsAgainstTarget?(user,target) return false if damagingMove? return !target.pbCanLowerStatStage?(@statDown[0],user,self,true) @@ -328,6 +346,8 @@ end class PokeBattle_TargetMultiStatDownMove < PokeBattle_Move + def canMagicCoat?; return true; end + def pbFailsAgainstTarget?(user,target) return false if damagingMove? failed = true @@ -489,6 +509,7 @@ end class PokeBattle_HealingMove < PokeBattle_Move def healingMove?; return true; end def pbHealAmount(user); return 1; end + def canSnatch?; return true; end def pbMoveFailed?(user,targets) if user.hp==user.totalhp diff --git a/Data/Scripts/011_Battle/002_Move/005_Move_Effects_000-07F.rb b/Data/Scripts/011_Battle/002_Move/005_Move_Effects_000-07F.rb index d6a8038c8..73a1edcaf 100644 --- a/Data/Scripts/011_Battle/002_Move/005_Move_Effects_000-07F.rb +++ b/Data/Scripts/011_Battle/002_Move/005_Move_Effects_000-07F.rb @@ -58,6 +58,8 @@ end # Makes the target drowsy; it falls asleep at the end of the next turn. (Yawn) #=============================================================================== class PokeBattle_Move_004 < PokeBattle_Move + def canMagicCoat?; return true; end + def pbFailsAgainstTarget?(user,target) if target.effects[PBEffects::Yawn]>0 @battle.pbDisplay(_INTL("But it failed!")) @@ -324,6 +326,7 @@ end #=============================================================================== class PokeBattle_Move_016 < PokeBattle_Move def ignoresSubstitute?(user); return true; end + def canMagicCoat?; return true; end def pbFailsAgainstTarget?(user,target) return false if damagingMove? @@ -365,6 +368,8 @@ end # Cures user of burn, poison and paralysis. (Refresh) #=============================================================================== class PokeBattle_Move_018 < PokeBattle_Move + def canSnatch?; return true; end + def pbMoveFailed?(user,targets) if ![:BURN, :POISON, :PARALYSIS].include?(user.status) @battle.pbDisplay(_INTL("But it failed!")) @@ -400,6 +405,7 @@ end # 6+). We achieve this by not targeting any battlers in Gen 5, since # pbSuccessCheckAgainstTarget is only called for targeted battlers. class PokeBattle_Move_019 < PokeBattle_Move + def canSnatch?; return true; end def worksWithNoTargets?; return true; end def pbMoveFailed?(user,targets) @@ -491,6 +497,8 @@ end # (Safeguard) #=============================================================================== class PokeBattle_Move_01A < PokeBattle_Move + def canSnatch?; return true; end + def pbMoveFailed?(user,targets) if user.pbOwnSide.effects[PBEffects::Safeguard]>0 @battle.pbDisplay(_INTL("But it failed!")) @@ -655,6 +663,8 @@ end # Increases the user's critical hit rate. (Focus Energy) #=============================================================================== class PokeBattle_Move_023 < PokeBattle_Move + def canSnatch?; return true; end + def pbMoveFailed?(user,targets) if user.effects[PBEffects::FocusEnergy]>=2 @battle.pbDisplay(_INTL("But it failed!")) @@ -905,6 +915,8 @@ end # (Shell Smash) #=============================================================================== class PokeBattle_Move_035 < PokeBattle_Move + def canSnatch?; return true; end + def initialize(battle,move) super @statUp = [:ATTACK,2,:SPECIAL_ATTACK,2,:SPEED,2] @@ -1015,6 +1027,8 @@ end # (Belly Drum) #=============================================================================== class PokeBattle_Move_03A < PokeBattle_Move + def canSnatch?; return true; end + def pbMoveFailed?(user,targets) hpLoss = [user.totalhp/2,1].max if user.hp<=hpLoss @@ -1109,6 +1123,8 @@ end # Increases the target's Special Attack by 1 stage. Confuses the target. (Flatter) #=============================================================================== class PokeBattle_Move_040 < PokeBattle_Move + def canMagicCoat?; return true; end + def pbMoveFailed?(user,targets) failed = true targets.each do |b| @@ -1138,6 +1154,8 @@ end # Increases the target's Attack by 2 stages. Confuses the target. (Swagger) #=============================================================================== class PokeBattle_Move_041 < PokeBattle_Move + def canMagicCoat?; return true; end + def pbMoveFailed?(user,targets) failed = true targets.each do |b| @@ -1567,6 +1585,8 @@ end # For 5 rounds, user's and ally's stat stages cannot be lowered by foes. (Mist) #=============================================================================== class PokeBattle_Move_056 < PokeBattle_Move + def canSnatch?; return true; end + def pbMoveFailed?(user,targets) if user.pbOwnSide.effects[PBEffects::Mist]>0 @battle.pbDisplay(_INTL("But it failed!")) @@ -1587,6 +1607,8 @@ end # Swaps the user's Attack and Defense stats. (Power Trick) #=============================================================================== class PokeBattle_Move_057 < PokeBattle_Move + def canSnatch?; return true; end + def pbEffectGeneral(user) user.attack,user.defense = user.defense,user.attack user.effects[PBEffects::PowerTrick] = !user.effects[PBEffects::PowerTrick] @@ -1652,6 +1674,8 @@ end # For 4 rounds, doubles the Speed of all battlers on the user's side. (Tailwind) #=============================================================================== class PokeBattle_Move_05B < PokeBattle_Move + def canSnatch?; return true; end + def pbMoveFailed?(user,targets) if user.pbOwnSide.effects[PBEffects::Tailwind]>0 @battle.pbDisplay(_INTL("But it failed!")) @@ -1780,6 +1804,8 @@ end # (Conversion) #=============================================================================== class PokeBattle_Move_05E < PokeBattle_Move + def canSnatch?; return true; end + def pbMoveFailed?(user,targets) if !user.canChangeType? @battle.pbDisplay(_INTL("But it failed!")) @@ -1858,6 +1884,8 @@ end # Changes user's type depending on the environment. (Camouflage) #=============================================================================== class PokeBattle_Move_060 < PokeBattle_Move + def canSnatch?; return true; end + def pbMoveFailed?(user,targets) if !user.canChangeType? @battle.pbDisplay(_INTL("But it failed!")) @@ -1934,6 +1962,8 @@ end # Target becomes Water type. (Soak) #=============================================================================== class PokeBattle_Move_061 < PokeBattle_Move + def canMagicCoat?; return true; end + def pbFailsAgainstTarget?(user,target) if !target.canChangeType? || !GameData::Type.exists?(:WATER) || !target.pbHasOtherType?(:WATER) @@ -1993,6 +2023,8 @@ end # Target's ability becomes Simple. (Simple Beam) #=============================================================================== class PokeBattle_Move_063 < PokeBattle_Move + def canMagicCoat?; return true; end + def pbMoveFailed?(user,targets) if !GameData::Ability.exists?(:SIMPLE) @battle.pbDisplay(_INTL("But it failed!")) @@ -2026,6 +2058,8 @@ end # Target's ability becomes Insomnia. (Worry Seed) #=============================================================================== class PokeBattle_Move_064 < PokeBattle_Move + def canMagicCoat?; return true; end + def pbMoveFailed?(user,targets) if !GameData::Ability.exists?(:INSOMNIA) @battle.pbDisplay(_INTL("But it failed!")) @@ -2101,6 +2135,8 @@ end # Target copies user's ability. (Entrainment) #=============================================================================== class PokeBattle_Move_066 < PokeBattle_Move + def canMagicCoat?; return true; end + def pbMoveFailed?(user,targets) if !user.ability @battle.pbDisplay(_INTL("But it failed!")) @@ -2211,6 +2247,8 @@ end # Target's ability is negated. (Gastro Acid) #=============================================================================== class PokeBattle_Move_068 < PokeBattle_Move + def canMagicCoat?; return true; end + def pbFailsAgainstTarget?(user,target) if target.unstoppableAbility? @battle.pbDisplay(_INTL("But it failed!")) diff --git a/Data/Scripts/011_Battle/002_Move/006_Move_Effects_080-0FF.rb b/Data/Scripts/011_Battle/002_Move/006_Move_Effects_080-0FF.rb index 1ce5c2d0d..271b0717c 100644 --- a/Data/Scripts/011_Battle/002_Move/006_Move_Effects_080-0FF.rb +++ b/Data/Scripts/011_Battle/002_Move/006_Move_Effects_080-0FF.rb @@ -805,6 +805,8 @@ end # For 5 rounds, foes' attacks cannot become critical hits. (Lucky Chant) #=============================================================================== class PokeBattle_Move_0A1 < PokeBattle_Move + def canSnatch?; return true; end + def pbMoveFailed?(user,targets) if user.pbOwnSide.effects[PBEffects::LuckyChant]>0 @battle.pbDisplay(_INTL("But it failed!")) @@ -826,6 +828,8 @@ end # (Reflect) #=============================================================================== class PokeBattle_Move_0A2 < PokeBattle_Move + def canSnatch?; return true; end + def pbMoveFailed?(user,targets) if user.pbOwnSide.effects[PBEffects::Reflect]>0 @battle.pbDisplay(_INTL("But it failed!")) @@ -847,6 +851,8 @@ end # For 5 rounds, lowers power of special attacks against the user's side. (Light Screen) #=============================================================================== class PokeBattle_Move_0A3 < PokeBattle_Move + def canSnatch?; return true; end + def pbMoveFailed?(user,targets) if user.pbOwnSide.effects[PBEffects::LightScreen]>0 @battle.pbDisplay(_INTL("But it failed!")) @@ -1006,6 +1012,7 @@ end #=============================================================================== class PokeBattle_Move_0A7 < PokeBattle_Move def ignoresSubstitute?(user); return true; end + def canMagicCoat?; return true; end def pbEffectAgainstTarget(user,target) target.effects[PBEffects::Foresight] = true @@ -1021,6 +1028,7 @@ end #=============================================================================== class PokeBattle_Move_0A8 < PokeBattle_Move def ignoresSubstitute?(user); return true; end + def canMagicCoat?; return true; end def pbEffectAgainstTarget(user,target) target.effects[PBEffects::MiracleEye] = true @@ -1065,6 +1073,8 @@ end # (Quick Guard) #=============================================================================== class PokeBattle_Move_0AB < PokeBattle_ProtectMove + def canSnatch?; return true; end + def initialize(battle,move) super @effect = PBEffects::QuickGuard @@ -1079,6 +1089,8 @@ end # (Wide Guard) #=============================================================================== class PokeBattle_Move_0AC < PokeBattle_ProtectMove + def canSnatch?; return true; end + def initialize(battle,move) super @effect = PBEffects::WideGuard @@ -1696,6 +1708,7 @@ end #=============================================================================== class PokeBattle_Move_0B7 < PokeBattle_Move def ignoresSubstitute?(user); return true; end + def canMagicCoat?; return true; end def pbFailsAgainstTarget?(user,target) if target.effects[PBEffects::Torment] @@ -1719,6 +1732,8 @@ end # Disables all target's moves that the user also knows. (Imprison) #=============================================================================== class PokeBattle_Move_0B8 < PokeBattle_Move + def canSnatch?; return true; end + def pbMoveFailed?(user,targets) if user.effects[PBEffects::Imprison] @battle.pbDisplay(_INTL("But it failed!")) @@ -1740,6 +1755,7 @@ end #=============================================================================== class PokeBattle_Move_0B9 < PokeBattle_Move def ignoresSubstitute?(user); return true; end + def canMagicCoat?; return true; end def pbFailsAgainstTarget?(user,target) if target.effects[PBEffects::Disable]>0 || !target.lastRegularMoveUsed @@ -1777,6 +1793,7 @@ end #=============================================================================== class PokeBattle_Move_0BA < PokeBattle_Move def ignoresSubstitute?(user); return true; end + def canMagicCoat?; return true; end def pbFailsAgainstTarget?(user,target) if target.effects[PBEffects::Taunt]>0 @@ -1812,6 +1829,8 @@ end # For 5 rounds, disables the target's healing moves. (Heal Block) #=============================================================================== class PokeBattle_Move_0BB < PokeBattle_Move + def canMagicCoat?; return true; end + def pbFailsAgainstTarget?(user,target) if target.effects[PBEffects::HealBlock]>0 @battle.pbDisplay(_INTL("But it failed!")) @@ -1835,6 +1854,7 @@ end #=============================================================================== class PokeBattle_Move_0BC < PokeBattle_Move def ignoresSubstitute?(user); return true; end + def canMagicCoat?; return true; end def initialize(battle,move) super @@ -2515,6 +2535,7 @@ end #=============================================================================== class PokeBattle_Move_0D7 < PokeBattle_Move def healingMove?; return true; end + def canSnatch?; return true; end def pbMoveFailed?(user,targets) if @battle.positions[user.index].effects[PBEffects::Wish]>0 @@ -2587,6 +2608,8 @@ end # (Aqua Ring) #=============================================================================== class PokeBattle_Move_0DA < PokeBattle_Move + def canSnatch?; return true; end + def pbMoveFailed?(user,targets) if user.effects[PBEffects::AquaRing] @battle.pbDisplay(_INTL("But it failed!")) @@ -2608,6 +2631,8 @@ end # round, and cannot flee or switch out. (Ingrain) #=============================================================================== class PokeBattle_Move_0DB < PokeBattle_Move + def canSnatch?; return true; end + def pbMoveFailed?(user,targets) if user.effects[PBEffects::Ingrain] @battle.pbDisplay(_INTL("But it failed!")) @@ -2629,6 +2654,8 @@ end # and the Pokémon in the user's position gains the same amount. (Leech Seed) #=============================================================================== class PokeBattle_Move_0DC < PokeBattle_Move + def canMagicCoat?; return true; end + def pbFailsAgainstTarget?(user,target) if target.effects[PBEffects::LeechSeed]>=0 @battle.pbDisplay(_INTL("{1} evaded the attack!",target.pbThis)) @@ -2697,7 +2724,8 @@ end # Heals target by 1/2 of its max HP. (Heal Pulse) #=============================================================================== class PokeBattle_Move_0DF < PokeBattle_Move - def healingMove?; return true; end + def healingMove?; return true; end + def canMagicCoat?; return true; end def pbFailsAgainstTarget?(user,target) if target.hp==target.totalhp @@ -2785,6 +2813,8 @@ end # User faints (if successful). #=============================================================================== class PokeBattle_Move_0E2 < PokeBattle_TargetMultiStatDownMove + def canMagicCoat?; return false; end + def initialize(battle,move) super @statDown = [:ATTACK,2,:SPECIAL_ATTACK,2] @@ -2811,6 +2841,7 @@ end #=============================================================================== class PokeBattle_Move_0E3 < PokeBattle_Move def healingMove?; return true; end + def canSnatch?; return true; end def pbMoveFailed?(user,targets) if !@battle.pbCanChooseNonActive?(user.index) @@ -2836,6 +2867,7 @@ end #=============================================================================== class PokeBattle_Move_0E4 < PokeBattle_Move def healingMove?; return true; end + def canSnatch?; return true; end def pbMoveFailed?(user,targets) if !@battle.pbCanChooseNonActive?(user.index) @@ -2978,6 +3010,7 @@ end #=============================================================================== class PokeBattle_Move_0EB < PokeBattle_Move def ignoresSubstitute?(user); return true; end + def canMagicCoat?; return true; end def pbFailsAgainstTarget?(user,target) if target.hasActiveAbility?(:SUCTIONCUPS) && !@battle.moldBreaker @@ -3152,6 +3185,8 @@ end # (Anchor Shot, Block, Mean Look, Spider Web, Spirit Shackle, Thousand Waves) #=============================================================================== class PokeBattle_Move_0EF < PokeBattle_Move + def canMagicCoat?; return true; end + def pbFailsAgainstTarget?(user,target) return false if damagingMove? if target.effects[PBEffects::MeanLook]>=0 @@ -3386,6 +3421,8 @@ end # User recovers the last item it held and consumed. (Recycle) #=============================================================================== class PokeBattle_Move_0F6 < PokeBattle_Move + def canSnatch?; return true; end + def pbMoveFailed?(user,targets) if !user.recycleItem @battle.pbDisplay(_INTL("But it failed!")) @@ -3611,6 +3648,8 @@ end # effect, and no items can be used on it. (Embargo) #=============================================================================== class PokeBattle_Move_0F8 < PokeBattle_Move + def canMagicCoat?; return true; end + def pbFailsAgainstTarget?(user,target) if target.effects[PBEffects::Embargo]>0 @battle.pbDisplay(_INTL("But it failed!")) diff --git a/Data/Scripts/011_Battle/002_Move/007_Move_Effects_100-17F.rb b/Data/Scripts/011_Battle/002_Move/007_Move_Effects_100-17F.rb index a6b515ae8..693dc7d4a 100644 --- a/Data/Scripts/011_Battle/002_Move/007_Move_Effects_100-17F.rb +++ b/Data/Scripts/011_Battle/002_Move/007_Move_Effects_100-17F.rb @@ -38,6 +38,8 @@ end # Entry hazard. Lays spikes on the opposing side (max. 3 layers). (Spikes) #=============================================================================== class PokeBattle_Move_103 < PokeBattle_Move + def canMagicCoat?; return true; end + def pbMoveFailed?(user,targets) if user.pbOpposingSide.effects[PBEffects::Spikes]>=3 @battle.pbDisplay(_INTL("But it failed!")) @@ -60,6 +62,8 @@ end # (Toxic Spikes) #=============================================================================== class PokeBattle_Move_104 < PokeBattle_Move + def canMagicCoat?; return true; end + def pbMoveFailed?(user,targets) if user.pbOpposingSide.effects[PBEffects::ToxicSpikes]>=2 @battle.pbDisplay(_INTL("But it failed!")) @@ -81,6 +85,8 @@ end # Entry hazard. Lays stealth rocks on the opposing side. (Stealth Rock) #=============================================================================== class PokeBattle_Move_105 < PokeBattle_Move + def canMagicCoat?; return true; end + def pbMoveFailed?(user,targets) if user.pbOpposingSide.effects[PBEffects::StealthRock] @battle.pbDisplay(_INTL("But it failed!")) @@ -222,6 +228,8 @@ end # User turns 1/4 of max HP into a substitute. (Substitute) #=============================================================================== class PokeBattle_Move_10C < PokeBattle_Move + def canSnatch?; return true; end + def pbMoveFailed?(user,targets) if user.effects[PBEffects::Substitute]>0 @battle.pbDisplay(_INTL("{1} already has a substitute!",user.pbThis)) @@ -323,6 +331,7 @@ end #=============================================================================== class PokeBattle_Move_10E < PokeBattle_Move def ignoresSubstitute?(user); return true; end + def canMagicCoat?; return true; end def pbFailsAgainstTarget?(user,target) failed = true @@ -469,6 +478,8 @@ end # user's stockpile by 1 (max. 3). (Stockpile) #=============================================================================== class PokeBattle_Move_112 < PokeBattle_Move + def canSnatch?; return true; end + def pbMoveFailed?(user,targets) if user.effects[PBEffects::Stockpile]>=3 @battle.pbDisplay(_INTL("{1} can't stockpile any more!",user.pbThis)) @@ -545,6 +556,7 @@ end #=============================================================================== class PokeBattle_Move_114 < PokeBattle_Move def healingMove?; return true; end + def canSnatch?; return true; end def pbMoveFailed?(user,targets) if user.effects[PBEffects::Stockpile]==0 @@ -700,6 +712,7 @@ end #=============================================================================== class PokeBattle_Move_119 < PokeBattle_Move def unusableInGravity?; return true; end + def canSnatch?; return true; end def pbMoveFailed?(user,targets) if user.effects[PBEffects::Ingrain] || @@ -724,6 +737,7 @@ end #=============================================================================== class PokeBattle_Move_11A < PokeBattle_Move def unusableInGravity?; return true; end + def canMagicCoat?; return true; end def pbFailsAgainstTarget?(user,target) if target.effects[PBEffects::Ingrain] || @@ -1095,6 +1109,7 @@ end # pbSuccessCheckAgainstTarget is only called for targeted battlers. class PokeBattle_Move_137 < PokeBattle_Move def ignoresSubstitute?(user); return true; end + def canSnatch?; return true; end def pbMoveFailed?(user,targets) @validTargets = [] @@ -1339,6 +1354,8 @@ end # stage each. (Venom Drench) #=============================================================================== class PokeBattle_Move_140 < PokeBattle_Move + def canMagicCoat?; return true; end + def pbMoveFailed?(user,targets) @validTargets = [] targets.each do |b| @@ -1374,6 +1391,8 @@ end # Reverses all stat changes of the target. (Topsy-Turvy) #=============================================================================== class PokeBattle_Move_141 < PokeBattle_Move + def canMagicCoat?; return true; end + def pbFailsAgainstTarget?(user,target) failed = true GameData::Stat.each_battle do |s| @@ -1400,6 +1419,8 @@ end # Gives target the Ghost type. (Trick-or-Treat) #=============================================================================== class PokeBattle_Move_142 < PokeBattle_Move + def canMagicCoat?; return true; end + def pbFailsAgainstTarget?(user,target) if !GameData::Type.exists?(:GHOST) || target.pbHasType?(:GHOST) || !target.canChangeType? @battle.pbDisplay(_INTL("But it failed!")) @@ -1421,6 +1442,8 @@ end # Gives target the Grass type. (Forest's Curse) #=============================================================================== class PokeBattle_Move_143 < PokeBattle_Move + def canMagicCoat?; return true; end + def pbFailsAgainstTarget?(user,target) if !GameData::Type.exists?(:GRASS) || target.pbHasType?(:GRASS) || !target.canChangeType? @battle.pbDisplay(_INTL("But it failed!")) @@ -1534,6 +1557,7 @@ end #=============================================================================== class PokeBattle_Move_148 < PokeBattle_Move def ignoresSubstitute?(user); return true; end + def canMagicCoat?; return true; end def pbFailsAgainstTarget?(user,target) if target.effects[PBEffects::Powder] @@ -1555,6 +1579,8 @@ end # This round, the user's side is unaffected by damaging moves. (Mat Block) #=============================================================================== class PokeBattle_Move_149 < PokeBattle_Move + def canSnatch?; return true; end + def pbMoveFailed?(user,targets) if user.turnCount > 1 @battle.pbDisplay(_INTL("But it failed!")) @@ -1751,6 +1777,8 @@ end # Entry hazard. Lays stealth rocks on the opposing side. (Sticky Web) #=============================================================================== class PokeBattle_Move_153 < PokeBattle_Move + def canMagicCoat?; return true; end + def pbMoveFailed?(user,targets) if user.pbOpposingSide.effects[PBEffects::StickyWeb] @battle.pbDisplay(_INTL("But it failed!")) @@ -1873,6 +1901,8 @@ end # Poisons the target and decreases its Speed by 1 stage. (Toxic Thread) #=============================================================================== class PokeBattle_Move_159 < PokeBattle_Move + def canMagicCoat?; return true; end + def pbFailsAgainstTarget?(user,target) if !target.pbCanPoison?(user,false,self) && !target.pbCanLowerStatStage?(:SPEED,user,self) @@ -1910,6 +1940,9 @@ end # (Purify) #=============================================================================== class PokeBattle_Move_15B < PokeBattle_HealingMove + def canSnatch?; return false; end # Because it affects a target + def canMagicCoat?; return true; end + def pbFailsAgainstTarget?(user,target) if target.status == :NONE @battle.pbDisplay(_INTL("But it failed!")) @@ -1943,6 +1976,7 @@ end # pbSuccessCheckAgainstTarget is only called for targeted battlers. class PokeBattle_Move_15C < PokeBattle_Move def ignoresSubstitute?(user); return true; end + def canSnatch?; return true; end def pbMoveFailed?(user,targets) @validTargets = [] @@ -2020,6 +2054,8 @@ end # (Laser Focus) #=============================================================================== class PokeBattle_Move_15E < PokeBattle_Move + def canSnatch?; return true; end + def pbEffectGeneral(user) user.effects[PBEffects::LaserFocus] = 2 @battle.pbDisplay(_INTL("{1} concentrated intensely!",user.pbThis)) @@ -2046,7 +2082,8 @@ end # it). (Strength Sap) #=============================================================================== class PokeBattle_Move_160 < PokeBattle_Move - def healingMove?; return true; end + def healingMove?; return true; end + def canMagicCoat?; return true; end def pbFailsAgainstTarget?(user,target) # NOTE: The official games appear to just check whether the target's Attack @@ -2210,6 +2247,8 @@ end # weather is not hail. (Aurora Veil) #=============================================================================== class PokeBattle_Move_167 < PokeBattle_Move + def canSnatch?; return true; end + def pbMoveFailed?(user,targets) if @battle.pbWeather != :Hail @battle.pbDisplay(_INTL("But it failed!")) @@ -2263,6 +2302,8 @@ end # (Spotlight) #=============================================================================== class PokeBattle_Move_16A < PokeBattle_Move + def canMagicCoat?; return true; end + def pbEffectAgainstTarget(user,target) target.effects[PBEffects::Spotlight] = 1 target.eachAlly do |b| @@ -2395,7 +2436,8 @@ end # (Floral Healing) #=============================================================================== class PokeBattle_Move_16E < PokeBattle_Move - def healingMove?; return true; end + def healingMove?; return true; end + def canMagicCoat?; return true; end def pbFailsAgainstTarget?(user,target) if target.hp==target.totalhp diff --git a/Data/Scripts/011_Battle/004_AI/004_AI_Move.rb b/Data/Scripts/011_Battle/004_AI/004_AI_Move.rb index b5d54c07b..b7d2629e4 100644 --- a/Data/Scripts/011_Battle/004_AI/004_AI_Move.rb +++ b/Data/Scripts/011_Battle/004_AI/004_AI_Move.rb @@ -262,15 +262,14 @@ class PokeBattle_AI end # Prefer flinching external effects (note that move effects which cause # flinching are dealt with in the function code part of score calculation) - if skill>=PBTrainerAI.mediumSkill + if skill>=PBTrainerAI.mediumSkill && !move.flinchingMove? if !target.hasActiveAbility?(:INNERFOCUS) && - !target.hasActiveAbility?(:SHIELDDUST) && - target.effects[PBEffects::Substitute]==0 + !target.hasActiveAbility?(:SHIELDDUST) && + target.effects[PBEffects::Substitute]==0 canFlinch = false - if move.canKingsRock? && user.hasActiveItem?([:KINGSROCK,:RAZORFANG]) + if user.hasActiveItem?([:KINGSROCK, :RAZORFANG]) canFlinch = true - end - if user.hasActiveAbility?(:STENCH) && !move.flinchingMove? + elsif user.hasActiveAbility?(:STENCH) canFlinch = true end realDamage *= 1.3 if canFlinch diff --git a/Data/Scripts/011_Battle/004_AI/006_AI_Move_Utilities.rb b/Data/Scripts/011_Battle/004_AI/006_AI_Move_Utilities.rb index 131c2ae9a..f4f03036f 100644 --- a/Data/Scripts/011_Battle/004_AI/006_AI_Move_Utilities.rb +++ b/Data/Scripts/011_Battle/004_AI/006_AI_Move_Utilities.rb @@ -115,7 +115,7 @@ class PokeBattle_AI target.hasActiveAbility?(:WONDERGUARD) return true if move.damagingMove? && user.index!=target.index && !target.opposes?(user) && target.hasActiveAbility?(:TELEPATHY) - return true if move.canMagicCoat? && target.hasActiveAbility?(:MAGICBOUNCE) && + return true if move.statusMove? && move.canMagicCoat? && target.hasActiveAbility?(:MAGICBOUNCE) && target.opposes?(user) return true if move.soundMove? && target.hasActiveAbility?(:SOUNDPROOF) return true if move.bombMove? && target.hasActiveAbility?(:BULLETPROOF)