TechSkylander1518

PhoenixDex Moves Function Codes

May 24th, 2023 (edited)
739
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 63.28 KB | None | 0 0
  1. #Vanilla Essentials:
  2. #battler starts at 117
  3. #battler position starts at 8
  4. #Side starts at 22
  5. #Both sides starts at 13
  6. module PBEffects
  7.   #===========================================================================
  8.   # These effects apply to a battler
  9.   #===========================================================================
  10.   CatchBoost          = 117
  11.   Corrode             = 118
  12.   Deaf                = 119
  13.   GermSprayUse        = 120
  14.   PlagueStormUse      = 121
  15.   Quicksand           = 122
  16.   RingOfFire          = 123
  17.   Stoke               = 124
  18.   #=============================================================================
  19.   # These effects apply to a battler position
  20.   #=============================================================================
  21.   AfterShock                = 8
  22.   #=============================================================================
  23.   # These effects apply to a side
  24.   #=============================================================================
  25.   DustGuard       = 21
  26.   OilSlick        = 22
  27.   RainbowWall     = 23
  28.   #=============================================================================
  29.   # These effects apply to the battle (i.e. both sides)
  30.   #=============================================================================
  31.   Clangor         = 13
  32.   GardenType      = 14
  33.   GardenCount     = 15
  34. end
  35.  
  36. #===============================================================================
  37. # Decreases the target's Special Defense by 1 stage. Accuracy perfect in rain. (Acid Rain)
  38. #===============================================================================
  39. class Battle::Move::LowerTargetSpDef1AlwaysHitsInRain < Battle::Move::LowerTargetSpDef1
  40.   def pbBaseAccuracy(user, target)
  41.     case target.effectiveWeather
  42.     when :Rain, :HeavyRain
  43.       return 0
  44.     end
  45.     return super
  46.   end
  47. end
  48. #===============================================================================
  49. # Power increases with the user's coolness. (Amaze and Dragon Dive)
  50. #===============================================================================
  51. class Battle::Move::PowerHigherWithUserCoolness < Battle::Move
  52.   def pbBaseDamage(baseDmg, user, target)
  53.     return [(user.cool / 3).floor, 1].max
  54.   end
  55. end
  56. #===============================================================================
  57. # Two turn attack. Skips first turn, attacks second turn. Is invulnerable during
  58. # use. Ends target's protections upon hit. (Backstab)
  59. #===============================================================================
  60. class Battle::Move::TwoTurnAttackInvulnerableAlwaysCriticalHit < Battle::Move::TwoTurnMove
  61.   def pbChargingTurnMessage(user, targets)
  62.     @battle.pbDisplay(_INTL("{1} disappeared into shadow!", user.pbThis))
  63.   end
  64.  
  65.   def pbCritialOverride(user, target); return 1; end
  66. end
  67. #===============================================================================
  68. # Increases the target's Attack and Special Attack by 2 stages each. (Battle Cry)
  69. #===============================================================================
  70. class Battle::Move::RaiseTargetAtkSpAtk1 < Battle::Move
  71.   def pbMoveFailed?(user, targets)
  72.     failed = true
  73.     targets.each do |b|
  74.       next if !b.pbCanRaiseStatStage?(:ATTACK, user, self) &&
  75.               !b.pbCanRaiseStatStage?(:SPECIAL_ATTACK, user, self)
  76.       failed = false
  77.       break
  78.     end
  79.     if failed
  80.       @battle.pbDisplay(_INTL("But it failed!"))
  81.       return true
  82.     end
  83.     return false
  84.   end
  85.  
  86.   def pbEffectAgainstTarget(user, target)
  87.     if target.pbCanRaiseStatStage?(:ATTACK, user, self)
  88.       target.pbRaiseStatStage(:ATTACK, 1, user)
  89.     end
  90.     if target.pbCanRaiseStatStage?(:SPECIAL_ATTACK, user, self)
  91.       target.pbRaiseStatStage(:SPECIAL_ATTACK, 1, user)
  92.     end
  93.   end
  94. end
  95. #===============================================================================
  96. # User consumes held berry, restored 1/4HP, and gains its effect. (Berry Juicer)
  97. #===============================================================================
  98. class Battle::Move::UserConsumeHeldBerryRestoreQuarterTotalHP < Battle::Move
  99.   def healingMove?;       return true; end
  100.   def canSnatch?;         return true; end
  101.  
  102.   def pbCanChooseMove?(user, commandPhase, showMessages)
  103.     item = user.item
  104.     if !item || !item.is_berry? || !user.itemActive? || !user.canConsumeBerry?
  105.       if showMessages
  106.         msg = _INTL("{1} can't use that move because it doesn't have a Berry!", user.pbThis)
  107.         (commandPhase) ? @battle.pbDisplayPaused(msg) : @battle.pbDisplay(msg)
  108.       end
  109.       return false
  110.     end
  111.     return true
  112.   end
  113.  
  114.   def pbMoveFailed?(user, targets)
  115.     item = user.item
  116.     if !item || !item.is_berry? || !user.itemActive? || !user.canConsumeBerry?
  117.       @battle.pbDisplay(_INTL("But it failed!"))
  118.       return true
  119.     end
  120.     return super
  121.   end
  122.  
  123.   def pbEffectGeneral(user)
  124.     super
  125.     @battle.pbDisplay(_INTL("{1} ate its {2}!", user.pbThis, user.itemName))
  126.     item = user.item
  127.     user.pbConsumeItem(true, false)   # Don't trigger Symbiosis yet
  128.     user.pbHeldItemTriggerCheck(item, false)
  129.     user.pbRecoverHP((user.totalhp / 4.0).round)
  130.     @battle.pbDisplay(_INTL("{1}'s HP was restored.", user.pbThis))
  131.   end
  132. end
  133. #===============================================================================
  134. # Power is doubled if the target is affected by a mental non-volatile condition.
  135. # (Bewitch)
  136. #===============================================================================
  137. class Battle::Move::DoublePowerIfUserMentalEffect < Battle::Move
  138.   def pbBaseDamage(baseDmg, user, target)
  139.     if target.effects[PBEffects::Confusion] > 0 ||
  140.        target.effects[PBEffects::Curse] ||
  141.        target.effects[PBEffects::Embargo] > 0 ||
  142.        target.effects[PBEffects::Encore] > 0 ||
  143.        target.effects[PBEffects::HealBlock] > 0 ||
  144.        target.effects[PBEffects::Foresight] ||
  145.        target.effects[PBEffects::Attract] >= 0 ||
  146.        target.effects[PBEffects::Nightmare] ||
  147.        target.effects[PBEffects::PerishSong] > 0 ||
  148.        target.effects[PBEffects::Telekinesis] > 0 ||
  149.        target.effects[PBEffects::Taunt] > 0 ||
  150.        target.effects[PBEffects::Torment] ||
  151.        target.trappedInBattle?
  152.       baseDmg *= 2
  153.     end
  154.     return baseDmg
  155.   end
  156. end
  157. #===============================================================================
  158. # Power increases with the target's base Special Attack. (Brain Press)
  159. #===============================================================================
  160. class Battle::Move::PowerHigherWithTargetSpAtk < Battle::Move
  161.   def pbBaseDamage(baseDmg, user, target)
  162.     return [[(target.spatk / 2).floor, 1].max,150].min
  163.   end
  164. end
  165. #===============================================================================
  166. # Decreases the target's Defense by 1 stage, raises user's Attack by one stage. (Bravado)
  167. #===============================================================================
  168. class Battle::Move::LowerTargetDefense1RaiseUserAttack1 < Battle::Move::TargetStatDownMove
  169.   def initialize(battle, move)
  170.     super
  171.     @statDown = [:DEFENSE, 1]
  172.   end
  173. end
  174. #===============================================================================
  175. # User faints unless Pay Day is in effect,
  176. # even if the move does nothing else. (Break the Bank)
  177. #===============================================================================
  178. class Battle::Move::UserFaintsExplosiveUnlessPayday < Battle::Move
  179.   def worksWithNoTargets?;     return true; end
  180.   def pbNumHits(user, targets); return 1;    end
  181.  
  182.   def pbMoveFailed?(user, targets)
  183.     if !@battle.moldBreaker
  184.       bearer = @battle.pbCheckGlobalAbility(:DAMP)
  185.       if bearer
  186.         @battle.pbShowAbilitySplash(bearer)
  187.         if Battle::Scene::USE_ABILITY_SPLASH
  188.           @battle.pbDisplay(_INTL("{1} cannot use {2}!", user.pbThis, @name))
  189.         else
  190.           @battle.pbDisplay(_INTL("{1} cannot use {2} because of {3}'s {4}!",
  191.                                   user.pbThis, @name, bearer.pbThis(true), bearer.abilityName))
  192.         end
  193.         @battle.pbHideAbilitySplash(bearer)
  194.         return true
  195.       end
  196.     end
  197.     return false
  198.   end
  199.  
  200.   def pbSelfKO(user)
  201.     return if user.fainted?
  202.     if @field.effects[PBEffects::PayDay] > 0
  203.         @field.effects[PBEffects::PayDay] = 0
  204.         @battle.pbDisplay(_INTL("{1} used the energy of coins on the field!", user.pbThis))
  205.     else
  206.         user.pbReduceHP(user.hp, false)
  207.         user.pbItemHPHealCheck
  208.     end
  209.   end
  210. end
  211. #===============================================================================
  212. # Two turn attack. Skips first turn, attacks second turn. Burns the target.
  213. # If user has Flame Body ability, takes 1 turn instead. (Burning Strike)
  214. #===============================================================================
  215. class Battle::Move::TwoTurnAttackOneTurnFlameBodyBurnTarget < Battle::Move::TwoTurnMove
  216.   def pbIsChargingTurn?(user)
  217.     ret = super
  218.     if !user.effects[PBEffects::TwoTurnAttack] &&
  219.        user.hasActiveAbility?(:FLAMEBODY)
  220.       @powerHerb = false
  221.       @chargingTurn = true
  222.       @damagingTurn = true
  223.       return false
  224.     end
  225.     return ret
  226.   end
  227.  
  228.   def pbChargingTurnMessage(user, targets)
  229.     @battle.pbDisplay(_INTL("{1} built up heat!", user.pbThis))
  230.   end
  231.  
  232.   def pbEffectAgainstTarget(user, target)
  233.     return if damagingMove?
  234.     target.pbBurn(user)
  235.   end
  236.  
  237.   def pbAdditionalEffect(user, target)
  238.     return if target.damageState.substitute
  239.     target.pbBurn(user) if target.pbCanBurn?(user, false, self)
  240.   end
  241.  
  242. end
  243. #===============================================================================
  244. # Target becomes Rock type. (Calcify)
  245. #===============================================================================
  246. class Battle::Move::SetTargetTypesToRock < Battle::Move
  247.   def canMagicCoat?; return true; end
  248.  
  249.   def pbFailsAgainstTarget?(user, target, show_message)
  250.     if !target.canChangeType? || !GameData::Type.exists?(:ROCK) ||
  251.        !target.pbHasOtherType?(:ROCK)
  252.       @battle.pbDisplay(_INTL("But it failed!")) if show_message
  253.       return true
  254.     end
  255.     return false
  256.   end
  257.  
  258.   def pbEffectAgainstTarget(user, target)
  259.     target.pbChangeTypes(:ROCK)
  260.     typeName = GameData::Type.get(:ROCK).name
  261.     @battle.pbDisplay(_INTL("{1}'s type changed to {2}!", target.pbThis, typeName))
  262.   end
  263. end
  264. #===============================================================================
  265. # The target's ally loses 1/16 of its max HP. Can hit targets underwater. (Cannonball)
  266. #===============================================================================
  267. class Battle::Move::DamageTargetAllyDoublePowerIfTargetUnderwater < Battle::Move
  268.   def hitsDivingTargets?; return true; end
  269.  
  270.   def pbModifyDamage(damageMult, user, target)
  271.     damageMult *= 2 if target.inTwoTurnAttack?("TwoTurnAttackInvulnerableUnderwater")
  272.     return damageMult
  273.   end
  274.  
  275.   def pbEffectWhenDealingDamage(user, target)
  276.     hitAlly = []
  277.     target.allAllies.each do |b|
  278.       next if !b.near?(target.index)
  279.       next if !b.takesIndirectDamage?
  280.       hitAlly.push([b.index, b.hp])
  281.       b.pbReduceHP(b.totalhp / 16, false)
  282.     end
  283.     if hitAlly.length == 2
  284.       @battle.pbDisplay(_INTL("The splashing wave hit {1} and {2}!",
  285.                               @battle.battlers[hitAlly[0][0]].pbThis(true),
  286.                               @battle.battlers[hitAlly[1][0]].pbThis(true)))
  287.     elsif hitAlly.length > 0
  288.       hitAlly.each do |b|
  289.         @battle.pbDisplay(_INTL("The splashing wave hit {1}!",
  290.                                 @battle.battlers[b[0]].pbThis(true)))
  291.       end
  292.     end
  293.     hitAlly.each { |b| @battle.battlers[b[0]].pbItemHPHealCheck }
  294.   end
  295. end
  296. #===============================================================================
  297. # Heals user by an amount depending on the weather, with Rain being favored. (Clear Rain)
  298. #===============================================================================
  299. class Battle::Move::HealUserDependingOnRain < Battle::Move::HealingMove
  300.   def pbOnStartUse(user, targets)
  301.     case user.effectiveWeather
  302.     when :Rain, :HeavyRain
  303.       @healAmount = (user.totalhp * 2 / 3.0).round
  304.     when :None
  305.       @healAmount = (user.totalhp / 2.0).round
  306.     else
  307.       @healAmount = (user.totalhp / 4.0).round
  308.     end
  309.   end
  310.  
  311.   def pbHealAmount(user)
  312.     return @healAmount
  313.   end
  314. end
  315. #===============================================================================
  316. # Clears any active weather. (Clear Sky)
  317. #===============================================================================
  318. class Battle::Move::ClearWeather < Battle::Move::WeatherMove
  319.   def initialize(battle, move)
  320.     super
  321.     @weatherType = :None
  322.   end
  323. end
  324. #===============================================================================
  325. # Hits 2-5 times. If Payday has been used, doubles in power but clears the coins.
  326. # (Coin Shot)
  327. #===============================================================================
  328. class Battle::Move::HitTwoToFiveTimesPaydayPowerUp < Battle::Move::HitTwoToFiveTimes
  329.  
  330.   def pbBaseDamage(baseDmg, user, target)
  331.     if @field.effects[PBEffects::PayDay] > 0
  332.         @field.effects[PBEffects::PayDay] = 0
  333.         @battle.pbDisplay(_INTL("{1} used the energy of coins on the field!", user.pbThis))
  334.         baseDmg *= 2
  335.     end
  336.     return baseDmg
  337.   end
  338.  
  339. end
  340. #===============================================================================
  341. # Resets all target's positive stat stages to 0. (Cold Shower and Face Slap)
  342. #===============================================================================
  343. class Battle::Move::ResetTargetPositiveStatStages < Battle::Move
  344.   def pbEffectAgainstTarget(user, target)
  345.     if !target.damageState.substitute && target.hasRaisedStatStages?
  346.       GameData::Stat.each_battle do |s|
  347.         next if target.stages[s.id] <= 0
  348.         target.statsLoweredThisRound = true
  349.         target.statsDropped = true
  350.         target.stages[s.id] = 0
  351.       end
  352.       @battle.pbDisplay(_INTL("{1}'s positive stat changes were removed!", target.pbThis))
  353.     end
  354.   end
  355. end
  356. #===============================================================================
  357. # Power increases if the user has eaten a berry. Chance to flinch. (Compost Bomb)
  358. #===============================================================================
  359. class Battle::Move::FlinchTargetIncreasePowerIfUserConsumedBerry < Battle::FlinchTarget
  360.   def pbBaseDamage(baseDmg, user, target)
  361.     baseDmg *= 1.5 if user.belched?
  362.     return baseDmg
  363.   end
  364. end
  365. #===============================================================================
  366. # Power increases with the user's cleverness. (Confound and Phantasmata)
  367. #===============================================================================
  368. class Battle::Move::PowerHigherWithUserSmart < Battle::Move
  369.   def pbBaseDamage(baseDmg, user, target)
  370.     return [(user.smart/ 3).floor, 1].max
  371.   end
  372. end
  373. #===============================================================================
  374. # Target's positive Defense/Sp. Def stages set to 0. (Corrode)
  375. # Poison moves have normal effectiveness against the Steel-type target.
  376. #===============================================================================
  377. class Battle::Move::RemovePositiveDefenseStagesNegateSteelImmunity < Battle::Move
  378.   def canMagicCoat?;            return true; end
  379.   def ignoresSubstitute?(user); return true; end
  380.  
  381.   def pbEffectAgainstTarget(user, target)
  382.     if target.stages[:DEFENSE] > 0
  383.        target.stages[:DEFENSE] = 0
  384.        target.statsLoweredThisRound = true     
  385.     end
  386.     if target.stages[:SPECIAL_DEFENSE] > 0
  387.        target.stages[:SPECIAL_DEFENSE] = 0
  388.        target.statsLoweredThisRound = true     
  389.     end
  390.     target.effects[PBEffects::Corrode] = true
  391.     @battle.pbDisplay(_INTL("{1}'s defenses were corroded!", target.pbThis))
  392.   end
  393. end
  394.  
  395. #===============================================================================
  396. # Increases the user's Attack and Sp. Attack by 1 stage each.
  397. # In a sandstorm or hailstorm, increases are 2 stages each instead. (Crystallize)
  398. #===============================================================================
  399. class Battle::Move::RaiseUserDefSpDef1Or2InHailSand < Battle::Move::MultiStatUpMove
  400.   def initialize(battle, move)
  401.     super
  402.     @statUp = [:DEFENSE, 1, :SPECIAL_DEFENSE, 1]
  403.   end
  404.  
  405.   def pbOnStartUse(user, targets)
  406.     increment = 1
  407.     increment = 2 if [:Sandstorm, :Hail].include?(user.effectiveWeather)
  408.     @statUp[1] = @statUp[3] = increment
  409.   end
  410. end
  411. #===============================================================================
  412. # Power increases with the user's cuteness. (Dazzle and Prism Shower)
  413. #===============================================================================
  414. class Battle::Move::PowerHigherWithUserCuteness < Battle::Move
  415.   def pbBaseDamage(baseDmg, user, target)
  416.     return [(user.cute / 3).floor, 1].max
  417.   end
  418. end
  419. #===============================================================================
  420. # Power increases with the user's toughness. (Demolish and Wild Maul)
  421. #===============================================================================
  422. class Battle::Move::PowerHigherWithUserToughness < Battle::Move
  423.   def pbBaseDamage(baseDmg, user, target)
  424.     return [(user.tough / 3).floor, 1].max
  425.   end
  426. end
  427. #===============================================================================
  428. # Type effectiveness is multiplied by the Flying-type's effectiveness against
  429. # the target. Chance to paralyze the target. May cause the target to flinch. (Destroyer Driver)
  430. #===============================================================================
  431. class Battle::Move::EffectivenessIncludesDarkTypeParalyzeFlinchTarget < Battle::Move
  432.   def flinchingMove?; return true; end
  433.  
  434.   def pbAdditionalEffect(user, target)
  435.     return if target.damageState.substitute
  436.     chance = pbAdditionalEffectChance(user, target, 10)
  437.     return if chance == 0
  438.     if target.pbCanParalyze?(user, false, self) && @battle.pbRandom(100) < chance
  439.       target.pbParalyze(user)
  440.     end
  441.     target.pbFlinch(user) if @battle.pbRandom(100) < chance
  442.   end
  443.  
  444.   def pbCalcTypeModSingle(moveType, defType, user, target)
  445.     ret = super
  446.     if GameData::Type.exists?(:DARK)
  447.       darkEff = Effectiveness.calculate_one(:DARK, defType)
  448.       ret *= darkEff.to_f / Effectiveness::NORMAL_EFFECTIVE_ONE
  449.     end
  450.     return ret
  451.   end
  452.  
  453. end
  454. #===============================================================================
  455. # Two turn attack. Skips first turn, attacks second turn. (Drag Under)
  456. # (Handled in Battler's pbSuccessCheckPerHit): Is semi-invulnerable during use.
  457. # Target is also semi-invulnerable during use, and can't take any action.
  458. # Doesn't damage Water-type Pokémon (but still makes them unable to move during).
  459. #===============================================================================
  460. class Battle::Move::TwoTurnAttackInvulnerableUnderwaterTargetCannotAct < Battle::Move::TwoTurnMove
  461.  
  462.   def pbIsChargingTurn?(user)
  463.     # NOTE: Drag Under doesn't benefit from Power Herb, probably because it works
  464.     #       differently (i.e. immobilises the target during use too).
  465.     @powerHerb = false
  466.     @chargingTurn = (user.effects[PBEffects::TwoTurnAttack].nil?)
  467.     @damagingTurn = (!user.effects[PBEffects::TwoTurnAttack].nil?)
  468.     return !@damagingTurn
  469.   end
  470.  
  471.   def pbFailsAgainstTarget?(user, target, show_message)
  472.     if !target.opposes?(user)
  473.       @battle.pbDisplay(_INTL("But it failed!")) if show_message
  474.       return true
  475.     end
  476.     if target.effects[PBEffects::Substitute] > 0 && !ignoresSubstitute?(user)
  477.       @battle.pbDisplay(_INTL("But it failed!")) if show_message
  478.       return true
  479.     end
  480.     if Settings::MECHANICS_GENERATION >= 6 && target.pbWeight >= 2000   # 200.0kg
  481.       @battle.pbDisplay(_INTL("But it failed!")) if show_message
  482.       return true
  483.     end
  484.     if target.semiInvulnerable? ||
  485.        (target.effects[PBEffects::DragUnder] >= 0 && @chargingTurn)
  486.       @battle.pbDisplay(_INTL("But it failed!")) if show_message
  487.       return true
  488.     end
  489.     if target.effects[PBEffects::DragUnder] != user.index && @damagingTurn
  490.       @battle.pbDisplay(_INTL("But it failed!")) if show_message
  491.       return true
  492.     end
  493.     return false
  494.   end
  495.  
  496.   def pbCalcTypeMod(movetype, user, target)
  497.     return Effectiveness::INEFFECTIVE if target.pbHasType?(:WATER)
  498.     return super
  499.   end
  500.  
  501.   def pbChargingTurnMessage(user, targets)
  502.     @battle.pbDisplay(_INTL("{1} took {2} underwater!", user.pbThis, targets[0].pbThis(true)))
  503.   end
  504.  
  505.   def pbAttackingTurnMessage(user, targets)
  506.     @battle.pbDisplay(_INTL("{1} was freed from Drag Under!", targets[0].pbThis))
  507.   end
  508.  
  509.   def pbChargingTurnEffect(user, target)
  510.     target.effects[PBEffects::SkyDrop] = user.index
  511.   end
  512.  
  513.   def pbAttackingTurnEffect(user, target)
  514.     target.effects[PBEffects::SkyDrop] = -1
  515.   end
  516. end
  517. #===============================================================================
  518. # For 5 rounds, prevents moves' additional effects against user's side. (Dust Guard)
  519. #===============================================================================
  520. class Battle::Move::StartPreventAddEffectsAgainstUserSide < Battle::Move
  521.   def canSnatch?; return true; end
  522.  
  523.   def pbMoveFailed?(user, targets)
  524.     if user.pbOwnSide.effects[PBEffects::DustGuard] > 0
  525.       @battle.pbDisplay(_INTL("But it failed!"))
  526.       return true
  527.     end
  528.     return false
  529.   end
  530.  
  531.   def pbEffectGeneral(user)
  532.     user.pbOwnSide.effects[PBEffects::DustGuard] = 5
  533.     @battle.pbDisplay(_INTL("{1} protected {2} from moves' additional effects!", @name, user.pbTeam(true)))
  534.   end
  535. end
  536. #===============================================================================
  537. # Target is deafened, and unaffected by sound moves for the rest of the turn.
  538. # (Ear Splitter)
  539. #===============================================================================
  540. class Battle::Move::DeafenTarget < Battle::Move
  541.  
  542.   def pbEffectAgainstTarget(user, target)
  543.     return if damagingMove?
  544.     target.effects[PBEffects::Deaf] = 2
  545.     @battle.pbDisplay(_INTL("{1} was deafened!", target.pbThis))
  546.   end
  547.  
  548.   def pbAdditionalEffect(user, target)
  549.     return if target.damageState.substitute
  550.     target.effects[PBEffects::Deaf] = 2
  551.     @battle.pbDisplay(_INTL("{1} was deafened!", target.pbThis))
  552.   end
  553. end
  554. #===============================================================================
  555. # Paralyzes or burns the target. (Electroburn)
  556. #===============================================================================
  557. class Battle::Move::ParalyzeOrBurnTarget < Battle::Move
  558.   def pbAdditionalEffect(user, target)
  559.     return if target.damageState.substitute
  560.     case @battle.pbRandom(2)
  561.     when 0 then target.pbBurn(user) if target.pbCanBurn?(user, false, self)
  562.     when 1 then target.pbParalyze(user) if target.pbCanParalyze?(user, false, self)
  563.     end
  564.   end
  565. end
  566. #===============================================================================
  567. # Power increases with the user's beauty. (Enthrall and Elegant Wave)
  568. #===============================================================================
  569. class Battle::Move::PowerHigherWithUserBeauty < Battle::Move
  570.   def pbBaseDamage(baseDmg, user, target)
  571.     return [(user.beauty / 3).floor, 1].max
  572.   end
  573. end
  574. #===============================================================================
  575. # Increases the user's Sp. Attack and Speed by 1 stage each.
  576. # (Fairy Dance)
  577. #===============================================================================
  578. class Battle::Move::RaiseUserSpAtkSpd1 < Battle::Move::MultiStatUpMove
  579.   def initialize(battle, move)
  580.     super
  581.     @statUp = [:SPECIAL_ATTACK, 1, :SPEED, 1]
  582.   end
  583. end
  584. #===============================================================================
  585. # Decreases one random stat of the target by 2 stages (except HP). (Fairy Jinx)
  586. #===============================================================================
  587. class Battle::Move::LowerTargetRandomStat2 < Battle::Move
  588.   def pbFailsAgainstTarget?(user, target, show_message)
  589.     @statArray = []
  590.     GameData::Stat.each_battle do |s|
  591.       @statArray.push(s.id) if target.pbCanLowerStatStage?(s.id, user, self)
  592.     end
  593.     return false if damagingMove?
  594.     if @statArray.length == 0
  595.       @battle.pbDisplay(_INTL("{1}'s stats won't go any lower!", target.pbThis)) if show_message
  596.       return true
  597.     end
  598.     return false
  599.   end
  600.  
  601.   def pbEffectAgainstTarget(user, target)
  602.     stat = @statArray[@battle.pbRandom(@statArray.length)]
  603.     target.pbLowerStatStage(stat, 2, user)
  604.   end
  605. end
  606. #===============================================================================
  607. # Increases target's Speed by 1 stage. (Fanfare)
  608. #===============================================================================
  609. class Battle::Move::RaiseTargetSpeed1 < Battle::Move
  610.   def ignoresSubstitute?(user); return true; end
  611.  
  612.   def pbFailsAgainstTarget?(user, target, show_message)
  613.     return true if !target.pbCanRaiseStatStage?(:SPEED, user, self, show_message)
  614.     return false
  615.   end
  616.  
  617.   def pbEffectAgainstTarget(user, target)
  618.     target.pbRaiseStatStage(:SPEED, 1, user)
  619.   end
  620. end
  621. #===============================================================================
  622. # Decreases the target's Special Attack by 1 stage and burns it. (Fiery Charm)
  623. #===============================================================================
  624. class Battle::Move::BurnTargetLowerTargetSpAtk1 < Battle::Move::TargetStatDownMove
  625.   def initialize(battle, move)
  626.     super
  627.     @statDown = [:SPECIAL_ATTACK, 1]
  628.   end
  629.   def pbAdditionalEffect(user, target)
  630.     super      
  631.     return if target.damageState.substitute
  632.     target.pbBurn(user) if target.pbCanBurn?(user, false, self)
  633.   end
  634. end
  635. #===============================================================================
  636. # Decreases the target's Special Attack and Special Defense by 1 stage each. (Ghostly Touch)
  637. #===============================================================================
  638. class Battle::Move::LowerTargetSpAtkSpDef1 < Battle::Move::TargetMultiStatDownMove
  639.   def initialize(battle, move)
  640.     super
  641.     @statDown = [:SPECIAL_ATTACK, 1, :SPECIAL_DEFENSE, 1]
  642.   end
  643. end
  644. #===============================================================================
  645. # Two turn attack. Skips first turn, attacks second turn. (Glacier Rush)
  646. # Power halved in all weather except hail. In haik, takes 1 turn instead.
  647. #===============================================================================
  648. class Battle::Move::TwoTurnAttackOneTurnInHail < Battle::Move::TwoTurnMove
  649.   def pbIsChargingTurn?(user)
  650.     ret = super
  651.     if !user.effects[PBEffects::TwoTurnAttack] &&
  652.        [:Hail].include?(user.effectiveWeather)
  653.       @powerHerb = false
  654.       @chargingTurn = true
  655.       @damagingTurn = true
  656.       return false
  657.     end
  658.     return ret
  659.   end
  660.  
  661.   def pbChargingTurnMessage(user, targets)
  662.     @battle.pbDisplay(_INTL("{1} built up snow and ice!", user.pbThis))
  663.   end
  664.  
  665.   def pbBaseDamageMultiplier(damageMult, user, target)
  666.     damageMult /= 2 if ![:None, :Hail].include?(user.effectiveWeather)
  667.     return damageMult
  668.   end
  669. end
  670. #===============================================================================
  671. # For 5 rounds, creates a misty terrain which weakens Fighting- and Normal-type moves
  672. # and increases effect chance of moves. Affects non-airborne Pokémon only.
  673. # (Haunted Terrain)
  674. #===============================================================================
  675. class Battle::Move::StartHauntedTerrain < Battle::Move
  676.   def pbMoveFailed?(user, targets)
  677.     if @battle.field.terrain == :Haunted
  678.       @battle.pbDisplay(_INTL("But it failed!"))
  679.       return true
  680.     end
  681.     return false
  682.   end
  683.  
  684.   def pbEffectGeneral(user)
  685.     @battle.pbStartTerrain(user, :Haunted)
  686.   end
  687. end
  688. #===============================================================================
  689. # User gains stat stages equal to each of the target's positive stat stages,
  690. # and target's positive stat stages become 0, then lowers Special Defense.
  691. # (Heart Snare)
  692. #===============================================================================
  693. class Battle::Move::UserStealTargetPositiveStatStagesLowerTargetSpDef1 < Battle::Move
  694. #  def ignoresSubstitute?(user); return true; end
  695.  
  696.   def pbFailsAgainstTarget?(user, target, show_message)
  697.     return (!target.hasRaisedStatStages?) && !(target.pbCanLowerStatStage?(:SPECIAL_DEFENSE, user, self))
  698.   end
  699.  
  700.   def pbEffectAgainstTarget(user, target)
  701.     if target.hasRaisedStatStages?
  702.       pbShowAnimation(@id, user, target, 1)   # Stat stage-draining animation
  703.       @battle.pbDisplay(_INTL("{1} stole the target's boosted stats!", user.pbThis))
  704.       showAnim = true
  705.       GameData::Stat.each_battle do |s|
  706.         next if target.stages[s.id] <= 0
  707.         if user.pbCanRaiseStatStage?(s.id, user, self)
  708.           showAnim = false if user.pbRaiseStatStage(s.id, target.stages[s.id], user, showAnim)
  709.         end
  710.         target.statsLoweredThisRound = true
  711.         target.statsDropped = true
  712.         target.stages[s.id] = 0
  713.       end
  714.     end
  715.     if target.pbCanLowerStatStage?(:SPECIAL_DEFENSE, user, self)
  716.         target.pbLowerStatStage(:SPECIAL_DEFENSE, 1 user, self)
  717.     end
  718.   end
  719.  
  720. end
  721. #================================================================================
  722. # Increases the user's Attack by 1 stage for every team member
  723. # with a status effect/fainted. (Hero Rally)
  724. #================================================================================
  725. class Battle::Move::RaiseUserAttackPerAiledTeamMember < Battle::Move
  726.   def canSnatch?; return true; end
  727.  
  728.   def pbMoveFailed?(user, targets)
  729.     return false if damagingMove?
  730.     @heroRallyList = []
  731.     @battle.eachInTeamFromBattlerIndex(user.index) do |pkmn|
  732.       @heroRallyList.push(pkmn) if (!pkmn.able? || pkmn.status != :NONE) && (pkmn != user)
  733.     end
  734.     if @heroRallyList.length == 0
  735.       @battle.pbDisplay(_INTL("But it failed!"))
  736.       return true
  737.     end
  738.     return false
  739.   end
  740.  
  741.   def pbFailsAgainstTarget?(user, target, show_message)
  742.     return false if damagingMove?
  743.     return !target.pbCanRaiseStatStage?(:ATTACK, user, self, show_message)
  744.   end
  745.  
  746.   def pbEffectAgainstTarget(user, target)
  747.     return if damagingMove?
  748.     target.pbRaiseStatStage(:ATTACK, @heroRallyList.length, user)
  749.   end
  750.  
  751.   def pbAdditionalEffect(user, target)
  752.     return if !target.pbCanRaiseStatStage?(:ATTACK, user, self)
  753.     target.pbRaiseStatStage(:ATTACK, @heroRallyList.length, user)
  754.   end
  755. end
  756. #===============================================================================
  757. # Increases the user's Attack and accuracy by 1 stage each. (Hyper-Focus)
  758. #===============================================================================
  759. class Battle::Move::RaiseUserSpAtkAcc1 < Battle::Move::MultiStatUpMove
  760.   def initialize(battle, move)
  761.     super
  762.     @statUp = [:SPECIAL_ATTACK, 1, :ACCURACY, 1]
  763.   end
  764. end
  765. #===============================================================================
  766. # Power is doubled if the target is frozen. Thaws the target out. (Ice Drill)
  767. #===============================================================================
  768. class Battle::Move::DoublePowerIfTargetFrozenCureTarget < Battle::Move
  769.   def pbBaseDamage(baseDmg, user, target)
  770.     if target.asleep? &&
  771.        (target.effects[PBEffects::Substitute] == 0 || ignoresSubstitute?(user))
  772.       baseDmg *= 2
  773.     end
  774.     return baseDmg
  775.   end
  776.  
  777.   def pbEffectAfterAllHits(user, target)
  778.     return if target.fainted?
  779.     return if target.damageState.unaffected || target.damageState.substitute
  780.     return if target.status != :FROZEN
  781.     target.pbCureStatus
  782.   end
  783. end
  784. #===============================================================================
  785. # Increases the target's Attack and Speed by 1 stage each. (Invigorate)
  786. #===============================================================================
  787. class Battle::Move::RaiseTargetAtkSpeed1 < Battle::Move
  788.   def pbMoveFailed?(user, targets)
  789.     failed = true
  790.     targets.each do |b|
  791.       next if !b.pbCanRaiseStatStage?(:ATTACK, user, self) &&
  792.               !b.pbCanRaiseStatStage?(:SPEED, user, self)
  793.       failed = false
  794.       break
  795.     end
  796.     if failed
  797.       @battle.pbDisplay(_INTL("But it failed!"))
  798.       return true
  799.     end
  800.     return false
  801.   end
  802.  
  803.   def pbEffectAgainstTarget(user, target)
  804.     if target.pbCanRaiseStatStage?(:ATTACK, user, self)
  805.       target.pbRaiseStatStage(:ATTACK, 1, user)
  806.     end
  807.     if target.pbCanRaiseStatStage?(:SPEED, user, self)
  808.       target.pbRaiseStatStage(:SPEED, 1, user)
  809.     end
  810.   end
  811. end
  812. #===============================================================================
  813. # User must use this move for 2 or 3 more rounds. Target becomes trapped.
  814. # (Jaw Thrash)
  815. #===============================================================================
  816. class Battle::Move::MultiTurnAttackTrapTargetInBattle < Battle::Move
  817.   def pbEffectAfterAllHits(user, target)
  818.     if !target.damageState.unaffected && user.effects[PBEffects::Outrage] == 0
  819.       user.effects[PBEffects::Outrage] = 3 + @battle.pbRandom(2)
  820.       user.currentMove = @id
  821.       target.effects[PBEffects::MeanLook] = user.index
  822.     end
  823.     if user.effects[PBEffects::Outrage] > 0
  824.       user.effects[PBEffects::Outrage] -= 1
  825.       if user.effects[PBEffects::Outrage] == 0
  826.         target.effects[PBEffects::MeanLook] = 0
  827.         @battle.pbDisplay(_INTL("{1} was freed from {2}'s jaws!",target.pbThis,user.pbThis))
  828.       end
  829.     end
  830.   end
  831. end
  832.  
  833. #===============================================================================
  834. # Decreases one random stat of the target by 1 stage (except HP). (Jewel Blast)
  835. #===============================================================================
  836. class Battle::Move::LowerTargetRandomStat1 < Battle::TargetStatDownMove
  837.   def pbFailsAgainstTarget?(user, target, show_message)
  838.     @statArray = []
  839.     GameData::Stat.each_battle do |s|
  840.       @statArray.push(s.id) if target.pbCanLowerStatStage?(s.id, user, self)
  841.     end
  842.     return false if damagingMove?
  843.     if @statArray.length == 0
  844.       @battle.pbDisplay(_INTL("{1}'s stats won't go any lower!", target.pbThis)) if show_message
  845.       return true
  846.     end
  847.     return false
  848.   end
  849.  
  850.   def pbEffectAgainstTarget(user, target)
  851.     stat = @statArray[@battle.pbRandom(@statArray.length)]
  852.     target.pbLowerStatStage(stat, 1, user)
  853.   end
  854. end
  855. #===============================================================================
  856. # Increases the target's Special Attack and Speed by 1 stage each. (Jump-Start)
  857. #===============================================================================
  858. class Battle::Move::RaiseTargetSpAtkSpeed1 < Battle::Move
  859.   def pbMoveFailed?(user, targets)
  860.     failed = true
  861.     targets.each do |b|
  862.       next if !b.pbCanRaiseStatStage?(:SPECIAL_ATTACK, user, self) &&
  863.               !b.pbCanRaiseStatStage?(:SPEED, user, self)
  864.       failed = false
  865.       break
  866.     end
  867.     if failed
  868.       @battle.pbDisplay(_INTL("But it failed!"))
  869.       return true
  870.     end
  871.     return false
  872.   end
  873.  
  874.   def pbEffectAgainstTarget(user, target)
  875.     if target.pbCanRaiseStatStage?(:SPECIAL_ATTACK, user, self)
  876.       target.pbRaiseStatStage(:SPECIAL_ATTACK, 1, user)
  877.     end
  878.     if target.pbCanRaiseStatStage?(:SPEED, user, self)
  879.       target.pbRaiseStatStage(:SPEED, 1, user)
  880.     end
  881.   end
  882. end
  883. #===================================================================================
  884. # Power is doubled if the target has the Dark, Dragon, or Fairy type. (Knight Sword)
  885. #===================================================================================
  886. class Battle::Move::DoublePowerIfTargetDarkDragonFairy < Battle::Move
  887.   def pbBaseDamage(baseDmg, user, target)
  888.     baseDmg *= 2 if target.pbHasType?(:DARK) || target.pbHasType?(:DRAGON) || target.pbHasType?(:FAIRY)
  889.     return baseDmg
  890.   end
  891. end
  892. #===============================================================================
  893. # Cancels all multi-turn moves. (Lariat)
  894. #===============================================================================
  895. class Battle::Move::StopTargetMultiTurnMove < Battle::Move
  896.  
  897.   def pbEffectAgainstTarget(user, target)
  898.     if target.effects[PBEffects::TwoTurnAttack] || target.effects[PBEffects::Outrage] > 0 ||
  899.         target.effects[PBEffects::Rollout] > 0
  900.         target.effects[PBEffects::TwoTurnAttack] = nil
  901.         target.effects[PBEffects::Outrage] = 0
  902.         target.effects[PBEffects::Rollout] = 0
  903.         @battle.pbClearChoice(target.index) if !target.movedThisRound?
  904.     end
  905.     @battle.pbDisplay(_INTL("{1}'s attack was disrupted!", target.pbThis))
  906.   end
  907. end
  908. #===============================================================================
  909. # Power increases for every ally with a status effect/fainted.
  910. # (Last Stand, Phoenix Fire, Retribution)
  911. #===============================================================================
  912. class Battle::Move::PowerHigherWithAiledTeamMember < Battle::Move
  913.   def pbBaseDamage(baseDmg, user, target)
  914.     @battle.eachInTeamFromBattlerIndex(user.index) do |pkmn|
  915.       baseDmg += 20 if (!pkmn.able? || pkmn.status != :NONE) && (pkmn != user)
  916.     end
  917.     return baseDmg
  918.   end
  919. end
  920. #==================================================================================
  921. # For 5 rounds, surrounds the battle with a garden of Mental Herbs. (Mental Garden)
  922. #==================================================================================
  923. class Battle::Move::StartMentalGarden < Battle::Move
  924.   def pbMoveFailed?(user, targets)
  925.     if @battle.field.effects[PBEffects::GardenType] == "Mental"
  926.       @battle.pbDisplay(_INTL("But it failed!"))
  927.       return true
  928.     end
  929.     return false
  930.   end
  931.  
  932.   def pbEffectGeneral(user)
  933.     if @battle.field.effects[PBEffects::GardenCount] > 0
  934.         #pbCommonAnimation("GardenWilt")
  935.         @battle.pbDisplay(_INTL("The last garden wilted..."))
  936.     end
  937.     @battle.field.effects[PBEffects::GardenType] = "Mental"
  938.     @battle.field.effects[PBEffects::GardenCount] = 5
  939.     @battle.pbDisplay(_INTL("A garden of Mental Herbs bloomed around the battlefield!"))
  940.   end
  941.  
  942. end
  943. #===============================================================================
  944. # For 5 rounds, creates a miasma terrain which boosts Poison-type moves and damages
  945. # Pokémon at the end of each round. Affects non-airborne Pokémon only.
  946. # (Miasma Terrain)
  947. #===============================================================================
  948. class Battle::Move::StartMiasmaTerrain < Battle::Move
  949.   def pbMoveFailed?(user, targets)
  950.     if @battle.field.terrain == :Miasma
  951.       @battle.pbDisplay(_INTL("But it failed!"))
  952.       return true
  953.     end
  954.     return false
  955.   end
  956.  
  957.   def pbEffectGeneral(user)
  958.     @battle.pbStartTerrain(user, :Miasma)
  959.   end
  960. end
  961. #===============================================================================
  962. # Ignores all abilities that alter this move's success or damage.
  963. # (Handled in Battler_UseMoveTriggerEffects's pbEffectsOnMakingHit):
  964. # Ignores all items that alter this move's success or damage.
  965. # (Moonbeam Lance, Spire Lance, Stinger Lance, Winter Lance)
  966. #===============================================================================
  967. class Battle::Move::IgnoreTargetAbilityAndItem < Battle::Move
  968.   def pbChangeUsageCounters(user, specialUsage)
  969.     super
  970.     @battle.moldBreaker = true if !specialUsage
  971.   end
  972. end
  973. #===============================================================================
  974. # User takes recoil damage equal to 1/2 of the damage this move dealt.
  975. # May paralyze the target. (Mow Down)
  976. #===============================================================================
  977. class Battle::Move::RecoilHalfOfDamageDealtParalyzeTarget < Battle::Move::RecoilMove
  978.   def pbRecoilDamage(user, target)
  979.     return (target.damageState.totalHPLost / 2.0).round
  980.   end
  981.  
  982.   def pbAdditionalEffect(user, target)
  983.     return if target.damageState.substitute
  984.     target.pbParalyze(user) if target.pbCanParalyze?(user, false, self)
  985.   end
  986. end
  987. #===============================================================================
  988. # Target flinches and is deafened. (Noise Blast)
  989. #===============================================================================
  990. class Battle::Move::FlinchDeafenTarget < Battle::Move::FlinchTarget
  991.  
  992.   def pbEffectAgainstTarget(user, target)
  993.     super
  994.     target.effects[PBEffects::Deaf] = 2
  995.     @battle.pbDisplay(_INTL("{1} was deafened!", target.pbThis))
  996.   end
  997. end
  998. #===============================================================================
  999. # Entry hazard. Lays oil slick on the opposing side. (Oil Slick)
  1000. #===============================================================================
  1001. class Battle::Move::AddOilSlickToFoeSide < Battle::Move
  1002.   def canMagicCoat?; return true; end
  1003.  
  1004.   def pbMoveFailed?(user, targets)
  1005.     if user.pbOpposingSide.effects[PBEffects::OilSlick] > 0
  1006.       @battle.pbDisplay(_INTL("But it failed!"))
  1007.       return true
  1008.     end
  1009.     return false
  1010.   end
  1011.  
  1012.   def pbEffectGeneral(user)
  1013.     user.pbOpposingSide.effects[PBEffects::OilSlick] = 5
  1014.     @battle.pbDisplay(_INTL("Oil spilled in front of {1}!",
  1015.                             user.pbOpposingTeam(true)))
  1016.   end
  1017. end
  1018. #===============================================================================
  1019. # Uses a random move that the target knows. (Parodize)
  1020. #===============================================================================
  1021. class Battle::Move::UseRandomTargetMove < Battle::Move
  1022.   def ignoresSubstitute?(user); return true; end
  1023.   def callsAnotherMove?; return true; end
  1024.  
  1025.   def initialize(battle, move)
  1026.     super
  1027.     @moveBlacklist = [
  1028.       # Struggle, Belch
  1029.       "Struggle",                                          # Struggle
  1030.       "FailsIfUserNotConsumedBerry",                       # Belch
  1031.       # Moves that affect the moveset
  1032.       "ReplaceMoveThisBattleWithTargetLastMoveUsed",       # Mimic
  1033.       "ReplaceMoveWithTargetLastMoveUsed",                 # Sketch
  1034.       "TransformUserIntoTarget",                           # Transform         #Not listed on PhoenixDex
  1035.       # Counter moves
  1036.       "CounterPhysicalDamage",                             # Counter
  1037.       "CounterSpecialDamage",                              # Mirror Coat
  1038.       "CounterDamagePlusHalf",                             # Metal Burst        # Not listed on Bulbapedia/PhoenixDex
  1039.       # Helping Hand, Feint (always blacklisted together, don't know why)
  1040.       "PowerUpAllyMove",                                   # Helping Hand
  1041.       "RemoveProtections",                                 # Feint
  1042.       # Protection moves
  1043.       "ProtectUser",                                       # Detect, Protect
  1044.       "ProtectUserSideFromPriorityMoves",                  # Quick Guard        # Not listed on Bulbapedia for Copycat
  1045.       "ProtectUserSideFromMultiTargetDamagingMoves",       # Wide Guard         # Not listed on Bulbapedia for Copycat
  1046.       "UserEnduresFaintingThisTurn",                       # Endure
  1047.       "ProtectUserSideFromDamagingMovesIfUserFirstTurn",   # Mat Block
  1048.       "ProtectUserSideFromStatusMoves",                    # Crafty Shield      # Not listed on Bulbapedia/PhoenixDex
  1049.       "ProtectUserFromDamagingMovesKingsShield",           # King's Shield
  1050.       "ProtectUserFromTargetingMovesSpikyShield",          # Spiky Shield
  1051.       "ProtectUserBanefulBunker",                          # Baneful Bunker     #Not listed on PhoenixDex
  1052.       # Moves that call other moves
  1053.       "UseLastMoveUsedByTarget",                           # Mirror Move
  1054.       "UseLastMoveUsed",                                   # Copycat
  1055.       "UseMoveTargetIsAboutToUse",                         # Me First
  1056.       "UseRandomUserMoveIfAsleep",                         # Sleep Talk
  1057.       "UseRandomMoveFromUserParty",                        # Assist
  1058.       "UseRandomMove",                                     # Metronome
  1059.       "UseRandomTargetMove",                               # Parodize (this move)
  1060.       "UseMoveDependingOnEnvironment",                     # Nature Power       # Not listed on Bulbapedia or PhoenixDex
  1061.       # Target-switching moves
  1062.       "SwitchOutTargetStatusMove",                         # Roar, Whirlwind  
  1063.       "SwitchOutTargetDamagingMove",                       # Circle Throw, Dragon Tail
  1064.       # Move-redirecting and stealing moves
  1065.       "BounceBackProblemCausingStatusMoves",               # Magic Coat         # Not listed on Bulbapedia/PhoenixDex
  1066.       "StealAndUseBeneficialStatusMove",                   # Snatch
  1067.       "RedirectAllMovesToUser",                            # Follow Me, Rage Powder
  1068.       "RedirectAllMovesToTarget",                          # Spotlight          #Not listed on PhoenixDex
  1069.       # Set up effects that trigger upon KO
  1070.       "ReduceAttackerMovePPTo0IfUserFaints",               # Grudge             # Not listed on Bulbapedia/PhoenixDex
  1071.       "AttackerFaintsIfUserFaints",                        # Destiny Bond
  1072.       # Held item-moving moves
  1073.       "UserTakesTargetItem",                               # Covet, Thief
  1074.       "UserTargetSwapItems",                               # Switcheroo, Trick
  1075.       #"TargetTakesUserItem",                              # Bestow              #Not listed on PhoenixDex
  1076.       # Moves that start focussing at the start of the round
  1077.       "FailsIfUserDamagedThisTurn",                        # Focus Punch
  1078.       "UsedAfterUserTakesPhysicalDamage",                  # Shell Trap          #Not listed on PhoenixDex
  1079.       "BurnAttackerBeforeUserActs",                        # Beak Blast          #Not listed on PhoenixDex
  1080.       # Event moves that do nothing
  1081.       "DoesNothingFailsIfNoAlly",                          # Hold Hands          #Not listed on PhoenixDex
  1082.       "DoesNothingCongratulations"                         # Celebrate           #Not listed on PhoenixDex
  1083.       # Two-turn attacks
  1084.       "TwoTurnAttackInvulnerableInSky",                  # Fly
  1085.       "TwoTurnAttackInvulnerableUnderground",            # Dig
  1086.       "TwoTurnAttackInvulnerableUnderwater",             # Dive
  1087.       "TwoTurnAttackInvulnerableRemoveProtections",      # Shadow Force/Phantom Force
  1088. #      "TwoTurnAttack",                                   # Razor Wind                # Not listed on Bulbapedia/PhoenixDex
  1089. #      "TwoTurnAttackOneTurnInSun",                       # Solar Beam, Solar Blade   # Not listed on Bulbapedia/PhoenixDex
  1090. #      "TwoTurnAttackParalyzeTarget",                     # Freeze Shock              # Not listed on Bulbapedia/PhoenixDex
  1091. #      "TwoTurnAttackBurnTarget",                         # Ice Burn                  # Not listed on Bulbapedia/PhoenixDex
  1092. #      "TwoTurnAttackFlinchTarget",                       # Sky Attack                # Not listed on Bulbapedia/PhoenixDex
  1093. #      "TwoTurnAttackChargeRaiseUserDefense1",            # Skull Bash                # Not listed on Bulbapedia/PhoenixDex
  1094. #      "TwoTurnAttackInvulnerableInSkyParalyzeTarget",    # Bounce                    # Not listed on PhoenixDex
  1095. #      "TwoTurnAttackInvulnerableInSkyTargetCannotAct",   # Sky Drop                  # Not listed on PhoenixDex
  1096. #      "AllBattlersLoseHalfHPUserSkipsNextTurn",          # Shadow Half               # Not listed on PhoenixDex
  1097. #      "TwoTurnAttackRaiseUserSpAtkSpDefSpd2",            # Geomancy                  # Not listed on PhoenixDex
  1098.     ]
  1099.   end
  1100.  
  1101.   def pbMoveFailed?(user, targets)
  1102.     if @moveBlacklist.include?(GameData::Move.get(@copied_move).function_code)
  1103.       @battle.pbDisplay(_INTL("But it failed!"))
  1104.       return true
  1105.     end
  1106.     return false
  1107.   end
  1108.  
  1109.   def pbEffectAgainstTarget(user, target)
  1110.     user.pbUseMoveSimple(target.lastRegularMoveUsed, target.index)
  1111.   end
  1112.  
  1113.   def pbShowAnimation(id, user, targets, hitNum = 0, showAnimation = true)
  1114.     # No animation
  1115.   end
  1116. end
  1117. #===============================================================================
  1118. # Inflicts a random non-volatile status on the target. (Pixie Dust)
  1119. #===============================================================================
  1120. class Battle::Move::RandomStatusTarget < Battle::Move
  1121.   def pbAdditionalEffect(user, target)
  1122.     return if target.damageState.substitute
  1123.     case @battle.pbRandom(5)
  1124.     when 0 then target.pbBurn(user) if target.pbCanBurn?(user, false, self)
  1125.     when 1 then target.pbFreeze if target.pbCanFreeze?(user, false, self)
  1126.     when 2 then target.pbParalyze(user) if target.pbCanParalyze?(user, false, self)
  1127.     when 3 then target.pbPoison(user) if target.pbCanPoison?(user, false, self)
  1128.     when 4 then target.pbSleep if target.pbCanSleep?(user, false, self)
  1129.     end
  1130.   end
  1131. end
  1132. #==================================================================================
  1133. # For 5 rounds, surrounds the battle with a garden of Power Herbs. (Power Garden)
  1134. #==================================================================================
  1135. class Battle::Move::StartPowerGarden < Battle::Move
  1136.   def pbMoveFailed?(user, targets)
  1137.     if @battle.field.effects[PBEffects::GardenType] == "Power"
  1138.       @battle.pbDisplay(_INTL("But it failed!"))
  1139.       return true
  1140.     end
  1141.     return false
  1142.   end
  1143.  
  1144.   def pbEffectGeneral(user)
  1145.     if @battle.field.effects[PBEffects::GardenCount] > 0
  1146.         #pbCommonAnimation("GardenWilt")
  1147.         @battle.pbDisplay(_INTL("The last garden wilted..."))
  1148.     end
  1149.     @battle.field.effects[PBEffects::GardenType] = "Power"
  1150.     @battle.field.effects[PBEffects::GardenCount] = 5
  1151.     @battle.pbDisplay(_INTL("A garden of Power Herbs bloomed around the battlefield!"))
  1152.   end
  1153.  
  1154. end
  1155. #===============================================================================
  1156. # Decreases the target's Special Defense by 1 stage,
  1157. # raises user's Special Attack by one stage. (Psych Out)
  1158. #===============================================================================
  1159. class Battle::Move::LowerTargetSpDefense1RaiseUserSpAttack1 < Battle::Move::TargetStatDownMove
  1160.   def initialize(battle, move)
  1161.     super
  1162.     @statDown = [:SPECIAL_DEFENSE, 1]
  1163.   end
  1164. end
  1165. #===============================================================================
  1166. # Target's Special Defense is used instead of its Defense for this move's
  1167. # calculations. (Radiant Claw)
  1168. #===============================================================================
  1169. class Battle::Move::UseTargetSpDefInsteadOfTargetDefense < Battle::Move
  1170.   def pbGetDefenseStats(user, target)
  1171.     return target.spdef, target.stages[:SPECIAL_DEFENSE] + 6
  1172.   end
  1173. end
  1174. #===============================================================================
  1175. # For 5 rounds, lowers power of all attacks against the user's side. (Rainbow Wall)
  1176. #===============================================================================
  1177. class Battle::Move::StartWeakenDamageAgainstUserSide < Battle::Move
  1178.   def canSnatch?; return true; end
  1179.  
  1180.   def pbMoveFailed?(user, targets)
  1181.     if user.pbOwnSide.effects[PBEffects::RainbowWall] > 0
  1182.       @battle.pbDisplay(_INTL("But it failed!"))
  1183.       return true
  1184.     end
  1185.     return false
  1186.   end
  1187.  
  1188.   def pbEffectGeneral(user)
  1189.     user.pbOwnSide.effects[PBEffects::RainbowWall] = 5
  1190.     user.pbOwnSide.effects[PBEffects::RainbowWall] = 8 if user.hasActiveItem?(:LIGHTCLAY)
  1191.     @battle.pbDisplay(_INTL("{1} raised {2}'s defenses!", @name, user.pbTeam(true)))
  1192.   end
  1193. end
  1194. #===============================================================================
  1195. # Burns the target. May lower target's speed by one stage. (Rockflow)
  1196. #===============================================================================
  1197. class Battle::Move::BurnTargetLowerTargetSpeed1 < Battle::Move
  1198.  
  1199.   def pbAdditionalEffect(user, target)
  1200.     return if target.damageState.substitute
  1201.     chance = pbAdditionalEffectChance(user, target, 10)
  1202.     return if chance == 0
  1203.     if target.pbCanBurn?(user, false, self) && @battle.pbRandom(100) < chance
  1204.       target.pbBurn(user)
  1205.     end
  1206.     if target.pbCanLowerStatStage?(:SPEED, user, self) && @battle.pbRandom(100) < chance
  1207.       target.pbLowerStatStage(:SPEED, 1, user)
  1208.     end
  1209.   end
  1210. end
  1211. #===============================================================================
  1212. # Burns the target. Power doubles in a sandstorm. (Sandblast)
  1213. #===============================================================================
  1214. class Battle::Move::BurnTargetDoublePowerSandstorm < Battle::Move::BurnTarget
  1215.   def pbBaseDamage(baseDmg, user, target)
  1216.     baseDmg *= 2 if user.effectiveWeather == :Sandstorm
  1217.     return baseDmg
  1218.   end
  1219. end
  1220. #===============================================================================
  1221. # User copies the target's stat stages and lowers target's accuracy. (Snapshot)
  1222. #===============================================================================
  1223. class Battle::Move::UserStealTargetStatStagesLowersAccuracy < Battle::Move
  1224. #  def ignoresSubstitute?(user); return true; end
  1225.  
  1226.   def pbEffectAgainstTarget(user, target)
  1227.     GameData::Stat.each_battle do |s|
  1228.       if user.stages[s.id] > target.stages[s.id]
  1229.         user.statsLoweredThisRound = true
  1230.         user.statsDropped = true
  1231.       elsif user.stages[s.id] < target.stages[s.id]
  1232.         user.statsRaisedThisRound = true
  1233.       end
  1234.       user.stages[s.id] = target.stages[s.id]
  1235.     end
  1236.     if Settings::NEW_CRITICAL_HIT_RATE_MECHANICS
  1237.       user.effects[PBEffects::FocusEnergy] = target.effects[PBEffects::FocusEnergy]
  1238.       user.effects[PBEffects::LaserFocus]  = target.effects[PBEffects::LaserFocus]
  1239.     end
  1240.     target.pbResetStatStages
  1241.     if Settings::NEW_CRITICAL_HIT_RATE_MECHANICS
  1242.       target.effects[PBEffects::FocusEnergy] = 0
  1243.       target.effects[PBEffects::LaserFocus]  = 0
  1244.     end
  1245.     @battle.pbDisplay(_INTL("{1} took {2}'s stat changes!", user.pbThis, target.pbThis(true)))
  1246.     if target.pbCanLowerStatStage?(:ACCURACY, user, self)
  1247.         target.pbLowerStatStage(:ACCURACY, 1 user, self)
  1248.     end
  1249.   end
  1250. end
  1251. #===============================================================================
  1252. # Two turn attack. Skips first turn, attacks second turn. Paralyzes target.
  1253. # If user has Static ability, takes 1 turn instead. (Static Strike)
  1254. #===============================================================================
  1255. class Battle::Move::TwoTurnAttackOneTurnStaticParalyzeTarget < Battle::Move::TwoTurnMove
  1256.   def pbIsChargingTurn?(user)
  1257.     ret = super
  1258.     if !user.effects[PBEffects::TwoTurnAttack] &&
  1259.        user.hasActiveAbility?(:STATIC)
  1260.       @powerHerb = false
  1261.       @chargingTurn = true
  1262.       @damagingTurn = true
  1263.       return false
  1264.     end
  1265.     return ret
  1266.   end
  1267.  
  1268.   def pbChargingTurnMessage(user, targets)
  1269.     @battle.pbDisplay(_INTL("{1} built up static!", user.pbThis))
  1270.   end
  1271.  
  1272.   def pbEffectAgainstTarget(user, target)
  1273.     return if damagingMove?
  1274.     target.pbParalyze(user)
  1275.   end
  1276.  
  1277.   def pbAdditionalEffect(user, target)
  1278.     return if target.damageState.substitute
  1279.     target.pbParalyze(user) if target.pbCanParalyze?(user, false, self)
  1280.   end
  1281.  
  1282. end
  1283. #===============================================================================
  1284. # In double/triple battles, the user and its allies gain 25% of their total HP.
  1285. # In single battles, the user gains 50% of its total HP. (Steam Bath)
  1286. #===============================================================================
  1287. class Battle::Move::HealUserAndAlliesQuarterOfTotalHPOrHealUserHalfTotalHP < Battle::Move
  1288.   def healingMove?; return true; end
  1289.  
  1290.   def pbMoveFailed?(user, targets)
  1291.     if @battle.allSameSideBattlers(user).none? { |b| b.canHeal? }
  1292.       @battle.pbDisplay(_INTL("But it failed!"))
  1293.       return true
  1294.     end
  1295.     return false
  1296.   end
  1297.  
  1298.   def pbFailsAgainstTarget?(user, target, show_message)
  1299.     return !target.canHeal?
  1300.   end
  1301.  
  1302.   def pbEffectAgainstTarget(user, target)
  1303.     if @battle.pbSideBattlerCount(user) > 1
  1304.         target.pbRecoverHP(target.totalhp / 4)
  1305.     else
  1306.         target.pbRecoverHP(target.totalhp / 2)
  1307.     end
  1308.     @battle.pbDisplay(_INTL("{1}'s HP was restored.", target.pbThis))
  1309.   end
  1310. end
  1311. #===============================================================================
  1312. # User steals the target's item. If the user has an item, just removes the item.
  1313. # Items stolen from wild Pokémon are kept after the battle. (Sticky Fingers)
  1314. #===============================================================================
  1315. class Battle::Move::UserTakesOrTossesTargetItem < Battle::Move
  1316.   def pbEffectAfterAllHits(user, target)
  1317.     return if user.wild?   # Wild Pokémon can't thieve
  1318.     return if user.fainted?
  1319.     return if target.damageState.unaffected || target.damageState.substitute
  1320.     return if !target.item
  1321.     return if target.unlosableItem?(target.item)
  1322.     return if user.unlosableItem?(target.item)
  1323.     return if target.hasActiveAbility?(:STICKYHOLD) && !@battle.moldBreaker
  1324.     itemName = target.itemName
  1325.     if !user.item
  1326.         user.item = target.item
  1327.         @battle.pbDisplay(_INTL("{1} stole {2}'s {3}!", user.pbThis, target.pbThis(true), itemName))
  1328.     else
  1329.         @battle.pbDisplay(_INTL("{1} tossed {2}'s {3}!", user.pbThis, target.pbThis(true), itemName))
  1330.     end
  1331.     # Permanently steal the item from wild Pokémon
  1332.     if target.wild? && !user.initialItem && target.item == target.initialItem
  1333.       user.setInitialItem(target.item)
  1334.       target.pbRemoveItem
  1335.     else
  1336.       target.pbRemoveItem(false)
  1337.     end
  1338.     user.pbHeldItemTriggerCheck
  1339.   end
  1340. end
  1341. #===============================================================================
  1342. # Increases the user's Special Defense by 1 stage.
  1343. # Charges up user's next attack if it is Fire-type. (Stoke)
  1344. #===============================================================================
  1345. class Battle::Move::RaiseUserSpDef1PowerUpFireMove < Battle::Move::StatUpMove
  1346.   def initialize(battle, move)
  1347.     super
  1348.     @statUp = [:SPECIAL_DEFENSE, 1]
  1349.   end
  1350.  
  1351.   def pbEffectGeneral(user)
  1352.     user.effects[PBEffects::Stoke] = 2
  1353.     @battle.pbDisplay(_INTL("{1} began stoking its flames!", user.pbThis))
  1354.     super
  1355.   end
  1356. end
  1357. #===============================================================================
  1358. # In trainer battles, target switches out. Target and new opponent are both poisoned.
  1359. # In wild battles, makes target flee. If target is a higher level than the
  1360. # user, target is poisoned instead. (Viral Gale)
  1361. #===============================================================================
  1362. class Battle::Move::SwitchOutTargetStatusMovePoisonTarget < Battle::Move
  1363.   def ignoresSubstitute?(user); return true; end
  1364.   def canMagicCoat?;            return true; end
  1365.  
  1366.   def pbFailsAgainstTarget?(user, target, show_message)
  1367.     if target.hasActiveAbility?(:SUCTIONCUPS) && !@battle.moldBreaker
  1368.       target.pbPoison(user) if target.pbCanPoison?(user, false, self)
  1369.       if show_message
  1370.         @battle.pbShowAbilitySplash(target)
  1371.         if Battle::Scene::USE_ABILITY_SPLASH
  1372.           @battle.pbDisplay(_INTL("{1} anchors itself!", target.pbThis))
  1373.         else
  1374.           @battle.pbDisplay(_INTL("{1} anchors itself with {2}!", target.pbThis, target.abilityName))
  1375.         end
  1376.         @battle.pbHideAbilitySplash(target)
  1377.       end
  1378.       return true
  1379.     end
  1380.     if target.effects[PBEffects::Ingrain]
  1381.       target.pbPoison(user) if target.pbCanPoison?(user, false, self)
  1382.       @battle.pbDisplay(_INTL("{1} anchored itself with its roots!", target.pbThis)) if show_message
  1383.       return true
  1384.     end
  1385.     if !@battle.canRun || (@battle.wildBattle? && target.level > user.level)
  1386.       target.pbPoison(user) if target.pbCanPoison?(user, false, self)
  1387.       @battle.pbDisplay(_INTL("{1} remained in battle!", target.pbThis)) if show_message
  1388.       return true
  1389.     end
  1390.     if @battle.trainerBattle?
  1391.       canSwitch = false
  1392.       @battle.eachInTeamFromBattlerIndex(target.index) do |_pkmn, i|
  1393.         next if !@battle.pbCanSwitchLax?(target.index, i)
  1394.         canSwitch = true
  1395.         break
  1396.       end
  1397.       if !canSwitch
  1398.         target.pbPoison(user) if target.pbCanPoison?(user, false, self)
  1399.         @battle.pbDisplay(_INTL("{1} has no allies to take its place!"),target.pbThis) if show_message
  1400.         return true
  1401.       end
  1402.     end
  1403.     return false
  1404.   end
  1405.  
  1406.   def pbEffectGeneral(user)
  1407.     @battle.decision = 3 if @battle.wildBattle?   # Escaped from battle
  1408.   end
  1409.  
  1410.   def pbSwitchOutTargetEffect(user, targets, numHits, switched_battlers)
  1411.     return if @battle.wildBattle? || !switched_battlers.empty?
  1412.     return if user.fainted? || numHits == 0
  1413.     targets.each do |b|
  1414.       next if b.fainted? || b.damageState.unaffected
  1415.       b.pbPoison(user) if b.pbCanPoison?(user, false, self)
  1416.       next if b.effects[PBEffects::Ingrain]
  1417.       next if b.hasActiveAbility?(:SUCTIONCUPS) && !@battle.moldBreaker
  1418.       newPkmn = @battle.pbGetReplacementPokemonIndex(b.index, true)   # Random
  1419.       next if newPkmn < 0
  1420.       @battle.pbRecallAndReplace(b.index, newPkmn, true)
  1421.       @battle.pbDisplay(_INTL("{1} was dragged out!", b.pbThis))
  1422.       @battle.pbClearChoice(b.index)   # Replacement Pokémon does nothing this round
  1423.       @battle.pbOnBattlerEnteringBattle(b.index)
  1424.       switched_battlers.push(b.index)
  1425.       @battle.battlers[b.index].pbPoison(user) if b.pbCanPoison?(@battle.battlers[b.index], false, self)
  1426.       break
  1427.     end
  1428.   end
  1429. end
  1430. #===============================================================================
  1431. # Passes the user's non-volatile status onto the target. (Viral Strike)
  1432. #===============================================================================
  1433. class Battle::Move::PassUserStatusToTarget < Battle::Move
  1434.   def pbAdditionalEffect(user, target)
  1435.     return if target.damageState.substitute || !user.pbHasAnyStatus?
  1436.     if target.pbCanInflictStatus?(user.status, user, false, self)
  1437.         target.pbInflictStatus(user.status, user.statusCount, false, user)
  1438.     end
  1439.   end
  1440. end
  1441. #===============================================================================
  1442. # If target is Water-type, raises target's Special Attack 2 stages.
  1443. # Otherwise, lowers target's Special Attack 2 stages. (Waterlog)
  1444. #===============================================================================
  1445. class Battle::Move::LowerTargetSpAtk2RaiseWater < Battle::Move
  1446.   def canMagicCoat?; return true; end
  1447.  
  1448.   def pbFailsAgainstTarget?(user, target, show_message)
  1449.     return false if damagingMove?
  1450.     if target.pbHasType?(:WATER)
  1451.         return !target.pbCanRaiseStatStage?(:SPECIAL_ATTACK, user, self, show_message)
  1452.     else
  1453.         return !target.pbCanLowerStatStage?(:SPECIAL_ATTACK, user, self, show_message)
  1454.     end
  1455.   end
  1456.  
  1457.   def pbEffectAgainstTarget(user, target)
  1458.     return if damagingMove?
  1459.     if target.pbHasType?(:WATER)
  1460.         target.pbRaiseStatStage(:SPECIAL_ATTACK, 2, user)
  1461.     else
  1462.         target.pbLowerStatStage(:SPECIAL_ATTACK, 2, user)
  1463.     end
  1464.   end
  1465.  
  1466.   def pbAdditionalEffect(user, target)
  1467.     return if target.damageState.substitute
  1468.     if target.pbHasType?(:WATER)
  1469.         return if !target.pbCanRaiseStatStage?(:SPECIAL_ATTACK, user, self)
  1470.         target.pbRaiseStatStage(:SPECIAL_ATTACK, 2, user)
  1471.     else
  1472.         return if !target.pbCanLowerStatStage?(:SPECIAL_ATTACK, user, self)
  1473.         target.pbLowerStatStage(:SPECIAL_ATTACK, 2, user)
  1474.     end    
  1475.   end
  1476. end
  1477.  
  1478. #===============================================================================
  1479. # For 5 rounds, surrounds the battle with a garden of White Herbs. (White Garden)
  1480. #===============================================================================
  1481. class Battle::Move::StartWhiteGarden < Battle::Move
  1482.   def pbMoveFailed?(user, targets)
  1483.     if @battle.field.effects[PBEffects::GardenType] == "White"
  1484.       @battle.pbDisplay(_INTL("But it failed!"))
  1485.       return true
  1486.     end
  1487.     return false
  1488.   end
  1489.  
  1490.   def pbEffectGeneral(user)
  1491.     if @battle.field.effects[PBEffects::GardenCount] > 0
  1492.         #pbCommonAnimation("GardenWilt")
  1493.         @battle.pbDisplay(_INTL("The last garden wilted..."))
  1494.     end
  1495.     @battle.field.effects[PBEffects::GardenType] = "White"
  1496.     @battle.field.effects[PBEffects::GardenCount] = 5
  1497.     @battle.pbDisplay(_INTL("A garden of White Herbs bloomed around the battlefield!"))
  1498.   end
  1499.  
  1500. end
  1501. #===============================================================================
  1502. # Accuracy perfect when team has Tailwind. Hits targets in the sky. (Windstorm)
  1503. #===============================================================================
  1504. class Battle::Move::AlwaysHitsWithTailwindHitsTargetInSky < Battle::Move
  1505.   def hitsFlyingTargets?; return true; end
  1506.  
  1507.   def pbBaseAccuracy(user, target)
  1508.     return 0 if user.pbOwnSide.effects[PBEffects::Tailwind] > 0
  1509.     return super
  1510.   end
  1511. end
  1512.  
Add Comment
Please, Sign In to add comment