From 2444b70ef6d2a86283274a8c2ef2557b49643a30 Mon Sep 17 00:00:00 2001 From: Maruno17 Date: Sun, 12 Dec 2021 00:10:01 +0000 Subject: [PATCH] Improved code for using multiples of an item at once, added a Setting for it, made it apply to more items --- Data/Scripts/001_Settings.rb | 4 + Data/Scripts/013_Items/001_Item_Utilities.rb | 136 ++++- Data/Scripts/013_Items/002_Item_Effects.rb | 520 +++++++++---------- 3 files changed, 356 insertions(+), 304 deletions(-) diff --git a/Data/Scripts/001_Settings.rb b/Data/Scripts/001_Settings.rb index e63e289a5..b86ce57e3 100644 --- a/Data/Scripts/001_Settings.rb +++ b/Data/Scripts/001_Settings.rb @@ -167,6 +167,10 @@ module Settings # Whether Rare Candy can be used on a Pokémon that is already at its maximum # level if it is able to evolve by level-up (if so, triggers that evolution). RARE_CANDY_USABLE_AT_MAX_LEVEL = (MECHANICS_GENERATION >= 8) + # Whether the player can choose how many of an item to use at once on a + # Pokémon. This applies to Exp-changing items (Rare Candy, Exp Candies) and + # EV-changing items (vitamins, feathers, EV-lowering berries). + USE_MULTIPLE_STAT_ITEMS_AT_ONCE = (MECHANICS_GENERATION >= 8) # Whether you get 1 Premier Ball for every 10 of any kind of Poké Ball bought # at once (true), or 1 Premier Ball for buying 10+ Poké Balls (false). MORE_BONUS_PREMIER_BALLS = (MECHANICS_GENERATION >= 8) diff --git a/Data/Scripts/013_Items/001_Item_Utilities.rb b/Data/Scripts/013_Items/001_Item_Utilities.rb index 8c40567e5..84501ff8e 100644 --- a/Data/Scripts/013_Items/001_Item_Utilities.rb +++ b/Data/Scripts/013_Items/001_Item_Utilities.rb @@ -2,15 +2,16 @@ # ItemHandlers #=============================================================================== module ItemHandlers - UseText = ItemHandlerHash.new - UseFromBag = ItemHandlerHash.new - ConfirmUseInField = ItemHandlerHash.new - UseInField = ItemHandlerHash.new - UseOnPokemon = ItemHandlerHash.new - CanUseInBattle = ItemHandlerHash.new - UseInBattle = ItemHandlerHash.new - BattleUseOnBattler = ItemHandlerHash.new - BattleUseOnPokemon = ItemHandlerHash.new + UseText = ItemHandlerHash.new + UseFromBag = ItemHandlerHash.new + ConfirmUseInField = ItemHandlerHash.new + UseInField = ItemHandlerHash.new + UseOnPokemon = ItemHandlerHash.new + UseOnPokemonMaximum = ItemHandlerHash.new + CanUseInBattle = ItemHandlerHash.new + UseInBattle = ItemHandlerHash.new + BattleUseOnBattler = ItemHandlerHash.new + BattleUseOnPokemon = ItemHandlerHash.new def self.hasUseText(item) return UseText[item]!=nil @@ -28,6 +29,10 @@ module ItemHandlers return UseOnPokemon[item]!=nil end + def self.hasUseOnPokemonMaximum(item) + return UseOnPokemonMaximum[item] != nil + end + def self.hasUseInBattle(item) return UseInBattle[item]!=nil end @@ -74,9 +79,16 @@ module ItemHandlers end # Returns whether item was used - def self.triggerUseOnPokemon(item,pkmn,scene) + def self.triggerUseOnPokemon(item, qty, pkmn, scene) return false if !UseOnPokemon[item] - return UseOnPokemon.trigger(item,pkmn,scene) + return UseOnPokemon.trigger(item, qty, pkmn, scene) + end + + # Returns the maximum number of the item that can be used on the Pokémon at once. + def self.triggerUseOnPokemonMaximum(item, pkmn) + return 1 if !UseOnPokemonMaximum[item] + return 1 if !Settings::USE_MULTIPLE_STAT_ITEMS_AT_ONCE + return [UseOnPokemonMaximum.trigger(item, pkmn), 1].max end def self.triggerCanUseInBattle(item,pkmn,battler,move,firstAction,battle,scene,showMessages=true) @@ -126,6 +138,7 @@ def pbChangeLevel(pkmn, new_level, scene) end return end + old_level = pkmn.level old_total_hp = pkmn.totalhp old_attack = pkmn.attack old_defense = pkmn.defense @@ -174,7 +187,7 @@ def pbChangeLevel(pkmn, new_level, scene) # Learn new moves upon level up movelist = pkmn.getMoveList for i in movelist - next if i[0] != pkmn.level + next if i[0] <= old_level || i[0] > pkmn.level pbLearnMove(pkmn, i[1], true) { scene.pbUpdate } end # Check for evolution @@ -300,6 +313,20 @@ def pbChangeExp(pkmn, new_exp, scene) end end +def pbGainExpFromExpCandy(pkmn, base_amt, qty, scene) + if pkmn.level >= GameData::GrowthRate.max_level || pkmn.shadowPokemon? + scene.pbDisplay(_INTL("It won't have any effect.")) + return false + end + scene.scene.pbSetHelpText("") if scene.is_a?(PokemonPartyScreen) + if qty > 1 + (qty - 1).times { pkmn.changeHappiness("vitamin") } + end + pbChangeExp(pkmn, pkmn.exp + base_amt * qty, scene) + scene.pbHardRefresh + return true +end + #=============================================================================== # Restore HP #=============================================================================== @@ -387,7 +414,56 @@ def pbRaiseEffortValues(pkmn, stat, evGain = 10, no_ev_cap = false) return evGain end -def pbRaiseHappinessAndLowerEV(pkmn,scene,stat,messages) +def pbMaxUsesOfEVRaisingItem(stat, amt_per_use, pkmn, no_ev_cap = false) + max_per_stat = (no_ev_cap) ? Pokemon::EV_STAT_LIMIT : 100 + amt_can_gain = max_per_stat - pkmn.ev[stat] + ev_total = 0 + GameData::Stat.each_main { |s| ev_total += pkmn.ev[s.id] } + amt_can_gain = [amt_can_gain, Pokemon::EV_LIMIT - ev_total].min + return [(amt_can_gain.to_f / amt_per_use).ceil, 1].max +end + +def pbUseEVRaisingItem(stat, amt_per_use, qty, pkmn, happiness_type, scene, no_ev_cap = false) + ret = true + qty.times do |i| + if pbRaiseEffortValues(pkmn, stat, amt_per_use, no_ev_cap) > 0 + pkmn.changeHappiness(happiness_type) + else + ret = false if i == 0 + break + end + end + if !ret + scene.pbDisplay(_INTL("It won't have any effect.")) + return false + end + scene.pbRefresh + scene.pbDisplay(_INTL("{1}'s {2} increased.", pkmn.name, GameData::Stat.get(stat).name)) + return true +end + +def pbMaxUsesOfEVLoweringBerry(stat, pkmn) + ret = (pkmn.ev[stat].to_f / 10).ceil + happiness = pkmn.happiness + uses = 0 + if happiness < 255 + bonus_per_use = 0 + bonus_per_use += 1 if pkmn.obtain_map == $game_map.map_id + bonus_per_use += 1 if pkmn.poke_ball == :LUXURYBALL + has_soothe_bell = pkmn.hasItem?(:SOOTHEBELL) + loop do + uses += 1 + gain = [10, 5, 2][happiness / 100] + gain += bonus_per_use + gain = (gain * 1.5).floor if has_soothe_bell + happiness += gain + break if happiness >= 255 + end + end + return [ret, uses].max +end + +def pbRaiseHappinessAndLowerEV(pkmn, scene, stat, qty, messages) h = pkmn.happiness<255 e = pkmn.ev[stat]>0 if !h && !e @@ -395,10 +471,10 @@ def pbRaiseHappinessAndLowerEV(pkmn,scene,stat,messages) return false end if h - pkmn.changeHappiness("evberry") + qty.times { |i| pkmn.changeHappiness("evberry") } end if e - pkmn.ev[stat] -= 10 + pkmn.ev[stat] -= 10 * qty pkmn.ev[stat] = 0 if pkmn.ev[stat]<0 pkmn.calc_stats end @@ -609,12 +685,21 @@ def pbUseItem(bag,item,bagscene=nil) break end pkmn = $player.party[chosen] - if pbCheckUseOnPokemon(item,pkmn,screen) - ret = ItemHandlers.triggerUseOnPokemon(item,pkmn,screen) + next if !pbCheckUseOnPokemon(item, pkmn, screen) + qty = 1 + max_at_once = ItemHandlers.triggerUseOnPokemonMaximum(item, pkmn) + max_at_once = [max_at_once, $bag.quantity(item)].min + if max_at_once > 1 + qty = screen.scene.pbChooseNumber( + _INTL("How many {1} do you want to use?", GameData::Item.get(item).name), max_at_once) + screen.scene.pbSetHelpText("") if screen.is_a?(PokemonPartyScreen) + end + if qty >= 1 + ret = ItemHandlers.triggerUseOnPokemon(item, qty, pkmn, screen) if ret && itm.consumed_after_use? - bag.remove(item) + bag.remove(item, qty) if !bag.has?(item) - pbMessage(_INTL("You used your last {1}.",itm.name)) { screen.pbUpdate } + pbMessage(_INTL("You used your last {1}.", itm.name)) { screen.pbUpdate } break end end @@ -662,11 +747,20 @@ def pbUseItemOnPokemon(item,pkmn,scene) return false end # Other item - ret = ItemHandlers.triggerUseOnPokemon(item,pkmn,scene) + qty = 1 + max_at_once = ItemHandlers.triggerUseOnPokemonMaximum(item, pkmn) + max_at_once = [max_at_once, $bag.quantity(item)].min + if max_at_once > 1 + qty = scene.scene.pbChooseNumber( + _INTL("How many {1} do you want to use?", itm.name), max_at_once) + scene.scene.pbSetHelpText("") if scene.is_a?(PokemonPartyScreen) + end + return false if qty <= 0 + ret = ItemHandlers.triggerUseOnPokemon(item, qty, pkmn, scene) scene.pbClearAnnotations scene.pbHardRefresh if ret && itm.consumed_after_use? - $bag.remove(item) + $bag.remove(item, qty) if !$bag.has?(item) pbMessage(_INTL("You used your last {1}.",itm.name)) { scene.pbUpdate } end diff --git a/Data/Scripts/013_Items/002_Item_Effects.rb b/Data/Scripts/013_Items/002_Item_Effects.rb index d8a42623c..0bf2e397a 100644 --- a/Data/Scripts/013_Items/002_Item_Effects.rb +++ b/Data/Scripts/013_Items/002_Item_Effects.rb @@ -346,7 +346,7 @@ ItemHandlers::UseInField.add(:EXPALLOFF,proc { |item| # Applies to all items defined as an evolution stone. # No need to add more code for new ones. ItemHandlers::UseOnPokemon.addIf(proc { |item| GameData::Item.get(item).is_evolution_stone? }, - proc { |item,pkmn,scene| + proc { |item, qty, pkmn, scene| if pkmn.shadowPokemon? scene.pbDisplay(_INTL("It won't have any effect.")) next false @@ -370,50 +370,50 @@ ItemHandlers::UseOnPokemon.addIf(proc { |item| GameData::Item.get(item).is_evolu } ) -ItemHandlers::UseOnPokemon.add(:POTION,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:POTION,proc { |item, qty, pkmn, scene| next pbHPItem(pkmn,20,scene) }) ItemHandlers::UseOnPokemon.copy(:POTION,:BERRYJUICE,:SWEETHEART) ItemHandlers::UseOnPokemon.copy(:POTION,:RAGECANDYBAR) if !Settings::RAGE_CANDY_BAR_CURES_STATUS_PROBLEMS -ItemHandlers::UseOnPokemon.add(:SUPERPOTION,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:SUPERPOTION,proc { |item, qty, pkmn, scene| next pbHPItem(pkmn, (Settings::REBALANCED_HEALING_ITEM_AMOUNTS) ? 60 : 50, scene) }) -ItemHandlers::UseOnPokemon.add(:HYPERPOTION,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:HYPERPOTION,proc { |item, qty, pkmn, scene| next pbHPItem(pkmn, (Settings::REBALANCED_HEALING_ITEM_AMOUNTS) ? 120 : 200, scene) }) -ItemHandlers::UseOnPokemon.add(:MAXPOTION,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:MAXPOTION,proc { |item, qty, pkmn, scene| next pbHPItem(pkmn,pkmn.totalhp-pkmn.hp,scene) }) -ItemHandlers::UseOnPokemon.add(:FRESHWATER,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:FRESHWATER,proc { |item, qty, pkmn, scene| next pbHPItem(pkmn, (Settings::REBALANCED_HEALING_ITEM_AMOUNTS) ? 30 : 50, scene) }) -ItemHandlers::UseOnPokemon.add(:SODAPOP,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:SODAPOP,proc { |item, qty, pkmn, scene| next pbHPItem(pkmn, (Settings::REBALANCED_HEALING_ITEM_AMOUNTS) ? 50 : 60, scene) }) -ItemHandlers::UseOnPokemon.add(:LEMONADE,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:LEMONADE,proc { |item, qty, pkmn, scene| next pbHPItem(pkmn, (Settings::REBALANCED_HEALING_ITEM_AMOUNTS) ? 70 : 80, scene) }) -ItemHandlers::UseOnPokemon.add(:MOOMOOMILK,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:MOOMOOMILK,proc { |item, qty, pkmn, scene| next pbHPItem(pkmn,100,scene) }) -ItemHandlers::UseOnPokemon.add(:ORANBERRY,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:ORANBERRY,proc { |item, qty, pkmn, scene| next pbHPItem(pkmn,10,scene) }) -ItemHandlers::UseOnPokemon.add(:SITRUSBERRY,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:SITRUSBERRY,proc { |item, qty, pkmn, scene| next pbHPItem(pkmn,pkmn.totalhp/4,scene) }) -ItemHandlers::UseOnPokemon.add(:AWAKENING,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:AWAKENING,proc { |item, qty, pkmn, scene| if pkmn.fainted? || pkmn.status != :SLEEP scene.pbDisplay(_INTL("It won't have any effect.")) next false @@ -426,7 +426,7 @@ ItemHandlers::UseOnPokemon.add(:AWAKENING,proc { |item,pkmn,scene| ItemHandlers::UseOnPokemon.copy(:AWAKENING,:CHESTOBERRY,:BLUEFLUTE,:POKEFLUTE) -ItemHandlers::UseOnPokemon.add(:ANTIDOTE,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:ANTIDOTE,proc { |item, qty, pkmn, scene| if pkmn.fainted? || pkmn.status != :POISON scene.pbDisplay(_INTL("It won't have any effect.")) next false @@ -439,7 +439,7 @@ ItemHandlers::UseOnPokemon.add(:ANTIDOTE,proc { |item,pkmn,scene| ItemHandlers::UseOnPokemon.copy(:ANTIDOTE,:PECHABERRY) -ItemHandlers::UseOnPokemon.add(:BURNHEAL,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:BURNHEAL,proc { |item, qty, pkmn, scene| if pkmn.fainted? || pkmn.status != :BURN scene.pbDisplay(_INTL("It won't have any effect.")) next false @@ -452,7 +452,7 @@ ItemHandlers::UseOnPokemon.add(:BURNHEAL,proc { |item,pkmn,scene| ItemHandlers::UseOnPokemon.copy(:BURNHEAL,:RAWSTBERRY) -ItemHandlers::UseOnPokemon.add(:PARALYZEHEAL,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:PARALYZEHEAL,proc { |item, qty, pkmn, scene| if pkmn.fainted? || pkmn.status != :PARALYSIS scene.pbDisplay(_INTL("It won't have any effect.")) next false @@ -465,7 +465,7 @@ ItemHandlers::UseOnPokemon.add(:PARALYZEHEAL,proc { |item,pkmn,scene| ItemHandlers::UseOnPokemon.copy(:PARALYZEHEAL,:PARLYZHEAL,:CHERIBERRY) -ItemHandlers::UseOnPokemon.add(:ICEHEAL,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:ICEHEAL,proc { |item, qty, pkmn, scene| if pkmn.fainted? || pkmn.status != :FROZEN scene.pbDisplay(_INTL("It won't have any effect.")) next false @@ -478,7 +478,7 @@ ItemHandlers::UseOnPokemon.add(:ICEHEAL,proc { |item,pkmn,scene| ItemHandlers::UseOnPokemon.copy(:ICEHEAL,:ASPEARBERRY) -ItemHandlers::UseOnPokemon.add(:FULLHEAL,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:FULLHEAL,proc { |item, qty, pkmn, scene| if pkmn.fainted? || pkmn.status == :NONE scene.pbDisplay(_INTL("It won't have any effect.")) next false @@ -494,7 +494,7 @@ ItemHandlers::UseOnPokemon.copy(:FULLHEAL, :BIGMALASADA,:PEWTERCRUNCHIES,:LUMBERRY) ItemHandlers::UseOnPokemon.copy(:FULLHEAL,:RAGECANDYBAR) if Settings::RAGE_CANDY_BAR_CURES_STATUS_PROBLEMS -ItemHandlers::UseOnPokemon.add(:FULLRESTORE,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:FULLRESTORE,proc { |item, qty, pkmn, scene| if pkmn.fainted? || (pkmn.hp==pkmn.totalhp && pkmn.status == :NONE) scene.pbDisplay(_INTL("It won't have any effect.")) next false @@ -510,7 +510,7 @@ ItemHandlers::UseOnPokemon.add(:FULLRESTORE,proc { |item,pkmn,scene| next true }) -ItemHandlers::UseOnPokemon.add(:REVIVE,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:REVIVE,proc { |item, qty, pkmn, scene| if !pkmn.fainted? scene.pbDisplay(_INTL("It won't have any effect.")) next false @@ -523,7 +523,7 @@ ItemHandlers::UseOnPokemon.add(:REVIVE,proc { |item,pkmn,scene| next true }) -ItemHandlers::UseOnPokemon.add(:MAXREVIVE,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:MAXREVIVE,proc { |item, qty, pkmn, scene| if !pkmn.fainted? scene.pbDisplay(_INTL("It won't have any effect.")) next false @@ -537,7 +537,7 @@ ItemHandlers::UseOnPokemon.add(:MAXREVIVE,proc { |item,pkmn,scene| ItemHandlers::UseOnPokemon.copy(:MAXREVIVE, :MAXHONEY) -ItemHandlers::UseOnPokemon.add(:ENERGYPOWDER,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:ENERGYPOWDER,proc { |item, qty, pkmn, scene| if pbHPItem(pkmn, (Settings::REBALANCED_HEALING_ITEM_AMOUNTS) ? 60 : 50, scene) pkmn.changeHappiness("powder") next true @@ -545,7 +545,7 @@ ItemHandlers::UseOnPokemon.add(:ENERGYPOWDER,proc { |item,pkmn,scene| next false }) -ItemHandlers::UseOnPokemon.add(:ENERGYROOT,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:ENERGYROOT,proc { |item, qty, pkmn, scene| if pbHPItem(pkmn, (Settings::REBALANCED_HEALING_ITEM_AMOUNTS) ? 120 : 200, scene) pkmn.changeHappiness("energyroot") next true @@ -553,7 +553,7 @@ ItemHandlers::UseOnPokemon.add(:ENERGYROOT,proc { |item,pkmn,scene| next false }) -ItemHandlers::UseOnPokemon.add(:HEALPOWDER,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:HEALPOWDER,proc { |item, qty, pkmn, scene| if pkmn.fainted? || pkmn.status == :NONE scene.pbDisplay(_INTL("It won't have any effect.")) next false @@ -565,7 +565,7 @@ ItemHandlers::UseOnPokemon.add(:HEALPOWDER,proc { |item,pkmn,scene| next true }) -ItemHandlers::UseOnPokemon.add(:REVIVALHERB,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:REVIVALHERB,proc { |item, qty, pkmn, scene| if !pkmn.fainted? scene.pbDisplay(_INTL("It won't have any effect.")) next false @@ -578,7 +578,7 @@ ItemHandlers::UseOnPokemon.add(:REVIVALHERB,proc { |item,pkmn,scene| next true }) -ItemHandlers::UseOnPokemon.add(:ETHER,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:ETHER,proc { |item, qty, pkmn, scene| move = scene.pbChooseMove(pkmn,_INTL("Restore which move?")) next false if move<0 if pbRestorePP(pkmn,move,10)==0 @@ -591,7 +591,7 @@ ItemHandlers::UseOnPokemon.add(:ETHER,proc { |item,pkmn,scene| ItemHandlers::UseOnPokemon.copy(:ETHER,:LEPPABERRY) -ItemHandlers::UseOnPokemon.add(:MAXETHER,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:MAXETHER,proc { |item, qty, pkmn, scene| move = scene.pbChooseMove(pkmn,_INTL("Restore which move?")) next false if move<0 if pbRestorePP(pkmn,move,pkmn.moves[move].total_pp-pkmn.moves[move].pp)==0 @@ -602,7 +602,7 @@ ItemHandlers::UseOnPokemon.add(:MAXETHER,proc { |item,pkmn,scene| next true }) -ItemHandlers::UseOnPokemon.add(:ELIXIR,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:ELIXIR,proc { |item, qty, pkmn, scene| pprestored = 0 for i in 0...pkmn.moves.length pprestored += pbRestorePP(pkmn,i,10) @@ -615,7 +615,7 @@ ItemHandlers::UseOnPokemon.add(:ELIXIR,proc { |item,pkmn,scene| next true }) -ItemHandlers::UseOnPokemon.add(:MAXELIXIR,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:MAXELIXIR,proc { |item, qty, pkmn, scene| pprestored = 0 for i in 0...pkmn.moves.length pprestored += pbRestorePP(pkmn,i,pkmn.moves[i].total_pp-pkmn.moves[i].pp) @@ -628,7 +628,7 @@ ItemHandlers::UseOnPokemon.add(:MAXELIXIR,proc { |item,pkmn,scene| next true }) -ItemHandlers::UseOnPokemon.add(:PPUP,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:PPUP,proc { |item, qty, pkmn, scene| move = scene.pbChooseMove(pkmn,_INTL("Boost PP of which move?")) if move>=0 if pkmn.moves[move].total_pp<=1 || pkmn.moves[move].ppup>=3 @@ -643,7 +643,7 @@ ItemHandlers::UseOnPokemon.add(:PPUP,proc { |item,pkmn,scene| next false }) -ItemHandlers::UseOnPokemon.add(:PPMAX,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:PPMAX,proc { |item, qty, pkmn, scene| move = scene.pbChooseMove(pkmn,_INTL("Boost PP of which move?")) if move>=0 if pkmn.moves[move].total_pp<=1 || pkmn.moves[move].ppup>=3 @@ -658,225 +658,215 @@ ItemHandlers::UseOnPokemon.add(:PPMAX,proc { |item,pkmn,scene| next false }) -ItemHandlers::UseOnPokemon.add(:HPUP,proc { |item,pkmn,scene| - if pbRaiseEffortValues(pkmn, :HP, 10, Settings::NO_VITAMIN_EV_CAP) == 0 - scene.pbDisplay(_INTL("It won't have any effect.")) - next false - end - scene.pbRefresh - scene.pbDisplay(_INTL("{1}'s HP increased.",pkmn.name)) - pkmn.changeHappiness("vitamin") - next true +ItemHandlers::UseOnPokemonMaximum.add(:HPUP, proc { |item, pkmn| + next pbMaxUsesOfEVRaisingItem(:HP, 10, pkmn, Settings::NO_VITAMIN_EV_CAP) }) -ItemHandlers::UseOnPokemon.add(:PROTEIN,proc { |item,pkmn,scene| - if pbRaiseEffortValues(pkmn, :ATTACK, 10, Settings::NO_VITAMIN_EV_CAP) == 0 - scene.pbDisplay(_INTL("It won't have any effect.")) - next false - end - scene.pbDisplay(_INTL("{1}'s Attack increased.",pkmn.name)) - pkmn.changeHappiness("vitamin") - next true +ItemHandlers::UseOnPokemon.add(:HPUP,proc { |item, qty, pkmn, scene| + next pbUseEVRaisingItem(:HP, 10, qty, pkmn, "vitamin", scene, Settings::NO_VITAMIN_EV_CAP) }) -ItemHandlers::UseOnPokemon.add(:IRON,proc { |item,pkmn,scene| - if pbRaiseEffortValues(pkmn, :DEFENSE, 10, Settings::NO_VITAMIN_EV_CAP) == 0 - scene.pbDisplay(_INTL("It won't have any effect.")) - next false - end - scene.pbDisplay(_INTL("{1}'s Defense increased.",pkmn.name)) - pkmn.changeHappiness("vitamin") - next true +ItemHandlers::UseOnPokemonMaximum.add(:PROTEIN, proc { |item, pkmn| + next pbMaxUsesOfEVRaisingItem(:ATTACK, 10, pkmn, Settings::NO_VITAMIN_EV_CAP) }) -ItemHandlers::UseOnPokemon.add(:CALCIUM,proc { |item,pkmn,scene| - if pbRaiseEffortValues(pkmn, :SPECIAL_ATTACK, 10, Settings::NO_VITAMIN_EV_CAP) == 0 - scene.pbDisplay(_INTL("It won't have any effect.")) - next false - end - scene.pbDisplay(_INTL("{1}'s Special Attack increased.",pkmn.name)) - pkmn.changeHappiness("vitamin") - next true +ItemHandlers::UseOnPokemon.add(:PROTEIN,proc { |item, qty, pkmn, scene| + next pbUseEVRaisingItem(:ATTACK, 10, qty, pkmn, "vitamin", scene, Settings::NO_VITAMIN_EV_CAP) }) -ItemHandlers::UseOnPokemon.add(:ZINC,proc { |item,pkmn,scene| - if pbRaiseEffortValues(pkmn, :SPECIAL_DEFENSE, 10, Settings::NO_VITAMIN_EV_CAP) == 0 - scene.pbDisplay(_INTL("It won't have any effect.")) - next false - end - scene.pbDisplay(_INTL("{1}'s Special Defense increased.",pkmn.name)) - pkmn.changeHappiness("vitamin") - next true +ItemHandlers::UseOnPokemonMaximum.add(:IRON, proc { |item, pkmn| + next pbMaxUsesOfEVRaisingItem(:DEFENSE, 10, pkmn, Settings::NO_VITAMIN_EV_CAP) }) -ItemHandlers::UseOnPokemon.add(:CARBOS,proc { |item,pkmn,scene| - if pbRaiseEffortValues(pkmn, :SPEED, 10, Settings::NO_VITAMIN_EV_CAP) == 0 - scene.pbDisplay(_INTL("It won't have any effect.")) - next false - end - scene.pbDisplay(_INTL("{1}'s Speed increased.",pkmn.name)) - pkmn.changeHappiness("vitamin") - next true +ItemHandlers::UseOnPokemon.add(:IRON,proc { |item, qty, pkmn, scene| + next pbUseEVRaisingItem(:DEFENSE, 10, qty, pkmn, "vitamin", scene, Settings::NO_VITAMIN_EV_CAP) }) -ItemHandlers::UseOnPokemon.add(:HEALTHFEATHER,proc { |item,pkmn,scene| - if pbRaiseEffortValues(pkmn,:HP,1,false)==0 - scene.pbDisplay(_INTL("It won't have any effect.")) - next false - end - scene.pbRefresh - scene.pbDisplay(_INTL("{1}'s HP increased.",pkmn.name)) - pkmn.changeHappiness("wing") - next true +ItemHandlers::UseOnPokemonMaximum.add(:CALCIUM, proc { |item, pkmn| + next pbMaxUsesOfEVRaisingItem(:SPECIAL_ATTACK, 10, pkmn, Settings::NO_VITAMIN_EV_CAP) }) -ItemHandlers::UseOnPokemon.copy(:HEALTHFEATHER,:HEALTHWING) - -ItemHandlers::UseOnPokemon.add(:MUSCLEFEATHER,proc { |item,pkmn,scene| - if pbRaiseEffortValues(pkmn,:ATTACK,1,false)==0 - scene.pbDisplay(_INTL("It won't have any effect.")) - next false - end - scene.pbDisplay(_INTL("{1}'s Attack increased.",pkmn.name)) - pkmn.changeHappiness("wing") - next true +ItemHandlers::UseOnPokemon.add(:CALCIUM,proc { |item, qty, pkmn, scene| + next pbUseEVRaisingItem(:SPECIAL_ATTACK, 10, qty, pkmn, "vitamin", scene, Settings::NO_VITAMIN_EV_CAP) }) -ItemHandlers::UseOnPokemon.copy(:MUSCLEFEATHER,:MUSCLEWING) - -ItemHandlers::UseOnPokemon.add(:RESISTFEATHER,proc { |item,pkmn,scene| - if pbRaiseEffortValues(pkmn,:DEFENSE,1,false)==0 - scene.pbDisplay(_INTL("It won't have any effect.")) - next false - end - scene.pbDisplay(_INTL("{1}'s Defense increased.",pkmn.name)) - pkmn.changeHappiness("wing") - next true +ItemHandlers::UseOnPokemonMaximum.add(:ZINC, proc { |item, pkmn| + next pbMaxUsesOfEVRaisingItem(:SPECIAL_DEFENSE, 10, pkmn, Settings::NO_VITAMIN_EV_CAP) }) -ItemHandlers::UseOnPokemon.copy(:RESISTFEATHER,:RESISTWING) - -ItemHandlers::UseOnPokemon.add(:GENIUSFEATHER,proc { |item,pkmn,scene| - if pbRaiseEffortValues(pkmn,:SPECIAL_ATTACK,1,false)==0 - scene.pbDisplay(_INTL("It won't have any effect.")) - next false - end - scene.pbDisplay(_INTL("{1}'s Special Attack increased.",pkmn.name)) - pkmn.changeHappiness("wing") - next true +ItemHandlers::UseOnPokemon.add(:ZINC,proc { |item, qty, pkmn, scene| + next pbUseEVRaisingItem(:SPECIAL_DEFENSE, 10, qty, pkmn, "vitamin", scene, Settings::NO_VITAMIN_EV_CAP) }) -ItemHandlers::UseOnPokemon.copy(:GENIUSFEATHER,:GENIUSWING) - -ItemHandlers::UseOnPokemon.add(:CLEVERFEATHER,proc { |item,pkmn,scene| - if pbRaiseEffortValues(pkmn,:SPECIAL_DEFENSE,1,false)==0 - scene.pbDisplay(_INTL("It won't have any effect.")) - next false - end - scene.pbDisplay(_INTL("{1}'s Special Defense increased.",pkmn.name)) - pkmn.changeHappiness("wing") - next true +ItemHandlers::UseOnPokemonMaximum.add(:CARBOS, proc { |item, pkmn| + next pbMaxUsesOfEVRaisingItem(:SPEED, 10, pkmn, Settings::NO_VITAMIN_EV_CAP) }) -ItemHandlers::UseOnPokemon.copy(:CLEVERFEATHER,:CLEVERWING) - -ItemHandlers::UseOnPokemon.add(:SWIFTFEATHER,proc { |item,pkmn,scene| - if pbRaiseEffortValues(pkmn,:SPEED,1,false)==0 - scene.pbDisplay(_INTL("It won't have any effect.")) - next false - end - scene.pbDisplay(_INTL("{1}'s Speed increased.",pkmn.name)) - pkmn.changeHappiness("wing") - next true +ItemHandlers::UseOnPokemon.add(:CARBOS,proc { |item, qty, pkmn, scene| + next pbUseEVRaisingItem(:SPEED, 10, qty, pkmn, "vitamin", scene, Settings::NO_VITAMIN_EV_CAP) }) -ItemHandlers::UseOnPokemon.copy(:SWIFTFEATHER,:SWIFTWING) +ItemHandlers::UseOnPokemonMaximum.add(:HEALTHFEATHER, proc { |item, pkmn| + next pbMaxUsesOfEVRaisingItem(:HP, 1, pkmn, true) +}) -ItemHandlers::UseOnPokemon.add(:LONELYMINT, proc { |item, pkmn, scene| +ItemHandlers::UseOnPokemonMaximum.copy(:HEALTHFEATHER, :HEALTHWING) + +ItemHandlers::UseOnPokemon.add(:HEALTHFEATHER,proc { |item, qty, pkmn, scene| + next pbUseEVRaisingItem(:HP, 1, qty, pkmn, "wing", scene, true) +}) + +ItemHandlers::UseOnPokemon.copy(:HEALTHFEATHER, :HEALTHWING) + +ItemHandlers::UseOnPokemonMaximum.add(:MUSCLEFEATHER, proc { |item, pkmn| + next pbMaxUsesOfEVRaisingItem(:ATTACK, 1, pkmn, true) +}) + +ItemHandlers::UseOnPokemonMaximum.copy(:MUSCLEFEATHER, :MUSCLEWING) + +ItemHandlers::UseOnPokemon.add(:MUSCLEFEATHER,proc { |item, qty, pkmn, scene| + next pbUseEVRaisingItem(:ATTACK, 1, qty, pkmn, "wing", scene, true) +}) + +ItemHandlers::UseOnPokemon.copy(:MUSCLEFEATHER, :MUSCLEWING) + +ItemHandlers::UseOnPokemonMaximum.add(:RESISTFEATHER, proc { |item, pkmn| + next pbMaxUsesOfEVRaisingItem(:DEFENSE, 1, pkmn, true) +}) + +ItemHandlers::UseOnPokemonMaximum.copy(:RESISTFEATHER, :RESISTWING) + +ItemHandlers::UseOnPokemon.add(:RESISTFEATHER,proc { |item, qty, pkmn, scene| + next pbUseEVRaisingItem(:DEFENSE, 1, qty, pkmn, "wing", scene, true) +}) + +ItemHandlers::UseOnPokemon.copy(:RESISTFEATHER, :RESISTWING) + +ItemHandlers::UseOnPokemonMaximum.add(:GENIUSFEATHER, proc { |item, pkmn| + next pbMaxUsesOfEVRaisingItem(:SPECIAL_ATTACK, 1, pkmn, true) +}) + +ItemHandlers::UseOnPokemonMaximum.copy(:GENIUSFEATHER, :GENIUSWING) + +ItemHandlers::UseOnPokemon.add(:GENIUSFEATHER,proc { |item, qty, pkmn, scene| + next pbUseEVRaisingItem(:SPECIAL_ATTACK, 1, qty, pkmn, "wing", scene, true) +}) + +ItemHandlers::UseOnPokemon.copy(:GENIUSFEATHER, :GENIUSWING) + +ItemHandlers::UseOnPokemonMaximum.add(:CLEVERFEATHER, proc { |item, pkmn| + next pbMaxUsesOfEVRaisingItem(:SPECIAL_DEFENSE, 1, pkmn, true) +}) + +ItemHandlers::UseOnPokemonMaximum.copy(:CLEVERFEATHER, :CLEVERWING) + +ItemHandlers::UseOnPokemon.add(:CLEVERFEATHER,proc { |item, qty, pkmn, scene| + next pbUseEVRaisingItem(:SPECIAL_DEFENSE, 1, qty, pkmn, "wing", scene, true) +}) + +ItemHandlers::UseOnPokemon.copy(:CLEVERFEATHER, :CLEVERWING) + +ItemHandlers::UseOnPokemonMaximum.add(:SWIFTFEATHER, proc { |item, pkmn| + next pbMaxUsesOfEVRaisingItem(:SPEED, 1, pkmn, true) +}) + +ItemHandlers::UseOnPokemonMaximum.copy(:SWIFTFEATHER, :SWIFTWING) + +ItemHandlers::UseOnPokemon.add(:SWIFTFEATHER,proc { |item, qty, pkmn, scene| + next pbUseEVRaisingItem(:SPEED, 1, qty, pkmn, "wing", scene, true) +}) + +ItemHandlers::UseOnPokemon.copy(:SWIFTFEATHER, :SWIFTWING) + +ItemHandlers::UseOnPokemon.add(:LONELYMINT, proc { |item, qty, pkmn, scene| pbNatureChangingMint(:LONELY, item, pkmn, scene) }) -ItemHandlers::UseOnPokemon.add(:ADAMANTMINT, proc { |item, pkmn, scene| +ItemHandlers::UseOnPokemon.add(:ADAMANTMINT, proc { |item, qty, pkmn, scene| pbNatureChangingMint(:ADAMANT, item, pkmn, scene) }) -ItemHandlers::UseOnPokemon.add(:NAUGHTYMINT, proc { |item, pkmn, scene| +ItemHandlers::UseOnPokemon.add(:NAUGHTYMINT, proc { |item, qty, pkmn, scene| pbNatureChangingMint(:NAUGHTY, item, pkmn, scene) }) -ItemHandlers::UseOnPokemon.add(:BRAVEMINT, proc { |item, pkmn, scene| +ItemHandlers::UseOnPokemon.add(:BRAVEMINT, proc { |item, qty, pkmn, scene| pbNatureChangingMint(:BRAVE, item, pkmn, scene) }) -ItemHandlers::UseOnPokemon.add(:BOLDMINT, proc { |item, pkmn, scene| +ItemHandlers::UseOnPokemon.add(:BOLDMINT, proc { |item, qty, pkmn, scene| pbNatureChangingMint(:BOLD, item, pkmn, scene) }) -ItemHandlers::UseOnPokemon.add(:IMPISHMINT, proc { |item, pkmn, scene| +ItemHandlers::UseOnPokemon.add(:IMPISHMINT, proc { |item, qty, pkmn, scene| pbNatureChangingMint(:IMPISH, item, pkmn, scene) }) -ItemHandlers::UseOnPokemon.add(:LAXMINT, proc { |item, pkmn, scene| +ItemHandlers::UseOnPokemon.add(:LAXMINT, proc { |item, qty, pkmn, scene| pbNatureChangingMint(:LAX, item, pkmn, scene) }) -ItemHandlers::UseOnPokemon.add(:RELAXEDMINT, proc { |item, pkmn, scene| +ItemHandlers::UseOnPokemon.add(:RELAXEDMINT, proc { |item, qty, pkmn, scene| pbNatureChangingMint(:RELAXED, item, pkmn, scene) }) -ItemHandlers::UseOnPokemon.add(:MODESTMINT, proc { |item, pkmn, scene| +ItemHandlers::UseOnPokemon.add(:MODESTMINT, proc { |item, qty, pkmn, scene| pbNatureChangingMint(:MODEST, item, pkmn, scene) }) -ItemHandlers::UseOnPokemon.add(:MILDMINT, proc { |item, pkmn, scene| +ItemHandlers::UseOnPokemon.add(:MILDMINT, proc { |item, qty, pkmn, scene| pbNatureChangingMint(:MILD, item, pkmn, scene) }) -ItemHandlers::UseOnPokemon.add(:RASHMINT, proc { |item, pkmn, scene| +ItemHandlers::UseOnPokemon.add(:RASHMINT, proc { |item, qty, pkmn, scene| pbNatureChangingMint(:RASH, item, pkmn, scene) }) -ItemHandlers::UseOnPokemon.add(:QUIETMINT, proc { |item, pkmn, scene| +ItemHandlers::UseOnPokemon.add(:QUIETMINT, proc { |item, qty, pkmn, scene| pbNatureChangingMint(:QUIET, item, pkmn, scene) }) -ItemHandlers::UseOnPokemon.add(:CALMMINT, proc { |item, pkmn, scene| +ItemHandlers::UseOnPokemon.add(:CALMMINT, proc { |item, qty, pkmn, scene| pbNatureChangingMint(:CALM, item, pkmn, scene) }) -ItemHandlers::UseOnPokemon.add(:GENTLEMINT, proc { |item, pkmn, scene| +ItemHandlers::UseOnPokemon.add(:GENTLEMINT, proc { |item, qty, pkmn, scene| pbNatureChangingMint(:GENTLE, item, pkmn, scene) }) -ItemHandlers::UseOnPokemon.add(:CAREFULMINT, proc { |item, pkmn, scene| +ItemHandlers::UseOnPokemon.add(:CAREFULMINT, proc { |item, qty, pkmn, scene| pbNatureChangingMint(:CAREFUL, item, pkmn, scene) }) -ItemHandlers::UseOnPokemon.add(:SASSYMINT, proc { |item, pkmn, scene| +ItemHandlers::UseOnPokemon.add(:SASSYMINT, proc { |item, qty, pkmn, scene| pbNatureChangingMint(:SASSY, item, pkmn, scene) }) -ItemHandlers::UseOnPokemon.add(:TIMIDMINT, proc { |item, pkmn, scene| +ItemHandlers::UseOnPokemon.add(:TIMIDMINT, proc { |item, qty, pkmn, scene| pbNatureChangingMint(:TIMID, item, pkmn, scene) }) -ItemHandlers::UseOnPokemon.add(:HASTYMINT, proc { |item, pkmn, scene| +ItemHandlers::UseOnPokemon.add(:HASTYMINT, proc { |item, qty, pkmn, scene| pbNatureChangingMint(:HASTY, item, pkmn, scene) }) -ItemHandlers::UseOnPokemon.add(:JOLLYMINT, proc { |item, pkmn, scene| +ItemHandlers::UseOnPokemon.add(:JOLLYMINT, proc { |item, qty, pkmn, scene| pbNatureChangingMint(:JOLLY, item, pkmn, scene) }) -ItemHandlers::UseOnPokemon.add(:NAIVEMINT, proc { |item, pkmn, scene| +ItemHandlers::UseOnPokemon.add(:NAIVEMINT, proc { |item, qty, pkmn, scene| pbNatureChangingMint(:NAIVE, item, pkmn, scene) }) -ItemHandlers::UseOnPokemon.add(:SERIOUSMINT, proc { |item, pkmn, scene| +ItemHandlers::UseOnPokemon.add(:SERIOUSMINT, proc { |item, qty, pkmn, scene| pbNatureChangingMint(:SERIOUS, item, pkmn, scene) }) -ItemHandlers::UseOnPokemon.add(:RARECANDY,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemonMaximum.add(:RARECANDY, proc { |item, pkmn| + next GameData::GrowthRate.max_level - pkmn.level +}) + +ItemHandlers::UseOnPokemon.add(:RARECANDY,proc { |item, qty, pkmn, scene| if pkmn.shadowPokemon? scene.pbDisplay(_INTL("It won't have any effect.")) next false @@ -898,165 +888,129 @@ ItemHandlers::UseOnPokemon.add(:RARECANDY,proc { |item,pkmn,scene| next true end # Level up - pbChangeLevel(pkmn,pkmn.level + 1, scene) + pbChangeLevel(pkmn,pkmn.level + qty, scene) scene.pbHardRefresh next true }) -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 +ItemHandlers::UseOnPokemonMaximum.add(:EXPCANDYXS, proc { |item, pkmn| gain_amount = 100 - maximum = ((pkmn.growth_rate.maximum_exp - pkmn.exp) / gain_amount.to_f).ceil - maximum = [maximum, $bag.quantity(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) - if qty > 1 - (qty - 1).times { pkmn.changeHappiness("vitamin") } - end - pbChangeExp(pkmn, pkmn.exp + gain_amount * qty, scene) - $bag.remove(item, qty - 1) - scene.pbHardRefresh - next true + next ((pkmn.growth_rate.maximum_exp - pkmn.exp) / gain_amount.to_f).ceil }) -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 +ItemHandlers::UseOnPokemon.add(:EXPCANDYXS, proc { |item, qty, pkmn, scene| + next pbGainExpFromExpCandy(pkmn, 100, qty, scene) +}) + +ItemHandlers::UseOnPokemonMaximum.add(:EXPCANDYS, proc { |item, pkmn| gain_amount = 800 - maximum = ((pkmn.growth_rate.maximum_exp - pkmn.exp) / gain_amount.to_f).ceil - maximum = [maximum, $bag.quantity(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) - if qty > 1 - (qty - 1).times { pkmn.changeHappiness("vitamin") } - end - pbChangeExp(pkmn, pkmn.exp + gain_amount * qty, scene) - $bag.remove(item, qty - 1) - scene.pbHardRefresh - next true + next ((pkmn.growth_rate.maximum_exp - pkmn.exp) / gain_amount.to_f).ceil }) -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 +ItemHandlers::UseOnPokemon.add(:EXPCANDYS, proc { |item, qty, pkmn, scene| + next pbGainExpFromExpCandy(pkmn, 800, qty, scene) +}) + +ItemHandlers::UseOnPokemonMaximum.add(:EXPCANDYM, proc { |item, pkmn| gain_amount = 3_000 - maximum = ((pkmn.growth_rate.maximum_exp - pkmn.exp) / gain_amount.to_f).ceil - maximum = [maximum, $bag.quantity(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) - if qty > 1 - (qty - 1).times { pkmn.changeHappiness("vitamin") } - end - pbChangeExp(pkmn, pkmn.exp + gain_amount * qty, scene) - $bag.remove(item, qty - 1) - scene.pbHardRefresh - next true + next ((pkmn.growth_rate.maximum_exp - pkmn.exp) / gain_amount.to_f).ceil }) -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 +ItemHandlers::UseOnPokemon.add(:EXPCANDYM, proc { |item, qty, pkmn, scene| + next pbGainExpFromExpCandy(pkmn, 3_000, qty, scene) +}) + +ItemHandlers::UseOnPokemonMaximum.add(:EXPCANDYL, proc { |item, pkmn| gain_amount = 10_000 - maximum = ((pkmn.growth_rate.maximum_exp - pkmn.exp) / gain_amount.to_f).ceil - maximum = [maximum, $bag.quantity(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) - if qty > 1 - (qty - 1).times { pkmn.changeHappiness("vitamin") } - end - pbChangeExp(pkmn, pkmn.exp + gain_amount * qty, scene) - $bag.remove(item, qty - 1) - scene.pbHardRefresh - next true + next ((pkmn.growth_rate.maximum_exp - pkmn.exp) / gain_amount.to_f).ceil }) -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 +ItemHandlers::UseOnPokemon.add(:EXPCANDYL, proc { |item, qty, pkmn, scene| + next pbGainExpFromExpCandy(pkmn, 10_000, qty, scene) +}) + +ItemHandlers::UseOnPokemonMaximum.add(:EXPCANDYXL, proc { |item, pkmn| gain_amount = 30_000 - maximum = ((pkmn.growth_rate.maximum_exp - pkmn.exp) / gain_amount.to_f).ceil - maximum = [maximum, $bag.quantity(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) - if qty > 1 - (qty - 1).times { pkmn.changeHappiness("vitamin") } - end - pbChangeExp(pkmn, pkmn.exp + gain_amount * qty, scene) - $bag.remove(item, qty - 1) - scene.pbHardRefresh - next true + next ((pkmn.growth_rate.maximum_exp - pkmn.exp) / gain_amount.to_f).ceil }) -ItemHandlers::UseOnPokemon.add(:POMEGBERRY,proc { |item,pkmn,scene| - next pbRaiseHappinessAndLowerEV(pkmn,scene,:HP,[ +ItemHandlers::UseOnPokemon.add(:EXPCANDYXL, proc { |item, qty, pkmn, scene| + next pbGainExpFromExpCandy(pkmn, 30_000, qty, scene) +}) + +ItemHandlers::UseOnPokemonMaximum.add(:POMEGBERRY, proc { |item, pkmn| + next pbMaxUsesOfEVLoweringBerry(:HP, pkmn) +}) + +ItemHandlers::UseOnPokemon.add(:POMEGBERRY,proc { |item, qty, pkmn, scene| + next pbRaiseHappinessAndLowerEV(pkmn, scene, :HP, qty, [ _INTL("{1} adores you! Its base HP fell!",pkmn.name), _INTL("{1} became more friendly. Its base HP can't go lower.",pkmn.name), _INTL("{1} became more friendly. However, its base HP fell!",pkmn.name) ]) }) -ItemHandlers::UseOnPokemon.add(:KELPSYBERRY,proc { |item,pkmn,scene| - next pbRaiseHappinessAndLowerEV(pkmn,scene,:ATTACK,[ +ItemHandlers::UseOnPokemonMaximum.add(:KELPSYBERRY, proc { |item, pkmn| + next pbMaxUsesOfEVLoweringBerry(:ATTACK, pkmn) +}) + +ItemHandlers::UseOnPokemon.add(:KELPSYBERRY,proc { |item, qty, pkmn, scene| + next pbRaiseHappinessAndLowerEV(pkmn, scene, :ATTACK, qty, [ _INTL("{1} adores you! Its base Attack fell!",pkmn.name), _INTL("{1} became more friendly. Its base Attack can't go lower.",pkmn.name), _INTL("{1} became more friendly. However, its base Attack fell!",pkmn.name) ]) }) -ItemHandlers::UseOnPokemon.add(:QUALOTBERRY,proc { |item,pkmn,scene| - next pbRaiseHappinessAndLowerEV(pkmn,scene,:DEFENSE,[ +ItemHandlers::UseOnPokemonMaximum.add(:QUALOTBERRY, proc { |item, pkmn| + next pbMaxUsesOfEVLoweringBerry(:DEFENSE, pkmn) +}) + +ItemHandlers::UseOnPokemon.add(:QUALOTBERRY,proc { |item, qty, pkmn, scene| + next pbRaiseHappinessAndLowerEV(pkmn, scene, :DEFENSE, qty, [ _INTL("{1} adores you! Its base Defense fell!",pkmn.name), _INTL("{1} became more friendly. Its base Defense can't go lower.",pkmn.name), _INTL("{1} became more friendly. However, its base Defense fell!",pkmn.name) ]) }) -ItemHandlers::UseOnPokemon.add(:HONDEWBERRY,proc { |item,pkmn,scene| - next pbRaiseHappinessAndLowerEV(pkmn,scene,:SPECIAL_ATTACK,[ +ItemHandlers::UseOnPokemonMaximum.add(:HONDEWBERRY, proc { |item, pkmn| + next pbMaxUsesOfEVLoweringBerry(:SPECIAL_ATTACK, pkmn) +}) + +ItemHandlers::UseOnPokemon.add(:HONDEWBERRY,proc { |item, qty, pkmn, scene| + next pbRaiseHappinessAndLowerEV(pkmn, scene, :SPECIAL_ATTACK, qty, [ _INTL("{1} adores you! Its base Special Attack fell!",pkmn.name), _INTL("{1} became more friendly. Its base Special Attack can't go lower.",pkmn.name), _INTL("{1} became more friendly. However, its base Special Attack fell!",pkmn.name) ]) }) -ItemHandlers::UseOnPokemon.add(:GREPABERRY,proc { |item,pkmn,scene| - next pbRaiseHappinessAndLowerEV(pkmn,scene,:SPECIAL_DEFENSE,[ +ItemHandlers::UseOnPokemonMaximum.add(:GREPABERRY, proc { |item, pkmn| + next pbMaxUsesOfEVLoweringBerry(:SPECIAL_DEFENSE, pkmn) +}) + +ItemHandlers::UseOnPokemon.add(:GREPABERRY,proc { |item, qty, pkmn, scene| + next pbRaiseHappinessAndLowerEV(pkmn, scene, :SPECIAL_DEFENSE, qty, [ _INTL("{1} adores you! Its base Special Defense fell!",pkmn.name), _INTL("{1} became more friendly. Its base Special Defense can't go lower.",pkmn.name), _INTL("{1} became more friendly. However, its base Special Defense fell!",pkmn.name) ]) }) -ItemHandlers::UseOnPokemon.add(:TAMATOBERRY,proc { |item,pkmn,scene| - next pbRaiseHappinessAndLowerEV(pkmn,scene,:SPEED,[ +ItemHandlers::UseOnPokemonMaximum.add(:TAMATOBERRY, proc { |item, pkmn| + next pbMaxUsesOfEVLoweringBerry(:SPEED, pkmn) +}) + +ItemHandlers::UseOnPokemon.add(:TAMATOBERRY,proc { |item, qty, pkmn, scene| + next pbRaiseHappinessAndLowerEV(pkmn, scene, :SPEED, qty, [ _INTL("{1} adores you! Its base Speed fell!",pkmn.name), _INTL("{1} became more friendly. Its base Speed can't go lower.",pkmn.name), _INTL("{1} became more friendly. However, its base Speed fell!",pkmn.name) ]) }) -ItemHandlers::UseOnPokemon.add(:ABILITYCAPSULE,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:ABILITYCAPSULE,proc { |item, qty, pkmn, scene| if scene.pbConfirm(_INTL("Do you want to change {1}'s Ability?", pkmn.name)) abils = pkmn.getAbilityList abil1 = nil @@ -1080,7 +1034,7 @@ ItemHandlers::UseOnPokemon.add(:ABILITYCAPSULE,proc { |item,pkmn,scene| next false }) -ItemHandlers::UseOnPokemon.add(:ABILITYPATCH, proc { |item, pkmn, scene| +ItemHandlers::UseOnPokemon.add(:ABILITYPATCH, proc { |item, qty, pkmn, scene| if scene.pbConfirm(_INTL("Do you want to change {1}'s Ability?", pkmn.name)) abils = pkmn.getAbilityList new_ability_id = nil @@ -1100,7 +1054,7 @@ ItemHandlers::UseOnPokemon.add(:ABILITYPATCH, proc { |item, pkmn, scene| next false }) -ItemHandlers::UseOnPokemon.add(:GRACIDEA,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:GRACIDEA,proc { |item, qty, pkmn, scene| if !pkmn.isSpecies?(:SHAYMIN) || pkmn.form != 0 || pkmn.status == :FROZEN || PBDayNight.isNight? scene.pbDisplay(_INTL("It had no effect.")) @@ -1116,7 +1070,7 @@ ItemHandlers::UseOnPokemon.add(:GRACIDEA,proc { |item,pkmn,scene| next true }) -ItemHandlers::UseOnPokemon.add(:REDNECTAR,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:REDNECTAR,proc { |item, qty, pkmn, scene| if !pkmn.isSpecies?(:ORICORIO) || pkmn.form==0 scene.pbDisplay(_INTL("It had no effect.")) next false @@ -1131,7 +1085,7 @@ ItemHandlers::UseOnPokemon.add(:REDNECTAR,proc { |item,pkmn,scene| next true }) -ItemHandlers::UseOnPokemon.add(:YELLOWNECTAR,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:YELLOWNECTAR,proc { |item, qty, pkmn, scene| if !pkmn.isSpecies?(:ORICORIO) || pkmn.form==1 scene.pbDisplay(_INTL("It had no effect.")) next false @@ -1146,7 +1100,7 @@ ItemHandlers::UseOnPokemon.add(:YELLOWNECTAR,proc { |item,pkmn,scene| next true }) -ItemHandlers::UseOnPokemon.add(:PINKNECTAR,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:PINKNECTAR,proc { |item, qty, pkmn, scene| if !pkmn.isSpecies?(:ORICORIO) || pkmn.form==2 scene.pbDisplay(_INTL("It had no effect.")) next false @@ -1161,7 +1115,7 @@ ItemHandlers::UseOnPokemon.add(:PINKNECTAR,proc { |item,pkmn,scene| next true }) -ItemHandlers::UseOnPokemon.add(:PURPLENECTAR,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:PURPLENECTAR,proc { |item, qty, pkmn, scene| if !pkmn.isSpecies?(:ORICORIO) || pkmn.form==3 scene.pbDisplay(_INTL("It had no effect.")) next false @@ -1176,7 +1130,7 @@ ItemHandlers::UseOnPokemon.add(:PURPLENECTAR,proc { |item,pkmn,scene| next true }) -ItemHandlers::UseOnPokemon.add(:REVEALGLASS,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:REVEALGLASS,proc { |item, qty, pkmn, scene| if !pkmn.isSpecies?(:TORNADUS) && !pkmn.isSpecies?(:THUNDURUS) && !pkmn.isSpecies?(:LANDORUS) @@ -1194,7 +1148,7 @@ ItemHandlers::UseOnPokemon.add(:REVEALGLASS,proc { |item,pkmn,scene| next true }) -ItemHandlers::UseOnPokemon.add(:PRISONBOTTLE,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:PRISONBOTTLE,proc { |item, qty, pkmn, scene| if !pkmn.isSpecies?(:HOOPA) scene.pbDisplay(_INTL("It had no effect.")) next false @@ -1210,7 +1164,7 @@ ItemHandlers::UseOnPokemon.add(:PRISONBOTTLE,proc { |item,pkmn,scene| next true }) -ItemHandlers::UseOnPokemon.add(:ROTOMCATALOG, proc { |item, pkmn, scene| +ItemHandlers::UseOnPokemon.add(:ROTOMCATALOG, proc { |item, qty, pkmn, scene| if !pkmn.isSpecies?(:ROTOM) scene.pbDisplay(_INTL("It had no effect.")) next false @@ -1242,7 +1196,7 @@ ItemHandlers::UseOnPokemon.add(:ROTOMCATALOG, proc { |item, pkmn, scene| next false }) -ItemHandlers::UseOnPokemon.add(:ZYGARDECUBE, proc { |item, pkmn, scene| +ItemHandlers::UseOnPokemon.add(:ZYGARDECUBE, proc { |item, qty, pkmn, scene| if !pkmn.isSpecies?(:ZYGARDE) scene.pbDisplay(_INTL("It had no effect.")) next false @@ -1270,7 +1224,7 @@ ItemHandlers::UseOnPokemon.add(:ZYGARDECUBE, proc { |item, pkmn, scene| next false }) -ItemHandlers::UseOnPokemon.add(:DNASPLICERS,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:DNASPLICERS,proc { |item, qty, pkmn, scene| if !pkmn.isSpecies?(:KYUREM) || !pkmn.fused.nil? scene.pbDisplay(_INTL("It had no effect.")) next false @@ -1308,7 +1262,7 @@ ItemHandlers::UseOnPokemon.add(:DNASPLICERS,proc { |item,pkmn,scene| next true }) -ItemHandlers::UseOnPokemon.add(:DNASPLICERSUSED,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:DNASPLICERSUSED,proc { |item, qty, pkmn, scene| if !pkmn.isSpecies?(:KYUREM) || pkmn.fused.nil? scene.pbDisplay(_INTL("It had no effect.")) next false @@ -1330,7 +1284,7 @@ ItemHandlers::UseOnPokemon.add(:DNASPLICERSUSED,proc { |item,pkmn,scene| next true }) -ItemHandlers::UseOnPokemon.add(:NSOLARIZER,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:NSOLARIZER,proc { |item, qty, pkmn, scene| if !pkmn.isSpecies?(:NECROZMA) || !pkmn.fused.nil? scene.pbDisplay(_INTL("It had no effect.")) next false @@ -1365,7 +1319,7 @@ ItemHandlers::UseOnPokemon.add(:NSOLARIZER,proc { |item,pkmn,scene| next true }) -ItemHandlers::UseOnPokemon.add(:NSOLARIZERUSED,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:NSOLARIZERUSED,proc { |item, qty, pkmn, scene| if !pkmn.isSpecies?(:NECROZMA) || pkmn.form != 1 || pkmn.fused.nil? scene.pbDisplay(_INTL("It had no effect.")) next false @@ -1387,7 +1341,7 @@ ItemHandlers::UseOnPokemon.add(:NSOLARIZERUSED,proc { |item,pkmn,scene| next true }) -ItemHandlers::UseOnPokemon.add(:NLUNARIZER,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:NLUNARIZER,proc { |item, qty, pkmn, scene| if !pkmn.isSpecies?(:NECROZMA) || !pkmn.fused.nil? scene.pbDisplay(_INTL("It had no effect.")) next false @@ -1422,7 +1376,7 @@ ItemHandlers::UseOnPokemon.add(:NLUNARIZER,proc { |item,pkmn,scene| next true }) -ItemHandlers::UseOnPokemon.add(:NLUNARIZERUSED,proc { |item,pkmn,scene| +ItemHandlers::UseOnPokemon.add(:NLUNARIZERUSED,proc { |item, qty, pkmn, scene| if !pkmn.isSpecies?(:NECROZMA) || pkmn.form != 2 || pkmn.fused.nil? scene.pbDisplay(_INTL("It had no effect.")) next false @@ -1444,7 +1398,7 @@ ItemHandlers::UseOnPokemon.add(:NLUNARIZERUSED,proc { |item,pkmn,scene| next true }) -ItemHandlers::UseOnPokemon.add(:REINSOFUNITY, proc { |item, pkmn, scene| +ItemHandlers::UseOnPokemon.add(:REINSOFUNITY, proc { |item, qty, pkmn, scene| if !pkmn.isSpecies?(:CALYREX) || !pkmn.fused.nil? scene.pbDisplay(_INTL("It had no effect.")) next false @@ -1483,7 +1437,7 @@ ItemHandlers::UseOnPokemon.add(:REINSOFUNITY, proc { |item, pkmn, scene| next true }) -ItemHandlers::UseOnPokemon.add(:REINSOFUNITYUSED, proc { |item, pkmn, scene| +ItemHandlers::UseOnPokemon.add(:REINSOFUNITYUSED, proc { |item, qty, pkmn, scene| if !pkmn.isSpecies?(:CALYREX) || pkmn.fused.nil? scene.pbDisplay(_INTL("It had no effect.")) next false