#=============================================================================== # No additional effect. #=============================================================================== class PokeBattle_Move_None < PokeBattle_Move end #=============================================================================== # Does absolutely nothing. Shows a special message. (Celebrate) #=============================================================================== class PokeBattle_Move_DoesNothingCongratuations < PokeBattle_Move def pbEffectGeneral(user) if user.wild? @battle.pbDisplay(_INTL("Congratulations from {1}!",user.pbThis(true))) else @battle.pbDisplay(_INTL("Congratulations, {1}!",@battle.pbGetOwnerName(user.index))) end end end #=============================================================================== # Does absolutely nothing. (Hold Hands) #=============================================================================== class PokeBattle_Move_DoesNothingFailsIfNoAlly < PokeBattle_Move def ignoresSubstitute?(user); return true; end def pbMoveFailed?(user,targets) if user.allAllies.length == 0 @battle.pbDisplay(_INTL("But it failed!")) return true end return false end end #=============================================================================== # Does absolutely nothing. (Splash) #=============================================================================== class PokeBattle_Move_DoesNothingUnusableInGravity < PokeBattle_Move def unusableInGravity?; return true; end def pbEffectGeneral(user) @battle.pbDisplay(_INTL("But nothing happened!")) end end #=============================================================================== # Struggle, if defined as a move in moves.txt. Typically it won't be. #=============================================================================== class PokeBattle_Move_Struggle < PokeBattle_Struggle end #=============================================================================== # Scatters coins that the player picks up after winning the battle. (Pay Day) # NOTE: In Gen 6+, if the user levels up after this move is used, the amount of # money picked up depends on the user's new level rather than its level # when it used the move. I think this is silly, so I haven't coded this # effect. #=============================================================================== class PokeBattle_Move_AddMoneyGainedFromBattle < PokeBattle_Move def pbEffectGeneral(user) if user.pbOwnedByPlayer? @battle.field.effects[PBEffects::PayDay] += 5*user.level end @battle.pbDisplay(_INTL("Coins were scattered everywhere!")) end end #=============================================================================== # Doubles the prize money the player gets after winning the battle. (Happy Hour) #=============================================================================== class PokeBattle_Move_DoubleMoneyGainedFromBattle < PokeBattle_Move def pbEffectGeneral(user) @battle.field.effects[PBEffects::HappyHour] = true if !user.opposes? @battle.pbDisplay(_INTL("Everyone is caught up in the happy atmosphere!")) end end #=============================================================================== # Fails if this isn't the user's first turn. (First Impression) #=============================================================================== class PokeBattle_Move_FailsIfNotUserFirstTurn < PokeBattle_Move def pbMoveFailed?(user,targets) if user.turnCount > 1 @battle.pbDisplay(_INTL("But it failed!")) return true end return false end end #=============================================================================== # Fails unless user has already used all other moves it knows. (Last Resort) #=============================================================================== class PokeBattle_Move_FailsIfUserHasUnusedMove < PokeBattle_Move def pbFailsAgainstTarget?(user, target, show_message) hasThisMove = false hasOtherMoves = false hasUnusedMoves = false user.eachMove do |m| hasThisMove = true if m.id==@id hasOtherMoves = true if m.id!=@id hasUnusedMoves = true if m.id!=@id && !user.movesUsed.include?(m.id) end if !hasThisMove || !hasOtherMoves || hasUnusedMoves @battle.pbDisplay(_INTL("But it failed!")) if show_message return true end return false end end #=============================================================================== # Fails unless user has consumed a berry at some point. (Belch) #=============================================================================== class PokeBattle_Move_FailsIfUserNotConsumedBerry < PokeBattle_Move def pbCanChooseMove?(user,commandPhase,showMessages) if !user.belched? if showMessages msg = _INTL("{1} hasn't eaten any held berry, so it can't possibly belch!",user.pbThis) (commandPhase) ? @battle.pbDisplayPaused(msg) : @battle.pbDisplay(msg) end return false end return true end def pbMoveFailed?(user,targets) if !user.belched? @battle.pbDisplay(_INTL("But it failed!")) return true end return false end end #=============================================================================== # Fails if the target is not holding an item, or if the target is affected by # Magic Room/Klutz. (Poltergeist) #=============================================================================== class PokeBattle_Move_FailsIfTargetHasNoItem < PokeBattle_Move def pbFailsAgainstTarget?(user, target, show_message) if !target.item || !target.itemActive? @battle.pbDisplay(_INTL("But it failed!")) if show_message return true end @battle.pbDisplay(_INTL("{1} is about to be attacked by its {2}!", target.pbThis, target.itemName)) return false end end #=============================================================================== # Only damages Pokémon that share a type with the user. (Synchronoise) #=============================================================================== class PokeBattle_Move_FailsUnlessTargetSharesTypeWithUser < PokeBattle_Move def pbFailsAgainstTarget?(user, target, show_message) userTypes = user.pbTypes(true) targetTypes = target.pbTypes(true) sharesType = false userTypes.each do |t| next if !targetTypes.include?(t) sharesType = true break end if !sharesType @battle.pbDisplay(_INTL("{1} is unaffected!",target.pbThis)) if show_message return true end return false end end #=============================================================================== # Fails if user was hit by a damaging move this round. (Focus Punch) #=============================================================================== class PokeBattle_Move_FailsIfUserDamagedThisTurn < PokeBattle_Move def pbDisplayChargeMessage(user) user.effects[PBEffects::FocusPunch] = true @battle.pbCommonAnimation("FocusPunch",user) @battle.pbDisplay(_INTL("{1} is tightening its focus!",user.pbThis)) end def pbDisplayUseMessage(user) super if !user.effects[PBEffects::FocusPunch] || user.lastHPLost==0 end def pbMoveFailed?(user,targets) if user.effects[PBEffects::FocusPunch] && user.lastHPLost>0 @battle.pbDisplay(_INTL("{1} lost its focus and couldn't move!",user.pbThis)) return true end return false end end #=============================================================================== # Fails if the target didn't chose a damaging move to use this round, or has # already moved. (Sucker Punch) #=============================================================================== class PokeBattle_Move_FailsIfTargetActed < PokeBattle_Move def pbFailsAgainstTarget?(user, target, show_message) if @battle.choices[target.index][0]!=:UseMove @battle.pbDisplay(_INTL("But it failed!")) if show_message return true end oppMove = @battle.choices[target.index][2] if !oppMove || (oppMove.function!="UseMoveTargetIsAboutToUse" && (target.movedThisRound? || oppMove.statusMove?)) @battle.pbDisplay(_INTL("But it failed!")) if show_message return true end return false end end #=============================================================================== # If attack misses, user takes crash damage of 1/2 of max HP. # (High Jump Kick, Jump Kick) #=============================================================================== class PokeBattle_Move_CrashDamageIfFailsUnusableInGravity < PokeBattle_Move def recoilMove?; return true; end def unusableInGravity?; return true; end def pbCrashDamage(user) return if !user.takesIndirectDamage? @battle.pbDisplay(_INTL("{1} kept going and crashed!",user.pbThis)) @battle.scene.pbDamageAnimation(user) user.pbReduceHP(user.totalhp/2,false) user.pbItemHPHealCheck user.pbFaint if user.fainted? end end #=============================================================================== # Starts sunny weather. (Sunny Day) #=============================================================================== class PokeBattle_Move_StartSunWeather < PokeBattle_WeatherMove def initialize(battle,move) super @weatherType = :Sun end end #=============================================================================== # Starts rainy weather. (Rain Dance) #=============================================================================== class PokeBattle_Move_StartRainWeather < PokeBattle_WeatherMove def initialize(battle,move) super @weatherType = :Rain end end #=============================================================================== # Starts sandstorm weather. (Sandstorm) #=============================================================================== class PokeBattle_Move_StartSandstormWeather < PokeBattle_WeatherMove def initialize(battle,move) super @weatherType = :Sandstorm end end #=============================================================================== # Starts hail weather. (Hail) #=============================================================================== class PokeBattle_Move_StartHailWeather < PokeBattle_WeatherMove def initialize(battle,move) super @weatherType = :Hail end end #=============================================================================== # For 5 rounds, creates an electric terrain which boosts Electric-type moves and # prevents Pokémon from falling asleep. Affects non-airborne Pokémon only. # (Electric Terrain) #=============================================================================== class PokeBattle_Move_StartElectricTerrain < PokeBattle_Move def pbMoveFailed?(user,targets) if @battle.field.terrain == :Electric @battle.pbDisplay(_INTL("But it failed!")) return true end return false end def pbEffectGeneral(user) @battle.pbStartTerrain(user, :Electric) end end #=============================================================================== # For 5 rounds, creates a grassy terrain which boosts Grass-type moves and heals # Pokémon at the end of each round. Affects non-airborne Pokémon only. # (Grassy Terrain) #=============================================================================== class PokeBattle_Move_StartGrassyTerrain < PokeBattle_Move def pbMoveFailed?(user,targets) if @battle.field.terrain == :Grassy @battle.pbDisplay(_INTL("But it failed!")) return true end return false end def pbEffectGeneral(user) @battle.pbStartTerrain(user, :Grassy) end end #=============================================================================== # For 5 rounds, creates a misty terrain which weakens Dragon-type moves and # protects Pokémon from status problems. Affects non-airborne Pokémon only. # (Misty Terrain) #=============================================================================== class PokeBattle_Move_StartMistyTerrain < PokeBattle_Move def pbMoveFailed?(user,targets) if @battle.field.terrain == :Misty @battle.pbDisplay(_INTL("But it failed!")) return true end return false end def pbEffectGeneral(user) @battle.pbStartTerrain(user, :Misty) end end #=============================================================================== # For 5 rounds, creates a psychic terrain which boosts Psychic-type moves and # prevents Pokémon from being hit by >0 priority moves. Affects non-airborne # Pokémon only. (Psychic Terrain) #=============================================================================== class PokeBattle_Move_StartPsychicTerrain < PokeBattle_Move def pbMoveFailed?(user,targets) if @battle.field.terrain == :Psychic @battle.pbDisplay(_INTL("But it failed!")) return true end return false end def pbEffectGeneral(user) @battle.pbStartTerrain(user, :Psychic) end end #=============================================================================== # Removes the current terrain. Fails if there is no terrain in effect. # (Steel Roller) #=============================================================================== class PokeBattle_Move_RemoveTerrain < PokeBattle_Move def pbMoveFailed?(user, targets) if @battle.field.terrain == :None @battle.pbDisplay(_INTL("But it failed!")) return true end return false end def pbEffectGeneral(user) case @battle.field.terrain when :Electric @battle.pbDisplay(_INTL("The electricity disappeared from the battlefield.")) when :Grassy @battle.pbDisplay(_INTL("The grass disappeared from the battlefield.")) when :Misty @battle.pbDisplay(_INTL("The mist disappeared from the battlefield.")) when :Psychic @battle.pbDisplay(_INTL("The weirdness disappeared from the battlefield.")) end @battle.field.terrain = :None end end #=============================================================================== # Entry hazard. Lays spikes on the opposing side (max. 3 layers). (Spikes) #=============================================================================== class PokeBattle_Move_AddSpikesToFoeSide < PokeBattle_Move def canMagicCoat?; return true; end def pbMoveFailed?(user,targets) if user.pbOpposingSide.effects[PBEffects::Spikes]>=3 @battle.pbDisplay(_INTL("But it failed!")) return true end return false end def pbEffectGeneral(user) user.pbOpposingSide.effects[PBEffects::Spikes] += 1 @battle.pbDisplay(_INTL("Spikes were scattered all around {1}'s feet!", user.pbOpposingTeam(true))) end end #=============================================================================== # Entry hazard. Lays poison spikes on the opposing side (max. 2 layers). # (Toxic Spikes) #=============================================================================== class PokeBattle_Move_AddToxicSpikesToFoeSide < PokeBattle_Move def canMagicCoat?; return true; end def pbMoveFailed?(user,targets) if user.pbOpposingSide.effects[PBEffects::ToxicSpikes]>=2 @battle.pbDisplay(_INTL("But it failed!")) return true end return false end def pbEffectGeneral(user) user.pbOpposingSide.effects[PBEffects::ToxicSpikes] += 1 @battle.pbDisplay(_INTL("Poison spikes were scattered all around {1}'s feet!", user.pbOpposingTeam(true))) end end #=============================================================================== # Entry hazard. Lays stealth rocks on the opposing side. (Stealth Rock) #=============================================================================== class PokeBattle_Move_AddStealthRocksToFoeSide < PokeBattle_Move def canMagicCoat?; return true; end def pbMoveFailed?(user,targets) if user.pbOpposingSide.effects[PBEffects::StealthRock] @battle.pbDisplay(_INTL("But it failed!")) return true end return false end def pbEffectGeneral(user) user.pbOpposingSide.effects[PBEffects::StealthRock] = true @battle.pbDisplay(_INTL("Pointed stones float in the air around {1}!", user.pbOpposingTeam(true))) end end #=============================================================================== # Entry hazard. Lays stealth rocks on the opposing side. (Sticky Web) #=============================================================================== class PokeBattle_Move_AddStickyWebToFoeSide < PokeBattle_Move def canMagicCoat?; return true; end def pbMoveFailed?(user,targets) if user.pbOpposingSide.effects[PBEffects::StickyWeb] @battle.pbDisplay(_INTL("But it failed!")) return true end return false end def pbEffectGeneral(user) user.pbOpposingSide.effects[PBEffects::StickyWeb] = true @battle.pbDisplay(_INTL("A sticky web has been laid out beneath {1}'s feet!", user.pbOpposingTeam(true))) end end #=============================================================================== # All effects that apply to one side of the field are swapped to the opposite # side. (Court Change) #=============================================================================== class PokeBattle_Move_SwapSideEffects < PokeBattle_Move def initialize(battle, move) super @number_effects = [ PBEffects::AuroraVeil, PBEffects::LightScreen, PBEffects::Mist, PBEffects::Rainbow, PBEffects::Reflect, PBEffects::Safeguard, PBEffects::SeaOfFire, PBEffects::Spikes, PBEffects::Swamp, PBEffects::Tailwind, PBEffects::ToxicSpikes ] @boolean_effects = [ PBEffects::StealthRock, PBEffects::StickyWeb ] end def pbMoveFailed?(user, targets) has_effect = false for side in 0...2 effects = @battle.sides[side].effects @number_effects.each do |e| next if effects[e] == 0 has_effect = true break end break if has_effect @boolean_effects.each do |e| next if !effects[e] has_effect = true break end break if has_effect end if !has_effect @battle.pbDisplay(_INTL("But it failed!")) return true end return false end def pbEffectGeneral(user) side0 = @battle.sides[0] side1 = @battle.sides[1] @number_effects.each do |e| side0.effects[e], side1.effects[e] = side1.effects[e], side0.effects[e] end @boolean_effects.each do |e| side0.effects[e], side1.effects[e] = side1.effects[e], side0.effects[e] end @battle.pbDisplay(_INTL("{1} swapped the battle effects affecting each side of the field!", user.pbThis)) end end #=============================================================================== # User turns 1/4 of max HP into a substitute. (Substitute) #=============================================================================== class PokeBattle_Move_UserMakeSubstitute < 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)) return true end @subLife = user.totalhp/4 @subLife = 1 if @subLife<1 if user.hp<=@subLife @battle.pbDisplay(_INTL("But it does not have enough HP left to make a substitute!")) return true end return false end def pbOnStartUse(user,targets) user.pbReduceHP(@subLife,false,false) user.pbItemHPHealCheck end def pbEffectGeneral(user) user.effects[PBEffects::Trapping] = 0 user.effects[PBEffects::TrappingMove] = nil user.effects[PBEffects::Substitute] = @subLife @battle.pbDisplay(_INTL("{1} put in a substitute!",user.pbThis)) end end #=============================================================================== # Removes trapping moves, entry hazards and Leech Seed on user/user's side. # Raises user's Speed by 1 stage (Gen 8+). (Rapid Spin) #=============================================================================== class PokeBattle_Move_RemoveUserBindingAndEntryHazards < PokeBattle_StatUpMove def initialize(battle,move) super @statUp = [:SPEED, 1] end def pbEffectAfterAllHits(user,target) return if user.fainted? || target.damageState.unaffected if user.effects[PBEffects::Trapping]>0 trapMove = GameData::Move.get(user.effects[PBEffects::TrappingMove]).name trapUser = @battle.battlers[user.effects[PBEffects::TrappingUser]] @battle.pbDisplay(_INTL("{1} got free of {2}'s {3}!",user.pbThis,trapUser.pbThis(true),trapMove)) user.effects[PBEffects::Trapping] = 0 user.effects[PBEffects::TrappingMove] = nil user.effects[PBEffects::TrappingUser] = -1 end if user.effects[PBEffects::LeechSeed]>=0 user.effects[PBEffects::LeechSeed] = -1 @battle.pbDisplay(_INTL("{1} shed Leech Seed!",user.pbThis)) end if user.pbOwnSide.effects[PBEffects::StealthRock] user.pbOwnSide.effects[PBEffects::StealthRock] = false @battle.pbDisplay(_INTL("{1} blew away stealth rocks!",user.pbThis)) end if user.pbOwnSide.effects[PBEffects::Spikes]>0 user.pbOwnSide.effects[PBEffects::Spikes] = 0 @battle.pbDisplay(_INTL("{1} blew away spikes!",user.pbThis)) end if user.pbOwnSide.effects[PBEffects::ToxicSpikes]>0 user.pbOwnSide.effects[PBEffects::ToxicSpikes] = 0 @battle.pbDisplay(_INTL("{1} blew away poison spikes!",user.pbThis)) end if user.pbOwnSide.effects[PBEffects::StickyWeb] user.pbOwnSide.effects[PBEffects::StickyWeb] = false @battle.pbDisplay(_INTL("{1} blew away sticky webs!",user.pbThis)) end end def pbAdditionalEffect(user,target) super if Settings::MECHANICS_GENERATION >= 8 end end #=============================================================================== # Attacks 2 rounds in the future. (Doom Desire, Future Sight) #=============================================================================== class PokeBattle_Move_AttackTwoTurnsLater < PokeBattle_Move def targetsPosition?; return true; end def pbDamagingMove? # Stops damage being dealt in the setting-up turn return false if !@battle.futureSight return super end def pbAccuracyCheck(user,target) return true if !@battle.futureSight return super end def pbDisplayUseMessage(user) super if !@battle.futureSight end def pbFailsAgainstTarget?(user, target, show_message) if !@battle.futureSight && @battle.positions[target.index].effects[PBEffects::FutureSightCounter]>0 @battle.pbDisplay(_INTL("But it failed!")) if show_message return true end return false end def pbEffectAgainstTarget(user,target) return if @battle.futureSight # Attack is hitting effects = @battle.positions[target.index].effects effects[PBEffects::FutureSightCounter] = 3 effects[PBEffects::FutureSightMove] = @id effects[PBEffects::FutureSightUserIndex] = user.index effects[PBEffects::FutureSightUserPartyIndex] = user.pokemonIndex if @id == :DOOMDESIRE @battle.pbDisplay(_INTL("{1} chose Doom Desire as its destiny!",user.pbThis)) else @battle.pbDisplay(_INTL("{1} foresaw an attack!",user.pbThis)) end end def pbShowAnimation(id,user,targets,hitNum=0,showAnimation=true) hitNum = 1 if !@battle.futureSight # Charging anim super end end #=============================================================================== # User switches places with its ally. (Ally Switch) #=============================================================================== class PokeBattle_Move_UserSwapsPositionsWithAlly < PokeBattle_Move def pbMoveFailed?(user,targets) numTargets = 0 @idxAlly = -1 idxUserOwner = @battle.pbGetOwnerIndexFromBattlerIndex(user.index) user.allAllies.each do |b| next if @battle.pbGetOwnerIndexFromBattlerIndex(b.index)!=idxUserOwner next if !b.near?(user) numTargets += 1 @idxAlly = b.index end if numTargets!=1 @battle.pbDisplay(_INTL("But it failed!")) return true end return false end def pbEffectGeneral(user) idxA = user.index idxB = @idxAlly if @battle.pbSwapBattlers(idxA,idxB) @battle.pbDisplay(_INTL("{1} and {2} switched places!", @battle.battlers[idxB].pbThis,@battle.battlers[idxA].pbThis(true))) [idxA, idxB].each { |idx| @battle.pbEffectsOnBattlerEnteringPosition(@battle.battlers[idx]) } end end end #=============================================================================== # If a Pokémon makes contact with the user before it uses this move, the # attacker is burned. (Beak Blast) #=============================================================================== class PokeBattle_Move_BurnAttackerBeforeUserActs < PokeBattle_Move def pbDisplayChargeMessage(user) user.effects[PBEffects::BeakBlast] = true @battle.pbCommonAnimation("BeakBlast",user) @battle.pbDisplay(_INTL("{1} started heating up its beak!",user.pbThis)) end end