- Pokémon Essentials Version
- v20.1 ➖
There's a whopping 58 designs in this video! Some of that is the same concept multiplied out (balls for Egg Groups, balls for types, etc.), but a lot of them are totally unique effects! I've adapted most of these for Essentials v20 and have the Poké Ball handlers and PBS entries here!
A few notes:
- The following Poké Balls were skipped, but may be added in the future:
- Nuzlocke Ball
- Plus Ball
- Multi Ball
- Blast Ball
- There are no graphics, just code.
- No exact numbers were given for the catch rate boost, so everything was set to a 3x multiplier. (Except for balls with clear counterparts, like the Dawn Ball/Shrink Ball)
- Similarly, no buy/sell price was given, so all balls are set to $1000
- Following Net Ball's example, any ball with multiple conditions does not stack. (For example, even though a Surskit is Bug/Water, a Net Ball is just as effective on it as it would be on a Pokémon that's just Water-type)
I have two ways to add these - a bulk installation where you just add them all in at once, and an individual listing section where the handler (and/or relevant code) and PBS entry is listed for each specific Poké Ball. (This is also where I clarify more on the exact mechanics.)
Paste this in a script section above Main, and add this to items.txt.
For the Dawn Ball -
To implement the inside-buildings feature, you'll have to do a little bit of extra work.
In Overworld_BattleStarting, find these lines:
Below them, add these:
Every map with the battle environment set to None in its map metadata will have a boost to Dawn Balls. To my knowledge, this should not affect anything else in-battle, as time-dependent mechanics aren't used in battle anymore to account for multiplayer functions across time zones. But if you've introduced mechanics that you think wouldn't pair well with this, or you've got an indoor location where it wouldn't make sense (like the Underground Path in Kanto), you may want to consider making another battle environment for Dawn Ball's effect.
For the Seeker Ball -
In the script section Item_BattleEffects, find this line:
And change it to:
Add the following flags to any relevant species in pokemon.txt:
For the Dawn Ball -
To implement the inside-buildings feature, you'll have to do a little bit of extra work.
In Overworld_BattleStarting, find these lines:
Ruby:
if $game_map.metadata&.battle_environment == :Cave
battle.time = 2 # This makes Dusk Balls work properly in caves
Ruby:
elsif $game_map.metadata&.battle_environment == :None
battle.time = 0 # This makes Dawn Balls work properly indoors
For the Seeker Ball -
In the script section Item_BattleEffects, find this line:
Ruby:
if battler.semiInvulnerable?
Ruby:
if battler.semiInvulnerable? && !(item == :SEEKERBALL)
Add the following flags to any relevant species in pokemon.txt:
inorganic
for any Pokémon made of artificial materials. (Voltorb, Trubbish, etc.) This is specifically to allow the Junk Ball to work on object-based Pokémon that aren't Steel-type, so you wouldn't need to add it to a species like Magnemite for it to work. But I would still recommend adding it anyways just in case you have any other mechanics that work on object-based Pokémon)Mythic
for any Mythical Pokémon, andLegendary
for any Legendary.
Dex Ball - Registers the Pokémon in the dex as caught, even if it fails to catch.
Cycle Ball - Returns to the player after a Pokémon breaks out, provided the Pokémon was asleep, frozen, or paralyzed.
Dawn Ball - Counterpart to the Dusk Ball, works better in the daytime or inside buildings.
A.I.R made a bag sprite for this!
To implement the inside-buildings feature, you'll have to do a little bit of extra work.
In Overworld_BattleStarting, find these lines:
Below them, add these:
Every map with the battle environment set to None in its map metadata will have a boost to Dawn Balls. To my knowledge, this should not affect anything else in-battle, as time-dependent mechanics aren't used in battle anymore to account for multiplayer functions across time zones. But if you've introduced mechanics that you think wouldn't pair well with this, or you've got an indoor location where it wouldn't make sense (like the Underground Path in Kanto), you may want to consider making another battle environment for Dawn Ball's effect.
Luck Ball - Totally random catchrate, anywhere from 0 to 255.
Stat Ball - Increased catch rate if target's stats have been lowered.
Evo Ball - Works better on evolved Pokémon.
Seeker Ball - Can catch Pokémon in semi-invulnerable states. (Fly, Dig, Surf, etc.)
In the script section Item_BattleEffects, find this line:
And change it to:
Alternatively... maybe you'd like to give the player the ability to let any Poké Ball catch a semi-invulnerable target?
Shiny Ball - Works better on shiny Pokémon.
Value Ball - Sets three random IVs to max.
Shrink Ball - Counterpart to the Heavy Ball that works better on lighter Pokémon. Extra bonus for minimized Pokémon.
Trap Ball - Works better on Pokémon trapped by moves like Bind, Fire Spin, etc.
Rage Ball - Works better if your Pokémon fainted on the previous turn.
Executive Ball - Snag Ball with increased catch rate when used in trainer battles.
Para Ball - Increased rate on paralyzed or Electric-type Pokémon.
Burn Ball - Increased rate on burned or Fire-type Pokémon.
Poison Ball - Increased rate on poisoned or Poison-type Pokémon.
Freeze Ball - Increased rate on frozen or Ice-type Pokémon.
Dizzy Ball - Increased rate on confused or Psychic-type Pokémon.
Minus Battle - Catch rate is multiplied by
Divide Ball - If it fails to catch a Pokémon, divides its current HP in half.
Equal Ball - Restores Pokémon's HP and PP if it fails to catch a Pokémon. (Does not cure status effects)
Taunt Ball - Applies Taunt if it fails to catch the Pokémon. (Can't stack Taunt Ball and Taunt. Can use a Taunt Ball on a taunted Pokémon, but it'll just work like a regular Poké Ball. Will trigger a held Mental Herb.)
Penalty Ball - Applies the effect of Disable if it fails to catch the Pokémon. (No effect if used first turn in a battle, can't disable multiple moves, have to wait for the effects of Disable/Penalty Ball to wear off before disabling another move. Can still throw another Penalty Ball, will just work like a regular Poké Ball. Will trigger a held Mental Herb.)
Concuss Ball - Causes the Pokémon to flinch if it fails to catch it. (This does interact with abilities - Steadfast will be triggered, and Inner Focus will prevent the flinching, though it currently doesn't display any message.)
Dowse Ball - Applies the effects of Foresight if it fails to catch a Pokémon.
Choice Ball - Applies the effects of Encore if it fails to catch a Pokémon. If the Pokémon hasn't used a move yet, or is already under the effects of Encore, it'll just work like a regular Poké Ball. Will trigger a Mental Herb.
Berry Ball - Heals by 20HP if it fails, unless the Pokémon is under the effect of Heal Block.
Lock Ball - Prevents the Pokémon from fleeing if it fails to catch it, using the same mechanic as Mean Look. Substitube's description said it would only prevent it for one turn, but it was simpler to make it permanent. Does not affect a Pokémon if another Pokémon on the field has already trapped them, if they're a Ghost-type and you've set MORE_TYPE_EFFECTS in Settings to true, or if the target is behind a Substitute.
Vacuum Ball - If it fails, clears the following effects from the Pokémon's side:
Rus Ball - The exact mechanics here were not especially clear - Substitube only said this would have "an increased chance of inflicting PokéRus". They put this in the section for balls with effects that trigger on failing to catch, but I don't see why this wouldn't apply as well if you caught it? And of course the specific odds weren't given. So what I've done is make it where on failing or succeeding to catch the Pokémon, there's another chance of the Pokémon catching PokéRus, this time with 2x the odds. (I was considering doing a Luxury Ball thing where Pokémon would be more susceptible to PokéRus if they were inside a Rus Ball, but apparently that's not how PokéRus works!)
Clear Ball - Increased rate on Normal-types and Pokémon with type-changing abilities. (Color Change, Multitype, RKS System, Protean, Libero, or Mimicry) Note that it doesn't account for any in-battle changes in ability - if you used Skill Swap to pass one of these abilities over, it wouldn't affect the catch rate.
Knuckle Ball - Increased rate on Fighting- and Dark-types.
Float Ball - Increased rate on Flying-types or Pokémon with Levitate. (like the Clear Ball, this is if they have Levitate naturally, not with any move shenanigans)
Yule Ball - Increased rate on Fairy-, Grass- and Ice-types.
A.I.R made a bag sprite for this!
Magma Ball - Increased rate on Fire-, Rock-, and Ground-types.
Spirit Ball - Increased rate on Psychic- and Ghost-types.
Junk Ball - Increased rate on Steel-types and Pokémon formed from inorganic objects.
For any non-Steel-type you want this ball to affect, you need to add the species flag Inorganic in pokemon.txt.
Meadow Ball - Increased rate when used on Grassy Terrain.
Mist Ball - Increased rate when used on Misty Terrain.
Storm Ball - Increased rate when used on Electric Terrain.
Warp Ball - Increased rate when used on Psychic Terrain or in psychic rooms. (Trick Room, Wonder Room, etc.)
Sand Ball - Increased rate in Sandstorm.
Drizzle Ball - Increased rate in rain. (regular or primal)
Hail Ball - Increased rate in hail or snow.
Drought Ball - Increased rate in harsh sunlight. (regular or primal)
Kin Ball - Increased rate on Pokémon from the Humanlike and Fairy Egg Groups.
Field Ball - Increased rate on Pokémon from the Field Egg Group.
Morph Ball - Increased rate on Pokémon from the Amorphous Egg Group.
Nature Ball - Increased rate on Pokémon from the Grass and Bug Egg Groups.
Ore Ball - Increased rate on Pokémon from the Mineral Egg Group.
Monster Ball - Increased rate on Pokémon from the Monster Egg Group.
Elder Ball - Increased rate on Pokémon from the Dragon Egg Group.
A.I.R made a bag sprite for this!
Unown Ball - Increased catch rate on Unown.
Mythic Ball - Increased rate on Mythical and Legendary Pokémon.
Add the Mythic or Legendary flag for all relevant species in pokemon.txt.
Ruby:
Battle::PokeBallEffects::OnFailCatch.add(:DEXBALL, proc { |ball, battle, battler|
if !battle.pbPlayer.owned?(battler.species)
battle.pbPlayer.pokedex.set_owned(battler.species)
if $player.has_pokedex
battle.pbDisplayPaused(_INTL("{1}'s data was added to the Pokédex.", battler.pokemon.speciesName))
battle.pbPlayer.pokedex.register_last_seen(battler.pokemon)
battle.scene.pbShowPokedex(battler.species)
end
end
})
Code:
#-------------------------------
[DEXBALL]
Name = Dex Ball
NamePlural = Dex Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A technologically-advanced Ball that records an entry in the PokéDex even without capturing a Pokémon.
Ruby:
Battle::PokeBallEffects::OnFailCatch.add(:CYCLEBALL, proc { |ball, battle, battler|
if [:FROZEN,:SLEEP,:PARALYSIS].include?(battler.status)
$bag.add(:CYCLEBALL)
itemName = GameData::Item.get(:CYCLEBALL).name
battle.pbDisplay(_INTL("The {1} flew back to {2}!", itemName, battle.pbPlayer.name))
end
})
Code:
#-------------------------------
[CYCLEBALL]
Name = Cycle Ball
NamePlural = Cycle Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A technologically-advanced Ball that returns to trainers if it fails to catch an immobilized Pokémon.
A.I.R made a bag sprite for this!
Ruby:
Battle::PokeBallEffects::ModifyCatchRate.add(:DAWNBALL, proc { |ball, catchRate, battle, battler|
multiplier = (Settings::NEW_POKE_BALL_CATCH_RATES) ? 3 : 3.5
catchRate *= multiplier if battle.time == 0 # Daytime outside of caves
next catchRate
})
Code:
#-------------------------------
[DAWNBALL]
Name = Dawn Ball
NamePlural = Dawn Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A somewhat different Poké Ball that makes it easier to catch wild Pokémon during the day or in well-lit buildings.
In Overworld_BattleStarting, find these lines:
Ruby:
if $game_map.metadata&.battle_environment == :Cave
battle.time = 2 # This makes Dusk Balls work properly in caves
Ruby:
elsif $game_map.metadata&.battle_environment == :None
battle.time = 0 # This makes Dawn Balls work properly indoors
Ruby:
Battle::PokeBallEffects::ModifyCatchRate.add(:LUCKBALL, proc { |ball, catchRate, battle, battler|
next rand(255)
})
Code:
#-------------------------------
[LUCKBALL]
Name = Luck Ball
NamePlural = Luck Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A bizarre Poké Ball with a Pokémon catch rate left entirely to chance.
Ruby:
Battle::PokeBallEffects::ModifyCatchRate.add(:STATBALL, proc { |ball, catchRate, battle, battler|
catchRate *= 3 if battler.hasLoweredStatStages?
next catchRate
})
Code:
#-------------------------------
[STATBALL]
Name = Stat Ball
NamePlural = Stat Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A strategic Poké Ball that works better on Pokémon who have had their stats lowered in battle.
Ruby:
Battle::PokeBallEffects::ModifyCatchRate.add(:EVOBALL, proc { |ball, catchRate, battle, battler|
catchRate *= 3 unless battler.pokemon.species_data.get_previous_species == battler.species
next catchRate
})
Code:
#-------------------------------
[EVOBALL]
Name = Evo Ball
NamePlural = Evo Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A somewhat different Poké Ball that works especially well on evolved species of Pokémon.
Code:
#-------------------------------
[SEEKERBALL]
Name = Seeker Ball
NamePlural = Seeker Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A technologically-advanced Ball that can catch Pokémon out of a trainer's sight.
Ruby:
if battler.semiInvulnerable?
Ruby:
if battler.semiInvulnerable? && !(item == :SEEKERBALL)
Alternatively... maybe you'd like to give the player the ability to let any Poké Ball catch a semi-invulnerable target?
Ruby:
if battler.semiInvulnerable? && $bag.has?(:HOMINGDEVICE)
Ruby:
Battle::PokeBallEffects::ModifyCatchRate.add(:SHINYBALL, proc { |ball, catchRate, battle, battler|
catchRate *= 3 if battler.shiny?
next catchRate
})
Code:
#-------------------------------
[SHINYBALL]
Name = Shiny Ball
NamePlural = Shiny Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A brilliant, gleaming Poké Ball that works especially well on shiny Pokémon.
Ruby:
Battle::PokeBallEffects::OnCatch.add(:VALUEBALL, proc { |ball, battle, pkmn|
stats = []
GameData::Stat.each_main { |s| stats.push(s.id) }
chosen_stats = stats.sample(3)
chosen_stats.each { |stat| pkmn.iv[stat] = 31 }
})
Code:
#-------------------------------
[VALUEBALL]
Name = Value Ball
NamePlural = Value Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A particularly expensive Poké Ball that increases the power of captured Pokémon.
Ruby:
Battle::PokeBallEffects::ModifyCatchRate.add(:SHRINKBALL, proc { |ball, catchRate, battle, battler|
next 0 if catchRate == 0
weight = battler.pbWeight
if Settings::NEW_POKE_BALL_CATCH_RATES
if weight <= 1000
catchRate += 30
elsif weight <= 2000
catchRate += 20
elsif weight > 3000
catchRate -= 20
end
else
if weight <= 2048
catchRate += 40
elsif weight <= 3072
catchRate += 30
elsif weight >= 4096
catchRate += 20
else
catchRate -= 20
end
end
catchRate += 40 if battler.effects[PBEffects::Minimize]
next catchRate.clamp(1, 255)
})
Code:
#-------------------------------
[SHRINKBALL]
Name = Shrink Ball
NamePlural = Shrink Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A Poké Ball for catching very light Pokémon.
Ruby:
Battle::PokeBallEffects::ModifyCatchRate.add(:TRAPBALL, proc { |ball, catchRate, battle, battler|
catchRate *= 3 if battler.effects[PBEffects::Trapping] > 0
next catchRate
})
Code:
#-------------------------------
[TRAPBALL]
Name = Trap Ball
NamePlural = Trap Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A somewhat different Poké Ball that works especially on Pokémon ensnared by binding moves.
Ruby:
Battle::PokeBallEffects::ModifyCatchRate.add(:RAGEBALL, proc { |ball, catchRate, battle, battler|
lrf = battler.pbOpposingSide.effects[PBEffects::LastRoundFainted]
catchRate *= 3 if lrf >= 0 && lrf == battle.turnCount - 1
next catchRate
})
Code:
#-------------------------------
[RAGEBALL]
Name = Rage Ball
NamePlural = Rage Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A somewhat different Poké Ball that works better when used by a trainer whose Pokémon recently fainted.
Ruby:
Battle::PokeBallEffects::ModifyCatchRate.add(:EXECUTIVEBALL, proc { |ball, catchRate, battle, battler|
catchRate *= 3 if battle.trainerBattle?
next catchRate
})
Code:
#-------------------------------
[EXECUTIVEBALL]
Name = Executive Ball
NamePlural = Executive Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall, SnagBall
Description = A sinister Poké Ball used by Team Rocket executives that excels at stealing Pokémon from trainers.
Ruby:
Battle::PokeBallEffects::ModifyCatchRate.add(:PARABALL, proc { |ball, catchRate, battle, battler|
catchRate *= 3 if battler.pbHasType?(:ELECTRIC) || battler.paralyzed?
next catchRate
})
Code:
#-------------------------------
[PARABALL]
Name = Para Ball
NamePlural = Para Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A somewhat different Poké Ball that works especially well on paralyzed or Electric-type Pokémon.
Ruby:
Battle::PokeBallEffects::ModifyCatchRate.add(:BURNBALL, proc { |ball, catchRate, battle, battler|
catchRate *= 3 if battler.pbHasType?(:FIRE) || battler.burned?
next catchRate
})
Code:
#-------------------------------
[BURNBALL]
Name = Burn Ball
NamePlural = Burn Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A somewhat different Poké Ball that works especially well on burned or Fire-type Pokémon.
Ruby:
Battle::PokeBallEffects::ModifyCatchRate.add(:POISONBALL, proc { |ball, catchRate, battle, battler|
catchRate *= 3 if battler.pbHasType?(:POISON) || battler.poisoned?
next catchRate
})
Code:
#-------------------------------
[POISONBALL]
Name = Poison Ball
NamePlural = Poison Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A somewhat different Poké Ball that works especially well on poisoned or Poison-type Pokémon.
Ruby:
Battle::PokeBallEffects::ModifyCatchRate.add(:FREEZEBALL, proc { |ball, catchRate, battle, battler|
catchRate *= 3 if battler.pbHasType?(:ICE) || battler.frozen?
next catchRate
})
Code:
#-------------------------------
[FREEZEBALL]
Name = Freeze Ball
NamePlural = Freeze Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A somewhat different Poké Ball that works especially well on frozen or Ice-type Pokémon.
Ruby:
Battle::PokeBallEffects::ModifyCatchRate.add(:DIZZYBALL, proc { |ball, catchRate, battle, battler|
catchRate *= 3 if battler.pbHasType?(:PSYCHIC) || battler.effects[PBEffects::Confusion] > 0
next catchRate
})
Code:
#-------------------------------
[DIZZYBALL]
Name = Dizzy Ball
NamePlural = Dizzy Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A somewhat different Poké Ball that works especially well on confused or Psychic-type Pokémon.
5 - (number of Minus Balls left in the bag)
. If you have 5 or more Minus Balls in the bag, they'll fail. (Substitube didn't mention any specific numbers, feel free to toy with the formula however you'd like to balance it.)
Ruby:
Battle::PokeBallEffects::ModifyCatchRate.add(:MINUSBALL, proc { |ball, catchRate, battle, battler|
catchRate *= [(5 - $bag.quantity(:MINUSBALL)),0].min
next catchRate
})
Code:
#-------------------------------
[MINUSBALL]
Name = Minus Ball
NamePlural = Minus Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A mathematical Poké Ball that works better the fewer copies a trainer has.
Ruby:
Battle::PokeBallEffects::OnFailCatch.add(:DIVIDEBALL, proc { |ball, battle, battler|
battler.pbReduceHP((battler.hp / 2.0).round, false)
battle.pbDisplay(_INTL("{1}'s health was divided in half!", battler.pbThis))
})
Code:
#-------------------------------
[DIVIDEBALL]
Name = Divide Ball
NamePlural = Divide Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A mathematical Poké Ball that divides a Pokémon's health in half if it fails to capture it.
Ruby:
Battle::PokeBallEffects::OnFailCatch.add(:EQUALBALL, proc { |ball, battle, battler|
battler.pbRecoverHP(battler.totalhp)
battler.moves.length.times do |i|
pbBattleRestorePP(battler.pokemon, battler, i, battler.pokemon.moves[i].total_pp)
end
battle.pbDisplay(_INTL("{1}'s HP and PP were restored!", battler.pbThis))
})
Code:
#-------------------------------
[EQUALBALL]
Name = Equal Ball
NamePlural = Equal Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A mathematical Poké Ball that resets a Pokémon's HP and PP if it fails to capture it.
Ruby:
Battle::PokeBallEffects::OnFailCatch.add(:TAUNTBALL, proc { |ball, battle, battler|
unless battler.effects[PBEffects::Taunt] > 0
battler.effects[PBEffects::Taunt] = 4
battle.pbDisplay(_INTL("{1} fell for the taunt!", battler.pbThis))
target.pbItemStatusCureCheck
end
})
Code:
#-------------------------------
[TAUNTBALL]
Name = Taunt Ball
NamePlural = Taunt Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A tactical Poké Ball that enrages any Pokémon it fails to catch, preventing them from using status moves.
Ruby:
Battle::PokeBallEffects::OnFailCatch.add(:PENALTYBALL, proc { |ball, battle, battler|
unless battler.effects[PBEffects::Disable] > 0 || !battler.lastRegularMoveUsed
battler.effects[PBEffects::Disable] = 5
battler.effects[PBEffects::DisableMove] = battler.lastRegularMoveUsed
battle.pbDisplay(_INTL("{1}'s {2} was disabled!", battler.pbThis,
GameData::Move.get(battler.lastRegularMoveUsed).name))
battler.pbItemStatusCureCheck
end
})
Code:
#-------------------------------
[PENALTYBALL]
Name = Penalty Ball
NamePlural = Penalty Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A tactical Poké Ball. If it fails to catch a Pokémon, it will disable their last-used move.
Ruby:
Battle::PokeBallEffects::OnFailCatch.add(:CONCUSSBALL, proc { |ball, battle, battler|
battler.pbFlinch
})
Code:
#-------------------------------
[CONCUSSBALL]
Name = Concuss Ball
NamePlural = Concuss Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A tactical Poké Ball. When thrown, it strikes hard enough to cause flinching.
Ruby:
Battle::PokeBallEffects::OnFailCatch.add(:DOWSEBALL, proc { |ball, battle, battler|
unless battler.effects[PBEffects::Foresight]
battler.effects[PBEffects::Foresight] = true
battle.pbDisplay(_INTL("{1} was identified!", battler.pbThis))
end
})
Code:
#-------------------------------
[DOWSEBALL]
Name = Dowse Ball
NamePlural = Dowse Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A tactical Poké Ball that identifies any Pokémon it fails to catch.
Ruby:
Battle::PokeBallEffects::OnFailCatch.add(:CHOICEBALL, proc { |ball, battle, battler|
moveBlacklist = [
"DisableTargetUsingDifferentMove", # Encore
# Struggle
"Struggle", # Struggle
# Moves that affect the moveset
"ReplaceMoveThisBattleWithTargetLastMoveUsed", # Mimic
"ReplaceMoveWithTargetLastMoveUsed", # Sketch
"TransformUserIntoTarget", # Transform
# Moves that call other moves (see also below)
"UseLastMoveUsedByTarget" # Mirror Move
]
if Settings::MECHANICS_GENERATION >= 7
moveBlacklist += [
# Moves that call other moves
# "UseLastMoveUsedByTarget", # Mirror Move # See above
"UseLastMoveUsed", # Copycat
"UseMoveTargetIsAboutToUse", # Me First
"UseMoveDependingOnEnvironment", # Nature Power
"UseRandomUserMoveIfAsleep", # Sleep Talk
"UseRandomMoveFromUserParty", # Assist
"UseRandomMove" # Metronome
]
end
unless battler.effects[PBEffects::Encore] > 0 || !battler.lastRegularMoveUsed ||
moveBlacklist.include?(GameData::Move.get(battler.lastRegularMoveUsed).function_code)
battler.effects[PBEffects::Encore] = 4
battler.effects[PBEffects::EncoreMove] = battler.lastRegularMoveUsed
battle.pbDisplay(_INTL("{1} received an encore!", battler.pbThis))
battler.pbItemStatusCureCheck
end
})
Code:
#-------------------------------
[CHOICEBALL]
Name = Choice Ball
NamePlural = Choice Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A tactical Poké Ball. If it fails to catch a Pokémon, they will receive an encore for their last-used move.
Ruby:
Battle::PokeBallEffects::OnFailCatch.add(:BERRYBALL, proc { |ball, battle, battler|
if battler.canHeal?
battler.pbRecoverHP(20)
itemName = GameData::Item.get(:BERRYBALL).name
battle.pbDisplay(_INTL("{1} ate the {2} and recovered HP!", battler.pbThis, itemName))
end
})
Code:
#-------------------------------
[BERRYBALL]
Name = Berry Ball
NamePlural = Berry Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = An all-natural Poké Ball that heals any Pokémon it fails to catch.
Ruby:
Battle::PokeBallEffects::OnFailCatch.add(:LOCKBALL, proc { |ball, battle, battler|
unless battler.effects[PBEffects::Substitute] > 0 || battler.effects[PBEffects::MeanLook] >= 0 || (Settings::MORE_TYPE_EFFECTS && battler.pbHasType?(:GHOST))
battler.effects[PBEffects::MeanLook] = 999
battle.pbDisplay(_INTL("{1} can no longer escape!", battler.pbThis))
end
})
Code:
#-------------------------------
[LOCKBALL]
Name = Lock Ball
NamePlural = Lock Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = An air-tight Poké Ball that prevents a Pokémon from fleeing, even it fails to catch it.
- Light Screen
- Reflect
- Aurora Veil
- Substitute
- Safeguard
- Mist
- Lucky Chant
- Tailwind
- Rainbow created by Water Pledge and Fire Pledge
Ruby:
Battle::PokeBallEffects::OnFailCatch.add(:VACUUMBALL, proc { |ball, battle, battler|
if battler.pbOwnSide.effects[PBEffects::LightScreen] > 0
battler.pbOwnSide.effects[PBEffects::LightScreen] = 0
battle.pbDisplay(_INTL("{1}'s Light Screen wore off!", battler.pbTeam))
end
if battler.pbOwnSide.effects[PBEffects::Reflect] > 0
battler.pbOwnSide.effects[PBEffects::Reflect] = 0
battle.pbDisplay(_INTL("{1}'s Reflect wore off!", battler.pbTeam))
end
if battler.pbOwnSide.effects[PBEffects::AuroraVeil] > 0
battler.pbOwnSide.effects[PBEffects::AuroraVeil] = 0
battle.pbDisplay(_INTL("{1}'s Aurora Veil wore off!", battler.pbTeam))
end
if battler.effects[PBEffects::Substitute] > 0
battler.effects[PBEffects::Substitute] = 0
battle.pbDisplay(_INTL("{1}'s substitute faded!", battler.pbThis))
end
if battler.pbOwnSide.effects[PBEffects::Safeguard] > 0
battler.pbOwnSide.effects[PBEffects::Safeguard] = 0
battle.pbDisplay(_INTL("{1}'s is no longer protected by Safeguard!", battler.pbTeam))
end
if battler.pbOwnSide.effects[PBEffects::Mist] > 0
battler.pbOwnSide.effects[PBEffects::Mist] = 0
battle.pbDisplay(_INTL("{1}'s is no longer protected by mist!", battler.pbTeam))
end
if battler.pbOwnSide.effects[PBEffects::LuckyChant] > 0
battler.pbOwnSide.effects[PBEffects::LuckyChant] = 0
battle.pbDisplay(_INTL("{1}'s Lucky Chant wore off!", battler.pbTeam))
end
if battler.pbOwnSide.effects[PBEffects::Tailwind] > 0
battler.pbOwnSide.effects[PBEffects::Tailwind] = 0
battle.pbDisplay(_INTL("{1}'s Tailwind petered out!", battler.pbTeam))
end
if battler.pbOwnSide.effects[PBEffects::Rainbow] > 0
battler.pbOwnSide.effects[PBEffects::Rainbow] = 0
battle.pbDisplay(_INTL("The rainbow on {1}'s side disappeared!", battler.pbTeam))
end
})
Code:
#-------------------------------
[VACUUMBALL]
Name = Vacuum Ball
NamePlural = Vacuum Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A tactical Poké Ball. If it fails, it will clear the area of any barrier the wild Pokémon set up.
Ruby:
Battle::PokeBallEffects::OnFailCatch.add(:RUSBALL, proc { |ball, battle, battler|
battler.pokemon.givePokerus if rand(65_536) < (Settings::POKERUS_CHANCE / 2)
})
Battle::PokeBallEffects::OnCatch.add(:RUSBALL, proc { |ball, battle, pkmn|
pkmn.givePokerus if rand(65_536) < (Settings::POKERUS_CHANCE / 2)
})
Code:
#-------------------------------
[RUSBALL]
Name = Rus Ball
NamePlural = Rus Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A grimy Poké Ball that seems likely to pass disease onto any Pokémon it touches.
Ruby:
Battle::PokeBallEffects::ModifyCatchRate.add(:CLEARBALL, proc { |ball, catchRate, battle, battler|
catchRate *= 3 if battler.pbHasType?(:NORMAL) || [:PROTEAN,:COLORCHANGE,:MULTITYPE,:RKSSYSTEM,:LIBERO,:MIMICRY].include?(battler.pokemon.ability)
next catchRate
})
Code:
#-------------------------------
[CLEARBALL]
Name = Clear Ball
NamePlural = Clear Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A somewhat different Poké Ball that works especially well on Normal-type or type-changing Pokémon.
Ruby:
Battle::PokeBallEffects::ModifyCatchRate.add(:KNUCKLEBALL, proc { |ball, catchRate, battle, battler|
catchRate *= 3 if battler.pbHasType?(:FIGHTING) || battler.pbHasType?(:DARK)
next catchRate
})
Code:
#-------------------------------
[KNUCKLEBALL]
Name = Knuckle Ball
NamePlural = Knuckle Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A somewhat different Poké Ball that works especially well on Fighting- and Dark-type Pokémon.
Ruby:
Battle::PokeBallEffects::ModifyCatchRate.add(:FLOATBALL, proc { |ball, catchRate, battle, battler|
catchRate *= 3 if battler.pbHasType?(:FLYING) || battler.pokemon.hasAbility?(:LEVITATE)
next catchRate
})
Code:
#-------------------------------
[FLOATBALL]
Name = Float Ball
NamePlural = Float Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A somewhat different Poké Ball that works especially well on Flying-type or levitating Pokémon.
A.I.R made a bag sprite for this!
Ruby:
Battle::PokeBallEffects::ModifyCatchRate.add(:YULEBALL, proc { |ball, catchRate, battle, battler|
catchRate *= 3 if battler.pbHasType?(:FAIRY) || battler.pbHasType?(:GRASS) || battler.pbHasType?(:ICE)
next catchRate
})
Code:
#-------------------------------
[YULEBALL]
Name = Yule Ball
NamePlural = Yule Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A somewhat different Poké Ball that works especially well on Fairy-, Grass-, and Ice-type Pokémon.
Ruby:
Battle::PokeBallEffects::ModifyCatchRate.add(:MAGMABALL, proc { |ball, catchRate, battle, battler|
catchRate *= 3 if battler.pbHasType?(:FIRE) || battler.pbHasType?(:GROUND) || battler.pbHasType?(:ROCK)
next catchRate
})
Code:
#-------------------------------
[MAGMABALL]
Name = Magma Ball
NamePlural = Magma Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A somewhat different Poké Ball that works especially well on Fire-, Rock-, and Ground-type Pokémon.
Ruby:
Battle::PokeBallEffects::ModifyCatchRate.add(:SPIRITBALL, proc { |ball, catchRate, battle, battler|
catchRate *= 3 if battler.pbHasType?(:GHOST) || battler.pbHasType?(:PSYCHIC)
next catchRate
})
Code:
#-------------------------------
[SPIRITBALL]
Name = Spirit Ball
NamePlural = Spirit Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A somewhat different Poké Ball that works especially well on Psychic- and Ghost-type Pokémon.
Ruby:
Battle::PokeBallEffects::ModifyCatchRate.add(:JUNKBALL, proc { |ball, catchRate, battle, battler|
catchRate *= 3 if battler.pbHasType?(:STEEL) || battler.pokemon.species_data.has_flag?("Inorganic")
next catchRate
})
Code:
#-------------------------------
[JUNKBALL]
Name = Junk Ball
NamePlural = Junk Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A somewhat different Poké Ball that works especially well on Steel-type or inorganic Pokémon.
Ruby:
Battle::PokeBallEffects::ModifyCatchRate.add(:MEADOWBALL, proc { |ball, catchRate, battle, battler|
catchRate *= 3 if battle.field.terrain == :Grassy
next catchRate
})
Code:
#-------------------------------
[MEADOWBALL]
Name = Meadow Ball
NamePlural = Meadow Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A somewhat different Poké Ball that works especially well when used on Grassy Terrain.
Ruby:
Battle::PokeBallEffects::ModifyCatchRate.add(:MISTBALL, proc { |ball, catchRate, battle, battler|
catchRate *= 3 if battle.field.terrain == :Misty
next catchRate
})
Code:
#-------------------------------
[MISTBALL]
Name = Mist Ball
NamePlural = Mist Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A somewhat different Poké Ball that works especially well when used on Misty Terrain.
Ruby:
Battle::PokeBallEffects::ModifyCatchRate.add(:STORMBALL, proc { |ball, catchRate, battle, battler|
catchRate *= 3 if battle.field.terrain == :Electric
next catchRate
})
Code:
#-------------------------------
[STORMBALL]
Name = Storm Ball
NamePlural = Storm Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A somewhat different Poké Ball that works especially well when used on Electric Terrain.
Ruby:
Battle::PokeBallEffects::ModifyCatchRate.add(:WARPBALL, proc { |ball, catchRate, battle, battler|
catchRate *= 3 if battle.field.terrain == :Psychic || battle.field.effects[PBEffects::TrickRoom] > 0 || battle.field.effects[PBEffects::WonderRoom] > 0 || battle.field.effects[PBEffects::MagicRoom] > 0
next catchRate
})
Code:
#-------------------------------
[WARPBALL]
Name = Warp Ball
NamePlural = Warp Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A somewhat different Poké Ball that works especially well when used on Psychic Terrain or inside strange rooms.
Ruby:
Battle::PokeBallEffects::ModifyCatchRate.add(:SANDBALL, proc { |ball, catchRate, battle, battler|
catchRate *= 3 if [:Sandstorm].include?(battler.effectiveWeather)
next catchRate
})
Code:
#-------------------------------
[SANDBALL]
Name = Sand Ball
NamePlural = Sand Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A somewhat different Poké Ball that works especially well when used in a sandstorm.
Ruby:
Battle::PokeBallEffects::ModifyCatchRate.add(:DRIZZLEBALL, proc { |ball, catchRate, battle, battler|
catchRate *= 3 if [:Rain, :HeavyRain].include?(battler.effectiveWeather)
next catchRate
})
Code:
#-------------------------------
[DRIZZLEBALL]
Name = Drizzle Ball
NamePlural = Drizzle Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A somewhat different Poké Ball that works especially well when used in rain.
Ruby:
Battle::PokeBallEffects::ModifyCatchRate.add(:HAILBALL, proc { |ball, catchRate, battle, battler|
catchRate *= 3 if [:Hail, :Snow].include?(battler.effectiveWeather)
next catchRate
})
Code:
#-------------------------------
[HAILBALL]
Name = Hail Ball
NamePlural = Hail Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A somewhat different Poké Ball that works especially well when used in cold weather.
Ruby:
Battle::PokeBallEffects::ModifyCatchRate.add(:DROUGHTBALL, proc { |ball, catchRate, battle, battler|
catchRate *= 3 if [:Sun, :HarshSun].include?(battler.effectiveWeather)
next catchRate
})
Code:
#-------------------------------
[DROUGHTBALL]
Name = Drought Ball
NamePlural = Drought Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A somewhat different Poké Ball that works especially well when used in harsh sunlight.
Ruby:
Battle::PokeBallEffects::ModifyCatchRate.add(:KINBALL, proc { |ball, catchRate, battle, battler|
catchRate *= 3 if battler.pokemon.species_data.egg_groups.include?(:Humanlike) || battler.pokemon.species_data.egg_groups.include?(:Fairy)
next catchRate
})
Code:
#-------------------------------
[KINBALL]
Name = Kin Ball
NamePlural = Kin Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A somewhat different Poké Ball that works especially well on Pokémon from the Humanlike or Fairy Egg Groups.
Ruby:
Battle::PokeBallEffects::ModifyCatchRate.add(:FIELDBALL, proc { |ball, catchRate, battle, battler|
catchRate *= 3 if battler.pokemon.species_data.egg_groups.include?(:Field)
next catchRate
})
Code:
#-------------------------------
[FIELDBALL]
Name = Field Ball
NamePlural = Field Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A somewhat different Poké Ball that works especially well on Pokémon from the Field Egg Group.
Ruby:
Battle::PokeBallEffects::ModifyCatchRate.add(:MORPHBALL, proc { |ball, catchRate, battle, battler|
catchRate *= 3 if battler.pokemon.species_data.egg_groups.include?(:Amorphous)
next catchRate
})
Code:
#-------------------------------
[MORPHBALL]
Name = Morph Ball
NamePlural = Morph Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A somewhat different Poké Ball that works especially well on Pokémon from the Amorphous Egg Group.
Ruby:
Battle::PokeBallEffects::ModifyCatchRate.add(:NATUREBALL, proc { |ball, catchRate, battle, battler|
catchRate *= 3 if battler.pokemon.species_data.egg_groups.include?(:Bug) || battler.pokemon.species_data.egg_groups.include?(:Grass)
next catchRate
})
Code:
#-------------------------------
[NATUREBALL]
Name = Nature Ball
NamePlural = Nature Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A somewhat different Poké Ball that works especially well on Pokémon from the Grass or Bug Egg Groups.
Ruby:
Battle::PokeBallEffects::ModifyCatchRate.add(:OREBALL, proc { |ball, catchRate, battle, battler|
catchRate *= 3 if battler.pokemon.species_data.egg_groups.include?(:Mineral)
next catchRate
})
Code:
#-------------------------------
[OREBALL]
Name = Ore Ball
NamePlural = Ore Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A somewhat different Poké Ball that works especially well on Pokémon from the Mineral Egg Group.
Ruby:
Battle::PokeBallEffects::ModifyCatchRate.add(:MONSTERBALL, proc { |ball, catchRate, battle, battler|
catchRate *= 3 if battler.pokemon.species_data.egg_groups.include?(:Monster)
next catchRate
})
Code:
#-------------------------------
[MONSTERBALL]
Name = Monster Ball
NamePlural = Monster Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A somewhat different Poké Ball that works especially well on Pokémon from the Monster Egg Group.
A.I.R made a bag sprite for this!
Ruby:
Battle::PokeBallEffects::ModifyCatchRate.add(:ELDERBALL, proc { |ball, catchRate, battle, battler|
catchRate *= 3 if battler.pokemon.species_data.egg_groups.include?(:Dragon)
next catchRate
})
Code:
#-------------------------------
[ELDERBALL]
Name = Elder Ball
NamePlural = Elder Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A somewhat different Poké Ball that works especially well on Pokémon from the Dragon Egg Group.
Ruby:
Battle::PokeBallEffects::ModifyCatchRate.add(:UNOWNBALL, proc { |ball, catchRate, battle, battler|
catchRate *= 3 if battler.isSpecies?(:UNOWN)
next catchRate
})
Code:
#-------------------------------
[UNOWNBALL]
Name = Unown Ball
NamePlural = Unown Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A bizarre Poké Ball that excels at catching Unown.
Ruby:
Battle::PokeBallEffects::ModifyCatchRate.add(:MYTHICBALL, proc { |ball, catchRate, battle, battler|
catchRate *= 3 if battler.pokemon.species_data.has_flag?("Mythic") || battler.pokemon.species_data.has_flag?("Legendary")
next catchRate
})
Code:
#-------------------------------
[MYTHICBALL]
Name = Mythic Ball
NamePlural = Mythic Balls
Pocket = 3
Price = 1000
BattleUse = OnFoe
Flags = PokeBall
Description = A grand, storied Poké Ball that works especially well on Legendary and Mythical Pokémon.
Substitube gave quick ideas for balls that depended on the dex color or body shape, but didn't give any names or designs, so I'm going to give examples of how these handlers would work, but not make a full set.
Here's an example of a handler that checks the dex color of a Pokémon:
Ruby:
Battle::PokeBallEffects::ModifyCatchRate.add(:BLUEBALL, proc { |ball, catchRate, battle, battler|
catchRate *= 3 if battler.pokemon.species_data.color == :Blue
next catchRate
})
Ruby:
Battle::PokeBallEffects::ModifyCatchRate.add(:SNAKEBALL, proc { |ball, catchRate, battle, battler|
catchRate *= 3 if battler.pokemon.species_data.shape == :Serpentine
next catchRate
})
No graphics for most of these yet, but A.I.R made a bag sprite for the Elder Ball, Yule Ball, and Dawn Ball!
See also:
- Credits
- Substitube
TechSkylander1518
A.I.R for the Elder Ball, Yule Ball, and Dawn Ball bag sprite