ItemHandlers::UseOnPokemon.add(:EXPCANDYXS, proc { |item, pkmn, scene| if pkmn.level >= GameData::GrowthRate.max_level || pkmn.shadowPokemon? scene.pbDisplay(_INTL("It won't have any effect.")) next false end gain_amount = 100 maximum = ((pkmn.growth_rate.maximum_exp - pkmn.exp) / gain_amount.to_f).ceil maximum = [maximum, $PokemonBag.pbQuantity(item)].min qty = scene.scene.pbChooseNumber( _INTL("How many {1} do you want to use?", GameData::Item.get(item).name), maximum) next false if qty == 0 scene.scene.pbSetHelpText("") if scene.is_a?(PokemonPartyScreen) pbChangeExp(pkmn, pkmn.exp + gain_amount * qty, scene) $PokemonBag.pbDeleteItem(item, qty - 1) scene.pbHardRefresh next true }) ItemHandlers::UseOnPokemon.add(:EXPCANDYS, proc { |item, pkmn, scene| if pkmn.level >= GameData::GrowthRate.max_level || pkmn.shadowPokemon? scene.pbDisplay(_INTL("It won't have any effect.")) next false end gain_amount = 800 maximum = ((pkmn.growth_rate.maximum_exp - pkmn.exp) / gain_amount.to_f).ceil maximum = [maximum, $PokemonBag.pbQuantity(item)].min qty = scene.scene.pbChooseNumber( _INTL("How many {1} do you want to use?", GameData::Item.get(item).name), maximum) next false if qty == 0 scene.scene.pbSetHelpText("") if scene.is_a?(PokemonPartyScreen) pbChangeExp(pkmn, pkmn.exp + gain_amount * qty, scene) $PokemonBag.pbDeleteItem(item, qty - 1) scene.pbHardRefresh next true }) ItemHandlers::UseOnPokemon.add(:EXPCANDYM, proc { |item, pkmn, scene| if pkmn.level >= GameData::GrowthRate.max_level || pkmn.shadowPokemon? scene.pbDisplay(_INTL("It won't have any effect.")) next false end gain_amount = 3_000 maximum = ((pkmn.growth_rate.maximum_exp - pkmn.exp) / gain_amount.to_f).ceil maximum = [maximum, $PokemonBag.pbQuantity(item)].min qty = scene.scene.pbChooseNumber( _INTL("How many {1} do you want to use?", GameData::Item.get(item).name), maximum) next false if qty == 0 scene.scene.pbSetHelpText("") if scene.is_a?(PokemonPartyScreen) pbChangeExp(pkmn, pkmn.exp + gain_amount * qty, scene) $PokemonBag.pbDeleteItem(item, qty - 1) scene.pbHardRefresh next true }) ItemHandlers::UseOnPokemon.add(:EXPCANDYL, proc { |item, pkmn, scene| if pkmn.level >= GameData::GrowthRate.max_level || pkmn.shadowPokemon? scene.pbDisplay(_INTL("It won't have any effect.")) next false end gain_amount = 10_000 maximum = ((pkmn.growth_rate.maximum_exp - pkmn.exp) / gain_amount.to_f).ceil maximum = [maximum, $PokemonBag.pbQuantity(item)].min qty = scene.scene.pbChooseNumber( _INTL("How many {1} do you want to use?", GameData::Item.get(item).name), maximum) next false if qty == 0 scene.scene.pbSetHelpText("") if scene.is_a?(PokemonPartyScreen) pbChangeExp(pkmn, pkmn.exp + gain_amount * qty, scene) $PokemonBag.pbDeleteItem(item, qty - 1) scene.pbHardRefresh next true }) ItemHandlers::UseOnPokemon.add(:EXPCANDYXL, proc { |item, pkmn, scene| if pkmn.level >= GameData::GrowthRate.max_level || pkmn.shadowPokemon? scene.pbDisplay(_INTL("It won't have any effect.")) next false end gain_amount = 30_000 maximum = ((pkmn.growth_rate.maximum_exp - pkmn.exp) / gain_amount.to_f).ceil maximum = [maximum, $PokemonBag.pbQuantity(item)].min qty = scene.scene.pbChooseNumber( _INTL("How many {1} do you want to use?", GameData::Item.get(item).name), maximum) next false if qty == 0 scene.scene.pbSetHelpText("") if scene.is_a?(PokemonPartyScreen) pbChangeExp(pkmn, pkmn.exp + gain_amount * qty, scene) $PokemonBag.pbDeleteItem(item, qty - 1) scene.pbHardRefresh next true }) def pbNatureChangingMint(new_nature, item, pkmn, scene) if pkmn.nature_for_stats == new_nature scene.pbDisplay(_INTL("It won't have any effect.")) return false end if !scene.pbConfirm(_INTL("It might affect {1}'s stats. Are you sure you want to use it?", pkmn.name)) return false end pkmn.nature_for_stats = new_nature pkmn.calc_stats scene.pbRefresh scene.pbDisplay(_INTL("{1}'s stats may have changed due to the effects of the {2}!", pkmn.name, GameData::Item.get(item).name)) return true end ItemHandlers::UseOnPokemon.add(:LONELYMINT, proc { |item, pkmn, scene| pbNatureChangingMint(:LONELY, item, pkmn, scene) }) ItemHandlers::UseOnPokemon.add(:ADAMANTMINT, proc { |item, pkmn, scene| pbNatureChangingMint(:ADAMANT, item, pkmn, scene) }) ItemHandlers::UseOnPokemon.add(:NAUGHTYMINT, proc { |item, pkmn, scene| pbNatureChangingMint(:NAUGHTY, item, pkmn, scene) }) ItemHandlers::UseOnPokemon.add(:BRAVEMINT, proc { |item, pkmn, scene| pbNatureChangingMint(:BRAVE, item, pkmn, scene) }) ItemHandlers::UseOnPokemon.add(:BOLDMINT, proc { |item, pkmn, scene| pbNatureChangingMint(:BOLD, item, pkmn, scene) }) ItemHandlers::UseOnPokemon.add(:IMPISHMINT, proc { |item, pkmn, scene| pbNatureChangingMint(:IMPISH, item, pkmn, scene) }) ItemHandlers::UseOnPokemon.add(:LAXMINT, proc { |item, pkmn, scene| pbNatureChangingMint(:LAX, item, pkmn, scene) }) ItemHandlers::UseOnPokemon.add(:RELAXEDMINT, proc { |item, pkmn, scene| pbNatureChangingMint(:RELAXED, item, pkmn, scene) }) ItemHandlers::UseOnPokemon.add(:MODESTMINT, proc { |item, pkmn, scene| pbNatureChangingMint(:MODEST, item, pkmn, scene) }) ItemHandlers::UseOnPokemon.add(:MILDMINT, proc { |item, pkmn, scene| pbNatureChangingMint(:MILD, item, pkmn, scene) }) ItemHandlers::UseOnPokemon.add(:RASHMINT, proc { |item, pkmn, scene| pbNatureChangingMint(:RASH, item, pkmn, scene) }) ItemHandlers::UseOnPokemon.add(:QUIETMINT, proc { |item, pkmn, scene| pbNatureChangingMint(:QUIET, item, pkmn, scene) }) ItemHandlers::UseOnPokemon.add(:CALMMINT, proc { |item, pkmn, scene| pbNatureChangingMint(:CALM, item, pkmn, scene) }) ItemHandlers::UseOnPokemon.add(:GENTLEMINT, proc { |item, pkmn, scene| pbNatureChangingMint(:GENTLE, item, pkmn, scene) }) ItemHandlers::UseOnPokemon.add(:CAREFULMINT, proc { |item, pkmn, scene| pbNatureChangingMint(:CAREFUL, item, pkmn, scene) }) ItemHandlers::UseOnPokemon.add(:SASSYMINT, proc { |item, pkmn, scene| pbNatureChangingMint(:SASSY, item, pkmn, scene) }) ItemHandlers::UseOnPokemon.add(:TIMIDMINT, proc { |item, pkmn, scene| pbNatureChangingMint(:TIMID, item, pkmn, scene) }) ItemHandlers::UseOnPokemon.add(:HASTYMINT, proc { |item, pkmn, scene| pbNatureChangingMint(:HASTY, item, pkmn, scene) }) ItemHandlers::UseOnPokemon.add(:JOLLYMINT, proc { |item, pkmn, scene| pbNatureChangingMint(:JOLLY, item, pkmn, scene) }) ItemHandlers::UseOnPokemon.add(:NAIVEMINT, proc { |item, pkmn, scene| pbNatureChangingMint(:NAIVE, item, pkmn, scene) }) ItemHandlers::UseOnPokemon.add(:SERIOUSMINT, proc { |item, pkmn, scene| pbNatureChangingMint(:SERIOUS, item, pkmn, scene) }) ItemHandlers::UseOnPokemon.copy(:MAXREVIVE, :MAXHONEY) ItemHandlers::CanUseInBattle.copy(:REVIVE, :MAXHONEY) ItemHandlers::BattleUseOnPokemon.copy(:MAXREVIVE, :MAXHONEY) ItemHandlers::CanUseInBattle.add(:MAXMUSHROOMS, proc { |item, pokemon, battler, move, firstAction, battle, scene, showMessages| if !pbBattleItemCanRaiseStat?(:ATTACK, battler, scene, false) && !pbBattleItemCanRaiseStat?(:DEFENSE, battler, scene, false) && !pbBattleItemCanRaiseStat?(:SPECIAL_ATTACK, battler, scene, false) && !pbBattleItemCanRaiseStat?(:SPECIAL_DEFENSE, battler, scene, false) && !pbBattleItemCanRaiseStat?(:SPEED, battler, scene, false) scene.pbDisplay(_INTL("It won't have any effect.")) if showMessages next false end next true }) ItemHandlers::BattleUseOnBattler.add(:MAXMUSHROOMS,proc { |item, battler, scene| battler.pbRaiseStatStage(:ATTACK, 1, battler) if battler.pbCanRaiseStatStage?(:ATTACK, battler) battler.pbRaiseStatStage(:DEFENSE, 1, battler) if battler.pbCanRaiseStatStage?(:DEFENSE, battler) battler.pbRaiseStatStage(:SPECIAL_ATTACK, 1, battler) if battler.pbCanRaiseStatStage?(:SPECIAL_ATTACK, battler) battler.pbRaiseStatStage(:SPECIAL_DEFENSE, 1, battler) if battler.pbCanRaiseStatStage?(:SPECIAL_DEFENSE, battler) battler.pbRaiseStatStage(:SPEED, 1, battler) if battler.pbCanRaiseStatStage?(:SPEED, battler) battler.pokemon.changeHappiness("battleitem") }) ItemHandlers::UseOnPokemon.add(:REINSOFUNITY, proc { |item, pkmn, scene| if !pkmn.isSpecies?(:CALYREX) || !pkmn.fused.nil? scene.pbDisplay(_INTL("It had no effect.")) next false elsif pkmn.fainted? scene.pbDisplay(_INTL("This can't be used on the fainted Pokémon.")) next false end # Fusing chosen = scene.pbChoosePokemon(_INTL("Fuse with which Pokémon?")) next false if chosen < 0 other_pkmn = $Trainer.party[chosen] if pkmn == other_pkmn scene.pbDisplay(_INTL("It cannot be fused with itself.")) next false elsif other_pkmn.egg? scene.pbDisplay(_INTL("It cannot be fused with an Egg.")) next false elsif other_pkmn.fainted? scene.pbDisplay(_INTL("It cannot be fused with that fainted Pokémon.")) next false elsif !other_pkmn.isSpecies?(:GLASTRIER) && !other_pkmn.isSpecies?(:SPECTRIER) scene.pbDisplay(_INTL("It cannot be fused with that Pokémon.")) next false end newForm = 0 newForm = 1 if other_pkmn.isSpecies?(:GLASTRIER) newForm = 2 if other_pkmn.isSpecies?(:SPECTRIER) pkmn.setForm(newForm) { pkmn.fused = other_pkmn $Trainer.remove_pokemon_at_index(chosen) scene.pbHardRefresh scene.pbDisplay(_INTL("{1} changed Forme!", pkmn.name)) } $PokemonBag.pbChangeItem(:REINSOFUNITY, :REINSOFUNITYUSED) next true }) ItemHandlers::UseOnPokemon.add(:REINSOFUNITYUSED, proc { |item, pkmn, scene| if !pkmn.isSpecies?(:CALYREX) || pkmn.fused.nil? scene.pbDisplay(_INTL("It had no effect.")) next false elsif pkmn.fainted? scene.pbDisplay(_INTL("This can't be used on the fainted Pokémon.")) next false elsif $Trainer.party_full? scene.pbDisplay(_INTL("You have no room to separate the Pokémon.")) next false end # Unfusing pkmn.setForm(0) { $Trainer.party[$Trainer.party.length] = pkmn.fused pkmn.fused = nil scene.pbHardRefresh scene.pbDisplay(_INTL("{1} changed Forme!", pkmn.name)) } $PokemonBag.pbChangeItem(:REINSOFUNITYUSED, :REINSOFUNITY) next true }) ItemHandlers::UseOnPokemon.add(:ABILITYPATCH, proc { |item, pkmn, scene| if scene.pbConfirm(_INTL("Do you want to change {1}'s Ability?", pkmn.name)) abils = pkmn.getAbilityList new_ability_id = nil abils.each { |a| new_ability_id = a[0] if a[1] == 2 } if !new_ability_id || pkmn.hasHiddenAbility? || pkmn.isSpecies?(:ZYGARDE) scene.pbDisplay(_INTL("It won't have any effect.")) next false end new_ability_name = GameData::Ability.get(new_ability_id).name pkmn.ability_index = 2 pkmn.ability = nil scene.pbRefresh scene.pbDisplay(_INTL("{1}'s Ability changed! Its Ability is now {2}!", pkmn.name, new_ability_name)) next true end next false }) ItemHandlers::UseOnPokemon.add(:ROTOMCATALOG, proc { |item, pkmn, scene| if !pkmn.isSpecies?(:ROTOM) scene.pbDisplay(_INTL("It had no effect.")) next false elsif pkmn.fainted? scene.pbDisplay(_INTL("This can't be used on the fainted Pokémon.")) next false end choices = [ _INTL("Light bulb"), _INTL("Microwave oven"), _INTL("Washing machine"), _INTL("Refrigerator"), _INTL("Electric fan"), _INTL("Lawn mower"), _INTL("Cancel") ] new_form = scene.pbShowCommands(_INTL("Which appliance would you like to order?"), commands, pkmn.form) if new_form == pkmn.form scene.pbDisplay(_INTL("It won't have any effect.")) next false elsif new_form > 0 && new_form < choices.length - 1 pkmn.setForm(new_form) { scene.pbRefresh scene.pbDisplay(_INTL("{1} transformed!", pkmn.name)) } next true end next false }) BattleHandlers::UserItemAfterMoveUse.add(:THROATSPRAY, proc { |item, user, targets, move, numHits, battle| next if battle.pbAllFainted?(user.idxOwnSide) || battle.pbAllFainted?(user.idxOpposingSide) next if !move.soundMove? || numHits == 0 next if !user.pbCanRaiseStatStage?(:SPECIAL_ATTACK, user) battle.pbCommonAnimation("UseItem", user) user.pbRaiseStatStage(:SPECIAL_ATTACK, 1, user) user.pbConsumeItem } ) BattleHandlers::ItemOnSwitchIn.add(:ROOMSERVICE, proc { |item, battler, battle| next if battle.field.effects[PBEffects::TrickRoom] == 0 next if !battler.pbCanLowerStatStage?(:SPEED, battler) battle.pbCommonAnimation("UseItem", battler) battler.pbLowerStatStage(:SPEED, 1, battler) battler.pbConsumeItem } ) ItemHandlers::UseOnPokemon.add(:ZYGARDECUBE, proc { |item, pkmn, scene| if !pkmn.isSpecies?(:ZYGARDE) scene.pbDisplay(_INTL("It had no effect.")) next false elsif pkmn.fainted? scene.pbDisplay(_INTL("This can't be used on the fainted Pokémon.")) next false end case scene.pbShowCommands(_INTL("What will you do with {1}?", pkmn.name), [_INTL("Change form"), _INTL("Change Ability"), _INTL("Cancel")]) when 0 # Change form newForm = (pkmn.form == 0) ? 1 : 0 pkmn.setForm(newForm) { scene.pbRefresh scene.pbDisplay(_INTL("{1} transformed!", pkmn.name)) } next true when 1 # Change ability new_abil = (pkmn.ability_index + 1) % 2 pkmn.ability_index = new_abil pkmn.ability = nil scene.pbRefresh scene.pbDisplay(_INTL("{1}'s Ability changed! Its Ability is now {2}!", pkmn.name, pkmn.ability.name)) next true end next false }) =begin #=============================================================================== Eject Pack When holder's stat(s) is lowered, consume item and holder switches out. Not triggered by Parting Shot, or if a faster mon's Eject Button/Eject Pack triggers. Blunder Policy If holder's move fails its accuracy check, consume item and holder gets +2 Speed. Doesn't trigger if move was an OHKO move, or Triple Kick that hit at least once. Pokémon Box Link Key item, unusable. Enables pressing a button while in the party screen to open the "Organise Boxes" mode of Pokémon storage. This is disabled at certain times, perhaps when a Game Switch is on. =end