• 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!
Tech's Oddities

v20.1 Tech's Oddities 2023-05-17

This resource pertains to version 20.1 of Pokémon Essentials.
Pokémon Essentials Version
v20.1 ➖
I've had a few ideas for various new mechanics kicking around and figured I might as well share them! There's no graphics anywhere here - I'm no spriter, as you can probably tell from the icon lol. If you do end up creating your own graphics for something here, I'd really appreciate if you'd let it be included as part of the resource!

There's no PBS for items - I haven't decided on cost or description for them just yet, and I don't want to make PBS entries with just name and pocket. I might get around to adding some later, this is an ongoing project!

Evolution Methods​


LevelShiny - Pokémon evolves at or above the given level if it's shiny. Make sure to put this first in the list of evos, so the others don't override it. And make sure to consider the lore for this evolved form - if it only evolves when it's shiny, the player should only ever see it shiny, even if they encounter it in the wild or when used by another trainer. (But you don't have to use this as the only way to get a species - you could use it to let shiny mons evolve earlier!)
Ruby:
GameData::Evolution.register({
  :id            => :LevelShiny,
  :parameter     => Integer,
  :level_up_proc => proc { |pkmn, parameter|
    next pkmn.level >= parameter && pkmn.shiny?
  }
})
LevelQuiet and LevelLoud - Evolves at or above the given level if BGM and SE in settings are less than 50 (LevelQuiet) or above 50 (LevelLoud). They don't have to be the same number, but they have to both be in the quiet/loud range - SE at 50 and BGM at 60 wouldn't work for loud, for example.
Ruby:
GameData::Evolution.register({
  :id            => :LevelQuiet,
  :parameter     => Integer,
  :level_up_proc => proc { |pkmn, parameter|
    next pkmn.level >= parameter && $PokemonSystem.bgmvolume <50 && $PokemonSystem.sevolume <50
  }
})

GameData::Evolution.register({
  :id            => :LevelLoud,
  :parameter     => Integer,
  :level_up_proc => proc { |pkmn, parameter|
    next pkmn.level >= parameter && $PokemonSystem.bgmvolume>50 && $PokemonSystem.sevolume>50
  }
})
LevelNickname - Evolves at or above the given level if given a nickname.
Ruby:
GameData::Evolution.register({
  :id            => :LevelNickname,
  :parameter     => Integer,
  :level_up_proc => proc { |pkmn, parameter|
    next pkmn.level >= parameter && pkmn.name != pkmn.speciesName
  }
})
LevelStatus - Level up with a given non-volatile status effect. (Burn, Sleep, Poison, etc.) The argument is the status effect rather than the level - for example, TOXEON,LevelStatus,Poison. This does mean that any level-up would meet the evolution requirement - if you want a specific level and a specific status effect, you could hard-code the level requirement, or you could hardcode the status and have multiple evolution methods for each status. (Vendily and Adrichuwu put one together here)
Ruby:
GameData::Evolution.register({
  :id            => :LevelStatus,
  :parameter     => :Status,
  :level_up_proc => proc { |pkmn, parameter|
    next pkmn.status == parameter
  }
})
LevelCharge and LevelDischarge - Evolves at or above the given level if the system is charging or using its battery. Note that desktop computers are considered to always be charging, so you'll want to provide some alternative methods here. (I'm not even sure how power states are read with JoiPlay users)
Ruby:
GameData::Evolution.register({
  :id            => :LevelCharge,
  :parameter     => Integer,
  :level_up_proc => proc { |pkmn, parameter|
    pstate = System.power_state
    next pkmn.level >= parameter && !pstate[:discharging]
  }
})

