diff --git a/Data/Scripts/010_Data/002_PBS data/006_Item.rb b/Data/Scripts/010_Data/002_PBS data/006_Item.rb index 2d89838f5..bac5a775c 100644 --- a/Data/Scripts/010_Data/002_PBS data/006_Item.rb +++ b/Data/Scripts/010_Data/002_PBS data/006_Item.rb @@ -131,6 +131,7 @@ module GameData def is_gem?; return has_flag?("TypeGem"); end def is_mulch?; return has_flag?("Mulch"); end def is_mega_stone?; return has_flag?("MegaStone"); end # Does NOT include Red Orb/Blue Orb + def is_scent?; return has_flag?("Scent"); end def is_important? return true if is_key_item? || is_HM? || is_TM? diff --git a/Data/Scripts/011_Battle/001_Battle/006_Battle_ActionUseItem.rb b/Data/Scripts/011_Battle/001_Battle/006_Battle_ActionUseItem.rb index 7a29cb8c4..575917e87 100644 --- a/Data/Scripts/011_Battle/001_Battle/006_Battle_ActionUseItem.rb +++ b/Data/Scripts/011_Battle/001_Battle/006_Battle_ActionUseItem.rb @@ -8,13 +8,18 @@ class Battle return false end # Embargo - if battler && battler.effects[PBEffects::Embargo] > 0 + if battler&.effects[PBEffects::Embargo] > 0 if showMessages scene.pbDisplay(_INTL("Embargo's effect prevents the item's use on {1}!", battler.pbThis(true))) end return false end + # Hyper Mode and non-Scents + if pkmn.hyper_mode && !GameData::Item.get(item)&.is_scent? + scene.pbDisplay(_INTL("It won't have any effect.")) if showMessages + return false + end return true end diff --git a/Data/Scripts/013_Items/001_Item_Utilities.rb b/Data/Scripts/013_Items/001_Item_Utilities.rb index 2e99a2db5..ad40f5a62 100644 --- a/Data/Scripts/013_Items/001_Item_Utilities.rb +++ b/Data/Scripts/013_Items/001_Item_Utilities.rb @@ -765,8 +765,8 @@ def pbUseItemMessage(item) end end -def pbCheckUseOnPokemon(_item, pkmn, _screen) - return pkmn && !pkmn.egg? +def pbCheckUseOnPokemon(item, pkmn, _screen) + return pkmn && !pkmn.egg? && (!pkmn.hyper_mode || GameData::Item.get(item)&.is_scent?) end #=============================================================================== diff --git a/Data/Scripts/014_Pokemon/001_Pokemon-related/002_ShadowPokemon_Other.rb b/Data/Scripts/014_Pokemon/001_Pokemon-related/002_ShadowPokemon_Other.rb index 84c077755..79ac93013 100644 --- a/Data/Scripts/014_Pokemon/001_Pokemon-related/002_ShadowPokemon_Other.rb +++ b/Data/Scripts/014_Pokemon/001_Pokemon-related/002_ShadowPokemon_Other.rb @@ -20,6 +20,7 @@ def pbPurify(pkmn, scene) return if !pkmn.shadowPokemon? || pkmn.heart_gauge != 0 $stats.shadow_pokemon_purified += 1 pkmn.shadow = false + pkmn.hyper_mode = false pkmn.giveRibbon(:NATIONAL) scene.pbDisplay(_INTL("{1} opened the door to its heart!", pkmn.name)) old_moves = [] @@ -35,7 +36,7 @@ def pbPurify(pkmn, scene) pkmn.saved_ev = nil end if pkmn.saved_exp - newexp = pkmn.growth_rate.add_exp(pkmn.exp, pkmn.saved_exp || 0) + newexp = pkmn.growth_rate.add_exp(pkmn.exp, (pkmn.saved_exp * 4 / 5) || 0) pkmn.saved_exp = nil newlevel = pkmn.growth_rate.level_from_exp(newexp) curlevel = pkmn.level @@ -232,9 +233,9 @@ end #=============================================================================== # Shadow item effects. #=============================================================================== -def pbRaiseHappinessAndReduceHeart(pkmn, scene, multiplier) +def pbRaiseHappinessAndReduceHeart(pkmn, scene, multiplier, show_fail_message = true) if !pkmn.shadowPokemon? || (pkmn.happiness == 255 && pkmn.heart_gauge == 0) - scene.pbDisplay(_INTL("It won't have any effect.")) + scene.pbDisplay(_INTL("It won't have any effect.")) if show_fail_message return false end old_gauge = pkmn.heart_gauge @@ -254,24 +255,41 @@ def pbRaiseHappinessAndReduceHeart(pkmn, scene, multiplier) end ItemHandlers::UseOnPokemon.add(:JOYSCENT, proc { |item, qty, pkmn, scene| - pbRaiseHappinessAndReduceHeart(pkmn, scene, 1) + ret = false + if pkmn.hyper_mode + scene.pbDisplay(_INTL("{1} came to its senses from the {2}.", pkmn.name, GameData::Item.get(item).name)) + pkmn.hyper_mode = false + ret = true + end + next pbRaiseHappinessAndReduceHeart(pkmn, scene, 1, !ret) || ret }) ItemHandlers::UseOnPokemon.add(:EXCITESCENT, proc { |item, qty, pkmn, scene| - pbRaiseHappinessAndReduceHeart(pkmn, scene, 2) + ret = false + if pkmn.hyper_mode + scene.pbDisplay(_INTL("{1} came to its senses from the {2}.", pkmn.name, GameData::Item.get(item).name)) + pkmn.hyper_mode = false + ret = true + end + next pbRaiseHappinessAndReduceHeart(pkmn, scene, 2, !ret) || ret }) ItemHandlers::UseOnPokemon.add(:VIVIDSCENT, proc { |item, qty, pkmn, scene| - pbRaiseHappinessAndReduceHeart(pkmn, scene, 3) + ret = false + if pkmn.hyper_mode + scene.pbDisplay(_INTL("{1} came to its senses from the {2}.", pkmn.name, GameData::Item.get(item).name)) + pkmn.hyper_mode = false + ret = true + end + next pbRaiseHappinessAndReduceHeart(pkmn, scene, 3, !ret) || ret }) ItemHandlers::UseOnPokemon.add(:TIMEFLUTE, proc { |item, qty, pkmn, scene| - if !pkmn.shadowPokemon? || pkmn.heart_gauge == 0 + if !pkmn.shadowPokemon? || pkmn.heart_gauge == 0 || pkmn.isSpecies?(:LUGIA) scene.pbDisplay(_INTL("It won't have any effect.")) next false end - pkmn.heart_gauge = 0 - pkmn.check_ready_to_purify + pbPurify(pkmn, scene) next true }) diff --git a/Data/Scripts/016_UI/005_UI_Party.rb b/Data/Scripts/016_UI/005_UI_Party.rb index f5e59eeed..5ab2817c2 100644 --- a/Data/Scripts/016_UI/005_UI_Party.rb +++ b/Data/Scripts/016_UI/005_UI_Party.rb @@ -685,6 +685,7 @@ class PokemonParty_Scene ret = screen.pbChooseItemScreen(proc { |item| itm = GameData::Item.get(item) next false if !pbCanUseOnPokemon?(itm) + next false if pokemon.hyper_mode && !GameData::Item.get(item)&.is_scent? if itm.is_machine? move = itm.move next false if pokemon.hasMove?(move) || !pokemon.compatible_with_move?(move)