diff --git a/Data/Scripts/011_Battle/001_Battle/011_Battle_EndOfRoundPhase.rb b/Data/Scripts/011_Battle/001_Battle/011_Battle_EndOfRoundPhase.rb index 6461df12f..80d75acb3 100644 --- a/Data/Scripts/011_Battle/001_Battle/011_Battle_EndOfRoundPhase.rb +++ b/Data/Scripts/011_Battle/001_Battle/011_Battle_EndOfRoundPhase.rb @@ -717,7 +717,12 @@ class Battle # Reset/count down battler-specific effects (no messages) allBattlers.each do |battler| battler.effects[PBEffects::BanefulBunker] = false - battler.effects[PBEffects::Charge] -= 1 if battler.effects[PBEffects::Charge] > 0 + battler.effects[PBEffects::BurningBulwark] = false + if Settings::MECHANICS_GENERATION >= 9 + battler.effects[PBEffects::Charge] -= 1 if battler.effects[PBEffects::Charge] > 1 + else + battler.effects[PBEffects::Charge] -= 1 if battler.effects[PBEffects::Charge] > 0 + end battler.effects[PBEffects::Counter] = -1 battler.effects[PBEffects::CounterTarget] = -1 battler.effects[PBEffects::Electrify] = false @@ -746,6 +751,7 @@ class Battle battler.effects[PBEffects::Protect] = false battler.effects[PBEffects::RagePowder] = false battler.effects[PBEffects::Roost] = false + battler.effects[PBEffects::SilkTrap] = false battler.effects[PBEffects::Snatch] = 0 battler.effects[PBEffects::SpikyShield] = false battler.effects[PBEffects::Spotlight] = 0 diff --git a/Data/Scripts/011_Battle/002_Battler/001_Battle_Battler.rb b/Data/Scripts/011_Battle/002_Battler/001_Battle_Battler.rb index 37713c94a..2eed81203 100644 --- a/Data/Scripts/011_Battle/002_Battler/001_Battle_Battler.rb +++ b/Data/Scripts/011_Battle/002_Battler/001_Battle_Battler.rb @@ -66,7 +66,7 @@ class Battle::Battler def form=(value) @form = value - @pokemon.form = value if @pokemon + @pokemon.form = value if @pokemon && !@effects[PBEffects::Transform] end def ability @@ -308,15 +308,17 @@ class Battle::Battler # same type more than once, and should not include any invalid types. def pbTypes(withExtraType = false) ret = @types.uniq - # Burn Up erases the Fire-type. + # Burn Up erases the Fire-type ret.delete(:FIRE) if @effects[PBEffects::BurnUp] - # Roost erases the Flying-type. If there are no types left, adds the Normal- - # type. + # Double Shock erases the Electric-type + ret.delete(:ELECTRIC) if @effects[PBEffects::DoubleShock] + # Roost erases the Flying-type (if there are no types left, adds the Normal- + # type) if @effects[PBEffects::Roost] ret.delete(:FLYING) ret.push(:NORMAL) if ret.length == 0 end - # Add the third type specially. + # Add the third type specially if withExtraType && @effects[PBEffects::ExtraType] && !ret.include?(@effects[PBEffects::ExtraType]) ret.push(@effects[PBEffects::ExtraType]) end diff --git a/Data/Scripts/011_Battle/002_Battler/002_Battler_Initialize.rb b/Data/Scripts/011_Battle/002_Battler/002_Battler_Initialize.rb index 1c99c9d6c..bdfd09e1f 100644 --- a/Data/Scripts/011_Battle/002_Battler/002_Battler_Initialize.rb +++ b/Data/Scripts/011_Battle/002_Battler/002_Battler_Initialize.rb @@ -152,6 +152,7 @@ class Battle::Battler b.effects[PBEffects::Attract] = -1 if b.effects[PBEffects::Attract] == @index end @effects[PBEffects::BanefulBunker] = false + @effects[PBEffects::BurningBulwark] = false @effects[PBEffects::BeakBlast] = false @effects[PBEffects::Bide] = 0 @effects[PBEffects::BideDamage] = 0 @@ -168,6 +169,7 @@ class Battle::Battler @effects[PBEffects::DestinyBondTarget] = -1 @effects[PBEffects::Disable] = 0 @effects[PBEffects::DisableMove] = nil + @effects[PBEffects::DoubleShock] = false @effects[PBEffects::Electrify] = false @effects[PBEffects::Encore] = 0 @effects[PBEffects::EncoreMove] = nil @@ -243,6 +245,7 @@ class Battle::Battler @effects[PBEffects::RagePowder] = false @effects[PBEffects::Rollout] = 0 @effects[PBEffects::Roost] = false + @effects[PBEffects::SilkTrap] = false @effects[PBEffects::SkyDrop] = -1 @battle.allBattlers.each do |b| # Other battlers no longer Sky Dropped by self b.effects[PBEffects::SkyDrop] = -1 if b.effects[PBEffects::SkyDrop] == @index diff --git a/Data/Scripts/011_Battle/002_Battler/003_Battler_ChangeSelf.rb b/Data/Scripts/011_Battle/002_Battler/003_Battler_ChangeSelf.rb index c0db09fe8..16c0272ec 100644 --- a/Data/Scripts/011_Battle/002_Battler/003_Battler_ChangeSelf.rb +++ b/Data/Scripts/011_Battle/002_Battler/003_Battler_ChangeSelf.rb @@ -135,6 +135,7 @@ class Battle::Battler @effects[PBEffects::ExtraType] = nil end @effects[PBEffects::BurnUp] = false + @effects[PBEffects::DoubleShock] = false @effects[PBEffects::Roost] = false end @@ -142,6 +143,7 @@ class Battle::Battler @types = @pokemon.types @effects[PBEffects::ExtraType] = nil @effects[PBEffects::BurnUp] = false + @effects[PBEffects::DoubleShock] = false @effects[PBEffects::Roost] = false end @@ -293,6 +295,7 @@ class Battle::Battler oldAbil = @ability_id @effects[PBEffects::Transform] = true @effects[PBEffects::TransformSpecies] = target.species + self.form = target.form pbChangeTypes(target) self.ability = target.ability @attack = target.attack diff --git a/Data/Scripts/011_Battle/002_Battler/007_Battler_UseMove.rb b/Data/Scripts/011_Battle/002_Battler/007_Battler_UseMove.rb index fcd1e3614..14593e67b 100644 --- a/Data/Scripts/011_Battle/002_Battler/007_Battler_UseMove.rb +++ b/Data/Scripts/011_Battle/002_Battler/007_Battler_UseMove.rb @@ -106,7 +106,9 @@ class Battle::Battler end end @effects[PBEffects::BeakBlast] = false - @effects[PBEffects::Charge] = 0 if @effects[PBEffects::Charge] == 1 + if Settings::MECHANICS_GENERATION < 9 || @lastMoveUsedType == :ELECTRIC + @effects[PBEffects::Charge] = 0 if @effects[PBEffects::Charge] == 1 + end @effects[PBEffects::GemConsumed] = nil @effects[PBEffects::ShellTrap] = false @battle.allBattlers.each { |b| b.pbContinualAbilityChecks } # Trace, end primordial weathers diff --git a/Data/Scripts/011_Battle/002_Battler/009_Battler_UseMoveSuccessChecks.rb b/Data/Scripts/011_Battle/002_Battler/009_Battler_UseMoveSuccessChecks.rb index 642687e38..5634a5195 100644 --- a/Data/Scripts/011_Battle/002_Battler/009_Battler_UseMoveSuccessChecks.rb +++ b/Data/Scripts/011_Battle/002_Battler/009_Battler_UseMoveSuccessChecks.rb @@ -369,6 +369,14 @@ class Battle::Battler @battle.successStates[user.index].protected = true return false end + # Mat Block + if target.pbOwnSide.effects[PBEffects::MatBlock] && move.damagingMove? + # NOTE: Confirmed no common animation for this effect. + @battle.pbDisplay(_INTL("{1} was blocked by the kicked-up mat!", move.name)) if show_message + target.damageState.protected = true + @battle.successStates[user.index].protected = true + return false + end # King's Shield if target.effects[PBEffects::KingsShield] && move.damagingMove? if show_message @@ -383,6 +391,34 @@ class Battle::Battler end return false end + # Obstruct + if target.effects[PBEffects::Obstruct] && move.damagingMove? + if show_message + @battle.pbCommonAnimation("Obstruct", target) + @battle.pbDisplay(_INTL("{1} protected itself!", target.pbThis)) + end + target.damageState.protected = true + @battle.successStates[user.index].protected = true + if move.pbContactMove?(user) && user.affectedByContactEffect? && + user.pbCanLowerStatStage?(:DEFENSE, target) + user.pbLowerStatStage(:DEFENSE, 2, target) + end + return false + end + # Silk Trap + if target.effects[PBEffects::SilkTrap] && move.damagingMove? + if show_message + @battle.pbCommonAnimation("SilkTrap", target) + @battle.pbDisplay(_INTL("{1} protected itself!", target.pbThis)) + end + target.damageState.protected = true + @battle.successStates[user.index].protected = true + if move.pbContactMove?(user) && user.affectedByContactEffect? && + user.pbCanLowerStatStage?(:SPEED, target) + user.pbLowerStatStage(:SPEED, 1, target) + end + return false + end # Spiky Shield if target.effects[PBEffects::SpikyShield] if show_message @@ -413,28 +449,20 @@ class Battle::Battler end return false end - # Obstruct - if target.effects[PBEffects::Obstruct] && move.damagingMove? + # Burning Bulwark + if target.effects[PBEffects::BurningBulwark] if show_message - @battle.pbCommonAnimation("Obstruct", target) + @battle.pbCommonAnimation("BurningBulwark", target) @battle.pbDisplay(_INTL("{1} protected itself!", target.pbThis)) end target.damageState.protected = true @battle.successStates[user.index].protected = true if move.pbContactMove?(user) && user.affectedByContactEffect? && - user.pbCanLowerStatStage?(:DEFENSE, target) - user.pbLowerStatStage(:DEFENSE, 2, target) + user.pbCanBurn?(target, false) + user.pbBurn(target) end return false end - # Mat Block - if target.pbOwnSide.effects[PBEffects::MatBlock] && move.damagingMove? - # NOTE: Confirmed no common animation for this effect. - @battle.pbDisplay(_INTL("{1} was blocked by the kicked-up mat!", move.name)) if show_message - target.damageState.protected = true - @battle.successStates[user.index].protected = true - return false - end end end # Magic Coat/Magic Bounce diff --git a/Data/Scripts/011_Battle/003_Move/004_Move_BaseEffects.rb b/Data/Scripts/011_Battle/003_Move/004_Move_BaseEffects.rb index 6455c2f7e..fd8cd49a8 100644 --- a/Data/Scripts/011_Battle/003_Move/004_Move_BaseEffects.rb +++ b/Data/Scripts/011_Battle/003_Move/004_Move_BaseEffects.rb @@ -155,8 +155,14 @@ end class Battle::Move::StatDownMove < Battle::Move attr_reader :statDown + def pbOnStartUse(user, targets) + @stats_lowered = false + end + def pbEffectWhenDealingDamage(user, target) + return if @stats_lowered return if @battle.pbAllFainted?(target.idxOwnSide) + @stats_lowered = true showAnim = true (@statDown.length / 2).times do |i| next if !user.pbCanLowerStatStage?(@statDown[i * 2], user, self) diff --git a/Data/Scripts/011_Battle/003_Move/005_MoveEffects_Misc.rb b/Data/Scripts/011_Battle/003_Move/005_MoveEffects_Misc.rb index 378d23ddf..5bdba0d33 100644 --- a/Data/Scripts/011_Battle/003_Move/005_MoveEffects_Misc.rb +++ b/Data/Scripts/011_Battle/003_Move/005_MoveEffects_Misc.rb @@ -208,12 +208,10 @@ class Battle::Move::FailsIfTargetActed < Battle::Move end #=============================================================================== -# If attack misses, user takes crash damage of 1/2 of max HP. -# (High Jump Kick, Jump Kick) +# If attack misses, user takes crash damage of 1/2 of max HP. (Supercell Slam) #=============================================================================== -class Battle::Move::CrashDamageIfFailsUnusableInGravity < Battle::Move - def recoilMove?; return true; end - def unusableInGravity?; return true; end +class Battle::Move::CrashDamageIfFails < Battle::Move + def recoilMove?; return true; end def pbCrashDamage(user) return if !user.takesIndirectDamage? @@ -225,6 +223,14 @@ class Battle::Move::CrashDamageIfFailsUnusableInGravity < Battle::Move end end +#=============================================================================== +# If attack misses, user takes crash damage of 1/2 of max HP. Can't be used in +# gravity. (High Jump Kick, Jump Kick) +#=============================================================================== +class Battle::Move::CrashDamageIfFailsUnusableInGravity < Battle::Move::CrashDamageIfFails + def unusableInGravity?; return true; end +end + #=============================================================================== # Starts sunny weather. (Sunny Day) #=============================================================================== @@ -387,6 +393,7 @@ class Battle::Move::AddSpikesToFoeSide < Battle::Move def canMagicCoat?; return true; end def pbMoveFailed?(user, targets) + return false if damagingMove? if user.pbOpposingSide.effects[PBEffects::Spikes] >= 3 @battle.pbDisplay(_INTL("But it failed!")) return true @@ -395,6 +402,15 @@ class Battle::Move::AddSpikesToFoeSide < Battle::Move end def pbEffectGeneral(user) + return if damagingMove? + user.pbOpposingSide.effects[PBEffects::Spikes] += 1 + @battle.pbDisplay(_INTL("Spikes were scattered all around {1}'s feet!", + user.pbOpposingTeam(true))) + end + + def pbAdditionalEffect(user, target) + return if user.fainted? + return if user.pbOpposingSide.effects[PBEffects::Spikes] >= 3 user.pbOpposingSide.effects[PBEffects::Spikes] += 1 @battle.pbDisplay(_INTL("Spikes were scattered all around {1}'s feet!", user.pbOpposingTeam(true))) @@ -409,6 +425,7 @@ class Battle::Move::AddToxicSpikesToFoeSide < Battle::Move def canMagicCoat?; return true; end def pbMoveFailed?(user, targets) + return false if damagingMove? if user.pbOpposingSide.effects[PBEffects::ToxicSpikes] >= 2 @battle.pbDisplay(_INTL("But it failed!")) return true @@ -417,6 +434,15 @@ class Battle::Move::AddToxicSpikesToFoeSide < Battle::Move end def pbEffectGeneral(user) + return if damagingMove? + user.pbOpposingSide.effects[PBEffects::ToxicSpikes] += 1 + @battle.pbDisplay(_INTL("Poison spikes were scattered all around {1}'s feet!", + user.pbOpposingTeam(true))) + end + + def pbAdditionalEffect(user, target) + return if user.fainted? + return if user.pbOpposingSide.effects[PBEffects::ToxicSpikes] >= 2 user.pbOpposingSide.effects[PBEffects::ToxicSpikes] += 1 @battle.pbDisplay(_INTL("Poison spikes were scattered all around {1}'s feet!", user.pbOpposingTeam(true))) @@ -430,6 +456,7 @@ class Battle::Move::AddStealthRocksToFoeSide < Battle::Move def canMagicCoat?; return true; end def pbMoveFailed?(user, targets) + return false if damagingMove? if user.pbOpposingSide.effects[PBEffects::StealthRock] @battle.pbDisplay(_INTL("But it failed!")) return true @@ -438,6 +465,15 @@ class Battle::Move::AddStealthRocksToFoeSide < Battle::Move end def pbEffectGeneral(user) + return if damagingMove? + user.pbOpposingSide.effects[PBEffects::StealthRock] = true + @battle.pbDisplay(_INTL("Pointed stones float in the air around {1}!", + user.pbOpposingTeam(true))) + end + + def pbAdditionalEffect(user, target) + return if user.fainted? + return if user.pbOpposingSide.effects[PBEffects::StealthRock] user.pbOpposingSide.effects[PBEffects::StealthRock] = true @battle.pbDisplay(_INTL("Pointed stones float in the air around {1}!", user.pbOpposingTeam(true))) @@ -451,6 +487,7 @@ class Battle::Move::AddStickyWebToFoeSide < Battle::Move def canMagicCoat?; return true; end def pbMoveFailed?(user, targets) + return false if damagingMove? if user.pbOpposingSide.effects[PBEffects::StickyWeb] @battle.pbDisplay(_INTL("But it failed!")) return true @@ -459,6 +496,15 @@ class Battle::Move::AddStickyWebToFoeSide < Battle::Move end def pbEffectGeneral(user) + return false if damagingMove? + user.pbOpposingSide.effects[PBEffects::StickyWeb] = true + @battle.pbDisplay(_INTL("A sticky web has been laid out beneath {1}'s feet!", + user.pbOpposingTeam(true))) + end + + def pbAdditionalEffect(user, target) + return if user.fainted? + return if user.pbOpposingSide.effects[PBEffects::StickyWeb] user.pbOpposingSide.effects[PBEffects::StickyWeb] = true @battle.pbDisplay(_INTL("A sticky web has been laid out beneath {1}'s feet!", user.pbOpposingTeam(true))) diff --git a/Data/Scripts/011_Battle/003_Move/006_MoveEffects_BattlerStats.rb b/Data/Scripts/011_Battle/003_Move/006_MoveEffects_BattlerStats.rb index f5101bab0..2983f9799 100644 --- a/Data/Scripts/011_Battle/003_Move/006_MoveEffects_BattlerStats.rb +++ b/Data/Scripts/011_Battle/003_Move/006_MoveEffects_BattlerStats.rb @@ -111,6 +111,33 @@ class Battle::Move::MaxUserAttackLoseHalfOfTotalHP < Battle::Move end end +#=============================================================================== +# Reduces the user's HP by half of max, and raises its Attack, Special Attack +# and Speed by 2 stages each. (Fillet Away) +#=============================================================================== +class Battle::Move::RaiseUserAtkSpAtkSpeed2LoseHalfOfTotalHP < Battle::Move::MultiStatUpMove + def initialize(battle, move) + super + @statUp = [:ATTACK, 2, :SPECIAL_ATTACK, 2, :SPEED, 2] + end + + def pbMoveFailed?(user, targets) + hpLoss = [user.totalhp / 2, 1].max + if user.hp <= hpLoss + @battle.pbDisplay(_INTL("But it failed!")) + return true + end + return super + end + + def pbEffectGeneral(user) + super + hpLoss = [user.totalhp / 2, 1].max + user.pbReduceHP(hpLoss, false, false) + user.pbItemHPHealCheck + end +end + #=============================================================================== # Increases the user's Defense by 1 stage. (Harden, Steel Wing, Withdraw) #=============================================================================== @@ -453,16 +480,14 @@ class Battle::Move::LowerUserDefSpDef1RaiseUserAtkSpAtkSpd2 < Battle::Move def pbMoveFailed?(user, targets) failed = true (@statUp.length / 2).times do |i| - if user.pbCanRaiseStatStage?(@statUp[i * 2], user, self) - failed = false - break - end + next if !user.pbCanRaiseStatStage?(@statUp[i * 2], user, self) + failed = false + break end (@statDown.length / 2).times do |i| - if user.pbCanLowerStatStage?(@statDown[i * 2], user, self) - failed = false - break - end + next if !user.pbCanLowerStatStage?(@statDown[i * 2], user, self) + failed = false + break end if failed @battle.pbDisplay(_INTL("{1}'s stats can't be changed further!", user.pbThis)) @@ -499,6 +524,86 @@ class Battle::Move::RaiseUserAtkSpd1 < Battle::Move::MultiStatUpMove end end +#=============================================================================== +# Removes trapping moves, entry hazards and Leech Seed on user/user's side. +# Poisons the target. (Mortal Spin) +#=============================================================================== +class Battle::Move::RaiseUserAtkSpd1RemoveEntryHazardsAndSubstitutes < Battle::Move::RaiseUserAtkSpd1 + def pbMoveFailed?(user, targets) + return false if damagingMove? + failed = true + (@statUp.length / 2).times do |i| + next if !user.pbCanRaiseStatStage?(@statUp[i * 2], user, self) + failed = false + break + end + @battle.allBattlers.each do |b| + failed = false if b.effects[PBEffects::Substitute] > 0 + end + failed = false if user.pbOwnSide.effects[PBEffects::StealthRock] || + user.pbOwnSide.effects[PBEffects::Spikes] > 0 || + user.pbOwnSide.effects[PBEffects::ToxicSpikes] > 0 || + user.pbOwnSide.effects[PBEffects::StickyWeb] + if failed + @battle.pbDisplay(_INTL("But it failed!")) + return true + end + return false + end + + def pbEffectGeneral(user) + something_tidied = false + @battle.allBattlers.each do |b| + next if b.effects[PBEffects::Substitute] == 0 + b.effects[PBEffects::Substitute] = 0 + something_tidied = true + @battle.pbDisplay(_INTL("{1}'s substitute faded!", b.pbThis)) + end + if user.pbOwnSide.effects[PBEffects::StealthRock] + user.pbOwnSide.effects[PBEffects::StealthRock] = false + something_tidied = true + @battle.pbDisplay(_INTL("The pointed stones disappeared from around {1}!", user.pbTeam(true))) + end + if user.pbOpposingSide.effects[PBEffects::StealthRock] + user.pbOpposingSide.effects[PBEffects::StealthRock] = false + something_tidied = true + @battle.pbDisplay(_INTL("The pointed stones disappeared from around {1}!", user.pbOpposingTeam(true))) + end + if user.pbOwnSide.effects[PBEffects::Spikes] > 0 + user.pbOwnSide.effects[PBEffects::Spikes] = 0 + something_tidied = true + @battle.pbDisplay(_INTL("The spikes disappeared from the ground around {1}!", user.pbTeam(true))) + end + if user.pbOpposingSide.effects[PBEffects::Spikes] > 0 + user.pbOpposingSide.effects[PBEffects::Spikes] = 0 + something_tidied = true + @battle.pbDisplay(_INTL("The spikes disappeared from the ground around {1}!", user.pbpbOpposingSideTeam(true))) + end + if user.pbOwnSide.effects[PBEffects::ToxicSpikes] > 0 + user.pbOwnSide.effects[PBEffects::ToxicSpikes] = 0 + something_tidied = true + @battle.pbDisplay(_INTL("The poison spikes disappeared from the ground around {1}!", user.pbTeam(true))) + end + if user.pbOpposingSide.effects[PBEffects::ToxicSpikes] > 0 + user.pbOpposingSide.effects[PBEffects::ToxicSpikes] = 0 + something_tidied = true + @battle.pbDisplay(_INTL("The poison spikes disappeared from the ground around {1}!", user.pbpbOpposingSideTeam(true))) + end + if user.pbOwnSide.effects[PBEffects::StickyWeb] + user.pbOwnSide.effects[PBEffects::StickyWeb] = false + something_tidied = true + @battle.pbDisplay(_INTL("The sticky webs disappeared from the ground around {1}!", user.pbTeam(true))) + end + if user.pbOpposingSide.effects[PBEffects::StickyWeb] + user.pbOpposingSide.effects[PBEffects::StickyWeb] = false + something_tidied = true + @battle.pbDisplay(_INTL("The sticky webs disappeared from the ground around {1}!", user.pbpbOpposingSideTeam(true))) + end + @battle.pbDisplay(_INTL("Tidying up complete!")) if something_tidied + super + end +end + #=============================================================================== # Increases the user's Speed by 2 stages, and its Attack by 1 stage. (Shift Gear) #=============================================================================== @@ -540,6 +645,37 @@ class Battle::Move::RaiseUserSpAtkSpDef1 < Battle::Move::MultiStatUpMove end end +#=============================================================================== +# Increases the user's Sp. Attack and Sp. Defense by 1 stage each. Cures the +# user's status condition. (Take Heart) +#=============================================================================== +class Battle::Move::RaiseUserSpAtkSpDef1CureStatus < Battle::Move::MultiStatUpMove + def initialize(battle, move) + super + @statUp = [:SPECIAL_ATTACK, 1, :SPECIAL_DEFENSE, 1] + end + + def pbMoveFailed?(user, targets) + failed = true + (@statUp.length / 2).times do |i| + next if !user.pbCanRaiseStatStage?(@statUp[i * 2], user, self) + failed = false + break + end + failed = false if user.pbHasAnyStatus? + if failed + @battle.pbDisplay(_INTL("But it failed!")) + return true + end + return false + end + + def pbEffectGeneral(user) + super + user.pbCureStatus + end +end + #=============================================================================== # Increases the user's Sp. Attack, Sp. Defense and Speed by 1 stage each. # (Quiver Dance) @@ -682,6 +818,21 @@ class Battle::Move::LowerUserSpAtk1 < Battle::Move::StatDownMove end end +#=============================================================================== +# Decreases the user's Special Attack by 1 stage. Scatters coins that the player +# picks up after winning the battle. (Make It Rain) +#=============================================================================== +class Battle::Move::LowerUserSpAtk1 < Battle::Move::LowerUserSpAtk1 + def pbEffectWhenDealingDamage(user, target) + return if @stats_lowered + if user.pbOwnedByPlayer? + @battle.field.effects[PBEffects::PayDay] += 5 * user.level + end + @battle.pbDisplay(_INTL("Coins were scattered everywhere!")) + super + end +end + #=============================================================================== # Decreases the user's Special Attack by 2 stages. #=============================================================================== @@ -744,7 +895,7 @@ end #=============================================================================== # Decreases the user's Defense and Special Defense by 1 stage each. -# (Close Combat, Dragon Ascent) +# (Armor Cannon, Close Combat, Dragon Ascent, Headlong Rush) #=============================================================================== class Battle::Move::LowerUserDefSpDef1 < Battle::Move::StatDownMove def initialize(battle, move) @@ -801,6 +952,62 @@ class Battle::Move::RaiseTargetAttack1 < Battle::Move end end +#=============================================================================== +# Increases the target's Attack by 2 stages. Decreases the target's Defense by 2 +# stages. (Spicy Extract) +#=============================================================================== +class Battle::Move::RaiseTargetAtk2LowerTargetDef2 < Battle::Move + attr_reader :statUp, :statDown + + def canMagicCoat?; return true; end + + def initialize(battle, move) + super + @statUp = [:ATTACK, 2] + @statDown = [:DEFENSE, 2] + end + + def pbMoveFailed?(user, targets) + failed = true + targets.each do |b| + (@statUp.length / 2).times do |i| + next if !target.pbCanRaiseStatStage?(@statUp[i * 2], user, self) + failed = false + break + end + break if !failed + (@statDown.length / 2).times do |i| + next if !target.pbCanLowerStatStage?(@statDown[i * 2], user, self) + failed = false + break + end + break if !failed + end + if failed + @battle.pbDisplay(_INTL("But it failed!")) + return true + end + return false + end + + def pbEffectAgainstTarget(user, target) + showAnim = true + (@statDown.length / 2).times do |i| + next if !target.pbCanLowerStatStage?(@statDown[i * 2], user, self) + if target.pbLowerStatStage(@statDown[i * 2], @statDown[(i * 2) + 1], user, showAnim) + showAnim = false + end + end + showAnim = true + (@statUp.length / 2).times do |i| + next if !target.pbCanRaiseStatStage?(@statUp[i * 2], user, self) + if target.pbRaiseStatStage(@statUp[i * 2], @statUp[(i * 2) + 1], user, showAnim) + showAnim = false + end + end + end +end + #=============================================================================== # Increases the target's Attack by 2 stages. Confuses the target. (Swagger) #=============================================================================== @@ -990,6 +1197,27 @@ class Battle::Move::LowerTargetDefense1PowersUpInGravity < Battle::Move::LowerTa end end +#=============================================================================== +# 50% chance to decreases the target's Defense by 1 stage. 30% chance to make +# the target flinch. (Triple Arrows) +#=============================================================================== +class Battle::Move::LowerTargetDefense1FlinchTarget < Battle::Move::TargetStatDownMove + def flinchingMove?; return true; end + + def initialize(battle, move) + super + @statDown = [:DEFENSE, 1] + end + + def pbAdditionalEffect(user, target) + return if target.damageState.substitute + stat_chance = pbAdditionalEffectChance(user, target, 50) + super if stat_chance > 0 && @battle.pbRandom(100) < stat_chance + flinch_chance = pbAdditionalEffectChance(user, target, 30) + target.pbFlinch(user) if flinch_chance > 0 && @battle.pbRandom(100) < flinch_chance + end +end + #=============================================================================== # Decreases the target's Defense by 2 stages. (Screech) #=============================================================================== diff --git a/Data/Scripts/011_Battle/003_Move/007_MoveEffects_BattlerOther.rb b/Data/Scripts/011_Battle/003_Move/007_MoveEffects_BattlerOther.rb index c096c466e..3503c9e81 100644 --- a/Data/Scripts/011_Battle/003_Move/007_MoveEffects_BattlerOther.rb +++ b/Data/Scripts/011_Battle/003_Move/007_MoveEffects_BattlerOther.rb @@ -126,6 +126,44 @@ class Battle::Move::PoisonTargetLowerTargetSpeed1 < Battle::Move end end +#=============================================================================== +# Removes trapping moves, entry hazards and Leech Seed on user/user's side. +# Poisons the target. (Mortal Spin) +#=============================================================================== +class Battle::Move::PoisonTargetRemoveUserBindingAndEntryHazards < Battle::Move::PoisonTarget + 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 +end + #=============================================================================== # Badly poisons the target. (Poison Fang, Toxic) #=============================================================================== @@ -353,6 +391,20 @@ class Battle::Move::ParalyzeBurnOrFreezeTarget < Battle::Move end end +#=============================================================================== +# Poisons, paralyzes or puts to sleep the target. (Dire Claw) +#=============================================================================== +class Battle::Move::PoisonParalyzeOrSleepTarget < Battle::Move + def pbAdditionalEffect(user, target) + return if target.damageState.substitute + case @battle.pbRandom(3) + when 0 then target.pbPoison(user) if target.pbCanPoison?(user, false, self) + when 1 then target.pbParalyze(user) if target.pbCanParalyze?(user, false, self) + when 2 then target.pbSleep if target.pbCanSleep?(user, false, self) + end + end +end + #=============================================================================== # User passes its status problem to the target. (Psycho Shift) #=============================================================================== @@ -649,6 +701,23 @@ class Battle::Move::ConfuseTargetAlwaysHitsInRainHitsTargetInSky < Battle::Move: end end +#=============================================================================== +# Confuses the target. If attack misses, user takes crash damage of 1/2 of max +# HP. (Axe Kick) +#=============================================================================== +class Battle::Move::ConfuseTargetCrashDamageIfFails < Battle::Move::ConfuseTarget + def recoilMove?; 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 + #=============================================================================== # Attracts the target. (Attract) #=============================================================================== @@ -953,6 +1022,27 @@ class Battle::Move::UserLosesFireType < Battle::Move end end +#=============================================================================== +# User loses their Electric type. Fails if user is not Electric-type. +# (Double Shock) +#=============================================================================== +class Battle::Move::UserLosesElectricType < Battle::Move + def pbMoveFailed?(user, targets) + if !user.pbHasType?(:ELECTRIC) + @battle.pbDisplay(_INTL("But it failed!")) + return true + end + return false + end + + def pbEffectAfterAllHits(user, target) + if !user.effects[PBEffects::DoubleShock] + user.effects[PBEffects::DoubleShock] = true + @battle.pbDisplay(_INTL("{1} used up all its electricity!", user.pbThis)) + end + end +end + #=============================================================================== # Target's ability becomes Simple. (Simple Beam) #=============================================================================== diff --git a/Data/Scripts/011_Battle/003_Move/008_MoveEffects_MoveAttributes.rb b/Data/Scripts/011_Battle/003_Move/008_MoveEffects_MoveAttributes.rb index 2f5ad5a36..ec3900471 100644 --- a/Data/Scripts/011_Battle/003_Move/008_MoveEffects_MoveAttributes.rb +++ b/Data/Scripts/011_Battle/003_Move/008_MoveEffects_MoveAttributes.rb @@ -421,6 +421,38 @@ class Battle::Move::IncreasePowerInElectricTerrain < Battle::Move end end +#=============================================================================== +# Damage is increased by 33% if the move is super-effective. (Electro Drift) +#=============================================================================== +class Battle::Move::IncreasePowerIfSuperEffective < Battle::Move + def pbModifyDamage(damageMult, user, target) + damageMult = damageMult * 4 / 3 if Effectiveness.super_effective?(target.damageState.typeMod) + return damageMult + end +end + +#=============================================================================== +# Power is doubled 30% of the time. (Fickle Beam) +#=============================================================================== +class Battle::Move::DoublePower30PercentChance < Battle::Move + def pbOnStartUse(user, targets) + @double_power = @battle.pbRandom(100) < 30 + if @double_power + @battle.pbDisplayBrief(_INTL("{1} is going all out for this attack!", user.pbThis)) + end + end + + def pbBaseDamage(baseDmg, user, target) + baseDmg *= 2 if @double_power + return baseDmg + end + + def pbShowAnimation(id, user, targets, hitNum = 0, showAnimation = true) + hitNum = 1 if @double_power + super + end +end + #=============================================================================== # Power is doubled if the target's HP is down to 1/2 or less. (Brine) #=============================================================================== @@ -477,6 +509,20 @@ class Battle::Move::DoublePowerIfTargetPoisoned < Battle::Move end end +#=============================================================================== +# Power is doubled if the target is poisoned, and then poisons the target. +# (Barb Barrage) +#=============================================================================== +class Battle::Move::DoublePowerIfTargetPoisonedPoisonTarget < Battle::Move::PoisonTarget + def pbBaseDamage(baseDmg, user, target) + if target.poisoned? && + (target.effects[PBEffects::Substitute] == 0 || ignoresSubstitute?(user)) + baseDmg *= 2 + end + return baseDmg + end +end + #=============================================================================== # Power is doubled if the target is paralyzed. Cures the target of paralysis. # (Smelling Salts) @@ -511,6 +557,20 @@ class Battle::Move::DoublePowerIfTargetStatusProblem < Battle::Move end end +#=============================================================================== +# Power is doubled if the target has a status problem, and then burns the +# target. (Infernal Parade) +#=============================================================================== +class Battle::Move::DoublePowerIfTargetStatusProblemBurnTarget < Battle::Move::BurnTarget + def pbBaseDamage(baseDmg, user, target) + if target.pbHasAnyStatus? && + (target.effects[PBEffects::Substitute] == 0 || ignoresSubstitute?(user)) + baseDmg *= 2 + end + return baseDmg + end +end + #=============================================================================== # Power is doubled if the user has no held item. (Acrobatics) #=============================================================================== @@ -895,6 +955,18 @@ class Battle::Move::ProtectUserBanefulBunker < Battle::Move::ProtectMove end end +#=============================================================================== +# User is protected against damaging moves this round. If a Pokémon makes +# contact with the user while this effect applies, that Pokémon is burned. +# (Burning Bulwark) +#=============================================================================== +class Battle::Move::ProtectUserFromDamagingMovesBurningBulwark < Battle::Move::ProtectMove + def initialize(battle, move) + super + @effect = PBEffects::BurningBulwark + end +end + #=============================================================================== # User is protected against damaging moves this round. Decreases the Attack of # the user of a stopped contact move by 2 stages. (King's Shield) @@ -919,6 +991,19 @@ class Battle::Move::ProtectUserFromDamagingMovesObstruct < Battle::Move::Protect end end +#=============================================================================== +# For the rest of this round, the user avoids all damaging moves that would hit +# it. If a move that makes contact is stopped by this effect, decreases the +# Speed of the Pokémon using that move by 1 stage. Contributes to Protect's +# counter. (Silk Trap) +#=============================================================================== +class Battle::Move::ProtectUserFromDamagingMovesSilkTrap < Battle::Move::ProtectMove + def initialize(battle, move) + super + @effect = PBEffects::SilkTrap + end +end + #=============================================================================== # User is protected against moves that target it this round. Damages the user of # a stopped contact move by 1/8 of its max HP. (Spiky Shield) @@ -1004,9 +1089,11 @@ end class Battle::Move::RemoveProtections < Battle::Move def pbEffectAgainstTarget(user, target) target.effects[PBEffects::BanefulBunker] = false + target.effects[PBEffects::BurningBulwark] = false target.effects[PBEffects::KingsShield] = false target.effects[PBEffects::Obstruct] = false target.effects[PBEffects::Protect] = false + target.effects[PBEffects::SilkTrap] = false target.effects[PBEffects::SpikyShield] = false target.pbOwnSide.effects[PBEffects::CraftyShield] = false target.pbOwnSide.effects[PBEffects::MatBlock] = false @@ -1047,9 +1134,11 @@ class Battle::Move::HoopaRemoveProtectionsBypassSubstituteLowerUserDef1 < Battle def pbEffectAgainstTarget(user, target) target.effects[PBEffects::BanefulBunker] = false + target.effects[PBEffects::BurningBulwark] = false target.effects[PBEffects::KingsShield] = false target.effects[PBEffects::Obstruct] = false target.effects[PBEffects::Protect] = false + target.effects[PBEffects::SilkTrap] = false target.effects[PBEffects::SpikyShield] = false target.pbOwnSide.effects[PBEffects::CraftyShield] = false target.pbOwnSide.effects[PBEffects::MatBlock] = false @@ -1317,6 +1406,46 @@ class Battle::Move::TypeIsUserFirstType < Battle::Move end end +#=============================================================================== +# This move's type is the same as the user's second type, only if the user is +# Ogerpon. (Ivy Cudgel) +#=============================================================================== +class Battle::Move::TypeDependsOnUserOgerponForm < Battle::Move + def pbBaseType(user) + if user.isSpecies?(:OGERPON) + case user.form + when 1 + return :WATER if GameData::Type.exists?(:WATER) + when 2 + return :FIRE if GameData::Type.exists?(:FIRE) + when 3 + return :ROCK if GameData::Type.exists?(:ROCK) + end + end + return @type + end +end + +#=============================================================================== +# This move's type is the same as the user's second type, only if the user is +# Ogerpon. (Ivy Cudgel) +#=============================================================================== +class Battle::Move::TypeDependsOnUserTaurosFormRemoveScreens < Battle::Move::RemoveScreens + def pbBaseType(user) + if user.isSpecies?(:TAUROS) + case user.form + when 1 + return :FIGHTING if GameData::Type.exists?(:WATER) + when 2 + return :FIRE if GameData::Type.exists?(:FIRE) + when 3 + return :WATER if GameData::Type.exists?(:ROCK) + end + end + return @type + end +end + #=============================================================================== # Power and type depends on the user's IVs. (Hidden Power) #=============================================================================== diff --git a/Data/Scripts/011_Battle/003_Move/009_MoveEffects_MultiHit.rb b/Data/Scripts/011_Battle/003_Move/009_MoveEffects_MultiHit.rb index 1d02d825a..80ac0f70d 100644 --- a/Data/Scripts/011_Battle/003_Move/009_MoveEffects_MultiHit.rb +++ b/Data/Scripts/011_Battle/003_Move/009_MoveEffects_MultiHit.rb @@ -63,8 +63,8 @@ class Battle::Move::HitTwoTimesTargetThenTargetAlly < Battle::Move end #=============================================================================== -# Hits 3 times. Power is multiplied by the hit number. (Triple Kick) -# An accuracy check is performed for each hit. +# Hits 3 times. Power is multiplied by the hit number. An accuracy check is +# performed for each hit. (Triple Kick) #=============================================================================== class Battle::Move::HitThreeTimesPowersUpWithEachHit < Battle::Move def multiHitMove?; return true; end @@ -95,6 +95,27 @@ class Battle::Move::HitThreeTimesAlwaysCriticalHit < Battle::Move def pbCritialOverride(user, target); return 1; end end +#=============================================================================== +# Hits 10 times in a row. An accuracy check is performed for each hit. +# (Population Bomb) +#=============================================================================== +class Battle::Move::HitThreeTimesAlwaysCriticalHit < Battle::Move + def multiHitMove?; return true; end + + def pbNumHits(user, targets) + return 4 + @battle.pbRandom(7) if user.hasActiveItem?(:LOADEDDICE) + return 10 + end + + def successCheckPerHit? + return @accCheckPerHit + end + + def pbOnStartUse(user, targets) + @accCheckPerHit = !user.hasActiveAbility?(:SKILLLINK) && !user.hasActiveItem?(:LOADEDDICE) + end +end + #=============================================================================== # Hits 2-5 times. #=============================================================================== @@ -317,8 +338,8 @@ class Battle::Move::TwoTurnAttackRaiseUserSpAtkSpDefSpd2 < Battle::Move::TwoTurn end #=============================================================================== -# Two turn attack. Ups user's Defense by 1 stage first turn, attacks second turn. -# (Skull Bash) +# Two turn attack. On the first turn, increases the user's Defense by 1 stage. +# On the second turn, does damage. (Skull Bash) #=============================================================================== class Battle::Move::TwoTurnAttackChargeRaiseUserDefense1 < Battle::Move::TwoTurnMove attr_reader :statUp @@ -362,6 +383,29 @@ class Battle::Move::TwoTurnAttackChargeRaiseUserSpAtk1 < Battle::Move::TwoTurnMo end end +#=============================================================================== +# Two turn attack. On the first turn, increases the user's Special Attack by 1 +# stage. On the second turn, does damage. In rain, takes 1 turn instead. +# (Electro Shot) +#=============================================================================== +class Battle::Move::TwoTurnAttackOneTurnInRainChargeRaiseUserSpAtk1 < Battle::Move::TwoTurnAttackChargeRaiseUserSpAtk1 + def pbIsChargingTurn?(user) + ret = super + if !user.effects[PBEffects::TwoTurnAttack] && + [:Rain, :HeavyRain].include?(user.effectiveWeather) + @powerHerb = false + @chargingTurn = true + @damagingTurn = true + return false + end + return ret + end + + def pbChargingTurnMessage(user, targets) + @battle.pbDisplay(_INTL("{1} absorbed electricity!", user.pbThis)) + end +end + #=============================================================================== # Two turn attack. Skips first turn, attacks second turn. (Dig) # (Handled in Battler's pbSuccessCheckPerHit): Is semi-invulnerable during use. @@ -488,9 +532,11 @@ class Battle::Move::TwoTurnAttackInvulnerableRemoveProtections < Battle::Move::T def pbAttackingTurnEffect(user, target) target.effects[PBEffects::BanefulBunker] = false + target.effects[PBEffects::BurningBulwark] = false target.effects[PBEffects::KingsShield] = false target.effects[PBEffects::Obstruct] = false target.effects[PBEffects::Protect] = false + target.effects[PBEffects::SilkTrap] = false target.effects[PBEffects::SpikyShield] = false target.pbOwnSide.effects[PBEffects::CraftyShield] = false target.pbOwnSide.effects[PBEffects::MatBlock] = false diff --git a/Data/Scripts/011_Battle/003_Move/010_MoveEffects_Healing.rb b/Data/Scripts/011_Battle/003_Move/010_MoveEffects_Healing.rb index 4ac5cd24e..0a447dc96 100644 --- a/Data/Scripts/011_Battle/003_Move/010_MoveEffects_Healing.rb +++ b/Data/Scripts/011_Battle/003_Move/010_MoveEffects_Healing.rb @@ -199,6 +199,19 @@ class Battle::Move::HealUserByHalfOfDamageDoneIfTargetAsleep < Battle::Move end end +#=============================================================================== +# User gains half the HP it inflicts as damage. Burns the target. (Matcha Gotcha) +#=============================================================================== +class Battle::Move::HealUserByHalfOfDamageDoneBurnTarget < Battle::Move::BurnTarget + def healingMove?; return Settings::MECHANICS_GENERATION >= 6; end + + def pbEffectAgainstTarget(user, target) + return if target.damageState.hpLost <= 0 + hpGain = (target.damageState.hpLost / 2.0).round + user.pbRecoverHPFromDrain(hpGain, target) + end +end + #=============================================================================== # User gains 3/4 the HP it inflicts as damage. (Draining Kiss, Oblivion Wing) #=============================================================================== diff --git a/Data/Scripts/011_Battle/003_Move/012_MoveEffects_ChangeMoveEffect.rb b/Data/Scripts/011_Battle/003_Move/012_MoveEffects_ChangeMoveEffect.rb index 2ee8d1b28..e12550a4f 100644 --- a/Data/Scripts/011_Battle/003_Move/012_MoveEffects_ChangeMoveEffect.rb +++ b/Data/Scripts/011_Battle/003_Move/012_MoveEffects_ChangeMoveEffect.rb @@ -727,6 +727,8 @@ class Battle::Move::UseLastMoveUsed < Battle::Move "ProtectUserFromDamagingMovesObstruct", # Obstruct # Not listed on Bulbapedia "ProtectUserFromTargetingMovesSpikyShield", # Spiky Shield "ProtectUserBanefulBunker", # Baneful Bunker + "ProtectUserFromDamagingMovesSilkTrap", # Silk Trap + "ProtectUserFromDamagingMovesBurningBulwark", # Burning Bulwark # Moves that call other moves "UseLastMoveUsedByTarget", # Mirror Move "UseLastMoveUsed", # Copycat (this move) @@ -960,6 +962,8 @@ class Battle::Move::UseRandomMove < Battle::Move "ProtectUserFromDamagingMovesObstruct", # Obstruct "ProtectUserFromTargetingMovesSpikyShield", # Spiky Shield "ProtectUserBanefulBunker", # Baneful Bunker + "ProtectUserFromDamagingMovesSilkTrap", # Silk Trap + "ProtectUserFromDamagingMovesBurningBulwark", # Burning Bulwark # Moves that call other moves "UseLastMoveUsedByTarget", # Mirror Move "UseLastMoveUsed", # Copycat @@ -1052,6 +1056,8 @@ class Battle::Move::UseRandomMoveFromUserParty < Battle::Move "ProtectUserFromDamagingMovesObstruct", # Obstruct # Not listed on Bulbapedia "ProtectUserFromTargetingMovesSpikyShield", # Spiky Shield "ProtectUserBanefulBunker", # Baneful Bunker + "ProtectUserFromDamagingMovesSilkTrap", # Silk Trap + "ProtectUserFromDamagingMovesBurningBulwark", # Burning Bulwark # Moves that call other moves "UseLastMoveUsedByTarget", # Mirror Move "UseLastMoveUsed", # Copycat diff --git a/Data/Scripts/011_Battle/006_AI MoveEffects/005_AI_MoveEffects_MultiHit.rb b/Data/Scripts/011_Battle/006_AI MoveEffects/005_AI_MoveEffects_MultiHit.rb index 525a74678..1a5b22b50 100644 --- a/Data/Scripts/011_Battle/006_AI MoveEffects/005_AI_MoveEffects_MultiHit.rb +++ b/Data/Scripts/011_Battle/006_AI MoveEffects/005_AI_MoveEffects_MultiHit.rb @@ -234,7 +234,9 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("TwoTurnAttack", # user's first turn in battle, so it can't be used in response # to this move charging up. if target.has_move_with_function?("ProtectUserFromDamagingMovesKingsShield", - "ProtectUserFromDamagingMovesObstruct") + "ProtectUserFromDamagingMovesObstruct", + "ProtectUserFromDamagingMovesSilkTrap", + "ProtectUserFromDamagingMovesBurningBulwark") has_protect_move = true end end diff --git a/Data/Scripts/011_Battle/006_AI MoveEffects/009_AI_MoveEffects_SwitchingActing.rb b/Data/Scripts/011_Battle/006_AI MoveEffects/009_AI_MoveEffects_SwitchingActing.rb index 76099ff5b..f625bc555 100644 --- a/Data/Scripts/011_Battle/006_AI MoveEffects/009_AI_MoveEffects_SwitchingActing.rb +++ b/Data/Scripts/011_Battle/006_AI MoveEffects/009_AI_MoveEffects_SwitchingActing.rb @@ -800,7 +800,9 @@ Battle::AI::Handlers::MoveEffectAgainstTargetScore.add("DisableTargetStatusMoves "ProtectUserFromDamagingMovesKingsShield", # King's Shield "ProtectUserFromDamagingMovesObstruct", # Obstruct "ProtectUserFromTargetingMovesSpikyShield", # Spiky Shield - "ProtectUserBanefulBunker" # Baneful Bunker + "ProtectUserBanefulBunker", # Baneful Bunker + "ProtectUserFromDamagingMovesSilkTrap", # Silk Trap + "ProtectUserFromDamagingMovesBurningBulwark" # Burning Bulwark ] if target.check_for_move { |m| m.statusMove? && protection_moves.include?(m.function_code) } score += 10 diff --git a/Data/Scripts/011_Battle/007_Other battle code/001_PBEffects.rb b/Data/Scripts/011_Battle/007_Other battle code/001_PBEffects.rb index 855457c1d..4216722ce 100644 --- a/Data/Scripts/011_Battle/007_Other battle code/001_PBEffects.rb +++ b/Data/Scripts/011_Battle/007_Other battle code/001_PBEffects.rb @@ -9,6 +9,7 @@ module PBEffects Bide = 4 BideDamage = 5 BideTarget = 6 + BurningBulwark = 1107 BurnUp = 7 Charge = 8 ChoiceBand = 9 @@ -23,6 +24,7 @@ module PBEffects DestinyBondTarget = 18 Disable = 19 DisableMove = 20 + DoubleShock = 9922 Electrify = 21 Embargo = 22 Encore = 23 @@ -91,6 +93,7 @@ module PBEffects Rollout = 86 Roost = 87 ShellTrap = 88 + SilkTrap = 1189 SkyDrop = 89 SlowStart = 90 SmackDown = 91 diff --git a/Data/Scripts/020_Debug/003_Debug menus/006_Debug_BattleExtraCode.rb b/Data/Scripts/020_Debug/003_Debug menus/006_Debug_BattleExtraCode.rb index 7b9b62ada..ad0a4bab8 100644 --- a/Data/Scripts/020_Debug/003_Debug menus/006_Debug_BattleExtraCode.rb +++ b/Data/Scripts/020_Debug/003_Debug menus/006_Debug_BattleExtraCode.rb @@ -10,6 +10,7 @@ module Battle::DebugVariables PBEffects::Bide => {name: "Bide number of rounds remaining", default: 0}, PBEffects::BideDamage => {name: "Bide damage accumulated", default: 0, max: 999}, PBEffects::BideTarget => {name: "Bide last battler to hurt self", default: -1}, # Battler index + PBEffects::BurningBulwark => {name: "Burning Bulwark applies this round", default: false}, PBEffects::BurnUp => {name: "Burn Up has removed self's Fire type", default: false}, PBEffects::Charge => {name: "Charge number of rounds remaining", default: 0}, PBEffects::ChoiceBand => {name: "Move locked into by Choice items", default: nil, type: :move}, @@ -24,6 +25,7 @@ module Battle::DebugVariables # PBEffects::DestinyBondTarget - not suitable for setting via debug PBEffects::Disable => {name: "Disable number of rounds remaining", default: 0}, PBEffects::DisableMove => {name: "Disabled move", default: nil, type: :move}, + PBEffects::DoubleShock => {name: "Double Shock has removed self's Electric type", default: false}, PBEffects::Electrify => {name: "Electrify making moves Electric", default: false}, PBEffects::Embargo => {name: "Embargo number of rounds remaining", default: 0}, PBEffects::Encore => {name: "Encore number of rounds remaining", default: 0}, @@ -91,6 +93,7 @@ module Battle::DebugVariables PBEffects::Rollout => {name: "Rollout rounds remaining (lower=stronger)", default: 0}, PBEffects::Roost => {name: "Roost removing Flying type this round", default: false}, # PBEffects::ShellTrap - only applies to use of specific move, not suitable for setting via debug + PBEffects::SilkTrap => {name: "Silk Trap applies this round", default: false}, # PBEffects::SkyDrop - only applies to use of specific move, not suitable for setting via debug PBEffects::SlowStart => {name: "Slow Start rounds remaining", default: 0}, PBEffects::SmackDown => {name: "Smack Down is grounding self", default: false}, diff --git a/PBS/Gen 8 backup/moves.txt b/PBS/Gen 8 backup/moves.txt index c32754c91..8c5769297 100644 --- a/PBS/Gen 8 backup/moves.txt +++ b/PBS/Gen 8 backup/moves.txt @@ -2015,7 +2015,7 @@ TotalPP = 10 Target = NearOther FunctionCode = LowerTargetDefense1FlinchTarget Flags = CanProtect,CanMirrorMove,HighCriticalHitRate -EffectChance = 100 +EffectChance = 101 Description = This move is more likely to be a critical hit, and may also lower the target's Defense stat or make it flinch. #------------------------------- [SECRETSWORD] diff --git a/PBS/Gen 9 backup/moves.txt b/PBS/Gen 9 backup/moves.txt index 1111bf705..e651bdd28 100644 --- a/PBS/Gen 9 backup/moves.txt +++ b/PBS/Gen 9 backup/moves.txt @@ -2222,7 +2222,7 @@ TotalPP = 10 Target = NearOther FunctionCode = LowerTargetDefense1FlinchTarget Flags = CanProtect,CanMirrorMove,HighCriticalHitRate -EffectChance = 100 +EffectChance = 101 Description = This move is more likely to be a critical hit, and may also lower the target's Defense stat or make it flinch. #------------------------------- [SECRETSWORD] @@ -3169,7 +3169,7 @@ Accuracy = 0 TotalPP = 10 Target = User Priority = 4 -FunctionCode = ProtectUserBurningBulwark +FunctionCode = ProtectUserFromDamagingMovesBurningBulwark Description = The user's intensely hot fur protects it from attacks and also burns any attacker that makes contact. #------------------------------- [SUNNYDAY] @@ -3969,7 +3969,7 @@ Power = 100 Accuracy = 100 TotalPP = 10 Target = NearOther -FunctionCode = TypeIsUserOgerponSecondType +FunctionCode = TypeDependsOnUserOgerponForm Flags = CanProtect,CanMirrorMove,HighCriticalHitRate Description = The user hits with an ivy-wrapped cudgel. The user's mask sets the move's type. High critical hit chance. #------------------------------- @@ -5352,7 +5352,7 @@ Power = 120 Accuracy = 100 TotalPP = 5 Target = NearOther -FunctionCode = TargetAndTypeDependOnUserTerapagosForm +FunctionCode = None Flags = CanProtect,CanMirrorMove,CannotMetronome Description = With the power of its crystals, the user bombards and eliminates the target. #------------------------------- @@ -5424,7 +5424,7 @@ Power = 90 Accuracy = 100 TotalPP = 10 Target = NearOther -FunctionCode = TypeIsUserTaurosSecondTypeRemoveScreens +FunctionCode = TypeDependsOnUserTaurosFormRemoveScreens Flags = Contact,CanProtect,CanMirrorMove,CannotMetronome Description = The user performs a raging tackle. This move's type depends on the user's form. It can break barriers. #------------------------------- @@ -6163,7 +6163,7 @@ Power = 1 Accuracy = 100 TotalPP = 5 Target = NearOther -FunctionCode = PowerHigherWithTargetHP +FunctionCode = PowerHigherWithTargetHP120 Flags = Contact,CanProtect,CanMirrorMove Description = The target is crushed with great force. The attack is more powerful the more HP the target has left. #------------------------------- @@ -6319,7 +6319,7 @@ Power = 1 Accuracy = 100 TotalPP = 5 Target = NearOther -FunctionCode = PowerHigherWithTargetHP +FunctionCode = PowerHigherWithTargetHP120 Flags = Contact,CanProtect,CanMirrorMove Description = The user powerfully wrings the foe. The more HP the foe has, the greater this attack's power. #------------------------------- @@ -8176,7 +8176,7 @@ TotalPP = 15 Target = User Priority = 2 FunctionCode = UserSwapsPositionsWithAlly -Description = The user teleports using a strange power and switches its place with one of its allies. +Description = The user uses a strange power to switch places with an ally. More likely to fail if used in succession. #------------------------------- [AMNESIA] Name = Amnesia @@ -8900,7 +8900,7 @@ Power = 130 Accuracy = 100 TotalPP = 5 Target = NearOther -FunctionCode = RemoveTerrain +FunctionCode = RemoveTerrainFailsIfNoTerrain Flags = Contact,CanProtect,CanMirrorMove Description = The user attacks while destroying the terrain. This move fails when the ground isn't a terrain. #------------------------------- diff --git a/PBS/moves.txt b/PBS/moves.txt index 0f669f116..e651bdd28 100644 --- a/PBS/moves.txt +++ b/PBS/moves.txt @@ -2222,7 +2222,7 @@ TotalPP = 10 Target = NearOther FunctionCode = LowerTargetDefense1FlinchTarget Flags = CanProtect,CanMirrorMove,HighCriticalHitRate -EffectChance = 100 +EffectChance = 101 Description = This move is more likely to be a critical hit, and may also lower the target's Defense stat or make it flinch. #------------------------------- [SECRETSWORD] @@ -3169,7 +3169,7 @@ Accuracy = 0 TotalPP = 10 Target = User Priority = 4 -FunctionCode = ProtectUserBurningBulwark +FunctionCode = ProtectUserFromDamagingMovesBurningBulwark Description = The user's intensely hot fur protects it from attacks and also burns any attacker that makes contact. #------------------------------- [SUNNYDAY] @@ -3969,7 +3969,7 @@ Power = 100 Accuracy = 100 TotalPP = 10 Target = NearOther -FunctionCode = TypeIsUserOgerponSecondType +FunctionCode = TypeDependsOnUserOgerponForm Flags = CanProtect,CanMirrorMove,HighCriticalHitRate Description = The user hits with an ivy-wrapped cudgel. The user's mask sets the move's type. High critical hit chance. #------------------------------- @@ -5352,7 +5352,7 @@ Power = 120 Accuracy = 100 TotalPP = 5 Target = NearOther -FunctionCode = TargetAndTypeDependOnUserTerapagosForm +FunctionCode = None Flags = CanProtect,CanMirrorMove,CannotMetronome Description = With the power of its crystals, the user bombards and eliminates the target. #------------------------------- @@ -5424,7 +5424,7 @@ Power = 90 Accuracy = 100 TotalPP = 10 Target = NearOther -FunctionCode = TypeIsUserTaurosSecondTypeRemoveScreens +FunctionCode = TypeDependsOnUserTaurosFormRemoveScreens Flags = Contact,CanProtect,CanMirrorMove,CannotMetronome Description = The user performs a raging tackle. This move's type depends on the user's form. It can break barriers. #-------------------------------