GameData::Evolution.register({
  :id            => :LevelDischarge,
  :parameter     => Integer,
  :level_up_proc => proc { |pkmn, parameter|
    pstate = System.power_state
    next pkmn.level >= parameter && pstate[:discharging]
  }
})
LevelRand - 50% chance of evolving at or above the given level, rather than being guaranteed. (The chance is generated on level-up, so a player could still soft-reset)
Ruby:
GameData::Evolution.register({
  :id            => :LevelRand,
  :parameter     => Integer,
  :level_up_proc => proc { |pkmn, parameter|
    next pkmn.level >= parameter && rand(2) == 0
  }
})

Items​

Charms​

Berry Charm - Doubles the yield of all Berry Plants.
Sprite generously made by wrigty12!
17980

In Overworld_BerryPlants, under the line
Ruby:
def pbPickBerry(berry, qty = 1)
add
Ruby:
  qty *= 2 if $bag.has?(:BERRYCHARM)
Slot Charm - Slot Machines will never slip when stopped, and move at 75% speed.
Sprite generously made by wrigty12!
17979

In Minigame_SlotMachine, change line
Ruby:
    @slipping = 0 if noslipping
to
Ruby:
    @slipping = 0 if noslipping || $bag.has?(:SPINNINGCHARM)
and change line
Ruby:
 @toppos += SCROLLSPEED
to
Ruby:
      speed = SCROLLSPEED
      speed *= 3/4 if $bag.has?(:SPINNINGCHARM)
      @toppos += speed

Held Items​

Ancient Crystal - Held item for Regis that boosts Special Defense by 30%. Based on the Ancient Crystal from the TCG.
Ruby:
Battle::ItemEffects::DamageCalcFromTarget.add(:ANCIENTCRYSTAL,
  proc { |item, user, target, move, mults, baseDmg, type|
    next if !target.pokemon.species_data.has_flag?("Regi")
    if move.specialMove?
      mults[:defense_multiplier] *= 1.3
    end
  }
)
The TCG doesn’t have a physical/special split, I just went for Special Defense since that’s what the Soul Dew boosts. If you want to make it Defense, switch specialMove? to physicalMove?.

You will need to add the flag Regi to all Regis in your game, similar to the UltraBeast flag.
Beastite - Held item for Ultra Beasts that increases the damage of all attacks by 20%. Based on Beastite from the TCG.
Ruby:
Battle::ItemEffects::DamageCalcFromUser.add(:BEASTITE,
  proc { |item, user, target, move, mults, baseDmg, type|
    mults[:base_damage_multiplier] *= 1.2 if user.pokemon.species_data.has_flag?("UltraBeast")
  }
)
Burning Scarf - Held item equivalent to Flame Body. Based on the Burning Scarf from the TCG.
Ruby:
Battle::ItemEffects::OnBeingHit.add(:BURNINGSCARF,
  proc { |item, user, target, move, battle|
    next if battle.pbRandom(100) >= 30
    next if !move.pbContactMove?(user) || !user.affectedByContactEffect? || user.burned?
    if user.pbCanBurn?(target, Battle::Scene::USE_ABILITY_SPLASH)
      msg = _INTL("{1}'s {2} burned {3}!", target.pbThis, target.itemName, user.pbThis(true))
      user.pbBurn(target, msg)
    end
  }
)

