• Hi, Guest!
    Some images might be missing as we move away from using embedded images, sorry for the mess!
    From now on, you'll be required to use a third party to host images. You can learn how to add images here, and if your thread is missing images you can request them here.
    Do not use Discord to host any images you post, these links expire quickly!
Substitube's Poké Balls

v20.1 Substitube's Poké Balls 2023-05-19

This resource pertains to version 20.1 of Pokémon Essentials.
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)
You are, of course, welcome to tweak these however you see fit.

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:
Ruby:
    if $game_map.metadata&.battle_environment == :Cave
      battle.time = 2   # This makes Dusk Balls work properly in caves
Below them, add these:
Ruby:
    elsif $game_map.metadata&.battle_environment == :None
      battle.time = 0   # This makes Dawn Balls work properly indoors
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:
Ruby:
    if battler.semiInvulnerable?
And change it to:
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, and Legendary for any Legendary.

Dex Ball - Registers the Pokémon in the dex as caught, even if it fails to catch.
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.
Cycle Ball - Returns to the player after a Pokémon breaks out, provided the Pokémon was asleep, frozen, or paralyzed.
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.
Dawn Ball - Counterpart to the Dusk Ball, works better in the daytime or inside buildings.

A.I.R made a bag sprite for this!
18141

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.
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
Below them, add these:
Ruby:
    elsif $game_map.metadata&.battle_environment == :None
      battle.time = 0   # This makes Dawn Balls work properly indoors
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.
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.
Stat Ball - Increased catch rate if target's stats have been lowered.
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.
Evo Ball - Works better on evolved Pokémon.
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.
Seeker Ball - Can catch Pokémon in semi-invulnerable states. (Fly, Dig, Surf, etc.)
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.
In the script section Item_BattleEffects, find this line:
Ruby:
    if battler.semiInvulnerable?
And change it to:
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)
Shiny Ball - Works better on shiny Pokémon.
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.
Value Ball - Sets three random IVs to max.
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.
Shrink Ball - Counterpart to the Heavy Ball that works better on lighter Pokémon. Extra bonus for minimized 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.
Trap Ball - Works better on Pokémon trapped by moves like Bind, Fire Spin, etc.
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.
Rage Ball - Works better if your Pokémon fainted on the previous turn.
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.
Executive Ball - Snag Ball with increased catch rate when used in trainer battles.
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.
Para Ball - Increased rate on paralyzed or Electric-type Pokémon.
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.
Burn Ball - Increased rate on burned or Fire-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.
Poison Ball - Increased rate on poisoned or Poison-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.
Freeze Ball - Increased rate on frozen or Ice-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.
Dizzy Ball - Increased rate on confused or Psychic-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.
Minus Battle - Catch rate is multiplied by 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.
Divide Ball - If it fails to catch a Pokémon, divides its current HP in half.
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.
Equal Ball - Restores Pokémon's HP and PP if it fails to catch a Pokémon. (Does not cure status effects)
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.
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.)
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.
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.)
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.
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.)
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.
Dowse Ball - Applies the effects of Foresight if it fails to catch a Pokémon.
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.
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.
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.
Berry Ball - Heals by 20HP if it fails, unless the Pokémon is under the effect of Heal Block.
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.
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.
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.
Vacuum Ball - If it fails, clears the following effects from the Pokémon's side:
  • 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.
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!)
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.
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.
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.
Knuckle Ball - Increased rate on Fighting- and Dark-types.
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.
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)
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.
Yule Ball - Increased rate on Fairy-, Grass- and Ice-types.

A.I.R made a bag sprite for this!
18140

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.
Magma Ball - Increased rate on Fire-, Rock-, and Ground-types.
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.
Spirit Ball - Increased rate on Psychic- and Ghost-types.
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.
Junk Ball - Increased rate on Steel-types and Pokémon formed from inorganic objects.
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
})
For any non-Steel-type you want this ball to affect, you need to add the species flag Inorganic in pokemon.txt.
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.
Meadow Ball - Increased rate when used on Grassy Terrain.
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.
Mist Ball - Increased rate when used on Misty 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.
Storm Ball - Increased rate when used on Electric 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.
Warp Ball - Increased rate when used on Psychic Terrain or in psychic rooms. (Trick Room, Wonder Room, etc.)
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.
Sand Ball - Increased rate in Sandstorm.
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.
Drizzle Ball - Increased rate in rain. (regular or primal)
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.
Hail Ball - Increased rate in hail or snow.
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.
Drought Ball - Increased rate in harsh sunlight. (regular or primal)
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.
Kin Ball - Increased rate on Pokémon from the Humanlike and Fairy Egg Groups.
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.
Field Ball - Increased rate on Pokémon from the Field Egg Group.
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.
Morph Ball - Increased rate on Pokémon from the Amorphous 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.
Nature Ball - Increased rate on Pokémon from the Grass and Bug Egg Groups.
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.
Ore Ball - Increased rate on Pokémon from the Mineral Egg Group.
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.
Monster Ball - Increased rate on Pokémon from the Monster 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.
Elder Ball - Increased rate on Pokémon from the Dragon Egg Group.

A.I.R made a bag sprite for this!
18139

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.
Unown Ball - Increased catch rate on Unown.
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.
Mythic Ball - Increased rate on Mythical and Legendary Pokémon.
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
})
Add the Mythic or Legendary flag for all relevant species in pokemon.txt.
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
})
Here's an example of a handler that checks the body shape of a Pokémon:
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!
18139
18140
18141


See also:
Credits
Substitube
TechSkylander1518
A.I.R for the Elder Ball, Yule Ball, and Dawn Ball bag sprite
Author
TechSkylander1518
Views
3,625
First release
Last update
Rating
5.00 star(s) 1 ratings

More resources from TechSkylander1518

Back
Top