diff --git a/Data/Scripts/013_Items/001_Item_Utilities.rb b/Data/Scripts/013_Items/001_Item_Utilities.rb index 67ca81e21..c89cb4d95 100644 --- a/Data/Scripts/013_Items/001_Item_Utilities.rb +++ b/Data/Scripts/013_Items/001_Item_Utilities.rb @@ -248,23 +248,23 @@ def pbUseItem(bag, item, bag_screen = nil) end # Only called when in the party screen and having chosen an item to be used on -# the selected Pokémon. -# TODO: Replace all pbMessage and so on in here. scene is the party screen. -def pbUseItemOnPokemon(item, pkmn, scene) +# the selected Pokémon. screen is the party screen. +def pbUseItemOnPokemon(item, pkmn, screen) item_data = GameData::Item.get(item) # TM or HM if item_data.is_machine? - machine = item_data.move - return false if !machine - movename = GameData::Move.get(machine).name + move = item_data.move + return false if !move + move_name = GameData::Move.get(move).name if pkmn.shadowPokemon? - pbMessage(_INTL("Shadow Pokémon can't be taught any moves.")) { scene.pbUpdate } - elsif !pkmn.compatible_with_move?(machine) - pbMessage(_INTL("{1} can't learn {2}.", pkmn.name, movename)) { scene.pbUpdate } + screen.show_message(_INTL("Shadow Pokémon can't be taught any moves.")) + elsif !pkmn.compatible_with_move?(move) + screen.show_message(_INTL("{1} can't learn {2}.", pkmn.name, move_name)) else - pbMessage("\\se[PC access]" + _INTL("You booted up the {1}.", item_data.portion_name) + "\1") { scene.pbUpdate } - if pbConfirmMessage(_INTL("Do you want to teach {1} to {2}?", movename, pkmn.name)) { scene.pbUpdate } - if pbLearnMove(pkmn, machine, false, true) { scene.pbUpdate } + pbSEPlay("PC access") + screen.show_message(_INTL("You booted up the {1}.", item_data.portion_name) + "\1") + if screen.show_confirm_message(_INTL("Do you want to teach {1} to {2}?", move_name, pkmn.name)) + if pbLearnMove(pkmn, move, false, true) { screen.update } $bag.remove(item) if item_data.consumed_after_use? return true end @@ -277,19 +277,19 @@ def pbUseItemOnPokemon(item, pkmn, scene) 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( + qty = screen.choose_number( _INTL("How many {1} do you want to use?", item_data.portion_name_plural), max_at_once ) - scene.set_help_text("") if scene.is_a?(UI::Party) + screen.set_help_text("") end return false if qty <= 0 - ret = ItemHandlers.triggerUseOnPokemon(item, qty, pkmn, scene) - scene.clear_annotations - scene.refresh + ret = ItemHandlers.triggerUseOnPokemon(item, qty, pkmn, screen) + screen.clear_annotations + screen.refresh if ret && item_data.consumed_after_use? $bag.remove(item, qty) if !$bag.has?(item) - pbMessage(_INTL("You used your last {1}.", item_data.portion_name)) { scene.pbUpdate } + screen.show_message(_INTL("You used your last {1}.", item_data.portion_name)) end end return ret @@ -317,80 +317,91 @@ end #=============================================================================== # Give an item to a Pokémon to hold, and take a held item from a Pokémon. #=============================================================================== -# TODO: Replace all pbDisplay and so on in here. -def pbGiveItemToPokemon(item, pkmn, scene, pkmnid = 0) +# screen is either the party screen or the summary screen. +def pbGiveItemToPokemon(item, pkmn, screen, pkmnid = 0) return false if item.nil? - newitemname = GameData::Item.get(item).portion_name + # Check if the Pokémon can hold the item, or have its item removed if it's + # already holding one if pkmn.egg? - scene.pbDisplay(_INTL("Eggs can't hold items.")) + screen.show_message(_INTL("Eggs can't hold items.")) return false elsif pkmn.mail - scene.pbDisplay(_INTL("{1}'s mail must be removed before giving it an item.", pkmn.name)) - return false if !pbTakeItemFromPokemon(pkmn, scene) + screen.show_message(_INTL("{1}'s mail must be removed before giving it an item.", pkmn.name)) + return false if !pbTakeItemFromPokemon(pkmn, screen) end + new_item_name = GameData::Item.get(item).portion_name if pkmn.hasItem? - olditemname = pkmn.item.portion_name - if olditemname.starts_with_vowel? - scene.pbDisplay(_INTL("{1} is already holding an {2}.", pkmn.name, olditemname) + "\1") + # Swap existing held item with the new item + old_item_name = pkmn.item.portion_name + if old_item_name.starts_with_vowel? + screen.show_message(_INTL("{1} is already holding an {2}.", pkmn.name, old_item_name) + "\1") else - scene.pbDisplay(_INTL("{1} is already holding a {2}.", pkmn.name, olditemname) + "\1") + screen.show_message(_INTL("{1} is already holding a {2}.", pkmn.name, old_item_name) + "\1") end - if scene.pbConfirm(_INTL("Would you like to switch the two items?")) + if screen.show_confirm_message(_INTL("Would you like to switch the two items?")) $bag.remove(item) if !$bag.add(pkmn.item) raise _INTL("Couldn't re-store deleted item in Bag somehow") if !$bag.add(item) - scene.pbDisplay(_INTL("The Bag is full. The Pokémon's item could not be removed.")) + screen.show_message(_INTL("The Bag is full. The Pokémon's item could not be removed.")) elsif GameData::Item.get(item).is_mail? - if pbWriteMail(item, pkmn, pkmnid, scene) + if pbWriteMail(item, pkmn, pkmnid, screen) pkmn.item = item - scene.pbDisplay(_INTL("Took the {1} from {2} and gave it the {3}.", olditemname, pkmn.name, newitemname)) + screen.show_message(_INTL("Took the {1} from {2} and gave it the {3}.", old_item_name, pkmn.name, new_item_name)) return true elsif !$bag.add(item) raise _INTL("Couldn't re-store deleted item in Bag somehow") end else pkmn.item = item - scene.pbDisplay(_INTL("Took the {1} from {2} and gave it the {3}.", olditemname, pkmn.name, newitemname)) + screen.show_message(_INTL("Took the {1} from {2} and gave it the {3}.", old_item_name, pkmn.name, new_item_name)) return true end end - elsif !GameData::Item.get(item).is_mail? || pbWriteMail(item, pkmn, pkmnid, scene) + elsif !GameData::Item.get(item).is_mail? || pbWriteMail(item, pkmn, pkmnid, screen) + # Give the new item $bag.remove(item) pkmn.item = item - scene.pbDisplay(_INTL("{1} is now holding the {2}.", pkmn.name, newitemname)) + screen.show_message(_INTL("{1} is now holding the {2}.", pkmn.name, new_item_name)) return true end return false end -# TODO: Replace all pbDisplay and so on in here. -def pbTakeItemFromPokemon(pkmn, scene) +# screen is either the party screen or the summary screen. +def pbTakeItemFromPokemon(pkmn, screen) ret = false + # Check if the Pokémon has an item to remove, and whether the item can be put + # in the Bag if !pkmn.hasItem? - scene.pbDisplay(_INTL("{1} isn't holding anything.", pkmn.name)) + screen.show_message(_INTL("{1} isn't holding anything.", pkmn.name)) + return false elsif !$bag.can_add?(pkmn.item) - scene.pbDisplay(_INTL("The Bag is full. The Pokémon's item could not be removed.")) - elsif pkmn.mail - if scene.pbConfirm(_INTL("Save the removed mail in your PC?")) + screen.show_message(_INTL("The Bag is full. The Pokémon's item could not be removed.")) + return false + end + if pkmn.mail + # Remove a mail item + if screen.show_confirm_message(_INTL("Save the removed mail in your PC?")) if pbMoveToMailbox(pkmn) pkmn.item = nil - scene.pbDisplay(_INTL("The mail was saved in your PC.")) + screen.show_message(_INTL("The mail was saved in your PC.")) ret = true else - scene.pbDisplay(_INTL("Your PC's Mailbox is full.")) + screen.show_message(_INTL("Your PC's Mailbox is full.")) end - elsif scene.pbConfirm(_INTL("If the mail is removed, its message will be lost. OK?")) + elsif screen.show_confirm_message(_INTL("If the mail is removed, its message will be lost. OK?")) item_name = pkmn.item.portion_name $bag.add(pkmn.item) pkmn.item = nil - scene.pbDisplay(_INTL("Received the {1} from {2}.", item_name, pkmn.name)) + screen.show_message(_INTL("Received the {1} from {2}.", item_name, pkmn.name)) ret = true end else + # Remove a regular item item_name = pkmn.item.portion_name $bag.add(pkmn.item) pkmn.item = nil - scene.pbDisplay(_INTL("Received the {1} from {2}.", item_name, pkmn.name)) + screen.show_message(_INTL("Received the {1} from {2}.", item_name, pkmn.name)) ret = true end return ret diff --git a/Data/Scripts/013_Items/002_Item_Effects.rb b/Data/Scripts/013_Items/002_Item_Effects.rb index 092d90531..f14065617 100644 --- a/Data/Scripts/013_Items/002_Item_Effects.rb +++ b/Data/Scripts/013_Items/002_Item_Effects.rb @@ -368,7 +368,8 @@ ItemHandlers::UseFromBag.addIf(:move_machines, item_data = GameData::Item.get(item) move = item_data.move next 0 if !move - pbMessage("\\se[PC access]" + _INTL("You booted up the {1}.", item_data.name) + "\1") + pbSEPlay("PC access") + pbMessage(_INTL("You booted up the {1}.", item_data.portion_name) + "\1") next 0 if !pbConfirmMessage(_INTL("Do you want to teach {1} to a Pokémon?", GameData::Move.get(move).name)) next 1 if pbMoveTutorChoose(move, nil, true, item_data.is_TR?) diff --git a/Data/Scripts/014_Pokemon/005_Pokemon_Owner.rb b/Data/Scripts/014_Pokemon/005_Pokemon_Owner.rb index 08d4f9f6b..12b30930a 100644 --- a/Data/Scripts/014_Pokemon/005_Pokemon_Owner.rb +++ b/Data/Scripts/014_Pokemon/005_Pokemon_Owner.rb @@ -59,6 +59,14 @@ class Pokemon @gender = new_gender end + def male? + return @gender == 0 + end + + def female? + return @gender == 1 + end + # @param new_language [Integer] new owner language def language=(new_language) validate new_language => Integer diff --git a/Data/Scripts/016_UI/024_UI_MysteryGift.rb b/Data/Scripts/016_UI/024_UI_MysteryGift.rb index 4296cec91..8ad0f2849 100644 --- a/Data/Scripts/016_UI/024_UI_MysteryGift.rb +++ b/Data/Scripts/016_UI/024_UI_MysteryGift.rb @@ -226,7 +226,7 @@ def pbRefreshMGCommands(master, online) elsif gift[1] > 0 itemname = GameData::Item.get(gift[2]).name + sprintf(" x%d", gift[1]) end - ontext = ["[ ]", "[X]"][(online.include?(gift[0])) ? 1 : 0] + ontext = ["[ ]", "[Y]"][(online.include?(gift[0])) ? 1 : 0] commands.push(_INTL("{1} {2}: {3} ({4})", ontext, gift[0], gift[3], itemname)) end commands.push(_INTL("Export selected to file")) diff --git a/Data/Scripts/016b_UI redesign/000_UI_base.rb b/Data/Scripts/016b_UI redesign/000_UI_base.rb index 2e219d1f3..302c43894 100644 --- a/Data/Scripts/016b_UI redesign/000_UI_base.rb +++ b/Data/Scripts/016b_UI redesign/000_UI_base.rb @@ -361,11 +361,15 @@ module UI #--------------------------------------------------------------------------- def fade_in - pbFadeInAndShow(@sprites)# { update_visuals } + # TODO: pbFadeInAndShow changes the colour of all sprites. Make it instead + # change the opacity of @viewport like def pbFadeOutIn. + pbFadeInAndShow(@sprites) end def fade_out - pbFadeOutAndHide(@sprites)# { update_visuals } + # TODO: pbFadeOutAndHide changes the colour of all sprites. Make it + # instead change the opacity of @viewport like def pbFadeOutIn. + pbFadeOutAndHide(@sprites) end def dispose @@ -490,7 +494,9 @@ module UI end end @sprites[:speech_box].visible = false - ret = options.keys[ret] if options.is_a?(Hash) + if options.is_a?(Hash) + ret = (ret < 0) ? nil : options.keys[ret] + end return ret end diff --git a/Data/Scripts/016b_UI redesign/005_UI_Party.rb b/Data/Scripts/016b_UI redesign/005_UI_Party.rb index 27d4ab71c..9c7963905 100644 --- a/Data/Scripts/016b_UI redesign/005_UI_Party.rb +++ b/Data/Scripts/016b_UI redesign/005_UI_Party.rb @@ -1,6 +1,6 @@ -# TODO: Rewrite def pbUseItemOnPokemon and all the ItemHandlers to stop using -# pbDisplay and whatnot, and ensure they do whatever is appropriate when -# being called with a screen of UI::Party. +# TODO: Rewrite all the ItemHandlers to stop using pbDisplay and whatnot, and +# ensure they do whatever is appropriate when being called with a screen +# of UI::Party. #=============================================================================== # #=============================================================================== @@ -223,6 +223,7 @@ class UI::PartyVisualsPanel < UI::SpriteContainer bar_total_width = 96 bar_width = [@pokemon.hp * bar_total_width / @pokemon.totalhp.to_f, 1.0].max bar_width = ((bar_width / 2).round) * 2 # Make the bar's length a multiple of 2 pixels + bar_width -= 2 if bar_width == bar_total_width && @pokemon.hp < @pokemon.totalhp hp_zone = 0 # Green hp_zone = 1 if @pokemon.hp <= (@pokemon.totalhp / 2).floor # Yellow hp_zone = 2 if @pokemon.hp <= (@pokemon.totalhp / 4).floor # Red @@ -344,8 +345,8 @@ class UI::PartyVisuals < UI::BaseVisuals def initialize_message_box super @sprites[:help_window] = Window_AdvancedTextPokemon.new("") - @sprites[:help_window].viewport = @viewport - @sprites[:help_window].z = 1500 + @sprites[:help_window].viewport = @viewport + @sprites[:help_window].z = 1500 @sprites[:help_window].setSkin(MessageConfig.pbGetSpeechFrame) pbBottomLeftLines(@sprites[:help_window], 1, 396) end @@ -657,13 +658,9 @@ class UI::PartyVisuals < UI::BaseVisuals pbPlayCloseMenuSE return :quit elsif @sub_mode == :switch_pokemon - pbPlayDecisionSE return :switch_pokemon_start elsif @sub_mode == :switch_items - if @party[@index].hasItem? - pbPlayDecisionSE - return :item_move - end + return :item_move if @party[@index].hasItem? end pbPlayDecisionSE return :interact_menu @@ -673,13 +670,8 @@ class UI::PartyVisuals < UI::BaseVisuals return :screen_menu end when Input::BACK - if switching? - pbPlayCancelSE - return :switch_pokemon_cancel - elsif (@sub_mode || :normal) != :normal - pbPlayCancelSE - return :clear_sub_mode - end + return :switch_pokemon_cancel if switching? + return :clear_sub_mode if (@sub_mode || :normal) != :normal pbPlayCloseMenuSE return :quit end @@ -714,13 +706,9 @@ class UI::PartyVisuals < UI::BaseVisuals case input when Input::USE if @index == Settings::MAX_PARTY_SIZE - if @multi_select # Confirm - pbPlayDecisionSE - return :confirm - else # Cancel - (switching?) ? pbPlayCancelSE : pbPlayCloseMenuSE - return :quit - end + return :confirm if @multi_select # Confirm + (switching?) ? pbPlayCancelSE : pbPlayCloseMenuSE + return :quit elsif @index == Settings::MAX_PARTY_SIZE + 1 # Cancel (switching?) ? pbPlayCancelSE : pbPlayCloseMenuSE return :quit @@ -764,8 +752,6 @@ class UI::Party < UI::BaseScreen # :battle_use_item For battle. # :use_item Like :choose_pokemon but with a different help text # :teach_pokemon Like :choose_pokemon but with a different help text - - # :choose_entry_order Battle Frontier thing def initialize(party, mode: :normal) @party = (party.is_a?(Array)) ? party : [party] @@ -1002,7 +988,6 @@ class UI::Party < UI::BaseScreen end if (@able_proc && !@able_proc.call(pokemon)) || (@able_proc2 && !@able_proc2.call(pokemon)) - pbPlayDecisionSE if pokemon.egg? show_message(_INTL("This egg can't be chosen.")) else @@ -1063,7 +1048,6 @@ class UI::Party < UI::BaseScreen command = @visuals.navigate_choose_pokemon case command when :chosen - pbPlayDecisionSE commands = {} commands[:enter] = _INTL("Entry") if (statuses[index] || 0) == 1 # Not entered yet commands[:not_enter] = _INTL("No Entry") if (statuses[index] || 0) > 2 # Already entered @@ -1153,6 +1137,7 @@ UIActionHandlers.add(UI::Party::SCREEN_ID, :debug, { UIActionHandlers.add(UI::Party::SCREEN_ID, :switch_pokemon_start, { :effect => proc { |screen| + pbPlayDecisionSE screen.start_switching } }) @@ -1165,6 +1150,7 @@ UIActionHandlers.add(UI::Party::SCREEN_ID, :switch_pokemon_end, { UIActionHandlers.add(UI::Party::SCREEN_ID, :switch_pokemon_cancel, { :effect => proc { |screen| + pbPlayCancelSE screen.end_switching } }) @@ -1225,8 +1211,7 @@ UIActionHandlers.add(UI::Party::SCREEN_ID, :item_give, { UIActionHandlers.add(UI::Party::SCREEN_ID, :item_take, { :effect => proc { |screen| pkmn = screen.pokemon - next if !pbTakeItemFromPokemon(pkmn, screen) - screen.refresh + screen.refresh if pbTakeItemFromPokemon(pkmn, screen) } }) @@ -1234,6 +1219,7 @@ UIActionHandlers.add(UI::Party::SCREEN_ID, :item_take, { # (here) has the whole switching process in this handler. Be consistent. UIActionHandlers.add(UI::Party::SCREEN_ID, :item_move, { :effect => proc { |screen| + pbPlayDecisionSE old_pkmn = screen.pokemon old_item = old_pkmn.item old_item_name = old_item.name @@ -1248,7 +1234,6 @@ UIActionHandlers.add(UI::Party::SCREEN_ID, :item_move, { screen.end_switching break end - pbPlayDecisionSE new_pkmn = screen.party[new_party_idx] if new_pkmn.egg? screen.show_message(_INTL("Eggs can't hold items.")) @@ -1307,14 +1292,13 @@ UIActionHandlers.add(UI::Party::SCREEN_ID, :mail_read, { UIActionHandlers.add(UI::Party::SCREEN_ID, :mail_take, { :effect => proc { |screen| - if pbTakeItemFromPokemon(screen.pokemon, screen) - screen.refresh - end + screen.refresh if pbTakeItemFromPokemon(screen.pokemon, screen) } }) UIActionHandlers.add(UI::Party::SCREEN_ID, :clear_sub_mode, { :effect => proc { |screen| + pbPlayCancelSE screen.set_sub_mode(:normal) } }) diff --git a/Data/Scripts/016b_UI redesign/006_UI_Summary.rb b/Data/Scripts/016b_UI redesign/006_UI_Summary.rb index c7dbb2621..283283545 100644 --- a/Data/Scripts/016b_UI redesign/006_UI_Summary.rb +++ b/Data/Scripts/016b_UI redesign/006_UI_Summary.rb @@ -358,10 +358,13 @@ class UI::PokemonSummaryVisuals < UI::BaseVisuals break if i == @party_index @visible_index += 1 end - # Want to stay on the nth page, or the closest available one + # Want to stay on the same page, or the nth page if that no longer exists, + # or the closest available one pages = all_pages - new_page_index = old_page_index.clamp(0, pages.length - 1) - @page = pages[new_page_index] + if !pages.include?(@page) + new_page_index = old_page_index.clamp(0, pages.length - 1) + @page = pages[new_page_index] + end # Set the Pokémon's sprite @sprites[:pokemon].setPokemonBitmap(@pokemon) @ribbon_offset = 0 @@ -568,6 +571,7 @@ class UI::PokemonSummaryVisuals < UI::BaseVisuals bar_total_width = 128 bar_width = [@pokemon.hp * bar_total_width / @pokemon.totalhp.to_f, 1.0].max bar_width = ((bar_width / 2).round) * 2 # Make the bar's length a multiple of 2 pixels + bar_width -= 2 if bar_width == bar_total_width && @pokemon.hp < @pokemon.totalhp hp_zone = 0 # Green hp_zone = 1 if @pokemon.hp <= (@pokemon.totalhp / 2).floor # Yellow hp_zone = 2 if @pokemon.hp <= (@pokemon.totalhp / 4).floor # Red @@ -1075,13 +1079,9 @@ class UI::PokemonSummaryVisuals < UI::BaseVisuals pbPlayDecisionSE return :navigate_moves when :ribbons - pbPlayDecisionSE return :navigate_ribbons else - if @mode != :in_battle - pbPlayDecisionSE - return :interact_menu - end + return :interact_menu if @mode != :in_battle end when Input::ACTION @pokemon.play_cry if !@pokemon.egg? @@ -1459,6 +1459,8 @@ UIActionHandlers.add(UI::PokemonSummary::SCREEN_ID, :go_to_next_pokemon, { UIActionHandlers.add(UI::PokemonSummary::SCREEN_ID, :navigate_moves, { :returns_value => true, :effect => proc { |screen| + # NOTE: Doesn't have pbPlayDecisionSE here because this is also called by + # def choose_move, which plays its own SE at the same time. move_index = screen.visuals.navigate_moves next move_index if screen.mode == :choose_move screen.refresh @@ -1468,6 +1470,7 @@ UIActionHandlers.add(UI::PokemonSummary::SCREEN_ID, :navigate_moves, { UIActionHandlers.add(UI::PokemonSummary::SCREEN_ID, :navigate_ribbons, { :effect => proc { |screen| + pbPlayDecisionSE screen.visuals.navigate_ribbons screen.refresh } diff --git a/Data/Scripts/016b_UI redesign/007_UI_Bag.rb b/Data/Scripts/016b_UI redesign/007_UI_Bag.rb index 430930b65..920b64e72 100644 --- a/Data/Scripts/016b_UI redesign/007_UI_Bag.rb +++ b/Data/Scripts/016b_UI redesign/007_UI_Bag.rb @@ -648,13 +648,9 @@ class UI::BagVisuals < UI::BaseVisuals def update_interaction(input) case input when Input::USE - if switching? - pbPlayDecisionSE - return :switch_item_end - elsif @sub_mode == :rearrange_items && item && pocket_sortable? - pbPlayDecisionSE - return :switch_item_start - elsif !item # "CLOSE BAG" + return :switch_item_end if switching? + return :switch_item_start if @sub_mode == :rearrange_items && item && pocket_sortable? + if !item # "CLOSE BAG" pbPlayCloseMenuSE return :quit end @@ -662,10 +658,8 @@ class UI::BagVisuals < UI::BaseVisuals return :interact_menu when Input::ACTION if item - if switching? - pbPlayDecisionSE - return :switch_item_end - elsif @pocket == :Machines + return :switch_item_end if switching? + if @pocket == :Machines pbPlayDecisionSE @show_move_details = !@show_move_details refresh_move_details @@ -676,13 +670,8 @@ class UI::BagVisuals < UI::BaseVisuals end end when Input::BACK - if switching? - pbPlayCancelSE - return :switch_item_cancel - elsif (@sub_mode || :normal) != :normal && pocket_sortable? - pbPlayCancelSE - return :clear_sub_mode - end + return :switch_item_cancel if switching? + return :clear_sub_mode if (@sub_mode || :normal) != :normal && pocket_sortable? pbPlayCloseMenuSE return :quit end @@ -719,12 +708,9 @@ class UI::BagVisuals < UI::BaseVisuals def update_interaction_choose_item(input) case input when Input::USE - if !item # "CLOSE BAG" - pbPlayCloseMenuSE - return :quit - end - pbPlayDecisionSE - return :chosen + return :chosen if item + pbPlayCloseMenuSE + return :quit when Input::ACTION if item && @pocket == :Machines pbPlayDecisionSE @@ -829,8 +815,12 @@ class UI::Bag < UI::BaseScreen loop do on_start_main_loop chosen_item = choose_item_core - if chosen_item && block_given? - next if !yield chosen_item + if chosen_item + if block_given? + next if !yield chosen_item + else + pbPlayDecisionSE + end end @result = chosen_item break @@ -859,18 +849,21 @@ UIActionHandlers.add(UI::Bag::SCREEN_ID, :screen_menu, { UIActionHandlers.add(UI::Bag::SCREEN_ID, :switch_item_start, { :effect => proc { |screen| + pbPlayDecisionSE screen.start_switching } }) UIActionHandlers.add(UI::Bag::SCREEN_ID, :switch_item_end, { :effect => proc { |screen| + pbPlayDecisionSE screen.switch_items(screen.switch_index, screen.index) } }) UIActionHandlers.add(UI::Bag::SCREEN_ID, :switch_item_cancel, { :effect => proc { |screen| + pbPlayCancelSE screen.cancel_switching } }) @@ -883,6 +876,7 @@ UIActionHandlers.add(UI::Bag::SCREEN_ID, :rearrange_items_mode, { UIActionHandlers.add(UI::Bag::SCREEN_ID, :clear_sub_mode, { :effect => proc { |screen| + pbPlayCancelSE screen.set_sub_mode(:normal) } }) diff --git a/Data/Scripts/016c_UI_old/020_UI_old_PokeMart.rb b/Data/Scripts/016c_UI_old/020_UI_old_PokeMart.rb index 54d335712..7e2732715 100644 --- a/Data/Scripts/016c_UI_old/020_UI_old_PokeMart.rb +++ b/Data/Scripts/016c_UI_old/020_UI_old_PokeMart.rb @@ -281,10 +281,6 @@ class PokemonMart_Scene end def pbStartSellScene2(bag, adapter) - # TODO: Don't have a subscene. Make a new BagVisuals class for choosing an - # item to sell, and open that. It can inherit from class - # UI::BagVisuals and add the money window (that may be all that needs - # adding). @subscene = PokemonBag_Scene.new @adapter = adapter @viewport2 = Viewport.new(0, 0, Graphics.width, Graphics.height) diff --git a/Data/Scripts/019_Utilities/001_Utilities.rb b/Data/Scripts/019_Utilities/001_Utilities.rb index 44486b519..c9c65c18b 100644 --- a/Data/Scripts/019_Utilities/001_Utilities.rb +++ b/Data/Scripts/019_Utilities/001_Utilities.rb @@ -60,6 +60,11 @@ def pbGetLanguage return 2 # Use 'English' by default end +def pbChooseLanguage + commands = Settings::LANGUAGES.map { |val| val[0] } + return pbShowCommands(nil, commands) +end + # Converts a Celsius temperature to Fahrenheit. def toFahrenheit(celsius) return (celsius * 9.0 / 5.0).round + 32 @@ -595,14 +600,6 @@ def pbLoadRpgxpScene(scene) Graphics.transition end -def pbChooseLanguage - commands = [] - Settings::LANGUAGES.each do |lang| - commands.push(lang[0]) - end - return pbShowCommands(nil, commands) -end - def pbScreenCapture t = Time.now filestart = t.strftime("[%Y-%m-%d] %H_%M_%S.%L") diff --git a/Data/Scripts/020_Debug/003_Debug menus/001_Debug_Menus.rb b/Data/Scripts/020_Debug/003_Debug menus/001_Debug_Menus.rb index 0c0047648..86ca4e4eb 100644 --- a/Data/Scripts/020_Debug/003_Debug menus/001_Debug_Menus.rb +++ b/Data/Scripts/020_Debug/003_Debug menus/001_Debug_Menus.rb @@ -159,7 +159,7 @@ module PokemonDebugMixin # Main loop command = 0 loop do - command = pbShowCommands(_INTL("Do what with {1}?", pkmn.name), commands.list, command) + command = show_menu(_INTL("Do what with {1}?", pkmn.name), commands.list, command) if command < 0 parent = commands.getParent break if !parent @@ -422,8 +422,41 @@ end #=============================================================================== # #=============================================================================== -class PokemonDebugPartyScreen +class UI::PartyDebugVisuals < UI::BaseVisuals + def initialize_background; end + def initialize_overlay; end + + def choose_number(help_text, maximum, init_value = 1) + old_letter_by_letter = @sprites[:speech_box].letterbyletter + @sprites[:speech_box].letterbyletter = false + ret = super + @sprites[:speech_box].letterbyletter = old_letter_by_letter + return ret + end +end + +class UI::PartyDebug < UI::BaseScreen include PokemonDebugMixin + + def initialize_visuals + @visuals = UI::PartyDebugVisuals.new + end + + def choose_move(pkmn, message, index = 0) + # TODO: The move names can get rather wide, making the message box rather + # thin. It's just about acceptable, but maybe the choice window needs + # to be displayed above the message box instead of to the right of it. + move_names = [] + pkmn.moves.each do |move| + next if !move || !move.id + if move.total_pp <= 0 + move_names.push(_INTL("{1} (PP: ---)", move.name)) + else + move_names.push(_INTL("{1} (PP: {2}/{3})", move.name, move.pp, move.total_pp)) + end + end + return show_menu(message, move_names, index) + end end #=============================================================================== diff --git a/Data/Scripts/020_Debug/003_Debug menus/002_Debug_MenuCommands.rb b/Data/Scripts/020_Debug/003_Debug menus/002_Debug_MenuCommands.rb index 723c80696..2e36b99b3 100644 --- a/Data/Scripts/020_Debug/003_Debug menus/002_Debug_MenuCommands.rb +++ b/Data/Scripts/020_Debug/003_Debug menus/002_Debug_MenuCommands.rb @@ -354,9 +354,9 @@ MenuHandlers.add(:debug_menu, :test_wild_battle_advanced, { end else # Edit a Pokémon if pbConfirmMessage(_INTL("Change this Pokémon?")) - scr = PokemonDebugPartyScreen.new + scr = UI::PartyDebug.new scr.pokemon_debug_menu(pkmn[pkmnCmd], -1, nil, true) - scr.pbEndScreen + scr.silent_end_screen elsif pbConfirmMessage(_INTL("Delete this Pokémon?")) pkmn.delete_at(pkmnCmd) size0 = [pkmn.length, 1].max diff --git a/Data/Scripts/020_Debug/003_Debug menus/003_Debug_MenuExtraCode.rb b/Data/Scripts/020_Debug/003_Debug menus/003_Debug_MenuExtraCode.rb index 8bd001dc3..caa52063c 100644 --- a/Data/Scripts/020_Debug/003_Debug menus/003_Debug_MenuExtraCode.rb +++ b/Data/Scripts/020_Debug/003_Debug menus/003_Debug_MenuExtraCode.rb @@ -762,134 +762,3 @@ def pbCheckTileValidity(tile_id, map, tilesets, passages) end return false end - -#=============================================================================== -# Pseudo-party screen for editing Pokémon being set up for a wild battle. -# TODO: Rewrite this with the new UI code. -#=============================================================================== -class PokemonDebugPartyScreen - def initialize - @viewport = Viewport.new(0, 0, Graphics.width, Graphics.height) - @viewport.z = 99999 - @messageBox = Window_AdvancedTextPokemon.new("") - @messageBox.viewport = @viewport - @messageBox.visible = false - @messageBox.letterbyletter = true - pbBottomLeftLines(@messageBox, 2) - @helpWindow = Window_UnformattedTextPokemon.new("") - @helpWindow.viewport = @viewport - @helpWindow.visible = true - pbBottomLeftLines(@helpWindow, 1) - end - - def pbEndScreen - @messageBox.dispose - @helpWindow.dispose - @viewport.dispose - end - - def pbDisplay(text) - @messageBox.text = text - @messageBox.visible = true - @helpWindow.visible = false - pbPlayDecisionSE - loop do - Graphics.update - Input.update - pbUpdate - if @messageBox.busy? - if Input.trigger?(Input::USE) - pbPlayDecisionSE if @messageBox.pausing? - @messageBox.resume - end - else - if Input.trigger?(Input::BACK) || Input.trigger?(Input::USE) - break - end - end - end - @messageBox.visible = false - @helpWindow.visible = true - end - - def pbConfirm(text) - ret = -1 - @messageBox.text = text - @messageBox.visible = true - @helpWindow.visible = false - using(cmdwindow = Window_CommandPokemon.new([_INTL("Yes"), _INTL("No")])) do - cmdwindow.visible = false - pbBottomRight(cmdwindow) - cmdwindow.y -= @messageBox.height - cmdwindow.z = @viewport.z + 1 - loop do - Graphics.update - Input.update - cmdwindow.visible = true if !@messageBox.busy? - cmdwindow.update - pbUpdate - if !@messageBox.busy? - if Input.trigger?(Input::BACK) - ret = false - break - elsif Input.trigger?(Input::USE) && @messageBox.resume - ret = (cmdwindow.index == 0) - break - end - end - end - end - @messageBox.visible = false - @helpWindow.visible = true - return ret - end - - def pbShowCommands(text, commands, index = 0) - ret = -1 - @helpWindow.visible = true - using(cmdwindow = Window_CommandPokemonColor.new(commands)) do - cmdwindow.z = @viewport.z + 1 - cmdwindow.index = index - pbBottomRight(cmdwindow) - @helpWindow.resizeHeightToFit(text, Graphics.width - cmdwindow.width) - @helpWindow.text = text - pbBottomLeft(@helpWindow) - loop do - Graphics.update - Input.update - cmdwindow.update - pbUpdate - if Input.trigger?(Input::BACK) - pbPlayCancelSE - ret = -1 - break - elsif Input.trigger?(Input::USE) - pbPlayDecisionSE - ret = cmdwindow.index - break - end - end - end - return ret - end - - def pbChooseMove(pkmn, text, index = 0) - moveNames = [] - pkmn.moves.each do |i| - if i.total_pp <= 0 - moveNames.push(_INTL("{1} (PP: ---)", i.name)) - else - moveNames.push(_INTL("{1} (PP: {2}/{3})", i.name, i.pp, i.total_pp)) - end - end - return pbShowCommands(text, moveNames, index) - end - - def pbRefreshSingle(index); end - - def update - @messageBox.update - @helpWindow.update - end - alias pbUpdate update -end diff --git a/Data/Scripts/020_Debug/003_Debug menus/007_Debug_PokemonCommands.rb b/Data/Scripts/020_Debug/003_Debug menus/007_Debug_PokemonCommands.rb index 471b628c4..be8439297 100644 --- a/Data/Scripts/020_Debug/003_Debug menus/007_Debug_PokemonCommands.rb +++ b/Data/Scripts/020_Debug/003_Debug menus/007_Debug_PokemonCommands.rb @@ -1,5 +1,3 @@ -# TODO: Rewrite all code in here to replace pbDisplay and whatnot, once storage -# screen and PokemonDebugPartyScreen have been rewritten. #=============================================================================== # HP/Status options. #=============================================================================== @@ -12,20 +10,18 @@ MenuHandlers.add(:pokemon_debug_menu, :hp_status_menu, { MenuHandlers.add(:pokemon_debug_menu, :set_hp, { "name" => _INTL("Set HP"), "parent" => :hp_status_menu, - "effect" => proc { |pkmn, pkmnid, heldpoke, settingUpBattle, screen| + "effect" => proc { |pkmn, party_index, held_pkmn, setting_up_battle, screen| if pkmn.egg? - screen.pbDisplay(_INTL("{1} is an egg.", pkmn.name)) - else - params = ChooseNumberParams.new - params.setRange(0, pkmn.totalhp) - params.setDefaultValue(pkmn.hp) - newhp = pbMessageChooseNumber( - _INTL("Set {1}'s HP (max. {2}).", pkmn.name, pkmn.totalhp), params - ) { screen.pbUpdate } - if newhp != pkmn.hp - pkmn.hp = newhp - screen.pbRefreshSingle(pkmnid) - end + screen.show_message(_INTL("{1} is an egg.", pkmn.name)) + next false + end + params = ChooseNumberParams.new + params.setRange(0, pkmn.totalhp) + params.setDefaultValue(pkmn.hp) + new_hp = screen.choose_number("\\se[]" + _INTL("Set the Pokémon's HP (max. {1}).", params.maxNumber), params) + if new_hp != pkmn.hp + pkmn.hp = new_hp + screen.refresh end next false } @@ -34,49 +30,44 @@ MenuHandlers.add(:pokemon_debug_menu, :set_hp, { MenuHandlers.add(:pokemon_debug_menu, :set_status, { "name" => _INTL("Set status"), "parent" => :hp_status_menu, - "effect" => proc { |pkmn, pkmnid, heldpoke, settingUpBattle, screen| + "effect" => proc { |pkmn, party_index, held_pkmn, setting_up_battle, screen| if pkmn.egg? - screen.pbDisplay(_INTL("{1} is an egg.", pkmn.name)) + screen.show_message(_INTL("{1} is an egg.", pkmn.name)) + next false elsif pkmn.hp <= 0 - screen.pbDisplay(_INTL("{1} is fainted, can't change status.", pkmn.name)) - else - cmd = 0 - commands = [_INTL("[Cure]")] - ids = [:NONE] - GameData::Status.each do |s| - next if s.id == :NONE - commands.push(_INTL("Set {1}", s.name)) - ids.push(s.id) + screen.show_message(_INTL("{1} is fainted, can't change status.", pkmn.name)) + next false + end + commands = {:NONE => _INTL("[Cure]")} + GameData::Status.each do |s| + commands[s.id] = _INTL("Set {1}", s.name) if s.id != :NONE + end + cmd = commands.keys.first + loop do + msg = _INTL("Current status: {1}", GameData::Status.get(pkmn.status).name) + if pkmn.status == :SLEEP + msg = _INTL("Current status: {1} (turns: {2})", GameData::Status.get(pkmn.status).name, pkmn.statusCount) end - loop do - msg = _INTL("Current status: {1}", GameData::Status.get(pkmn.status).name) - if pkmn.status == :SLEEP - msg = _INTL("Current status: {1} (turns: {2})", - GameData::Status.get(pkmn.status).name, pkmn.statusCount) + cmd = screen.show_menu(msg, commands, commands.keys.index(cmd)) + break if cmd.nil? + case cmd + when :NONE # Cure + pkmn.heal_status + screen.refresh + else # Give status problem + count = 0 + cancel = false + if cmd == :SLEEP + params = ChooseNumberParams.new + params.setRange(0, 9) + params.setDefaultValue(3) + count = screen.choose_number("\\se[]" + _INTL("Set the Pokémon's sleep count."), params) + cancel = true if count <= 0 end - cmd = screen.pbShowCommands(msg, commands, cmd) - break if cmd < 0 - case cmd - when 0 # Cure - pkmn.heal_status - screen.pbRefreshSingle(pkmnid) - else # Give status problem - count = 0 - cancel = false - if ids[cmd] == :SLEEP - params = ChooseNumberParams.new - params.setRange(0, 9) - params.setDefaultValue(3) - count = pbMessageChooseNumber( - _INTL("Set the Pokémon's sleep count."), params - ) { screen.pbUpdate } - cancel = true if count <= 0 - end - if !cancel - pkmn.status = ids[cmd] - pkmn.statusCount = count - screen.pbRefreshSingle(pkmnid) - end + if !cancel + pkmn.status = cmd + pkmn.statusCount = count + screen.refresh end end end @@ -87,13 +78,12 @@ MenuHandlers.add(:pokemon_debug_menu, :set_status, { MenuHandlers.add(:pokemon_debug_menu, :full_heal, { "name" => _INTL("Fully heal"), "parent" => :hp_status_menu, - "effect" => proc { |pkmn, pkmnid, heldpoke, settingUpBattle, screen| + "effect" => proc { |pkmn, party_index, held_pkmn, setting_up_battle, screen| if pkmn.egg? - screen.pbDisplay(_INTL("{1} is an egg.", pkmn.name)) + screen.show_message(_INTL("{1} is an egg.", pkmn.name)) else pkmn.heal - screen.pbRefreshSingle(pkmnid) - screen.pbDisplay(_INTL("{1} was fully healed.", pkmn.name)) + screen.refresh end next false } @@ -102,12 +92,12 @@ MenuHandlers.add(:pokemon_debug_menu, :full_heal, { MenuHandlers.add(:pokemon_debug_menu, :make_fainted, { "name" => _INTL("Make fainted"), "parent" => :hp_status_menu, - "effect" => proc { |pkmn, pkmnid, heldpoke, settingUpBattle, screen| + "effect" => proc { |pkmn, party_index, held_pkmn, setting_up_battle, screen| if pkmn.egg? - screen.pbDisplay(_INTL("{1} is an egg.", pkmn.name)) + screen.show_message(_INTL("{1} is an egg.", pkmn.name)) else pkmn.hp = 0 - screen.pbRefreshSingle(pkmnid) + screen.refresh end next false } @@ -116,32 +106,35 @@ MenuHandlers.add(:pokemon_debug_menu, :make_fainted, { MenuHandlers.add(:pokemon_debug_menu, :set_pokerus, { "name" => _INTL("Set Pokérus"), "parent" => :hp_status_menu, - "effect" => proc { |pkmn, pkmnid, heldpoke, settingUpBattle, screen| - cmd = 0 + "effect" => proc { |pkmn, party_index, held_pkmn, setting_up_battle, screen| + commands = { + :random_strain => _INTL("Give random strain"), + :non_infectious => _INTL("Make not infectious"), + :clear => _INTL("Clear Pokérus") + } + cmd = commands.keys.first loop do pokerus = (pkmn.pokerus) ? pkmn.pokerus : 0 msg = [_INTL("{1} doesn't have Pokérus.", pkmn.name), _INTL("Has strain {1}, infectious for {2} more days.", pokerus / 16, pokerus % 16), _INTL("Has strain {1}, not infectious.", pokerus / 16)][pkmn.pokerusStage] - cmd = screen.pbShowCommands(msg, - [_INTL("Give random strain"), - _INTL("Make not infectious"), - _INTL("Clear Pokérus")], cmd) - break if cmd < 0 + cmd = screen.show_menu(msg, commands, commands.keys.index(cmd)) + break if cmd.nil? case cmd - when 0 # Give random strain + when :random_strain + pkmn.pokerus = 0 pkmn.givePokerus - screen.pbRefreshSingle(pkmnid) - when 1 # Make not infectious + screen.refresh + when :non_infectious if pokerus > 0 strain = pokerus / 16 p = strain << 4 pkmn.pokerus = p - screen.pbRefreshSingle(pkmnid) + screen.refresh end - when 2 # Clear Pokérus + when :clear pkmn.pokerus = 0 - screen.pbRefreshSingle(pkmnid) + screen.refresh end end next false @@ -160,21 +153,19 @@ MenuHandlers.add(:pokemon_debug_menu, :level_stats, { MenuHandlers.add(:pokemon_debug_menu, :set_level, { "name" => _INTL("Set level"), "parent" => :level_stats, - "effect" => proc { |pkmn, pkmnid, heldpoke, settingUpBattle, screen| + "effect" => proc { |pkmn, party_index, held_pkmn, setting_up_battle, screen| if pkmn.egg? - screen.pbDisplay(_INTL("{1} is an egg.", pkmn.name)) - else - params = ChooseNumberParams.new - params.setRange(1, GameData::GrowthRate.max_level) - params.setDefaultValue(pkmn.level) - level = pbMessageChooseNumber( - _INTL("Set the Pokémon's level (max. {1}).", params.maxNumber), params - ) { screen.pbUpdate } - if level != pkmn.level - pkmn.level = level - pkmn.calc_stats - screen.pbRefreshSingle(pkmnid) - end + screen.show_message(_INTL("{1} is an egg.", pkmn.name)) + next false + end + params = ChooseNumberParams.new + params.setRange(1, GameData::GrowthRate.max_level) + params.setDefaultValue(pkmn.level) + level = screen.choose_number("\\se[]" + _INTL("Set the Pokémon's level (max. {1}).", params.maxNumber), params) + if level != pkmn.level + pkmn.level = level + pkmn.calc_stats + screen.refresh end next false } @@ -183,27 +174,25 @@ MenuHandlers.add(:pokemon_debug_menu, :set_level, { MenuHandlers.add(:pokemon_debug_menu, :set_exp, { "name" => _INTL("Set Exp"), "parent" => :level_stats, - "effect" => proc { |pkmn, pkmnid, heldpoke, settingUpBattle, screen| + "effect" => proc { |pkmn, party_index, held_pkmn, setting_up_battle, screen| if pkmn.egg? - screen.pbDisplay(_INTL("{1} is an egg.", pkmn.name)) - else - minxp = pkmn.growth_rate.minimum_exp_for_level(pkmn.level) - maxxp = pkmn.growth_rate.minimum_exp_for_level(pkmn.level + 1) - if minxp == maxxp - screen.pbDisplay(_INTL("{1} is at the maximum level.", pkmn.name)) - else - params = ChooseNumberParams.new - params.setRange(minxp, maxxp - 1) - params.setDefaultValue(pkmn.exp) - newexp = pbMessageChooseNumber( - _INTL("Set the Pokémon's Exp (range {1}-{2}).", minxp, maxxp - 1), params - ) { screen.pbUpdate } - if newexp != pkmn.exp - pkmn.exp = newexp - pkmn.calc_stats - screen.pbRefreshSingle(pkmnid) - end - end + screen.show_message(_INTL("{1} is an egg.", pkmn.name)) + next false + end + min_xp = pkmn.growth_rate.minimum_exp_for_level(pkmn.level) + max_xp = pkmn.growth_rate.minimum_exp_for_level(pkmn.level + 1) + if min_xp == max_xp + screen.show_message(_INTL("{1} is at the maximum level.", pkmn.name)) + next false + end + params = ChooseNumberParams.new + params.setRange(min_xp, max_xp - 1) + params.setDefaultValue(pkmn.exp) + new_exp = screen.choose_number("\\se[]" + _INTL("Set the Pokémon's Exp (range {1}-{2}).", min_xp, max_xp - 1), params) + if new_exp != pkmn.exp + pkmn.exp = new_exp + pkmn.calc_stats + screen.refresh end next false } @@ -212,110 +201,111 @@ MenuHandlers.add(:pokemon_debug_menu, :set_exp, { MenuHandlers.add(:pokemon_debug_menu, :hidden_values, { "name" => _INTL("EV/IV/personal ID..."), "parent" => :level_stats, - "effect" => proc { |pkmn, pkmnid, heldpoke, settingUpBattle, screen| - cmd = 0 + "effect" => proc { |pkmn, party_index, held_pkmn, setting_up_battle, screen| + commands = { + :set_evs => _INTL("Set EVs"), + :set_ivs => _INTL("Set IVs"), + :random_pid => _INTL("Randomize pID") + } + cmd = commands.keys.first loop do - persid = sprintf("0x%08X", pkmn.personalID) - cmd = screen.pbShowCommands(_INTL("Personal ID is {1}.", persid), - [_INTL("Set EVs"), - _INTL("Set IVs"), - _INTL("Randomise pID")], cmd) - break if cmd < 0 + pers_id = sprintf("0x%08X", pkmn.personalID) + cmd = screen.show_menu(_INTL("Personal ID is {1}.", pers_id), commands, commands.keys.index(cmd)) + break if cmd.nil? case cmd - when 0 # Set EVs - cmd2 = 0 + when :set_evs + ev_cmd = nil loop do - totalev = 0 - evcommands = [] - ev_id = [] + total_evs = 0 + ev_commands = {} + stats = [] GameData::Stat.each_main do |s| - evcommands.push(s.name + " (#{pkmn.ev[s.id]})") - ev_id.push(s.id) - totalev += pkmn.ev[s.id] + ev_commands[s.id] = s.name + " (#{pkmn.ev[s.id]})" + stats.push(s.id) + total_evs += pkmn.ev[s.id] end - evcommands.push(_INTL("Randomise all")) - evcommands.push(_INTL("Max randomise all")) - cmd2 = screen.pbShowCommands(_INTL("Change which EV?\nTotal: {1}/{2} ({3}%)", - totalev, Pokemon::EV_LIMIT, - 100 * totalev / Pokemon::EV_LIMIT), evcommands, cmd2) - break if cmd2 < 0 - if cmd2 < ev_id.length - params = ChooseNumberParams.new - upperLimit = 0 - GameData::Stat.each_main { |s| upperLimit += pkmn.ev[s.id] if s.id != ev_id[cmd2] } - upperLimit = Pokemon::EV_LIMIT - upperLimit - upperLimit = [upperLimit, Pokemon::EV_STAT_LIMIT].min - thisValue = [pkmn.ev[ev_id[cmd2]], upperLimit].min - params.setRange(0, upperLimit) - params.setDefaultValue(thisValue) - params.setCancelValue(thisValue) - f = pbMessageChooseNumber(_INTL("Set the EV for {1} (max. {2}).", - GameData::Stat.get(ev_id[cmd2]).name, upperLimit), params) { screen.pbUpdate } - if f != pkmn.ev[ev_id[cmd2]] - pkmn.ev[ev_id[cmd2]] = f - pkmn.calc_stats - screen.pbRefreshSingle(pkmnid) - end - else # (Max) Randomise all - evTotalTarget = Pokemon::EV_LIMIT - if cmd2 == evcommands.length - 2 # Randomize all (not max) - evTotalTarget = rand(Pokemon::EV_LIMIT) - end - GameData::Stat.each_main { |s| pkmn.ev[s.id] = 0 } - while evTotalTarget > 0 - r = rand(ev_id.length) - next if pkmn.ev[ev_id[r]] >= Pokemon::EV_STAT_LIMIT - addVal = 1 + rand(Pokemon::EV_STAT_LIMIT / 4) - addVal = addVal.clamp(0, evTotalTarget) - addVal = addVal.clamp(0, Pokemon::EV_STAT_LIMIT - pkmn.ev[ev_id[r]]) - next if addVal == 0 - pkmn.ev[ev_id[r]] += addVal - evTotalTarget -= addVal + ev_commands[:randomize] = _INTL("Randomize all") + ev_commands[:max_randomize] = _INTL("Max randomize all") + ev_cmd ||= ev_commands.keys.first + ev_cmd = screen.show_menu( + _INTL("Change which EV?\nTotal: {1}/{2} ({3}%)", total_evs, Pokemon::EV_LIMIT, 100 * total_evs / Pokemon::EV_LIMIT), + ev_commands, ev_commands.keys.index(ev_cmd) + ) + break if ev_cmd.nil? + case ev_cmd + when :randomize, :max_randomize + ev_total_target = (ev_cmd == :randomize) ? rand(Pokemon::EV_LIMIT) : Pokemon::EV_LIMIT + stats.each { |stat| pkmn.ev[stat] = 0 } + while ev_total_target > 0 + stat = stats.sample + next if pkmn.ev[stat] >= Pokemon::EV_STAT_LIMIT + add_val = [1 + rand(Pokemon::EV_STAT_LIMIT / 4), ev_total_target, Pokemon::EV_STAT_LIMIT - pkmn.ev[stat]].min + next if add_val == 0 + pkmn.ev[stat] += add_val + ev_total_target -= add_val end pkmn.calc_stats - screen.pbRefreshSingle(pkmnid) + screen.refresh + else # Set a particular stat's EVs + params = ChooseNumberParams.new + total_other_evs = 0 + stats.each { |stat| total_other_evs += pkmn.ev[stat] if stat != ev_cmd } + upper_limit = [Pokemon::EV_LIMIT - total_other_evs, Pokemon::EV_STAT_LIMIT].min + this_value = [pkmn.ev[ev_cmd], upper_limit].min + params.setRange(0, upper_limit) + params.setDefaultValue(this_value) + params.setCancelValue(this_value) + new_val = screen.choose_number("\\se[]" + _INTL("Set the EV for {1} (max. {2}).", + GameData::Stat.get(ev_cmd).name, upper_limit), params) + if new_val != pkmn.ev[ev_cmd] + pkmn.ev[ev_cmd] = new_val + pkmn.calc_stats + screen.refresh + end end end - when 1 # Set IVs - cmd2 = 0 + when :set_ivs + iv_cmd = nil loop do - hiddenpower = pbHiddenPower(pkmn) - totaliv = 0 - ivcommands = [] - iv_id = [] + total_ivs = 0 + iv_commands = {} + stats = [] GameData::Stat.each_main do |s| - ivcommands.push(s.name + " (#{pkmn.iv[s.id]})") - iv_id.push(s.id) - totaliv += pkmn.iv[s.id] + iv_commands[s.id] = s.name + " (#{pkmn.iv[s.id]})" + stats.push(s.id) + total_ivs += pkmn.iv[s.id] end + iv_commands[:randomize] = _INTL("Randomize all") + iv_cmd ||= iv_commands.keys.first + hidden_power = pbHiddenPower(pkmn) msg = _INTL("Change which IV?\nHidden Power:\n{1}, power {2}\nTotal: {3}/{4} ({5}%)", - GameData::Type.get(hiddenpower[0]).name, hiddenpower[1], totaliv, - iv_id.length * Pokemon::IV_STAT_LIMIT, 100 * totaliv / (iv_id.length * Pokemon::IV_STAT_LIMIT)) - ivcommands.push(_INTL("Randomise all")) - cmd2 = screen.pbShowCommands(msg, ivcommands, cmd2) - break if cmd2 < 0 - if cmd2 < iv_id.length + GameData::Type.get(hidden_power[0]).name, hidden_power[1], total_ivs, + stats.length * Pokemon::IV_STAT_LIMIT, 100 * total_ivs / (stats.length * Pokemon::IV_STAT_LIMIT)) + iv_cmd = screen.show_menu(msg, iv_commands, iv_commands.keys.index(iv_cmd)) + break if iv_cmd.nil? + case iv_cmd + when :randomize + stats.each { |stat| pkmn.iv[stat] = rand(Pokemon::IV_STAT_LIMIT + 1) } + pkmn.calc_stats + screen.refresh + else # Set a particular stat's IVs params = ChooseNumberParams.new params.setRange(0, Pokemon::IV_STAT_LIMIT) - params.setDefaultValue(pkmn.iv[iv_id[cmd2]]) - params.setCancelValue(pkmn.iv[iv_id[cmd2]]) - f = pbMessageChooseNumber(_INTL("Set the IV for {1} (max. 31).", - GameData::Stat.get(iv_id[cmd2]).name), params) { screen.pbUpdate } - if f != pkmn.iv[iv_id[cmd2]] - pkmn.iv[iv_id[cmd2]] = f + params.setDefaultValue(pkmn.iv[iv_cmd]) + params.setCancelValue(pkmn.iv[iv_cmd]) + new_val = screen.choose_number("\\se[]" + _INTL("Set the IV for {1} (max. {2}).", + GameData::Stat.get(iv_cmd).name, params.maxNumber), params) + if new_val != pkmn.iv[iv_cmd] + pkmn.iv[iv_cmd] = new_val pkmn.calc_stats - screen.pbRefreshSingle(pkmnid) + screen.refresh end - else # Randomise all - GameData::Stat.each_main { |s| pkmn.iv[s.id] = rand(Pokemon::IV_STAT_LIMIT + 1) } - pkmn.calc_stats - screen.pbRefreshSingle(pkmnid) end end - when 2 # Randomise pID + when :random_pid pkmn.personalID = rand(2**16) | (rand(2**16) << 16) pkmn.calc_stats - screen.pbRefreshSingle(pkmnid) + screen.refresh end end next false @@ -325,16 +315,14 @@ MenuHandlers.add(:pokemon_debug_menu, :hidden_values, { MenuHandlers.add(:pokemon_debug_menu, :set_happiness, { "name" => _INTL("Set happiness"), "parent" => :level_stats, - "effect" => proc { |pkmn, pkmnid, heldpoke, settingUpBattle, screen| + "effect" => proc { |pkmn, party_index, held_pkmn, setting_up_battle, screen| params = ChooseNumberParams.new params.setRange(0, 255) params.setDefaultValue(pkmn.happiness) - h = pbMessageChooseNumber( - _INTL("Set the Pokémon's happiness (max. 255)."), params - ) { screen.pbUpdate } - if h != pkmn.happiness - pkmn.happiness = h - screen.pbRefreshSingle(pkmnid) + new_val = screen.choose_number("\\se[]" + _INTL("Set the Pokémon's happiness (max. {1}).", params.maxNumber), params) + if new_val != pkmn.happiness + pkmn.happiness = new_val + screen.refresh end next false } @@ -348,16 +336,14 @@ MenuHandlers.add(:pokemon_debug_menu, :contest_stats, { MenuHandlers.add(:pokemon_debug_menu, :set_beauty, { "name" => _INTL("Set Beauty"), "parent" => :contest_stats, - "effect" => proc { |pkmn, pkmnid, heldpoke, settingUpBattle, screen| + "effect" => proc { |pkmn, party_index, held_pkmn, setting_up_battle, screen| params = ChooseNumberParams.new params.setRange(0, 255) params.setDefaultValue(pkmn.beauty) - newval = pbMessageChooseNumber( - _INTL("Set the Pokémon's Beauty (max. 255)."), params - ) { screen.pbUpdate } - if newval != pkmn.beauty - pkmn.beauty = newval - screen.pbRefreshSingle(pkmnid) + new_val = screen.choose_number("\\se[]" + _INTL("Set the Pokémon's Beauty (max. {1}).", params.maxNumber), params) + if new_val != pkmn.beauty + pkmn.beauty = new_val + screen.refresh end next false } @@ -366,16 +352,14 @@ MenuHandlers.add(:pokemon_debug_menu, :set_beauty, { MenuHandlers.add(:pokemon_debug_menu, :set_cool, { "name" => _INTL("Set Cool"), "parent" => :contest_stats, - "effect" => proc { |pkmn, pkmnid, heldpoke, settingUpBattle, screen| + "effect" => proc { |pkmn, party_index, held_pkmn, setting_up_battle, screen| params = ChooseNumberParams.new params.setRange(0, 255) params.setDefaultValue(pkmn.cool) - newval = pbMessageChooseNumber( - _INTL("Set the Pokémon's Cool (max. 255)."), params - ) { screen.pbUpdate } - if newval != pkmn.cool - pkmn.cool = newval - screen.pbRefreshSingle(pkmnid) + new_val = screen.choose_number("\\se[]" + _INTL("Set the Pokémon's Cool (max. {1}).", params.maxNumber), params) + if new_val != pkmn.cool + pkmn.cool = new_val + screen.refresh end next false } @@ -384,16 +368,14 @@ MenuHandlers.add(:pokemon_debug_menu, :set_cool, { MenuHandlers.add(:pokemon_debug_menu, :set_cute, { "name" => _INTL("Set Cute"), "parent" => :contest_stats, - "effect" => proc { |pkmn, pkmnid, heldpoke, settingUpBattle, screen| + "effect" => proc { |pkmn, party_index, held_pkmn, setting_up_battle, screen| params = ChooseNumberParams.new params.setRange(0, 255) params.setDefaultValue(pkmn.cute) - newval = pbMessageChooseNumber( - _INTL("Set the Pokémon's Cute (max. 255)."), params - ) { screen.pbUpdate } - if newval != pkmn.cute - pkmn.cute = newval - screen.pbRefreshSingle(pkmnid) + new_val = screen.choose_number("\\se[]" + _INTL("Set the Pokémon's Cute (max. {1}).", params.maxNumber), params) + if new_val != pkmn.cute + pkmn.cute = new_val + screen.refresh end next false } @@ -402,16 +384,14 @@ MenuHandlers.add(:pokemon_debug_menu, :set_cute, { MenuHandlers.add(:pokemon_debug_menu, :set_smart, { "name" => _INTL("Set Smart"), "parent" => :contest_stats, - "effect" => proc { |pkmn, pkmnid, heldpoke, settingUpBattle, screen| + "effect" => proc { |pkmn, party_index, held_pkmn, setting_up_battle, screen| params = ChooseNumberParams.new params.setRange(0, 255) params.setDefaultValue(pkmn.smart) - newval = pbMessageChooseNumber( - _INTL("Set the Pokémon's Smart (max. 255)."), params - ) { screen.pbUpdate } - if newval != pkmn.smart - pkmn.smart = newval - screen.pbRefreshSingle(pkmnid) + new_val = screen.choose_number("\\se[]" + _INTL("Set the Pokémon's Smart (max. {1}).", params.maxNumber), params) + if new_val != pkmn.smart + pkmn.smart = new_val + screen.refresh end next false } @@ -420,16 +400,14 @@ MenuHandlers.add(:pokemon_debug_menu, :set_smart, { MenuHandlers.add(:pokemon_debug_menu, :set_tough, { "name" => _INTL("Set Tough"), "parent" => :contest_stats, - "effect" => proc { |pkmn, pkmnid, heldpoke, settingUpBattle, screen| + "effect" => proc { |pkmn, party_index, held_pkmn, setting_up_battle, screen| params = ChooseNumberParams.new params.setRange(0, 255) params.setDefaultValue(pkmn.tough) - newval = pbMessageChooseNumber( - _INTL("Set the Pokémon's Tough (max. 255)."), params - ) { screen.pbUpdate } - if newval != pkmn.tough - pkmn.tough = newval - screen.pbRefreshSingle(pkmnid) + new_val = screen.choose_number("\\se[]" + _INTL("Set the Pokémon's Tough (max. {1}).", params.maxNumber), params) + if new_val != pkmn.tough + pkmn.tough = new_val + screen.refresh end next false } @@ -438,16 +416,14 @@ MenuHandlers.add(:pokemon_debug_menu, :set_tough, { MenuHandlers.add(:pokemon_debug_menu, :set_sheen, { "name" => _INTL("Set Sheen"), "parent" => :contest_stats, - "effect" => proc { |pkmn, pkmnid, heldpoke, settingUpBattle, screen| + "effect" => proc { |pkmn, party_index, held_pkmn, setting_up_battle, screen| params = ChooseNumberParams.new params.setRange(0, 255) params.setDefaultValue(pkmn.sheen) - newval = pbMessageChooseNumber( - _INTL("Set the Pokémon's Sheen (max. 255)."), params - ) { screen.pbUpdate } - if newval != pkmn.sheen - pkmn.sheen = newval - screen.pbRefreshSingle(pkmnid) + new_val = screen.choose_number("\\se[]" + _INTL("Set the Pokémon's Sheen (max. {1}).", params.maxNumber), params) + if new_val != pkmn.sheen + pkmn.sheen = new_val + screen.refresh end next false } @@ -465,11 +441,13 @@ MenuHandlers.add(:pokemon_debug_menu, :moves, { MenuHandlers.add(:pokemon_debug_menu, :teach_move, { "name" => _INTL("Teach move"), "parent" => :moves, - "effect" => proc { |pkmn, pkmnid, heldpoke, settingUpBattle, screen| + "effect" => proc { |pkmn, party_index, held_pkmn, setting_up_battle, screen| move = pbChooseMoveList if move pbLearnMove(pkmn, move) - screen.pbRefreshSingle(pkmnid) + screen.refresh + else + pbPlayCancelSE end next false } @@ -478,13 +456,13 @@ MenuHandlers.add(:pokemon_debug_menu, :teach_move, { MenuHandlers.add(:pokemon_debug_menu, :forget_move, { "name" => _INTL("Forget move"), "parent" => :moves, - "effect" => proc { |pkmn, pkmnid, heldpoke, settingUpBattle, screen| - moveindex = screen.pbChooseMove(pkmn, _INTL("Choose move to forget.")) - if moveindex >= 0 - movename = pkmn.moves[moveindex].name - pkmn.forget_move_at_index(moveindex) - screen.pbDisplay(_INTL("{1} forgot {2}.", pkmn.name, movename)) - screen.pbRefreshSingle(pkmnid) + "effect" => proc { |pkmn, party_index, held_pkmn, setting_up_battle, screen| + move_index = screen.choose_move(pkmn, _INTL("Choose move to forget.")) + if move_index >= 0 + move_name = pkmn.moves[move_index].name + pkmn.forget_move_at_index(move_index) + screen.refresh + screen.show_message(_INTL("{1} forgot {2}.", pkmn.name, move_name)) end next false } @@ -493,71 +471,65 @@ MenuHandlers.add(:pokemon_debug_menu, :forget_move, { MenuHandlers.add(:pokemon_debug_menu, :reset_moves, { "name" => _INTL("Reset moves"), "parent" => :moves, - "effect" => proc { |pkmn, pkmnid, heldpoke, settingUpBattle, screen| + "effect" => proc { |pkmn, party_index, held_pkmn, setting_up_battle, screen| pkmn.reset_moves - screen.pbDisplay(_INTL("{1}'s moves were reset.", pkmn.name)) - screen.pbRefreshSingle(pkmnid) + screen.refresh + screen.show_message(_INTL("{1}'s moves were reset.", pkmn.name)) next false } }) MenuHandlers.add(:pokemon_debug_menu, :set_move_pp, { - "name" => _INTL("Set move PP"), + "name" => _INTL("Set move PP..."), "parent" => :moves, - "effect" => proc { |pkmn, pkmnid, heldpoke, settingUpBattle, screen| - cmd = 0 + "effect" => proc { |pkmn, party_index, held_pkmn, setting_up_battle, screen| + cmd = nil loop do - commands = [] - pkmn.moves.each do |i| - break if !i.id - if i.total_pp <= 0 - commands.push(_INTL("{1} (PP: ---)", i.name)) + commands = {} + pkmn.moves.each_with_index do |move, i| + break if !move.id + if move.total_pp <= 0 + commands[i] = _INTL("{1} (PP: ---)", move.name) else - commands.push(_INTL("{1} (PP: {2}/{3})", i.name, i.pp, i.total_pp)) + commands[i] = _INTL("{1} (PP: {2}/{3})", move.name, move.pp, move.total_pp) end end - commands.push(_INTL("Restore all PP")) - cmd = screen.pbShowCommands(_INTL("Alter PP of which move?"), commands, cmd) - break if cmd < 0 - if cmd >= 0 && cmd < commands.length - 1 # Move + commands[:restore_pp] = _INTL("[Restore all PP]") + cmd ||= commands.keys.first + cmd = screen.show_menu(_INTL("Alter PP of which move?"), commands, commands.keys.index(cmd)) + break if cmd.nil? + if cmd == :restore_pp + pkmn.heal_PP + elsif pkmn.moves[cmd].total_pp <= 0 + screen.show_message(_INTL("{1} has infinite PP.", pkmn.moves[cmd].name)) + else move = pkmn.moves[cmd] - movename = move.name - if move.total_pp <= 0 - screen.pbDisplay(_INTL("{1} has infinite PP.", movename)) - else - cmd2 = 0 - loop do - msg = _INTL("{1}: PP {2}/{3} (PP Up {4}/3)", movename, move.pp, move.total_pp, move.ppup) - cmd2 = screen.pbShowCommands(msg, - [_INTL("Set PP"), - _INTL("Full PP"), - _INTL("Set PP Up")], cmd2) - break if cmd2 < 0 - case cmd2 - when 0 # Change PP - params = ChooseNumberParams.new - params.setRange(0, move.total_pp) - params.setDefaultValue(move.pp) - h = pbMessageChooseNumber( - _INTL("Set PP of {1} (max. {2}).", movename, move.total_pp), params - ) { screen.pbUpdate } - move.pp = h - when 1 # Full PP - move.pp = move.total_pp - when 2 # Change PP Up - params = ChooseNumberParams.new - params.setRange(0, 3) - params.setDefaultValue(move.ppup) - h = pbMessageChooseNumber( - _INTL("Set PP Up of {1} (max. 3).", movename), params - ) { screen.pbUpdate } - move.ppup = h - move.pp = move.total_pp if move.pp > move.total_pp - end + pp_commands = { + :set_pp => _INTL("Set PP"), + :full_pp => _INTL("Full PP"), + :pp_up => _INTL("Set PP Up") + } + pp_cmd = pp_commands.keys.first + loop do + msg = _INTL("{1}: PP {2}/{3} (PP Up {4}/3)", move.name, move.pp, move.total_pp, move.ppup) + pp_cmd = screen.show_menu(msg, pp_commands, pp_commands.keys.index(pp_cmd)) + break if pp_cmd.nil? + case pp_cmd + when :set_pp + params = ChooseNumberParams.new + params.setRange(0, move.total_pp) + params.setDefaultValue(move.pp) + move.pp = screen.choose_number("\\se[]" + _INTL("Set PP of {1} (max. {2}).", move.name, params.maxNumber), params) + when :full_pp + move.pp = move.total_pp + when :pp_up + params = ChooseNumberParams.new + params.setRange(0, 3) + params.setDefaultValue(move.ppup) + new_val = screen.choose_number("\\se[]" + _INTL("Set PP Up of {1} (max. {2}).", move.name, params.maxNumber), params) + move.ppup = new_val end end - elsif cmd == commands.length - 1 # Restore all PP - pkmn.heal_PP end end next false @@ -567,10 +539,10 @@ MenuHandlers.add(:pokemon_debug_menu, :set_move_pp, { MenuHandlers.add(:pokemon_debug_menu, :set_initial_moves, { "name" => _INTL("Reset initial moves"), "parent" => :moves, - "effect" => proc { |pkmn, pkmnid, heldpoke, settingUpBattle, screen| + "effect" => proc { |pkmn, party_index, held_pkmn, setting_up_battle, screen| pkmn.record_first_moves - screen.pbDisplay(_INTL("{1}'s moves were set as its first-known moves.", pkmn.name)) - screen.pbRefreshSingle(pkmnid) + screen.refresh + screen.show_message(_INTL("{1}'s current moves were set as its first-known moves.", pkmn.name)) next false } }) @@ -582,33 +554,32 @@ MenuHandlers.add(:pokemon_debug_menu, :set_initial_moves, { MenuHandlers.add(:pokemon_debug_menu, :set_item, { "name" => _INTL("Set item"), "parent" => :main, - "effect" => proc { |pkmn, pkmnid, heldpoke, settingUpBattle, screen| - cmd = 0 - commands = [ - _INTL("Change item"), - _INTL("Remove item") - ] + "effect" => proc { |pkmn, party_index, held_pkmn, setting_up_battle, screen| + commands = { + :change_item => _INTL("Change item"), + :delete_item => _INTL("Remove item") + } + cmd = commands.keys.first loop do msg = (pkmn.hasItem?) ? _INTL("Item is {1}.", pkmn.item.name) : _INTL("No item.") - cmd = screen.pbShowCommands(msg, commands, cmd) - break if cmd < 0 + cmd = screen.show_menu(msg, commands, commands.keys.index(cmd)) + break if cmd.nil? case cmd - when 0 # Change item + when :change_item item = pbChooseItemList(pkmn.item_id) if item && item != pkmn.item_id + pbPlayDecisionSE pkmn.item = item - if GameData::Item.get(item).is_mail? - pkmn.mail = Mail.new(item, _INTL("Text"), $player.name) - end - screen.pbRefreshSingle(pkmnid) + pkmn.mail = Mail.new(item, _INTL("Text"), $player.name) if GameData::Item.get(item).is_mail? + screen.refresh + else + pbPlayCancelSE end - when 1 # Remove item + when :delete_item if pkmn.hasItem? pkmn.item = nil - screen.pbRefreshSingle(pkmnid) + screen.refresh end - else - break end end next false @@ -618,45 +589,49 @@ MenuHandlers.add(:pokemon_debug_menu, :set_item, { MenuHandlers.add(:pokemon_debug_menu, :set_ability, { "name" => _INTL("Set ability"), "parent" => :main, - "effect" => proc { |pkmn, pkmnid, heldpoke, settingUpBattle, screen| - cmd = 0 - commands = [ - _INTL("Set possible ability"), - _INTL("Set any ability"), - _INTL("Reset") - ] + "effect" => proc { |pkmn, party_index, held_pkmn, setting_up_battle, screen| + commands = { + :set_ability_index => _INTL("Set possible ability"), + :give_any_ability => _INTL("Set any ability"), + :reset_ability => _INTL("Reset") + } + cmd = commands.keys.first loop do if pkmn.ability msg = _INTL("Ability is {1} (index {2}).", pkmn.ability.name, pkmn.ability_index) else msg = _INTL("No ability (index {1}).", pkmn.ability_index) end - cmd = screen.pbShowCommands(msg, commands, cmd) - break if cmd < 0 + cmd = screen.show_menu(msg, commands, commands.keys.index(cmd)) + break if cmd.nil? case cmd - when 0 # Set possible ability + when :set_ability_index abils = pkmn.getAbilityList - ability_commands = [] - abil_cmd = 0 - abils.each do |i| - ability_commands.push(((i[1] < 2) ? "" : "(H) ") + GameData::Ability.get(i[0]).name) - abil_cmd = ability_commands.length - 1 if pkmn.ability_id == i[0] + ability_commands = {} + abil_cmd = nil + abils.each do |abil| + ability_commands[abil[1]] = ((abil[1] < 2) ? "" : "(H) ") + GameData::Ability.get(abil[0]).name + abil_cmd = abil[1] if pkmn.ability_id == abil[0] end - abil_cmd = screen.pbShowCommands(_INTL("Choose an ability."), ability_commands, abil_cmd) - next if abil_cmd < 0 - pkmn.ability_index = abils[abil_cmd][1] + abil_cmd ||= ability_commands.keys.first + abil_cmd = screen.show_menu(_INTL("Choose an ability."), ability_commands, ability_commands.keys.index(abil_cmd)) + next if abil_cmd.nil? + pkmn.ability_index = abil_cmd pkmn.ability = nil - screen.pbRefreshSingle(pkmnid) - when 1 # Set any ability + screen.refresh + when :give_any_ability new_ability = pbChooseAbilityList(pkmn.ability_id) if new_ability && new_ability != pkmn.ability_id + pbPlayDecisionSE pkmn.ability = new_ability - screen.pbRefreshSingle(pkmnid) + screen.refresh + else + pbPlayCancelSE end - when 2 # Reset + when :reset_ability pkmn.ability_index = nil pkmn.ability = nil - screen.pbRefreshSingle(pkmnid) + screen.refresh end end next false @@ -666,40 +641,33 @@ MenuHandlers.add(:pokemon_debug_menu, :set_ability, { MenuHandlers.add(:pokemon_debug_menu, :set_nature, { "name" => _INTL("Set nature"), "parent" => :main, - "effect" => proc { |pkmn, pkmnid, heldpoke, settingUpBattle, screen| - commands = [] - ids = [] + "effect" => proc { |pkmn, party_index, held_pkmn, setting_up_battle, screen| + commands = {} GameData::Nature.each do |nature| if nature.stat_changes.length == 0 - commands.push(_INTL("{1} (---)", nature.real_name)) - else - plus_text = "" - minus_text = "" - nature.stat_changes.each do |change| - if change[1] > 0 - plus_text += "/" if !plus_text.empty? - plus_text += GameData::Stat.get(change[0]).name_brief - elsif change[1] < 0 - minus_text += "/" if !minus_text.empty? - minus_text += GameData::Stat.get(change[0]).name_brief - end + commands[nature.id] = _INTL("{1} (---)", nature.real_name) + next + end + plus_text = "" + minus_text = "" + nature.stat_changes.each do |change| + if change[1] > 0 + plus_text += "/" if !plus_text.empty? + plus_text += GameData::Stat.get(change[0]).name_brief + elsif change[1] < 0 + minus_text += "/" if !minus_text.empty? + minus_text += GameData::Stat.get(change[0]).name_brief end - commands.push(_INTL("{1} (+{2}, -{3})", nature.real_name, plus_text, minus_text)) end - ids.push(nature.id) + commands[nature.id] = _INTL("{1} (+{2}, -{3})", nature.real_name, plus_text, minus_text) end - commands.push(_INTL("[Reset]")) - cmd = ids.index(pkmn.nature_id || ids[0]) + commands[:reset_nature] = _INTL("[Reset]") + cmd = (commands.keys.include?(pkmn.nature_id)) ? pkmn.nature_id : commands.keys.first loop do - msg = _INTL("Nature is {1}.", pkmn.nature.name) - cmd = screen.pbShowCommands(msg, commands, cmd) - break if cmd < 0 - if cmd >= 0 && cmd < commands.length - 1 # Set nature - pkmn.nature = ids[cmd] - elsif cmd == commands.length - 1 # Reset - pkmn.nature = nil - end - screen.pbRefreshSingle(pkmnid) + cmd = screen.show_menu(_INTL("Nature is {1}.", pkmn.nature.name), commands, commands.keys.index(cmd)) + break if cmd.nil? + pkmn.nature = (cmd == :reset_nature) ? nil : cmd + screen.refresh end next false } @@ -708,35 +676,35 @@ MenuHandlers.add(:pokemon_debug_menu, :set_nature, { MenuHandlers.add(:pokemon_debug_menu, :set_gender, { "name" => _INTL("Set gender"), "parent" => :main, - "effect" => proc { |pkmn, pkmnid, heldpoke, settingUpBattle, screen| + "effect" => proc { |pkmn, party_index, held_pkmn, setting_up_battle, screen| if pkmn.singleGendered? - screen.pbDisplay(_INTL("{1} is single-gendered or genderless.", pkmn.speciesName)) - else - cmd = 0 - loop do - msg = [_INTL("Gender is male."), _INTL("Gender is female.")][pkmn.male? ? 0 : 1] - cmd = screen.pbShowCommands(msg, - [_INTL("Make male"), - _INTL("Make female"), - _INTL("Reset")], cmd) - break if cmd < 0 - case cmd - when 0 # Make male - pkmn.makeMale - if !pkmn.male? - screen.pbDisplay(_INTL("{1}'s gender couldn't be changed.", pkmn.name)) - end - when 1 # Make female - pkmn.makeFemale - if !pkmn.female? - screen.pbDisplay(_INTL("{1}'s gender couldn't be changed.", pkmn.name)) - end - when 2 # Reset - pkmn.gender = nil - end - $player.pokedex.register(pkmn) if !settingUpBattle && !pkmn.egg? - screen.pbRefreshSingle(pkmnid) + screen.show_message(_INTL("{1} is single-gendered or genderless.", pkmn.speciesName)) + next false + end + commands = { + :make_male => _INTL("Make male"), + :make_female => _INTL("Make female"), + :reset_gender => _INTL("Reset") + } + cmd = commands.keys.first + loop do + msg = _INTL("Unknown gender.") + msg = _INTL("Gender is male.") if pkmn.male? + msg = _INTL("Gender is female.") if pkmn.female? + cmd = screen.show_menu(msg, commands, commands.keys.index(cmd)) + break if cmd.nil? + case cmd + when :make_male + pkmn.makeMale + screen.show_message(_INTL("{1}'s gender couldn't be changed.", pkmn.name)) if !pkmn.male? + when :make_female + pkmn.makeFemale + screen.show_message(_INTL("{1}'s gender couldn't be changed.", pkmn.name)) if !pkmn.female? + when :reset_gender + pkmn.gender = nil end + $player.pokedex.register(pkmn) if !setting_up_battle && !pkmn.egg? + screen.refresh end next false } @@ -745,61 +713,65 @@ MenuHandlers.add(:pokemon_debug_menu, :set_gender, { MenuHandlers.add(:pokemon_debug_menu, :species_and_form, { "name" => _INTL("Species/form..."), "parent" => :main, - "effect" => proc { |pkmn, pkmnid, heldpoke, settingUpBattle, screen| - cmd = 0 + "effect" => proc { |pkmn, party_index, held_pkmn, setting_up_battle, screen| + commands = { + :set_species => _INTL("Set species"), + :set_form => _INTL("Set form"), + :reset_form => _INTL("Remove form override") + } + cmd = commands.keys.first loop do msg = [_INTL("Species {1}, form {2}.", pkmn.speciesName, pkmn.form), _INTL("Species {1}, form {2} (forced).", pkmn.speciesName, pkmn.form)][(pkmn.forced_form.nil?) ? 0 : 1] - cmd = screen.pbShowCommands(msg, - [_INTL("Set species"), - _INTL("Set form"), - _INTL("Remove form override")], cmd) - break if cmd < 0 + cmd = screen.show_menu(msg, commands, commands.keys.index(cmd)) + break if cmd.nil? case cmd - when 0 # Set species + when :set_species species = pbChooseSpeciesList(pkmn.species) if species && species != pkmn.species + pbPlayDecisionSE pkmn.species = species pkmn.calc_stats - $player.pokedex.register(pkmn) if !settingUpBattle && !pkmn.egg? - screen.pbRefreshSingle(pkmnid) + $player.pokedex.register(pkmn) if !setting_up_battle && !pkmn.egg? + screen.refresh + else + pbPlayCancelSE end - when 1 # Set form - cmd2 = 0 - formcmds = [[], []] + when :set_form + # TODO: Allow setting any form number for any species. + form_cmd = 0 + form_commands = {} GameData::Species.each do |sp| next if sp.species != pkmn.species form_name = sp.form_name form_name = _INTL("Unnamed form") if !form_name || form_name.empty? form_name = sprintf("%d: %s", sp.form, form_name) - formcmds[0].push(sp.form) - formcmds[1].push(form_name) - cmd2 = formcmds[0].length - 1 if pkmn.form == sp.form + form_commands[sp.form] = form_name + form_cmd = sp.form if pkmn.form == sp.form end - if formcmds[0].length <= 1 - screen.pbDisplay(_INTL("Species {1} only has one form.", pkmn.speciesName)) - if pkmn.form != 0 && screen.pbConfirm(_INTL("Do you want to reset the form to 0?")) + if form_commands.length <= 1 + screen.show_message(_INTL("Species {1} only has one form.", pkmn.speciesName)) + if pkmn.form != 0 && screen.show_confirm_message(_INTL("Do you want to reset the form to 0?")) pkmn.form = 0 - $player.pokedex.register(pkmn) if !settingUpBattle && !pkmn.egg? - screen.pbRefreshSingle(pkmnid) + $player.pokedex.register(pkmn) if !setting_up_battle && !pkmn.egg? + screen.refresh end else - cmd2 = screen.pbShowCommands(_INTL("Set the Pokémon's form."), formcmds[1], cmd2) - next if cmd2 < 0 - f = formcmds[0][cmd2] - if f != pkmn.form + form_cmd = screen.show_menu(_INTL("Set the Pokémon's form."), form_commands, form_commands.keys.index(form_cmd)) + next if form_cmd.nil? + if form_cmd != pkmn.form if MultipleForms.hasFunction?(pkmn, "getForm") - next if !screen.pbConfirm(_INTL("This species decides its own form. Override?")) - pkmn.forced_form = f + next if !screen.show_confirm_message(_INTL("This species decides its own form. Override?")) + pkmn.forced_form = form_cmd end - pkmn.form = f - $player.pokedex.register(pkmn) if !settingUpBattle && !pkmn.egg? - screen.pbRefreshSingle(pkmnid) + pkmn.form = form_cmd + $player.pokedex.register(pkmn) if !setting_up_battle && !pkmn.egg? + screen.refresh end end - when 2 # Remove form override + when :reset_form pkmn.forced_form = nil - screen.pbRefreshSingle(pkmnid) + screen.refresh end end next false @@ -818,29 +790,34 @@ MenuHandlers.add(:pokemon_debug_menu, :cosmetic, { MenuHandlers.add(:pokemon_debug_menu, :set_shininess, { "name" => _INTL("Set shininess"), "parent" => :cosmetic, - "effect" => proc { |pkmn, pkmnid, heldpoke, settingUpBattle, screen| - cmd = 0 + "effect" => proc { |pkmn, party_index, held_pkmn, setting_up_battle, screen| + commands = { + :make_shiny => _INTL("Make shiny"), + :make_super_shiny => _INTL("Make super shiny"), + :make_not_shiny => _INTL("Make normal"), + :reset_shininess => _INTL("Reset") + } + cmd = commands.keys.first loop do msg_idx = pkmn.shiny? ? (pkmn.super_shiny? ? 1 : 0) : 2 msg = [_INTL("Is shiny."), _INTL("Is super shiny."), _INTL("Is normal (not shiny).")][msg_idx] - cmd = screen.pbShowCommands(msg, [_INTL("Make shiny"), _INTL("Make super shiny"), - _INTL("Make normal"), _INTL("Reset")], cmd) - break if cmd < 0 + cmd = screen.show_menu(msg, commands, commands.keys.index(cmd)) + break if cmd.nil? case cmd - when 0 # Make shiny + when :make_shiny pkmn.shiny = true pkmn.super_shiny = false - when 1 # Make super shiny + when :make_super_shiny pkmn.super_shiny = true - when 2 # Make normal + when :make_not_shiny pkmn.shiny = false pkmn.super_shiny = false - when 3 # Reset + when :reset_shininess pkmn.shiny = nil pkmn.super_shiny = nil end - $player.pokedex.register(pkmn) if !settingUpBattle && !pkmn.egg? - screen.pbRefreshSingle(pkmnid) + $player.pokedex.register(pkmn) if !setting_up_battle && !pkmn.egg? + screen.refresh end next false } @@ -849,25 +826,20 @@ MenuHandlers.add(:pokemon_debug_menu, :set_shininess, { MenuHandlers.add(:pokemon_debug_menu, :set_pokeball, { "name" => _INTL("Set Poké Ball"), "parent" => :cosmetic, - "effect" => proc { |pkmn, pkmnid, heldpoke, settingUpBattle, screen| - commands = [] - balls = [] - GameData::Item.each do |item_data| - balls.push([item_data.id, item_data.name]) if item_data.is_poke_ball? + "effect" => proc { |pkmn, party_index, held_pkmn, setting_up_battle, screen| + commands = {} + cmd = nil + GameData::Item.each do |item| + next if !item.is_poke_ball? + commands[item.id] = item.name + cmd = item.id if item.id == pkmn.poke_ball end - balls.sort! { |a, b| a[1] <=> b[1] } - cmd = 0 - balls.each_with_index do |ball, i| - next if ball[0] != pkmn.poke_ball - cmd = i - break - end - balls.each { |ball| commands.push(ball[1]) } + commands = commands.sort_by { |key, val| val }.to_h + cmd ||= commands.keys.first loop do - oldball = GameData::Item.get(pkmn.poke_ball).name - cmd = screen.pbShowCommands(_INTL("{1} used.", oldball), commands, cmd) - break if cmd < 0 - pkmn.poke_ball = balls[cmd][0] + cmd = screen.show_menu(_INTL("{1} used.", GameData::Item.get(pkmn.poke_ball).name), commands, commands.keys.index(cmd)) + break if cmd.nil? + pkmn.poke_ball = cmd end next false } @@ -876,32 +848,25 @@ MenuHandlers.add(:pokemon_debug_menu, :set_pokeball, { MenuHandlers.add(:pokemon_debug_menu, :set_ribbons, { "name" => _INTL("Set ribbons"), "parent" => :cosmetic, - "effect" => proc { |pkmn, pkmnid, heldpoke, settingUpBattle, screen| - cmd = 0 + "effect" => proc { |pkmn, party_index, held_pkmn, setting_up_battle, screen| + cmd = nil loop do - commands = [] - ids = [] - GameData::Ribbon.each do |ribbon_data| - commands.push(_INTL("{1} {2}", - (pkmn.hasRibbon?(ribbon_data.id)) ? "[Y]" : "[ ]", ribbon_data.name)) - ids.push(ribbon_data.id) + commands = {} + GameData::Ribbon.each do |ribbon| + commands[ribbon.id] = (pkmn.hasRibbon?(ribbon.id) ? "[Y]" : "[ ]") + " " + ribbon.name end - commands.push(_INTL("Give all")) - commands.push(_INTL("Clear all")) - cmd = screen.pbShowCommands(_INTL("{1} ribbons.", pkmn.numRibbons), commands, cmd) - break if cmd < 0 - if cmd >= 0 && cmd < ids.length # Toggle ribbon - if pkmn.hasRibbon?(ids[cmd]) - pkmn.takeRibbon(ids[cmd]) - else - pkmn.giveRibbon(ids[cmd]) - end - elsif cmd == commands.length - 2 # Give all - GameData::Ribbon.each do |ribbon_data| - pkmn.giveRibbon(ribbon_data.id) - end - elsif cmd == commands.length - 1 # Clear all + commands[:give_all] = _INTL("Give all") + commands[:clear_all] = _INTL("Clear all") + cmd ||= commands.keys.first + cmd = screen.show_menu(_INTL("{1} ribbons.", pkmn.numRibbons), commands, commands.keys.index(cmd)) + break if cmd.nil? + case cmd + when :give_all + GameData::Ribbon.each { |ribbon| pkmn.giveRibbon(ribbon.id) } + when :clear_all pkmn.clearAllRibbons + else # Toggle a specific ribbon + pkmn.hasRibbon?(cmd) ? pkmn.takeRibbon(cmd) : pkmn.giveRibbon(cmd) end end next false @@ -911,25 +876,27 @@ MenuHandlers.add(:pokemon_debug_menu, :set_ribbons, { MenuHandlers.add(:pokemon_debug_menu, :set_nickname, { "name" => _INTL("Set nickname"), "parent" => :cosmetic, - "effect" => proc { |pkmn, pkmnid, heldpoke, settingUpBattle, screen| - cmd = 0 + "effect" => proc { |pkmn, party_index, held_pkmn, setting_up_battle, screen| + commands = { + :rename => _INTL("Rename"), + :clear_name => _INTL("Erase name") + } + cmd = commands.keys.first loop do - speciesname = pkmn.speciesName - msg = [_INTL("{1} has the nickname {2}.", speciesname, pkmn.name), - _INTL("{1} has no nickname.", speciesname)][pkmn.nicknamed? ? 0 : 1] - cmd = screen.pbShowCommands(msg, [_INTL("Rename"), _INTL("Erase name")], cmd) - break if cmd < 0 + species_name = pkmn.speciesName + msg = [_INTL("{1} has the nickname {2}.", species_name, pkmn.name), + _INTL("{1} has no nickname.", species_name)][pkmn.nicknamed? ? 0 : 1] + cmd = screen.show_menu(msg, commands, commands.keys.index(cmd)) + break if cmd.nil? case cmd - when 0 # Rename - oldname = (pkmn.nicknamed?) ? pkmn.name : "" - newname = pbEnterPokemonName(_INTL("{1}'s nickname?", speciesname), - 0, Pokemon::MAX_NAME_SIZE, oldname, pkmn) - pkmn.name = newname - screen.pbRefreshSingle(pkmnid) - when 1 # Erase name + when :rename + old_name = (pkmn.nicknamed?) ? pkmn.name : "" + pkmn.name = pbEnterPokemonName(_INTL("{1}'s nickname?", species_name), + 0, Pokemon::MAX_NAME_SIZE, old_name, pkmn) + when :clear_name pkmn.name = nil - screen.pbRefreshSingle(pkmnid) end + screen.refresh end next false } @@ -938,40 +905,48 @@ MenuHandlers.add(:pokemon_debug_menu, :set_nickname, { MenuHandlers.add(:pokemon_debug_menu, :ownership, { "name" => _INTL("Ownership..."), "parent" => :cosmetic, - "effect" => proc { |pkmn, pkmnid, heldpoke, settingUpBattle, screen| - cmd = 0 + "effect" => proc { |pkmn, party_index, held_pkmn, setting_up_battle, screen| + commands = { + :make_players => _INTL("Make player's"), + :set_ot_name => _INTL("Set OT's name"), + :set_ot_gender => _INTL("Set OT's gender"), + :random_foreign_id => _INTL("Random foreign ID"), + :set_id => _INTL("Set foreign ID") + } + cmd = commands.keys.first loop do - gender = [_INTL("Male"), _INTL("Female"), _INTL("Unknown")][pkmn.owner.gender] + gender_text = _INTL("Unknown gender") + gender_text = _INTL("Male") if pkmn.owner.male? + gender_text = _INTL("Female") if pkmn.owner.female? + public_id_text = sprintf("%05d", pkmn.owner.public_id) msg = [_INTL("Player's Pokémon\n{1}\n{2}\n{3} ({4})", - pkmn.owner.name, gender, pkmn.owner.public_id, pkmn.owner.id), + pkmn.owner.name, gender_text, public_id_text, pkmn.owner.id), _INTL("Foreign Pokémon\n{1}\n{2}\n{3} ({4})", - pkmn.owner.name, gender, pkmn.owner.public_id, pkmn.owner.id)][pkmn.foreign?($player) ? 1 : 0] - cmd = screen.pbShowCommands(msg, - [_INTL("Make player's"), - _INTL("Set OT's name"), - _INTL("Set OT's gender"), - _INTL("Random foreign ID"), - _INTL("Set foreign ID")], cmd) - break if cmd < 0 + pkmn.owner.name, gender_text, public_id_text, pkmn.owner.id)][pkmn.foreign?($player) ? 1 : 0] + cmd = screen.show_menu(msg, commands, commands.keys.index(cmd)) + break if cmd.nil? case cmd - when 0 # Make player's + when :make_players pkmn.owner = Pokemon::Owner.new_from_trainer($player) - when 1 # Set OT's name - pkmn.owner.name = pbEnterPlayerName(_INTL("{1}'s OT's name?", pkmn.name), 1, Settings::MAX_PLAYER_NAME_SIZE) - when 2 # Set OT's gender - cmd2 = screen.pbShowCommands(_INTL("Set OT's gender."), - [_INTL("Male"), _INTL("Female"), _INTL("Unknown")], pkmn.owner.gender) - pkmn.owner.gender = cmd2 if cmd2 >= 0 - when 3 # Random foreign ID + when :set_ot_name + pkmn.owner.name = pbEnterPlayerName(_INTL("{1}'s OT's name?", pkmn.name), 1, Settings::MAX_PLAYER_NAME_SIZE, pkmn.owner.name) + when :set_ot_gender + gender_commands = { + 0 => _INTL("Male"), + 1 => _INTL("Female"), + 2 => _INTL("Unknown") + } + gender_cmd = gender_commands.keys.index(pkmn.owner.gender) || gender_commands.keys.first + gender_cmd = screen.show_menu(_INTL("Set OT's gender."), gender_commands, gender_cmd) + pkmn.owner.gender = gender_cmd if gender_cmd + when :random_foreign_id pkmn.owner.id = $player.make_foreign_ID - when 4 # Set foreign ID + when :set_id params = ChooseNumberParams.new params.setRange(0, 65_535) params.setDefaultValue(pkmn.owner.public_id) - val = pbMessageChooseNumber( - _INTL("Set the new ID (max. 65535)."), params - ) { screen.pbUpdate } - pkmn.owner.id = val | (val << 16) + new_val = screen.choose_number("\\se[]" + _INTL("Set the new ID (max. {1}).", params.maxNumber), params) + pkmn.owner.id = new_val | (new_val << 16) end end next false @@ -985,22 +960,23 @@ MenuHandlers.add(:pokemon_debug_menu, :ownership, { MenuHandlers.add(:pokemon_debug_menu, :set_discardable, { "name" => _INTL("Set discardable"), "parent" => :main, - "effect" => proc { |pkmn, pkmnid, heldpoke, settingUpBattle, screen| - cmd = 0 + "effect" => proc { |pkmn, party_index, held_pkmn, setting_up_battle, screen| + cmd = nil loop do - msg = _INTL("Click option to toggle.") - cmds = [] - cmds.push((pkmn.cannot_store) ? _INTL("Cannot store") : _INTL("Can store")) - cmds.push((pkmn.cannot_release) ? _INTL("Cannot release") : _INTL("Can release")) - cmds.push((pkmn.cannot_trade) ? _INTL("Cannot trade") : _INTL("Can trade")) - cmd = screen.pbShowCommands(msg, cmds, cmd) - break if cmd < 0 + commands = { + :store => (pkmn.cannot_store) ? _INTL("Cannot store") : _INTL("Can store"), + :release => (pkmn.cannot_release) ? _INTL("Cannot release") : _INTL("Can release"), + :trade => (pkmn.cannot_trade) ? _INTL("Cannot trade") : _INTL("Can trade") + } + cmd ||= commands.keys.first + cmd = screen.show_menu(_INTL("Click option to toggle."), commands, commands.keys.index(cmd)) + break if cmd.nil? case cmd - when 0 # Toggle storing + when :store pkmn.cannot_store = !pkmn.cannot_store - when 1 # Toggle releasing + when :release pkmn.cannot_release = !pkmn.cannot_release - when 2 # Toggle trading + when :trade pkmn.cannot_trade = !pkmn.cannot_trade end end @@ -1016,38 +992,40 @@ MenuHandlers.add(:pokemon_debug_menu, :set_egg, { "name" => _INTL("Set egg"), "parent" => :main, "always_show" => false, - "effect" => proc { |pkmn, pkmnid, heldpoke, settingUpBattle, screen| - cmd = 0 + "effect" => proc { |pkmn, party_index, held_pkmn, setting_up_battle, screen| + commands = { + :make_egg => _INTL("Make egg"), + :make_pokemon => _INTL("Make Pokémon"), + :one_egg_step => _INTL("Set steps left to 1") + } + cmd = commands.keys.first loop do msg = [_INTL("Not an egg."), _INTL("Egg (hatches in {1} steps).", pkmn.steps_to_hatch)][pkmn.egg? ? 1 : 0] - cmd = screen.pbShowCommands(msg, - [_INTL("Make egg"), - _INTL("Make Pokémon"), - _INTL("Set steps left to 1")], cmd) - break if cmd < 0 + cmd = screen.show_menu(msg, commands, commands.keys.index(cmd)) + break if cmd.nil? case cmd - when 0 # Make egg + when :make_egg if !pkmn.egg? && (pbHasEgg?(pkmn.species) || - screen.pbConfirm(_INTL("{1} cannot legally be an egg. Make egg anyway?", pkmn.speciesName))) + screen.show_confirm_message(_INTL("{1} cannot legally be an egg. Make egg anyway?", pkmn.speciesName))) pkmn.level = Settings::EGG_LEVEL pkmn.calc_stats pkmn.name = _INTL("Egg") pkmn.steps_to_hatch = pkmn.species_data.hatch_steps pkmn.hatched_map = 0 pkmn.obtain_method = 1 - screen.pbRefreshSingle(pkmnid) + screen.refresh end - when 1 # Make Pokémon + when :make_pokemon if pkmn.egg? pkmn.name = nil pkmn.steps_to_hatch = 0 pkmn.hatched_map = 0 pkmn.obtain_method = 0 - $player.pokedex.register(pkmn) if !settingUpBattle - screen.pbRefreshSingle(pkmnid) + $player.pokedex.register(pkmn) if !setting_up_battle + screen.refresh end - when 2 # Set steps left to 1 + when :one_egg_step pkmn.steps_to_hatch = 1 if pkmn.egg? end end @@ -1058,37 +1036,38 @@ MenuHandlers.add(:pokemon_debug_menu, :set_egg, { MenuHandlers.add(:pokemon_debug_menu, :shadow_pkmn, { "name" => _INTL("Shadow Pkmn..."), "parent" => :main, - "effect" => proc { |pkmn, pkmnid, heldpoke, settingUpBattle, screen| - cmd = 0 + "effect" => proc { |pkmn, party_index, held_pkmn, setting_up_battle, screen| + # TODO: Option to make not a Shadow Pokémon. + commands = { + :make_shadow => _INTL("Make Shadow"), + :set_heart_gauge => _INTL("Set heart gauge") + } + cmd = commands.keys.first loop do msg = [_INTL("Not a Shadow Pokémon."), _INTL("Heart gauge is {1} (stage {2}).", pkmn.heart_gauge, pkmn.heartStage)][pkmn.shadowPokemon? ? 1 : 0] - cmd = screen.pbShowCommands(msg, [_INTL("Make Shadow"), _INTL("Set heart gauge")], cmd) - break if cmd < 0 + cmd = screen.show_menu(msg, commands, commands.keys.index(cmd)) + break if cmd.nil? case cmd - when 0 # Make Shadow + when :make_shadow if pkmn.shadowPokemon? - screen.pbDisplay(_INTL("{1} is already a Shadow Pokémon.", pkmn.name)) + screen.show_message(_INTL("{1} is already a Shadow Pokémon.", pkmn.name)) else pkmn.makeShadow - screen.pbRefreshSingle(pkmnid) + screen.refresh end - when 1 # Set heart gauge + when :set_heart_gauge if pkmn.shadowPokemon? - oldheart = pkmn.heart_gauge params = ChooseNumberParams.new params.setRange(0, pkmn.max_gauge_size) params.setDefaultValue(pkmn.heart_gauge) - val = pbMessageChooseNumber( - _INTL("Set the heart gauge (max. {1}).", pkmn.max_gauge_size), - params - ) { screen.pbUpdate } - if val != oldheart - pkmn.adjustHeart(val - oldheart) + new_val = screen.choose_number("\\se[]" + _INTL("Set the heart gauge (max. {1}).", params.maxNumber), params) + if new_val != pkmn.heart_gauge + pkmn.adjustHeart(new_val - pkmn.heart_gauge) pkmn.check_ready_to_purify end else - screen.pbDisplay(_INTL("{1} is not a Shadow Pokémon.", pkmn.name)) + screen.show_message(_INTL("{1} is not a Shadow Pokémon.", pkmn.name)) end end end @@ -1100,7 +1079,7 @@ MenuHandlers.add(:pokemon_debug_menu, :mystery_gift, { "name" => _INTL("Mystery Gift"), "parent" => :main, "always_show" => false, - "effect" => proc { |pkmn, pkmnid, heldpoke, settingUpBattle, screen| + "effect" => proc { |pkmn, party_index, held_pkmn, setting_up_battle, screen| pbCreateMysteryGift(0, pkmn) next false } @@ -1110,31 +1089,28 @@ MenuHandlers.add(:pokemon_debug_menu, :duplicate, { "name" => _INTL("Duplicate"), "parent" => :main, "always_show" => false, - "effect" => proc { |pkmn, pkmnid, heldpoke, settingUpBattle, screen| - next false if !screen.pbConfirm(_INTL("Are you sure you want to copy this Pokémon?")) - clonedpkmn = pkmn.clone + "effect" => proc { |pkmn, party_index, held_pkmn, setting_up_battle, screen| + next false if !screen.show_confirm_message(_INTL("Are you sure you want to copy this Pokémon?")) + cloned_pkmn = pkmn.clone case screen when UI::Party - pbStorePokemon(clonedpkmn) + pbStorePokemon(cloned_pkmn) # Add to party, or to storage if party is full screen.refresh_party screen.refresh - screen.pbDisplay(_INTL("The Pokémon was duplicated.")) when PokemonStorageScreen - if screen.storage.pbMoveCaughtToParty(clonedpkmn) - if pkmnid[0] != -1 - screen.pbDisplay(_INTL("The duplicated Pokémon was moved to your party.")) - end + if screen.storage.pbMoveCaughtToParty(cloned_pkmn) + screen.show_message(_INTL("The duplicated Pokémon was moved to your party.")) if party_index[0] != -1 else - oldbox = screen.storage.currentBox - newbox = screen.storage.pbStoreCaught(clonedpkmn) - if newbox < 0 - screen.pbDisplay(_INTL("All boxes are full.")) - elsif newbox != oldbox - screen.pbDisplay(_INTL("The duplicated Pokémon was moved to box \"{1}.\"", screen.storage[newbox].name)) - screen.storage.currentBox = oldbox + old_box = screen.storage.currentBox + new_box = screen.storage.pbStoreCaught(cloned_pkmn) + if new_box < 0 + screen.show_message(_INTL("All boxes are full.")) + elsif new_box != old_box + screen.show_message(_INTL("The duplicated Pokémon was moved to box \"{1}.\"", screen.storage[new_box].name)) + screen.storage.currentBox = old_box end end - screen.pbHardRefresh + screen.refresh end next true } @@ -1144,18 +1120,17 @@ MenuHandlers.add(:pokemon_debug_menu, :delete, { "name" => _INTL("Delete"), "parent" => :main, "always_show" => false, - "effect" => proc { |pkmn, pkmnid, heldpoke, settingUpBattle, screen| - next false if !screen.pbConfirm(_INTL("Are you sure you want to delete this Pokémon?")) + "effect" => proc { |pkmn, party_index, held_pkmn, setting_up_battle, screen| + next false if !screen.show_confirm_message(_INTL("Are you sure you want to delete this Pokémon?")) case screen when UI::Party - screen.party.delete_at(pkmnid) + screen.party.delete_at(party_index) screen.refresh_party - screen.refresh when PokemonStorageScreen - screen.scene.pbRelease(pkmnid, heldpoke) - (heldpoke) ? screen.heldpkmn = nil : screen.storage.pbDelete(pkmnid[0], pkmnid[1]) - screen.scene.pbRefresh + screen.scene.pbRelease(party_index, held_pkmn) + (held_pkmn) ? screen.heldpkmn = nil : screen.storage.pbDelete(party_index[0], party_index[1]) end + screen.refresh next true } })