In the TCG, it has a 100% chance (and regardless of contact, because the TCG doesn’t have contact mechanics), but to keep it from outclassing Flame Body, I gave it the same 30% chance.
Curse Powder - Held item equivalent to Aftermath. Unlike Aftermath, however, it’s not affected by Damp. Contact is still required. Based on Curse Powder from the TCG.
Ruby:
Battle::ItemEffects::OnBeingHit.add(:CURSEPOWDER,
  proc { |item, user, target, move, battle|
    next if !target.fainted?
    next if !move.pbContactMove?(user)
    battle.pbShowAbilitySplash(target)
    if user.takesIndirectDamage?(Battle::Scene::USE_ABILITY_SPLASH) &&
       user.affectedByContactEffect?(Battle::Scene::USE_ABILITY_SPLASH)
      battle.scene.pbDamageAnimation(user)
      user.pbReduceHP(user.totalhp / 4, false)
      battle.pbDisplay(_INTL("{1} was hurt by {2}'s {3}!", user.pbThis,target.pbThis, target.itemName))
    end
  }
)
Dragon Talon - Rocky Helmet, but, similar to the Black Sludge, damages the holder by ⅛ max HP at the end of each turn if they’re not Dragon-type. Based on the Dragon Talon from the TCG.
Ruby:
Battle::ItemEffects::OnBeingHit.add(:DRAGONTALON,
  proc { |item, user, target, move, battle|
    next if !move.pbContactMove?(user) || !user.affectedByContactEffect?
    next if !user.takesIndirectDamage?
    battle.scene.pbDamageAnimation(user)
    user.pbReduceHP(user.totalhp / 6, false)
    battle.pbDisplay(_INTL("{1} was hurt by the {2}!", user.pbThis, target.itemName))
  }
)
Battle::ItemEffects::EndOfRoundHealing.add(:DRAGONTALON,
  proc { |item, battler, battle|
    if !battler.pbHasType?(:DRAGON) && battler.takesIndirectDamage?
      battle.pbCommonAnimation("UseItem", battler)
      battler.pbTakeEffectDamage(battler.totalhp / 8) { |hp_lost|
        battle.pbDisplay(_INTL("{1} is hurt by its {2}!", battler.pbThis, battler.itemName))
      }
    end
  }
)
Hard Charm - Boosts Defense by 10%, basically a Defense counterpart to the Muscle Band/Wise Glasses. Based on the Hard Charm from the TCG.
Ruby:
Battle::ItemEffects::DamageCalcFromTarget.add(:HARDCHARM,
  proc { |item, user, target, move, mults, baseDmg, type|
    mults[:defense_multiplier] *= 1.1 if move.physicalMove?
  }
)
Hustle Belt - Increases power of moves by 30% when holder is at 30% or less of total HP. (The same “in a pinch” as in Blaze/Torrent/Overgrow/Swarm) Based on the Hustle Belt from the TCG.
Ruby:
Battle::ItemEffects::DamageCalcFromUser.add(:HUSTLEBELT,
  proc { |item, user, target, move, mults, baseDmg, type|
    if user.hp <= user.totalhp / 3
      mults[:attack_multiplier] *= 1.3
    end
  }
)
Gloves - Held items that increase damage by 10% if the target is a certain type. Based on these items from the TCG:
Ruby:
Battle::ItemEffects::DamageCalcFromUser.add(:CRUSHINGGLOVES,
  proc { |item, user, target, move, mults, baseDmg, type|
    mults[:base_damage_multiplier] *= 1.1 if target.pbHasType?(:STEEL)
  }
)

Battle::ItemEffects::DamageCalcFromUser.add(:CLEANSINGGLOVES,
  proc { |item, user, target, move, mults, baseDmg, type|
    mults[:base_damage_multiplier] *= 1.1 if target.pbHasType?(:GHOST)
  }
)

Battle::ItemEffects::DamageCalcFromUser.add(:DIGGINGGLOVES,
  proc { |item, user, target, move, mults, baseDmg, type|
    mults[:base_damage_multiplier] *= 1.1 if target.pbHasType?(:GROUND)
  }
)

Battle::ItemEffects::DamageCalcFromUser.add(:FIRERESISTANTGLOVES,
  proc { |item, user, target, move, mults, baseDmg, type|
    mults[:base_damage_multiplier] *= 1.1 if target.pbHasType?(:FIRE)
  }
)

Battle::ItemEffects::DamageCalcFromUser.add(:HUNTINGGLOVES,
  proc { |item, user, target, move, mults, baseDmg, type|
    mults[:base_damage_multiplier] *= 1.1 if target.pbHasType?(:DRAGON)
  }
)

Battle::ItemEffects::DamageCalcFromUser.add(:JUSTIFIEDGLOVES,
  proc { |item, user, target, move, mults, baseDmg, type|
    mults[:base_damage_multiplier] *= 1.1 if target.pbHasType?(:DARK)
  }
)

Battle::ItemEffects::DamageCalcFromUser.add(:RUBBERGLOVES,
  proc { |item, user, target, move, mults, baseDmg, type|
    mults[:base_damage_multiplier] *= 1.1 if target.pbHasType?(:ELECTRIC)
  }
)

Battle::ItemEffects::DamageCalcFromUser.add(:SPONGYGLOVES,
  proc { |item, user, target, move, mults, baseDmg, type|
    mults[:base_damage_multiplier] *= 1.1 if target.pbHasType?(:WATER)
  }
)

Battle::ItemEffects::DamageCalcFromUser.add(:WEEDINGGLOVES,
  proc { |item, user, target, move, mults, baseDmg, type|
    mults[:base_damage_multiplier] *= 1.1 if target.pbHasType?(:GRASS)
  }
)
Fairy Charms - Reduces damage by 50% if the move is of a certain type (or, in one case, if attacker is an Ultra Beast) and the holder is a Fairy-type. Based on these items from the TCG:
Ruby:
Battle::ItemEffects::DamageCalcFromTarget.add(:FAIRYCHARMF,
  proc { |item, user, target, move, mults, baseDmg, type|
    mults[:defense_multiplier] *= 1.5 if type == :FIGHTING && target.pbHasType?(:FAIRY)
  }
)

Battle::ItemEffects::DamageCalcFromTarget.add(:FAIRYCHARMG,
  proc { |item, user, target, move, mults, baseDmg, type|
    mults[:defense_multiplier] *= 1.5 if type == :GRASS && target.pbHasType?(:FAIRY)
  }
)

Battle::ItemEffects::DamageCalcFromTarget.add(:FAIRYCHARML,
  proc { |item, user, target, move, mults, baseDmg, type|
    mults[:defense_multiplier] *= 1.5 if type == :ELECTRIC && target.pbHasType?(:FAIRY)
  }
)

Battle::ItemEffects::DamageCalcFromTarget.add(:FAIRYCHARMP,
  proc { |item, user, target, move, mults, baseDmg, type|
    mults[:defense_multiplier] *= 1.5 if type == :PSYCHIC && target.pbHasType?(:FAIRY)
  }
)

Battle::ItemEffects::DamageCalcFromTarget.add(:FAIRYCHARMUB,
  proc { |item, user, target, move, mults, baseDmg, type|
    mults[:defense_multiplier] *= 1.5 if user.pokemon.species_data.has_flag?("UltraBeast") && target.pbHasType?(:FAIRY)
  }

Poké Balls​

Color Ball - makes a Pokémon shiny, but sets all of its IVs to 0. Based on this Rare Candy Treatment comic.
Ruby:
Battle::PokeBallEffects::OnCatch.add(:COLORBALL, proc { |ball, battle, pkmn|
  pkmn.shiny = true
  GameData::Stat.each_main { |s| pkmn.iv[s.id] = 0 }
})

Other​

Memory Capsule - An item equivalent to the Move Reminder. Based on the Memory Capsule from the TCG.

You could make this a Key Item or an item that gets used up when you use it on a Pokémon, and make players seek them out like Heart Scales.
Ruby:
ItemHandlers::UseOnPokemon.add(:MEMORYCAPSULE, proc { |item, qty, pkmn, scene|
  if !pkmn.can_relearn_move?
    scene.pbDisplay(_INTL("It won't have any effect."))
    next false
  end
  next pbRelearnMoveScreen(pkmn)
})
Set the FieldUse property to OnPokemon.
Credits
Credit to TechSkylander1518, please!
Certain ideas here were inspired by others as well, so please check the notes for the specific idea you're using!
Author
TechSkylander1518
Views
3,189
First release
Last update
Rating
0.00 star(s) 0 ratings

More resources from TechSkylander1518

Back
Top